1*fb4d8502Sjsg /* 2*fb4d8502Sjsg * Copyright 2015 Advanced Micro Devices, Inc. 3*fb4d8502Sjsg * 4*fb4d8502Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 5*fb4d8502Sjsg * copy of this software and associated documentation files (the "Software"), 6*fb4d8502Sjsg * to deal in the Software without restriction, including without limitation 7*fb4d8502Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*fb4d8502Sjsg * and/or sell copies of the Software, and to permit persons to whom the 9*fb4d8502Sjsg * Software is furnished to do so, subject to the following conditions: 10*fb4d8502Sjsg * 11*fb4d8502Sjsg * The above copyright notice and this permission notice shall be included in 12*fb4d8502Sjsg * all copies or substantial portions of the Software. 13*fb4d8502Sjsg * 14*fb4d8502Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*fb4d8502Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*fb4d8502Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*fb4d8502Sjsg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*fb4d8502Sjsg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*fb4d8502Sjsg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*fb4d8502Sjsg * OTHER DEALINGS IN THE SOFTWARE. 21*fb4d8502Sjsg * 22*fb4d8502Sjsg * 23*fb4d8502Sjsg */ 24*fb4d8502Sjsg #ifndef _CGS_COMMON_H 25*fb4d8502Sjsg #define _CGS_COMMON_H 26*fb4d8502Sjsg 27*fb4d8502Sjsg #include "amd_shared.h" 28*fb4d8502Sjsg 29*fb4d8502Sjsg struct cgs_device; 30*fb4d8502Sjsg 31*fb4d8502Sjsg /** 32*fb4d8502Sjsg * enum cgs_ind_reg - Indirect register spaces 33*fb4d8502Sjsg */ 34*fb4d8502Sjsg enum cgs_ind_reg { 35*fb4d8502Sjsg CGS_IND_REG__PCIE, 36*fb4d8502Sjsg CGS_IND_REG__SMC, 37*fb4d8502Sjsg CGS_IND_REG__UVD_CTX, 38*fb4d8502Sjsg CGS_IND_REG__DIDT, 39*fb4d8502Sjsg CGS_IND_REG_GC_CAC, 40*fb4d8502Sjsg CGS_IND_REG_SE_CAC, 41*fb4d8502Sjsg CGS_IND_REG__AUDIO_ENDPT 42*fb4d8502Sjsg }; 43*fb4d8502Sjsg 44*fb4d8502Sjsg /* 45*fb4d8502Sjsg * enum cgs_ucode_id - Firmware types for different IPs 46*fb4d8502Sjsg */ 47*fb4d8502Sjsg enum cgs_ucode_id { 48*fb4d8502Sjsg CGS_UCODE_ID_SMU = 0, 49*fb4d8502Sjsg CGS_UCODE_ID_SMU_SK, 50*fb4d8502Sjsg CGS_UCODE_ID_SDMA0, 51*fb4d8502Sjsg CGS_UCODE_ID_SDMA1, 52*fb4d8502Sjsg CGS_UCODE_ID_CP_CE, 53*fb4d8502Sjsg CGS_UCODE_ID_CP_PFP, 54*fb4d8502Sjsg CGS_UCODE_ID_CP_ME, 55*fb4d8502Sjsg CGS_UCODE_ID_CP_MEC, 56*fb4d8502Sjsg CGS_UCODE_ID_CP_MEC_JT1, 57*fb4d8502Sjsg CGS_UCODE_ID_CP_MEC_JT2, 58*fb4d8502Sjsg CGS_UCODE_ID_GMCON_RENG, 59*fb4d8502Sjsg CGS_UCODE_ID_RLC_G, 60*fb4d8502Sjsg CGS_UCODE_ID_STORAGE, 61*fb4d8502Sjsg CGS_UCODE_ID_MAXIMUM, 62*fb4d8502Sjsg }; 63*fb4d8502Sjsg 64*fb4d8502Sjsg /** 65*fb4d8502Sjsg * struct cgs_firmware_info - Firmware information 66*fb4d8502Sjsg */ 67*fb4d8502Sjsg struct cgs_firmware_info { 68*fb4d8502Sjsg uint16_t version; 69*fb4d8502Sjsg uint16_t fw_version; 70*fb4d8502Sjsg uint16_t feature_version; 71*fb4d8502Sjsg uint32_t image_size; 72*fb4d8502Sjsg uint64_t mc_addr; 73*fb4d8502Sjsg 74*fb4d8502Sjsg /* only for smc firmware */ 75*fb4d8502Sjsg uint32_t ucode_start_address; 76*fb4d8502Sjsg 77*fb4d8502Sjsg void *kptr; 78*fb4d8502Sjsg bool is_kicker; 79*fb4d8502Sjsg }; 80*fb4d8502Sjsg 81*fb4d8502Sjsg typedef unsigned long cgs_handle_t; 82*fb4d8502Sjsg 83*fb4d8502Sjsg /** 84*fb4d8502Sjsg * cgs_read_register() - Read an MMIO register 85*fb4d8502Sjsg * @cgs_device: opaque device handle 86*fb4d8502Sjsg * @offset: register offset 87*fb4d8502Sjsg * 88*fb4d8502Sjsg * Return: register value 89*fb4d8502Sjsg */ 90*fb4d8502Sjsg typedef uint32_t (*cgs_read_register_t)(struct cgs_device *cgs_device, unsigned offset); 91*fb4d8502Sjsg 92*fb4d8502Sjsg /** 93*fb4d8502Sjsg * cgs_write_register() - Write an MMIO register 94*fb4d8502Sjsg * @cgs_device: opaque device handle 95*fb4d8502Sjsg * @offset: register offset 96*fb4d8502Sjsg * @value: register value 97*fb4d8502Sjsg */ 98*fb4d8502Sjsg typedef void (*cgs_write_register_t)(struct cgs_device *cgs_device, unsigned offset, 99*fb4d8502Sjsg uint32_t value); 100*fb4d8502Sjsg 101*fb4d8502Sjsg /** 102*fb4d8502Sjsg * cgs_read_ind_register() - Read an indirect register 103*fb4d8502Sjsg * @cgs_device: opaque device handle 104*fb4d8502Sjsg * @offset: register offset 105*fb4d8502Sjsg * 106*fb4d8502Sjsg * Return: register value 107*fb4d8502Sjsg */ 108*fb4d8502Sjsg typedef uint32_t (*cgs_read_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space, 109*fb4d8502Sjsg unsigned index); 110*fb4d8502Sjsg 111*fb4d8502Sjsg /** 112*fb4d8502Sjsg * cgs_write_ind_register() - Write an indirect register 113*fb4d8502Sjsg * @cgs_device: opaque device handle 114*fb4d8502Sjsg * @offset: register offset 115*fb4d8502Sjsg * @value: register value 116*fb4d8502Sjsg */ 117*fb4d8502Sjsg typedef void (*cgs_write_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space, 118*fb4d8502Sjsg unsigned index, uint32_t value); 119*fb4d8502Sjsg 120*fb4d8502Sjsg #define CGS_REG_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT 121*fb4d8502Sjsg #define CGS_REG_FIELD_MASK(reg, field) reg##__##field##_MASK 122*fb4d8502Sjsg 123*fb4d8502Sjsg #define CGS_REG_SET_FIELD(orig_val, reg, field, field_val) \ 124*fb4d8502Sjsg (((orig_val) & ~CGS_REG_FIELD_MASK(reg, field)) | \ 125*fb4d8502Sjsg (CGS_REG_FIELD_MASK(reg, field) & ((field_val) << CGS_REG_FIELD_SHIFT(reg, field)))) 126*fb4d8502Sjsg 127*fb4d8502Sjsg #define CGS_REG_GET_FIELD(value, reg, field) \ 128*fb4d8502Sjsg (((value) & CGS_REG_FIELD_MASK(reg, field)) >> CGS_REG_FIELD_SHIFT(reg, field)) 129*fb4d8502Sjsg 130*fb4d8502Sjsg #define CGS_WREG32_FIELD(device, reg, field, val) \ 131*fb4d8502Sjsg 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)) 132*fb4d8502Sjsg 133*fb4d8502Sjsg #define CGS_WREG32_FIELD_IND(device, space, reg, field, val) \ 134*fb4d8502Sjsg 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)) 135*fb4d8502Sjsg 136*fb4d8502Sjsg typedef int (*cgs_get_firmware_info)(struct cgs_device *cgs_device, 137*fb4d8502Sjsg enum cgs_ucode_id type, 138*fb4d8502Sjsg struct cgs_firmware_info *info); 139*fb4d8502Sjsg 140*fb4d8502Sjsg struct cgs_ops { 141*fb4d8502Sjsg /* MMIO access */ 142*fb4d8502Sjsg cgs_read_register_t read_register; 143*fb4d8502Sjsg cgs_write_register_t write_register; 144*fb4d8502Sjsg cgs_read_ind_register_t read_ind_register; 145*fb4d8502Sjsg cgs_write_ind_register_t write_ind_register; 146*fb4d8502Sjsg /* Firmware Info */ 147*fb4d8502Sjsg cgs_get_firmware_info get_firmware_info; 148*fb4d8502Sjsg }; 149*fb4d8502Sjsg 150*fb4d8502Sjsg struct cgs_os_ops; /* To be define in OS-specific CGS header */ 151*fb4d8502Sjsg 152*fb4d8502Sjsg struct cgs_device 153*fb4d8502Sjsg { 154*fb4d8502Sjsg const struct cgs_ops *ops; 155*fb4d8502Sjsg /* to be embedded at the start of driver private structure */ 156*fb4d8502Sjsg }; 157*fb4d8502Sjsg 158*fb4d8502Sjsg /* Convenience macros that make CGS indirect function calls look like 159*fb4d8502Sjsg * normal function calls */ 160*fb4d8502Sjsg #define CGS_CALL(func,dev,...) \ 161*fb4d8502Sjsg (((struct cgs_device *)dev)->ops->func(dev, ##__VA_ARGS__)) 162*fb4d8502Sjsg #define CGS_OS_CALL(func,dev,...) \ 163*fb4d8502Sjsg (((struct cgs_device *)dev)->os_ops->func(dev, ##__VA_ARGS__)) 164*fb4d8502Sjsg 165*fb4d8502Sjsg #define cgs_read_register(dev,offset) \ 166*fb4d8502Sjsg CGS_CALL(read_register,dev,offset) 167*fb4d8502Sjsg #define cgs_write_register(dev,offset,value) \ 168*fb4d8502Sjsg CGS_CALL(write_register,dev,offset,value) 169*fb4d8502Sjsg #define cgs_read_ind_register(dev,space,index) \ 170*fb4d8502Sjsg CGS_CALL(read_ind_register,dev,space,index) 171*fb4d8502Sjsg #define cgs_write_ind_register(dev,space,index,value) \ 172*fb4d8502Sjsg CGS_CALL(write_ind_register,dev,space,index,value) 173*fb4d8502Sjsg 174*fb4d8502Sjsg #define cgs_get_firmware_info(dev, type, info) \ 175*fb4d8502Sjsg CGS_CALL(get_firmware_info, dev, type, info) 176*fb4d8502Sjsg 177*fb4d8502Sjsg #endif /* _CGS_COMMON_H */ 178