Changes

Jump to navigation Jump to search
2,007 bytes added ,  15:17, 24 August 2017
no edit summary
Line 89: Line 89:  
   
 
   
 
  // Setup memory controllers
 
  // Setup memory controllers
  enable_mem();
+
  enable_mem_ctl();
 
   
 
   
 
  // Setup the security engine's address
 
  // Setup the security engine's address
Line 142: Line 142:  
==== Anti-downgrade ====
 
==== Anti-downgrade ====
 
See [[Fuses#Anti-downgrade|Anti-downgrade]].
 
See [[Fuses#Anti-downgrade|Anti-downgrade]].
 +
 +
==== Memory controllers ====
 +
After disabling fuse programming, the bootloader configures the EMC and MEM/MC. It additionally disables QSPI resets and programs a special aperture designed for AHB redirected access to IRAM.
 +
 +
u32 PERIPH_CLK_SOURCE_EMC = 0x6000619C;
 +
u32 CLK_OUT_ENB_SET_H = 0x60006328;
 +
u32 CLK_OUT_ENB_SET_X = 0x60006284;
 +
u32 RST_DEVICES_SET_H = 0x60006308;
 +
u32 RST_DEVICES_CLR_Y = 0x600062AC;
 +
u32 MC_IRAM_REG_CTRL = 0x70019964;
 +
u32 MC_IRAM_BOM = 0x7001965C;
 +
u32 MC_IRAM_TOM = 0x70019660;
 +
 +
// Initialize EMC's clock source
 +
u32 emc_clk_src_val = *(u32 *)PERIPH_CLK_SOURCE_EMC;
 +
*(u32 *)PERIPH_CLK_SOURCE_EMC = (emc_clk_src_val | 0x40000000);
 +
 +
// Enable CLK_H_EMC
 +
u32 clk_out_enb_h_val = *(u32 *)CLK_OUT_ENB_SET_H;
 +
clk_out_enb_h_val &= ~(0x2000000);
 +
clk_out_enb_h_val |= 0x2000000;
 +
*(u32 *)CLK_OUT_ENB_SET_H = clk_out_enb_h_val;
 +
 +
// Enable CLK_H_MEM
 +
clk_out_enb_h_val = *(u32 *)CLK_OUT_ENB_SET_H;
 +
clk_out_enb_h_val &= ~(0x01);
 +
clk_out_enb_h_val |= 0x01;
 +
*(u32 *)CLK_OUT_ENB_SET_H = clk_out_enb_h_val;
 +
 +
// Enable CLK_X_EMC_DLL
 +
u32 clk_out_enb_x_val = *(u32 *)CLK_OUT_ENB_SET_X;
 +
clk_out_enb_x_val &= ~(0x4000);
 +
clk_out_enb_x_val |= 0x4000;
 +
*(u32 *)CLK_OUT_ENB_SET_X = clk_out_enb_x_val;
 +
 +
// Enable RST_H_EMC and RST_H_MEM
 +
*(u32 *)RST_DEVICES_SET_H = 0x2000001;
 +
 +
// Wait a while
 +
mdelay(0x05);
 +
 +
// Disable RST_Y_QSPI
 +
u32 rst_clr_y_val = *(u32 *)RST_DEVICES_CLR_Y;
 +
rst_clr_y_val &= ~(0x80000);
 +
rst_clr_y_val |= 0x80000;
 +
*(u32 *)RST_DEVICES_CLR_Y = rst_clr_y_val;
 +
 +
// Refresh MC_IRAM_REG_CTRL
 +
// Should be set to 0 (MC_ENABLE_IRAM_CFG_WRITES)
 +
u32 mc_iram_reg_ctrl_val = *(u32 *)MC_IRAM_REG_CTRL;
 +
*(u32 *)MC_IRAM_REG_CTRL = mc_iram_reg_ctrl_val;
 +
 +
// Set base and top addresses for AHB redirected IRAM path
 +
// This allows devices like the GPU to access this range
 +
*(u32 *)MC_IRAM_BOM = 0x40000000;
 +
*(u32 *)MC_IRAM_TOM = 0x4003F000;
 +
 +
// Read back MC_IRAM_REG_CTRL
 +
mc_iram_reg_ctrl_val = *(u32 *)MC_IRAM_REG_CTRL;
 +
 +
return mc_iram_reg_ctrl_val;
    
==== Key generation ====
 
==== Key generation ====

Navigation menu