kfd_device.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505
  1. // SPDX-License-Identifier: GPL-2.0 OR MIT
  2. /*
  3. * Copyright 2014-2022 Advanced Micro Devices, Inc.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be included in
  13. * all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21. * OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <linux/bsearch.h>
  24. #include <linux/pci.h>
  25. #include <linux/slab.h>
  26. #include "kfd_priv.h"
  27. #include "kfd_device_queue_manager.h"
  28. #include "kfd_pm4_headers_vi.h"
  29. #include "kfd_pm4_headers_aldebaran.h"
  30. #include "cwsr_trap_handler.h"
  31. #include "amdgpu_amdkfd.h"
  32. #include "kfd_smi_events.h"
  33. #include "kfd_svm.h"
  34. #include "kfd_migrate.h"
  35. #include "amdgpu.h"
  36. #include "amdgpu_xcp.h"
  37. #define MQD_SIZE_ALIGNED 768
  38. /*
  39. * kfd_locked is used to lock the kfd driver during suspend or reset
  40. * once locked, kfd driver will stop any further GPU execution.
  41. * create process (open) will return -EAGAIN.
  42. */
  43. static int kfd_locked;
  44. #ifdef CONFIG_DRM_AMDGPU_CIK
  45. extern const struct kfd2kgd_calls gfx_v7_kfd2kgd;
  46. #endif
  47. extern const struct kfd2kgd_calls gfx_v8_kfd2kgd;
  48. extern const struct kfd2kgd_calls gfx_v9_kfd2kgd;
  49. extern const struct kfd2kgd_calls arcturus_kfd2kgd;
  50. extern const struct kfd2kgd_calls aldebaran_kfd2kgd;
  51. extern const struct kfd2kgd_calls gc_9_4_3_kfd2kgd;
  52. extern const struct kfd2kgd_calls gfx_v10_kfd2kgd;
  53. extern const struct kfd2kgd_calls gfx_v10_3_kfd2kgd;
  54. extern const struct kfd2kgd_calls gfx_v11_kfd2kgd;
  55. extern const struct kfd2kgd_calls gfx_v12_kfd2kgd;
  56. static int kfd_gtt_sa_init(struct kfd_dev *kfd, unsigned int buf_size,
  57. unsigned int chunk_size);
  58. static void kfd_gtt_sa_fini(struct kfd_dev *kfd);
  59. static int kfd_resume(struct kfd_node *kfd);
  60. static void kfd_device_info_set_sdma_info(struct kfd_dev *kfd)
  61. {
  62. uint32_t sdma_version = amdgpu_ip_version(kfd->adev, SDMA0_HWIP, 0);
  63. switch (sdma_version) {
  64. case IP_VERSION(4, 0, 0):/* VEGA10 */
  65. case IP_VERSION(4, 0, 1):/* VEGA12 */
  66. case IP_VERSION(4, 1, 0):/* RAVEN */
  67. case IP_VERSION(4, 1, 1):/* RAVEN */
  68. case IP_VERSION(4, 1, 2):/* RENOIR */
  69. case IP_VERSION(5, 2, 1):/* VANGOGH */
  70. case IP_VERSION(5, 2, 3):/* YELLOW_CARP */
  71. case IP_VERSION(5, 2, 6):/* GC 10.3.6 */
  72. case IP_VERSION(5, 2, 7):/* GC 10.3.7 */
  73. kfd->device_info.num_sdma_queues_per_engine = 2;
  74. break;
  75. case IP_VERSION(4, 2, 0):/* VEGA20 */
  76. case IP_VERSION(4, 2, 2):/* ARCTURUS */
  77. case IP_VERSION(4, 4, 0):/* ALDEBARAN */
  78. case IP_VERSION(4, 4, 2):
  79. case IP_VERSION(4, 4, 5):
  80. case IP_VERSION(5, 0, 0):/* NAVI10 */
  81. case IP_VERSION(5, 0, 1):/* CYAN_SKILLFISH */
  82. case IP_VERSION(5, 0, 2):/* NAVI14 */
  83. case IP_VERSION(5, 0, 5):/* NAVI12 */
  84. case IP_VERSION(5, 2, 0):/* SIENNA_CICHLID */
  85. case IP_VERSION(5, 2, 2):/* NAVY_FLOUNDER */
  86. case IP_VERSION(5, 2, 4):/* DIMGREY_CAVEFISH */
  87. case IP_VERSION(5, 2, 5):/* BEIGE_GOBY */
  88. case IP_VERSION(6, 0, 0):
  89. case IP_VERSION(6, 0, 1):
  90. case IP_VERSION(6, 0, 2):
  91. case IP_VERSION(6, 0, 3):
  92. case IP_VERSION(6, 1, 0):
  93. case IP_VERSION(6, 1, 1):
  94. case IP_VERSION(6, 1, 2):
  95. case IP_VERSION(7, 0, 0):
  96. case IP_VERSION(7, 0, 1):
  97. kfd->device_info.num_sdma_queues_per_engine = 8;
  98. break;
  99. default:
  100. dev_warn(kfd_device,
  101. "Default sdma queue per engine(8) is set due to mismatch of sdma ip block(SDMA_HWIP:0x%x).\n",
  102. sdma_version);
  103. kfd->device_info.num_sdma_queues_per_engine = 8;
  104. }
  105. bitmap_zero(kfd->device_info.reserved_sdma_queues_bitmap, KFD_MAX_SDMA_QUEUES);
  106. switch (sdma_version) {
  107. case IP_VERSION(6, 0, 0):
  108. case IP_VERSION(6, 0, 1):
  109. case IP_VERSION(6, 0, 2):
  110. case IP_VERSION(6, 0, 3):
  111. case IP_VERSION(6, 1, 0):
  112. case IP_VERSION(6, 1, 1):
  113. case IP_VERSION(6, 1, 2):
  114. case IP_VERSION(7, 0, 0):
  115. case IP_VERSION(7, 0, 1):
  116. /* Reserve 1 for paging and 1 for gfx */
  117. kfd->device_info.num_reserved_sdma_queues_per_engine = 2;
  118. /* BIT(0)=engine-0 queue-0; BIT(1)=engine-1 queue-0; BIT(2)=engine-0 queue-1; ... */
  119. bitmap_set(kfd->device_info.reserved_sdma_queues_bitmap, 0,
  120. kfd->adev->sdma.num_instances *
  121. kfd->device_info.num_reserved_sdma_queues_per_engine);
  122. break;
  123. default:
  124. break;
  125. }
  126. }
  127. static void kfd_device_info_set_event_interrupt_class(struct kfd_dev *kfd)
  128. {
  129. uint32_t gc_version = KFD_GC_VERSION(kfd);
  130. switch (gc_version) {
  131. case IP_VERSION(9, 0, 1): /* VEGA10 */
  132. case IP_VERSION(9, 1, 0): /* RAVEN */
  133. case IP_VERSION(9, 2, 1): /* VEGA12 */
  134. case IP_VERSION(9, 2, 2): /* RAVEN */
  135. case IP_VERSION(9, 3, 0): /* RENOIR */
  136. case IP_VERSION(9, 4, 0): /* VEGA20 */
  137. case IP_VERSION(9, 4, 1): /* ARCTURUS */
  138. case IP_VERSION(9, 4, 2): /* ALDEBARAN */
  139. kfd->device_info.event_interrupt_class = &event_interrupt_class_v9;
  140. break;
  141. case IP_VERSION(9, 4, 3): /* GC 9.4.3 */
  142. case IP_VERSION(9, 4, 4): /* GC 9.4.4 */
  143. kfd->device_info.event_interrupt_class =
  144. &event_interrupt_class_v9_4_3;
  145. break;
  146. case IP_VERSION(10, 3, 1): /* VANGOGH */
  147. case IP_VERSION(10, 3, 3): /* YELLOW_CARP */
  148. case IP_VERSION(10, 3, 6): /* GC 10.3.6 */
  149. case IP_VERSION(10, 3, 7): /* GC 10.3.7 */
  150. case IP_VERSION(10, 1, 3): /* CYAN_SKILLFISH */
  151. case IP_VERSION(10, 1, 4):
  152. case IP_VERSION(10, 1, 10): /* NAVI10 */
  153. case IP_VERSION(10, 1, 2): /* NAVI12 */
  154. case IP_VERSION(10, 1, 1): /* NAVI14 */
  155. case IP_VERSION(10, 3, 0): /* SIENNA_CICHLID */
  156. case IP_VERSION(10, 3, 2): /* NAVY_FLOUNDER */
  157. case IP_VERSION(10, 3, 4): /* DIMGREY_CAVEFISH */
  158. case IP_VERSION(10, 3, 5): /* BEIGE_GOBY */
  159. kfd->device_info.event_interrupt_class = &event_interrupt_class_v10;
  160. break;
  161. case IP_VERSION(11, 0, 0):
  162. case IP_VERSION(11, 0, 1):
  163. case IP_VERSION(11, 0, 2):
  164. case IP_VERSION(11, 0, 3):
  165. case IP_VERSION(11, 0, 4):
  166. case IP_VERSION(11, 5, 0):
  167. case IP_VERSION(11, 5, 1):
  168. case IP_VERSION(11, 5, 2):
  169. kfd->device_info.event_interrupt_class = &event_interrupt_class_v11;
  170. break;
  171. case IP_VERSION(12, 0, 0):
  172. case IP_VERSION(12, 0, 1):
  173. /* GFX12_TODO: Change to v12 version. */
  174. kfd->device_info.event_interrupt_class = &event_interrupt_class_v11;
  175. break;
  176. default:
  177. dev_warn(kfd_device, "v9 event interrupt handler is set due to "
  178. "mismatch of gc ip block(GC_HWIP:0x%x).\n", gc_version);
  179. kfd->device_info.event_interrupt_class = &event_interrupt_class_v9;
  180. }
  181. }
  182. static void kfd_device_info_init(struct kfd_dev *kfd,
  183. bool vf, uint32_t gfx_target_version)
  184. {
  185. uint32_t gc_version = KFD_GC_VERSION(kfd);
  186. uint32_t asic_type = kfd->adev->asic_type;
  187. kfd->device_info.max_pasid_bits = 16;
  188. kfd->device_info.max_no_of_hqd = 24;
  189. kfd->device_info.num_of_watch_points = 4;
  190. kfd->device_info.mqd_size_aligned = MQD_SIZE_ALIGNED;
  191. kfd->device_info.gfx_target_version = gfx_target_version;
  192. if (KFD_IS_SOC15(kfd)) {
  193. kfd->device_info.doorbell_size = 8;
  194. kfd->device_info.ih_ring_entry_size = 8 * sizeof(uint32_t);
  195. kfd->device_info.supports_cwsr = true;
  196. kfd_device_info_set_sdma_info(kfd);
  197. kfd_device_info_set_event_interrupt_class(kfd);
  198. if (gc_version < IP_VERSION(11, 0, 0)) {
  199. /* Navi2x+, Navi1x+ */
  200. if (gc_version == IP_VERSION(10, 3, 6))
  201. kfd->device_info.no_atomic_fw_version = 14;
  202. else if (gc_version == IP_VERSION(10, 3, 7))
  203. kfd->device_info.no_atomic_fw_version = 3;
  204. else if (gc_version >= IP_VERSION(10, 3, 0))
  205. kfd->device_info.no_atomic_fw_version = 92;
  206. else if (gc_version >= IP_VERSION(10, 1, 1))
  207. kfd->device_info.no_atomic_fw_version = 145;
  208. /* Navi1x+ */
  209. if (gc_version >= IP_VERSION(10, 1, 1))
  210. kfd->device_info.needs_pci_atomics = true;
  211. } else if (gc_version < IP_VERSION(12, 0, 0)) {
  212. /*
  213. * PCIe atomics support acknowledgment in GFX11 RS64 CPFW requires
  214. * MEC version >= 509. Prior RS64 CPFW versions (and all F32) require
  215. * PCIe atomics support.
  216. */
  217. kfd->device_info.needs_pci_atomics = true;
  218. kfd->device_info.no_atomic_fw_version = kfd->adev->gfx.rs64_enable ? 509 : 0;
  219. } else if (gc_version < IP_VERSION(13, 0, 0)) {
  220. kfd->device_info.needs_pci_atomics = true;
  221. kfd->device_info.no_atomic_fw_version = 2090;
  222. } else {
  223. kfd->device_info.needs_pci_atomics = true;
  224. }
  225. } else {
  226. kfd->device_info.doorbell_size = 4;
  227. kfd->device_info.ih_ring_entry_size = 4 * sizeof(uint32_t);
  228. kfd->device_info.event_interrupt_class = &event_interrupt_class_cik;
  229. kfd->device_info.num_sdma_queues_per_engine = 2;
  230. if (asic_type != CHIP_KAVERI &&
  231. asic_type != CHIP_HAWAII &&
  232. asic_type != CHIP_TONGA)
  233. kfd->device_info.supports_cwsr = true;
  234. if (asic_type != CHIP_HAWAII && !vf)
  235. kfd->device_info.needs_pci_atomics = true;
  236. }
  237. }
  238. struct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)
  239. {
  240. struct kfd_dev *kfd = NULL;
  241. const struct kfd2kgd_calls *f2g = NULL;
  242. uint32_t gfx_target_version = 0;
  243. switch (adev->asic_type) {
  244. #ifdef CONFIG_DRM_AMDGPU_CIK
  245. case CHIP_KAVERI:
  246. gfx_target_version = 70000;
  247. if (!vf)
  248. f2g = &gfx_v7_kfd2kgd;
  249. break;
  250. #endif
  251. case CHIP_CARRIZO:
  252. gfx_target_version = 80001;
  253. if (!vf)
  254. f2g = &gfx_v8_kfd2kgd;
  255. break;
  256. #ifdef CONFIG_DRM_AMDGPU_CIK
  257. case CHIP_HAWAII:
  258. gfx_target_version = 70001;
  259. if (!amdgpu_exp_hw_support)
  260. pr_info(
  261. "KFD support on Hawaii is experimental. See modparam exp_hw_support\n"
  262. );
  263. else if (!vf)
  264. f2g = &gfx_v7_kfd2kgd;
  265. break;
  266. #endif
  267. case CHIP_TONGA:
  268. gfx_target_version = 80002;
  269. if (!vf)
  270. f2g = &gfx_v8_kfd2kgd;
  271. break;
  272. case CHIP_FIJI:
  273. case CHIP_POLARIS10:
  274. gfx_target_version = 80003;
  275. f2g = &gfx_v8_kfd2kgd;
  276. break;
  277. case CHIP_POLARIS11:
  278. case CHIP_POLARIS12:
  279. case CHIP_VEGAM:
  280. gfx_target_version = 80003;
  281. if (!vf)
  282. f2g = &gfx_v8_kfd2kgd;
  283. break;
  284. default:
  285. switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
  286. /* Vega 10 */
  287. case IP_VERSION(9, 0, 1):
  288. gfx_target_version = 90000;
  289. f2g = &gfx_v9_kfd2kgd;
  290. break;
  291. /* Raven */
  292. case IP_VERSION(9, 1, 0):
  293. case IP_VERSION(9, 2, 2):
  294. gfx_target_version = 90002;
  295. if (!vf)
  296. f2g = &gfx_v9_kfd2kgd;
  297. break;
  298. /* Vega12 */
  299. case IP_VERSION(9, 2, 1):
  300. gfx_target_version = 90004;
  301. if (!vf)
  302. f2g = &gfx_v9_kfd2kgd;
  303. break;
  304. /* Renoir */
  305. case IP_VERSION(9, 3, 0):
  306. gfx_target_version = 90012;
  307. if (!vf)
  308. f2g = &gfx_v9_kfd2kgd;
  309. break;
  310. /* Vega20 */
  311. case IP_VERSION(9, 4, 0):
  312. gfx_target_version = 90006;
  313. if (!vf)
  314. f2g = &gfx_v9_kfd2kgd;
  315. break;
  316. /* Arcturus */
  317. case IP_VERSION(9, 4, 1):
  318. gfx_target_version = 90008;
  319. f2g = &arcturus_kfd2kgd;
  320. break;
  321. /* Aldebaran */
  322. case IP_VERSION(9, 4, 2):
  323. gfx_target_version = 90010;
  324. f2g = &aldebaran_kfd2kgd;
  325. break;
  326. case IP_VERSION(9, 4, 3):
  327. gfx_target_version = adev->rev_id >= 1 ? 90402
  328. : adev->flags & AMD_IS_APU ? 90400
  329. : 90401;
  330. f2g = &gc_9_4_3_kfd2kgd;
  331. break;
  332. case IP_VERSION(9, 4, 4):
  333. gfx_target_version = 90402;
  334. f2g = &gc_9_4_3_kfd2kgd;
  335. break;
  336. /* Navi10 */
  337. case IP_VERSION(10, 1, 10):
  338. gfx_target_version = 100100;
  339. if (!vf)
  340. f2g = &gfx_v10_kfd2kgd;
  341. break;
  342. /* Navi12 */
  343. case IP_VERSION(10, 1, 2):
  344. gfx_target_version = 100101;
  345. f2g = &gfx_v10_kfd2kgd;
  346. break;
  347. /* Navi14 */
  348. case IP_VERSION(10, 1, 1):
  349. gfx_target_version = 100102;
  350. if (!vf)
  351. f2g = &gfx_v10_kfd2kgd;
  352. break;
  353. /* Cyan Skillfish */
  354. case IP_VERSION(10, 1, 3):
  355. case IP_VERSION(10, 1, 4):
  356. gfx_target_version = 100103;
  357. if (!vf)
  358. f2g = &gfx_v10_kfd2kgd;
  359. break;
  360. /* Sienna Cichlid */
  361. case IP_VERSION(10, 3, 0):
  362. gfx_target_version = 100300;
  363. f2g = &gfx_v10_3_kfd2kgd;
  364. break;
  365. /* Navy Flounder */
  366. case IP_VERSION(10, 3, 2):
  367. gfx_target_version = 100301;
  368. f2g = &gfx_v10_3_kfd2kgd;
  369. break;
  370. /* Van Gogh */
  371. case IP_VERSION(10, 3, 1):
  372. gfx_target_version = 100303;
  373. if (!vf)
  374. f2g = &gfx_v10_3_kfd2kgd;
  375. break;
  376. /* Dimgrey Cavefish */
  377. case IP_VERSION(10, 3, 4):
  378. gfx_target_version = 100302;
  379. f2g = &gfx_v10_3_kfd2kgd;
  380. break;
  381. /* Beige Goby */
  382. case IP_VERSION(10, 3, 5):
  383. gfx_target_version = 100304;
  384. f2g = &gfx_v10_3_kfd2kgd;
  385. break;
  386. /* Yellow Carp */
  387. case IP_VERSION(10, 3, 3):
  388. gfx_target_version = 100305;
  389. if (!vf)
  390. f2g = &gfx_v10_3_kfd2kgd;
  391. break;
  392. case IP_VERSION(10, 3, 6):
  393. case IP_VERSION(10, 3, 7):
  394. gfx_target_version = 100306;
  395. if (!vf)
  396. f2g = &gfx_v10_3_kfd2kgd;
  397. break;
  398. case IP_VERSION(11, 0, 0):
  399. gfx_target_version = 110000;
  400. f2g = &gfx_v11_kfd2kgd;
  401. break;
  402. case IP_VERSION(11, 0, 1):
  403. case IP_VERSION(11, 0, 4):
  404. gfx_target_version = 110003;
  405. f2g = &gfx_v11_kfd2kgd;
  406. break;
  407. case IP_VERSION(11, 0, 2):
  408. gfx_target_version = 110002;
  409. f2g = &gfx_v11_kfd2kgd;
  410. break;
  411. case IP_VERSION(11, 0, 3):
  412. /* Note: Compiler version is 11.0.1 while HW version is 11.0.3 */
  413. gfx_target_version = 110001;
  414. f2g = &gfx_v11_kfd2kgd;
  415. break;
  416. case IP_VERSION(11, 5, 0):
  417. gfx_target_version = 110500;
  418. f2g = &gfx_v11_kfd2kgd;
  419. break;
  420. case IP_VERSION(11, 5, 1):
  421. gfx_target_version = 110501;
  422. f2g = &gfx_v11_kfd2kgd;
  423. break;
  424. case IP_VERSION(11, 5, 2):
  425. gfx_target_version = 110502;
  426. f2g = &gfx_v11_kfd2kgd;
  427. break;
  428. case IP_VERSION(12, 0, 0):
  429. gfx_target_version = 120000;
  430. f2g = &gfx_v12_kfd2kgd;
  431. break;
  432. case IP_VERSION(12, 0, 1):
  433. gfx_target_version = 120001;
  434. f2g = &gfx_v12_kfd2kgd;
  435. break;
  436. default:
  437. break;
  438. }
  439. break;
  440. }
  441. if (!f2g) {
  442. if (amdgpu_ip_version(adev, GC_HWIP, 0))
  443. dev_info(kfd_device,
  444. "GC IP %06x %s not supported in kfd\n",
  445. amdgpu_ip_version(adev, GC_HWIP, 0),
  446. vf ? "VF" : "");
  447. else
  448. dev_info(kfd_device, "%s %s not supported in kfd\n",
  449. amdgpu_asic_name[adev->asic_type], vf ? "VF" : "");
  450. return NULL;
  451. }
  452. kfd = kzalloc(sizeof(*kfd), GFP_KERNEL);
  453. if (!kfd)
  454. return NULL;
  455. kfd->adev = adev;
  456. kfd_device_info_init(kfd, vf, gfx_target_version);
  457. kfd->init_complete = false;
  458. kfd->kfd2kgd = f2g;
  459. atomic_set(&kfd->compute_profile, 0);
  460. mutex_init(&kfd->doorbell_mutex);
  461. ida_init(&kfd->doorbell_ida);
  462. return kfd;
  463. }
  464. static void kfd_cwsr_init(struct kfd_dev *kfd)
  465. {
  466. if (cwsr_enable && kfd->device_info.supports_cwsr) {
  467. if (KFD_GC_VERSION(kfd) < IP_VERSION(9, 0, 1)) {
  468. BUILD_BUG_ON(sizeof(cwsr_trap_gfx8_hex)
  469. > KFD_CWSR_TMA_OFFSET);
  470. kfd->cwsr_isa = cwsr_trap_gfx8_hex;
  471. kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx8_hex);
  472. } else if (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 1)) {
  473. BUILD_BUG_ON(sizeof(cwsr_trap_arcturus_hex)
  474. > KFD_CWSR_TMA_OFFSET);
  475. kfd->cwsr_isa = cwsr_trap_arcturus_hex;
  476. kfd->cwsr_isa_size = sizeof(cwsr_trap_arcturus_hex);
  477. } else if (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 2)) {
  478. BUILD_BUG_ON(sizeof(cwsr_trap_aldebaran_hex)
  479. > KFD_CWSR_TMA_OFFSET);
  480. kfd->cwsr_isa = cwsr_trap_aldebaran_hex;
  481. kfd->cwsr_isa_size = sizeof(cwsr_trap_aldebaran_hex);
  482. } else if (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 3) ||
  483. KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 4)) {
  484. BUILD_BUG_ON(sizeof(cwsr_trap_gfx9_4_3_hex)
  485. > KFD_CWSR_TMA_OFFSET);
  486. kfd->cwsr_isa = cwsr_trap_gfx9_4_3_hex;
  487. kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx9_4_3_hex);
  488. } else if (KFD_GC_VERSION(kfd) < IP_VERSION(10, 1, 1)) {
  489. BUILD_BUG_ON(sizeof(cwsr_trap_gfx9_hex)
  490. > KFD_CWSR_TMA_OFFSET);
  491. kfd->cwsr_isa = cwsr_trap_gfx9_hex;
  492. kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx9_hex);
  493. } else if (KFD_GC_VERSION(kfd) < IP_VERSION(10, 3, 0)) {
  494. BUILD_BUG_ON(sizeof(cwsr_trap_nv1x_hex)
  495. > KFD_CWSR_TMA_OFFSET);
  496. kfd->cwsr_isa = cwsr_trap_nv1x_hex;
  497. kfd->cwsr_isa_size = sizeof(cwsr_trap_nv1x_hex);
  498. } else if (KFD_GC_VERSION(kfd) < IP_VERSION(11, 0, 0)) {
  499. BUILD_BUG_ON(sizeof(cwsr_trap_gfx10_hex)
  500. > KFD_CWSR_TMA_OFFSET);
  501. kfd->cwsr_isa = cwsr_trap_gfx10_hex;
  502. kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx10_hex);
  503. } else if (KFD_GC_VERSION(kfd) < IP_VERSION(12, 0, 0)) {
  504. /* The gfx11 cwsr trap handler must fit inside a single
  505. page. */
  506. BUILD_BUG_ON(sizeof(cwsr_trap_gfx11_hex) > PAGE_SIZE);
  507. kfd->cwsr_isa = cwsr_trap_gfx11_hex;
  508. kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx11_hex);
  509. } else {
  510. BUILD_BUG_ON(sizeof(cwsr_trap_gfx12_hex)
  511. > KFD_CWSR_TMA_OFFSET);
  512. kfd->cwsr_isa = cwsr_trap_gfx12_hex;
  513. kfd->cwsr_isa_size = sizeof(cwsr_trap_gfx12_hex);
  514. }
  515. kfd->cwsr_enabled = true;
  516. }
  517. }
  518. static int kfd_gws_init(struct kfd_node *node)
  519. {
  520. int ret = 0;
  521. struct kfd_dev *kfd = node->kfd;
  522. uint32_t mes_rev = node->adev->mes.sched_version & AMDGPU_MES_VERSION_MASK;
  523. if (node->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS)
  524. return 0;
  525. if (hws_gws_support || (KFD_IS_SOC15(node) &&
  526. ((KFD_GC_VERSION(node) == IP_VERSION(9, 0, 1)
  527. && kfd->mec2_fw_version >= 0x81b3) ||
  528. (KFD_GC_VERSION(node) <= IP_VERSION(9, 4, 0)
  529. && kfd->mec2_fw_version >= 0x1b3) ||
  530. (KFD_GC_VERSION(node) == IP_VERSION(9, 4, 1)
  531. && kfd->mec2_fw_version >= 0x30) ||
  532. (KFD_GC_VERSION(node) == IP_VERSION(9, 4, 2)
  533. && kfd->mec2_fw_version >= 0x28) ||
  534. (KFD_GC_VERSION(node) == IP_VERSION(9, 4, 3) ||
  535. KFD_GC_VERSION(node) == IP_VERSION(9, 4, 4)) ||
  536. (KFD_GC_VERSION(node) >= IP_VERSION(10, 3, 0)
  537. && KFD_GC_VERSION(node) < IP_VERSION(11, 0, 0)
  538. && kfd->mec2_fw_version >= 0x6b) ||
  539. (KFD_GC_VERSION(node) >= IP_VERSION(11, 0, 0)
  540. && KFD_GC_VERSION(node) < IP_VERSION(12, 0, 0)
  541. && mes_rev >= 68))))
  542. ret = amdgpu_amdkfd_alloc_gws(node->adev,
  543. node->adev->gds.gws_size, &node->gws);
  544. return ret;
  545. }
  546. static void kfd_smi_init(struct kfd_node *dev)
  547. {
  548. INIT_LIST_HEAD(&dev->smi_clients);
  549. spin_lock_init(&dev->smi_lock);
  550. }
  551. static int kfd_init_node(struct kfd_node *node)
  552. {
  553. int err = -1;
  554. if (kfd_interrupt_init(node)) {
  555. dev_err(kfd_device, "Error initializing interrupts\n");
  556. goto kfd_interrupt_error;
  557. }
  558. node->dqm = device_queue_manager_init(node);
  559. if (!node->dqm) {
  560. dev_err(kfd_device, "Error initializing queue manager\n");
  561. goto device_queue_manager_error;
  562. }
  563. if (kfd_gws_init(node)) {
  564. dev_err(kfd_device, "Could not allocate %d gws\n",
  565. node->adev->gds.gws_size);
  566. goto gws_error;
  567. }
  568. if (kfd_resume(node))
  569. goto kfd_resume_error;
  570. if (kfd_topology_add_device(node)) {
  571. dev_err(kfd_device, "Error adding device to topology\n");
  572. goto kfd_topology_add_device_error;
  573. }
  574. kfd_smi_init(node);
  575. return 0;
  576. kfd_topology_add_device_error:
  577. kfd_resume_error:
  578. gws_error:
  579. device_queue_manager_uninit(node->dqm);
  580. device_queue_manager_error:
  581. kfd_interrupt_exit(node);
  582. kfd_interrupt_error:
  583. if (node->gws)
  584. amdgpu_amdkfd_free_gws(node->adev, node->gws);
  585. /* Cleanup the node memory here */
  586. kfree(node);
  587. return err;
  588. }
  589. static void kfd_cleanup_nodes(struct kfd_dev *kfd, unsigned int num_nodes)
  590. {
  591. struct kfd_node *knode;
  592. unsigned int i;
  593. /*
  594. * flush_work ensures that there are no outstanding
  595. * work-queue items that will access interrupt_ring. New work items
  596. * can't be created because we stopped interrupt handling above.
  597. */
  598. flush_workqueue(kfd->ih_wq);
  599. destroy_workqueue(kfd->ih_wq);
  600. for (i = 0; i < num_nodes; i++) {
  601. knode = kfd->nodes[i];
  602. device_queue_manager_uninit(knode->dqm);
  603. kfd_interrupt_exit(knode);
  604. kfd_topology_remove_device(knode);
  605. if (knode->gws)
  606. amdgpu_amdkfd_free_gws(knode->adev, knode->gws);
  607. kfree(knode);
  608. kfd->nodes[i] = NULL;
  609. }
  610. }
  611. static void kfd_setup_interrupt_bitmap(struct kfd_node *node,
  612. unsigned int kfd_node_idx)
  613. {
  614. struct amdgpu_device *adev = node->adev;
  615. uint32_t xcc_mask = node->xcc_mask;
  616. uint32_t xcc, mapped_xcc;
  617. /*
  618. * Interrupt bitmap is setup for processing interrupts from
  619. * different XCDs and AIDs.
  620. * Interrupt bitmap is defined as follows:
  621. * 1. Bits 0-15 - correspond to the NodeId field.
  622. * Each bit corresponds to NodeId number. For example, if
  623. * a KFD node has interrupt bitmap set to 0x7, then this
  624. * KFD node will process interrupts with NodeId = 0, 1 and 2
  625. * in the IH cookie.
  626. * 2. Bits 16-31 - unused.
  627. *
  628. * Please note that the kfd_node_idx argument passed to this
  629. * function is not related to NodeId field received in the
  630. * IH cookie.
  631. *
  632. * In CPX mode, a KFD node will process an interrupt if:
  633. * - the Node Id matches the corresponding bit set in
  634. * Bits 0-15.
  635. * - AND VMID reported in the interrupt lies within the
  636. * VMID range of the node.
  637. */
  638. for_each_inst(xcc, xcc_mask) {
  639. mapped_xcc = GET_INST(GC, xcc);
  640. node->interrupt_bitmap |= (mapped_xcc % 2 ? 5 : 3) << (4 * (mapped_xcc / 2));
  641. }
  642. dev_info(kfd_device, "Node: %d, interrupt_bitmap: %x\n", kfd_node_idx,
  643. node->interrupt_bitmap);
  644. }
  645. bool kgd2kfd_device_init(struct kfd_dev *kfd,
  646. const struct kgd2kfd_shared_resources *gpu_resources)
  647. {
  648. unsigned int size, map_process_packet_size, i;
  649. struct kfd_node *node;
  650. uint32_t first_vmid_kfd, last_vmid_kfd, vmid_num_kfd;
  651. unsigned int max_proc_per_quantum;
  652. int partition_mode;
  653. int xcp_idx;
  654. kfd->mec_fw_version = amdgpu_amdkfd_get_fw_version(kfd->adev,
  655. KGD_ENGINE_MEC1);
  656. kfd->mec2_fw_version = amdgpu_amdkfd_get_fw_version(kfd->adev,
  657. KGD_ENGINE_MEC2);
  658. kfd->sdma_fw_version = amdgpu_amdkfd_get_fw_version(kfd->adev,
  659. KGD_ENGINE_SDMA1);
  660. kfd->shared_resources = *gpu_resources;
  661. kfd->num_nodes = amdgpu_xcp_get_num_xcp(kfd->adev->xcp_mgr);
  662. if (kfd->num_nodes == 0) {
  663. dev_err(kfd_device,
  664. "KFD num nodes cannot be 0, num_xcc_in_node: %d\n",
  665. kfd->adev->gfx.num_xcc_per_xcp);
  666. goto out;
  667. }
  668. /* Allow BIF to recode atomics to PCIe 3.0 AtomicOps.
  669. * 32 and 64-bit requests are possible and must be
  670. * supported.
  671. */
  672. kfd->pci_atomic_requested = amdgpu_amdkfd_have_atomics_support(kfd->adev);
  673. if (!kfd->pci_atomic_requested &&
  674. kfd->device_info.needs_pci_atomics &&
  675. (!kfd->device_info.no_atomic_fw_version ||
  676. kfd->mec_fw_version < kfd->device_info.no_atomic_fw_version)) {
  677. dev_info(kfd_device,
  678. "skipped device %x:%x, PCI rejects atomics %d<%d\n",
  679. kfd->adev->pdev->vendor, kfd->adev->pdev->device,
  680. kfd->mec_fw_version,
  681. kfd->device_info.no_atomic_fw_version);
  682. return false;
  683. }
  684. first_vmid_kfd = ffs(gpu_resources->compute_vmid_bitmap)-1;
  685. last_vmid_kfd = fls(gpu_resources->compute_vmid_bitmap)-1;
  686. vmid_num_kfd = last_vmid_kfd - first_vmid_kfd + 1;
  687. /* For GFX9.4.3, we need special handling for VMIDs depending on
  688. * partition mode.
  689. * In CPX mode, the VMID range needs to be shared between XCDs.
  690. * Additionally, there are 13 VMIDs (3-15) available for KFD. To
  691. * divide them equally, we change starting VMID to 4 and not use
  692. * VMID 3.
  693. * If the VMID range changes for GFX9.4.3, then this code MUST be
  694. * revisited.
  695. */
  696. if (kfd->adev->xcp_mgr) {
  697. partition_mode = amdgpu_xcp_query_partition_mode(kfd->adev->xcp_mgr,
  698. AMDGPU_XCP_FL_LOCKED);
  699. if (partition_mode == AMDGPU_CPX_PARTITION_MODE &&
  700. kfd->num_nodes != 1) {
  701. vmid_num_kfd /= 2;
  702. first_vmid_kfd = last_vmid_kfd + 1 - vmid_num_kfd*2;
  703. }
  704. }
  705. /* Verify module parameters regarding mapped process number*/
  706. if (hws_max_conc_proc >= 0)
  707. max_proc_per_quantum = min((u32)hws_max_conc_proc, vmid_num_kfd);
  708. else
  709. max_proc_per_quantum = vmid_num_kfd;
  710. /* calculate max size of mqds needed for queues */
  711. size = max_num_of_queues_per_device *
  712. kfd->device_info.mqd_size_aligned;
  713. /*
  714. * calculate max size of runlist packet.
  715. * There can be only 2 packets at once
  716. */
  717. map_process_packet_size = KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 2) ?
  718. sizeof(struct pm4_mes_map_process_aldebaran) :
  719. sizeof(struct pm4_mes_map_process);
  720. size += (KFD_MAX_NUM_OF_PROCESSES * map_process_packet_size +
  721. max_num_of_queues_per_device * sizeof(struct pm4_mes_map_queues)
  722. + sizeof(struct pm4_mes_runlist)) * 2;
  723. /* Add size of HIQ & DIQ */
  724. size += KFD_KERNEL_QUEUE_SIZE * 2;
  725. /* add another 512KB for all other allocations on gart (HPD, fences) */
  726. size += 512 * 1024;
  727. if (amdgpu_amdkfd_alloc_gtt_mem(
  728. kfd->adev, size, &kfd->gtt_mem,
  729. &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr,
  730. false)) {
  731. dev_err(kfd_device, "Could not allocate %d bytes\n", size);
  732. goto alloc_gtt_mem_failure;
  733. }
  734. dev_info(kfd_device, "Allocated %d bytes on gart\n", size);
  735. /* Initialize GTT sa with 512 byte chunk size */
  736. if (kfd_gtt_sa_init(kfd, size, 512) != 0) {
  737. dev_err(kfd_device, "Error initializing gtt sub-allocator\n");
  738. goto kfd_gtt_sa_init_error;
  739. }
  740. if (kfd_doorbell_init(kfd)) {
  741. dev_err(kfd_device,
  742. "Error initializing doorbell aperture\n");
  743. goto kfd_doorbell_error;
  744. }
  745. if (amdgpu_use_xgmi_p2p)
  746. kfd->hive_id = kfd->adev->gmc.xgmi.hive_id;
  747. /*
  748. * For GFX9.4.3, the KFD abstracts all partitions within a socket as
  749. * xGMI connected in the topology so assign a unique hive id per
  750. * device based on the pci device location if device is in PCIe mode.
  751. */
  752. if (!kfd->hive_id &&
  753. (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 3) ||
  754. KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 4)) &&
  755. kfd->num_nodes > 1)
  756. kfd->hive_id = pci_dev_id(kfd->adev->pdev);
  757. kfd->noretry = kfd->adev->gmc.noretry;
  758. kfd_cwsr_init(kfd);
  759. dev_info(kfd_device, "Total number of KFD nodes to be created: %d\n",
  760. kfd->num_nodes);
  761. /* Allocate the KFD nodes */
  762. for (i = 0, xcp_idx = 0; i < kfd->num_nodes; i++) {
  763. node = kzalloc(sizeof(struct kfd_node), GFP_KERNEL);
  764. if (!node)
  765. goto node_alloc_error;
  766. node->node_id = i;
  767. node->adev = kfd->adev;
  768. node->kfd = kfd;
  769. node->kfd2kgd = kfd->kfd2kgd;
  770. node->vm_info.vmid_num_kfd = vmid_num_kfd;
  771. node->xcp = amdgpu_get_next_xcp(kfd->adev->xcp_mgr, &xcp_idx);
  772. /* TODO : Check if error handling is needed */
  773. if (node->xcp) {
  774. amdgpu_xcp_get_inst_details(node->xcp, AMDGPU_XCP_GFX,
  775. &node->xcc_mask);
  776. ++xcp_idx;
  777. } else {
  778. node->xcc_mask =
  779. (1U << NUM_XCC(kfd->adev->gfx.xcc_mask)) - 1;
  780. }
  781. if (node->xcp) {
  782. dev_info(kfd_device, "KFD node %d partition %d size %lldM\n",
  783. node->node_id, node->xcp->mem_id,
  784. KFD_XCP_MEMORY_SIZE(node->adev, node->node_id) >> 20);
  785. }
  786. if ((KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 3) ||
  787. KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 4)) &&
  788. partition_mode == AMDGPU_CPX_PARTITION_MODE &&
  789. kfd->num_nodes != 1) {
  790. /* For GFX9.4.3 and CPX mode, first XCD gets VMID range
  791. * 4-9 and second XCD gets VMID range 10-15.
  792. */
  793. node->vm_info.first_vmid_kfd = (i%2 == 0) ?
  794. first_vmid_kfd :
  795. first_vmid_kfd+vmid_num_kfd;
  796. node->vm_info.last_vmid_kfd = (i%2 == 0) ?
  797. last_vmid_kfd-vmid_num_kfd :
  798. last_vmid_kfd;
  799. node->compute_vmid_bitmap =
  800. ((0x1 << (node->vm_info.last_vmid_kfd + 1)) - 1) -
  801. ((0x1 << (node->vm_info.first_vmid_kfd)) - 1);
  802. } else {
  803. node->vm_info.first_vmid_kfd = first_vmid_kfd;
  804. node->vm_info.last_vmid_kfd = last_vmid_kfd;
  805. node->compute_vmid_bitmap =
  806. gpu_resources->compute_vmid_bitmap;
  807. }
  808. node->max_proc_per_quantum = max_proc_per_quantum;
  809. atomic_set(&node->sram_ecc_flag, 0);
  810. amdgpu_amdkfd_get_local_mem_info(kfd->adev,
  811. &node->local_mem_info, node->xcp);
  812. if (KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 3) ||
  813. KFD_GC_VERSION(kfd) == IP_VERSION(9, 4, 4))
  814. kfd_setup_interrupt_bitmap(node, i);
  815. /* Initialize the KFD node */
  816. if (kfd_init_node(node)) {
  817. dev_err(kfd_device, "Error initializing KFD node\n");
  818. goto node_init_error;
  819. }
  820. spin_lock_init(&node->watch_points_lock);
  821. kfd->nodes[i] = node;
  822. }
  823. svm_range_set_max_pages(kfd->adev);
  824. kfd->init_complete = true;
  825. dev_info(kfd_device, "added device %x:%x\n", kfd->adev->pdev->vendor,
  826. kfd->adev->pdev->device);
  827. pr_debug("Starting kfd with the following scheduling policy %d\n",
  828. node->dqm->sched_policy);
  829. goto out;
  830. node_init_error:
  831. node_alloc_error:
  832. kfd_cleanup_nodes(kfd, i);
  833. kfd_doorbell_fini(kfd);
  834. kfd_doorbell_error:
  835. kfd_gtt_sa_fini(kfd);
  836. kfd_gtt_sa_init_error:
  837. amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
  838. alloc_gtt_mem_failure:
  839. dev_err(kfd_device,
  840. "device %x:%x NOT added due to errors\n",
  841. kfd->adev->pdev->vendor, kfd->adev->pdev->device);
  842. out:
  843. return kfd->init_complete;
  844. }
  845. void kgd2kfd_device_exit(struct kfd_dev *kfd)
  846. {
  847. if (kfd->init_complete) {
  848. /* Cleanup KFD nodes */
  849. kfd_cleanup_nodes(kfd, kfd->num_nodes);
  850. /* Cleanup common/shared resources */
  851. kfd_doorbell_fini(kfd);
  852. ida_destroy(&kfd->doorbell_ida);
  853. kfd_gtt_sa_fini(kfd);
  854. amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
  855. }
  856. kfree(kfd);
  857. }
  858. int kgd2kfd_pre_reset(struct kfd_dev *kfd,
  859. struct amdgpu_reset_context *reset_context)
  860. {
  861. struct kfd_node *node;
  862. int i;
  863. if (!kfd->init_complete)
  864. return 0;
  865. for (i = 0; i < kfd->num_nodes; i++) {
  866. node = kfd->nodes[i];
  867. kfd_smi_event_update_gpu_reset(node, false, reset_context);
  868. }
  869. kgd2kfd_suspend(kfd, false);
  870. for (i = 0; i < kfd->num_nodes; i++)
  871. kfd_signal_reset_event(kfd->nodes[i]);
  872. return 0;
  873. }
  874. /*
  875. * Fix me. KFD won't be able to resume existing process for now.
  876. * We will keep all existing process in a evicted state and
  877. * wait the process to be terminated.
  878. */
  879. int kgd2kfd_post_reset(struct kfd_dev *kfd)
  880. {
  881. int ret;
  882. struct kfd_node *node;
  883. int i;
  884. if (!kfd->init_complete)
  885. return 0;
  886. for (i = 0; i < kfd->num_nodes; i++) {
  887. ret = kfd_resume(kfd->nodes[i]);
  888. if (ret)
  889. return ret;
  890. }
  891. mutex_lock(&kfd_processes_mutex);
  892. --kfd_locked;
  893. mutex_unlock(&kfd_processes_mutex);
  894. for (i = 0; i < kfd->num_nodes; i++) {
  895. node = kfd->nodes[i];
  896. atomic_set(&node->sram_ecc_flag, 0);
  897. kfd_smi_event_update_gpu_reset(node, true, NULL);
  898. }
  899. return 0;
  900. }
  901. bool kfd_is_locked(void)
  902. {
  903. lockdep_assert_held(&kfd_processes_mutex);
  904. return (kfd_locked > 0);
  905. }
  906. void kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm)
  907. {
  908. struct kfd_node *node;
  909. int i;
  910. if (!kfd->init_complete)
  911. return;
  912. /* for runtime suspend, skip locking kfd */
  913. if (!run_pm) {
  914. mutex_lock(&kfd_processes_mutex);
  915. /* For first KFD device suspend all the KFD processes */
  916. if (++kfd_locked == 1)
  917. kfd_suspend_all_processes();
  918. mutex_unlock(&kfd_processes_mutex);
  919. }
  920. for (i = 0; i < kfd->num_nodes; i++) {
  921. node = kfd->nodes[i];
  922. node->dqm->ops.stop(node->dqm);
  923. }
  924. }
  925. int kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm)
  926. {
  927. int ret, i;
  928. if (!kfd->init_complete)
  929. return 0;
  930. for (i = 0; i < kfd->num_nodes; i++) {
  931. ret = kfd_resume(kfd->nodes[i]);
  932. if (ret)
  933. return ret;
  934. }
  935. /* for runtime resume, skip unlocking kfd */
  936. if (!run_pm) {
  937. mutex_lock(&kfd_processes_mutex);
  938. if (--kfd_locked == 0)
  939. ret = kfd_resume_all_processes();
  940. WARN_ONCE(kfd_locked < 0, "KFD suspend / resume ref. error");
  941. mutex_unlock(&kfd_processes_mutex);
  942. }
  943. return ret;
  944. }
  945. static int kfd_resume(struct kfd_node *node)
  946. {
  947. int err = 0;
  948. err = node->dqm->ops.start(node->dqm);
  949. if (err)
  950. dev_err(kfd_device,
  951. "Error starting queue manager for device %x:%x\n",
  952. node->adev->pdev->vendor, node->adev->pdev->device);
  953. return err;
  954. }
  955. /* This is called directly from KGD at ISR. */
  956. void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
  957. {
  958. uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE], i;
  959. bool is_patched = false;
  960. unsigned long flags;
  961. struct kfd_node *node;
  962. if (!kfd->init_complete)
  963. return;
  964. if (kfd->device_info.ih_ring_entry_size > sizeof(patched_ihre)) {
  965. dev_err_once(kfd_device, "Ring entry too small\n");
  966. return;
  967. }
  968. for (i = 0; i < kfd->num_nodes; i++) {
  969. node = kfd->nodes[i];
  970. spin_lock_irqsave(&node->interrupt_lock, flags);
  971. if (node->interrupts_active
  972. && interrupt_is_wanted(node, ih_ring_entry,
  973. patched_ihre, &is_patched)
  974. && enqueue_ih_ring_entry(node,
  975. is_patched ? patched_ihre : ih_ring_entry)) {
  976. queue_work(node->kfd->ih_wq, &node->interrupt_work);
  977. spin_unlock_irqrestore(&node->interrupt_lock, flags);
  978. return;
  979. }
  980. spin_unlock_irqrestore(&node->interrupt_lock, flags);
  981. }
  982. }
  983. int kgd2kfd_quiesce_mm(struct mm_struct *mm, uint32_t trigger)
  984. {
  985. struct kfd_process *p;
  986. int r;
  987. /* Because we are called from arbitrary context (workqueue) as opposed
  988. * to process context, kfd_process could attempt to exit while we are
  989. * running so the lookup function increments the process ref count.
  990. */
  991. p = kfd_lookup_process_by_mm(mm);
  992. if (!p)
  993. return -ESRCH;
  994. WARN(debug_evictions, "Evicting pid %d", p->lead_thread->pid);
  995. r = kfd_process_evict_queues(p, trigger);
  996. kfd_unref_process(p);
  997. return r;
  998. }
  999. int kgd2kfd_resume_mm(struct mm_struct *mm)
  1000. {
  1001. struct kfd_process *p;
  1002. int r;
  1003. /* Because we are called from arbitrary context (workqueue) as opposed
  1004. * to process context, kfd_process could attempt to exit while we are
  1005. * running so the lookup function increments the process ref count.
  1006. */
  1007. p = kfd_lookup_process_by_mm(mm);
  1008. if (!p)
  1009. return -ESRCH;
  1010. r = kfd_process_restore_queues(p);
  1011. kfd_unref_process(p);
  1012. return r;
  1013. }
  1014. /** kgd2kfd_schedule_evict_and_restore_process - Schedules work queue that will
  1015. * prepare for safe eviction of KFD BOs that belong to the specified
  1016. * process.
  1017. *
  1018. * @mm: mm_struct that identifies the specified KFD process
  1019. * @fence: eviction fence attached to KFD process BOs
  1020. *
  1021. */
  1022. int kgd2kfd_schedule_evict_and_restore_process(struct mm_struct *mm,
  1023. struct dma_fence *fence)
  1024. {
  1025. struct kfd_process *p;
  1026. unsigned long active_time;
  1027. unsigned long delay_jiffies = msecs_to_jiffies(PROCESS_ACTIVE_TIME_MS);
  1028. if (!fence)
  1029. return -EINVAL;
  1030. if (dma_fence_is_signaled(fence))
  1031. return 0;
  1032. p = kfd_lookup_process_by_mm(mm);
  1033. if (!p)
  1034. return -ENODEV;
  1035. if (fence->seqno == p->last_eviction_seqno)
  1036. goto out;
  1037. p->last_eviction_seqno = fence->seqno;
  1038. /* Avoid KFD process starvation. Wait for at least
  1039. * PROCESS_ACTIVE_TIME_MS before evicting the process again
  1040. */
  1041. active_time = get_jiffies_64() - p->last_restore_timestamp;
  1042. if (delay_jiffies > active_time)
  1043. delay_jiffies -= active_time;
  1044. else
  1045. delay_jiffies = 0;
  1046. /* During process initialization eviction_work.dwork is initialized
  1047. * to kfd_evict_bo_worker
  1048. */
  1049. WARN(debug_evictions, "Scheduling eviction of pid %d in %ld jiffies",
  1050. p->lead_thread->pid, delay_jiffies);
  1051. schedule_delayed_work(&p->eviction_work, delay_jiffies);
  1052. out:
  1053. kfd_unref_process(p);
  1054. return 0;
  1055. }
  1056. static int kfd_gtt_sa_init(struct kfd_dev *kfd, unsigned int buf_size,
  1057. unsigned int chunk_size)
  1058. {
  1059. if (WARN_ON(buf_size < chunk_size))
  1060. return -EINVAL;
  1061. if (WARN_ON(buf_size == 0))
  1062. return -EINVAL;
  1063. if (WARN_ON(chunk_size == 0))
  1064. return -EINVAL;
  1065. kfd->gtt_sa_chunk_size = chunk_size;
  1066. kfd->gtt_sa_num_of_chunks = buf_size / chunk_size;
  1067. kfd->gtt_sa_bitmap = bitmap_zalloc(kfd->gtt_sa_num_of_chunks,
  1068. GFP_KERNEL);
  1069. if (!kfd->gtt_sa_bitmap)
  1070. return -ENOMEM;
  1071. pr_debug("gtt_sa_num_of_chunks = %d, gtt_sa_bitmap = %p\n",
  1072. kfd->gtt_sa_num_of_chunks, kfd->gtt_sa_bitmap);
  1073. mutex_init(&kfd->gtt_sa_lock);
  1074. return 0;
  1075. }
  1076. static void kfd_gtt_sa_fini(struct kfd_dev *kfd)
  1077. {
  1078. mutex_destroy(&kfd->gtt_sa_lock);
  1079. bitmap_free(kfd->gtt_sa_bitmap);
  1080. }
  1081. static inline uint64_t kfd_gtt_sa_calc_gpu_addr(uint64_t start_addr,
  1082. unsigned int bit_num,
  1083. unsigned int chunk_size)
  1084. {
  1085. return start_addr + bit_num * chunk_size;
  1086. }
  1087. static inline uint32_t *kfd_gtt_sa_calc_cpu_addr(void *start_addr,
  1088. unsigned int bit_num,
  1089. unsigned int chunk_size)
  1090. {
  1091. return (uint32_t *) ((uint64_t) start_addr + bit_num * chunk_size);
  1092. }
  1093. int kfd_gtt_sa_allocate(struct kfd_node *node, unsigned int size,
  1094. struct kfd_mem_obj **mem_obj)
  1095. {
  1096. unsigned int found, start_search, cur_size;
  1097. struct kfd_dev *kfd = node->kfd;
  1098. if (size == 0)
  1099. return -EINVAL;
  1100. if (size > kfd->gtt_sa_num_of_chunks * kfd->gtt_sa_chunk_size)
  1101. return -ENOMEM;
  1102. *mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);
  1103. if (!(*mem_obj))
  1104. return -ENOMEM;
  1105. pr_debug("Allocated mem_obj = %p for size = %d\n", *mem_obj, size);
  1106. start_search = 0;
  1107. mutex_lock(&kfd->gtt_sa_lock);
  1108. kfd_gtt_restart_search:
  1109. /* Find the first chunk that is free */
  1110. found = find_next_zero_bit(kfd->gtt_sa_bitmap,
  1111. kfd->gtt_sa_num_of_chunks,
  1112. start_search);
  1113. pr_debug("Found = %d\n", found);
  1114. /* If there wasn't any free chunk, bail out */
  1115. if (found == kfd->gtt_sa_num_of_chunks)
  1116. goto kfd_gtt_no_free_chunk;
  1117. /* Update fields of mem_obj */
  1118. (*mem_obj)->range_start = found;
  1119. (*mem_obj)->range_end = found;
  1120. (*mem_obj)->gpu_addr = kfd_gtt_sa_calc_gpu_addr(
  1121. kfd->gtt_start_gpu_addr,
  1122. found,
  1123. kfd->gtt_sa_chunk_size);
  1124. (*mem_obj)->cpu_ptr = kfd_gtt_sa_calc_cpu_addr(
  1125. kfd->gtt_start_cpu_ptr,
  1126. found,
  1127. kfd->gtt_sa_chunk_size);
  1128. pr_debug("gpu_addr = %p, cpu_addr = %p\n",
  1129. (uint64_t *) (*mem_obj)->gpu_addr, (*mem_obj)->cpu_ptr);
  1130. /* If we need only one chunk, mark it as allocated and get out */
  1131. if (size <= kfd->gtt_sa_chunk_size) {
  1132. pr_debug("Single bit\n");
  1133. __set_bit(found, kfd->gtt_sa_bitmap);
  1134. goto kfd_gtt_out;
  1135. }
  1136. /* Otherwise, try to see if we have enough contiguous chunks */
  1137. cur_size = size - kfd->gtt_sa_chunk_size;
  1138. do {
  1139. (*mem_obj)->range_end =
  1140. find_next_zero_bit(kfd->gtt_sa_bitmap,
  1141. kfd->gtt_sa_num_of_chunks, ++found);
  1142. /*
  1143. * If next free chunk is not contiguous than we need to
  1144. * restart our search from the last free chunk we found (which
  1145. * wasn't contiguous to the previous ones
  1146. */
  1147. if ((*mem_obj)->range_end != found) {
  1148. start_search = found;
  1149. goto kfd_gtt_restart_search;
  1150. }
  1151. /*
  1152. * If we reached end of buffer, bail out with error
  1153. */
  1154. if (found == kfd->gtt_sa_num_of_chunks)
  1155. goto kfd_gtt_no_free_chunk;
  1156. /* Check if we don't need another chunk */
  1157. if (cur_size <= kfd->gtt_sa_chunk_size)
  1158. cur_size = 0;
  1159. else
  1160. cur_size -= kfd->gtt_sa_chunk_size;
  1161. } while (cur_size > 0);
  1162. pr_debug("range_start = %d, range_end = %d\n",
  1163. (*mem_obj)->range_start, (*mem_obj)->range_end);
  1164. /* Mark the chunks as allocated */
  1165. bitmap_set(kfd->gtt_sa_bitmap, (*mem_obj)->range_start,
  1166. (*mem_obj)->range_end - (*mem_obj)->range_start + 1);
  1167. kfd_gtt_out:
  1168. mutex_unlock(&kfd->gtt_sa_lock);
  1169. return 0;
  1170. kfd_gtt_no_free_chunk:
  1171. pr_debug("Allocation failed with mem_obj = %p\n", *mem_obj);
  1172. mutex_unlock(&kfd->gtt_sa_lock);
  1173. kfree(*mem_obj);
  1174. return -ENOMEM;
  1175. }
  1176. int kfd_gtt_sa_free(struct kfd_node *node, struct kfd_mem_obj *mem_obj)
  1177. {
  1178. struct kfd_dev *kfd = node->kfd;
  1179. /* Act like kfree when trying to free a NULL object */
  1180. if (!mem_obj)
  1181. return 0;
  1182. pr_debug("Free mem_obj = %p, range_start = %d, range_end = %d\n",
  1183. mem_obj, mem_obj->range_start, mem_obj->range_end);
  1184. mutex_lock(&kfd->gtt_sa_lock);
  1185. /* Mark the chunks as free */
  1186. bitmap_clear(kfd->gtt_sa_bitmap, mem_obj->range_start,
  1187. mem_obj->range_end - mem_obj->range_start + 1);
  1188. mutex_unlock(&kfd->gtt_sa_lock);
  1189. kfree(mem_obj);
  1190. return 0;
  1191. }
  1192. void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)
  1193. {
  1194. /*
  1195. * TODO: Currently update SRAM ECC flag for first node.
  1196. * This needs to be updated later when we can
  1197. * identify SRAM ECC error on other nodes also.
  1198. */
  1199. if (kfd)
  1200. atomic_inc(&kfd->nodes[0]->sram_ecc_flag);
  1201. }
  1202. void kfd_inc_compute_active(struct kfd_node *node)
  1203. {
  1204. if (atomic_inc_return(&node->kfd->compute_profile) == 1)
  1205. amdgpu_amdkfd_set_compute_idle(node->adev, false);
  1206. }
  1207. void kfd_dec_compute_active(struct kfd_node *node)
  1208. {
  1209. int count = atomic_dec_return(&node->kfd->compute_profile);
  1210. if (count == 0)
  1211. amdgpu_amdkfd_set_compute_idle(node->adev, true);
  1212. WARN_ONCE(count < 0, "Compute profile ref. count error");
  1213. }
  1214. void kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)
  1215. {
  1216. /*
  1217. * TODO: For now, raise the throttling event only on first node.
  1218. * This will need to change after we are able to determine
  1219. * which node raised the throttling event.
  1220. */
  1221. if (kfd && kfd->init_complete)
  1222. kfd_smi_event_update_thermal_throttling(kfd->nodes[0],
  1223. throttle_bitmask);
  1224. }
  1225. /* kfd_get_num_sdma_engines returns the number of PCIe optimized SDMA and
  1226. * kfd_get_num_xgmi_sdma_engines returns the number of XGMI SDMA.
  1227. * When the device has more than two engines, we reserve two for PCIe to enable
  1228. * full-duplex and the rest are used as XGMI.
  1229. */
  1230. unsigned int kfd_get_num_sdma_engines(struct kfd_node *node)
  1231. {
  1232. /* If XGMI is not supported, all SDMA engines are PCIe */
  1233. if (!node->adev->gmc.xgmi.supported)
  1234. return node->adev->sdma.num_instances/(int)node->kfd->num_nodes;
  1235. return min(node->adev->sdma.num_instances/(int)node->kfd->num_nodes, 2);
  1236. }
  1237. unsigned int kfd_get_num_xgmi_sdma_engines(struct kfd_node *node)
  1238. {
  1239. /* After reserved for PCIe, the rest of engines are XGMI */
  1240. return node->adev->sdma.num_instances/(int)node->kfd->num_nodes -
  1241. kfd_get_num_sdma_engines(node);
  1242. }
  1243. int kgd2kfd_check_and_lock_kfd(void)
  1244. {
  1245. mutex_lock(&kfd_processes_mutex);
  1246. if (!hash_empty(kfd_processes_table) || kfd_is_locked()) {
  1247. mutex_unlock(&kfd_processes_mutex);
  1248. return -EBUSY;
  1249. }
  1250. ++kfd_locked;
  1251. mutex_unlock(&kfd_processes_mutex);
  1252. return 0;
  1253. }
  1254. void kgd2kfd_unlock_kfd(void)
  1255. {
  1256. mutex_lock(&kfd_processes_mutex);
  1257. --kfd_locked;
  1258. mutex_unlock(&kfd_processes_mutex);
  1259. }
  1260. int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id)
  1261. {
  1262. struct kfd_node *node;
  1263. int ret;
  1264. if (!kfd->init_complete)
  1265. return 0;
  1266. if (node_id >= kfd->num_nodes) {
  1267. dev_warn(kfd->adev->dev, "Invalid node ID: %u exceeds %u\n",
  1268. node_id, kfd->num_nodes - 1);
  1269. return -EINVAL;
  1270. }
  1271. node = kfd->nodes[node_id];
  1272. ret = node->dqm->ops.unhalt(node->dqm);
  1273. if (ret)
  1274. dev_err(kfd_device, "Error in starting scheduler\n");
  1275. return ret;
  1276. }
  1277. int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
  1278. {
  1279. struct kfd_node *node;
  1280. if (!kfd->init_complete)
  1281. return 0;
  1282. if (node_id >= kfd->num_nodes) {
  1283. dev_warn(kfd->adev->dev, "Invalid node ID: %u exceeds %u\n",
  1284. node_id, kfd->num_nodes - 1);
  1285. return -EINVAL;
  1286. }
  1287. node = kfd->nodes[node_id];
  1288. return node->dqm->ops.halt(node->dqm);
  1289. }
  1290. #if defined(CONFIG_DEBUG_FS)
  1291. /* This function will send a package to HIQ to hang the HWS
  1292. * which will trigger a GPU reset and bring the HWS back to normal state
  1293. */
  1294. int kfd_debugfs_hang_hws(struct kfd_node *dev)
  1295. {
  1296. if (dev->dqm->sched_policy != KFD_SCHED_POLICY_HWS) {
  1297. pr_err("HWS is not enabled");
  1298. return -EINVAL;
  1299. }
  1300. if (dev->kfd->shared_resources.enable_mes) {
  1301. dev_err(dev->adev->dev, "Inducing MES hang is not supported\n");
  1302. return -EINVAL;
  1303. }
  1304. return dqm_debugfs_hang_hws(dev->dqm);
  1305. }
  1306. #endif