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