xref: /linux/drivers/accel/amdxdna/aie.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
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