mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
NPU firmware requires a host-allocated work buffer for hardware contexts. Allocate a 4 MB host buffer and attach it to device during device init. Refactor aie2_alloc_msg_buffer() and aie2_free_msg_buffer() into common helpers by moving them to aie.c and renaming them to amdxdna_alloc_msg_buffer() and amdxdna_free_msg_buffer(), allowing both AIE2 and AIE4 to reuse the implementation. Signed-off-by: Nishad Saraf <nishads@amd.com> Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org> Signed-off-by: Lizhi Hou <lizhi.hou@amd.com> Link: https://lore.kernel.org/all/20260505160936.3917732-7-lizhi.hou@amd.com/
121 lines
3.3 KiB
C
121 lines
3.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2026, Advanced Micro Devices, Inc.
|
|
*/
|
|
#ifndef _AIE_H_
|
|
#define _AIE_H_
|
|
|
|
#include <drm/amdxdna_accel.h>
|
|
#include "amdxdna_pci_drv.h"
|
|
#include "amdxdna_mailbox.h"
|
|
|
|
#define AIE_INTERVAL 20000 /* us */
|
|
#define AIE_TIMEOUT 1000000 /* us */
|
|
|
|
struct psp_device;
|
|
struct smu_device;
|
|
|
|
struct aie_device {
|
|
struct amdxdna_dev *xdna;
|
|
struct mailbox_channel *mgmt_chann;
|
|
struct xdna_mailbox_chann_res mgmt_x2i;
|
|
struct xdna_mailbox_chann_res mgmt_i2x;
|
|
u32 mgmt_chan_idx;
|
|
u32 mgmt_prot_major;
|
|
u32 mgmt_prot_minor;
|
|
unsigned long feature_mask;
|
|
|
|
struct psp_device *psp_hdl;
|
|
struct smu_device *smu_hdl;
|
|
|
|
struct amdxdna_drm_query_aie_metadata metadata;
|
|
};
|
|
|
|
#define DECLARE_AIE_MSG(name, op) \
|
|
DECLARE_XDNA_MSG_COMMON(name, op, -1)
|
|
#define AIE_FEATURE_ON(aie, feature) test_bit(feature, &(aie)->feature_mask)
|
|
|
|
#define PSP_REG_BAR(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].bar_idx)
|
|
#define PSP_REG_OFF(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].offset)
|
|
|
|
#define SMU_REG_BAR(ndev, idx) ((ndev)->priv->smu_regs_off[(idx)].bar_idx)
|
|
#define SMU_REG_OFF(ndev, idx) ((ndev)->priv->smu_regs_off[(idx)].offset)
|
|
|
|
#define DEFINE_BAR_OFFSET(reg_name, bar, reg_addr) \
|
|
[reg_name] = {bar##_BAR_INDEX, (reg_addr) - bar##_BAR_BASE}
|
|
|
|
enum smu_reg_idx {
|
|
SMU_CMD_REG = 0,
|
|
SMU_ARG_REG,
|
|
SMU_INTR_REG,
|
|
SMU_RESP_REG,
|
|
SMU_OUT_REG,
|
|
SMU_MAX_REGS /* Keep this at the end */
|
|
};
|
|
|
|
enum psp_reg_idx {
|
|
PSP_CMD_REG = 0,
|
|
PSP_ARG0_REG,
|
|
PSP_ARG1_REG,
|
|
PSP_ARG2_REG,
|
|
PSP_NUM_IN_REGS, /* number of input registers */
|
|
PSP_INTR_REG = PSP_NUM_IN_REGS,
|
|
PSP_STATUS_REG,
|
|
PSP_RESP_REG,
|
|
PSP_PWAITMODE_REG,
|
|
PSP_MAX_REGS /* Keep this at the end */
|
|
};
|
|
|
|
struct aie_bar_off_pair {
|
|
int bar_idx;
|
|
u32 offset;
|
|
};
|
|
|
|
struct smu_config {
|
|
void __iomem *smu_regs[SMU_MAX_REGS];
|
|
};
|
|
|
|
struct psp_config {
|
|
const void *fw_buf;
|
|
u32 fw_size;
|
|
const void *certfw_buf;
|
|
u32 certfw_size;
|
|
void __iomem *psp_regs[PSP_MAX_REGS];
|
|
u32 arg2_mask;
|
|
u32 notify_val;
|
|
};
|
|
|
|
/* Device revision to VBNV string mapping table entry */
|
|
struct amdxdna_rev_vbnv {
|
|
u32 revision;
|
|
const char *vbnv;
|
|
};
|
|
|
|
/* aie.c */
|
|
void aie_dump_mgmt_chann_debug(struct aie_device *aie);
|
|
void aie_destroy_chann(struct aie_device *aie, struct mailbox_channel **chann);
|
|
int aie_send_mgmt_msg_wait(struct aie_device *aie, struct xdna_mailbox_msg *msg);
|
|
int aie_check_protocol(struct aie_device *aie, u32 fw_major, u32 fw_minor);
|
|
void amdxdna_vbnv_init(struct amdxdna_dev *xdna);
|
|
int amdxdna_get_metadata(struct aie_device *aie, struct amdxdna_client *client,
|
|
struct amdxdna_drm_get_info *args);
|
|
void *amdxdna_alloc_msg_buffer(struct amdxdna_dev *xdna, u32 *size,
|
|
dma_addr_t *dma_addr);
|
|
void amdxdna_free_msg_buffer(struct amdxdna_dev *xdna, size_t size,
|
|
void *cpu_addr, dma_addr_t dma_addr);
|
|
|
|
/* aie_psp.c */
|
|
struct psp_device *aiem_psp_create(struct drm_device *ddev, struct psp_config *conf);
|
|
int aie_psp_start(struct psp_device *psp);
|
|
void aie_psp_stop(struct psp_device *psp);
|
|
int aie_psp_waitmode_poll(struct psp_device *psp);
|
|
|
|
/* aie_smu.c */
|
|
struct smu_device *aiem_smu_create(struct drm_device *ddev, struct smu_config *conf);
|
|
int aie_smu_init(struct smu_device *smu);
|
|
void aie_smu_fini(struct smu_device *smu);
|
|
int aie_smu_set_clocks(struct smu_device *smu, u32 *npuclk, u32 *hclk);
|
|
int aie_smu_set_dpm(struct smu_device *smu, u32 dpm_level);
|
|
|
|
#endif /* _AIE_H_ */
|