#ifndef _SYS_AMDZEN_CCD_H
#define _SYS_AMDZEN_CCD_H
#include <sys/bitext.h>
#include <sys/debug.h>
#include <sys/types.h>
#include <sys/amdzen/smn.h>
#ifdef __cplusplus
extern "C" {
#endif
static inline smn_reg_t
amdzen_smupwr_smn_reg(const uint8_t ccdno, const smn_reg_def_t def,
const uint16_t reginst)
{
const uint32_t APERTURE_BASE = 0x30081000;
const uint32_t APERTURE_HI_BASE = 0x4a081000;
const uint32_t APERTURE_MASK = 0xfffff000;
CTASSERT((APERTURE_BASE & ~APERTURE_MASK) == 0);
CTASSERT((APERTURE_HI_BASE & ~APERTURE_MASK) == 0);
const uint32_t ccdno32 = (const uint32_t)ccdno;
const uint32_t reginst32 = (const uint32_t)reginst;
const uint32_t size32 = (def.srd_size == 0) ? 4 :
(const uint32_t)def.srd_size;
const uint32_t stride = (def.srd_stride == 0) ? size32 : def.srd_stride;
const uint32_t nents = (def.srd_nents == 0) ? 1 :
(const uint32_t)def.srd_nents;
ASSERT(size32 == 1 || size32 == 2 || size32 == 4);
ASSERT3S(def.srd_unit, ==, SMN_UNIT_SMUPWR);
ASSERT3U(ccdno32, <, 16);
ASSERT3U(nents, >, reginst32);
uint32_t aperture_base, aperture_off;
if (ccdno >= 8) {
aperture_base = APERTURE_HI_BASE;
aperture_off = (ccdno32 - 8) << 25;
} else {
aperture_base = APERTURE_BASE;
aperture_off = ccdno32 << 25;
}
ASSERT3U(aperture_off, <=, UINT32_MAX - aperture_base);
const uint32_t aperture = aperture_base + aperture_off;
ASSERT0(aperture & ~APERTURE_MASK);
const uint32_t reg = def.srd_reg + reginst32 * stride;
ASSERT0(reg & APERTURE_MASK);
return (SMN_MAKE_REG_SIZED(aperture + reg, size32));
}
#define D_SMUPWR_CCD_DIE_ID (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SMUPWR, \
.srd_reg = 0x00 \
}
#define SMUPWR_CCD_DIE_ID(c) \
amdzen_smupwr_smn_reg(c, D_SMUPWR_CCD_DIE_ID, 0)
#define SMUPWR_CCD_DIE_ID_GET(_r) bitx32(_r, 3, 0)
#define D_SMUPWR_THREAD_EN (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SMUPWR, \
.srd_reg = 0x18 \
}
#define SMUPWR_THREAD_EN(c) \
amdzen_smupwr_smn_reg(c, D_SMUPWR_THREAD_EN, 0)
#define SMUPWR_THREAD_EN_GET_T(_r, _t) bitx32(_r, _t, _t)
#define SMUPWR_THREAD_EN_SET_T(_r, _t) bitset32(_r, _t, _t, 1)
#define D_SMUPWR_THREAD_CFG (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SMUPWR, \
.srd_reg = 0x1c \
}
#define SMUPWR_THREAD_CFG(c) \
amdzen_smupwr_smn_reg(c, D_SMUPWR_THREAD_CFG, 0)
#define SMUPWR_THREAD_CFG_GET_SMT_MODE(_r) bitx32(_r, 8, 8)
#define SMUPWR_THREAD_CFG_SMT_MODE_1T 1
#define SMUPWR_THREAD_CFG_SMT_MODE_SMT 0
#define SMUPWR_THREAD_CFG_GET_COMPLEX_COUNT(_r) bitx32(_r, 7, 4)
#define SMUPWR_THREAD_CFG_GET_CORE_COUNT(_r) bitx32(_r, 3, 0)
#define D_SMUPWR_SOFT_DOWNCORE (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SMUPWR, \
.srd_reg = 0x20 \
}
#define SMUPWR_SOFT_DOWNCORE(c) \
amdzen_smupwr_smn_reg(c, D_SMUPWR_SOFT_DOWNCORE, 0)
#define SMUPWR_SOFT_DOWNCORE_GET_DISCORE(_r) bitx32(_r, 7, 0)
#define SMUPWR_SOFT_DOWNCORE_GET_DISCORE_C(_r, _c) bitx32(_r, _c, _c)
#define SMUPWR_SOFT_DOWNCORE_SET_DISCORE(_r, _v) bitset32(_r, 7, 0, _v)
#define SMUPWR_SOFT_DOWNCORE_SET_DISCORE_C(_r, _c) bitset32(_r, _c, _c, 1)
#define D_SMUPWR_CORE_EN (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SMUPWR, \
.srd_reg = 0x24 \
}
#define SMUPWR_CORE_EN(c) \
amdzen_smupwr_smn_reg(c, D_SMUPWR_CORE_EN, 0)
#define SMUPWR_CORE_EN_GET(_r) bitx32(_r, 7, 0)
#define SMUPWR_CORE_EN_GET_C(_r, _c) bitx32(_r, _c, _c)
#define SMUPWR_CORE_EN_SET(_r, _v) bitset32(_r, 7, 0, _v)
#define SMUPWR_CORE_EN_SET_C(_r, _c) bitset32(_r, _c, _c, 1)
static inline smn_reg_t
amdzen_l3soc_smn_reg(const uint8_t ccdno, const smn_reg_def_t def,
const uint16_t reginst)
{
const uint32_t APERTURE_BASE = 0x203c0000;
const uint32_t APERTURE_MASK = 0xfffc0000;
CTASSERT((APERTURE_BASE & ~APERTURE_MASK) == 0);
const uint32_t ccdno32 = (const uint32_t)ccdno;
const uint32_t reginst32 = (const uint32_t)reginst;
const uint32_t size32 = (def.srd_size == 0) ? 4 :
(const uint32_t)def.srd_size;
const uint32_t stride = (def.srd_stride == 0) ? size32 : def.srd_stride;
const uint32_t nents = (def.srd_nents == 0) ? 1 :
(const uint32_t)def.srd_nents;
ASSERT(size32 == 1 || size32 == 2 || size32 == 4);
ASSERT3S(def.srd_unit, ==, SMN_UNIT_L3SOC);
ASSERT3U(ccdno32, <, 16);
ASSERT3U(nents, >, reginst32);
uint32_t aperture_base, aperture_off;
aperture_base = APERTURE_BASE;
aperture_off = ccdno32 << 23;
ASSERT3U(aperture_off, <=, UINT32_MAX - aperture_base);
const uint32_t aperture = aperture_base + aperture_off;
ASSERT0(aperture & ~APERTURE_MASK);
const uint32_t reg = def.srd_reg + reginst32 * stride;
ASSERT0(reg & APERTURE_MASK);
return (SMN_MAKE_REG_SIZED(aperture + reg, size32));
}
#define D_L3SOC_THREAD_EN (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_L3SOC, \
.srd_reg = 0x20 \
}
#define L3SOC_THREAD_EN(c) \
amdzen_l3soc_smn_reg(c, D_L3SOC_THREAD_EN, 0)
#define L3SOC_THREAD_EN_GET_T(_r, _t) bitx32(_r, _t, _t)
#define L3SOC_THREAD_EN_SET_T(_r, _t) bitset32(_r, _t, _t, 1)
#define D_L3SOC_THREAD_CFG (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_L3SOC, \
.srd_reg = 0x30 \
}
#define L3SOC_THREAD_CFG(c) \
amdzen_l3soc_smn_reg(c, D_L3SOC_THREAD_CFG, 0)
#define L3SOC_THREAD_CFG_GET_SMT_MODE(_r) bitx32(_r, 10, 10)
#define L3SOC_THREAD_CFG_SMT_MODE_1T 1
#define L3SOC_THREAD_CFG_SMT_MODE_SMT 0
#define L3SOC_THREAD_CFG_GET_COMPLEX_COUNT(_r) bitx32(_r, 9, 6)
#define L3SOC_THREAD_CFG_GET_CORE_COUNT(_r) bitx32(_r, 3, 0)
#define D_L3SOC_SOFT_DOWNCORE (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_L3SOC, \
.srd_reg = 0x34 \
}
#define L3SOC_SOFT_DOWNCORE(c) \
amdzen_l3soc_smn_reg(c, D_L3SOC_SOFT_DOWNCORE, 0)
#define L3SOC_SOFT_DOWNCORE_GET_DISCORE(_r) bitx32(_r, 15, 0)
#define L3SOC_SOFT_DOWNCORE_GET_DISCORE_C(_r, _c) bitx32(_r, _c, _c)
#define L3SOC_SOFT_DOWNCORE_SET_DISCORE(_r, _v) bitset32(_r, 15, 0, _v)
#define L3SOC_SOFT_DOWNCORE_SET_DISCORE_C(_r, _c) bitset32(_r, _c, _c, 1)
#define D_L3SOC_CORE_EN (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_L3SOC, \
.srd_reg = 0x3c \
}
#define L3SOC_CORE_EN(c) \
amdzen_l3soc_smn_reg(c, D_L3SOC_CORE_EN, 0)
#define L3SOC_CORE_EN_GET(_r) bitx32(_r, 15, 0)
#define L3SOC_CORE_EN_GET_C(_r, _c) bitx32(_r, _c, _c)
#define L3SOC_CORE_EN_SET(_r, _v) bitset32(_r, 15, 0, _v)
#define L3SOC_CORE_EN_SET_C(_r, _c) bitset32(_r, _c, _c, 1)
#define SCFCTP_CORE_STRIDE 0x20000
#define SCFCTP_MAX_ENTS 16
static inline smn_reg_t
amdzen_scfctp_smn_reg(const uint8_t ccdno, const uint8_t ccxno,
const smn_reg_def_t def, const uint16_t reginst)
{
const uint32_t APERTURE_BASE = 0x20000000;
const uint32_t APERTURE_MASK = 0xffc00000;
CTASSERT((APERTURE_BASE & ~APERTURE_MASK) == 0);
const uint32_t ccdno32 = (const uint32_t)ccdno;
const uint32_t ccxno32 = (const uint32_t)ccxno;
const uint32_t reginst32 = (const uint32_t)reginst;
const uint32_t size32 = (def.srd_size == 0) ? 4 :
(const uint32_t)def.srd_size;
const uint32_t stride = (def.srd_stride == 0) ? 4 : def.srd_stride;
const uint32_t nents = (def.srd_nents == 0) ? 1 :
(const uint32_t)def.srd_nents;
ASSERT(size32 == 1 || size32 == 2 || size32 == 4);
ASSERT3S(def.srd_unit, ==, SMN_UNIT_SCFCTP);
ASSERT3U(stride, ==, SCFCTP_CORE_STRIDE);
ASSERT3U(nents, ==, SCFCTP_MAX_ENTS);
ASSERT3U(ccdno32, <, 16);
ASSERT3U(ccxno32, <, 2);
ASSERT3U(nents, >, reginst32);
const uint32_t aperture_off = (ccdno32 << 23) + (ccxno << 22);
ASSERT3U(aperture_off, <=, UINT32_MAX - APERTURE_BASE);
const uint32_t aperture = APERTURE_BASE + aperture_off;
ASSERT0(aperture & ~APERTURE_MASK);
const uint32_t reg = def.srd_reg + reginst32 * stride;
ASSERT0(reg & APERTURE_MASK);
return (SMN_MAKE_REG_SIZED(aperture + reg, size32));
}
#define D_SCFCTP_PMREG_INITPKG0 (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SCFCTP, \
.srd_reg = 0x2fd0, \
.srd_nents = SCFCTP_MAX_ENTS, \
.srd_stride = SCFCTP_CORE_STRIDE \
}
#define SCFCTP_PMREG_INITPKG0(ccd, ccx, core) \
amdzen_scfctp_smn_reg(ccd, ccx, D_SCFCTP_PMREG_INITPKG0, core)
#define SCFCTP_PMREG_INITPKG0_GET_LOG_DIE(_r) bitx32(_r, 22, 19)
#define SCFCTP_PMREG_INITPKG0_GET_LOG_CCX(_r) bitx32(_r, 18, 18)
#define SCFCTP_PMREG_INITPKG0_GET_LOG_CORE(_r) bitx32(_r, 17, 14)
#define SCFCTP_PMREG_INITPKG0_GET_SOCKET(_r) bitx32(_r, 13, 12)
#define SCFCTP_PMREG_INITPKG0_GET_PHYS_DIE(_r) bitx32(_r, 11, 8)
#define SCFCTP_PMREG_INITPKG0_GET_PHYS_CCX(_r) bitx32(_r, 7, 7)
#define SCFCTP_PMREG_INITPKG0_GET_PHYS_CORE(_r) bitx32(_r, 6, 3)
#define SCFCTP_PMREG_INITPKG0_GET_SMTEN(_r) bitx32(_r, 2, 0)
#define D_SCFCTP_PMREG_INITPKG7 (const smn_reg_def_t){ \
.srd_unit = SMN_UNIT_SCFCTP, \
.srd_reg = 0x2fec, \
.srd_nents = SCFCTP_MAX_ENTS, \
.srd_stride = SCFCTP_CORE_STRIDE \
}
#define SCFCTP_PMREG_INITPKG7(ccd, ccx, core) \
amdzen_scfctp_smn_reg(ccd, ccx, D_SCFCTP_PMREG_INITPKG7, core)
#define SCFCTP_PMREG_INITPKG7_GET_N_SOCKETS(_r) bitx32(_r, 26, 25)
#define SCFCTP_PMREG_INITPKG7_GET_N_DIES(_r) bitx32(_r, 24, 21)
#define SCFCTP_PMREG_INITPKG7_GET_N_CCXS(_r) bitx32(_r, 20, 20)
#define SCFCTP_PMREG_INITPKG7_GET_N_CORES(_r) bitx32(_r, 19, 16)
#define SCFCTP_PMREG_INITPKG7_ZEN4_GET_16TAPIC(_r) bitx32(_r, 11, 11)
#define SCFCTP_PMREG_INITPKG7_GET_CHIDXHASHEN(_r) bitx32(_r, 10, 10)
#define SCFCTP_PMREG_INITPKG7_GET_S3(_r) bitx32(_r, 9, 9)
#define SCFCTP_PMREG_INITPKG7_ZEN3_GET_S0I3(_r) bitx32(_r, 8, 8)
#define SCFCTP_PMREG_INITPKG7_GET_CORETYPEISARM(_r) bitx32(_r, 7, 7)
#define SCFCTP_PMREG_INITPKG7_GET_SOCID(_r) bitx32(_r, 6, 3)
#ifdef __cplusplus
}
#endif
#endif