xref: /linux/drivers/accel/amdxdna/aie2_pci.c (revision fab183d632628381b466a41479489541ac0e29a0)
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