15a55a5daSLizhi Hou /* SPDX-License-Identifier: GPL-2.0 */ 25a55a5daSLizhi Hou /* 35a55a5daSLizhi Hou * Copyright (C) 2026, Advanced Micro Devices, Inc. 45a55a5daSLizhi Hou */ 55a55a5daSLizhi Hou #ifndef _AIE_H_ 65a55a5daSLizhi Hou #define _AIE_H_ 75a55a5daSLizhi Hou 80b087e06SDavid Zhang #include <drm/amdxdna_accel.h> 95a55a5daSLizhi Hou #include "amdxdna_pci_drv.h" 105a55a5daSLizhi Hou #include "amdxdna_mailbox.h" 115a55a5daSLizhi Hou 12c02697cbSDavid Zhang #define AIE_INTERVAL 20000 /* us */ 13c02697cbSDavid Zhang #define AIE_TIMEOUT 1000000 /* us */ 14c02697cbSDavid Zhang 15dd2f592bSDavid Zhang struct psp_device; 1681673325SDavid Zhang struct smu_device; 17dd2f592bSDavid Zhang 185a55a5daSLizhi Hou struct aie_device { 195a55a5daSLizhi Hou struct amdxdna_dev *xdna; 205a55a5daSLizhi Hou struct mailbox_channel *mgmt_chann; 215a55a5daSLizhi Hou struct xdna_mailbox_chann_res mgmt_x2i; 225a55a5daSLizhi Hou struct xdna_mailbox_chann_res mgmt_i2x; 235a55a5daSLizhi Hou u32 mgmt_chan_idx; 245a55a5daSLizhi Hou u32 mgmt_prot_major; 255a55a5daSLizhi Hou u32 mgmt_prot_minor; 265a55a5daSLizhi Hou unsigned long feature_mask; 27dd2f592bSDavid Zhang 28dd2f592bSDavid Zhang struct psp_device *psp_hdl; 2981673325SDavid Zhang struct smu_device *smu_hdl; 300b087e06SDavid Zhang 310b087e06SDavid Zhang struct amdxdna_drm_query_aie_metadata metadata; 325a55a5daSLizhi Hou }; 335a55a5daSLizhi Hou 345a55a5daSLizhi Hou #define DECLARE_AIE_MSG(name, op) \ 355a55a5daSLizhi Hou DECLARE_XDNA_MSG_COMMON(name, op, -1) 365a55a5daSLizhi Hou #define AIE_FEATURE_ON(aie, feature) test_bit(feature, &(aie)->feature_mask) 375a55a5daSLizhi Hou 38dd2f592bSDavid Zhang #define PSP_REG_BAR(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].bar_idx) 39dd2f592bSDavid Zhang #define PSP_REG_OFF(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].offset) 40dd2f592bSDavid Zhang 4181673325SDavid Zhang #define SMU_REG_BAR(ndev, idx) ((ndev)->priv->smu_regs_off[(idx)].bar_idx) 4281673325SDavid Zhang #define SMU_REG_OFF(ndev, idx) ((ndev)->priv->smu_regs_off[(idx)].offset) 4381673325SDavid Zhang 44dd2f592bSDavid Zhang #define DEFINE_BAR_OFFSET(reg_name, bar, reg_addr) \ 45dd2f592bSDavid Zhang [reg_name] = {bar##_BAR_INDEX, (reg_addr) - bar##_BAR_BASE} 46dd2f592bSDavid Zhang 4781673325SDavid Zhang enum smu_reg_idx { 4881673325SDavid Zhang SMU_CMD_REG = 0, 4981673325SDavid Zhang SMU_ARG_REG, 5081673325SDavid Zhang SMU_INTR_REG, 5181673325SDavid Zhang SMU_RESP_REG, 5281673325SDavid Zhang SMU_OUT_REG, 5381673325SDavid Zhang SMU_MAX_REGS /* Keep this at the end */ 5481673325SDavid Zhang }; 5581673325SDavid Zhang 56dd2f592bSDavid Zhang enum psp_reg_idx { 57dd2f592bSDavid Zhang PSP_CMD_REG = 0, 58dd2f592bSDavid Zhang PSP_ARG0_REG, 59dd2f592bSDavid Zhang PSP_ARG1_REG, 60dd2f592bSDavid Zhang PSP_ARG2_REG, 61dd2f592bSDavid Zhang PSP_NUM_IN_REGS, /* number of input registers */ 62dd2f592bSDavid Zhang PSP_INTR_REG = PSP_NUM_IN_REGS, 63dd2f592bSDavid Zhang PSP_STATUS_REG, 64dd2f592bSDavid Zhang PSP_RESP_REG, 65dd2f592bSDavid Zhang PSP_PWAITMODE_REG, 66dd2f592bSDavid Zhang PSP_MAX_REGS /* Keep this at the end */ 67dd2f592bSDavid Zhang }; 68dd2f592bSDavid Zhang 69dd2f592bSDavid Zhang struct aie_bar_off_pair { 70dd2f592bSDavid Zhang int bar_idx; 71dd2f592bSDavid Zhang u32 offset; 72dd2f592bSDavid Zhang }; 73dd2f592bSDavid Zhang 7481673325SDavid Zhang struct smu_config { 7581673325SDavid Zhang void __iomem *smu_regs[SMU_MAX_REGS]; 7681673325SDavid Zhang }; 7781673325SDavid Zhang 78dd2f592bSDavid Zhang struct psp_config { 79dd2f592bSDavid Zhang const void *fw_buf; 80dd2f592bSDavid Zhang u32 fw_size; 81e69ef214SDavid Zhang const void *certfw_buf; 82e69ef214SDavid Zhang u32 certfw_size; 83dd2f592bSDavid Zhang void __iomem *psp_regs[PSP_MAX_REGS]; 84e69ef214SDavid Zhang u32 arg2_mask; 85e69ef214SDavid Zhang u32 notify_val; 86dd2f592bSDavid Zhang }; 87dd2f592bSDavid Zhang 88d8c33b9cSMax Zhen /* Device revision to VBNV string mapping table entry */ 89d8c33b9cSMax Zhen struct amdxdna_rev_vbnv { 90d8c33b9cSMax Zhen u32 revision; 91d8c33b9cSMax Zhen const char *vbnv; 92d8c33b9cSMax Zhen }; 93d8c33b9cSMax Zhen 94dd2f592bSDavid Zhang /* aie.c */ 955a55a5daSLizhi Hou void aie_dump_mgmt_chann_debug(struct aie_device *aie); 965a55a5daSLizhi Hou void aie_destroy_chann(struct aie_device *aie, struct mailbox_channel **chann); 975a55a5daSLizhi Hou int aie_send_mgmt_msg_wait(struct aie_device *aie, struct xdna_mailbox_msg *msg); 985a55a5daSLizhi Hou int aie_check_protocol(struct aie_device *aie, u32 fw_major, u32 fw_minor); 99d8c33b9cSMax Zhen void amdxdna_vbnv_init(struct amdxdna_dev *xdna); 1000b087e06SDavid Zhang int amdxdna_get_metadata(struct aie_device *aie, struct amdxdna_client *client, 1010b087e06SDavid Zhang struct amdxdna_drm_get_info *args); 102*c0069781SNishad Saraf void *amdxdna_alloc_msg_buffer(struct amdxdna_dev *xdna, u32 *size, 103*c0069781SNishad Saraf dma_addr_t *dma_addr); 104*c0069781SNishad Saraf void amdxdna_free_msg_buffer(struct amdxdna_dev *xdna, size_t size, 105*c0069781SNishad Saraf void *cpu_addr, dma_addr_t dma_addr); 1065a55a5daSLizhi Hou 107dd2f592bSDavid Zhang /* aie_psp.c */ 108dd2f592bSDavid Zhang struct psp_device *aiem_psp_create(struct drm_device *ddev, struct psp_config *conf); 109dd2f592bSDavid Zhang int aie_psp_start(struct psp_device *psp); 110dd2f592bSDavid Zhang void aie_psp_stop(struct psp_device *psp); 111dd2f592bSDavid Zhang int aie_psp_waitmode_poll(struct psp_device *psp); 112dd2f592bSDavid Zhang 11381673325SDavid Zhang /* aie_smu.c */ 11481673325SDavid Zhang struct smu_device *aiem_smu_create(struct drm_device *ddev, struct smu_config *conf); 11581673325SDavid Zhang int aie_smu_init(struct smu_device *smu); 11681673325SDavid Zhang void aie_smu_fini(struct smu_device *smu); 11781673325SDavid Zhang int aie_smu_set_clocks(struct smu_device *smu, u32 *npuclk, u32 *hclk); 11881673325SDavid Zhang int aie_smu_set_dpm(struct smu_device *smu, u32 dpm_level); 11981673325SDavid Zhang 1205a55a5daSLizhi Hou #endif /* _AIE_H_ */ 121