aie2_pci.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2023-2024, Advanced Micro Devices, Inc.
  4. */
  5. #include <drm/amdxdna_accel.h>
  6. #include <drm/drm_device.h>
  7. #include <drm/drm_drv.h>
  8. #include <drm/drm_gem_shmem_helper.h>
  9. #include <drm/drm_managed.h>
  10. #include <drm/drm_print.h>
  11. #include <drm/gpu_scheduler.h>
  12. #include <linux/cleanup.h>
  13. #include <linux/errno.h>
  14. #include <linux/firmware.h>
  15. #include <linux/iommu.h>
  16. #include <linux/iopoll.h>
  17. #include <linux/pci.h>
  18. #include <linux/xarray.h>
  19. #include <asm/hypervisor.h>
  20. #include "aie2_msg_priv.h"
  21. #include "aie2_pci.h"
  22. #include "aie2_solver.h"
  23. #include "amdxdna_ctx.h"
  24. #include "amdxdna_gem.h"
  25. #include "amdxdna_mailbox.h"
  26. #include "amdxdna_pci_drv.h"
  27. #include "amdxdna_pm.h"
  28. static int aie2_max_col = XRS_MAX_COL;
  29. module_param(aie2_max_col, uint, 0600);
  30. MODULE_PARM_DESC(aie2_max_col, "Maximum column could be used");
  31. static char *npu_fw[] = {
  32. "npu_7.sbin",
  33. "npu.sbin"
  34. };
  35. /*
  36. * The management mailbox channel is allocated by firmware.
  37. * The related register and ring buffer information is on SRAM BAR.
  38. * This struct is the register layout.
  39. */
  40. #define MGMT_MBOX_MAGIC 0x55504e5f /* _NPU */
  41. struct mgmt_mbox_chann_info {
  42. __u32 x2i_tail;
  43. __u32 x2i_head;
  44. __u32 x2i_buf;
  45. __u32 x2i_buf_sz;
  46. __u32 i2x_tail;
  47. __u32 i2x_head;
  48. __u32 i2x_buf;
  49. __u32 i2x_buf_sz;
  50. __u32 magic;
  51. __u32 msi_id;
  52. __u32 prot_major;
  53. __u32 prot_minor;
  54. __u32 rsvd[4];
  55. };
  56. static int aie2_check_protocol(struct amdxdna_dev_hdl *ndev, u32 fw_major, u32 fw_minor)
  57. {
  58. const struct aie2_fw_feature_tbl *feature;
  59. bool found = false;
  60. for (feature = ndev->priv->fw_feature_tbl; feature->major; feature++) {
  61. if (feature->major != fw_major)
  62. continue;
  63. if (fw_minor < feature->min_minor)
  64. continue;
  65. if (feature->max_minor > 0 && fw_minor > feature->max_minor)
  66. continue;
  67. ndev->feature_mask |= feature->features;
  68. /* firmware version matches one of the driver support entry */
  69. found = true;
  70. }
  71. return found ? 0 : -EOPNOTSUPP;
  72. }
  73. static void aie2_dump_chann_info_debug(struct amdxdna_dev_hdl *ndev)
  74. {
  75. struct amdxdna_dev *xdna = ndev->xdna;
  76. XDNA_DBG(xdna, "i2x tail 0x%x", ndev->mgmt_i2x.mb_tail_ptr_reg);
  77. XDNA_DBG(xdna, "i2x head 0x%x", ndev->mgmt_i2x.mb_head_ptr_reg);
  78. XDNA_DBG(xdna, "i2x ringbuf 0x%x", ndev->mgmt_i2x.rb_start_addr);
  79. XDNA_DBG(xdna, "i2x rsize 0x%x", ndev->mgmt_i2x.rb_size);
  80. XDNA_DBG(xdna, "x2i tail 0x%x", ndev->mgmt_x2i.mb_tail_ptr_reg);
  81. XDNA_DBG(xdna, "x2i head 0x%x", ndev->mgmt_x2i.mb_head_ptr_reg);
  82. XDNA_DBG(xdna, "x2i ringbuf 0x%x", ndev->mgmt_x2i.rb_start_addr);
  83. XDNA_DBG(xdna, "x2i rsize 0x%x", ndev->mgmt_x2i.rb_size);
  84. XDNA_DBG(xdna, "x2i chann index 0x%x", ndev->mgmt_chan_idx);
  85. XDNA_DBG(xdna, "mailbox protocol major 0x%x", ndev->mgmt_prot_major);
  86. XDNA_DBG(xdna, "mailbox protocol minor 0x%x", ndev->mgmt_prot_minor);
  87. }
  88. static int aie2_get_mgmt_chann_info(struct amdxdna_dev_hdl *ndev)
  89. {
  90. struct mgmt_mbox_chann_info info_regs;
  91. struct xdna_mailbox_chann_res *i2x;
  92. struct xdna_mailbox_chann_res *x2i;
  93. u32 addr, off;
  94. u32 *reg;
  95. int ret;
  96. int i;
  97. /*
  98. * Once firmware is alive, it will write management channel
  99. * information in SRAM BAR and write the address of that information
  100. * at FW_ALIVE_OFF offset in SRMA BAR.
  101. *
  102. * Read a non-zero value from FW_ALIVE_OFF implies that firmware
  103. * is alive.
  104. */
  105. ret = readx_poll_timeout(readl, SRAM_GET_ADDR(ndev, FW_ALIVE_OFF),
  106. addr, addr, AIE2_INTERVAL, AIE2_TIMEOUT);
  107. if (ret || !addr)
  108. return -ETIME;
  109. off = AIE2_SRAM_OFF(ndev, addr);
  110. reg = (u32 *)&info_regs;
  111. for (i = 0; i < sizeof(info_regs) / sizeof(u32); i++)
  112. reg[i] = readl(ndev->sram_base + off + i * sizeof(u32));
  113. if (info_regs.magic != MGMT_MBOX_MAGIC) {
  114. XDNA_ERR(ndev->xdna, "Invalid mbox magic 0x%x", info_regs.magic);
  115. ret = -EINVAL;
  116. goto done;
  117. }
  118. i2x = &ndev->mgmt_i2x;
  119. x2i = &ndev->mgmt_x2i;
  120. i2x->mb_head_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.i2x_head);
  121. i2x->mb_tail_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.i2x_tail);
  122. i2x->rb_start_addr = AIE2_SRAM_OFF(ndev, info_regs.i2x_buf);
  123. i2x->rb_size = info_regs.i2x_buf_sz;
  124. x2i->mb_head_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.x2i_head);
  125. x2i->mb_tail_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.x2i_tail);
  126. x2i->rb_start_addr = AIE2_SRAM_OFF(ndev, info_regs.x2i_buf);
  127. x2i->rb_size = info_regs.x2i_buf_sz;
  128. ndev->mgmt_chan_idx = info_regs.msi_id;
  129. ndev->mgmt_prot_major = info_regs.prot_major;
  130. ndev->mgmt_prot_minor = info_regs.prot_minor;
  131. ret = aie2_check_protocol(ndev, ndev->mgmt_prot_major, ndev->mgmt_prot_minor);
  132. done:
  133. aie2_dump_chann_info_debug(ndev);
  134. /* Must clear address at FW_ALIVE_OFF */
  135. writel(0, SRAM_GET_ADDR(ndev, FW_ALIVE_OFF));
  136. return ret;
  137. }
  138. int aie2_runtime_cfg(struct amdxdna_dev_hdl *ndev,
  139. enum rt_config_category category, u32 *val)
  140. {
  141. const struct rt_config *cfg;
  142. u32 value;
  143. int ret;
  144. for (cfg = ndev->priv->rt_config; cfg->type; cfg++) {
  145. if (cfg->category != category)
  146. continue;
  147. if (cfg->feature_mask &&
  148. bitmap_subset(&cfg->feature_mask, &ndev->feature_mask, AIE2_FEATURE_MAX))
  149. continue;
  150. value = val ? *val : cfg->value;
  151. ret = aie2_set_runtime_cfg(ndev, cfg->type, value);
  152. if (ret) {
  153. XDNA_ERR(ndev->xdna, "Set type %d value %d failed",
  154. cfg->type, value);
  155. return ret;
  156. }
  157. }
  158. return 0;
  159. }
  160. static int aie2_xdna_reset(struct amdxdna_dev_hdl *ndev)
  161. {
  162. int ret;
  163. ret = aie2_suspend_fw(ndev);
  164. if (ret) {
  165. XDNA_ERR(ndev->xdna, "Suspend firmware failed");
  166. return ret;
  167. }
  168. ret = aie2_resume_fw(ndev);
  169. if (ret) {
  170. XDNA_ERR(ndev->xdna, "Resume firmware failed");
  171. return ret;
  172. }
  173. return 0;
  174. }
  175. static int aie2_mgmt_fw_init(struct amdxdna_dev_hdl *ndev)
  176. {
  177. int ret;
  178. ret = aie2_runtime_cfg(ndev, AIE2_RT_CFG_INIT, NULL);
  179. if (ret) {
  180. XDNA_ERR(ndev->xdna, "Runtime config failed");
  181. return ret;
  182. }
  183. ret = aie2_assign_mgmt_pasid(ndev, 0);
  184. if (ret) {
  185. XDNA_ERR(ndev->xdna, "Can not assign PASID");
  186. return ret;
  187. }
  188. ret = aie2_xdna_reset(ndev);
  189. if (ret) {
  190. XDNA_ERR(ndev->xdna, "Reset firmware failed");
  191. return ret;
  192. }
  193. return 0;
  194. }
  195. static int aie2_mgmt_fw_query(struct amdxdna_dev_hdl *ndev)
  196. {
  197. int ret;
  198. ret = aie2_query_firmware_version(ndev, &ndev->xdna->fw_ver);
  199. if (ret) {
  200. XDNA_ERR(ndev->xdna, "query firmware version failed");
  201. return ret;
  202. }
  203. ret = aie2_query_aie_version(ndev, &ndev->version);
  204. if (ret) {
  205. XDNA_ERR(ndev->xdna, "Query AIE version failed");
  206. return ret;
  207. }
  208. ret = aie2_query_aie_metadata(ndev, &ndev->metadata);
  209. if (ret) {
  210. XDNA_ERR(ndev->xdna, "Query AIE metadata failed");
  211. return ret;
  212. }
  213. ndev->total_col = min(aie2_max_col, ndev->metadata.cols);
  214. return 0;
  215. }
  216. static void aie2_mgmt_fw_fini(struct amdxdna_dev_hdl *ndev)
  217. {
  218. if (aie2_suspend_fw(ndev))
  219. XDNA_ERR(ndev->xdna, "Suspend_fw failed");
  220. XDNA_DBG(ndev->xdna, "Firmware suspended");
  221. }
  222. static int aie2_xrs_load(void *cb_arg, struct xrs_action_load *action)
  223. {
  224. struct amdxdna_hwctx *hwctx = cb_arg;
  225. struct amdxdna_dev *xdna;
  226. int ret;
  227. xdna = hwctx->client->xdna;
  228. hwctx->start_col = action->part.start_col;
  229. hwctx->num_col = action->part.ncols;
  230. ret = aie2_create_context(xdna->dev_handle, hwctx);
  231. if (ret)
  232. XDNA_ERR(xdna, "create context failed, ret %d", ret);
  233. return ret;
  234. }
  235. static int aie2_xrs_unload(void *cb_arg)
  236. {
  237. struct amdxdna_hwctx *hwctx = cb_arg;
  238. struct amdxdna_dev *xdna;
  239. int ret;
  240. xdna = hwctx->client->xdna;
  241. ret = aie2_destroy_context(xdna->dev_handle, hwctx);
  242. if (ret)
  243. XDNA_ERR(xdna, "destroy context failed, ret %d", ret);
  244. return ret;
  245. }
  246. static int aie2_xrs_set_dft_dpm_level(struct drm_device *ddev, u32 dpm_level)
  247. {
  248. struct amdxdna_dev *xdna = to_xdna_dev(ddev);
  249. struct amdxdna_dev_hdl *ndev;
  250. drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
  251. ndev = xdna->dev_handle;
  252. ndev->dft_dpm_level = dpm_level;
  253. if (ndev->pw_mode != POWER_MODE_DEFAULT || ndev->dpm_level == dpm_level)
  254. return 0;
  255. return aie2_pm_set_dpm(ndev, dpm_level);
  256. }
  257. static struct xrs_action_ops aie2_xrs_actions = {
  258. .load = aie2_xrs_load,
  259. .unload = aie2_xrs_unload,
  260. .set_dft_dpm_level = aie2_xrs_set_dft_dpm_level,
  261. };
  262. static void aie2_hw_stop(struct amdxdna_dev *xdna)
  263. {
  264. struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
  265. struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
  266. if (ndev->dev_status <= AIE2_DEV_INIT) {
  267. XDNA_ERR(xdna, "device is already stopped");
  268. return;
  269. }
  270. aie2_runtime_cfg(ndev, AIE2_RT_CFG_CLK_GATING, NULL);
  271. aie2_mgmt_fw_fini(ndev);
  272. aie2_destroy_mgmt_chann(ndev);
  273. drmm_kfree(&xdna->ddev, ndev->mbox);
  274. ndev->mbox = NULL;
  275. aie2_psp_stop(ndev->psp_hdl);
  276. aie2_smu_fini(ndev);
  277. aie2_error_async_events_free(ndev);
  278. pci_disable_device(pdev);
  279. ndev->dev_status = AIE2_DEV_INIT;
  280. }
  281. static int aie2_hw_start(struct amdxdna_dev *xdna)
  282. {
  283. struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
  284. struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
  285. struct xdna_mailbox_res mbox_res;
  286. u32 xdna_mailbox_intr_reg;
  287. int mgmt_mb_irq, ret;
  288. if (ndev->dev_status >= AIE2_DEV_START) {
  289. XDNA_INFO(xdna, "device is already started");
  290. return 0;
  291. }
  292. ret = pci_enable_device(pdev);
  293. if (ret) {
  294. XDNA_ERR(xdna, "failed to enable device, ret %d", ret);
  295. return ret;
  296. }
  297. pci_set_master(pdev);
  298. mbox_res.ringbuf_base = ndev->sram_base;
  299. mbox_res.ringbuf_size = pci_resource_len(pdev, xdna->dev_info->sram_bar);
  300. mbox_res.mbox_base = ndev->mbox_base;
  301. mbox_res.mbox_size = MBOX_SIZE(ndev);
  302. mbox_res.name = "xdna_mailbox";
  303. ndev->mbox = xdnam_mailbox_create(&xdna->ddev, &mbox_res);
  304. if (!ndev->mbox) {
  305. XDNA_ERR(xdna, "failed to create mailbox device");
  306. ret = -ENODEV;
  307. goto disable_dev;
  308. }
  309. ndev->mgmt_chann = xdna_mailbox_alloc_channel(ndev->mbox);
  310. if (!ndev->mgmt_chann) {
  311. XDNA_ERR(xdna, "failed to alloc channel");
  312. ret = -ENODEV;
  313. goto disable_dev;
  314. }
  315. ret = aie2_smu_init(ndev);
  316. if (ret) {
  317. XDNA_ERR(xdna, "failed to init smu, ret %d", ret);
  318. goto free_channel;
  319. }
  320. ret = aie2_psp_start(ndev->psp_hdl);
  321. if (ret) {
  322. XDNA_ERR(xdna, "failed to start psp, ret %d", ret);
  323. goto fini_smu;
  324. }
  325. ret = aie2_get_mgmt_chann_info(ndev);
  326. if (ret) {
  327. XDNA_ERR(xdna, "firmware is not alive");
  328. goto stop_psp;
  329. }
  330. mgmt_mb_irq = pci_irq_vector(pdev, ndev->mgmt_chan_idx);
  331. if (mgmt_mb_irq < 0) {
  332. ret = mgmt_mb_irq;
  333. XDNA_ERR(xdna, "failed to alloc irq vector, ret %d", ret);
  334. goto stop_psp;
  335. }
  336. xdna_mailbox_intr_reg = ndev->mgmt_i2x.mb_head_ptr_reg + 4;
  337. ret = xdna_mailbox_start_channel(ndev->mgmt_chann,
  338. &ndev->mgmt_x2i,
  339. &ndev->mgmt_i2x,
  340. xdna_mailbox_intr_reg,
  341. mgmt_mb_irq);
  342. if (ret) {
  343. XDNA_ERR(xdna, "failed to start management mailbox channel");
  344. ret = -EINVAL;
  345. goto stop_psp;
  346. }
  347. ret = aie2_mgmt_fw_init(ndev);
  348. if (ret) {
  349. XDNA_ERR(xdna, "initial mgmt firmware failed, ret %d", ret);
  350. goto stop_fw;
  351. }
  352. ret = aie2_pm_init(ndev);
  353. if (ret) {
  354. XDNA_ERR(xdna, "failed to init pm, ret %d", ret);
  355. goto stop_fw;
  356. }
  357. ret = aie2_mgmt_fw_query(ndev);
  358. if (ret) {
  359. XDNA_ERR(xdna, "failed to query fw, ret %d", ret);
  360. goto stop_fw;
  361. }
  362. ret = aie2_error_async_events_alloc(ndev);
  363. if (ret) {
  364. XDNA_ERR(xdna, "Allocate async events failed, ret %d", ret);
  365. goto stop_fw;
  366. }
  367. ndev->dev_status = AIE2_DEV_START;
  368. return 0;
  369. stop_fw:
  370. aie2_suspend_fw(ndev);
  371. xdna_mailbox_stop_channel(ndev->mgmt_chann);
  372. stop_psp:
  373. aie2_psp_stop(ndev->psp_hdl);
  374. fini_smu:
  375. aie2_smu_fini(ndev);
  376. free_channel:
  377. xdna_mailbox_free_channel(ndev->mgmt_chann);
  378. ndev->mgmt_chann = NULL;
  379. disable_dev:
  380. pci_disable_device(pdev);
  381. return ret;
  382. }
  383. static int aie2_hw_suspend(struct amdxdna_dev *xdna)
  384. {
  385. struct amdxdna_client *client;
  386. list_for_each_entry(client, &xdna->client_list, node)
  387. aie2_hwctx_suspend(client);
  388. aie2_hw_stop(xdna);
  389. return 0;
  390. }
  391. static int aie2_hw_resume(struct amdxdna_dev *xdna)
  392. {
  393. struct amdxdna_client *client;
  394. int ret;
  395. ret = aie2_hw_start(xdna);
  396. if (ret) {
  397. XDNA_ERR(xdna, "Start hardware failed, %d", ret);
  398. return ret;
  399. }
  400. list_for_each_entry(client, &xdna->client_list, node) {
  401. ret = aie2_hwctx_resume(client);
  402. if (ret)
  403. break;
  404. }
  405. return ret;
  406. }
  407. static int aie2_init(struct amdxdna_dev *xdna)
  408. {
  409. struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
  410. void __iomem *tbl[PCI_NUM_RESOURCES] = {0};
  411. struct init_config xrs_cfg = { 0 };
  412. struct amdxdna_dev_hdl *ndev;
  413. struct psp_config psp_conf;
  414. const struct firmware *fw;
  415. unsigned long bars = 0;
  416. char *fw_full_path;
  417. int i, nvec, ret;
  418. if (!hypervisor_is_type(X86_HYPER_NATIVE)) {
  419. XDNA_ERR(xdna, "Running under hypervisor not supported");
  420. return -EINVAL;
  421. }
  422. ndev = drmm_kzalloc(&xdna->ddev, sizeof(*ndev), GFP_KERNEL);
  423. if (!ndev)
  424. return -ENOMEM;
  425. ndev->priv = xdna->dev_info->dev_priv;
  426. ndev->xdna = xdna;
  427. for (i = 0; i < ARRAY_SIZE(npu_fw); i++) {
  428. fw_full_path = kasprintf(GFP_KERNEL, "%s%s", ndev->priv->fw_path, npu_fw[i]);
  429. if (!fw_full_path)
  430. return -ENOMEM;
  431. ret = firmware_request_nowarn(&fw, fw_full_path, &pdev->dev);
  432. kfree(fw_full_path);
  433. if (!ret) {
  434. XDNA_INFO(xdna, "Load firmware %s%s", ndev->priv->fw_path, npu_fw[i]);
  435. break;
  436. }
  437. }
  438. if (ret) {
  439. XDNA_ERR(xdna, "failed to request_firmware %s, ret %d",
  440. ndev->priv->fw_path, ret);
  441. return ret;
  442. }
  443. ret = pcim_enable_device(pdev);
  444. if (ret) {
  445. XDNA_ERR(xdna, "pcim enable device failed, ret %d", ret);
  446. goto release_fw;
  447. }
  448. for (i = 0; i < PSP_MAX_REGS; i++)
  449. set_bit(PSP_REG_BAR(ndev, i), &bars);
  450. set_bit(xdna->dev_info->sram_bar, &bars);
  451. set_bit(xdna->dev_info->smu_bar, &bars);
  452. set_bit(xdna->dev_info->mbox_bar, &bars);
  453. for (i = 0; i < PCI_NUM_RESOURCES; i++) {
  454. if (!test_bit(i, &bars))
  455. continue;
  456. tbl[i] = pcim_iomap(pdev, i, 0);
  457. if (!tbl[i]) {
  458. XDNA_ERR(xdna, "map bar %d failed", i);
  459. ret = -ENOMEM;
  460. goto release_fw;
  461. }
  462. }
  463. ndev->sram_base = tbl[xdna->dev_info->sram_bar];
  464. ndev->smu_base = tbl[xdna->dev_info->smu_bar];
  465. ndev->mbox_base = tbl[xdna->dev_info->mbox_bar];
  466. ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
  467. if (ret) {
  468. XDNA_ERR(xdna, "Failed to set DMA mask: %d", ret);
  469. goto release_fw;
  470. }
  471. nvec = pci_msix_vec_count(pdev);
  472. if (nvec <= 0) {
  473. XDNA_ERR(xdna, "does not get number of interrupt vector");
  474. ret = -EINVAL;
  475. goto release_fw;
  476. }
  477. ret = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_MSIX);
  478. if (ret < 0) {
  479. XDNA_ERR(xdna, "failed to alloc irq vectors, ret %d", ret);
  480. goto release_fw;
  481. }
  482. psp_conf.fw_size = fw->size;
  483. psp_conf.fw_buf = fw->data;
  484. for (i = 0; i < PSP_MAX_REGS; i++)
  485. psp_conf.psp_regs[i] = tbl[PSP_REG_BAR(ndev, i)] + PSP_REG_OFF(ndev, i);
  486. ndev->psp_hdl = aie2m_psp_create(&xdna->ddev, &psp_conf);
  487. if (!ndev->psp_hdl) {
  488. XDNA_ERR(xdna, "failed to create psp");
  489. ret = -ENOMEM;
  490. goto release_fw;
  491. }
  492. xdna->dev_handle = ndev;
  493. ret = aie2_hw_start(xdna);
  494. if (ret) {
  495. XDNA_ERR(xdna, "start npu failed, ret %d", ret);
  496. goto release_fw;
  497. }
  498. xrs_cfg.clk_list.num_levels = ndev->max_dpm_level + 1;
  499. for (i = 0; i < xrs_cfg.clk_list.num_levels; i++)
  500. xrs_cfg.clk_list.cu_clk_list[i] = ndev->priv->dpm_clk_tbl[i].hclk;
  501. xrs_cfg.sys_eff_factor = 1;
  502. xrs_cfg.ddev = &xdna->ddev;
  503. xrs_cfg.actions = &aie2_xrs_actions;
  504. xrs_cfg.total_col = ndev->total_col;
  505. xdna->xrs_hdl = xrsm_init(&xrs_cfg);
  506. if (!xdna->xrs_hdl) {
  507. XDNA_ERR(xdna, "Initialize resolver failed");
  508. ret = -EINVAL;
  509. goto stop_hw;
  510. }
  511. release_firmware(fw);
  512. aie2_msg_init(ndev);
  513. amdxdna_pm_init(xdna);
  514. return 0;
  515. stop_hw:
  516. aie2_hw_stop(xdna);
  517. release_fw:
  518. release_firmware(fw);
  519. return ret;
  520. }
  521. static void aie2_fini(struct amdxdna_dev *xdna)
  522. {
  523. amdxdna_pm_fini(xdna);
  524. aie2_hw_stop(xdna);
  525. }
  526. static int aie2_get_aie_status(struct amdxdna_client *client,
  527. struct amdxdna_drm_get_info *args)
  528. {
  529. struct amdxdna_drm_query_aie_status status;
  530. struct amdxdna_dev *xdna = client->xdna;
  531. struct amdxdna_dev_hdl *ndev;
  532. int ret;
  533. ndev = xdna->dev_handle;
  534. if (copy_from_user(&status, u64_to_user_ptr(args->buffer), sizeof(status))) {
  535. XDNA_ERR(xdna, "Failed to copy AIE request into kernel");
  536. return -EFAULT;
  537. }
  538. if (ndev->metadata.cols * ndev->metadata.size < status.buffer_size) {
  539. XDNA_ERR(xdna, "Invalid buffer size. Given Size: %u. Need Size: %u.",
  540. status.buffer_size, ndev->metadata.cols * ndev->metadata.size);
  541. return -EINVAL;
  542. }
  543. ret = aie2_query_status(ndev, u64_to_user_ptr(status.buffer),
  544. status.buffer_size, &status.cols_filled);
  545. if (ret) {
  546. XDNA_ERR(xdna, "Failed to get AIE status info. Ret: %d", ret);
  547. return ret;
  548. }
  549. if (copy_to_user(u64_to_user_ptr(args->buffer), &status, sizeof(status))) {
  550. XDNA_ERR(xdna, "Failed to copy AIE request info to user space");
  551. return -EFAULT;
  552. }
  553. return 0;
  554. }
  555. static int aie2_get_aie_metadata(struct amdxdna_client *client,
  556. struct amdxdna_drm_get_info *args)
  557. {
  558. struct amdxdna_drm_query_aie_metadata *meta;
  559. struct amdxdna_dev *xdna = client->xdna;
  560. struct amdxdna_dev_hdl *ndev;
  561. int ret = 0;
  562. ndev = xdna->dev_handle;
  563. meta = kzalloc_obj(*meta);
  564. if (!meta)
  565. return -ENOMEM;
  566. meta->col_size = ndev->metadata.size;
  567. meta->cols = ndev->metadata.cols;
  568. meta->rows = ndev->metadata.rows;
  569. meta->version.major = ndev->metadata.version.major;
  570. meta->version.minor = ndev->metadata.version.minor;
  571. meta->core.row_count = ndev->metadata.core.row_count;
  572. meta->core.row_start = ndev->metadata.core.row_start;
  573. meta->core.dma_channel_count = ndev->metadata.core.dma_channel_count;
  574. meta->core.lock_count = ndev->metadata.core.lock_count;
  575. meta->core.event_reg_count = ndev->metadata.core.event_reg_count;
  576. meta->mem.row_count = ndev->metadata.mem.row_count;
  577. meta->mem.row_start = ndev->metadata.mem.row_start;
  578. meta->mem.dma_channel_count = ndev->metadata.mem.dma_channel_count;
  579. meta->mem.lock_count = ndev->metadata.mem.lock_count;
  580. meta->mem.event_reg_count = ndev->metadata.mem.event_reg_count;
  581. meta->shim.row_count = ndev->metadata.shim.row_count;
  582. meta->shim.row_start = ndev->metadata.shim.row_start;
  583. meta->shim.dma_channel_count = ndev->metadata.shim.dma_channel_count;
  584. meta->shim.lock_count = ndev->metadata.shim.lock_count;
  585. meta->shim.event_reg_count = ndev->metadata.shim.event_reg_count;
  586. if (copy_to_user(u64_to_user_ptr(args->buffer), meta, sizeof(*meta)))
  587. ret = -EFAULT;
  588. kfree(meta);
  589. return ret;
  590. }
  591. static int aie2_get_aie_version(struct amdxdna_client *client,
  592. struct amdxdna_drm_get_info *args)
  593. {
  594. struct amdxdna_drm_query_aie_version version;
  595. struct amdxdna_dev *xdna = client->xdna;
  596. struct amdxdna_dev_hdl *ndev;
  597. ndev = xdna->dev_handle;
  598. version.major = ndev->version.major;
  599. version.minor = ndev->version.minor;
  600. if (copy_to_user(u64_to_user_ptr(args->buffer), &version, sizeof(version)))
  601. return -EFAULT;
  602. return 0;
  603. }
  604. static int aie2_get_firmware_version(struct amdxdna_client *client,
  605. struct amdxdna_drm_get_info *args)
  606. {
  607. struct amdxdna_drm_query_firmware_version version;
  608. struct amdxdna_dev *xdna = client->xdna;
  609. version.major = xdna->fw_ver.major;
  610. version.minor = xdna->fw_ver.minor;
  611. version.patch = xdna->fw_ver.sub;
  612. version.build = xdna->fw_ver.build;
  613. if (copy_to_user(u64_to_user_ptr(args->buffer), &version, sizeof(version)))
  614. return -EFAULT;
  615. return 0;
  616. }
  617. static int aie2_get_power_mode(struct amdxdna_client *client,
  618. struct amdxdna_drm_get_info *args)
  619. {
  620. struct amdxdna_drm_get_power_mode mode = {};
  621. struct amdxdna_dev *xdna = client->xdna;
  622. struct amdxdna_dev_hdl *ndev;
  623. ndev = xdna->dev_handle;
  624. mode.power_mode = ndev->pw_mode;
  625. if (copy_to_user(u64_to_user_ptr(args->buffer), &mode, sizeof(mode)))
  626. return -EFAULT;
  627. return 0;
  628. }
  629. static int aie2_get_clock_metadata(struct amdxdna_client *client,
  630. struct amdxdna_drm_get_info *args)
  631. {
  632. struct amdxdna_drm_query_clock_metadata *clock;
  633. struct amdxdna_dev *xdna = client->xdna;
  634. struct amdxdna_dev_hdl *ndev;
  635. int ret = 0;
  636. ndev = xdna->dev_handle;
  637. clock = kzalloc_obj(*clock);
  638. if (!clock)
  639. return -ENOMEM;
  640. snprintf(clock->mp_npu_clock.name, sizeof(clock->mp_npu_clock.name),
  641. "MP-NPU Clock");
  642. clock->mp_npu_clock.freq_mhz = ndev->npuclk_freq;
  643. snprintf(clock->h_clock.name, sizeof(clock->h_clock.name), "H Clock");
  644. clock->h_clock.freq_mhz = ndev->hclk_freq;
  645. if (copy_to_user(u64_to_user_ptr(args->buffer), clock, sizeof(*clock)))
  646. ret = -EFAULT;
  647. kfree(clock);
  648. return ret;
  649. }
  650. static int aie2_hwctx_status_cb(struct amdxdna_hwctx *hwctx, void *arg)
  651. {
  652. struct amdxdna_drm_hwctx_entry *tmp __free(kfree) = NULL;
  653. struct amdxdna_drm_get_array *array_args = arg;
  654. struct amdxdna_drm_hwctx_entry __user *buf;
  655. u32 size;
  656. if (!array_args->num_element)
  657. return -EINVAL;
  658. tmp = kzalloc_obj(*tmp);
  659. if (!tmp)
  660. return -ENOMEM;
  661. tmp->pid = hwctx->client->pid;
  662. tmp->context_id = hwctx->id;
  663. tmp->start_col = hwctx->start_col;
  664. tmp->num_col = hwctx->num_col;
  665. tmp->command_submissions = hwctx->priv->seq;
  666. tmp->command_completions = hwctx->priv->completed;
  667. tmp->pasid = hwctx->client->pasid;
  668. tmp->priority = hwctx->qos.priority;
  669. tmp->gops = hwctx->qos.gops;
  670. tmp->fps = hwctx->qos.fps;
  671. tmp->dma_bandwidth = hwctx->qos.dma_bandwidth;
  672. tmp->latency = hwctx->qos.latency;
  673. tmp->frame_exec_time = hwctx->qos.frame_exec_time;
  674. tmp->state = AMDXDNA_HWCTX_STATE_ACTIVE;
  675. buf = u64_to_user_ptr(array_args->buffer);
  676. size = min(sizeof(*tmp), array_args->element_size);
  677. if (copy_to_user(buf, tmp, size))
  678. return -EFAULT;
  679. array_args->buffer += size;
  680. array_args->num_element--;
  681. return 0;
  682. }
  683. static int aie2_get_hwctx_status(struct amdxdna_client *client,
  684. struct amdxdna_drm_get_info *args)
  685. {
  686. struct amdxdna_drm_get_array array_args;
  687. struct amdxdna_dev *xdna = client->xdna;
  688. struct amdxdna_client *tmp_client;
  689. int ret;
  690. drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
  691. array_args.element_size = sizeof(struct amdxdna_drm_query_hwctx);
  692. array_args.buffer = args->buffer;
  693. array_args.num_element = args->buffer_size / array_args.element_size;
  694. list_for_each_entry(tmp_client, &xdna->client_list, node) {
  695. ret = amdxdna_hwctx_walk(tmp_client, &array_args,
  696. aie2_hwctx_status_cb);
  697. if (ret)
  698. break;
  699. }
  700. args->buffer_size -= (u32)(array_args.buffer - args->buffer);
  701. return 0;
  702. }
  703. static int aie2_query_resource_info(struct amdxdna_client *client,
  704. struct amdxdna_drm_get_info *args)
  705. {
  706. struct amdxdna_drm_get_resource_info res_info;
  707. const struct amdxdna_dev_priv *priv;
  708. struct amdxdna_dev_hdl *ndev;
  709. struct amdxdna_dev *xdna;
  710. xdna = client->xdna;
  711. ndev = xdna->dev_handle;
  712. priv = ndev->priv;
  713. res_info.npu_clk_max = priv->dpm_clk_tbl[ndev->max_dpm_level].hclk;
  714. res_info.npu_tops_max = ndev->max_tops;
  715. res_info.npu_task_max = priv->hwctx_limit;
  716. res_info.npu_tops_curr = ndev->curr_tops;
  717. res_info.npu_task_curr = ndev->hwctx_num;
  718. if (copy_to_user(u64_to_user_ptr(args->buffer), &res_info, sizeof(res_info)))
  719. return -EFAULT;
  720. return 0;
  721. }
  722. static int aie2_fill_hwctx_map(struct amdxdna_hwctx *hwctx, void *arg)
  723. {
  724. struct amdxdna_dev *xdna = hwctx->client->xdna;
  725. u32 *map = arg;
  726. if (hwctx->fw_ctx_id >= xdna->dev_handle->priv->hwctx_limit) {
  727. XDNA_ERR(xdna, "Invalid fw ctx id %d/%d ", hwctx->fw_ctx_id,
  728. xdna->dev_handle->priv->hwctx_limit);
  729. return -EINVAL;
  730. }
  731. map[hwctx->fw_ctx_id] = hwctx->id;
  732. return 0;
  733. }
  734. static int aie2_get_telemetry(struct amdxdna_client *client,
  735. struct amdxdna_drm_get_info *args)
  736. {
  737. struct amdxdna_drm_query_telemetry_header *header __free(kfree) = NULL;
  738. u32 telemetry_data_sz, header_sz, elem_num;
  739. struct amdxdna_dev *xdna = client->xdna;
  740. struct amdxdna_client *tmp_client;
  741. int ret;
  742. elem_num = xdna->dev_handle->priv->hwctx_limit;
  743. header_sz = struct_size(header, map, elem_num);
  744. if (args->buffer_size <= header_sz) {
  745. XDNA_ERR(xdna, "Invalid buffer size");
  746. return -EINVAL;
  747. }
  748. telemetry_data_sz = args->buffer_size - header_sz;
  749. if (telemetry_data_sz > SZ_4M) {
  750. XDNA_ERR(xdna, "Buffer size is too big, %d", telemetry_data_sz);
  751. return -EINVAL;
  752. }
  753. header = kzalloc(header_sz, GFP_KERNEL);
  754. if (!header)
  755. return -ENOMEM;
  756. if (copy_from_user(header, u64_to_user_ptr(args->buffer), sizeof(*header))) {
  757. XDNA_ERR(xdna, "Failed to copy telemetry header from user");
  758. return -EFAULT;
  759. }
  760. header->map_num_elements = elem_num;
  761. list_for_each_entry(tmp_client, &xdna->client_list, node) {
  762. ret = amdxdna_hwctx_walk(tmp_client, &header->map,
  763. aie2_fill_hwctx_map);
  764. if (ret)
  765. return ret;
  766. }
  767. ret = aie2_query_telemetry(xdna->dev_handle,
  768. u64_to_user_ptr(args->buffer + header_sz),
  769. telemetry_data_sz, header);
  770. if (ret) {
  771. XDNA_ERR(xdna, "Query telemetry failed ret %d", ret);
  772. return ret;
  773. }
  774. if (copy_to_user(u64_to_user_ptr(args->buffer), header, header_sz)) {
  775. XDNA_ERR(xdna, "Copy header failed");
  776. return -EFAULT;
  777. }
  778. return 0;
  779. }
  780. static int aie2_get_preempt_state(struct amdxdna_client *client,
  781. struct amdxdna_drm_get_info *args)
  782. {
  783. struct amdxdna_drm_attribute_state state = {};
  784. struct amdxdna_dev *xdna = client->xdna;
  785. struct amdxdna_dev_hdl *ndev;
  786. ndev = xdna->dev_handle;
  787. if (args->param == DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE)
  788. state.state = ndev->force_preempt_enabled;
  789. else if (args->param == DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE)
  790. state.state = ndev->frame_boundary_preempt;
  791. if (copy_to_user(u64_to_user_ptr(args->buffer), &state, sizeof(state)))
  792. return -EFAULT;
  793. return 0;
  794. }
  795. static int aie2_get_info(struct amdxdna_client *client, struct amdxdna_drm_get_info *args)
  796. {
  797. struct amdxdna_dev *xdna = client->xdna;
  798. int ret, idx;
  799. if (!drm_dev_enter(&xdna->ddev, &idx))
  800. return -ENODEV;
  801. ret = amdxdna_pm_resume_get_locked(xdna);
  802. if (ret)
  803. goto dev_exit;
  804. switch (args->param) {
  805. case DRM_AMDXDNA_QUERY_AIE_STATUS:
  806. ret = aie2_get_aie_status(client, args);
  807. break;
  808. case DRM_AMDXDNA_QUERY_AIE_METADATA:
  809. ret = aie2_get_aie_metadata(client, args);
  810. break;
  811. case DRM_AMDXDNA_QUERY_AIE_VERSION:
  812. ret = aie2_get_aie_version(client, args);
  813. break;
  814. case DRM_AMDXDNA_QUERY_CLOCK_METADATA:
  815. ret = aie2_get_clock_metadata(client, args);
  816. break;
  817. case DRM_AMDXDNA_QUERY_HW_CONTEXTS:
  818. ret = aie2_get_hwctx_status(client, args);
  819. break;
  820. case DRM_AMDXDNA_QUERY_FIRMWARE_VERSION:
  821. ret = aie2_get_firmware_version(client, args);
  822. break;
  823. case DRM_AMDXDNA_GET_POWER_MODE:
  824. ret = aie2_get_power_mode(client, args);
  825. break;
  826. case DRM_AMDXDNA_QUERY_TELEMETRY:
  827. ret = aie2_get_telemetry(client, args);
  828. break;
  829. case DRM_AMDXDNA_QUERY_RESOURCE_INFO:
  830. ret = aie2_query_resource_info(client, args);
  831. break;
  832. case DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE:
  833. case DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE:
  834. ret = aie2_get_preempt_state(client, args);
  835. break;
  836. default:
  837. XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
  838. ret = -EOPNOTSUPP;
  839. }
  840. amdxdna_pm_suspend_put(xdna);
  841. XDNA_DBG(xdna, "Got param %d", args->param);
  842. dev_exit:
  843. drm_dev_exit(idx);
  844. return ret;
  845. }
  846. static int aie2_query_ctx_status_array(struct amdxdna_client *client,
  847. struct amdxdna_drm_get_array *args)
  848. {
  849. struct amdxdna_drm_get_array array_args;
  850. struct amdxdna_dev *xdna = client->xdna;
  851. struct amdxdna_client *tmp_client;
  852. int ret;
  853. drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
  854. if (args->element_size > SZ_4K || args->num_element > SZ_1K) {
  855. XDNA_DBG(xdna, "Invalid element size %d or number of element %d",
  856. args->element_size, args->num_element);
  857. return -EINVAL;
  858. }
  859. array_args.element_size = min(args->element_size,
  860. sizeof(struct amdxdna_drm_hwctx_entry));
  861. array_args.buffer = args->buffer;
  862. array_args.num_element = args->num_element * args->element_size /
  863. array_args.element_size;
  864. list_for_each_entry(tmp_client, &xdna->client_list, node) {
  865. ret = amdxdna_hwctx_walk(tmp_client, &array_args,
  866. aie2_hwctx_status_cb);
  867. if (ret)
  868. break;
  869. }
  870. args->element_size = array_args.element_size;
  871. args->num_element = (u32)((array_args.buffer - args->buffer) /
  872. args->element_size);
  873. return 0;
  874. }
  875. static int aie2_get_array(struct amdxdna_client *client,
  876. struct amdxdna_drm_get_array *args)
  877. {
  878. struct amdxdna_dev *xdna = client->xdna;
  879. int ret, idx;
  880. if (!drm_dev_enter(&xdna->ddev, &idx))
  881. return -ENODEV;
  882. ret = amdxdna_pm_resume_get_locked(xdna);
  883. if (ret)
  884. goto dev_exit;
  885. switch (args->param) {
  886. case DRM_AMDXDNA_HW_CONTEXT_ALL:
  887. ret = aie2_query_ctx_status_array(client, args);
  888. break;
  889. case DRM_AMDXDNA_HW_LAST_ASYNC_ERR:
  890. ret = aie2_get_array_async_error(xdna->dev_handle, args);
  891. break;
  892. default:
  893. XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
  894. ret = -EOPNOTSUPP;
  895. }
  896. amdxdna_pm_suspend_put(xdna);
  897. XDNA_DBG(xdna, "Got param %d", args->param);
  898. dev_exit:
  899. drm_dev_exit(idx);
  900. return ret;
  901. }
  902. static int aie2_set_power_mode(struct amdxdna_client *client,
  903. struct amdxdna_drm_set_state *args)
  904. {
  905. struct amdxdna_drm_set_power_mode power_state;
  906. enum amdxdna_power_mode_type power_mode;
  907. struct amdxdna_dev *xdna = client->xdna;
  908. if (copy_from_user(&power_state, u64_to_user_ptr(args->buffer),
  909. sizeof(power_state))) {
  910. XDNA_ERR(xdna, "Failed to copy power mode request into kernel");
  911. return -EFAULT;
  912. }
  913. if (XDNA_MBZ_DBG(xdna, power_state.pad, sizeof(power_state.pad)))
  914. return -EINVAL;
  915. power_mode = power_state.power_mode;
  916. if (power_mode > POWER_MODE_TURBO) {
  917. XDNA_ERR(xdna, "Invalid power mode %d", power_mode);
  918. return -EINVAL;
  919. }
  920. return aie2_pm_set_mode(xdna->dev_handle, power_mode);
  921. }
  922. static int aie2_set_preempt_state(struct amdxdna_client *client,
  923. struct amdxdna_drm_set_state *args)
  924. {
  925. struct amdxdna_dev_hdl *ndev = client->xdna->dev_handle;
  926. struct amdxdna_drm_attribute_state state;
  927. u32 val;
  928. int ret;
  929. if (copy_from_user(&state, u64_to_user_ptr(args->buffer), sizeof(state)))
  930. return -EFAULT;
  931. if (state.state > 1)
  932. return -EINVAL;
  933. if (XDNA_MBZ_DBG(client->xdna, state.pad, sizeof(state.pad)))
  934. return -EINVAL;
  935. if (args->param == DRM_AMDXDNA_SET_FORCE_PREEMPT) {
  936. ndev->force_preempt_enabled = state.state;
  937. } else if (args->param == DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT) {
  938. val = state.state;
  939. ret = aie2_runtime_cfg(ndev, AIE2_RT_CFG_FRAME_BOUNDARY_PREEMPT,
  940. &val);
  941. if (ret)
  942. return ret;
  943. ndev->frame_boundary_preempt = state.state;
  944. }
  945. return 0;
  946. }
  947. static int aie2_set_state(struct amdxdna_client *client,
  948. struct amdxdna_drm_set_state *args)
  949. {
  950. struct amdxdna_dev *xdna = client->xdna;
  951. int ret, idx;
  952. if (!drm_dev_enter(&xdna->ddev, &idx))
  953. return -ENODEV;
  954. ret = amdxdna_pm_resume_get_locked(xdna);
  955. if (ret)
  956. goto dev_exit;
  957. switch (args->param) {
  958. case DRM_AMDXDNA_SET_POWER_MODE:
  959. ret = aie2_set_power_mode(client, args);
  960. break;
  961. case DRM_AMDXDNA_SET_FORCE_PREEMPT:
  962. case DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT:
  963. ret = aie2_set_preempt_state(client, args);
  964. break;
  965. default:
  966. XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
  967. ret = -EOPNOTSUPP;
  968. break;
  969. }
  970. amdxdna_pm_suspend_put(xdna);
  971. dev_exit:
  972. drm_dev_exit(idx);
  973. return ret;
  974. }
  975. const struct amdxdna_dev_ops aie2_ops = {
  976. .init = aie2_init,
  977. .fini = aie2_fini,
  978. .resume = aie2_hw_resume,
  979. .suspend = aie2_hw_suspend,
  980. .get_aie_info = aie2_get_info,
  981. .set_aie_state = aie2_set_state,
  982. .hwctx_init = aie2_hwctx_init,
  983. .hwctx_fini = aie2_hwctx_fini,
  984. .hwctx_config = aie2_hwctx_config,
  985. .hwctx_sync_debug_bo = aie2_hwctx_sync_debug_bo,
  986. .cmd_submit = aie2_cmd_submit,
  987. .hmm_invalidate = aie2_hmm_invalidate,
  988. .get_array = aie2_get_array,
  989. };