Lines Matching +full:pm +full:- +full:alive

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2023-2024, Advanced Micro Devices, Inc.
56 struct amdxdna_dev *xdna = ndev->xdna; in aie2_check_protocol()
60 * ndev->priv->protocol_major and protocol_minor. in aie2_check_protocol()
65 if (ndev->priv->protocol_major != fw_major) { in aie2_check_protocol()
68 return -EINVAL; in aie2_check_protocol()
75 if (ndev->priv->protocol_minor > fw_minor) { in aie2_check_protocol()
77 return -EINVAL; in aie2_check_protocol()
84 struct amdxdna_dev *xdna = ndev->xdna; in aie2_dump_chann_info_debug()
86 XDNA_DBG(xdna, "i2x tail 0x%x", ndev->mgmt_i2x.mb_tail_ptr_reg); in aie2_dump_chann_info_debug()
87 XDNA_DBG(xdna, "i2x head 0x%x", ndev->mgmt_i2x.mb_head_ptr_reg); in aie2_dump_chann_info_debug()
88 XDNA_DBG(xdna, "i2x ringbuf 0x%x", ndev->mgmt_i2x.rb_start_addr); in aie2_dump_chann_info_debug()
89 XDNA_DBG(xdna, "i2x rsize 0x%x", ndev->mgmt_i2x.rb_size); in aie2_dump_chann_info_debug()
90 XDNA_DBG(xdna, "x2i tail 0x%x", ndev->mgmt_x2i.mb_tail_ptr_reg); in aie2_dump_chann_info_debug()
91 XDNA_DBG(xdna, "x2i head 0x%x", ndev->mgmt_x2i.mb_head_ptr_reg); in aie2_dump_chann_info_debug()
92 XDNA_DBG(xdna, "x2i ringbuf 0x%x", ndev->mgmt_x2i.rb_start_addr); in aie2_dump_chann_info_debug()
93 XDNA_DBG(xdna, "x2i rsize 0x%x", ndev->mgmt_x2i.rb_size); in aie2_dump_chann_info_debug()
94 XDNA_DBG(xdna, "x2i chann index 0x%x", ndev->mgmt_chan_idx); in aie2_dump_chann_info_debug()
95 XDNA_DBG(xdna, "mailbox protocol major 0x%x", ndev->mgmt_prot_major); in aie2_dump_chann_info_debug()
96 XDNA_DBG(xdna, "mailbox protocol minor 0x%x", ndev->mgmt_prot_minor); in aie2_dump_chann_info_debug()
110 * Once firmware is alive, it will write management channel in aie2_get_mgmt_chann_info()
114 * Read a non-zero value from FW_ALIVE_OFF implies that firmware in aie2_get_mgmt_chann_info()
115 * is alive. in aie2_get_mgmt_chann_info()
120 return -ETIME; in aie2_get_mgmt_chann_info()
125 reg[i] = readl(ndev->sram_base + off + i * sizeof(u32)); in aie2_get_mgmt_chann_info()
128 XDNA_ERR(ndev->xdna, "Invalid mbox magic 0x%x", info_regs.magic); in aie2_get_mgmt_chann_info()
129 ret = -EINVAL; in aie2_get_mgmt_chann_info()
133 i2x = &ndev->mgmt_i2x; in aie2_get_mgmt_chann_info()
134 x2i = &ndev->mgmt_x2i; in aie2_get_mgmt_chann_info()
136 i2x->mb_head_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.i2x_head); in aie2_get_mgmt_chann_info()
137 i2x->mb_tail_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.i2x_tail); in aie2_get_mgmt_chann_info()
138 i2x->rb_start_addr = AIE2_SRAM_OFF(ndev, info_regs.i2x_buf); in aie2_get_mgmt_chann_info()
139 i2x->rb_size = info_regs.i2x_buf_sz; in aie2_get_mgmt_chann_info()
141 x2i->mb_head_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.x2i_head); in aie2_get_mgmt_chann_info()
142 x2i->mb_tail_ptr_reg = AIE2_MBOX_OFF(ndev, info_regs.x2i_tail); in aie2_get_mgmt_chann_info()
143 x2i->rb_start_addr = AIE2_SRAM_OFF(ndev, info_regs.x2i_buf); in aie2_get_mgmt_chann_info()
144 x2i->rb_size = info_regs.x2i_buf_sz; in aie2_get_mgmt_chann_info()
146 ndev->mgmt_chan_idx = info_regs.msi_id; in aie2_get_mgmt_chann_info()
147 ndev->mgmt_prot_major = info_regs.prot_major; in aie2_get_mgmt_chann_info()
148 ndev->mgmt_prot_minor = info_regs.prot_minor; in aie2_get_mgmt_chann_info()
150 ret = aie2_check_protocol(ndev, ndev->mgmt_prot_major, ndev->mgmt_prot_minor); in aie2_get_mgmt_chann_info()
168 for (cfg = ndev->priv->rt_config; cfg->type; cfg++) { in aie2_runtime_cfg()
169 if (cfg->category != category) in aie2_runtime_cfg()
172 value = val ? *val : cfg->value; in aie2_runtime_cfg()
173 ret = aie2_set_runtime_cfg(ndev, cfg->type, value); in aie2_runtime_cfg()
175 XDNA_ERR(ndev->xdna, "Set type %d value %d failed", in aie2_runtime_cfg()
176 cfg->type, value); in aie2_runtime_cfg()
190 XDNA_ERR(ndev->xdna, "Suspend firmware failed"); in aie2_xdna_reset()
196 XDNA_ERR(ndev->xdna, "Resume firmware failed"); in aie2_xdna_reset()
209 XDNA_ERR(ndev->xdna, "Runtime config failed"); in aie2_mgmt_fw_init()
215 XDNA_ERR(ndev->xdna, "Can not assign PASID"); in aie2_mgmt_fw_init()
221 XDNA_ERR(ndev->xdna, "Reset firmware failed"); in aie2_mgmt_fw_init()
225 if (!ndev->async_events) in aie2_mgmt_fw_init()
230 XDNA_ERR(ndev->xdna, "Send async events failed"); in aie2_mgmt_fw_init()
241 ret = aie2_query_firmware_version(ndev, &ndev->xdna->fw_ver); in aie2_mgmt_fw_query()
243 XDNA_ERR(ndev->xdna, "query firmware version failed"); in aie2_mgmt_fw_query()
247 ret = aie2_query_aie_version(ndev, &ndev->version); in aie2_mgmt_fw_query()
249 XDNA_ERR(ndev->xdna, "Query AIE version failed"); in aie2_mgmt_fw_query()
253 ret = aie2_query_aie_metadata(ndev, &ndev->metadata); in aie2_mgmt_fw_query()
255 XDNA_ERR(ndev->xdna, "Query AIE metadata failed"); in aie2_mgmt_fw_query()
265 XDNA_ERR(ndev->xdna, "Suspend_fw failed"); in aie2_mgmt_fw_fini()
266 XDNA_DBG(ndev->xdna, "Firmware suspended"); in aie2_mgmt_fw_fini()
275 xdna = hwctx->client->xdna; in aie2_xrs_load()
277 hwctx->start_col = action->part.start_col; in aie2_xrs_load()
278 hwctx->num_col = action->part.ncols; in aie2_xrs_load()
279 ret = aie2_create_context(xdna->dev_handle, hwctx); in aie2_xrs_load()
292 xdna = hwctx->client->xdna; in aie2_xrs_unload()
294 ret = aie2_destroy_context(xdna->dev_handle, hwctx); in aie2_xrs_unload()
306 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); in aie2_xrs_set_dft_dpm_level()
308 ndev = xdna->dev_handle; in aie2_xrs_set_dft_dpm_level()
309 ndev->dft_dpm_level = dpm_level; in aie2_xrs_set_dft_dpm_level()
310 if (ndev->pw_mode != POWER_MODE_DEFAULT || ndev->dpm_level == dpm_level) in aie2_xrs_set_dft_dpm_level()
313 return ndev->priv->hw_ops.set_dpm(ndev, dpm_level); in aie2_xrs_set_dft_dpm_level()
324 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev); in aie2_hw_stop()
325 struct amdxdna_dev_hdl *ndev = xdna->dev_handle; in aie2_hw_stop()
327 if (ndev->dev_status <= AIE2_DEV_INIT) { in aie2_hw_stop()
333 xdna_mailbox_stop_channel(ndev->mgmt_chann); in aie2_hw_stop()
334 xdna_mailbox_destroy_channel(ndev->mgmt_chann); in aie2_hw_stop()
335 ndev->mgmt_chann = NULL; in aie2_hw_stop()
336 drmm_kfree(&xdna->ddev, ndev->mbox); in aie2_hw_stop()
337 ndev->mbox = NULL; in aie2_hw_stop()
338 aie2_psp_stop(ndev->psp_hdl); in aie2_hw_stop()
342 ndev->dev_status = AIE2_DEV_INIT; in aie2_hw_stop()
347 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev); in aie2_hw_start()
348 struct amdxdna_dev_hdl *ndev = xdna->dev_handle; in aie2_hw_start()
353 if (ndev->dev_status >= AIE2_DEV_START) { in aie2_hw_start()
371 ret = aie2_psp_start(ndev->psp_hdl); in aie2_hw_start()
379 XDNA_ERR(xdna, "firmware is not alive"); in aie2_hw_start()
383 mbox_res.ringbuf_base = ndev->sram_base; in aie2_hw_start()
384 mbox_res.ringbuf_size = pci_resource_len(pdev, xdna->dev_info->sram_bar); in aie2_hw_start()
385 mbox_res.mbox_base = ndev->mbox_base; in aie2_hw_start()
388 ndev->mbox = xdnam_mailbox_create(&xdna->ddev, &mbox_res); in aie2_hw_start()
389 if (!ndev->mbox) { in aie2_hw_start()
391 ret = -ENODEV; in aie2_hw_start()
395 mgmt_mb_irq = pci_irq_vector(pdev, ndev->mgmt_chan_idx); in aie2_hw_start()
402 xdna_mailbox_intr_reg = ndev->mgmt_i2x.mb_head_ptr_reg + 4; in aie2_hw_start()
403 ndev->mgmt_chann = xdna_mailbox_create_channel(ndev->mbox, in aie2_hw_start()
404 &ndev->mgmt_x2i, in aie2_hw_start()
405 &ndev->mgmt_i2x, in aie2_hw_start()
408 if (!ndev->mgmt_chann) { in aie2_hw_start()
410 ret = -EINVAL; in aie2_hw_start()
416 XDNA_ERR(xdna, "failed to init pm, ret %d", ret); in aie2_hw_start()
426 ndev->dev_status = AIE2_DEV_START; in aie2_hw_start()
431 xdna_mailbox_stop_channel(ndev->mgmt_chann); in aie2_hw_start()
432 xdna_mailbox_destroy_channel(ndev->mgmt_chann); in aie2_hw_start()
434 aie2_psp_stop(ndev->psp_hdl); in aie2_hw_start()
445 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev); in aie2_init()
454 ndev = drmm_kzalloc(&xdna->ddev, sizeof(*ndev), GFP_KERNEL); in aie2_init()
456 return -ENOMEM; in aie2_init()
458 ndev->priv = xdna->dev_info->dev_priv; in aie2_init()
459 ndev->xdna = xdna; in aie2_init()
461 ret = request_firmware(&fw, ndev->priv->fw_path, &pdev->dev); in aie2_init()
464 ndev->priv->fw_path, ret); in aie2_init()
477 set_bit(xdna->dev_info->sram_bar, &bars); in aie2_init()
478 set_bit(xdna->dev_info->smu_bar, &bars); in aie2_init()
479 set_bit(xdna->dev_info->mbox_bar, &bars); in aie2_init()
487 ret = -ENOMEM; in aie2_init()
492 ndev->sram_base = tbl[xdna->dev_info->sram_bar]; in aie2_init()
493 ndev->smu_base = tbl[xdna->dev_info->smu_bar]; in aie2_init()
494 ndev->mbox_base = tbl[xdna->dev_info->mbox_bar]; in aie2_init()
496 ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in aie2_init()
505 ret = -EINVAL; in aie2_init()
515 ret = iommu_dev_enable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); in aie2_init()
521 psp_conf.fw_size = fw->size; in aie2_init()
522 psp_conf.fw_buf = fw->data; in aie2_init()
525 ndev->psp_hdl = aie2m_psp_create(&xdna->ddev, &psp_conf); in aie2_init()
526 if (!ndev->psp_hdl) { in aie2_init()
528 ret = -ENOMEM; in aie2_init()
531 xdna->dev_handle = ndev; in aie2_init()
544 ndev->total_col = min(aie2_max_col, ndev->metadata.cols); in aie2_init()
546 xrs_cfg.clk_list.num_levels = ndev->max_dpm_level + 1; in aie2_init()
548 xrs_cfg.clk_list.cu_clk_list[i] = ndev->priv->dpm_clk_tbl[i].hclk; in aie2_init()
550 xrs_cfg.ddev = &xdna->ddev; in aie2_init()
552 xrs_cfg.total_col = ndev->total_col; in aie2_init()
554 xdna->xrs_hdl = xrsm_init(&xrs_cfg); in aie2_init()
555 if (!xdna->xrs_hdl) { in aie2_init()
557 ret = -EINVAL; in aie2_init()
574 ret = aie2_query_firmware_version(ndev, &ndev->xdna->fw_ver); in aie2_init()
576 XDNA_ERR(xdna, "Re-query firmware version failed"); in aie2_init()
588 iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); in aie2_init()
599 struct pci_dev *pdev = to_pci_dev(xdna->ddev.dev); in aie2_fini()
600 struct amdxdna_dev_hdl *ndev = xdna->dev_handle; in aie2_fini()
604 iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); in aie2_fini()
612 struct amdxdna_dev *xdna = client->xdna; in aie2_get_aie_status()
616 ndev = xdna->dev_handle; in aie2_get_aie_status()
617 if (copy_from_user(&status, u64_to_user_ptr(args->buffer), sizeof(status))) { in aie2_get_aie_status()
619 return -EFAULT; in aie2_get_aie_status()
622 if (ndev->metadata.cols * ndev->metadata.size < status.buffer_size) { in aie2_get_aie_status()
624 status.buffer_size, ndev->metadata.cols * ndev->metadata.size); in aie2_get_aie_status()
625 return -EINVAL; in aie2_get_aie_status()
635 if (copy_to_user(u64_to_user_ptr(args->buffer), &status, sizeof(status))) { in aie2_get_aie_status()
637 return -EFAULT; in aie2_get_aie_status()
647 struct amdxdna_dev *xdna = client->xdna; in aie2_get_aie_metadata()
651 ndev = xdna->dev_handle; in aie2_get_aie_metadata()
654 return -ENOMEM; in aie2_get_aie_metadata()
656 meta->col_size = ndev->metadata.size; in aie2_get_aie_metadata()
657 meta->cols = ndev->metadata.cols; in aie2_get_aie_metadata()
658 meta->rows = ndev->metadata.rows; in aie2_get_aie_metadata()
660 meta->version.major = ndev->metadata.version.major; in aie2_get_aie_metadata()
661 meta->version.minor = ndev->metadata.version.minor; in aie2_get_aie_metadata()
663 meta->core.row_count = ndev->metadata.core.row_count; in aie2_get_aie_metadata()
664 meta->core.row_start = ndev->metadata.core.row_start; in aie2_get_aie_metadata()
665 meta->core.dma_channel_count = ndev->metadata.core.dma_channel_count; in aie2_get_aie_metadata()
666 meta->core.lock_count = ndev->metadata.core.lock_count; in aie2_get_aie_metadata()
667 meta->core.event_reg_count = ndev->metadata.core.event_reg_count; in aie2_get_aie_metadata()
669 meta->mem.row_count = ndev->metadata.mem.row_count; in aie2_get_aie_metadata()
670 meta->mem.row_start = ndev->metadata.mem.row_start; in aie2_get_aie_metadata()
671 meta->mem.dma_channel_count = ndev->metadata.mem.dma_channel_count; in aie2_get_aie_metadata()
672 meta->mem.lock_count = ndev->metadata.mem.lock_count; in aie2_get_aie_metadata()
673 meta->mem.event_reg_count = ndev->metadata.mem.event_reg_count; in aie2_get_aie_metadata()
675 meta->shim.row_count = ndev->metadata.shim.row_count; in aie2_get_aie_metadata()
676 meta->shim.row_start = ndev->metadata.shim.row_start; in aie2_get_aie_metadata()
677 meta->shim.dma_channel_count = ndev->metadata.shim.dma_channel_count; in aie2_get_aie_metadata()
678 meta->shim.lock_count = ndev->metadata.shim.lock_count; in aie2_get_aie_metadata()
679 meta->shim.event_reg_count = ndev->metadata.shim.event_reg_count; in aie2_get_aie_metadata()
681 if (copy_to_user(u64_to_user_ptr(args->buffer), meta, sizeof(*meta))) in aie2_get_aie_metadata()
682 ret = -EFAULT; in aie2_get_aie_metadata()
692 struct amdxdna_dev *xdna = client->xdna; in aie2_get_aie_version()
695 ndev = xdna->dev_handle; in aie2_get_aie_version()
696 version.major = ndev->version.major; in aie2_get_aie_version()
697 version.minor = ndev->version.minor; in aie2_get_aie_version()
699 if (copy_to_user(u64_to_user_ptr(args->buffer), &version, sizeof(version))) in aie2_get_aie_version()
700 return -EFAULT; in aie2_get_aie_version()
709 struct amdxdna_dev *xdna = client->xdna; in aie2_get_firmware_version()
711 version.major = xdna->fw_ver.major; in aie2_get_firmware_version()
712 version.minor = xdna->fw_ver.minor; in aie2_get_firmware_version()
713 version.patch = xdna->fw_ver.sub; in aie2_get_firmware_version()
714 version.build = xdna->fw_ver.build; in aie2_get_firmware_version()
716 if (copy_to_user(u64_to_user_ptr(args->buffer), &version, sizeof(version))) in aie2_get_firmware_version()
717 return -EFAULT; in aie2_get_firmware_version()
726 struct amdxdna_dev *xdna = client->xdna; in aie2_get_power_mode()
729 ndev = xdna->dev_handle; in aie2_get_power_mode()
730 mode.power_mode = ndev->pw_mode; in aie2_get_power_mode()
732 if (copy_to_user(u64_to_user_ptr(args->buffer), &mode, sizeof(mode))) in aie2_get_power_mode()
733 return -EFAULT; in aie2_get_power_mode()
742 struct amdxdna_dev *xdna = client->xdna; in aie2_get_clock_metadata()
746 ndev = xdna->dev_handle; in aie2_get_clock_metadata()
749 return -ENOMEM; in aie2_get_clock_metadata()
751 snprintf(clock->mp_npu_clock.name, sizeof(clock->mp_npu_clock.name), in aie2_get_clock_metadata()
752 "MP-NPU Clock"); in aie2_get_clock_metadata()
753 clock->mp_npu_clock.freq_mhz = ndev->npuclk_freq; in aie2_get_clock_metadata()
754 snprintf(clock->h_clock.name, sizeof(clock->h_clock.name), "H Clock"); in aie2_get_clock_metadata()
755 clock->h_clock.freq_mhz = ndev->hclk_freq; in aie2_get_clock_metadata()
757 if (copy_to_user(u64_to_user_ptr(args->buffer), clock, sizeof(*clock))) in aie2_get_clock_metadata()
758 ret = -EFAULT; in aie2_get_clock_metadata()
768 struct amdxdna_dev *xdna = client->xdna; in aie2_get_hwctx_status()
779 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); in aie2_get_hwctx_status()
783 return -ENOMEM; in aie2_get_hwctx_status()
785 buf = u64_to_user_ptr(args->buffer); in aie2_get_hwctx_status()
786 list_for_each_entry(tmp_client, &xdna->client_list, node) { in aie2_get_hwctx_status()
787 idx = srcu_read_lock(&tmp_client->hwctx_srcu); in aie2_get_hwctx_status()
790 if (args->buffer_size < req_bytes) { in aie2_get_hwctx_status()
797 tmp->pid = tmp_client->pid; in aie2_get_hwctx_status()
798 tmp->context_id = hwctx->id; in aie2_get_hwctx_status()
799 tmp->start_col = hwctx->start_col; in aie2_get_hwctx_status()
800 tmp->num_col = hwctx->num_col; in aie2_get_hwctx_status()
801 tmp->command_submissions = hwctx->priv->seq; in aie2_get_hwctx_status()
802 tmp->command_completions = hwctx->priv->completed; in aie2_get_hwctx_status()
805 ret = -EFAULT; in aie2_get_hwctx_status()
806 srcu_read_unlock(&tmp_client->hwctx_srcu, idx); in aie2_get_hwctx_status()
811 srcu_read_unlock(&tmp_client->hwctx_srcu, idx); in aie2_get_hwctx_status()
816 args->buffer_size, req_bytes); in aie2_get_hwctx_status()
817 ret = -EINVAL; in aie2_get_hwctx_status()
822 args->buffer_size = req_bytes; in aie2_get_hwctx_status()
828 struct amdxdna_dev *xdna = client->xdna; in aie2_get_info()
831 if (!drm_dev_enter(&xdna->ddev, &idx)) in aie2_get_info()
832 return -ENODEV; in aie2_get_info()
834 switch (args->param) { in aie2_get_info()
857 XDNA_ERR(xdna, "Not supported request parameter %u", args->param); in aie2_get_info()
858 ret = -EOPNOTSUPP; in aie2_get_info()
860 XDNA_DBG(xdna, "Got param %d", args->param); in aie2_get_info()
871 struct amdxdna_dev *xdna = client->xdna; in aie2_set_power_mode()
873 if (copy_from_user(&power_state, u64_to_user_ptr(args->buffer), in aie2_set_power_mode()
876 return -EFAULT; in aie2_set_power_mode()
880 return -EINVAL; in aie2_set_power_mode()
885 return -EINVAL; in aie2_set_power_mode()
888 return aie2_pm_set_mode(xdna->dev_handle, power_mode); in aie2_set_power_mode()
894 struct amdxdna_dev *xdna = client->xdna; in aie2_set_state()
897 if (!drm_dev_enter(&xdna->ddev, &idx)) in aie2_set_state()
898 return -ENODEV; in aie2_set_state()
900 switch (args->param) { in aie2_set_state()
905 XDNA_ERR(xdna, "Not supported request parameter %u", args->param); in aie2_set_state()
906 ret = -EOPNOTSUPP; in aie2_set_state()