creating an enum for all used MC registers

replacing all MC_REG hex values with its enum
This commit is contained in:
Resaec 2018-04-25 17:49:42 +02:00
parent dba0d62ef7
commit 5565a2d131
2 changed files with 146 additions and 51 deletions

View file

@ -66,21 +66,29 @@ void bootup_misc_mmio(void) {
APBDEV_PMC_DPD_ENABLE_0 = 0;
/* Setup MC. */
/* TODO: What are these MC reg writes? */
MAKE_MC_REG(0x984) = 1;
MAKE_MC_REG(0x648) = 0;
MAKE_MC_REG(0x64C) = 0;
MAKE_MC_REG(0x650) = 1;
MAKE_MC_REG(0x670) = 0;
MAKE_MC_REG(0x674) = 0;
MAKE_MC_REG(0x678) = 1;
MAKE_MC_REG(0x9A0) = 0;
MAKE_MC_REG(0x9A4) = 0;
MAKE_MC_REG(0x9A8) = 0;
MAKE_MC_REG(0x9AC) = 1;
MC_SECURITY_CFG0_0 = 0;
MC_SECURITY_CFG1_0 = 0;
MC_SECURITY_CFG3_0 = 3;
MAKE_MC_REG(MC_REGISTER_VIDEO_PROTECT_GPU_OVERRIDE_0_0) = 1;
/* undefined in reference manual */
MAKE_MC_REG(MC_REGISTER_0x648) = 0;
MAKE_MC_REG(MC_REGISTER_0x64C) = 0;
MAKE_MC_REG(MC_REGISTER_0x650) = 1;
/* disable SEC carveout */
MAKE_MC_REG(MC_REGISTER_SEC_CARVEOUT_BOM_0) = 0;
MAKE_MC_REG(MC_REGISTER_SEC_CARVEOUT_SIZE_MB_0) = 0;
MAKE_MC_REG(MC_REGISTER_SEC_CARVEOUT_REG_CTRL_0) = 1;
/* disable MTS carveout */
MAKE_MC_REG(MC_REGISTER_MTS_CARVEOUT_BOM_0) = 0;
MAKE_MC_REG(MC_REGISTER_MTS_CARVEOUT_SIZE_MB_0) = 0;
MAKE_MC_REG(MC_REGISTER_MTS_CARVEOUT_ADR_HI_0) = 0;
MAKE_MC_REG(MC_REGISTER_MTS_CARVEOUT_REG_CTRL_0) = 1;
/* disable security carveout - SECURITY_CFG0_0, CFG1_0, CFG3_0 */
MAKE_MC_REG(MC_REGISTER_SECURITY_BOM) = 0;
MAKE_MC_REG(MC_REGISTER_SECURITY_SIZE_MB) = 0;
MAKE_MC_REG(MC_REGISTER_SECURITY_BOM_HI) = 0x11;
configure_default_carveouts();
/* Mark registers secure world only. */
@ -102,33 +110,45 @@ void bootup_misc_mmio(void) {
/* Starting on 4.x on non-dev units, mark SDMMC1 secure only. */
sec_disable_2 |= 1;
}
APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG1_0 = sec_disable_1;
APB_MISC_SECURE_REGS_APB_SLAVE_SECURITY_ENABLE_REG2_0 = sec_disable_2;
/* reset translation tables to allow all */
MAKE_MC_REG(MC_REGISTER_SMMU_TRANSLATION_ENABLE_0_0) = 0xFFFFFFFF;
MAKE_MC_REG(MC_REGISTER_SMMU_TRANSLATION_ENABLE_1_0) = 0xFFFFFFFF;
MAKE_MC_REG(MC_REGISTER_SMMU_TRANSLATION_ENABLE_2_0) = 0xFFFFFFFF;
MAKE_MC_REG(MC_REGISTER_SMMU_TRANSLATION_ENABLE_3_0) = 0xFFFFFFFF;
MAKE_MC_REG(MC_REGISTER_SMMU_TRANSLATION_ENABLE_4_0) = 0xFFFFFFFF;
MAKE_MC_REG(MC_REGISTER_0x38) = 0;
MAKE_MC_REG(MC_REGISTER_0x3C) = 0;
/* disable stall calls after ring1 and ring3 requests */
MAKE_MC_REG(MC_REGISTER_EMEM_ARB_RING1_THROTTLE_0) = 0;
MAKE_MC_REG(MC_REGISTER_EMEM_ARB_RING3_THROTTLE_0) = 0;
MAKE_MC_REG(MC_REGISTER_EMEM_ARB_OVERRIDE_0) = 0; /* disable overrides */
MAKE_MC_REG(MC_REGISTER_EMEM_ARB_RSV_0) = 0; /* null reserved register */
MAKE_MC_REG(MC_REGISTER_0xF0) = 0;
/* disable clock-enable overrides */
MAKE_MC_REG(MC_REGISTER_CLKEN_OVERRIDE_0) = 0;
/* reset PTB, TLB and PTC */
MAKE_MC_REG(MC_REGISTER_SMMU_PTB_DATA_0) = 0;
MAKE_MC_REG(MC_REGISTER_SMMU_TLB_CONFIG_0) = 0x30000030;
MAKE_MC_REG(MC_REGISTER_SMMU_PTC_CONFIG_0) = 0x2800003F;
/* TODO: What are these MC reg writes? */
MAKE_MC_REG(0x228) = 0xFFFFFFFF;
MAKE_MC_REG(0x22C) = 0xFFFFFFFF;
MAKE_MC_REG(0x230) = 0xFFFFFFFF;
MAKE_MC_REG(0x234) = 0xFFFFFFFF;
MAKE_MC_REG(0xB98) = 0xFFFFFFFF;
MAKE_MC_REG(0x038) = 0;
MAKE_MC_REG(0x03C) = 0;
MAKE_MC_REG(0x0E0) = 0;
MAKE_MC_REG(0x0E4) = 0;
MAKE_MC_REG(0x0E8) = 0;
MAKE_MC_REG(0x0EC) = 0;
MAKE_MC_REG(0x0F0) = 0;
MAKE_MC_REG(0x0F4) = 0;
MAKE_MC_REG(0x020) = 0;
MAKE_MC_REG(0x014) = 0x30000030;
MAKE_MC_REG(0x018) = 0x2800003F;
(void)(MAKE_MC_REG(0x014));
MAKE_MC_REG(0x034) = 0;
(void)(MAKE_MC_REG(0x014));
MAKE_MC_REG(0x030) = 0;
(void)(MAKE_MC_REG(0x014));
MAKE_MC_REG(0x010) = 1;
(void)(MAKE_MC_REG(0x014));
(void)(MAKE_MC_REG(MC_REGISTER_SMMU_TLB_CONFIG_0));
MAKE_MC_REG(MC_REGISTER_SMMU_PTC_FLUSH_0) = 0;
(void)(MAKE_MC_REG(MC_REGISTER_SMMU_TLB_CONFIG_0));
MAKE_MC_REG(MC_REGISTER_SMMU_TLB_FLUSH_0) = 0;
(void)(MAKE_MC_REG(MC_REGISTER_SMMU_TLB_CONFIG_0));
MAKE_MC_REG(MC_REGISTER_SMMU_CONFIG_0) = 0x1; /* enable SMMU */
(void)(MAKE_MC_REG(MC_REGISTER_SMMU_TLB_CONFIG_0));
/* Clear RESET Vector, setup CPU Secure Boot RESET Vectors. */
uint32_t reset_vec = TZRAM_GET_SEGMENT_PA(TZRAM_SEGMENT_ID_WARMBOOT_CRT0_AND_MAIN);
@ -168,19 +188,20 @@ void bootup_misc_mmio(void) {
g_has_booted_up = true;
} else if (exosphere_get_target_firmware() < EXOSPHERE_TARGET_FIRMWARE_400) {
/* TODO: What are these MC reg writes? */
MAKE_MC_REG(0x65C) = 0xFFFFF000;
MAKE_MC_REG(0x660) = 0;
MAKE_MC_REG(0x964) |= 1;
MAKE_MC_REG(MC_REGISTER_0x65C) = 0xFFFFF000;
MAKE_MC_REG(MC_REGISTER_0x660) = 0;
MAKE_MC_REG(MC_REGISTER_IRAM_REG_CTRL_0) |= 1; /* overlap at 18.11.1.86 and 18.11.1.87 - lock write access to IRAM and EMEM registers */
CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD_0 &= 0xFFF7FFFF;
}
}
void setup_4x_mmio(void) {
/* TODO: What are these MC reg writes? */
MAKE_MC_REG(0x65C) = 0xFFFFF000;
MAKE_MC_REG(0x660) = 0;
MAKE_MC_REG(0x964) |= 1;
MAKE_MC_REG(MC_REGISTER_0x65C) = 0xFFFFF000;
MAKE_MC_REG(MC_REGISTER_0x660) = 0;
MAKE_MC_REG(MC_REGISTER_IRAM_REG_CTRL_0) |= 1; /* as above, lock write access to IRAM and EMEM registers */
CLK_RST_CONTROLLER_LVL2_CLK_GATE_OVRD_0 &= 0xFFF7FFFF;
/* TODO: What are these PMC scratch writes? */
APBDEV_PMC_SECURE_SCRATCH51_0 = (APBDEV_PMC_SECURE_SCRATCH51_0 & 0xFFFF8000) | 0x4000;
APBDEV_PMC_SECURE_SCRATCH16_0 &= 0x3FFFFFFF;

View file

@ -14,14 +14,14 @@ static inline uintptr_t get_mc_base(void) {
#define MAKE_MC_REG(n) MAKE_REG32(MC_BASE + n)
#define MC_SMMU_PTB_ASID_0 MAKE_MC_REG(0x01C)
#define MC_SMMU_PTB_DATA_0 MAKE_MC_REG(0x020)
#define MC_SMMU_AVPC_ASID_0 MAKE_MC_REG(0x23C)
#define MC_SMMU_PPCS1_ASID_0 MAKE_MC_REG(0x298)
#define MC_SMMU_PTB_ASID_0 MAKE_MC_REG(MC_REGISTER_SMMU_PTB_ASID_0)
#define MC_SMMU_PTB_DATA_0 MAKE_MC_REG(MC_REGISTER_SMMU_PTB_DATA_0)
#define MC_SMMU_AVPC_ASID_0 MAKE_MC_REG(MC_REGISTER_SMMU_AVPC_ASID_0)
#define MC_SMMU_PPCS1_ASID_0 MAKE_MC_REG(MC_REGISTER_SMMU_PPCS1_ASID_0)
#define MC_SECURITY_CFG0_0 MAKE_MC_REG(0x070)
#define MC_SECURITY_CFG1_0 MAKE_MC_REG(0x074)
#define MC_SECURITY_CFG3_0 MAKE_MC_REG(0x9BC)
#define MC_SECURITY_CFG0_0 MAKE_MC_REG(MC_REGISTER_SECURITY_BOM)
#define MC_SECURITY_CFG1_0 MAKE_MC_REG(MC_REGISTER_SECURITY_SIZE_MB)
#define MC_SECURITY_CFG3_0 MAKE_MC_REG(MC_REGISTER_SECURITY_BOM_HI)
#define CARVEOUT_ID_MIN 1
@ -47,6 +47,80 @@ typedef struct {
uint8_t padding[0x28];
} security_carveout_t;
/* 18.11.1 MC Registers */
typedef enum {
MC_REGISTER_SMMU_CONFIG_0 = 0x10,
MC_REGISTER_SMMU_TLB_CONFIG_0 = 0x14, /* Controls usage of the TLB */
MC_REGISTER_SMMU_PTC_CONFIG_0 = 0x18, /* Controls usage of the PTC */
MC_REGISTER_SMMU_PTB_ASID_0 = 0x1C,
MC_REGISTER_SMMU_PTB_DATA_0 = 0x20,
MC_REGISTER_SMMU_TLB_FLUSH_0 = 0x30,
MC_REGISTER_SMMU_PTC_FLUSH_0 = 0x34,
MC_REGISTER_0x38 = 0x38,
MC_REGISTER_0x3C = 0x3C,
/* SECURITY_BOM is the base of the secured region, limited to MB granularity.
This must point to a region of the physical address map allocated to EMEM for it to be effective; the MC cannot secure address space it does not own. (In other words, this is an absolute address, not an offset.)
Above is the list of clients with the TrustZone-security access. [18.11.1.20]
Note that AXICIF clients will adhere to the standard AXI protocol "aprot[1]==0" indication for secure requests. */
MC_REGISTER_SECURITY_BOM = 0x70,
MC_REGISTER_SECURITY_CFG0_0 = MC_REGISTER_SECURITY_BOM,
MC_REGISTER_SECURITY_SIZE_MB = 0x74, /* SECURITY_SIZE_MB is the size, in megabytes, of the secured region. If set to 0, the security check in MC is disabled */
MC_REGISTER_SECURITY_CFG1_0 = MC_REGISTER_SECURITY_SIZE_MB,
MC_REGISTER_EMEM_ARB_RING1_THROTTLE_0 = 0xE0,
MC_REGISTER_EMEM_ARB_RING3_THROTTLE_0 = 0xE4,
MC_REGISTER_EMEM_ARB_OVERRIDE_0 = 0xE8,
MC_REGISTER_EMEM_ARB_RSV_0 = 0xEC,
MC_REGISTER_0xF0 = 0xF0,
MC_REGISTER_CLKEN_OVERRIDE_0 = 0xF4,
MC_REGISTER_SMMU_TRANSLATION_ENABLE_0_0 = 0x228,
MC_REGISTER_SMMU_TRANSLATION_ENABLE_1_0 = 0x22C,
MC_REGISTER_SMMU_TRANSLATION_ENABLE_2_0 = 0x230,
MC_REGISTER_SMMU_TRANSLATION_ENABLE_3_0 = 0x234,
MC_REGISTER_SMMU_AVPC_ASID_0 = 0x23C,
MC_REGISTER_SMMU_PPCS1_ASID_0 = 0x298,
MC_REGISTER_0x648 = 0x648,
MC_REGISTER_0x64C = 0x64C,
MC_REGISTER_0x650 = 0x650,
MC_REGISTER_0x65C = 0x65C,
MC_REGISTER_0x660 = 0x660,
MC_REGISTER_IRAM_REG_CTRL_0 = 0x964,
MC_REGISTER_EMEM_CFG_ACCESS_CTRL_0 = MC_REGISTER_IRAM_REG_CTRL_0,
MC_REGISTER_SEC_CARVEOUT_BOM_0 = 0x670, /* [PMC_SECURE] Base address for the SEC carveout address space */
MC_REGISTER_SEC_CARVEOUT_SIZE_MB_0 = 0x674, /* [PMC_SECURE] SEC_CARVEOUT_SIZE_MB is the size, in megabytes, of the SEC carveout region. If set to 0, the security check in MC is disabled */
/* [PMC_SECURE] Sticky bit to control the writes to the other Sec Carveout aperture registers
0 = Enabled
1 = Disabled */
MC_REGISTER_SEC_CARVEOUT_REG_CTRL_0 = 0x678,
MC_REGISTER_VIDEO_PROTECT_GPU_OVERRIDE_0_0 = 0x984,
MC_REGISTER_MTS_CARVEOUT_BOM_0 = 0x9A0,
MC_REGISTER_MTS_CARVEOUT_SIZE_MB_0 = 0x9A4,
MC_REGISTER_MTS_CARVEOUT_ADR_HI_0 = 0x9A8,
/* MTS_CARVEOUT_WRITE_ACCESS
0 = Enabled
1 = Disabled */
MC_REGISTER_MTS_CARVEOUT_REG_CTRL_0 = 0x9AC,
/* Base Address Higher Bits
SECURITY_BOM_HI has the higher address bits beyond 32 bits of the
base of the secured region, limited to MB granularity */
MC_REGISTER_SECURITY_BOM_HI = 0x9BC,
MC_REGISTER_SECURITY_CFG3_0 = MC_REGISTER_SECURITY_BOM_HI,
MC_REGISTER_SMMU_TRANSLATION_ENABLE_4_0 = 0xB98
} MC_REGISTER;
volatile security_carveout_t *get_carveout_by_id(unsigned int carveout);
void configure_default_carveouts(void);