xref: /linux/drivers/accel/amdxdna/aie2_pci.c (revision 4b99990cdf9560e8a071640baf19f312e6ae02f4)
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 
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 	ndev->dev_status = AIE2_DEV_START;
424 
425 	return 0;
426 
427 stop_fw:
428 	aie2_suspend_fw(ndev);
429 	xdna_mailbox_stop_channel(ndev->aie.mgmt_chann);
430 stop_psp:
431 	aie_psp_stop(ndev->aie.psp_hdl);
432 fini_smu:
433 	aie2_smu_fini(ndev);
434 free_channel:
435 	xdna_mailbox_free_channel(ndev->aie.mgmt_chann);
436 	ndev->aie.mgmt_chann = NULL;
437 disable_dev:
438 	pci_disable_device(pdev);
439 
440 	return ret;
441 }
442 
443 static int aie2_hw_suspend(struct amdxdna_dev *xdna)
444 {
445 	struct amdxdna_client *client;
446 
447 	list_for_each_entry(client, &xdna->client_list, node)
448 		aie2_hwctx_suspend(client);
449 
450 	aie2_hw_stop(xdna);
451 
452 	return 0;
453 }
454 
455 static int aie2_hw_resume(struct amdxdna_dev *xdna)
456 {
457 	struct amdxdna_client *client;
458 	int ret;
459 
460 	ret = aie2_hw_start(xdna);
461 	if (ret) {
462 		XDNA_ERR(xdna, "Start hardware failed, %d", ret);
463 		return ret;
464 	}
465 
466 	list_for_each_entry(client, &xdna->client_list, node) {
467 		ret = aie2_hwctx_resume(client);
468 		if (ret)
469 			break;
470 	}
471 
472 	return ret;
473 }
474 
475 static int aie2_init(struct amdxdna_dev *xdna)
476 {
477 	struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev);
478 	void __iomem *tbl[PCI_NUM_RESOURCES] = {0};
479 	struct init_config xrs_cfg = { 0 };
480 	struct amdxdna_dev_hdl *ndev;
481 	struct psp_config psp_conf = { 0 };
482 	struct smu_config smu_conf;
483 	const struct firmware *fw;
484 	unsigned long bars = 0;
485 	char *fw_full_path;
486 	int i, nvec, ret;
487 
488 	if (!hypervisor_is_type(X86_HYPER_NATIVE)) {
489 		XDNA_ERR(xdna, "Running under hypervisor not supported");
490 		return -EINVAL;
491 	}
492 
493 	if (!xdna->group) {
494 		XDNA_ERR(xdna, "Running without IOMMU not supported");
495 		return -EINVAL;
496 	}
497 
498 	ndev = drmm_kzalloc(&xdna->ddev, sizeof(*ndev), GFP_KERNEL);
499 	if (!ndev)
500 		return -ENOMEM;
501 
502 	ndev->priv = xdna->dev_info->dev_priv;
503 	ndev->aie.xdna = xdna;
504 
505 	for (i = 0; i < ARRAY_SIZE(npu_fw); i++) {
506 		fw_full_path = kasprintf(GFP_KERNEL, "%s%s", ndev->priv->fw_path, npu_fw[i]);
507 		if (!fw_full_path)
508 			return -ENOMEM;
509 
510 		ret = firmware_request_nowarn(&fw, fw_full_path, &pdev->dev);
511 		kfree(fw_full_path);
512 		if (!ret) {
513 			XDNA_INFO(xdna, "Load firmware %s%s", ndev->priv->fw_path, npu_fw[i]);
514 			break;
515 		}
516 	}
517 
518 	if (ret) {
519 		XDNA_ERR(xdna, "failed to request_firmware %s, ret %d",
520 			 ndev->priv->fw_path, ret);
521 		return ret;
522 	}
523 
524 	ret = pcim_enable_device(pdev);
525 	if (ret) {
526 		XDNA_ERR(xdna, "pcim enable device failed, ret %d", ret);
527 		goto release_fw;
528 	}
529 
530 	for (i = 0; i < PSP_MAX_REGS; i++)
531 		set_bit(PSP_REG_BAR(ndev, i), &bars);
532 	for (i = 0; i < SMU_MAX_REGS; i++)
533 		set_bit(SMU_REG_BAR(ndev, i), &bars);
534 
535 	set_bit(xdna->dev_info->sram_bar, &bars);
536 	set_bit(xdna->dev_info->mbox_bar, &bars);
537 
538 	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
539 		if (!test_bit(i, &bars))
540 			continue;
541 		tbl[i] = pcim_iomap(pdev, i, 0);
542 		if (!tbl[i]) {
543 			XDNA_ERR(xdna, "map bar %d failed", i);
544 			ret = -ENOMEM;
545 			goto release_fw;
546 		}
547 	}
548 
549 	ndev->sram_base = tbl[xdna->dev_info->sram_bar];
550 	ndev->mbox_base = tbl[xdna->dev_info->mbox_bar];
551 
552 	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
553 	if (ret) {
554 		XDNA_ERR(xdna, "Failed to set DMA mask: %d", ret);
555 		goto release_fw;
556 	}
557 
558 	nvec = pci_msix_vec_count(pdev);
559 	if (nvec <= 0) {
560 		XDNA_ERR(xdna, "does not get number of interrupt vector");
561 		ret = -EINVAL;
562 		goto release_fw;
563 	}
564 
565 	ret = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_MSIX);
566 	if (ret < 0) {
567 		XDNA_ERR(xdna, "failed to alloc irq vectors, ret %d", ret);
568 		goto release_fw;
569 	}
570 
571 	psp_conf.fw_size = fw->size;
572 	psp_conf.fw_buf = fw->data;
573 	psp_conf.arg2_mask = GENMASK(23, 0);
574 	psp_conf.notify_val = 1;
575 	for (i = 0; i < PSP_MAX_REGS; i++)
576 		psp_conf.psp_regs[i] = tbl[PSP_REG_BAR(ndev, i)] + PSP_REG_OFF(ndev, i);
577 	ndev->aie.psp_hdl = aiem_psp_create(&xdna->ddev, &psp_conf);
578 	if (!ndev->aie.psp_hdl) {
579 		XDNA_ERR(xdna, "failed to create psp");
580 		ret = -ENOMEM;
581 		goto release_fw;
582 	}
583 
584 	for (i = 0; i < SMU_MAX_REGS; i++)
585 		smu_conf.smu_regs[i] = tbl[SMU_REG_BAR(ndev, i)] + SMU_REG_OFF(ndev, i);
586 	ndev->aie.smu_hdl = aiem_smu_create(&xdna->ddev, &smu_conf);
587 	if (!ndev->aie.smu_hdl) {
588 		XDNA_ERR(xdna, "failed to create smu");
589 		ret = -ENOMEM;
590 		goto release_fw;
591 	}
592 	xdna->dev_handle = ndev;
593 
594 	ret = aie2_hw_start(xdna);
595 	if (ret) {
596 		XDNA_ERR(xdna, "start npu failed, ret %d", ret);
597 		goto release_fw;
598 	}
599 
600 	xrs_cfg.clk_list.num_levels = ndev->max_dpm_level + 1;
601 	for (i = 0; i < xrs_cfg.clk_list.num_levels; i++)
602 		xrs_cfg.clk_list.cu_clk_list[i] = ndev->priv->dpm_clk_tbl[i].hclk;
603 	xrs_cfg.sys_eff_factor = 2;
604 	xrs_cfg.ddev = &xdna->ddev;
605 	xrs_cfg.actions = &aie2_xrs_actions;
606 	xrs_cfg.total_col = ndev->total_col;
607 
608 	xdna->xrs_hdl = xrsm_init(&xrs_cfg);
609 	if (!xdna->xrs_hdl) {
610 		XDNA_ERR(xdna, "Initialize resolver failed");
611 		ret = -EINVAL;
612 		goto stop_hw;
613 	}
614 
615 	release_firmware(fw);
616 	aie2_msg_init(ndev);
617 	amdxdna_vbnv_init(xdna);
618 	amdxdna_pm_init(xdna);
619 	return 0;
620 
621 stop_hw:
622 	aie2_hw_stop(xdna);
623 release_fw:
624 	release_firmware(fw);
625 
626 	return ret;
627 }
628 
629 static void aie2_fini(struct amdxdna_dev *xdna)
630 {
631 	amdxdna_pm_fini(xdna);
632 	aie2_hw_stop(xdna);
633 }
634 
635 static int aie2_get_aie_status(struct amdxdna_client *client,
636 			       struct amdxdna_drm_get_info *args)
637 {
638 	struct amdxdna_drm_query_aie_status status = {};
639 	struct amdxdna_dev *xdna = client->xdna;
640 	struct amdxdna_dev_hdl *ndev;
641 	u32 buf_sz;
642 	int ret;
643 
644 	ndev = xdna->dev_handle;
645 	buf_sz = min(args->buffer_size, sizeof(status));
646 	if (copy_from_user(&status, u64_to_user_ptr(args->buffer), buf_sz)) {
647 		XDNA_ERR(xdna, "Failed to copy AIE request into kernel");
648 		return -EFAULT;
649 	}
650 
651 	ret = aie2_query_status(ndev, u64_to_user_ptr(status.buffer),
652 				status.buffer_size, &status.cols_filled);
653 	if (ret) {
654 		XDNA_ERR(xdna, "Failed to get AIE status info. Ret: %d", ret);
655 		return ret;
656 	}
657 
658 	if (copy_to_user(u64_to_user_ptr(args->buffer), &status, buf_sz)) {
659 		XDNA_ERR(xdna, "Failed to copy AIE request info to user space");
660 		return -EFAULT;
661 	}
662 
663 	return 0;
664 }
665 
666 static int aie2_get_aie_version(struct amdxdna_client *client,
667 				struct amdxdna_drm_get_info *args)
668 {
669 	struct amdxdna_drm_query_aie_version version;
670 	struct amdxdna_dev *xdna = client->xdna;
671 	struct amdxdna_dev_hdl *ndev;
672 	u32 buf_sz;
673 
674 	ndev = xdna->dev_handle;
675 	version.major = ndev->version.major;
676 	version.minor = ndev->version.minor;
677 
678 	buf_sz = min(args->buffer_size, sizeof(version));
679 	if (copy_to_user(u64_to_user_ptr(args->buffer), &version, buf_sz))
680 		return -EFAULT;
681 
682 	return 0;
683 }
684 
685 static int aie2_get_firmware_version(struct amdxdna_client *client,
686 				     struct amdxdna_drm_get_info *args)
687 {
688 	struct amdxdna_drm_query_firmware_version version;
689 	struct amdxdna_dev *xdna = client->xdna;
690 	u32 buf_sz;
691 
692 	version.major = xdna->fw_ver.major;
693 	version.minor = xdna->fw_ver.minor;
694 	version.patch = xdna->fw_ver.sub;
695 	version.build = xdna->fw_ver.build;
696 
697 	buf_sz = min(args->buffer_size, sizeof(version));
698 	if (copy_to_user(u64_to_user_ptr(args->buffer), &version, buf_sz))
699 		return -EFAULT;
700 
701 	return 0;
702 }
703 
704 static int aie2_get_power_mode(struct amdxdna_client *client,
705 			       struct amdxdna_drm_get_info *args)
706 {
707 	struct amdxdna_drm_get_power_mode mode = {};
708 	struct amdxdna_dev *xdna = client->xdna;
709 	struct amdxdna_dev_hdl *ndev;
710 	u32 buf_sz;
711 
712 	ndev = xdna->dev_handle;
713 	mode.power_mode = ndev->pw_mode;
714 
715 	buf_sz = min(args->buffer_size, sizeof(mode));
716 	if (copy_to_user(u64_to_user_ptr(args->buffer), &mode, buf_sz))
717 		return -EFAULT;
718 
719 	return 0;
720 }
721 
722 static int aie2_get_clock_metadata(struct amdxdna_client *client,
723 				   struct amdxdna_drm_get_info *args)
724 {
725 	struct amdxdna_drm_query_clock_metadata *clock;
726 	struct amdxdna_dev *xdna = client->xdna;
727 	struct amdxdna_dev_hdl *ndev;
728 	int ret = 0;
729 	u32 buf_sz;
730 
731 	ndev = xdna->dev_handle;
732 	clock = kzalloc_obj(*clock);
733 	if (!clock)
734 		return -ENOMEM;
735 
736 	aie2_update_counters(ndev);
737 	snprintf(clock->mp_npu_clock.name, sizeof(clock->mp_npu_clock.name),
738 		 "MP-NPU Clock");
739 	clock->mp_npu_clock.freq_mhz = ndev->npuclk_freq;
740 	snprintf(clock->h_clock.name, sizeof(clock->h_clock.name), "H Clock");
741 	clock->h_clock.freq_mhz = ndev->hclk_freq;
742 
743 	buf_sz = min(args->buffer_size, sizeof(*clock));
744 	if (copy_to_user(u64_to_user_ptr(args->buffer), clock, buf_sz))
745 		ret = -EFAULT;
746 
747 	kfree(clock);
748 	return ret;
749 }
750 
751 static int aie2_get_sensors(struct amdxdna_client *client,
752 			    struct amdxdna_drm_get_info *args)
753 {
754 	struct amdxdna_dev_hdl *ndev = client->xdna->dev_handle;
755 	struct amdxdna_drm_query_sensor sensor = {};
756 	struct amd_pmf_npu_metrics npu_metrics;
757 	u32 sensors_count = 0, i;
758 	int ret;
759 
760 	ret = AIE2_GET_PMF_NPU_METRICS(&npu_metrics);
761 	if (ret)
762 		return ret;
763 
764 	sensor.type = AMDXDNA_SENSOR_TYPE_POWER;
765 	sensor.input = npu_metrics.npu_power;
766 	sensor.unitm = -3;
767 	scnprintf(sensor.label, sizeof(sensor.label), "Total Power");
768 	scnprintf(sensor.units, sizeof(sensor.units), "mW");
769 
770 	if (args->buffer_size < sizeof(sensor))
771 		goto out;
772 
773 	if (copy_to_user(u64_to_user_ptr(args->buffer), &sensor, sizeof(sensor)))
774 		return -EFAULT;
775 
776 	args->buffer_size -= sizeof(sensor);
777 	sensors_count++;
778 
779 	for (i = 0; i < min_t(u32, ndev->total_col, 8); i++) {
780 		memset(&sensor, 0, sizeof(sensor));
781 		sensor.input = npu_metrics.npu_busy[i];
782 		sensor.type = AMDXDNA_SENSOR_TYPE_COLUMN_UTILIZATION;
783 		sensor.unitm = 0;
784 		scnprintf(sensor.label, sizeof(sensor.label), "Column %d Utilization", i);
785 		scnprintf(sensor.units, sizeof(sensor.units), "%%");
786 
787 		if (args->buffer_size < sizeof(sensor))
788 			goto out;
789 
790 		if (copy_to_user(u64_to_user_ptr(args->buffer) + sensors_count * sizeof(sensor),
791 				 &sensor, sizeof(sensor)))
792 			return -EFAULT;
793 
794 		args->buffer_size -= sizeof(sensor);
795 		sensors_count++;
796 	}
797 
798 out:
799 	args->buffer_size = sensors_count * sizeof(sensor);
800 
801 	return 0;
802 }
803 
804 static int aie2_hwctx_status_cb(struct amdxdna_hwctx *hwctx, void *arg)
805 {
806 	struct amdxdna_drm_hwctx_entry *tmp __free(kfree) = NULL;
807 	struct amdxdna_drm_get_array *array_args = arg;
808 	struct amdxdna_drm_hwctx_entry __user *buf;
809 	struct app_health_report report;
810 	struct amdxdna_dev_hdl *ndev;
811 	u32 size;
812 	int ret;
813 
814 	if (!array_args->num_element)
815 		return -EINVAL;
816 
817 	tmp = kzalloc_obj(*tmp);
818 	if (!tmp)
819 		return -ENOMEM;
820 
821 	tmp->pid = hwctx->client->pid;
822 	tmp->context_id = hwctx->id;
823 	tmp->start_col = hwctx->start_col;
824 	tmp->num_col = hwctx->num_col;
825 	tmp->command_submissions = hwctx->priv->seq;
826 	tmp->command_completions = hwctx->priv->completed;
827 	tmp->pasid = hwctx->client->pasid;
828 	tmp->heap_usage = hwctx->client->heap_usage;
829 	tmp->priority = hwctx->qos.priority;
830 	tmp->gops = hwctx->qos.gops;
831 	tmp->fps = hwctx->qos.fps;
832 	tmp->dma_bandwidth = hwctx->qos.dma_bandwidth;
833 	tmp->latency = hwctx->qos.latency;
834 	tmp->frame_exec_time = hwctx->qos.frame_exec_time;
835 	tmp->state = AMDXDNA_HWCTX_STATE_ACTIVE;
836 	ndev = hwctx->client->xdna->dev_handle;
837 	ret = aie2_query_app_health(ndev, hwctx->fw_ctx_id, &report);
838 	if (!ret) {
839 		/* Fill in app health report fields */
840 		tmp->txn_op_idx = report.txn_op_id;
841 		tmp->ctx_pc = report.ctx_pc;
842 		tmp->fatal_error_type = report.fatal_info.fatal_type;
843 		tmp->fatal_error_exception_type = report.fatal_info.exception_type;
844 		tmp->fatal_error_exception_pc = report.fatal_info.exception_pc;
845 		tmp->fatal_error_app_module = report.fatal_info.app_module;
846 	}
847 
848 	buf = u64_to_user_ptr(array_args->buffer);
849 	size = min(sizeof(*tmp), array_args->element_size);
850 
851 	if (copy_to_user(buf, tmp, size))
852 		return -EFAULT;
853 
854 	array_args->buffer += size;
855 	array_args->num_element--;
856 
857 	return 0;
858 }
859 
860 static int aie2_get_hwctx_status(struct amdxdna_client *client,
861 				 struct amdxdna_drm_get_info *args)
862 {
863 	struct amdxdna_drm_get_array array_args;
864 	struct amdxdna_dev *xdna = client->xdna;
865 	struct amdxdna_client *tmp_client;
866 	int ret;
867 
868 	drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
869 
870 	array_args.element_size = sizeof(struct amdxdna_drm_query_hwctx);
871 	array_args.buffer = args->buffer;
872 	array_args.num_element = args->buffer_size / array_args.element_size;
873 	list_for_each_entry(tmp_client, &xdna->client_list, node) {
874 		ret = amdxdna_hwctx_walk(tmp_client, &array_args,
875 					 aie2_hwctx_status_cb);
876 		if (ret)
877 			break;
878 	}
879 
880 	args->buffer_size -= (u32)(array_args.buffer - args->buffer);
881 	return 0;
882 }
883 
884 static int aie2_query_resource_info(struct amdxdna_client *client,
885 				    struct amdxdna_drm_get_info *args)
886 {
887 	struct amdxdna_drm_get_resource_info res_info;
888 	const struct amdxdna_dev_priv *priv;
889 	struct amdxdna_dev_hdl *ndev;
890 	struct amdxdna_dev *xdna;
891 	u32 buf_sz;
892 
893 	xdna = client->xdna;
894 	ndev = xdna->dev_handle;
895 	priv = ndev->priv;
896 
897 	aie2_update_counters(ndev);
898 	res_info.npu_clk_max = priv->dpm_clk_tbl[ndev->max_dpm_level].hclk;
899 	res_info.npu_tops_max = ndev->max_tops;
900 	res_info.npu_task_max = priv->hwctx_limit;
901 	res_info.npu_tops_curr = ndev->curr_tops;
902 	res_info.npu_task_curr = ndev->hwctx_num;
903 
904 	buf_sz = min(args->buffer_size, sizeof(res_info));
905 	if (copy_to_user(u64_to_user_ptr(args->buffer), &res_info, buf_sz))
906 		return -EFAULT;
907 
908 	return 0;
909 }
910 
911 static int aie2_fill_hwctx_map(struct amdxdna_hwctx *hwctx, void *arg)
912 {
913 	struct amdxdna_dev *xdna = hwctx->client->xdna;
914 	u32 *map = arg;
915 
916 	if (hwctx->fw_ctx_id >= xdna->dev_handle->priv->hwctx_limit) {
917 		XDNA_ERR(xdna, "Invalid fw ctx id %d/%d ", hwctx->fw_ctx_id,
918 			 xdna->dev_handle->priv->hwctx_limit);
919 		return -EINVAL;
920 	}
921 
922 	map[hwctx->fw_ctx_id] = hwctx->id;
923 	return 0;
924 }
925 
926 static int aie2_get_telemetry(struct amdxdna_client *client,
927 			      struct amdxdna_drm_get_info *args)
928 {
929 	struct amdxdna_drm_query_telemetry_header *header __free(kfree) = NULL;
930 	u32 telemetry_data_sz, header_sz, elem_num;
931 	struct amdxdna_dev *xdna = client->xdna;
932 	struct amdxdna_client *tmp_client;
933 	int ret;
934 
935 	elem_num = xdna->dev_handle->priv->hwctx_limit;
936 	header_sz = struct_size(header, map, elem_num);
937 	if (args->buffer_size <= header_sz) {
938 		XDNA_ERR(xdna, "Invalid buffer size");
939 		return -EINVAL;
940 	}
941 	telemetry_data_sz = args->buffer_size - header_sz;
942 
943 	header = kzalloc(header_sz, GFP_KERNEL);
944 	if (!header)
945 		return -ENOMEM;
946 
947 	if (copy_from_user(header, u64_to_user_ptr(args->buffer), sizeof(*header))) {
948 		XDNA_ERR(xdna, "Failed to copy telemetry header from user");
949 		return -EFAULT;
950 	}
951 
952 	header->map_num_elements = elem_num;
953 	list_for_each_entry(tmp_client, &xdna->client_list, node) {
954 		ret = amdxdna_hwctx_walk(tmp_client, &header->map,
955 					 aie2_fill_hwctx_map);
956 		if (ret)
957 			return ret;
958 	}
959 
960 	ret = aie2_query_telemetry(xdna->dev_handle,
961 				   u64_to_user_ptr(args->buffer + header_sz),
962 				   telemetry_data_sz, header);
963 	if (ret) {
964 		XDNA_ERR(xdna, "Query telemetry failed ret %d", ret);
965 		return ret;
966 	}
967 
968 	if (copy_to_user(u64_to_user_ptr(args->buffer), header, header_sz)) {
969 		XDNA_ERR(xdna, "Copy header failed");
970 		return -EFAULT;
971 	}
972 
973 	return 0;
974 }
975 
976 static int aie2_get_preempt_state(struct amdxdna_client *client,
977 				  struct amdxdna_drm_get_info *args)
978 {
979 	struct amdxdna_drm_attribute_state state = {};
980 	struct amdxdna_dev *xdna = client->xdna;
981 	struct amdxdna_dev_hdl *ndev;
982 	u32 buf_sz;
983 
984 	ndev = xdna->dev_handle;
985 	if (args->param == DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE)
986 		state.state = ndev->force_preempt_enabled;
987 	else if (args->param == DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE)
988 		state.state = ndev->frame_boundary_preempt;
989 
990 	buf_sz = min(args->buffer_size, sizeof(state));
991 	if (copy_to_user(u64_to_user_ptr(args->buffer), &state, buf_sz))
992 		return -EFAULT;
993 
994 	return 0;
995 }
996 
997 static int aie2_get_info(struct amdxdna_client *client, struct amdxdna_drm_get_info *args)
998 {
999 	struct amdxdna_dev *xdna = client->xdna;
1000 	struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
1001 	int ret, idx;
1002 
1003 	if (!drm_dev_enter(&xdna->ddev, &idx))
1004 		return -ENODEV;
1005 
1006 	ret = amdxdna_pm_resume_get_locked(xdna);
1007 	if (ret)
1008 		goto dev_exit;
1009 
1010 	switch (args->param) {
1011 	case DRM_AMDXDNA_QUERY_AIE_STATUS:
1012 		ret = aie2_get_aie_status(client, args);
1013 		break;
1014 	case DRM_AMDXDNA_QUERY_AIE_METADATA:
1015 		ret = amdxdna_get_metadata(&ndev->aie, client, args);
1016 		break;
1017 	case DRM_AMDXDNA_QUERY_AIE_VERSION:
1018 		ret = aie2_get_aie_version(client, args);
1019 		break;
1020 	case DRM_AMDXDNA_QUERY_CLOCK_METADATA:
1021 		ret = aie2_get_clock_metadata(client, args);
1022 		break;
1023 	case DRM_AMDXDNA_QUERY_SENSORS:
1024 		ret = aie2_get_sensors(client, args);
1025 		break;
1026 	case DRM_AMDXDNA_QUERY_HW_CONTEXTS:
1027 		ret = aie2_get_hwctx_status(client, args);
1028 		break;
1029 	case DRM_AMDXDNA_QUERY_FIRMWARE_VERSION:
1030 		ret = aie2_get_firmware_version(client, args);
1031 		break;
1032 	case DRM_AMDXDNA_GET_POWER_MODE:
1033 		ret = aie2_get_power_mode(client, args);
1034 		break;
1035 	case DRM_AMDXDNA_QUERY_TELEMETRY:
1036 		ret = aie2_get_telemetry(client, args);
1037 		break;
1038 	case DRM_AMDXDNA_QUERY_RESOURCE_INFO:
1039 		ret = aie2_query_resource_info(client, args);
1040 		break;
1041 	case DRM_AMDXDNA_GET_FORCE_PREEMPT_STATE:
1042 	case DRM_AMDXDNA_GET_FRAME_BOUNDARY_PREEMPT_STATE:
1043 		ret = aie2_get_preempt_state(client, args);
1044 		break;
1045 	default:
1046 		XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
1047 		ret = -EOPNOTSUPP;
1048 	}
1049 
1050 	amdxdna_pm_suspend_put(xdna);
1051 	XDNA_DBG(xdna, "Got param %d", args->param);
1052 
1053 dev_exit:
1054 	drm_dev_exit(idx);
1055 	return ret;
1056 }
1057 
1058 static int aie2_query_ctx_status_array(struct amdxdna_client *client,
1059 				       struct amdxdna_drm_get_array *args)
1060 {
1061 	struct amdxdna_drm_get_array array_args;
1062 	struct amdxdna_dev *xdna = client->xdna;
1063 	struct amdxdna_client *tmp_client;
1064 	int ret;
1065 
1066 	drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
1067 
1068 	if (args->element_size > SZ_4K || args->num_element > SZ_1K) {
1069 		XDNA_DBG(xdna, "Invalid element size %d or number of element %d",
1070 			 args->element_size, args->num_element);
1071 		return -EINVAL;
1072 	}
1073 
1074 	array_args.element_size = min(args->element_size,
1075 				      sizeof(struct amdxdna_drm_hwctx_entry));
1076 	array_args.buffer = args->buffer;
1077 	array_args.num_element = args->num_element * args->element_size /
1078 				array_args.element_size;
1079 	list_for_each_entry(tmp_client, &xdna->client_list, node) {
1080 		ret = amdxdna_hwctx_walk(tmp_client, &array_args,
1081 					 aie2_hwctx_status_cb);
1082 		if (ret)
1083 			break;
1084 	}
1085 
1086 	args->element_size = array_args.element_size;
1087 	args->num_element = (u32)((array_args.buffer - args->buffer) /
1088 				  args->element_size);
1089 
1090 	return 0;
1091 }
1092 
1093 static int aie2_get_array(struct amdxdna_client *client,
1094 			  struct amdxdna_drm_get_array *args)
1095 {
1096 	struct amdxdna_dev *xdna = client->xdna;
1097 	int ret, idx;
1098 
1099 	if (!drm_dev_enter(&xdna->ddev, &idx))
1100 		return -ENODEV;
1101 
1102 	ret = amdxdna_pm_resume_get_locked(xdna);
1103 	if (ret)
1104 		goto dev_exit;
1105 
1106 	switch (args->param) {
1107 	case DRM_AMDXDNA_HW_CONTEXT_ALL:
1108 		ret = aie2_query_ctx_status_array(client, args);
1109 		break;
1110 	case DRM_AMDXDNA_HW_LAST_ASYNC_ERR:
1111 		ret = aie2_get_array_async_error(xdna->dev_handle, args);
1112 		break;
1113 	case DRM_AMDXDNA_BO_USAGE:
1114 		ret = amdxdna_drm_get_bo_usage(&xdna->ddev, args);
1115 		break;
1116 	default:
1117 		XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
1118 		ret = -EOPNOTSUPP;
1119 	}
1120 
1121 	amdxdna_pm_suspend_put(xdna);
1122 	XDNA_DBG(xdna, "Got param %d", args->param);
1123 
1124 dev_exit:
1125 	drm_dev_exit(idx);
1126 	return ret;
1127 }
1128 
1129 static int aie2_set_power_mode(struct amdxdna_client *client,
1130 			       struct amdxdna_drm_set_state *args)
1131 {
1132 	struct amdxdna_drm_set_power_mode power_state;
1133 	enum amdxdna_power_mode_type power_mode;
1134 	struct amdxdna_dev *xdna = client->xdna;
1135 
1136 	if (copy_from_user(&power_state, u64_to_user_ptr(args->buffer),
1137 			   sizeof(power_state))) {
1138 		XDNA_ERR(xdna, "Failed to copy power mode request into kernel");
1139 		return -EFAULT;
1140 	}
1141 
1142 	if (XDNA_MBZ_DBG(xdna, power_state.pad, sizeof(power_state.pad)))
1143 		return -EINVAL;
1144 
1145 	power_mode = power_state.power_mode;
1146 	if (power_mode > POWER_MODE_TURBO) {
1147 		XDNA_ERR(xdna, "Invalid power mode %d", power_mode);
1148 		return -EINVAL;
1149 	}
1150 
1151 	return aie2_pm_set_mode(xdna->dev_handle, power_mode);
1152 }
1153 
1154 static int aie2_set_preempt_state(struct amdxdna_client *client,
1155 				  struct amdxdna_drm_set_state *args)
1156 {
1157 	struct amdxdna_dev_hdl *ndev = client->xdna->dev_handle;
1158 	struct amdxdna_drm_attribute_state state;
1159 	u32 val;
1160 	int ret;
1161 
1162 	if (copy_from_user(&state, u64_to_user_ptr(args->buffer), sizeof(state)))
1163 		return -EFAULT;
1164 
1165 	if (state.state > 1)
1166 		return -EINVAL;
1167 
1168 	if (XDNA_MBZ_DBG(client->xdna, state.pad, sizeof(state.pad)))
1169 		return -EINVAL;
1170 
1171 	if (args->param == DRM_AMDXDNA_SET_FORCE_PREEMPT) {
1172 		ndev->force_preempt_enabled = state.state;
1173 	} else if (args->param == DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT) {
1174 		val = state.state;
1175 		ret = aie2_runtime_cfg(ndev, AIE2_RT_CFG_FRAME_BOUNDARY_PREEMPT,
1176 				       &val);
1177 		if (ret)
1178 			return ret;
1179 
1180 		ndev->frame_boundary_preempt = state.state;
1181 	}
1182 
1183 	return 0;
1184 }
1185 
1186 static int aie2_set_state(struct amdxdna_client *client,
1187 			  struct amdxdna_drm_set_state *args)
1188 {
1189 	struct amdxdna_dev *xdna = client->xdna;
1190 	int ret, idx;
1191 
1192 	if (!drm_dev_enter(&xdna->ddev, &idx))
1193 		return -ENODEV;
1194 
1195 	ret = amdxdna_pm_resume_get_locked(xdna);
1196 	if (ret)
1197 		goto dev_exit;
1198 
1199 	switch (args->param) {
1200 	case DRM_AMDXDNA_SET_POWER_MODE:
1201 		ret = aie2_set_power_mode(client, args);
1202 		break;
1203 	case DRM_AMDXDNA_SET_FORCE_PREEMPT:
1204 	case DRM_AMDXDNA_SET_FRAME_BOUNDARY_PREEMPT:
1205 		ret = aie2_set_preempt_state(client, args);
1206 		break;
1207 	default:
1208 		XDNA_ERR(xdna, "Not supported request parameter %u", args->param);
1209 		ret = -EOPNOTSUPP;
1210 		break;
1211 	}
1212 
1213 	amdxdna_pm_suspend_put(xdna);
1214 dev_exit:
1215 	drm_dev_exit(idx);
1216 	return ret;
1217 }
1218 
1219 static int aie2_get_dev_rev(struct amdxdna_dev *xdna, u32 *rev)
1220 {
1221 	struct amdxdna_dev_hdl *ndev = xdna->dev_handle;
1222 	enum aie2_dev_revision aie2_rev;
1223 	int ret;
1224 
1225 	drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock));
1226 	ret = aie2_get_dev_revision(ndev, &aie2_rev);
1227 
1228 	if (!ret)
1229 		*rev = (u32)aie2_rev;
1230 
1231 	return ret;
1232 }
1233 
1234 const struct amdxdna_dev_ops aie2_ops = {
1235 	.init = aie2_init,
1236 	.fini = aie2_fini,
1237 	.resume = aie2_hw_resume,
1238 	.suspend = aie2_hw_suspend,
1239 	.get_aie_info = aie2_get_info,
1240 	.set_aie_state = aie2_set_state,
1241 	.hwctx_init = aie2_hwctx_init,
1242 	.hwctx_fini = aie2_hwctx_fini,
1243 	.hwctx_config = aie2_hwctx_config,
1244 	.hwctx_sync_debug_bo = aie2_hwctx_sync_debug_bo,
1245 	.cmd_submit = aie2_cmd_submit,
1246 	.hmm_invalidate = aie2_hmm_invalidate,
1247 	.get_array = aie2_get_array,
1248 	.get_dev_revision = aie2_get_dev_rev,
1249 	.hwctx_heap_expand = aie2_hwctx_heap_expand,
1250 };
1251