tcl: am437x: add reset-init event handler

this event handler will configure and lock PLLs
and configure DDR so platform is placed in usable
state.

Change-Id: Idd02f4c9789181d69578f8606ac3576ea1dd8a0b
Tested-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Reviewed-on: http://openocd.zylin.com/2616
Tested-by: jenkins
Reviewed-by: Tom Rini <trini@konsulko.com>
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
This commit is contained in:
Felipe Balbi 2015-03-16 18:50:55 -05:00 committed by Paul Fertser
parent d85a0a6a0c
commit 5df0dfb7f4
1 changed files with 482 additions and 0 deletions

View File

@ -508,5 +508,487 @@ proc disable_watchdog { } {
}
}
proc ceil { x y } {
return [ expr ($x + $y - 1) / $y ]
}
proc device_type { } {
global CONTROL_STATUS
set tmp [ mrw $CONTROL_STATUS ]
set tmp [ expr $tmp & 0x700 ]
set tmp [ expr $tmp >> 8 ]
return $tmp
}
proc get_input_clock_frequency { } {
global CONTROL_STATUS
if { [ device_type ] != 3 } {
error "Unknown device type\n"
return -1
}
set freq [ mrw $CONTROL_STATUS ]
set freq [ expr $freq & 0x00c00000 ]
set freq [ expr $freq >> 22 ]
switch $freq {
0 {
set CLKIN 19200000
}
1 {
set CLKIN 24000000
}
2 {
set CLKIN 25000000
}
3 {
set CLKIN 26000000
}
}
return $CLKIN
}
proc mpu_pll_config { CLKIN N M M2 } {
global CM_CLKMODE_DPLL_MPU
global CM_CLKSEL_DPLL_MPU
global CM_DIV_M2_DPLL_MPU
global CM_IDLEST_DPLL_MPU
set clksel [ mrw $CM_CLKSEL_DPLL_MPU ]
set div_m2 [ mrw $CM_DIV_M2_DPLL_MPU ]
mww $CM_CLKMODE_DPLL_MPU 0x4
while { !([ mrw $CM_IDLEST_DPLL_MPU ] & 0x0100) } { }
set clksel [ expr $clksel & (~0x7ffff) ]
set clksel [ expr $clksel | ($M << 0x8) | $N ]
mww $CM_CLKSEL_DPLL_MPU $clksel
set div_m2 [ expr $div_m2 & (~0x1f) ]
set div_m2 [ expr $div_m2 | $M2 ]
mww $CM_DIV_M2_DPLL_MPU $div_m2
mww $CM_CLKMODE_DPLL_MPU 0x7
while { [ mrw $CM_IDLEST_DPLL_MPU ] != 1 } { }
echo "MPU DPLL locked"
}
proc core_pll_config { CLKIN N M M4 M5 M6 } {
global CM_CLKMODE_DPLL_CORE
global CM_CLKSEL_DPLL_CORE
global CM_DIV_M4_DPLL_CORE
global CM_DIV_M5_DPLL_CORE
global CM_DIV_M6_DPLL_CORE
global CM_IDLEST_DPLL_CORE
set clksel [ mrw $CM_CLKSEL_DPLL_CORE ]
mww $CM_CLKMODE_DPLL_CORE 0x4
while { !([ mrw $CM_IDLEST_DPLL_CORE ] & 0x0100) } { }
set clksel [ expr $clksel & (~0x7ffff) ]
set clksel [ expr $clksel | ($M << 0x8) | $N ]
mww $CM_CLKSEL_DPLL_CORE $clksel
mww $CM_DIV_M4_DPLL_CORE $M4
mww $CM_DIV_M5_DPLL_CORE $M5
mww $CM_DIV_M6_DPLL_CORE $M6
mww $CM_CLKMODE_DPLL_CORE 0x7
while { !([ mrw $CM_IDLEST_DPLL_CORE ] & 0x01) } { }
echo "CORE DPLL locked"
}
proc per_pll_config { CLKIN N M M2 } {
global CM_CLKMODE_DPLL_PER
global CM_CLKSEL_DPLL_PER
global CM_DIV_M2_DPLL_PER
global CM_IDLEST_DPLL_PER
set x [ expr $M * $CLKIN / 1000000 ]
set y [ expr ($N + 1) * 250 ]
set sd [ ceil $x $y ]
set clksel [ mrw $CM_CLKSEL_DPLL_PER ]
set div_m2 [ mrw $CM_DIV_M2_DPLL_PER ]
mww $CM_CLKMODE_DPLL_PER 0x4
while { !([ mrw $CM_IDLEST_DPLL_PER ] & 0x0100) } { }
set clksel [ expr $clksel & (~0xff0fffff) ]
set clksel [ expr $clksel | ($M << 0x8) | $N ]
set clksel [ expr $clksel | ($sd << 24) ]
mww $CM_CLKSEL_DPLL_PER $clksel
set div_m2 [ expr 0xffffff80 | $M2 ]
mww $CM_CLKMODE_DPLL_PER 0x7
while { !([ mrw $CM_IDLEST_DPLL_PER ] & 0x01) } { }
echo "PER DPLL locked"
}
proc ddr_pll_config { CLKIN N M M2 M4 } {
global CM_CLKMODE_DPLL_DDR
global CM_CLKSEL_DPLL_DDR
global CM_DIV_M2_DPLL_DDR
global CM_DIV_M4_DPLL_DDR
global CM_IDLEST_DPLL_DDR
set clksel [ mrw $CM_CLKSEL_DPLL_DDR ]
set div_m2 [ mrw $CM_DIV_M2_DPLL_DDR ]
mww $CM_CLKMODE_DPLL_DDR 0x4
while { !([ mrw $CM_IDLEST_DPLL_DDR ] & 0x0100) } { }
set clksel [ expr $clksel & (~0x7ffff) ]
set clksel [ expr $clksel | ($M << 8) | $N ]
mww $CM_CLKSEL_DPLL_DDR $clksel
set div_m2 [ expr ($div_m2 & 0xffffffe0) | $M2 ]
mww $CM_DIV_M2_DPLL_DDR $div_m2
mww $CM_DIV_M4_DPLL_DDR $M4
mww $CM_CLKMODE_DPLL_DDR 0x7
while { !([ mrw $CM_IDLEST_DPLL_DDR ] & 0x01) } { }
echo "DDR DPLL Locked"
}
proc config_opp100 { } {
set CLKIN [ get_input_clock_frequency ]
if { $CLKIN == -1 } {
return -1
}
switch $CLKIN {
24000000 {
mpu_pll_config $CLKIN 0 25 1
core_pll_config $CLKIN 2 125 10 8 4
per_pll_config $CLKIN 9 400 5
ddr_pll_config $CLKIN 2 50 1 2
}
25000000 {
mpu_pll_config $CLKIN 0 24 1
core_pll_config $CLKIN 0 40 10 8 4
per_pll_config $CLKIN 9 384 5
ddr_pll_config $CLKIN 0 16 1 2
}
26000000 {
mpu_pll_config $CLKIN 12 300 1
core_pll_config $CLKIN 12 500 10 8 4
per_pll_config $CLKIN 12 480 5
ddr_pll_config $CLKIN 12 200 1 2
}
19200000 {
mpu_pll_config $CLKIN 3 125 1
core_pll_config $CLKIN 11 625 10 8 4
per_pll_config $CLKIN 7 400 5
ddr_pll_config $CLKIN 2 125 1 2
}
}
}
proc emif_prcm_clk_enable { } {
global CM_PER_EMIF_FW_CLKCTRL
global CM_PER_EMIF_CLKCTRL
mww $CM_PER_EMIF_FW_CLKCTRL 0x02
mww $CM_PER_EMIF_CLKCTRL 0x02
while { [ mrw $CM_PER_EMIF_CLKCTRL ] != 0x02 } { }
}
proc vtp_enable { } {
global VTP_CTRL_REG
set vtp [ expr [ mrw $VTP_CTRL_REG ] | 0x40 ]
mww $VTP_CTRL_REG $vtp
set vtp [ expr [ mrw $VTP_CTRL_REG ] & ~0x01 ]
mww $VTP_CTRL_REG $vtp
set vtp [ expr [ mrw $VTP_CTRL_REG ] | 0x01 ]
mww $VTP_CTRL_REG $vtp
}
proc config_ddr_ioctrl { } {
global DDR_ADDRCTRL_IOCTRL
global DDR_ADDRCTRL_WD0_IOCTRL
global DDR_ADDRCTRL_WD1_IOCTRL
global DDR_CKE_CTRL
global DDR_DATA0_IOCTRL
global DDR_DATA1_IOCTRL
global DDR_DATA2_IOCTRL
global DDR_DATA3_IOCTRL
global DDR_IO_CTRL
mww $DDR_ADDRCTRL_IOCTRL 0x84
mww $DDR_ADDRCTRL_WD0_IOCTRL 0x00
mww $DDR_ADDRCTRL_WD1_IOCTRL 0x00
mww $DDR_DATA0_IOCTRL 0x84
mww $DDR_DATA1_IOCTRL 0x84
mww $DDR_DATA2_IOCTRL 0x84
mww $DDR_DATA3_IOCTRL 0x84
mww $DDR_IO_CTRL 0x00
mww $DDR_CKE_CTRL 0x03
}
proc config_ddr_phy { } {
global EMIF_DDR_PHY_CTRL_1
global EMIF_DDR_PHY_CTRL_1_SHDW
global EXT_PHY_CTRL_1
global EXT_PHY_CTRL_1_SHDW
global EXT_PHY_CTRL_2
global EXT_PHY_CTRL_2_SHDW
global EXT_PHY_CTRL_3
global EXT_PHY_CTRL_3_SHDW
global EXT_PHY_CTRL_4
global EXT_PHY_CTRL_4_SHDW
global EXT_PHY_CTRL_5
global EXT_PHY_CTRL_5_SHDW
global EXT_PHY_CTRL_6
global EXT_PHY_CTRL_6_SHDW
global EXT_PHY_CTRL_7
global EXT_PHY_CTRL_7_SHDW
global EXT_PHY_CTRL_8
global EXT_PHY_CTRL_8_SHDW
global EXT_PHY_CTRL_9
global EXT_PHY_CTRL_9_SHDW
global EXT_PHY_CTRL_10
global EXT_PHY_CTRL_10_SHDW
global EXT_PHY_CTRL_11
global EXT_PHY_CTRL_11_SHDW
global EXT_PHY_CTRL_12
global EXT_PHY_CTRL_12_SHDW
global EXT_PHY_CTRL_13
global EXT_PHY_CTRL_13_SHDW
global EXT_PHY_CTRL_14
global EXT_PHY_CTRL_14_SHDW
global EXT_PHY_CTRL_15
global EXT_PHY_CTRL_15_SHDW
global EXT_PHY_CTRL_16
global EXT_PHY_CTRL_16_SHDW
global EXT_PHY_CTRL_17
global EXT_PHY_CTRL_17_SHDW
global EXT_PHY_CTRL_18
global EXT_PHY_CTRL_18_SHDW
global EXT_PHY_CTRL_19
global EXT_PHY_CTRL_19_SHDW
global EXT_PHY_CTRL_20
global EXT_PHY_CTRL_20_SHDW
global EXT_PHY_CTRL_21
global EXT_PHY_CTRL_21_SHDW
global EXT_PHY_CTRL_22
global EXT_PHY_CTRL_22_SHDW
global EXT_PHY_CTRL_23
global EXT_PHY_CTRL_23_SHDW
global EXT_PHY_CTRL_24
global EXT_PHY_CTRL_24_SHDW
global EXT_PHY_CTRL_25
global EXT_PHY_CTRL_25_SHDW
global EXT_PHY_CTRL_26
global EXT_PHY_CTRL_26_SHDW
global EXT_PHY_CTRL_27
global EXT_PHY_CTRL_27_SHDW
global EXT_PHY_CTRL_28
global EXT_PHY_CTRL_28_SHDW
global EXT_PHY_CTRL_29
global EXT_PHY_CTRL_29_SHDW
global EXT_PHY_CTRL_30
global EXT_PHY_CTRL_30_SHDW
global EXT_PHY_CTRL_31
global EXT_PHY_CTRL_31_SHDW
global EXT_PHY_CTRL_32
global EXT_PHY_CTRL_32_SHDW
global EXT_PHY_CTRL_33
global EXT_PHY_CTRL_33_SHDW
global EXT_PHY_CTRL_34
global EXT_PHY_CTRL_34_SHDW
global EXT_PHY_CTRL_35
global EXT_PHY_CTRL_35_SHDW
global EXT_PHY_CTRL_36
global EXT_PHY_CTRL_36_SHDW
mww $EMIF_DDR_PHY_CTRL_1 0x8009
mww $EMIF_DDR_PHY_CTRL_1_SHDW 0x8009
set slave_ratio 0x80
set gatelvl_init_ratio 0x20
set wr_dqs_slave_delay 0x60
set rd_dqs_slave_delay 0x60
set dq_offset 0x40
set gatelvl_init_mode 0x01
set wr_data_slave_delay 0x80
set gatelvl_num_dq0 0x0f
set wrlvl_num_dq0 0x0f
mww $EXT_PHY_CTRL_1 [ expr ($slave_ratio << 20) | ($slave_ratio << 10) | $slave_ratio ]
mww $EXT_PHY_CTRL_1_SHDW [ expr ($slave_ratio << 20) | ($slave_ratio << 10) | $slave_ratio ]
mww $EXT_PHY_CTRL_26 [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_26_SHDW [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_27 [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_27_SHDW [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_28 [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_28_SHDW [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_29 [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_29_SHDW [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_30 [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_30_SHDW [ expr ($gatelvl_init_ratio << 16) | $gatelvl_init_ratio ]
mww $EXT_PHY_CTRL_31 0x00
mww $EXT_PHY_CTRL_31_SHDW 0x00
mww $EXT_PHY_CTRL_32 0x00
mww $EXT_PHY_CTRL_32_SHDW 0x00
mww $EXT_PHY_CTRL_33 0x00
mww $EXT_PHY_CTRL_33_SHDW 0x00
mww $EXT_PHY_CTRL_34 0x00
mww $EXT_PHY_CTRL_34_SHDW 0x00
mww $EXT_PHY_CTRL_35 0x00
mww $EXT_PHY_CTRL_35_SHDW 0x00
mww $EXT_PHY_CTRL_22 0x00
mww $EXT_PHY_CTRL_22_SHDW 0x00
mww $EXT_PHY_CTRL_23 [ expr ($wr_dqs_slave_delay << 16) | $rd_dqs_slave_delay ]
mww $EXT_PHY_CTRL_23_SHDW [ expr ($wr_dqs_slave_delay << 16) | $rd_dqs_slave_delay ]
mww $EXT_PHY_CTRL_24 [ expr ($dq_offset << 24) | ($gatelvl_init_mode << 16) | $wr_data_slave_delay ]
mww $EXT_PHY_CTRL_24_SHDW [ expr ($dq_offset << 24) | ($gatelvl_init_mode << 16) | $wr_data_slave_delay << 0 ]
mww $EXT_PHY_CTRL_25 [ expr ($dq_offset << 21) | ($dq_offset << 14) | ($dq_offset << 7) | $dq_offset ]
mww $EXT_PHY_CTRL_25_SHDW [ expr ($dq_offset << 21) | ($dq_offset << 14) | ($dq_offset << 7) | $dq_offset ]
mww $EXT_PHY_CTRL_36 [ expr ($wrlvl_num_dq0 << 4) | $gatelvl_num_dq0 ]
mww $EXT_PHY_CTRL_36_SHDW [ expr ($wrlvl_num_dq0 << 4) | $gatelvl_num_dq0 ]
}
proc config_ddr_timing { } {
global EMIF_SDRAM_TIM_1
global EMIF_SDRAM_TIM_2
global EMIF_SDRAM_TIM_3
global EMIF_SDRAM_TIM_1_SHDW
global EMIF_SDRAM_TIM_2_SHDW
global EMIF_SDRAM_TIM_3_SHDW
global EMIF_ZQ_CONFIG
mww $EMIF_SDRAM_TIM_1 0xeaaad4db
mww $EMIF_SDRAM_TIM_1_SHDW 0xeaaad4db
mww $EMIF_SDRAM_TIM_2 0x266b7fda
mww $EMIF_SDRAM_TIM_2_SHDW 0x266b7fda
mww $EMIF_SDRAM_TIM_3 0x107f8678
mww $EMIF_SDRAM_TIM_3_SHDW 0x107f8678
mww $EMIF_ZQ_CONFIG 0x50074be4
}
proc config_ddr_pm { } {
global EMIF_PWR_MGMT_CTRL
global EMIF_PWR_MGMT_CTRL_SHDW
global EMIF_DLL_CALIB_CTRL
global EMIF_DLL_CALIB_CTRL_SHDW
global EMIF_TEMP_ALERT_CONFIG
mww $EMIF_PWR_MGMT_CTRL 0x00
mww $EMIF_PWR_MGMT_CTRL_SHDW 0x00
mww $EMIF_DLL_CALIB_CTRL 0x00050000
mww $EMIF_DLL_CALIB_CTRL_SHDW 0x00050000
mww $EMIF_TEMP_ALERT_CONFIG 0x00
}
proc config_ddr_priority { } {
global EMIF_PRI_COS_MAP
global EMIF_CONNID_COS_1_MAP
global EMIF_CONNID_COS_2_MAP
global EMIF_RD_WR_EXEC_THRSH
global COS_CONFIG
mww $EMIF_PRI_COS_MAP 0x00
mww $EMIF_CONNID_COS_1_MAP 0x00
mww $EMIF_CONNID_COS_2_MAP 0x0
mww $EMIF_RD_WR_EXEC_THRSH 0x0405
mww $COS_CONFIG 0x00ffffff
}
proc config_ddr3 { SDRAM_CONFIG } {
global CM_DLL_CTRL
global EMIF_IODFT_TLGC
global EMIF_RDWR_LVL_CTRL
global EMIF_RDWR_LVL_RMP_CTRL
global EMIF_SDRAM_CONFIG
global EMIF_SDRAM_CONFIG_EXT
global EMIF_SDRAM_REF_CTRL
global EMIF_SDRAM_REF_CTRL_SHDW
global EMIF_STATUS
global EXT_PHY_CTRL_36
global EXT_PHY_CTRL_36_SHDW
emif_prcm_clk_enable
vtp_enable
set dll [ expr [ mrw $CM_DLL_CTRL ] & ~0x01 ]
mww $CM_DLL_CTRL $dll
while { !([ mrw $CM_DLL_CTRL ] & 0x04) } { }
config_ddr_ioctrl
mww $EMIF_SDRAM_CONFIG_EXT 0xc163
mww $EMIF_IODFT_TLGC 0x2011
mww $EMIF_IODFT_TLGC 0x2411
mww $EMIF_IODFT_TLGC 0x2011
mww $EMIF_SDRAM_REF_CTRL 0x80003000
config_ddr_phy
mww $EMIF_IODFT_TLGC 0x2011
mww $EMIF_IODFT_TLGC 0x2411
mww $EMIF_IODFT_TLGC 0x2011
config_ddr_timing
config_ddr_pm
config_ddr_priority
mww $EMIF_SDRAM_REF_CTRL 0x3000
mww $EMIF_SDRAM_CONFIG $SDRAM_CONFIG
mww $EMIF_SDRAM_REF_CTRL 0x0c30
mww $EMIF_SDRAM_REF_CTRL_SHDW 0x0c30
sleep 10
set tmp [ expr [ mrw $EXT_PHY_CTRL_36 ] | 0x0100 ]
mww $EXT_PHY_CTRL_36 $tmp
mww $EXT_PHY_CTRL_36_SHDW $tmp
mww $EMIF_RDWR_LVL_RMP_CTRL 0x80000000
mww $EMIF_RDWR_LVL_CTRL 0x80000000
while { [ mrw $EMIF_RDWR_LVL_CTRL ] & 0x80000000 } { }
if { [ mrw $EMIF_STATUS ] & 0x70 } {
error "DDR3 Hardware Leveling incomplete!!!"
}
}
proc init_platform { SDRAM_CONFIG } {
config_opp100
config_ddr3 $SDRAM_CONFIG
# now that PLLs are configured, we can run JTAG at full speed
adapter_khz 16000
}
$_TARGETNAME configure -event reset-start { adapter_khz 1000 }
$_TARGETNAME configure -event reset-init { init_platform 0x61a013b2 }
$_TARGETNAME configure -event reset-end { disable_watchdog }