1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2023-2024, Advanced Micro Devices, Inc.
4 */
5
6 #include <drm/amdxdna_accel.h>
7 #include <drm/drm_device.h>
8 #include <drm/drm_drv.h>
9 #include <drm/drm_gem_shmem_helper.h>
10 #include <drm/drm_managed.h>
11 #include <drm/drm_print.h>
12 #include <drm/gpu_scheduler.h>
13 #include <linux/amd-pmf-io.h>
14 #include <linux/cleanup.h>
15 #include <linux/errno.h>
16 #include <linux/firmware.h>
17 #include <linux/iommu.h>
18 #include <linux/iopoll.h>
19 #include <linux/pci.h>
20 #include <linux/xarray.h>
21 #include <asm/hypervisor.h>
22
23 #include "aie2_msg_priv.h"
24 #include "aie2_pci.h"
25 #include "aie2_solver.h"
26 #include "amdxdna_ctx.h"
27 #include "amdxdna_gem.h"
28 #include "amdxdna_mailbox.h"
29 #include "amdxdna_pci_drv.h"
30 #include "amdxdna_pm.h"
31
32 static int aie2_max_col = XRS_MAX_COL;
33 module_param(aie2_max_col, uint, 0600);
34 MODULE_PARM_DESC(aie2_max_col, "Maximum column could be used");
35
36 #define DEFAULT_TIME_QUANTUM 30000 /* microseconds */
37
38 static char *npu_fw[] = {
39 "npu_7.sbin",
40 "npu.sbin"
41 };
42
43 /*
44 * The management mailbox channel is allocated by firmware.
45 * The related register and ring buffer information is on SRAM BAR.
46 * This struct is the register layout.
47 */
48 #define MGMT_MBOX_MAGIC 0x55504e5f /* _NPU */
49 struct mgmt_mbox_chann_info {
50 __u32 x2i_tail;
51 __u32 x2i_head;
52 __u32 x2i_buf;
53 __u32 x2i_buf_sz;
54 __u32 i2x_tail;
55 __u32 i2x_head;
56 __u32 i2x_buf;
57 __u32 i2x_buf_sz;
58 __u32 magic;
59 __u32 msi_id;
60 __u32 prot_major;
61 __u32 prot_minor;
62 __u32 rsvd[4];
63 };
64
aie2_get_mgmt_chann_info(struct amdxdna_dev_hdl * ndev)65 static int aie2_get_mgmt_chann_info(struct amdxdna_dev_hdl *ndev)
66 {
67 struct mgmt_mbox_chann_info info_regs;
68 struct xdna_mailbox_chann_res *i2x;
69 struct xdna_mailbox_chann_res *x2i;
70 u32 addr, off;
71 u32 *reg;
72 int ret;
73 int i;
74
75 /*
76 * Once firmware is alive, it will write management channel
77 * information in SRAM BAR and write the address of that information
78 * at FW_ALIVE_OFF offset in SRMA BAR.
79 *
80 * Read a non-zero value from FW_ALIVE_OFF implies that firmware
81 * is alive.
82 */
83 ret = readx_poll_timeout(readl, SRAM_GET_ADDR(ndev, FW_ALIVE_OFF),
84 addr, addr, AIE_INTERVAL, AIE_TIMEOUT);
85 if (ret || !addr)
86 return -ETIME;
87
88 off = AIE2_SRAM_OFF(ndev, addr);
89 reg = (u32 *)&info_regs;
90 for (i = 0; i < sizeof(info_regs) / sizeof(u32); i++)
91 reg[i] = readl(ndev->sram_base + off + i * sizeof(u32));
92
93 if (info_regs.magic != MGMT_MBOX_MAGIC) {
94 XDNA_ERR(ndev->aie.xdna, "Invalid mbox magic 0x%x", info_regs.magic);
95 ret = -EINVAL;
96 goto done;
97 }
98
99 i2x = &ndev->aie.mgmt_i2x;
100 x2i = &ndev->aie.mgmt_x2i;
101
102 i2x->mb_head_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.i2x_head);
103 i2x->mb_tail_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.i2x_tail);
104 i2x->rb_start_addr = AIE2_SRAM_OFF(ndev, info_regs.i2x_buf);
105 i2x->rb_size = info_regs.i2x_buf_sz;
106
107 x2i->mb_head_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.x2i_head);
108 x2i->mb_tail_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.x2i_tail);
109 x2i->rb_start_addr = AIE2_SRAM_OFF(ndev, info_regs.x2i_buf);
110 x2i->rb_size = info_regs.x2i_buf_sz;
111
112 ndev->aie.mgmt_chan_idx = info_regs.msi_id;
113 ndev->aie.mgmt_prot_major = info_regs.prot_major;
114 ndev->aie.mgmt_prot_minor = info_regs.prot_minor;
115
116 ret = aie_check_protocol(&ndev->aie, ndev->aie.mgmt_prot_major,
117 ndev->aie.mgmt_prot_minor);
118
119 done:
120 aie_dump_mgmt_chann_debug(&ndev->aie);
121
122 /* Must clear address at FW_ALIVE_OFF */
123 writel(0, SRAM_GET_ADDR(ndev, FW_ALIVE_OFF));
124
125 return ret;
126 }
127
aie2_runtime_cfg(struct amdxdna_dev_hdl * ndev,enum rt_config_category category,u32 * val)128 int aie2_runtime_cfg(struct amdxdna_dev_hdl *ndev,
129 enum rt_config_category category, u32 *val)
130 {
131 const struct rt_config *cfg;
132 u32 value;
133 int ret;
134
135 for (cfg = ndev->priv->rt_config; cfg->type; cfg++) {
136 if (cfg->category != category)
137 continue;
138
139 if (cfg->feature_mask &&
140 bitmap_subset(&cfg->feature_mask, &ndev->aie.feature_mask,
141 AIE2_FEATURE_MAX))
142 continue;
143
144 value = val ? *val : cfg->value;
145 ret = aie2_set_runtime_cfg(ndev, cfg->type, value);
146 if (ret) {
147 XDNA_ERR(ndev->aie.xdna, "Set type %d value %d failed",
148 cfg->type, value);
149 return ret;
150 }
151 }
152
153 return 0;
154 }
155
aie2_xdna_reset(struct amdxdna_dev_hdl * ndev)156 static int aie2_xdna_reset(struct amdxdna_dev_hdl *ndev)
157 {
158 int ret;
159
160 ret = aie2_suspend_fw(ndev);
161 if (ret) {
162 XDNA_ERR(ndev->aie.xdna, "Suspend firmware failed");
163 return ret;
164 }
165
166 ret = aie2_resume_fw(ndev);
167 if (ret) {
168 XDNA_ERR(ndev->aie.xdna, "Resume firmware failed");
169 return ret;
170 }
171
172 return 0;
173 }
174
aie2_mgmt_fw_init(struct amdxdna_dev_hdl * ndev)175 static int aie2_mgmt_fw_init(struct amdxdna_dev_hdl *ndev)
176 {
177 int ret;
178
179 ret = aie2_runtime_cfg(ndev, AIE2_RT_CFG_INIT, NULL);
180 if (ret) {
181 XDNA_ERR(ndev->aie.xdna, "Runtime config failed");
182 return ret;
183 }
184
185 ret = aie2_assign_mgmt_pasid(ndev, 0);
186 if (ret) {
187 XDNA_ERR(ndev->aie.xdna, "Can not assign PASID");
188 return ret;
189 }
190
191 ret = aie2_update_prop_time_quota(ndev, DEFAULT_TIME_QUANTUM);
192 if (ret) {
193 XDNA_ERR(ndev->aie.xdna, "Failed to update execution time quantum");
194 return ret;
195 }
196
197 ret = aie2_xdna_reset(ndev);
198 if (ret) {
199 XDNA_ERR(ndev->aie.xdna, "Reset firmware failed");
200 return ret;
201 }
202
203 return 0;
204 }
205
aie2_mgmt_fw_query(struct amdxdna_dev_hdl * ndev)206 static int aie2_mgmt_fw_query(struct amdxdna_dev_hdl *ndev)
207 {
208 int ret;
209
210 ret = aie2_query_firmware_version(ndev, &ndev->aie.xdna->fw_ver);
211 if (ret) {
212 XDNA_ERR(ndev->aie.xdna, "query firmware version failed");
213 return ret;
214 }
215
216 ret = aie2_query_aie_version(ndev, &ndev->version);
217 if (ret) {
218 XDNA_ERR(ndev->aie.xdna, "Query AIE version failed");
219 return ret;
220 }
221
222 ret = aie2_query_aie_metadata(ndev, &ndev->aie.metadata);
223 if (ret) {
224 XDNA_ERR(ndev->aie.xdna, "Query AIE metadata failed");
225 return ret;
226 }
227
228 ndev->total_col = min(aie2_max_col, ndev->aie.metadata.cols);
229
230 return 0;
231 }
232
aie2_mgmt_fw_fini(struct amdxdna_dev_hdl * ndev)233 static void aie2_mgmt_fw_fini(struct amdxdna_dev_hdl *ndev)
234 {
235 if (aie2_suspend_fw(ndev))
236 XDNA_ERR(ndev->aie.xdna, "Suspend_fw failed");
237 XDNA_DBG(ndev->aie.xdna, "Firmware suspended");
238 }
239
aie2_xrs_load(void * cb_arg,struct xrs_action_load * action)240 static int aie2_xrs_load(void *cb_arg, struct xrs_action_load *action)
241 {
242 struct amdxdna_hwctx *hwctx = cb_arg;
243 struct amdxdna_dev *xdna;
244 int ret;
245
246 xdna = hwctx->client->xdna;
247
248 hwctx->start_col = action->part.start_col;
249 hwctx->num_unused_col = action->part.ncols - hwctx->num_col;
250 hwctx->num_col = action->part.ncols;
251 ret = aie2_create_context(xdna->dev_handle, hwctx);
252 if (ret)
253 XDNA_ERR(xdna, "create context failed, ret %d", ret);
254
255 return ret;
256 }
257
aie2_xrs_unload(void * cb_arg)258 static int aie2_xrs_unload(void *cb_arg)
259 {
260 struct amdxdna_hwctx *hwctx = cb_arg;
261 struct amdxdna_dev *xdna;
262 int ret;
263
264 xdna = hwctx->client->xdna;
265
266 ret = aie2_destroy_context(xdna->dev_handle, hwctx);
267 if (ret)
268 XDNA_ERR(xdna, "destroy context failed, ret %d", ret);
269
270 return ret;
271 }
272
aie2_xrs_set_dft_dpm_level(struct drm_device * ddev,u32 dpm_level)273 static int aie2_xrs_set_dft_dpm_level(struct drm_device *ddev, u32 dpm_level)
274 {
275 struct amdxdna_dev *xdna = to_xdna_dev(ddev);
276 struct amdxdna_dev_hdl *ndev;
277
278 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
279
280 ndev = xdna->dev_handle;
281 ndev->dft_dpm_level = dpm_level;
282 if (ndev->pw_mode != POWER_MODE_DEFAULT || ndev->dpm_level == dpm_level)
283 return 0;
284
285 return aie2_pm_set_dpm(ndev, dpm_level);
286 }
287
288 static struct xrs_action_ops aie2_xrs_actions = {
289 .load = aie2_xrs_load,
290 .unload = aie2_xrs_unload,
291 .set_dft_dpm_level = aie2_xrs_set_dft_dpm_level,
292 };
293
aie2_smu_fini(struct amdxdna_dev_hdl * ndev)294 static void aie2_smu_fini(struct amdxdna_dev_hdl *ndev)
295 {
296 ndev->priv->hw_ops->set_dpm(ndev, 0);
297 aie_smu_fini(ndev->aie.smu_hdl);
298 }
299
aie2_hw_stop(struct amdxdna_dev * xdna)300 static void aie2_hw_stop(struct amdxdna_dev *xdna)
301 {
302 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
303 struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
304
305 if (ndev->dev_status <= AIE2_DEV_INIT) {
306 XDNA_ERR(xdna, "device is already stopped");
307 return;
308 }
309
310 aie2_runtime_cfg(ndev, AIE2_RT_CFG_CLK_GATING, NULL);
311 aie2_mgmt_fw_fini(ndev);
312 aie_destroy_chann(&ndev->aie, &ndev->aie.mgmt_chann);
313 drmm_kfree(&xdna->ddev, ndev->mbox);
314 ndev->mbox = NULL;
315 aie_psp_stop(ndev->aie.psp_hdl);
316 aie2_smu_fini(ndev);
317 aie2_error_async_events_free(ndev);
318 pci_disable_device(pdev);
319
320 ndev->dev_status = AIE2_DEV_INIT;
321 }
322
aie2_hw_start(struct amdxdna_dev * xdna)323 static int aie2_hw_start(struct amdxdna_dev *xdna)
324 {
325 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
326 struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
327 struct xdna_mailbox_res mbox_res;
328 u32 xdna_mailbox_intr_reg;
329 int mgmt_mb_irq, ret;
330
331 if (ndev->dev_status >= AIE2_DEV_START) {
332 XDNA_INFO(xdna, "device is already started");
333 return 0;
334 }
335
336 ret = pci_enable_device(pdev);
337 if (ret) {
338 XDNA_ERR(xdna, "failed to enable device, ret %d", ret);
339 return ret;
340 }
341 pci_set_master(pdev);
342
343 mbox_res.ringbuf_base = ndev->sram_base;
344 mbox_res.ringbuf_size = pci_resource_len(pdev, xdna->dev_info->sram_bar);
345 mbox_res.mbox_base = ndev->mbox_base;
346 mbox_res.mbox_size = MBOX_SIZE(ndev);
347 mbox_res.name = "xdna_mailbox";
348 ndev->mbox = xdnam_mailbox_create(&xdna->ddev, &mbox_res);
349 if (!ndev->mbox) {
350 XDNA_ERR(xdna, "failed to create mailbox device");
351 ret = -ENODEV;
352 goto disable_dev;
353 }
354
355 ndev->aie.mgmt_chann = xdna_mailbox_alloc_channel(ndev->mbox);
356 if (!ndev->aie.mgmt_chann) {
357 XDNA_ERR(xdna, "failed to alloc channel");
358 ret = -ENODEV;
359 goto disable_dev;
360 }
361
362 ret = aie_smu_init(ndev->aie.smu_hdl);
363 if (ret) {
364 XDNA_ERR(xdna, "failed to init smu, ret %d", ret);
365 goto free_channel;
366 }
367
368 ret = aie_psp_start(ndev->aie.psp_hdl);
369 if (ret) {
370 XDNA_ERR(xdna, "failed to start psp, ret %d", ret);
371 goto fini_smu;
372 }
373
374 ret = aie2_get_mgmt_chann_info(ndev);
375 if (ret) {
376 XDNA_ERR(xdna, "firmware is not alive");
377 goto stop_psp;
378 }
379
380 mgmt_mb_irq = pci_irq_vector(pdev, ndev->aie.mgmt_chan_idx);
381 if (mgmt_mb_irq < 0) {
382 ret = mgmt_mb_irq;
383 XDNA_ERR(xdna, "failed to alloc irq vector, ret %d", ret);
384 goto stop_psp;
385 }
386
387 xdna_mailbox_intr_reg = ndev->aie.mgmt_i2x.mb_head_ptr_reg + 4;
388 ret = xdna_mailbox_start_channel(ndev->aie.mgmt_chann,
389 &ndev->aie.mgmt_x2i,
390 &ndev->aie.mgmt_i2x,
391 xdna_mailbox_intr_reg,
392 mgmt_mb_irq);
393 if (ret) {
394 XDNA_ERR(xdna, "failed to start management mailbox channel");
395 ret = -EINVAL;
396 goto stop_psp;
397 }
398
399 ret = aie2_mgmt_fw_init(ndev);
400 if (ret) {
401 XDNA_ERR(xdna, "initial mgmt firmware failed, ret %d", ret);
402 goto stop_fw;
403 }
404
405 ret = aie2_pm_init(ndev);
406 if (ret) {
407 XDNA_ERR(xdna, "failed to init pm, ret %d", ret);
408 goto stop_fw;
409 }
410
411 ret = aie2_mgmt_fw_query(ndev);
412 if (ret) {
413 XDNA_ERR(xdna, "failed to query fw, ret %d", ret);
414 goto stop_fw;
415 }
416
417 ret = aie2_error_async_events_alloc(ndev);
418 if (ret) {
419 XDNA_ERR(xdna, "Allocate async events failed, ret %d", ret);
420 goto stop_fw;
421 }
422
423 WRITE_ONCE(ndev->last_signal_ts, jiffies);
424 ndev->dev_status = AIE2_DEV_START;
425
426 return 0;
427
428 stop_fw:
429 aie2_suspend_fw(ndev);
430 xdna_mailbox_stop_channel(ndev->aie.mgmt_chann);
431 stop_psp:
432 aie_psp_stop(ndev->aie.psp_hdl);
433 fini_smu:
434 aie2_smu_fini(ndev);
435 free_channel:
436 xdna_mailbox_free_channel(ndev->aie.mgmt_chann);
437 ndev->aie.mgmt_chann = NULL;
438 disable_dev:
439 pci_disable_device(pdev);
440
441 return ret;
442 }
443
aie2_hw_suspend(struct amdxdna_dev * xdna)444 static int aie2_hw_suspend(struct amdxdna_dev *xdna)
445 {
446 struct amdxdna_client *client;
447
448 list_for_each_entry(client, &xdna->client_list, node)
449 aie2_hwctx_suspend(client);
450
451 aie2_hw_stop(xdna);
452
453 return 0;
454 }
455
aie2_hw_resume(struct amdxdna_dev * xdna)456 static int aie2_hw_resume(struct amdxdna_dev *xdna)
457 {
458 struct amdxdna_client *client;
459 int ret;
460
461 ret = aie2_hw_start(xdna);
462 if (ret) {
463 XDNA_ERR(xdna, "Start hardware failed, %d", ret);
464 return ret;
465 }
466
467 list_for_each_entry(client, &xdna->client_list, node) {
468 ret = aie2_hwctx_resume(client);
469 if (ret)
470 break;
471 }
472
473 return ret;
474 }
475
aie2_init(struct amdxdna_dev * xdna)476 static int aie2_init(struct amdxdna_dev *xdna)
477 {
478 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
479 void __iomem *tbl[PCI_NUM_RESOURCES] = {0};
480 struct init_config xrs_cfg = { 0 };
481 struct amdxdna_dev_hdl *ndev;
482 struct psp_config psp_conf = { 0 };
483 struct smu_config smu_conf;
484 const struct firmware *fw;
485 unsigned long bars = 0;
486 char *fw_full_path;
487 int i, nvec, ret;
488
489 if (!hypervisor_is_type(X86_HYPER_NATIVE)) {
490 XDNA_ERR(xdna, "Running under hypervisor not supported");
491 return -EINVAL;
492 }
493
494 if (!xdna->group) {
495 XDNA_ERR(xdna, "Running without IOMMU not supported");
496 return -EINVAL;
497 }
498
499 ndev = drmm_kzalloc(&xdna->ddev, sizeof(*ndev), GFP_KERNEL);
500 if (!ndev)
501 return -ENOMEM;
502
503 ndev->priv = xdna->dev_info->dev_priv;
504 ndev->aie.xdna = xdna;
505
506 for (i = 0; i < ARRAY_SIZE(npu_fw); i++) {
507 fw_full_path = kasprintf(GFP_KERNEL, "%s%s", ndev->priv->fw_path, npu_fw[i]);
508 if (!fw_full_path)
509 return -ENOMEM;
510
511 ret = firmware_request_nowarn(&fw, fw_full_path, &pdev->dev);
512 kfree(fw_full_path);
513 if (!ret) {
514 XDNA_INFO(xdna, "Load firmware %s%s", ndev->priv->fw_path, npu_fw[i]);
515 break;
516 }
517 }
518
519 if (ret) {
520 XDNA_ERR(xdna, "failed to request_firmware %s, ret %d",
521 ndev->priv->fw_path, ret);
522 return ret;
523 }
524
525 ret = pcim_enable_device(pdev);
526 if (ret) {
527 XDNA_ERR(xdna, "pcim enable device failed, ret %d", ret);
528 goto release_fw;
529 }
530
531 for (i = 0; i < PSP_MAX_REGS; i++)
532 set_bit(PSP_REG_BAR(ndev, i), &bars);
533 for (i = 0; i < SMU_MAX_REGS; i++)
534 set_bit(SMU_REG_BAR(ndev, i), &bars);
535
536 set_bit(xdna->dev_info->sram_bar, &bars);
537 set_bit(xdna->dev_info->mbox_bar, &bars);
538
539 for (i = 0; i < PCI_NUM_RESOURCES; i++) {
540 if (!test_bit(i, &bars))
541 continue;
542 tbl[i] = pcim_iomap(pdev, i, 0);
543 if (!tbl[i]) {
544 XDNA_ERR(xdna, "map bar %d failed", i);
545 ret = -ENOMEM;
546 goto release_fw;
547 }
548 }
549
550 ndev->sram_base = tbl[xdna->dev_info->sram_bar];
551 ndev->mbox_base = tbl[xdna->dev_info->mbox_bar];
552
553 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
554 if (ret) {
555 XDNA_ERR(xdna, "Failed to set DMA mask: %d", ret);
556 goto release_fw;
557 }
558
559 nvec = pci_msix_vec_count(pdev);
560 if (nvec <= 0) {
561 XDNA_ERR(xdna, "does not get number of interrupt vector");
562 ret = -EINVAL;
563 goto release_fw;
564 }
565
566 ret = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_MSIX);
567 if (ret < 0) {
568 XDNA_ERR(xdna, "failed to alloc irq vectors, ret %d", ret);
569 goto release_fw;
570 }
571
572 psp_conf.fw_size = fw->size;
573 psp_conf.fw_buf = fw->data;
574 psp_conf.arg2_mask = GENMASK(23, 0);
575 psp_conf.notify_val = 1;
576 for (i = 0; i < PSP_MAX_REGS; i++)
577 psp_conf.psp_regs[i] = tbl[PSP_REG_BAR(ndev, i)] + PSP_REG_OFF(ndev, i);
578 ndev->aie.psp_hdl = aiem_psp_create(&xdna->ddev, &psp_conf);
579 if (!ndev->aie.psp_hdl) {
580 XDNA_ERR(xdna, "failed to create psp");
581 ret = -ENOMEM;
582 goto release_fw;
583 }
584
585 for (i = 0; i < SMU_MAX_REGS; i++)
586 smu_conf.smu_regs[i] = tbl[SMU_REG_BAR(ndev, i)] + SMU_REG_OFF(ndev, i);
587 ndev->aie.smu_hdl = aiem_smu_create(&xdna->ddev, &smu_conf);
588 if (!ndev->aie.smu_hdl) {
589 XDNA_ERR(xdna, "failed to create smu");
590 ret = -ENOMEM;
591 goto release_fw;
592 }
593 xdna->dev_handle = ndev;
594
595 ret = aie2_hw_start(xdna);
596 if (ret) {
597 XDNA_ERR(xdna, "start npu failed, ret %d", ret);
598 goto release_fw;
599 }
600
601 xrs_cfg.clk_list.num_levels = ndev->max_dpm_level + 1;
602 for (i = 0; i < xrs_cfg.clk_list.num_levels; i++)
603 xrs_cfg.clk_list.cu_clk_list[i] = ndev->priv->dpm_clk_tbl[i].hclk;
604 xrs_cfg.sys_eff_factor = 2;
605 xrs_cfg.ddev = &xdna->ddev;
606 xrs_cfg.actions = &aie2_xrs_actions;
607 xrs_cfg.total_col = ndev->total_col;
608
609 xdna->xrs_hdl = xrsm_init(&xrs_cfg);
610 if (!xdna->xrs_hdl) {
611 XDNA_ERR(xdna, "Initialize resolver failed");
612 ret = -EINVAL;
613 goto stop_hw;
614 }
615
616 release_firmware(fw);
617 aie2_msg_init(ndev);
618 amdxdna_vbnv_init(xdna);
619 amdxdna_pm_init(xdna);
620 return 0;
621
622 stop_hw:
623 aie2_hw_stop(xdna);
624 release_fw:
625 release_firmware(fw);
626
627 return ret;
628 }
629
aie2_fini(struct amdxdna_dev * xdna)630 static void aie2_fini(struct amdxdna_dev *xdna)
631 {
632 amdxdna_pm_fini(xdna);
633 aie2_hw_stop(xdna);
634 }
635
aie2_get_aie_status(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)636 static int aie2_get_aie_status(struct amdxdna_client *client,
637 struct amdxdna_drm_get_info *args)
638 {
639 struct amdxdna_drm_query_aie_status status = {};
640 struct amdxdna_dev *xdna = client->xdna;
641 struct amdxdna_dev_hdl *ndev;
642 u32 buf_sz;
643 int ret;
644
645 ndev = xdna->dev_handle;
646 buf_sz = min(args->buffer_size, sizeof(status));
647 if (copy_from_user(&status, u64_to_user_ptr(args->buffer), buf_sz)) {
648 XDNA_ERR(xdna, "Failed to copy AIE request into kernel");
649 return -EFAULT;
650 }
651
652 ret = aie2_query_status(ndev, u64_to_user_ptr(status.buffer),
653 status.buffer_size, &status.cols_filled);
654 if (ret) {
655 XDNA_ERR(xdna, "Failed to get AIE status info. Ret: %d", ret);
656 return ret;
657 }
658
659 if (copy_to_user(u64_to_user_ptr(args->buffer), &status, buf_sz)) {
660 XDNA_ERR(xdna, "Failed to copy AIE request info to user space");
661 return -EFAULT;
662 }
663
664 return 0;
665 }
666
aie2_get_aie_version(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)667 static int aie2_get_aie_version(struct amdxdna_client *client,
668 struct amdxdna_drm_get_info *args)
669 {
670 struct amdxdna_drm_query_aie_version version;
671 struct amdxdna_dev *xdna = client->xdna;
672 struct amdxdna_dev_hdl *ndev;
673 u32 buf_sz;
674
675 ndev = xdna->dev_handle;
676 version.major = ndev->version.major;
677 version.minor = ndev->version.minor;
678
679 buf_sz = min(args->buffer_size, sizeof(version));
680 if (copy_to_user(u64_to_user_ptr(args->buffer), &version, buf_sz))
681 return -EFAULT;
682
683 return 0;
684 }
685
aie2_get_firmware_version(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)686 static int aie2_get_firmware_version(struct amdxdna_client *client,
687 struct amdxdna_drm_get_info *args)
688 {
689 struct amdxdna_drm_query_firmware_version version;
690 struct amdxdna_dev *xdna = client->xdna;
691 u32 buf_sz;
692
693 version.major = xdna->fw_ver.major;
694 version.minor = xdna->fw_ver.minor;
695 version.patch = xdna->fw_ver.sub;
696 version.build = xdna->fw_ver.build;
697
698 buf_sz = min(args->buffer_size, sizeof(version));
699 if (copy_to_user(u64_to_user_ptr(args->buffer), &version, buf_sz))
700 return -EFAULT;
701
702 return 0;
703 }
704
aie2_get_power_mode(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)705 static int aie2_get_power_mode(struct amdxdna_client *client,
706 struct amdxdna_drm_get_info *args)
707 {
708 struct amdxdna_drm_get_power_mode mode = {};
709 struct amdxdna_dev *xdna = client->xdna;
710 struct amdxdna_dev_hdl *ndev;
711 u32 buf_sz;
712
713 ndev = xdna->dev_handle;
714 mode.power_mode = ndev->pw_mode;
715
716 buf_sz = min(args->buffer_size, sizeof(mode));
717 if (copy_to_user(u64_to_user_ptr(args->buffer), &mode, buf_sz))
718 return -EFAULT;
719
720 return 0;
721 }
722
aie2_get_clock_metadata(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)723 static int aie2_get_clock_metadata(struct amdxdna_client *client,
724 struct amdxdna_drm_get_info *args)
725 {
726 struct amdxdna_drm_query_clock_metadata *clock;
727 struct amdxdna_dev *xdna = client->xdna;
728 struct amdxdna_dev_hdl *ndev;
729 int ret = 0;
730 u32 buf_sz;
731
732 ndev = xdna->dev_handle;
733 clock = kzalloc_obj(*clock);
734 if (!clock)
735 return -ENOMEM;
736
737 aie2_update_counters(ndev);
738 snprintf(clock->mp_npu_clock.name, sizeof(clock->mp_npu_clock.name),
739 "MP-NPU Clock");
740 clock->mp_npu_clock.freq_mhz = ndev->npuclk_freq;
741 snprintf(clock->h_clock.name, sizeof(clock->h_clock.name), "H Clock");
742 clock->h_clock.freq_mhz = ndev->hclk_freq;
743
744 buf_sz = min(args->buffer_size, sizeof(*clock));
745 if (copy_to_user(u64_to_user_ptr(args->buffer), clock, buf_sz))
746 ret = -EFAULT;
747
748 kfree(clock);
749 return ret;
750 }
751
aie2_get_sensors(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)752 static int aie2_get_sensors(struct amdxdna_client *client,
753 struct amdxdna_drm_get_info *args)
754 {
755 struct amdxdna_dev_hdl *ndev = client->xdna->dev_handle;
756 struct amdxdna_drm_query_sensor sensor = {};
757 struct amd_pmf_npu_metrics npu_metrics;
758 u32 sensors_count = 0, i;
759 int ret;
760
761 ret = AIE2_GET_PMF_NPU_METRICS(&npu_metrics);
762 if (ret)
763 return ret;
764
765 sensor.type = AMDXDNA_SENSOR_TYPE_POWER;
766 sensor.input = npu_metrics.npu_power;
767 sensor.unitm = -3;
768 scnprintf(sensor.label, sizeof(sensor.label), "Total Power");
769 scnprintf(sensor.units, sizeof(sensor.units), "mW");
770
771 if (args->buffer_size < sizeof(sensor))
772 goto out;
773
774 if (copy_to_user(u64_to_user_ptr(args->buffer), &sensor, sizeof(sensor)))
775 return -EFAULT;
776
777 args->buffer_size -= sizeof(sensor);
778 sensors_count++;
779
780 for (i = 0; i < min_t(u32, ndev->total_col, 8); i++) {
781 memset(&sensor, 0, sizeof(sensor));
782 sensor.input = npu_metrics.npu_busy[i];
783 sensor.type = AMDXDNA_SENSOR_TYPE_COLUMN_UTILIZATION;
784 sensor.unitm = 0;
785 scnprintf(sensor.label, sizeof(sensor.label), "Column %d Utilization", i);
786 scnprintf(sensor.units, sizeof(sensor.units), "%%");
787
788 if (args->buffer_size < sizeof(sensor))
789 goto out;
790
791 if (copy_to_user(u64_to_user_ptr(args->buffer) + sensors_count * sizeof(sensor),
792 &sensor, sizeof(sensor)))
793 return -EFAULT;
794
795 args->buffer_size -= sizeof(sensor);
796 sensors_count++;
797 }
798
799 out:
800 args->buffer_size = sensors_count * sizeof(sensor);
801
802 return 0;
803 }
804
aie2_hwctx_status_cb(struct amdxdna_hwctx * hwctx,void * arg)805 static int aie2_hwctx_status_cb(struct amdxdna_hwctx *hwctx, void *arg)
806 {
807 struct amdxdna_drm_hwctx_entry *tmp __free(kfree) = NULL;
808 struct amdxdna_drm_get_array *array_args = arg;
809 struct amdxdna_drm_hwctx_entry __user *buf;
810 struct app_health_report report;
811 struct amdxdna_dev_hdl *ndev;
812 u32 size;
813 int ret;
814
815 if (!array_args->num_element)
816 return -EINVAL;
817
818 tmp = kzalloc_obj(*tmp);
819 if (!tmp)
820 return -ENOMEM;
821
822 tmp->pid = hwctx->client->pid;
823 tmp->context_id = hwctx->id;
824 tmp->start_col = hwctx->start_col;
825 tmp->num_col = hwctx->num_col;
826 tmp->command_submissions = hwctx->priv->seq;
827 tmp->command_completions = hwctx->priv->completed;
828 tmp->pasid = hwctx->client->pasid;
829 tmp->heap_usage = hwctx->client->heap_usage;
830 tmp->priority = hwctx->qos.priority;
831 tmp->gops = hwctx->qos.gops;
832 tmp->fps = hwctx->qos.fps;
833 tmp->dma_bandwidth = hwctx->qos.dma_bandwidth;
834 tmp->latency = hwctx->qos.latency;
835 tmp->frame_exec_time = hwctx->qos.frame_exec_time;
836 tmp->state = AMDXDNA_HWCTX_STATE_ACTIVE;
837 ndev = hwctx->client->xdna->dev_handle;
838 ret = aie2_query_app_health(ndev, hwctx->fw_ctx_id, &report);
839 if (!ret) {
840 /* Fill in app health report fields */
841 tmp->txn_op_idx = report.txn_op_id;
842 tmp->ctx_pc = report.ctx_pc;
843 tmp->fatal_error_type = report.fatal_info.fatal_type;
844 tmp->fatal_error_exception_type = report.fatal_info.exception_type;
845 tmp->fatal_error_exception_pc = report.fatal_info.exception_pc;
846 tmp->fatal_error_app_module = report.fatal_info.app_module;
847 }
848
849 buf = u64_to_user_ptr(array_args->buffer);
850 size = min(sizeof(*tmp), array_args->element_size);
851
852 if (copy_to_user(buf, tmp, size))
853 return -EFAULT;
854
855 array_args->buffer += size;
856 array_args->num_element--;
857
858 return 0;
859 }
860
aie2_get_hwctx_status(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)861 static int aie2_get_hwctx_status(struct amdxdna_client *client,
862 struct amdxdna_drm_get_info *args)
863 {
864 struct amdxdna_drm_get_array array_args;
865 struct amdxdna_dev *xdna = client->xdna;
866 struct amdxdna_client *tmp_client;
867 int ret;
868
869 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
870
871 array_args.element_size = sizeof(struct amdxdna_drm_query_hwctx);
872 array_args.buffer = args->buffer;
873 array_args.num_element = args->buffer_size / array_args.element_size;
874 list_for_each_entry(tmp_client, &xdna->client_list, node) {
875 ret = amdxdna_hwctx_walk(tmp_client, &array_args,
876 aie2_hwctx_status_cb);
877 if (ret)
878 break;
879 }
880
881 args->buffer_size -= (u32)(array_args.buffer - args->buffer);
882 return 0;
883 }
884
aie2_query_resource_info(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)885 static int aie2_query_resource_info(struct amdxdna_client *client,
886 struct amdxdna_drm_get_info *args)
887 {
888 struct amdxdna_drm_get_resource_info res_info;
889 const struct amdxdna_dev_priv *priv;
890 struct amdxdna_dev_hdl *ndev;
891 struct amdxdna_dev *xdna;
892 u32 buf_sz;
893
894 xdna = client->xdna;
895 ndev = xdna->dev_handle;
896 priv = ndev->priv;
897
898 aie2_update_counters(ndev);
899 res_info.npu_clk_max = priv->dpm_clk_tbl[ndev->max_dpm_level].hclk;
900 res_info.npu_tops_max = ndev->max_tops;
901 res_info.npu_task_max = priv->hwctx_limit;
902 res_info.npu_tops_curr = ndev->curr_tops;
903 res_info.npu_task_curr = ndev->hwctx_num;
904
905 buf_sz = min(args->buffer_size, sizeof(res_info));
906 if (copy_to_user(u64_to_user_ptr(args->buffer), &res_info, buf_sz))
907 return -EFAULT;
908
909 return 0;
910 }
911
aie2_fill_hwctx_map(struct amdxdna_hwctx * hwctx,void * arg)912 static int aie2_fill_hwctx_map(struct amdxdna_hwctx *hwctx, void *arg)
913 {
914 struct amdxdna_dev *xdna = hwctx->client->xdna;
915 u32 *map = arg;
916
917 if (hwctx->fw_ctx_id >= xdna->dev_handle->priv->hwctx_limit) {
918 XDNA_ERR(xdna, "Invalid fw ctx id %d/%d ", hwctx->fw_ctx_id,
919 xdna->dev_handle->priv->hwctx_limit);
920 return -EINVAL;
921 }
922
923 map[hwctx->fw_ctx_id] = hwctx->id;
924 return 0;
925 }
926
aie2_get_telemetry(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)927 static int aie2_get_telemetry(struct amdxdna_client *client,
928 struct amdxdna_drm_get_info *args)
929 {
930 struct amdxdna_drm_query_telemetry_header *header __free(kfree) = NULL;
931 u32 telemetry_data_sz, header_sz, elem_num;
932 struct amdxdna_dev *xdna = client->xdna;
933 struct amdxdna_client *tmp_client;
934 int ret;
935
936 elem_num = xdna->dev_handle->priv->hwctx_limit;
937 header_sz = struct_size(header, map, elem_num);
938 if (args->buffer_size <= header_sz) {
939 XDNA_ERR(xdna, "Invalid buffer size");
940 return -EINVAL;
941 }
942 telemetry_data_sz = args->buffer_size - header_sz;
943
944 header = kzalloc(header_sz, GFP_KERNEL);
945 if (!header)
946 return -ENOMEM;
947
948 if (copy_from_user(header, u64_to_user_ptr(args->buffer), sizeof(*header))) {
949 XDNA_ERR(xdna, "Failed to copy telemetry header from user");
950 return -EFAULT;
951 }
952
953 header->map_num_elements = elem_num;
954 list_for_each_entry(tmp_client, &xdna->client_list, node) {
955 ret = amdxdna_hwctx_walk(tmp_client, &header->map,
956 aie2_fill_hwctx_map);
957 if (ret)
958 return ret;
959 }
960
961 ret = aie2_query_telemetry(xdna->dev_handle,
962 u64_to_user_ptr(args->buffer + header_sz),
963 telemetry_data_sz, header);
964 if (ret) {
965 XDNA_ERR(xdna, "Query telemetry failed ret %d", ret);
966 return ret;
967 }
968
969 if (copy_to_user(u64_to_user_ptr(args->buffer), header, header_sz)) {
970 XDNA_ERR(xdna, "Copy header failed");
971 return -EFAULT;
972 }
973
974 return 0;
975 }
976
aie2_get_preempt_state(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)977 static int aie2_get_preempt_state(struct amdxdna_client *client,
978 struct amdxdna_drm_get_info *args)
979 {
980 struct amdxdna_drm_attribute_state state = {};
981 struct amdxdna_dev *xdna = client->xdna;
982 struct amdxdna_dev_hdl *ndev;
983 u32 buf_sz;
984
985 ndev = xdna->dev_handle;
986 if (args->param == DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE)
987 state.state = ndev->force_preempt_enabled;
988 else if (args->param == DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE)
989 state.state = ndev->frame_boundary_preempt;
990
991 buf_sz = min(args->buffer_size, sizeof(state));
992 if (copy_to_user(u64_to_user_ptr(args->buffer), &state, buf_sz))
993 return -EFAULT;
994
995 return 0;
996 }
997
aie2_get_info(struct amdxdna_client * client,struct amdxdna_drm_get_info * args)998 static int aie2_get_info(struct amdxdna_client *client, struct amdxdna_drm_get_info *args)
999 {
1000 struct amdxdna_dev *xdna = client->xdna;
1001 struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
1002 int ret, idx;
1003
1004 if (!drm_dev_enter(&xdna->ddev, &idx))
1005 return -ENODEV;
1006
1007 ret = amdxdna_pm_resume_get_locked(xdna);
1008 if (ret)
1009 goto dev_exit;
1010
1011 switch (args->param) {
1012 case DRM_AMDXDNA_QUERY_AIE_STATUS:
1013 ret = aie2_get_aie_status(client, args);
1014 break;
1015 case DRM_AMDXDNA_QUERY_AIE_METADATA:
1016 ret = amdxdna_get_metadata(&ndev->aie, client, args);
1017 break;
1018 case DRM_AMDXDNA_QUERY_AIE_VERSION:
1019 ret = aie2_get_aie_version(client, args);
1020 break;
1021 case DRM_AMDXDNA_QUERY_CLOCK_METADATA:
1022 ret = aie2_get_clock_metadata(client, args);
1023 break;
1024 case DRM_AMDXDNA_QUERY_SENSORS:
1025 ret = aie2_get_sensors(client, args);
1026 break;
1027 case DRM_AMDXDNA_QUERY_HW_CONTEXTS:
1028 ret = aie2_get_hwctx_status(client, args);
1029 break;
1030 case DRM_AMDXDNA_QUERY_FIRMWARE_VERSION:
1031 ret = aie2_get_firmware_version(client, args);
1032 break;
1033 case DRM_AMDXDNA_GET_POWER_MODE:
1034 ret = aie2_get_power_mode(client, args);
1035 break;
1036 case DRM_AMDXDNA_QUERY_TELEMETRY:
1037 ret = aie2_get_telemetry(client, args);
1038 break;
1039 case DRM_AMDXDNA_QUERY_RESOURCE_INFO:
1040 ret = aie2_query_resource_info(client, args);
1041 break;
1042 case DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE:
1043 case DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE:
1044 ret = aie2_get_preempt_state(client, args);
1045 break;
1046 default:
1047 XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
1048 ret = -EOPNOTSUPP;
1049 }
1050
1051 amdxdna_pm_suspend_put(xdna);
1052 XDNA_DBG(xdna, "Got param %d", args->param);
1053
1054 dev_exit:
1055 drm_dev_exit(idx);
1056 return ret;
1057 }
1058
aie2_query_ctx_status_array(struct amdxdna_client * client,struct amdxdna_drm_get_array * args)1059 static int aie2_query_ctx_status_array(struct amdxdna_client *client,
1060 struct amdxdna_drm_get_array *args)
1061 {
1062 struct amdxdna_drm_get_array array_args;
1063 struct amdxdna_dev *xdna = client->xdna;
1064 struct amdxdna_client *tmp_client;
1065 int ret;
1066
1067 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
1068
1069 if (args->element_size > SZ_4K || args->num_element > SZ_1K) {
1070 XDNA_DBG(xdna, "Invalid element size %d or number of element %d",
1071 args->element_size, args->num_element);
1072 return -EINVAL;
1073 }
1074
1075 array_args.element_size = min(args->element_size,
1076 sizeof(struct amdxdna_drm_hwctx_entry));
1077 array_args.buffer = args->buffer;
1078 array_args.num_element = args->num_element * args->element_size /
1079 array_args.element_size;
1080 list_for_each_entry(tmp_client, &xdna->client_list, node) {
1081 ret = amdxdna_hwctx_walk(tmp_client, &array_args,
1082 aie2_hwctx_status_cb);
1083 if (ret)
1084 break;
1085 }
1086
1087 args->element_size = array_args.element_size;
1088 args->num_element = (u32)((array_args.buffer - args->buffer) /
1089 args->element_size);
1090
1091 return 0;
1092 }
1093
aie2_get_array(struct amdxdna_client * client,struct amdxdna_drm_get_array * args)1094 static int aie2_get_array(struct amdxdna_client *client,
1095 struct amdxdna_drm_get_array *args)
1096 {
1097 struct amdxdna_dev *xdna = client->xdna;
1098 int ret, idx;
1099
1100 if (!drm_dev_enter(&xdna->ddev, &idx))
1101 return -ENODEV;
1102
1103 ret = amdxdna_pm_resume_get_locked(xdna);
1104 if (ret)
1105 goto dev_exit;
1106
1107 switch (args->param) {
1108 case DRM_AMDXDNA_HW_CONTEXT_ALL:
1109 ret = aie2_query_ctx_status_array(client, args);
1110 break;
1111 case DRM_AMDXDNA_HW_LAST_ASYNC_ERR:
1112 ret = aie2_get_array_async_error(xdna->dev_handle, args);
1113 break;
1114 case DRM_AMDXDNA_BO_USAGE:
1115 ret = amdxdna_drm_get_bo_usage(&xdna->ddev, args);
1116 break;
1117 default:
1118 XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
1119 ret = -EOPNOTSUPP;
1120 }
1121
1122 amdxdna_pm_suspend_put(xdna);
1123 XDNA_DBG(xdna, "Got param %d", args->param);
1124
1125 dev_exit:
1126 drm_dev_exit(idx);
1127 return ret;
1128 }
1129
aie2_set_power_mode(struct amdxdna_client * client,struct amdxdna_drm_set_state * args)1130 static int aie2_set_power_mode(struct amdxdna_client *client,
1131 struct amdxdna_drm_set_state *args)
1132 {
1133 struct amdxdna_drm_set_power_mode power_state;
1134 enum amdxdna_power_mode_type power_mode;
1135 struct amdxdna_dev *xdna = client->xdna;
1136
1137 if (copy_from_user(&power_state, u64_to_user_ptr(args->buffer),
1138 sizeof(power_state))) {
1139 XDNA_ERR(xdna, "Failed to copy power mode request into kernel");
1140 return -EFAULT;
1141 }
1142
1143 if (XDNA_MBZ_DBG(xdna, power_state.pad, sizeof(power_state.pad)))
1144 return -EINVAL;
1145
1146 power_mode = power_state.power_mode;
1147 if (power_mode > POWER_MODE_TURBO) {
1148 XDNA_ERR(xdna, "Invalid power mode %d", power_mode);
1149 return -EINVAL;
1150 }
1151
1152 return aie2_pm_set_mode(xdna->dev_handle, power_mode);
1153 }
1154
aie2_set_preempt_state(struct amdxdna_client * client,struct amdxdna_drm_set_state * args)1155 static int aie2_set_preempt_state(struct amdxdna_client *client,
1156 struct amdxdna_drm_set_state *args)
1157 {
1158 struct amdxdna_dev_hdl *ndev = client->xdna->dev_handle;
1159 struct amdxdna_drm_attribute_state state;
1160 u32 val;
1161 int ret;
1162
1163 if (copy_from_user(&state, u64_to_user_ptr(args->buffer), sizeof(state)))
1164 return -EFAULT;
1165
1166 if (state.state > 1)
1167 return -EINVAL;
1168
1169 if (XDNA_MBZ_DBG(client->xdna, state.pad, sizeof(state.pad)))
1170 return -EINVAL;
1171
1172 if (args->param == DRM_AMDXDNA_SET_FORCE_PREEMPT) {
1173 ndev->force_preempt_enabled = state.state;
1174 } else if (args->param == DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT) {
1175 val = state.state;
1176 ret = aie2_runtime_cfg(ndev, AIE2_RT_CFG_FRAME_BOUNDARY_PREEMPT,
1177 &val);
1178 if (ret)
1179 return ret;
1180
1181 ndev->frame_boundary_preempt = state.state;
1182 }
1183
1184 return 0;
1185 }
1186
aie2_set_state(struct amdxdna_client * client,struct amdxdna_drm_set_state * args)1187 static int aie2_set_state(struct amdxdna_client *client,
1188 struct amdxdna_drm_set_state *args)
1189 {
1190 struct amdxdna_dev *xdna = client->xdna;
1191 int ret, idx;
1192
1193 if (!drm_dev_enter(&xdna->ddev, &idx))
1194 return -ENODEV;
1195
1196 ret = amdxdna_pm_resume_get_locked(xdna);
1197 if (ret)
1198 goto dev_exit;
1199
1200 switch (args->param) {
1201 case DRM_AMDXDNA_SET_POWER_MODE:
1202 ret = aie2_set_power_mode(client, args);
1203 break;
1204 case DRM_AMDXDNA_SET_FORCE_PREEMPT:
1205 case DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT:
1206 ret = aie2_set_preempt_state(client, args);
1207 break;
1208 default:
1209 XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
1210 ret = -EOPNOTSUPP;
1211 break;
1212 }
1213
1214 amdxdna_pm_suspend_put(xdna);
1215 dev_exit:
1216 drm_dev_exit(idx);
1217 return ret;
1218 }
1219
aie2_get_dev_rev(struct amdxdna_dev * xdna,u32 * rev)1220 static int aie2_get_dev_rev(struct amdxdna_dev *xdna, u32 *rev)
1221 {
1222 struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
1223 enum aie2_dev_revision aie2_rev;
1224 int ret;
1225
1226 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
1227 ret = aie2_get_dev_revision(ndev, &aie2_rev);
1228
1229 if (!ret)
1230 *rev = (u32)aie2_rev;
1231
1232 return ret;
1233 }
1234
1235 const struct amdxdna_dev_ops aie2_ops = {
1236 .init = aie2_init,
1237 .fini = aie2_fini,
1238 .resume = aie2_hw_resume,
1239 .suspend = aie2_hw_suspend,
1240 .get_aie_info = aie2_get_info,
1241 .set_aie_state = aie2_set_state,
1242 .hwctx_init = aie2_hwctx_init,
1243 .hwctx_fini = aie2_hwctx_fini,
1244 .hwctx_config = aie2_hwctx_config,
1245 .hwctx_sync_debug_bo = aie2_hwctx_sync_debug_bo,
1246 .cmd_submit = aie2_cmd_submit,
1247 .hmm_invalidate = aie2_hmm_invalidate,
1248 .get_array = aie2_get_array,
1249 .get_dev_revision = aie2_get_dev_rev,
1250 .hwctx_heap_expand = aie2_hwctx_heap_expand,
1251 };
1252