ntb_hw_amd.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. * This file is provided under a dual BSD/GPLv2 license. When using or
  3. * redistributing this file, you may do so under either license.
  4. *
  5. * GPL LICENSE SUMMARY
  6. *
  7. * Copyright (C) 2016 Advanced Micro Devices, Inc. All Rights Reserved.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of version 2 of the GNU General Public License as
  11. * published by the Free Software Foundation.
  12. *
  13. * BSD LICENSE
  14. *
  15. * Copyright (C) 2016 Advanced Micro Devices, Inc. All Rights Reserved.
  16. *
  17. * Redistribution and use in source and binary forms, with or without
  18. * modification, are permitted provided that the following conditions
  19. * are met:
  20. *
  21. * * Redistributions of source code must retain the above copyright
  22. * notice, this list of conditions and the following disclaimer.
  23. * * Redistributions in binary form must reproduce the above copy
  24. * notice, this list of conditions and the following disclaimer in
  25. * the documentation and/or other materials provided with the
  26. * distribution.
  27. * * Neither the name of AMD Corporation nor the names of its
  28. * contributors may be used to endorse or promote products derived
  29. * from this software without specific prior written permission.
  30. *
  31. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  32. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  33. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  34. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  35. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  36. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  37. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  38. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  39. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  41. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42. *
  43. * AMD PCIe NTB Linux driver
  44. *
  45. * Contact Information:
  46. * Xiangliang Yu <Xiangliang.Yu@amd.com>
  47. */
  48. #ifndef NTB_HW_AMD_H
  49. #define NTB_HW_AMD_H
  50. #include <linux/ntb.h>
  51. #include <linux/pci.h>
  52. #define PCI_DEVICE_ID_AMD_NTB 0x145B
  53. #define AMD_LINK_HB_TIMEOUT msecs_to_jiffies(1000)
  54. #define AMD_LINK_STATUS_OFFSET 0x68
  55. #define NTB_LIN_STA_ACTIVE_BIT 0x00000002
  56. #define NTB_LNK_STA_SPEED_MASK 0x000F0000
  57. #define NTB_LNK_STA_WIDTH_MASK 0x03F00000
  58. #define NTB_LNK_STA_ACTIVE(x) (!!((x) & NTB_LIN_STA_ACTIVE_BIT))
  59. #define NTB_LNK_STA_SPEED(x) (((x) & NTB_LNK_STA_SPEED_MASK) >> 16)
  60. #define NTB_LNK_STA_WIDTH(x) (((x) & NTB_LNK_STA_WIDTH_MASK) >> 20)
  61. #ifndef read64
  62. #ifdef readq
  63. #define read64 readq
  64. #else
  65. #define read64 _read64
  66. static inline u64 _read64(void __iomem *mmio)
  67. {
  68. u64 low, high;
  69. low = readl(mmio);
  70. high = readl(mmio + sizeof(u32));
  71. return low | (high << 32);
  72. }
  73. #endif
  74. #endif
  75. #ifndef write64
  76. #ifdef writeq
  77. #define write64 writeq
  78. #else
  79. #define write64 _write64
  80. static inline void _write64(u64 val, void __iomem *mmio)
  81. {
  82. writel(val, mmio);
  83. writel(val >> 32, mmio + sizeof(u32));
  84. }
  85. #endif
  86. #endif
  87. enum {
  88. /* AMD NTB Capability */
  89. AMD_MW_CNT = 3,
  90. AMD_DB_CNT = 16,
  91. AMD_MSIX_VECTOR_CNT = 24,
  92. AMD_SPADS_CNT = 16,
  93. /* AMD NTB register offset */
  94. AMD_CNTL_OFFSET = 0x200,
  95. /* NTB control register bits */
  96. PMM_REG_CTL = BIT(21),
  97. SMM_REG_CTL = BIT(20),
  98. SMM_REG_ACC_PATH = BIT(18),
  99. PMM_REG_ACC_PATH = BIT(17),
  100. NTB_CLK_EN = BIT(16),
  101. AMD_STA_OFFSET = 0x204,
  102. AMD_PGSLV_OFFSET = 0x208,
  103. AMD_SPAD_MUX_OFFSET = 0x20C,
  104. AMD_SPAD_OFFSET = 0x210,
  105. AMD_RSMU_HCID = 0x250,
  106. AMD_RSMU_SIID = 0x254,
  107. AMD_PSION_OFFSET = 0x300,
  108. AMD_SSION_OFFSET = 0x330,
  109. AMD_MMINDEX_OFFSET = 0x400,
  110. AMD_MMDATA_OFFSET = 0x404,
  111. AMD_SIDEINFO_OFFSET = 0x408,
  112. AMD_SIDE_MASK = BIT(0),
  113. AMD_SIDE_READY = BIT(1),
  114. /* limit register */
  115. AMD_ROMBARLMT_OFFSET = 0x410,
  116. AMD_BAR1LMT_OFFSET = 0x414,
  117. AMD_BAR23LMT_OFFSET = 0x418,
  118. AMD_BAR45LMT_OFFSET = 0x420,
  119. /* xlat address */
  120. AMD_POMBARXLAT_OFFSET = 0x428,
  121. AMD_BAR1XLAT_OFFSET = 0x430,
  122. AMD_BAR23XLAT_OFFSET = 0x438,
  123. AMD_BAR45XLAT_OFFSET = 0x440,
  124. /* doorbell and interrupt */
  125. AMD_DBFM_OFFSET = 0x450,
  126. AMD_DBREQ_OFFSET = 0x454,
  127. AMD_MIRRDBSTAT_OFFSET = 0x458,
  128. AMD_DBMASK_OFFSET = 0x45C,
  129. AMD_DBSTAT_OFFSET = 0x460,
  130. AMD_INTMASK_OFFSET = 0x470,
  131. AMD_INTSTAT_OFFSET = 0x474,
  132. /* event type */
  133. AMD_PEER_FLUSH_EVENT = BIT(0),
  134. AMD_PEER_RESET_EVENT = BIT(1),
  135. AMD_PEER_D3_EVENT = BIT(2),
  136. AMD_PEER_PMETO_EVENT = BIT(3),
  137. AMD_PEER_D0_EVENT = BIT(4),
  138. AMD_LINK_UP_EVENT = BIT(5),
  139. AMD_LINK_DOWN_EVENT = BIT(6),
  140. AMD_EVENT_INTMASK = (AMD_PEER_FLUSH_EVENT |
  141. AMD_PEER_RESET_EVENT | AMD_PEER_D3_EVENT |
  142. AMD_PEER_PMETO_EVENT | AMD_PEER_D0_EVENT |
  143. AMD_LINK_UP_EVENT | AMD_LINK_DOWN_EVENT),
  144. AMD_PMESTAT_OFFSET = 0x480,
  145. AMD_PMSGTRIG_OFFSET = 0x490,
  146. AMD_LTRLATENCY_OFFSET = 0x494,
  147. AMD_FLUSHTRIG_OFFSET = 0x498,
  148. /* SMU register*/
  149. AMD_SMUACK_OFFSET = 0x4A0,
  150. AMD_SINRST_OFFSET = 0x4A4,
  151. AMD_RSPNUM_OFFSET = 0x4A8,
  152. AMD_SMU_SPADMUTEX = 0x4B0,
  153. AMD_SMU_SPADOFFSET = 0x4B4,
  154. AMD_PEER_OFFSET = 0x400,
  155. };
  156. struct amd_ntb_dev;
  157. struct amd_ntb_vec {
  158. struct amd_ntb_dev *ndev;
  159. int num;
  160. };
  161. struct amd_ntb_dev {
  162. struct ntb_dev ntb;
  163. u32 ntb_side;
  164. u32 lnk_sta;
  165. u32 cntl_sta;
  166. u32 peer_sta;
  167. unsigned char mw_count;
  168. unsigned char spad_count;
  169. unsigned char db_count;
  170. unsigned char msix_vec_count;
  171. u64 db_valid_mask;
  172. u64 db_mask;
  173. u32 int_mask;
  174. struct msix_entry *msix;
  175. struct amd_ntb_vec *vec;
  176. /* synchronize rmw access of db_mask and hw reg */
  177. spinlock_t db_mask_lock;
  178. void __iomem *self_mmio;
  179. void __iomem *peer_mmio;
  180. unsigned int self_spad;
  181. unsigned int peer_spad;
  182. struct delayed_work hb_timer;
  183. struct dentry *debugfs_dir;
  184. struct dentry *debugfs_info;
  185. };
  186. #define ntb_ndev(__ntb) container_of(__ntb, struct amd_ntb_dev, ntb)
  187. #define hb_ndev(__work) container_of(__work, struct amd_ntb_dev, hb_timer.work)
  188. #endif