0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #ifndef _CGS_COMMON_H
0025 #define _CGS_COMMON_H
0026
0027 #include "amd_shared.h"
0028
0029 struct cgs_device;
0030
0031
0032
0033
0034 enum cgs_ind_reg {
0035 CGS_IND_REG__PCIE,
0036 CGS_IND_REG__SMC,
0037 CGS_IND_REG__UVD_CTX,
0038 CGS_IND_REG__DIDT,
0039 CGS_IND_REG_GC_CAC,
0040 CGS_IND_REG_SE_CAC,
0041 CGS_IND_REG__AUDIO_ENDPT
0042 };
0043
0044
0045
0046
0047 enum cgs_ucode_id {
0048 CGS_UCODE_ID_SMU = 0,
0049 CGS_UCODE_ID_SMU_SK,
0050 CGS_UCODE_ID_SDMA0,
0051 CGS_UCODE_ID_SDMA1,
0052 CGS_UCODE_ID_CP_CE,
0053 CGS_UCODE_ID_CP_PFP,
0054 CGS_UCODE_ID_CP_ME,
0055 CGS_UCODE_ID_CP_MEC,
0056 CGS_UCODE_ID_CP_MEC_JT1,
0057 CGS_UCODE_ID_CP_MEC_JT2,
0058 CGS_UCODE_ID_GMCON_RENG,
0059 CGS_UCODE_ID_RLC_G,
0060 CGS_UCODE_ID_STORAGE,
0061 CGS_UCODE_ID_MAXIMUM,
0062 };
0063
0064
0065
0066
0067 struct cgs_firmware_info {
0068 uint16_t version;
0069 uint16_t fw_version;
0070 uint16_t feature_version;
0071 uint32_t image_size;
0072 uint64_t mc_addr;
0073
0074
0075 uint32_t ucode_start_address;
0076
0077 void *kptr;
0078 bool is_kicker;
0079 };
0080
0081 typedef unsigned long cgs_handle_t;
0082
0083
0084
0085
0086
0087
0088
0089
0090 typedef uint32_t (*cgs_read_register_t)(struct cgs_device *cgs_device, unsigned offset);
0091
0092
0093
0094
0095
0096
0097
0098 typedef void (*cgs_write_register_t)(struct cgs_device *cgs_device, unsigned offset,
0099 uint32_t value);
0100
0101
0102
0103
0104
0105
0106
0107
0108 typedef uint32_t (*cgs_read_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space,
0109 unsigned index);
0110
0111
0112
0113
0114
0115
0116
0117 typedef void (*cgs_write_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space,
0118 unsigned index, uint32_t value);
0119
0120 #define CGS_REG_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
0121 #define CGS_REG_FIELD_MASK(reg, field) reg##__##field##_MASK
0122
0123 #define CGS_REG_SET_FIELD(orig_val, reg, field, field_val) \
0124 (((orig_val) & ~CGS_REG_FIELD_MASK(reg, field)) | \
0125 (CGS_REG_FIELD_MASK(reg, field) & ((field_val) << CGS_REG_FIELD_SHIFT(reg, field))))
0126
0127 #define CGS_REG_GET_FIELD(value, reg, field) \
0128 (((value) & CGS_REG_FIELD_MASK(reg, field)) >> CGS_REG_FIELD_SHIFT(reg, field))
0129
0130 #define CGS_WREG32_FIELD(device, reg, field, val) \
0131 cgs_write_register(device, mm##reg, (cgs_read_register(device, mm##reg) & ~CGS_REG_FIELD_MASK(reg, field)) | (val) << CGS_REG_FIELD_SHIFT(reg, field))
0132
0133 #define CGS_WREG32_FIELD_IND(device, space, reg, field, val) \
0134 cgs_write_ind_register(device, space, ix##reg, (cgs_read_ind_register(device, space, ix##reg) & ~CGS_REG_FIELD_MASK(reg, field)) | (val) << CGS_REG_FIELD_SHIFT(reg, field))
0135
0136 typedef int (*cgs_get_firmware_info)(struct cgs_device *cgs_device,
0137 enum cgs_ucode_id type,
0138 struct cgs_firmware_info *info);
0139
0140 struct cgs_ops {
0141
0142 cgs_read_register_t read_register;
0143 cgs_write_register_t write_register;
0144 cgs_read_ind_register_t read_ind_register;
0145 cgs_write_ind_register_t write_ind_register;
0146
0147 cgs_get_firmware_info get_firmware_info;
0148 };
0149
0150 struct cgs_os_ops;
0151
0152 struct cgs_device
0153 {
0154 const struct cgs_ops *ops;
0155
0156 };
0157
0158
0159
0160 #define CGS_CALL(func,dev,...) \
0161 (((struct cgs_device *)dev)->ops->func(dev, ##__VA_ARGS__))
0162 #define CGS_OS_CALL(func,dev,...) \
0163 (((struct cgs_device *)dev)->os_ops->func(dev, ##__VA_ARGS__))
0164
0165 #define cgs_read_register(dev,offset) \
0166 CGS_CALL(read_register,dev,offset)
0167 #define cgs_write_register(dev,offset,value) \
0168 CGS_CALL(write_register,dev,offset,value)
0169 #define cgs_read_ind_register(dev,space,index) \
0170 CGS_CALL(read_ind_register,dev,space,index)
0171 #define cgs_write_ind_register(dev,space,index,value) \
0172 CGS_CALL(write_ind_register,dev,space,index,value)
0173
0174 #define cgs_get_firmware_info(dev, type, info) \
0175 CGS_CALL(get_firmware_info, dev, type, info)
0176
0177 #endif