File Index
Files and directories
Sign in
FILE

aie2_pci.c

File preview with syntax highlighting.

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