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