gmc_v9_0.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270
  1. /*
  2. * Copyright 2016 Advanced Micro Devices, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. */
  23. #include <linux/firmware.h>
  24. #include <drm/drm_cache.h>
  25. #include "amdgpu.h"
  26. #include "gmc_v9_0.h"
  27. #include "amdgpu_atomfirmware.h"
  28. #include "amdgpu_gem.h"
  29. #include "hdp/hdp_4_0_offset.h"
  30. #include "hdp/hdp_4_0_sh_mask.h"
  31. #include "gc/gc_9_0_sh_mask.h"
  32. #include "dce/dce_12_0_offset.h"
  33. #include "dce/dce_12_0_sh_mask.h"
  34. #include "vega10_enum.h"
  35. #include "mmhub/mmhub_1_0_offset.h"
  36. #include "athub/athub_1_0_offset.h"
  37. #include "oss/osssys_4_0_offset.h"
  38. #include "soc15.h"
  39. #include "soc15_common.h"
  40. #include "umc/umc_6_0_sh_mask.h"
  41. #include "gfxhub_v1_0.h"
  42. #include "mmhub_v1_0.h"
  43. #include "gfxhub_v1_1.h"
  44. #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h"
  45. /* add these here since we already include dce12 headers and these are for DCN */
  46. #define mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION 0x055d
  47. #define mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION_BASE_IDX 2
  48. #define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_WIDTH__SHIFT 0x0
  49. #define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_HEIGHT__SHIFT 0x10
  50. #define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_WIDTH_MASK 0x00003FFFL
  51. #define HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION__PRI_VIEWPORT_HEIGHT_MASK 0x3FFF0000L
  52. /* XXX Move this macro to VEGA10 header file, which is like vid.h for VI.*/
  53. #define AMDGPU_NUM_OF_VMIDS 8
  54. static const u32 golden_settings_vega10_hdp[] =
  55. {
  56. 0xf64, 0x0fffffff, 0x00000000,
  57. 0xf65, 0x0fffffff, 0x00000000,
  58. 0xf66, 0x0fffffff, 0x00000000,
  59. 0xf67, 0x0fffffff, 0x00000000,
  60. 0xf68, 0x0fffffff, 0x00000000,
  61. 0xf6a, 0x0fffffff, 0x00000000,
  62. 0xf6b, 0x0fffffff, 0x00000000,
  63. 0xf6c, 0x0fffffff, 0x00000000,
  64. 0xf6d, 0x0fffffff, 0x00000000,
  65. 0xf6e, 0x0fffffff, 0x00000000,
  66. };
  67. static const struct soc15_reg_golden golden_settings_mmhub_1_0_0[] =
  68. {
  69. SOC15_REG_GOLDEN_VALUE(MMHUB, 0, mmDAGB1_WRCLI2, 0x00000007, 0xfe5fe0fa),
  70. SOC15_REG_GOLDEN_VALUE(MMHUB, 0, mmMMEA1_DRAM_WR_CLI2GRP_MAP0, 0x00000030, 0x55555565)
  71. };
  72. static const struct soc15_reg_golden golden_settings_athub_1_0_0[] =
  73. {
  74. SOC15_REG_GOLDEN_VALUE(ATHUB, 0, mmRPB_ARB_CNTL, 0x0000ff00, 0x00000800),
  75. SOC15_REG_GOLDEN_VALUE(ATHUB, 0, mmRPB_ARB_CNTL2, 0x00ff00ff, 0x00080008)
  76. };
  77. /* Ecc related register addresses, (BASE + reg offset) */
  78. /* Universal Memory Controller caps (may be fused). */
  79. /* UMCCH:UmcLocalCap */
  80. #define UMCLOCALCAPS_ADDR0 (0x00014306 + 0x00000000)
  81. #define UMCLOCALCAPS_ADDR1 (0x00014306 + 0x00000800)
  82. #define UMCLOCALCAPS_ADDR2 (0x00014306 + 0x00001000)
  83. #define UMCLOCALCAPS_ADDR3 (0x00014306 + 0x00001800)
  84. #define UMCLOCALCAPS_ADDR4 (0x00054306 + 0x00000000)
  85. #define UMCLOCALCAPS_ADDR5 (0x00054306 + 0x00000800)
  86. #define UMCLOCALCAPS_ADDR6 (0x00054306 + 0x00001000)
  87. #define UMCLOCALCAPS_ADDR7 (0x00054306 + 0x00001800)
  88. #define UMCLOCALCAPS_ADDR8 (0x00094306 + 0x00000000)
  89. #define UMCLOCALCAPS_ADDR9 (0x00094306 + 0x00000800)
  90. #define UMCLOCALCAPS_ADDR10 (0x00094306 + 0x00001000)
  91. #define UMCLOCALCAPS_ADDR11 (0x00094306 + 0x00001800)
  92. #define UMCLOCALCAPS_ADDR12 (0x000d4306 + 0x00000000)
  93. #define UMCLOCALCAPS_ADDR13 (0x000d4306 + 0x00000800)
  94. #define UMCLOCALCAPS_ADDR14 (0x000d4306 + 0x00001000)
  95. #define UMCLOCALCAPS_ADDR15 (0x000d4306 + 0x00001800)
  96. /* Universal Memory Controller Channel config. */
  97. /* UMCCH:UMC_CONFIG */
  98. #define UMCCH_UMC_CONFIG_ADDR0 (0x00014040 + 0x00000000)
  99. #define UMCCH_UMC_CONFIG_ADDR1 (0x00014040 + 0x00000800)
  100. #define UMCCH_UMC_CONFIG_ADDR2 (0x00014040 + 0x00001000)
  101. #define UMCCH_UMC_CONFIG_ADDR3 (0x00014040 + 0x00001800)
  102. #define UMCCH_UMC_CONFIG_ADDR4 (0x00054040 + 0x00000000)
  103. #define UMCCH_UMC_CONFIG_ADDR5 (0x00054040 + 0x00000800)
  104. #define UMCCH_UMC_CONFIG_ADDR6 (0x00054040 + 0x00001000)
  105. #define UMCCH_UMC_CONFIG_ADDR7 (0x00054040 + 0x00001800)
  106. #define UMCCH_UMC_CONFIG_ADDR8 (0x00094040 + 0x00000000)
  107. #define UMCCH_UMC_CONFIG_ADDR9 (0x00094040 + 0x00000800)
  108. #define UMCCH_UMC_CONFIG_ADDR10 (0x00094040 + 0x00001000)
  109. #define UMCCH_UMC_CONFIG_ADDR11 (0x00094040 + 0x00001800)
  110. #define UMCCH_UMC_CONFIG_ADDR12 (0x000d4040 + 0x00000000)
  111. #define UMCCH_UMC_CONFIG_ADDR13 (0x000d4040 + 0x00000800)
  112. #define UMCCH_UMC_CONFIG_ADDR14 (0x000d4040 + 0x00001000)
  113. #define UMCCH_UMC_CONFIG_ADDR15 (0x000d4040 + 0x00001800)
  114. /* Universal Memory Controller Channel Ecc config. */
  115. /* UMCCH:EccCtrl */
  116. #define UMCCH_ECCCTRL_ADDR0 (0x00014053 + 0x00000000)
  117. #define UMCCH_ECCCTRL_ADDR1 (0x00014053 + 0x00000800)
  118. #define UMCCH_ECCCTRL_ADDR2 (0x00014053 + 0x00001000)
  119. #define UMCCH_ECCCTRL_ADDR3 (0x00014053 + 0x00001800)
  120. #define UMCCH_ECCCTRL_ADDR4 (0x00054053 + 0x00000000)
  121. #define UMCCH_ECCCTRL_ADDR5 (0x00054053 + 0x00000800)
  122. #define UMCCH_ECCCTRL_ADDR6 (0x00054053 + 0x00001000)
  123. #define UMCCH_ECCCTRL_ADDR7 (0x00054053 + 0x00001800)
  124. #define UMCCH_ECCCTRL_ADDR8 (0x00094053 + 0x00000000)
  125. #define UMCCH_ECCCTRL_ADDR9 (0x00094053 + 0x00000800)
  126. #define UMCCH_ECCCTRL_ADDR10 (0x00094053 + 0x00001000)
  127. #define UMCCH_ECCCTRL_ADDR11 (0x00094053 + 0x00001800)
  128. #define UMCCH_ECCCTRL_ADDR12 (0x000d4053 + 0x00000000)
  129. #define UMCCH_ECCCTRL_ADDR13 (0x000d4053 + 0x00000800)
  130. #define UMCCH_ECCCTRL_ADDR14 (0x000d4053 + 0x00001000)
  131. #define UMCCH_ECCCTRL_ADDR15 (0x000d4053 + 0x00001800)
  132. static const uint32_t ecc_umclocalcap_addrs[] = {
  133. UMCLOCALCAPS_ADDR0,
  134. UMCLOCALCAPS_ADDR1,
  135. UMCLOCALCAPS_ADDR2,
  136. UMCLOCALCAPS_ADDR3,
  137. UMCLOCALCAPS_ADDR4,
  138. UMCLOCALCAPS_ADDR5,
  139. UMCLOCALCAPS_ADDR6,
  140. UMCLOCALCAPS_ADDR7,
  141. UMCLOCALCAPS_ADDR8,
  142. UMCLOCALCAPS_ADDR9,
  143. UMCLOCALCAPS_ADDR10,
  144. UMCLOCALCAPS_ADDR11,
  145. UMCLOCALCAPS_ADDR12,
  146. UMCLOCALCAPS_ADDR13,
  147. UMCLOCALCAPS_ADDR14,
  148. UMCLOCALCAPS_ADDR15,
  149. };
  150. static const uint32_t ecc_umcch_umc_config_addrs[] = {
  151. UMCCH_UMC_CONFIG_ADDR0,
  152. UMCCH_UMC_CONFIG_ADDR1,
  153. UMCCH_UMC_CONFIG_ADDR2,
  154. UMCCH_UMC_CONFIG_ADDR3,
  155. UMCCH_UMC_CONFIG_ADDR4,
  156. UMCCH_UMC_CONFIG_ADDR5,
  157. UMCCH_UMC_CONFIG_ADDR6,
  158. UMCCH_UMC_CONFIG_ADDR7,
  159. UMCCH_UMC_CONFIG_ADDR8,
  160. UMCCH_UMC_CONFIG_ADDR9,
  161. UMCCH_UMC_CONFIG_ADDR10,
  162. UMCCH_UMC_CONFIG_ADDR11,
  163. UMCCH_UMC_CONFIG_ADDR12,
  164. UMCCH_UMC_CONFIG_ADDR13,
  165. UMCCH_UMC_CONFIG_ADDR14,
  166. UMCCH_UMC_CONFIG_ADDR15,
  167. };
  168. static const uint32_t ecc_umcch_eccctrl_addrs[] = {
  169. UMCCH_ECCCTRL_ADDR0,
  170. UMCCH_ECCCTRL_ADDR1,
  171. UMCCH_ECCCTRL_ADDR2,
  172. UMCCH_ECCCTRL_ADDR3,
  173. UMCCH_ECCCTRL_ADDR4,
  174. UMCCH_ECCCTRL_ADDR5,
  175. UMCCH_ECCCTRL_ADDR6,
  176. UMCCH_ECCCTRL_ADDR7,
  177. UMCCH_ECCCTRL_ADDR8,
  178. UMCCH_ECCCTRL_ADDR9,
  179. UMCCH_ECCCTRL_ADDR10,
  180. UMCCH_ECCCTRL_ADDR11,
  181. UMCCH_ECCCTRL_ADDR12,
  182. UMCCH_ECCCTRL_ADDR13,
  183. UMCCH_ECCCTRL_ADDR14,
  184. UMCCH_ECCCTRL_ADDR15,
  185. };
  186. static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
  187. struct amdgpu_irq_src *src,
  188. unsigned type,
  189. enum amdgpu_interrupt_state state)
  190. {
  191. struct amdgpu_vmhub *hub;
  192. u32 tmp, reg, bits, i, j;
  193. bits = VM_CONTEXT1_CNTL__RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
  194. VM_CONTEXT1_CNTL__DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
  195. VM_CONTEXT1_CNTL__PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
  196. VM_CONTEXT1_CNTL__VALID_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
  197. VM_CONTEXT1_CNTL__READ_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
  198. VM_CONTEXT1_CNTL__WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK |
  199. VM_CONTEXT1_CNTL__EXECUTE_PROTECTION_FAULT_ENABLE_INTERRUPT_MASK;
  200. switch (state) {
  201. case AMDGPU_IRQ_STATE_DISABLE:
  202. for (j = 0; j < AMDGPU_MAX_VMHUBS; j++) {
  203. hub = &adev->vmhub[j];
  204. for (i = 0; i < 16; i++) {
  205. reg = hub->vm_context0_cntl + i;
  206. tmp = RREG32(reg);
  207. tmp &= ~bits;
  208. WREG32(reg, tmp);
  209. }
  210. }
  211. break;
  212. case AMDGPU_IRQ_STATE_ENABLE:
  213. for (j = 0; j < AMDGPU_MAX_VMHUBS; j++) {
  214. hub = &adev->vmhub[j];
  215. for (i = 0; i < 16; i++) {
  216. reg = hub->vm_context0_cntl + i;
  217. tmp = RREG32(reg);
  218. tmp |= bits;
  219. WREG32(reg, tmp);
  220. }
  221. }
  222. default:
  223. break;
  224. }
  225. return 0;
  226. }
  227. static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,
  228. struct amdgpu_irq_src *source,
  229. struct amdgpu_iv_entry *entry)
  230. {
  231. struct amdgpu_vmhub *hub = &adev->vmhub[entry->vmid_src];
  232. uint32_t status = 0;
  233. u64 addr;
  234. addr = (u64)entry->src_data[0] << 12;
  235. addr |= ((u64)entry->src_data[1] & 0xf) << 44;
  236. if (!amdgpu_sriov_vf(adev)) {
  237. status = RREG32(hub->vm_l2_pro_fault_status);
  238. WREG32_P(hub->vm_l2_pro_fault_cntl, 1, ~1);
  239. }
  240. if (printk_ratelimit()) {
  241. struct amdgpu_task_info task_info = { 0 };
  242. amdgpu_vm_get_task_info(adev, entry->pasid, &task_info);
  243. dev_err(adev->dev,
  244. "[%s] VMC page fault (src_id:%u ring:%u vmid:%u pasid:%u, for process %s pid %d thread %s pid %d)\n",
  245. entry->vmid_src ? "mmhub" : "gfxhub",
  246. entry->src_id, entry->ring_id, entry->vmid,
  247. entry->pasid, task_info.process_name, task_info.tgid,
  248. task_info.task_name, task_info.pid);
  249. dev_err(adev->dev, " in page starting at address 0x%016llx from %d\n",
  250. addr, entry->client_id);
  251. if (!amdgpu_sriov_vf(adev))
  252. dev_err(adev->dev,
  253. "VM_L2_PROTECTION_FAULT_STATUS:0x%08X\n",
  254. status);
  255. }
  256. return 0;
  257. }
  258. static const struct amdgpu_irq_src_funcs gmc_v9_0_irq_funcs = {
  259. .set = gmc_v9_0_vm_fault_interrupt_state,
  260. .process = gmc_v9_0_process_interrupt,
  261. };
  262. static void gmc_v9_0_set_irq_funcs(struct amdgpu_device *adev)
  263. {
  264. adev->gmc.vm_fault.num_types = 1;
  265. adev->gmc.vm_fault.funcs = &gmc_v9_0_irq_funcs;
  266. }
  267. static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vmid)
  268. {
  269. u32 req = 0;
  270. /* invalidate using legacy mode on vmid*/
  271. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ,
  272. PER_VMID_INVALIDATE_REQ, 1 << vmid);
  273. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, 0);
  274. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1);
  275. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1);
  276. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1);
  277. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE2, 1);
  278. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L1_PTES, 1);
  279. req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ,
  280. CLEAR_PROTECTION_FAULT_STATUS_ADDR, 0);
  281. return req;
  282. }
  283. static signed long amdgpu_kiq_reg_write_reg_wait(struct amdgpu_device *adev,
  284. uint32_t reg0, uint32_t reg1,
  285. uint32_t ref, uint32_t mask)
  286. {
  287. signed long r, cnt = 0;
  288. unsigned long flags;
  289. uint32_t seq;
  290. struct amdgpu_kiq *kiq = &adev->gfx.kiq;
  291. struct amdgpu_ring *ring = &kiq->ring;
  292. spin_lock_irqsave(&kiq->ring_lock, flags);
  293. amdgpu_ring_alloc(ring, 32);
  294. amdgpu_ring_emit_reg_write_reg_wait(ring, reg0, reg1,
  295. ref, mask);
  296. amdgpu_fence_emit_polling(ring, &seq);
  297. amdgpu_ring_commit(ring);
  298. spin_unlock_irqrestore(&kiq->ring_lock, flags);
  299. r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
  300. /* don't wait anymore for IRQ context */
  301. if (r < 1 && in_interrupt())
  302. goto failed_kiq;
  303. might_sleep();
  304. while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
  305. msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
  306. r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
  307. }
  308. if (cnt > MAX_KIQ_REG_TRY)
  309. goto failed_kiq;
  310. return 0;
  311. failed_kiq:
  312. pr_err("failed to invalidate tlb with kiq\n");
  313. return r;
  314. }
  315. /*
  316. * GART
  317. * VMID 0 is the physical GPU addresses as used by the kernel.
  318. * VMIDs 1-15 are used for userspace clients and are handled
  319. * by the amdgpu vm/hsa code.
  320. */
  321. /**
  322. * gmc_v9_0_flush_gpu_tlb - gart tlb flush callback
  323. *
  324. * @adev: amdgpu_device pointer
  325. * @vmid: vm instance to flush
  326. *
  327. * Flush the TLB for the requested page table.
  328. */
  329. static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev,
  330. uint32_t vmid)
  331. {
  332. /* Use register 17 for GART */
  333. const unsigned eng = 17;
  334. unsigned i, j;
  335. int r;
  336. for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) {
  337. struct amdgpu_vmhub *hub = &adev->vmhub[i];
  338. u32 tmp = gmc_v9_0_get_invalidate_req(vmid);
  339. if (adev->gfx.kiq.ring.ready &&
  340. (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev)) &&
  341. !adev->in_gpu_reset) {
  342. r = amdgpu_kiq_reg_write_reg_wait(adev, hub->vm_inv_eng0_req + eng,
  343. hub->vm_inv_eng0_ack + eng, tmp, 1 << vmid);
  344. if (!r)
  345. continue;
  346. }
  347. spin_lock(&adev->gmc.invalidate_lock);
  348. WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp);
  349. /* Busy wait for ACK.*/
  350. for (j = 0; j < 100; j++) {
  351. tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng);
  352. tmp &= 1 << vmid;
  353. if (tmp)
  354. break;
  355. cpu_relax();
  356. }
  357. if (j < 100) {
  358. spin_unlock(&adev->gmc.invalidate_lock);
  359. continue;
  360. }
  361. /* Wait for ACK with a delay.*/
  362. for (j = 0; j < adev->usec_timeout; j++) {
  363. tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng);
  364. tmp &= 1 << vmid;
  365. if (tmp)
  366. break;
  367. udelay(1);
  368. }
  369. if (j < adev->usec_timeout) {
  370. spin_unlock(&adev->gmc.invalidate_lock);
  371. continue;
  372. }
  373. spin_unlock(&adev->gmc.invalidate_lock);
  374. DRM_ERROR("Timeout waiting for VM flush ACK!\n");
  375. }
  376. }
  377. static uint64_t gmc_v9_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring,
  378. unsigned vmid, uint64_t pd_addr)
  379. {
  380. struct amdgpu_device *adev = ring->adev;
  381. struct amdgpu_vmhub *hub = &adev->vmhub[ring->funcs->vmhub];
  382. uint32_t req = gmc_v9_0_get_invalidate_req(vmid);
  383. unsigned eng = ring->vm_inv_eng;
  384. amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + (2 * vmid),
  385. lower_32_bits(pd_addr));
  386. amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_hi32 + (2 * vmid),
  387. upper_32_bits(pd_addr));
  388. amdgpu_ring_emit_reg_write_reg_wait(ring, hub->vm_inv_eng0_req + eng,
  389. hub->vm_inv_eng0_ack + eng,
  390. req, 1 << vmid);
  391. return pd_addr;
  392. }
  393. static void gmc_v9_0_emit_pasid_mapping(struct amdgpu_ring *ring, unsigned vmid,
  394. unsigned pasid)
  395. {
  396. struct amdgpu_device *adev = ring->adev;
  397. uint32_t reg;
  398. if (ring->funcs->vmhub == AMDGPU_GFXHUB)
  399. reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT) + vmid;
  400. else
  401. reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_VMID_0_LUT_MM) + vmid;
  402. amdgpu_ring_emit_wreg(ring, reg, pasid);
  403. }
  404. /**
  405. * gmc_v9_0_set_pte_pde - update the page tables using MMIO
  406. *
  407. * @adev: amdgpu_device pointer
  408. * @cpu_pt_addr: cpu address of the page table
  409. * @gpu_page_idx: entry in the page table to update
  410. * @addr: dst addr to write into pte/pde
  411. * @flags: access flags
  412. *
  413. * Update the page tables using the CPU.
  414. */
  415. static int gmc_v9_0_set_pte_pde(struct amdgpu_device *adev, void *cpu_pt_addr,
  416. uint32_t gpu_page_idx, uint64_t addr,
  417. uint64_t flags)
  418. {
  419. void __iomem *ptr = (void *)cpu_pt_addr;
  420. uint64_t value;
  421. /*
  422. * PTE format on VEGA 10:
  423. * 63:59 reserved
  424. * 58:57 mtype
  425. * 56 F
  426. * 55 L
  427. * 54 P
  428. * 53 SW
  429. * 52 T
  430. * 50:48 reserved
  431. * 47:12 4k physical page base address
  432. * 11:7 fragment
  433. * 6 write
  434. * 5 read
  435. * 4 exe
  436. * 3 Z
  437. * 2 snooped
  438. * 1 system
  439. * 0 valid
  440. *
  441. * PDE format on VEGA 10:
  442. * 63:59 block fragment size
  443. * 58:55 reserved
  444. * 54 P
  445. * 53:48 reserved
  446. * 47:6 physical base address of PD or PTE
  447. * 5:3 reserved
  448. * 2 C
  449. * 1 system
  450. * 0 valid
  451. */
  452. /*
  453. * The following is for PTE only. GART does not have PDEs.
  454. */
  455. value = addr & 0x0000FFFFFFFFF000ULL;
  456. value |= flags;
  457. writeq(value, ptr + (gpu_page_idx * 8));
  458. return 0;
  459. }
  460. static uint64_t gmc_v9_0_get_vm_pte_flags(struct amdgpu_device *adev,
  461. uint32_t flags)
  462. {
  463. uint64_t pte_flag = 0;
  464. if (flags & AMDGPU_VM_PAGE_EXECUTABLE)
  465. pte_flag |= AMDGPU_PTE_EXECUTABLE;
  466. if (flags & AMDGPU_VM_PAGE_READABLE)
  467. pte_flag |= AMDGPU_PTE_READABLE;
  468. if (flags & AMDGPU_VM_PAGE_WRITEABLE)
  469. pte_flag |= AMDGPU_PTE_WRITEABLE;
  470. switch (flags & AMDGPU_VM_MTYPE_MASK) {
  471. case AMDGPU_VM_MTYPE_DEFAULT:
  472. pte_flag |= AMDGPU_PTE_MTYPE(MTYPE_NC);
  473. break;
  474. case AMDGPU_VM_MTYPE_NC:
  475. pte_flag |= AMDGPU_PTE_MTYPE(MTYPE_NC);
  476. break;
  477. case AMDGPU_VM_MTYPE_WC:
  478. pte_flag |= AMDGPU_PTE_MTYPE(MTYPE_WC);
  479. break;
  480. case AMDGPU_VM_MTYPE_CC:
  481. pte_flag |= AMDGPU_PTE_MTYPE(MTYPE_CC);
  482. break;
  483. case AMDGPU_VM_MTYPE_UC:
  484. pte_flag |= AMDGPU_PTE_MTYPE(MTYPE_UC);
  485. break;
  486. default:
  487. pte_flag |= AMDGPU_PTE_MTYPE(MTYPE_NC);
  488. break;
  489. }
  490. if (flags & AMDGPU_VM_PAGE_PRT)
  491. pte_flag |= AMDGPU_PTE_PRT;
  492. return pte_flag;
  493. }
  494. static void gmc_v9_0_get_vm_pde(struct amdgpu_device *adev, int level,
  495. uint64_t *addr, uint64_t *flags)
  496. {
  497. if (!(*flags & AMDGPU_PDE_PTE) && !(*flags & AMDGPU_PTE_SYSTEM))
  498. *addr = adev->vm_manager.vram_base_offset + *addr -
  499. adev->gmc.vram_start;
  500. BUG_ON(*addr & 0xFFFF00000000003FULL);
  501. if (!adev->gmc.translate_further)
  502. return;
  503. if (level == AMDGPU_VM_PDB1) {
  504. /* Set the block fragment size */
  505. if (!(*flags & AMDGPU_PDE_PTE))
  506. *flags |= AMDGPU_PDE_BFS(0x9);
  507. } else if (level == AMDGPU_VM_PDB0) {
  508. if (*flags & AMDGPU_PDE_PTE)
  509. *flags &= ~AMDGPU_PDE_PTE;
  510. else
  511. *flags |= AMDGPU_PTE_TF;
  512. }
  513. }
  514. static const struct amdgpu_gmc_funcs gmc_v9_0_gmc_funcs = {
  515. .flush_gpu_tlb = gmc_v9_0_flush_gpu_tlb,
  516. .emit_flush_gpu_tlb = gmc_v9_0_emit_flush_gpu_tlb,
  517. .emit_pasid_mapping = gmc_v9_0_emit_pasid_mapping,
  518. .set_pte_pde = gmc_v9_0_set_pte_pde,
  519. .get_vm_pte_flags = gmc_v9_0_get_vm_pte_flags,
  520. .get_vm_pde = gmc_v9_0_get_vm_pde
  521. };
  522. static void gmc_v9_0_set_gmc_funcs(struct amdgpu_device *adev)
  523. {
  524. adev->gmc.gmc_funcs = &gmc_v9_0_gmc_funcs;
  525. }
  526. static int gmc_v9_0_early_init(void *handle)
  527. {
  528. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  529. gmc_v9_0_set_gmc_funcs(adev);
  530. gmc_v9_0_set_irq_funcs(adev);
  531. adev->gmc.shared_aperture_start = 0x2000000000000000ULL;
  532. adev->gmc.shared_aperture_end =
  533. adev->gmc.shared_aperture_start + (4ULL << 30) - 1;
  534. adev->gmc.private_aperture_start = 0x1000000000000000ULL;
  535. adev->gmc.private_aperture_end =
  536. adev->gmc.private_aperture_start + (4ULL << 30) - 1;
  537. return 0;
  538. }
  539. static int gmc_v9_0_ecc_available(struct amdgpu_device *adev)
  540. {
  541. uint32_t reg_val;
  542. uint32_t reg_addr;
  543. uint32_t field_val;
  544. size_t i;
  545. uint32_t fv2;
  546. size_t lost_sheep;
  547. DRM_DEBUG("ecc: gmc_v9_0_ecc_available()\n");
  548. lost_sheep = 0;
  549. for (i = 0; i < ARRAY_SIZE(ecc_umclocalcap_addrs); ++i) {
  550. reg_addr = ecc_umclocalcap_addrs[i];
  551. DRM_DEBUG("ecc: "
  552. "UMCCH_UmcLocalCap[%zu]: reg_addr: 0x%08x\n",
  553. i, reg_addr);
  554. reg_val = RREG32(reg_addr);
  555. field_val = REG_GET_FIELD(reg_val, UMCCH0_0_UmcLocalCap,
  556. EccDis);
  557. DRM_DEBUG("ecc: "
  558. "reg_val: 0x%08x, "
  559. "EccDis: 0x%08x, ",
  560. reg_val, field_val);
  561. if (field_val) {
  562. DRM_ERROR("ecc: UmcLocalCap:EccDis is set.\n");
  563. ++lost_sheep;
  564. }
  565. }
  566. for (i = 0; i < ARRAY_SIZE(ecc_umcch_umc_config_addrs); ++i) {
  567. reg_addr = ecc_umcch_umc_config_addrs[i];
  568. DRM_DEBUG("ecc: "
  569. "UMCCH0_0_UMC_CONFIG[%zu]: reg_addr: 0x%08x",
  570. i, reg_addr);
  571. reg_val = RREG32(reg_addr);
  572. field_val = REG_GET_FIELD(reg_val, UMCCH0_0_UMC_CONFIG,
  573. DramReady);
  574. DRM_DEBUG("ecc: "
  575. "reg_val: 0x%08x, "
  576. "DramReady: 0x%08x\n",
  577. reg_val, field_val);
  578. if (!field_val) {
  579. DRM_ERROR("ecc: UMC_CONFIG:DramReady is not set.\n");
  580. ++lost_sheep;
  581. }
  582. }
  583. for (i = 0; i < ARRAY_SIZE(ecc_umcch_eccctrl_addrs); ++i) {
  584. reg_addr = ecc_umcch_eccctrl_addrs[i];
  585. DRM_DEBUG("ecc: "
  586. "UMCCH_EccCtrl[%zu]: reg_addr: 0x%08x, ",
  587. i, reg_addr);
  588. reg_val = RREG32(reg_addr);
  589. field_val = REG_GET_FIELD(reg_val, UMCCH0_0_EccCtrl,
  590. WrEccEn);
  591. fv2 = REG_GET_FIELD(reg_val, UMCCH0_0_EccCtrl,
  592. RdEccEn);
  593. DRM_DEBUG("ecc: "
  594. "reg_val: 0x%08x, "
  595. "WrEccEn: 0x%08x, "
  596. "RdEccEn: 0x%08x\n",
  597. reg_val, field_val, fv2);
  598. if (!field_val) {
  599. DRM_DEBUG("ecc: WrEccEn is not set\n");
  600. ++lost_sheep;
  601. }
  602. if (!fv2) {
  603. DRM_DEBUG("ecc: RdEccEn is not set\n");
  604. ++lost_sheep;
  605. }
  606. }
  607. DRM_DEBUG("ecc: lost_sheep: %zu\n", lost_sheep);
  608. return lost_sheep == 0;
  609. }
  610. static bool gmc_v9_0_keep_stolen_memory(struct amdgpu_device *adev)
  611. {
  612. /*
  613. * TODO:
  614. * Currently there is a bug where some memory client outside
  615. * of the driver writes to first 8M of VRAM on S3 resume,
  616. * this overrides GART which by default gets placed in first 8M and
  617. * causes VM_FAULTS once GTT is accessed.
  618. * Keep the stolen memory reservation until the while this is not solved.
  619. * Also check code in gmc_v9_0_get_vbios_fb_size and gmc_v9_0_late_init
  620. */
  621. switch (adev->asic_type) {
  622. case CHIP_VEGA10:
  623. return true;
  624. case CHIP_RAVEN:
  625. case CHIP_VEGA12:
  626. case CHIP_VEGA20:
  627. default:
  628. return false;
  629. }
  630. }
  631. static int gmc_v9_0_late_init(void *handle)
  632. {
  633. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  634. /*
  635. * The latest engine allocation on gfx9 is:
  636. * Engine 0, 1: idle
  637. * Engine 2, 3: firmware
  638. * Engine 4~13: amdgpu ring, subject to change when ring number changes
  639. * Engine 14~15: idle
  640. * Engine 16: kfd tlb invalidation
  641. * Engine 17: Gart flushes
  642. */
  643. unsigned vm_inv_eng[AMDGPU_MAX_VMHUBS] = { 4, 4 };
  644. unsigned i;
  645. int r;
  646. if (!gmc_v9_0_keep_stolen_memory(adev))
  647. amdgpu_bo_late_init(adev);
  648. for(i = 0; i < adev->num_rings; ++i) {
  649. struct amdgpu_ring *ring = adev->rings[i];
  650. unsigned vmhub = ring->funcs->vmhub;
  651. ring->vm_inv_eng = vm_inv_eng[vmhub]++;
  652. dev_info(adev->dev, "ring %u(%s) uses VM inv eng %u on hub %u\n",
  653. ring->idx, ring->name, ring->vm_inv_eng,
  654. ring->funcs->vmhub);
  655. }
  656. /* Engine 16 is used for KFD and 17 for GART flushes */
  657. for(i = 0; i < AMDGPU_MAX_VMHUBS; ++i)
  658. BUG_ON(vm_inv_eng[i] > 16);
  659. if (adev->asic_type == CHIP_VEGA10 && !amdgpu_sriov_vf(adev)) {
  660. r = gmc_v9_0_ecc_available(adev);
  661. if (r == 1) {
  662. DRM_INFO("ECC is active.\n");
  663. } else if (r == 0) {
  664. DRM_INFO("ECC is not present.\n");
  665. adev->df_funcs->enable_ecc_force_par_wr_rmw(adev, false);
  666. } else {
  667. DRM_ERROR("gmc_v9_0_ecc_available() failed. r: %d\n", r);
  668. return r;
  669. }
  670. }
  671. return amdgpu_irq_get(adev, &adev->gmc.vm_fault, 0);
  672. }
  673. static void gmc_v9_0_vram_gtt_location(struct amdgpu_device *adev,
  674. struct amdgpu_gmc *mc)
  675. {
  676. u64 base = 0;
  677. if (!amdgpu_sriov_vf(adev))
  678. base = mmhub_v1_0_get_fb_location(adev);
  679. /* add the xgmi offset of the physical node */
  680. base += adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size;
  681. amdgpu_gmc_vram_location(adev, &adev->gmc, base);
  682. amdgpu_gmc_gart_location(adev, mc);
  683. if (!amdgpu_sriov_vf(adev))
  684. amdgpu_gmc_agp_location(adev, mc);
  685. /* base offset of vram pages */
  686. adev->vm_manager.vram_base_offset = gfxhub_v1_0_get_mc_fb_offset(adev);
  687. /* XXX: add the xgmi offset of the physical node? */
  688. adev->vm_manager.vram_base_offset +=
  689. adev->gmc.xgmi.physical_node_id * adev->gmc.xgmi.node_segment_size;
  690. }
  691. /**
  692. * gmc_v9_0_mc_init - initialize the memory controller driver params
  693. *
  694. * @adev: amdgpu_device pointer
  695. *
  696. * Look up the amount of vram, vram width, and decide how to place
  697. * vram and gart within the GPU's physical address space.
  698. * Returns 0 for success.
  699. */
  700. static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
  701. {
  702. int chansize, numchan;
  703. int r;
  704. if (amdgpu_emu_mode != 1)
  705. adev->gmc.vram_width = amdgpu_atomfirmware_get_vram_width(adev);
  706. if (!adev->gmc.vram_width) {
  707. /* hbm memory channel size */
  708. if (adev->flags & AMD_IS_APU)
  709. chansize = 64;
  710. else
  711. chansize = 128;
  712. numchan = adev->df_funcs->get_hbm_channel_number(adev);
  713. adev->gmc.vram_width = numchan * chansize;
  714. }
  715. /* size in MB on si */
  716. adev->gmc.mc_vram_size =
  717. adev->nbio_funcs->get_memsize(adev) * 1024ULL * 1024ULL;
  718. adev->gmc.real_vram_size = adev->gmc.mc_vram_size;
  719. if (!(adev->flags & AMD_IS_APU)) {
  720. r = amdgpu_device_resize_fb_bar(adev);
  721. if (r)
  722. return r;
  723. }
  724. adev->gmc.aper_base = pci_resource_start(adev->pdev, 0);
  725. adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);
  726. #ifdef CONFIG_X86_64
  727. if (adev->flags & AMD_IS_APU) {
  728. adev->gmc.aper_base = gfxhub_v1_0_get_mc_fb_offset(adev);
  729. adev->gmc.aper_size = adev->gmc.real_vram_size;
  730. }
  731. #endif
  732. /* In case the PCI BAR is larger than the actual amount of vram */
  733. adev->gmc.visible_vram_size = adev->gmc.aper_size;
  734. if (adev->gmc.visible_vram_size > adev->gmc.real_vram_size)
  735. adev->gmc.visible_vram_size = adev->gmc.real_vram_size;
  736. /* set the gart size */
  737. if (amdgpu_gart_size == -1) {
  738. switch (adev->asic_type) {
  739. case CHIP_VEGA10: /* all engines support GPUVM */
  740. case CHIP_VEGA12: /* all engines support GPUVM */
  741. case CHIP_VEGA20:
  742. default:
  743. adev->gmc.gart_size = 512ULL << 20;
  744. break;
  745. case CHIP_RAVEN: /* DCE SG support */
  746. adev->gmc.gart_size = 1024ULL << 20;
  747. break;
  748. }
  749. } else {
  750. adev->gmc.gart_size = (u64)amdgpu_gart_size << 20;
  751. }
  752. gmc_v9_0_vram_gtt_location(adev, &adev->gmc);
  753. return 0;
  754. }
  755. static int gmc_v9_0_gart_init(struct amdgpu_device *adev)
  756. {
  757. int r;
  758. if (adev->gart.bo) {
  759. WARN(1, "VEGA10 PCIE GART already initialized\n");
  760. return 0;
  761. }
  762. /* Initialize common gart structure */
  763. r = amdgpu_gart_init(adev);
  764. if (r)
  765. return r;
  766. adev->gart.table_size = adev->gart.num_gpu_pages * 8;
  767. adev->gart.gart_pte_flags = AMDGPU_PTE_MTYPE(MTYPE_UC) |
  768. AMDGPU_PTE_EXECUTABLE;
  769. return amdgpu_gart_table_vram_alloc(adev);
  770. }
  771. static unsigned gmc_v9_0_get_vbios_fb_size(struct amdgpu_device *adev)
  772. {
  773. u32 d1vga_control = RREG32_SOC15(DCE, 0, mmD1VGA_CONTROL);
  774. unsigned size;
  775. /*
  776. * TODO Remove once GART corruption is resolved
  777. * Check related code in gmc_v9_0_sw_fini
  778. * */
  779. if (gmc_v9_0_keep_stolen_memory(adev))
  780. return 9 * 1024 * 1024;
  781. if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
  782. size = 9 * 1024 * 1024; /* reserve 8MB for vga emulator and 1 MB for FB */
  783. } else {
  784. u32 viewport;
  785. switch (adev->asic_type) {
  786. case CHIP_RAVEN:
  787. viewport = RREG32_SOC15(DCE, 0, mmHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION);
  788. size = (REG_GET_FIELD(viewport,
  789. HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_HEIGHT) *
  790. REG_GET_FIELD(viewport,
  791. HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_WIDTH) *
  792. 4);
  793. break;
  794. case CHIP_VEGA10:
  795. case CHIP_VEGA12:
  796. case CHIP_VEGA20:
  797. default:
  798. viewport = RREG32_SOC15(DCE, 0, mmSCL0_VIEWPORT_SIZE);
  799. size = (REG_GET_FIELD(viewport, SCL0_VIEWPORT_SIZE, VIEWPORT_HEIGHT) *
  800. REG_GET_FIELD(viewport, SCL0_VIEWPORT_SIZE, VIEWPORT_WIDTH) *
  801. 4);
  802. break;
  803. }
  804. }
  805. /* return 0 if the pre-OS buffer uses up most of vram */
  806. if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
  807. return 0;
  808. return size;
  809. }
  810. static int gmc_v9_0_sw_init(void *handle)
  811. {
  812. int r;
  813. int dma_bits;
  814. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  815. gfxhub_v1_0_init(adev);
  816. mmhub_v1_0_init(adev);
  817. spin_lock_init(&adev->gmc.invalidate_lock);
  818. adev->gmc.vram_type = amdgpu_atomfirmware_get_vram_type(adev);
  819. switch (adev->asic_type) {
  820. case CHIP_RAVEN:
  821. if (adev->rev_id == 0x0 || adev->rev_id == 0x1) {
  822. amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48);
  823. } else {
  824. /* vm_size is 128TB + 512GB for legacy 3-level page support */
  825. amdgpu_vm_adjust_size(adev, 128 * 1024 + 512, 9, 2, 48);
  826. adev->gmc.translate_further =
  827. adev->vm_manager.num_level > 1;
  828. }
  829. break;
  830. case CHIP_VEGA10:
  831. case CHIP_VEGA12:
  832. case CHIP_VEGA20:
  833. /*
  834. * To fulfill 4-level page support,
  835. * vm size is 256TB (48bit), maximum size of Vega10,
  836. * block size 512 (9bit)
  837. */
  838. amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48);
  839. break;
  840. default:
  841. break;
  842. }
  843. /* This interrupt is VMC page fault.*/
  844. r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VMC, VMC_1_0__SRCID__VM_FAULT,
  845. &adev->gmc.vm_fault);
  846. r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_UTCL2, UTCL2_1_0__SRCID__FAULT,
  847. &adev->gmc.vm_fault);
  848. if (r)
  849. return r;
  850. /* Set the internal MC address mask
  851. * This is the max address of the GPU's
  852. * internal address space.
  853. */
  854. adev->gmc.mc_mask = 0xffffffffffffULL; /* 48 bit MC */
  855. /* set DMA mask + need_dma32 flags.
  856. * PCIE - can handle 44-bits.
  857. * IGP - can handle 44-bits
  858. * PCI - dma32 for legacy pci gart, 44 bits on vega10
  859. */
  860. adev->need_dma32 = false;
  861. dma_bits = adev->need_dma32 ? 32 : 44;
  862. r = pci_set_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
  863. if (r) {
  864. adev->need_dma32 = true;
  865. dma_bits = 32;
  866. printk(KERN_WARNING "amdgpu: No suitable DMA available.\n");
  867. }
  868. r = pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(dma_bits));
  869. if (r) {
  870. pci_set_consistent_dma_mask(adev->pdev, DMA_BIT_MASK(32));
  871. printk(KERN_WARNING "amdgpu: No coherent DMA available.\n");
  872. }
  873. adev->need_swiotlb = drm_get_max_iomem() > ((u64)1 << dma_bits);
  874. if (adev->asic_type == CHIP_VEGA20) {
  875. r = gfxhub_v1_1_get_xgmi_info(adev);
  876. if (r)
  877. return r;
  878. }
  879. r = gmc_v9_0_mc_init(adev);
  880. if (r)
  881. return r;
  882. adev->gmc.stolen_size = gmc_v9_0_get_vbios_fb_size(adev);
  883. /* Memory manager */
  884. r = amdgpu_bo_init(adev);
  885. if (r)
  886. return r;
  887. r = gmc_v9_0_gart_init(adev);
  888. if (r)
  889. return r;
  890. /*
  891. * number of VMs
  892. * VMID 0 is reserved for System
  893. * amdgpu graphics/compute will use VMIDs 1-7
  894. * amdkfd will use VMIDs 8-15
  895. */
  896. adev->vm_manager.id_mgr[AMDGPU_GFXHUB].num_ids = AMDGPU_NUM_OF_VMIDS;
  897. adev->vm_manager.id_mgr[AMDGPU_MMHUB].num_ids = AMDGPU_NUM_OF_VMIDS;
  898. amdgpu_vm_manager_init(adev);
  899. return 0;
  900. }
  901. static int gmc_v9_0_sw_fini(void *handle)
  902. {
  903. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  904. amdgpu_gem_force_release(adev);
  905. amdgpu_vm_manager_fini(adev);
  906. if (gmc_v9_0_keep_stolen_memory(adev))
  907. amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
  908. amdgpu_gart_table_vram_free(adev);
  909. amdgpu_bo_fini(adev);
  910. amdgpu_gart_fini(adev);
  911. return 0;
  912. }
  913. static void gmc_v9_0_init_golden_registers(struct amdgpu_device *adev)
  914. {
  915. switch (adev->asic_type) {
  916. case CHIP_VEGA10:
  917. case CHIP_VEGA20:
  918. soc15_program_register_sequence(adev,
  919. golden_settings_mmhub_1_0_0,
  920. ARRAY_SIZE(golden_settings_mmhub_1_0_0));
  921. soc15_program_register_sequence(adev,
  922. golden_settings_athub_1_0_0,
  923. ARRAY_SIZE(golden_settings_athub_1_0_0));
  924. break;
  925. case CHIP_VEGA12:
  926. break;
  927. case CHIP_RAVEN:
  928. soc15_program_register_sequence(adev,
  929. golden_settings_athub_1_0_0,
  930. ARRAY_SIZE(golden_settings_athub_1_0_0));
  931. break;
  932. default:
  933. break;
  934. }
  935. }
  936. /**
  937. * gmc_v9_0_gart_enable - gart enable
  938. *
  939. * @adev: amdgpu_device pointer
  940. */
  941. static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
  942. {
  943. int r;
  944. bool value;
  945. u32 tmp;
  946. amdgpu_device_program_register_sequence(adev,
  947. golden_settings_vega10_hdp,
  948. ARRAY_SIZE(golden_settings_vega10_hdp));
  949. if (adev->gart.bo == NULL) {
  950. dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
  951. return -EINVAL;
  952. }
  953. r = amdgpu_gart_table_vram_pin(adev);
  954. if (r)
  955. return r;
  956. switch (adev->asic_type) {
  957. case CHIP_RAVEN:
  958. mmhub_v1_0_update_power_gating(adev, true);
  959. break;
  960. default:
  961. break;
  962. }
  963. r = gfxhub_v1_0_gart_enable(adev);
  964. if (r)
  965. return r;
  966. r = mmhub_v1_0_gart_enable(adev);
  967. if (r)
  968. return r;
  969. WREG32_FIELD15(HDP, 0, HDP_MISC_CNTL, FLUSH_INVALIDATE_CACHE, 1);
  970. tmp = RREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL);
  971. WREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL, tmp);
  972. /* After HDP is initialized, flush HDP.*/
  973. adev->nbio_funcs->hdp_flush(adev, NULL);
  974. if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS)
  975. value = false;
  976. else
  977. value = true;
  978. gfxhub_v1_0_set_fault_enable_default(adev, value);
  979. mmhub_v1_0_set_fault_enable_default(adev, value);
  980. gmc_v9_0_flush_gpu_tlb(adev, 0);
  981. DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
  982. (unsigned)(adev->gmc.gart_size >> 20),
  983. (unsigned long long)amdgpu_bo_gpu_offset(adev->gart.bo));
  984. adev->gart.ready = true;
  985. return 0;
  986. }
  987. static int gmc_v9_0_hw_init(void *handle)
  988. {
  989. int r;
  990. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  991. /* The sequence of these two function calls matters.*/
  992. gmc_v9_0_init_golden_registers(adev);
  993. if (adev->mode_info.num_crtc) {
  994. /* Lockout access through VGA aperture*/
  995. WREG32_FIELD15(DCE, 0, VGA_HDP_CONTROL, VGA_MEMORY_DISABLE, 1);
  996. /* disable VGA render */
  997. WREG32_FIELD15(DCE, 0, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
  998. }
  999. r = gmc_v9_0_gart_enable(adev);
  1000. return r;
  1001. }
  1002. /**
  1003. * gmc_v9_0_gart_disable - gart disable
  1004. *
  1005. * @adev: amdgpu_device pointer
  1006. *
  1007. * This disables all VM page table.
  1008. */
  1009. static void gmc_v9_0_gart_disable(struct amdgpu_device *adev)
  1010. {
  1011. gfxhub_v1_0_gart_disable(adev);
  1012. mmhub_v1_0_gart_disable(adev);
  1013. amdgpu_gart_table_vram_unpin(adev);
  1014. }
  1015. static int gmc_v9_0_hw_fini(void *handle)
  1016. {
  1017. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1018. if (amdgpu_sriov_vf(adev)) {
  1019. /* full access mode, so don't touch any GMC register */
  1020. DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
  1021. return 0;
  1022. }
  1023. amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0);
  1024. gmc_v9_0_gart_disable(adev);
  1025. return 0;
  1026. }
  1027. static int gmc_v9_0_suspend(void *handle)
  1028. {
  1029. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1030. return gmc_v9_0_hw_fini(adev);
  1031. }
  1032. static int gmc_v9_0_resume(void *handle)
  1033. {
  1034. int r;
  1035. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1036. r = gmc_v9_0_hw_init(adev);
  1037. if (r)
  1038. return r;
  1039. amdgpu_vmid_reset_all(adev);
  1040. return 0;
  1041. }
  1042. static bool gmc_v9_0_is_idle(void *handle)
  1043. {
  1044. /* MC is always ready in GMC v9.*/
  1045. return true;
  1046. }
  1047. static int gmc_v9_0_wait_for_idle(void *handle)
  1048. {
  1049. /* There is no need to wait for MC idle in GMC v9.*/
  1050. return 0;
  1051. }
  1052. static int gmc_v9_0_soft_reset(void *handle)
  1053. {
  1054. /* XXX for emulation.*/
  1055. return 0;
  1056. }
  1057. static int gmc_v9_0_set_clockgating_state(void *handle,
  1058. enum amd_clockgating_state state)
  1059. {
  1060. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1061. return mmhub_v1_0_set_clockgating(adev, state);
  1062. }
  1063. static void gmc_v9_0_get_clockgating_state(void *handle, u32 *flags)
  1064. {
  1065. struct amdgpu_device *adev = (struct amdgpu_device *)handle;
  1066. mmhub_v1_0_get_clockgating(adev, flags);
  1067. }
  1068. static int gmc_v9_0_set_powergating_state(void *handle,
  1069. enum amd_powergating_state state)
  1070. {
  1071. return 0;
  1072. }
  1073. const struct amd_ip_funcs gmc_v9_0_ip_funcs = {
  1074. .name = "gmc_v9_0",
  1075. .early_init = gmc_v9_0_early_init,
  1076. .late_init = gmc_v9_0_late_init,
  1077. .sw_init = gmc_v9_0_sw_init,
  1078. .sw_fini = gmc_v9_0_sw_fini,
  1079. .hw_init = gmc_v9_0_hw_init,
  1080. .hw_fini = gmc_v9_0_hw_fini,
  1081. .suspend = gmc_v9_0_suspend,
  1082. .resume = gmc_v9_0_resume,
  1083. .is_idle = gmc_v9_0_is_idle,
  1084. .wait_for_idle = gmc_v9_0_wait_for_idle,
  1085. .soft_reset = gmc_v9_0_soft_reset,
  1086. .set_clockgating_state = gmc_v9_0_set_clockgating_state,
  1087. .set_powergating_state = gmc_v9_0_set_powergating_state,
  1088. .get_clockgating_state = gmc_v9_0_get_clockgating_state,
  1089. };
  1090. const struct amdgpu_ip_block_version gmc_v9_0_ip_block =
  1091. {
  1092. .type = AMD_IP_BLOCK_TYPE_GMC,
  1093. .major = 9,
  1094. .minor = 0,
  1095. .rev = 0,
  1096. .funcs = &gmc_v9_0_ip_funcs,
  1097. };