diff --git a/fsbl/Makefile b/fsbl/Makefile index c193060aa..ce29ab4f2 100644 --- a/fsbl/Makefile +++ b/fsbl/Makefile @@ -179,6 +179,10 @@ endif $(eval $(call add_define,FSBL_SECURE_BOOT_SUPPORT)) $(eval $(call add_define, USB_DL_BY_FSBL)) +ifeq ($(KERNEL_SUSPEND),y) +$(eval $(call add_define,CONFIG_PM_SLEEP)) +endif + ################################################################################ # Build targets ################################################################################ diff --git a/fsbl/make_helpers/build_macros.mk b/fsbl/make_helpers/build_macros.mk index ae557a2cc..a3b7571c0 100644 --- a/fsbl/make_helpers/build_macros.mk +++ b/fsbl/make_helpers/build_macros.mk @@ -273,7 +273,7 @@ $(DUMP): $(ELF) $(BIN): $(ELF) @echo " BIN $$@" - $$(Q)$$(OC) -O binary $$< $$@ + $$(Q)$$(OC) -O binary -R .suspend_sect $$< $$@ @${ECHO_BLANK_LINE} @echo "Built $$@ successfully" @${ECHO_BLANK_LINE} diff --git a/fsbl/plat/cv180x/bl2/bl2.ld.S b/fsbl/plat/cv180x/bl2/bl2.ld.S index 232a7d8ab..5d56acb41 100644 --- a/fsbl/plat/cv180x/bl2/bl2.ld.S +++ b/fsbl/plat/cv180x/bl2/bl2.ld.S @@ -17,6 +17,8 @@ ENTRY(bl2_entrypoint) MEMORY { RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_SIZE + + SRAM (rwx): ORIGIN = TPU_SRAM_BASE, LENGTH = TPU_SRAM_SIZE } SECTIONS @@ -80,5 +82,17 @@ SECTIONS ASSERT(. <= (BL2_BASE + BL2_SIZE), "BL2 image has exceeded its limit.") + .suspend_sect : + { + . = ALIGN(8); + __suspend_sect_start = .; + KEEP(*(.suspend_entry)) + KEEP(*(.suspend_func)) + . = ALIGN(8); + __suspend_data_start = .; + KEEP(*(.suspend_data)) + . = ALIGN(8); + __suspend_sect_end = .; + } > SRAM #include } diff --git a/fsbl/plat/cv180x/bl2/bl2_main.c b/fsbl/plat/cv180x/bl2/bl2_main.c index c19ad1f8a..e79be3ec3 100644 --- a/fsbl/plat/cv180x/bl2/bl2_main.c +++ b/fsbl/plat/cv180x/bl2/bl2_main.c @@ -67,7 +67,11 @@ void bl2_main(void) switch_rtc_mode_1st_stage(); set_rtc_en_registers(); - +#ifdef CONFIG_PM_SLEEP +#ifndef NO_DDR_CFG //for fpga + jump_to_warmboot_entry(); +#endif +#endif load_ddr(); #ifdef OD_CLK_SEL load_rest_od_sel(); diff --git a/fsbl/plat/cv180x/bl2/bl2_opt.c b/fsbl/plat/cv180x/bl2/bl2_opt.c index 0e8dd5080..8b1f7f649 100644 --- a/fsbl/plat/cv180x/bl2/bl2_opt.c +++ b/fsbl/plat/cv180x/bl2/bl2_opt.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,6 +21,7 @@ struct _time_records *time_records = (void *)TIME_RECORDS_ADDR; struct fip_param1 *fip_param1 = (void *)PARAM1_BASE; +enum CHIP_CLK_MODE chip_clk_mode = CLK_ND; static struct fip_param2 fip_param2 __aligned(BLOCK_SIZE); static union { struct ddr_param ddr_param; @@ -427,6 +430,64 @@ int load_loader_2nd(int retry, uint64_t *loader_2nd_entry) return 0; } +#ifndef NO_DDR_CFG //for fpga +static void *get_warmboot_entry(void) +{ + /* + * "FSM state change to ST_ON from the state + * 4'h0 = state changed from ST_OFF to ST_ON + * 4'h3 = state changed to ST_PWR_CYC or ST_WARM_RESET then back to ST_ON + * 4'h9 = state changed from ST_SUSP to ST_ON + */ +#define WANTED_STATE 0x9 + + NOTICE("\nREG_RTC_ST_ON_REASON=0x%x\n", mmio_read_32(REG_RTC_ST_ON_REASON)); + NOTICE("\nRTC_SRAM_FLAG_ADDR%x=0x%x\n", RTC_SRAM_FLAG_ADDR, mmio_read_32(RTC_SRAM_FLAG_ADDR)); + /* Check if RTC state changed from ST_SUSP */ + if ((mmio_read_32(REG_RTC_ST_ON_REASON) & 0xF) == WANTED_STATE) + return (void *)(uintptr_t)mmio_read_32(RTC_SRAM_FLAG_ADDR); + + return 0; +} +#endif +void rtc_set_ddr_pwrok(void) +{ + mmio_setbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000001); +} + +void rtc_set_rmio_pwrok(void) +{ + mmio_setbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000002); +} + +#ifndef NO_DDR_CFG //for fpga +static void ddr_resume(void) +{ + rtc_set_ddr_pwrok(); + rtc_set_rmio_pwrok(); + ddr_sys_resume(); +} + +void jump_to_warmboot_entry(void) +{ + void (*warmboot_entry)() = get_warmboot_entry(); + + // treat next reset as normal boot + mmio_write_64(RTC_SRAM_FLAG_ADDR, 0); + if (warmboot_entry) { + INFO("WE=0x%lx\n", (uintptr_t)warmboot_entry); + + NOTICE("ddr resume...\n"); + ddr_resume(); + NOTICE("ddr resume end\n"); + + sys_pll_init(); + sys_switch_all_to_pll(); + + warmboot_entry(); + } +} +#endif int load_rest(void) { int retry = 0; diff --git a/fsbl/plat/cv180x/ddr/ddr.mk b/fsbl/plat/cv180x/ddr/ddr.mk index a5c70c255..8b1db2071 100644 --- a/fsbl/plat/cv180x/ddr/ddr.mk +++ b/fsbl/plat/cv180x/ddr/ddr.mk @@ -27,6 +27,7 @@ BL2_SOURCES += \ plat/${CHIP_ARCH}/ddr/ddr_pkg_info.c \ plat/${CHIP_ARCH}/ddr/ddr_sys_bring_up.c \ plat/${CHIP_ARCH}/ddr/ddr_sys.c \ + plat/${CHIP_ARCH}/ddr/ddr_suspend.c \ plat/${CHIP_ARCH}/ddr/phy_pll_init.c \ plat/${CHIP_ARCH}/ddr/cvx16_pinmux.c \ plat/${CHIP_ARCH}/ddr/cvx16_dram_cap_check.c \ @@ -104,4 +105,4 @@ endif # QFN88_9*9:1800C # $(eval $(call add_define_val,BRINGUP_CONF_INFO_VAL,0x70000000)) -endif \ No newline at end of file +endif diff --git a/fsbl/plat/cv180x/ddr/ddr_suspend.c b/fsbl/plat/cv180x/ddr/ddr_suspend.c new file mode 100644 index 000000000..1874cc818 --- /dev/null +++ b/fsbl/plat/cv180x/ddr/ddr_suspend.c @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include +#include +#include +#include "mmio.h" +#include "reg_soc.h" +#include "phy_pll_init.h" +#include "ddr_sys.h" +#include "ddr_suspend.h" +#include "bitwise_ops.h" +// #include "regconfig.h" +#include "rtc.h" +#include "cvx16_dram_cap_check.h" +#ifdef DDR2_3 +#include +#include +#else +#include +#endif + +void ddr_suspend_entry(void) +{ + ddr_sys_suspend_sus_res(); + rtc_clr_ddr_pwrok(); + rtc_clr_rmio_pwrok(); +#ifndef SUSPEND_USE_WDG_RST + rtc_req_suspend(); +#else + rtc_req_wdg_rst(); +#endif +} + +void ddr_sys_suspend_sus_res(void) +{ + cvx16_ddrc_suspend_sus_res(); + + cvx16_ddr_phyd_save_sus_res(0x05026800); + + cvx16_ddr_phya_pd_sus_res(); +} + +void cvx16_ddrc_suspend_sus_res(void) +{ + uint32_t rddata; + + // Write 0 to PCTRL_n.port_en + for (int i = 0; i < 4; i++) + mmio_wr32(cfg_base + 0x490 + 0xb0 * i, 0x0); + + while (1) { + rddata = mmio_rd32(cfg_base + 0x3fc); + if (rddata == 0) + break; + } + + //Write 1 to PWRCTL.selfref_sw + rddata = mmio_rd32(cfg_base + 0x30); + rddata = FIELD_SET(rddata, 1, 5, 5); + mmio_wr32(cfg_base + 0x30, rddata); + + //Poll STAT.selfref_type= 2'b10 + //Poll STAT.selfref_state = 0b10 (LPDDR4 only) + while (1) { + rddata = mmio_rd32(cfg_base + 0x4); + if (FIELD_GET(rddata, 5, 4) == 0x2) + break; + } +} + +void cvx16_ddr_phya_pd_sus_res(void) +{ + uint32_t rddata; + // ----------- PHY oen/pd reset ---------------- + //OEN + //param_phyd_tx_ca_oenz 0 + //param_phyd_tx_ca_clk0_oenz 8 + //param_phyd_tx_ca_clk1_oenz 16 + rddata = 0x00010101; + mmio_wr32(0x0130 + PHYD_BASE_ADDR, rddata); + //PD + //TOP_REG_TX_CA_PD_CA 22 0 + //TOP_REG_TX_CA_PD_CKE0 24 24 + //TOP_REG_TX_CLK_PD_CLK0 26 26 + //TOP_REG_TX_CA_PD_CSB0 28 28 + //TOP_REG_TX_CA_PD_RESETZ 30 30 + //TOP_REG_TX_ZQ_PD 31 31 + //rddata[31:0] = 0x947f_ffff; + rddata = 0x947fffff; + mmio_wr32(0x40 + CV_DDR_PHYD_APB, rddata); + + //TOP_REG_TX_BYTE0_PD 0 + //TOP_REG_TX_BYTE1_PD 1 + rddata = 0x00000003; + mmio_wr32(0x00 + CV_DDR_PHYD_APB, rddata); + + //OEN + //param_phyd_sel_cke_oenz <= `PI_SD int_regin[0]; + rddata = mmio_rd32(0x0154 + PHYD_BASE_ADDR); + //rddata[0] = 0b1; + rddata = FIELD_SET(rddata, 1, 0, 0); + mmio_wr32(0x0154 + PHYD_BASE_ADDR, rddata); + + //PD + //All PHYA PD=0 + rddata = 0xffffffff; + mmio_wr32(0x40 + CV_DDR_PHYD_APB, rddata); + + //PLL PD + rddata = mmio_rd32(0x0C + CV_DDR_PHYD_APB); + //rddata[15] = 1; //TOP_REG_DDRPLL_PD + rddata = FIELD_SET(rddata, 1, 15, 15); + mmio_wr32(0x0C + CV_DDR_PHYD_APB, rddata); + + // ----------- PHY oen/pd reset ---------------- + //reg_ddr_ssc_syn_src_en =0 + rddata = mmio_rd32(0x40 + 0x03002900); + rddata = FIELD_SET(rddata, 0, 1, 1); //reg_ddr_ssc_syn_src_en + mmio_wr32(0x40 + 0x03002900, rddata); +} + +SUSPEND_DATA struct reg save_phy_regs[] = { + {0x0 + PHYD_BASE_ADDR, 0x0}, + {0x4 + PHYD_BASE_ADDR, 0x0}, + {0x8 + PHYD_BASE_ADDR, 0x0}, + {0xc + PHYD_BASE_ADDR, 0x0}, + {0x10 + PHYD_BASE_ADDR, 0x0}, + {0x14 + PHYD_BASE_ADDR, 0x0}, + {0x18 + PHYD_BASE_ADDR, 0x0}, + {0x1c + PHYD_BASE_ADDR, 0x0}, + {0x20 + PHYD_BASE_ADDR, 0x0}, + {0x24 + PHYD_BASE_ADDR, 0x0}, + {0x28 + PHYD_BASE_ADDR, 0x0}, + {0x2c + PHYD_BASE_ADDR, 0x0}, + {0x40 + PHYD_BASE_ADDR, 0x0}, + {0x44 + PHYD_BASE_ADDR, 0x0}, + {0x48 + PHYD_BASE_ADDR, 0x0}, + {0x4c + PHYD_BASE_ADDR, 0x0}, + {0x50 + PHYD_BASE_ADDR, 0x0}, + {0x54 + PHYD_BASE_ADDR, 0x0}, + {0x58 + PHYD_BASE_ADDR, 0x0}, + {0x5c + PHYD_BASE_ADDR, 0x0}, + {0x60 + PHYD_BASE_ADDR, 0x0}, + {0x64 + PHYD_BASE_ADDR, 0x0}, + {0x68 + PHYD_BASE_ADDR, 0x0}, + {0x70 + PHYD_BASE_ADDR, 0x0}, + {0x74 + PHYD_BASE_ADDR, 0x0}, + {0x80 + PHYD_BASE_ADDR, 0x0}, + {0x84 + PHYD_BASE_ADDR, 0x0}, + {0x88 + PHYD_BASE_ADDR, 0x0}, + {0x8c + PHYD_BASE_ADDR, 0x0}, + {0x90 + PHYD_BASE_ADDR, 0x0}, + {0x94 + PHYD_BASE_ADDR, 0x0}, + {0xa0 + PHYD_BASE_ADDR, 0x0}, + {0xa4 + PHYD_BASE_ADDR, 0x0}, + {0xa8 + PHYD_BASE_ADDR, 0x0}, + {0xac + PHYD_BASE_ADDR, 0x0}, + {0xb0 + PHYD_BASE_ADDR, 0x0}, + {0xb4 + PHYD_BASE_ADDR, 0x0}, + {0xb8 + PHYD_BASE_ADDR, 0x0}, + {0xbc + PHYD_BASE_ADDR, 0x0}, + {0xf8 + PHYD_BASE_ADDR, 0x0}, + {0xfc + PHYD_BASE_ADDR, 0x0}, + {0x100 + PHYD_BASE_ADDR, 0x0}, + {0x104 + PHYD_BASE_ADDR, 0x0}, + {0x10c + PHYD_BASE_ADDR, 0x0}, + {0x110 + PHYD_BASE_ADDR, 0x0}, + {0x114 + PHYD_BASE_ADDR, 0x0}, + {0x118 + PHYD_BASE_ADDR, 0x0}, + {0x11c + PHYD_BASE_ADDR, 0x0}, + {0x120 + PHYD_BASE_ADDR, 0x0}, + {0x124 + PHYD_BASE_ADDR, 0x0}, + {0x128 + PHYD_BASE_ADDR, 0x0}, + {0x12c + PHYD_BASE_ADDR, 0x0}, + {0x130 + PHYD_BASE_ADDR, 0x0}, + {0x134 + PHYD_BASE_ADDR, 0x0}, + {0x138 + PHYD_BASE_ADDR, 0x0}, + {0x140 + PHYD_BASE_ADDR, 0x0}, + {0x144 + PHYD_BASE_ADDR, 0x0}, + {0x148 + PHYD_BASE_ADDR, 0x0}, + {0x14c + PHYD_BASE_ADDR, 0x0}, + {0x150 + PHYD_BASE_ADDR, 0x0}, + {0x154 + PHYD_BASE_ADDR, 0x0}, + {0x158 + PHYD_BASE_ADDR, 0x0}, + {0x15c + PHYD_BASE_ADDR, 0x0}, + {0x164 + PHYD_BASE_ADDR, 0x0}, + {0x168 + PHYD_BASE_ADDR, 0x0}, + {0x16c + PHYD_BASE_ADDR, 0x0}, + {0x170 + PHYD_BASE_ADDR, 0x0}, + {0x174 + PHYD_BASE_ADDR, 0x0}, + {0x180 + PHYD_BASE_ADDR, 0x0}, + {0x184 + PHYD_BASE_ADDR, 0x0}, + {0x188 + PHYD_BASE_ADDR, 0x0}, + {0x18c + PHYD_BASE_ADDR, 0x0}, + {0x190 + PHYD_BASE_ADDR, 0x0}, + {0x200 + PHYD_BASE_ADDR, 0x0}, + {0x204 + PHYD_BASE_ADDR, 0x0}, + {0x208 + PHYD_BASE_ADDR, 0x0}, + {0x220 + PHYD_BASE_ADDR, 0x0}, + {0x224 + PHYD_BASE_ADDR, 0x0}, + {0x228 + PHYD_BASE_ADDR, 0x0}, + {0x400 + PHYD_BASE_ADDR, 0x0}, + {0x404 + PHYD_BASE_ADDR, 0x0}, + {0x408 + PHYD_BASE_ADDR, 0x0}, + {0x40c + PHYD_BASE_ADDR, 0x0}, + {0x410 + PHYD_BASE_ADDR, 0x0}, + {0x414 + PHYD_BASE_ADDR, 0x0}, + {0x418 + PHYD_BASE_ADDR, 0x0}, + {0x41c + PHYD_BASE_ADDR, 0x0}, + {0x500 + PHYD_BASE_ADDR, 0x0}, + {0x504 + PHYD_BASE_ADDR, 0x0}, + {0x508 + PHYD_BASE_ADDR, 0x0}, + {0x50c + PHYD_BASE_ADDR, 0x0}, + {0x510 + PHYD_BASE_ADDR, 0x0}, + {0x514 + PHYD_BASE_ADDR, 0x0}, + {0x518 + PHYD_BASE_ADDR, 0x0}, + {0x51c + PHYD_BASE_ADDR, 0x0}, + {0x520 + PHYD_BASE_ADDR, 0x0}, + {0x540 + PHYD_BASE_ADDR, 0x0}, + {0x544 + PHYD_BASE_ADDR, 0x0}, + {0x548 + PHYD_BASE_ADDR, 0x0}, + {0x54c + PHYD_BASE_ADDR, 0x0}, + {0x550 + PHYD_BASE_ADDR, 0x0}, + {0x554 + PHYD_BASE_ADDR, 0x0}, + {0x558 + PHYD_BASE_ADDR, 0x0}, + {0x55c + PHYD_BASE_ADDR, 0x0}, + {0x560 + PHYD_BASE_ADDR, 0x0}, + {0x900 + PHYD_BASE_ADDR, 0x0}, + {0x904 + PHYD_BASE_ADDR, 0x0}, + {0x908 + PHYD_BASE_ADDR, 0x0}, + {0x90c + PHYD_BASE_ADDR, 0x0}, + {0x910 + PHYD_BASE_ADDR, 0x0}, + {0x914 + PHYD_BASE_ADDR, 0x0}, + {0x918 + PHYD_BASE_ADDR, 0x0}, + {0x91c + PHYD_BASE_ADDR, 0x0}, + {0x920 + PHYD_BASE_ADDR, 0x0}, + {0x924 + PHYD_BASE_ADDR, 0x0}, + {0x928 + PHYD_BASE_ADDR, 0x0}, + {0x92c + PHYD_BASE_ADDR, 0x0}, + {0x930 + PHYD_BASE_ADDR, 0x0}, + {0x934 + PHYD_BASE_ADDR, 0x0}, + {0x938 + PHYD_BASE_ADDR, 0x0}, + {0x940 + PHYD_BASE_ADDR, 0x0}, + {0x944 + PHYD_BASE_ADDR, 0x0}, + {0x948 + PHYD_BASE_ADDR, 0x0}, + {0x94c + PHYD_BASE_ADDR, 0x0}, + {0x950 + PHYD_BASE_ADDR, 0x0}, + {0x954 + PHYD_BASE_ADDR, 0x0}, + {0x958 + PHYD_BASE_ADDR, 0x0}, + {0x95c + PHYD_BASE_ADDR, 0x0}, + {0x960 + PHYD_BASE_ADDR, 0x0}, + {0x964 + PHYD_BASE_ADDR, 0x0}, + {0x968 + PHYD_BASE_ADDR, 0x0}, + {0x96c + PHYD_BASE_ADDR, 0x0}, + {0x970 + PHYD_BASE_ADDR, 0x0}, + {0x974 + PHYD_BASE_ADDR, 0x0}, + {0x978 + PHYD_BASE_ADDR, 0x0}, + {0x97c + PHYD_BASE_ADDR, 0x0}, + {0x980 + PHYD_BASE_ADDR, 0x0}, + {0xa00 + PHYD_BASE_ADDR, 0x0}, + {0xa04 + PHYD_BASE_ADDR, 0x0}, + {0xa08 + PHYD_BASE_ADDR, 0x0}, + {0xa0c + PHYD_BASE_ADDR, 0x0}, + {0xa10 + PHYD_BASE_ADDR, 0x0}, + {0xa14 + PHYD_BASE_ADDR, 0x0}, + {0xa18 + PHYD_BASE_ADDR, 0x0}, + {0xa1c + PHYD_BASE_ADDR, 0x0}, + {0xa20 + PHYD_BASE_ADDR, 0x0}, + {0xa24 + PHYD_BASE_ADDR, 0x0}, + {0xa28 + PHYD_BASE_ADDR, 0x0}, + {0xa2c + PHYD_BASE_ADDR, 0x0}, + {0xa30 + PHYD_BASE_ADDR, 0x0}, + {0xa34 + PHYD_BASE_ADDR, 0x0}, + {0xa38 + PHYD_BASE_ADDR, 0x0}, + {0xa3c + PHYD_BASE_ADDR, 0x0}, + {0xa40 + PHYD_BASE_ADDR, 0x0}, + {0xa44 + PHYD_BASE_ADDR, 0x0}, + {0xa48 + PHYD_BASE_ADDR, 0x0}, + {0xa4c + PHYD_BASE_ADDR, 0x0}, + {0xa50 + PHYD_BASE_ADDR, 0x0}, + {0xa54 + PHYD_BASE_ADDR, 0x0}, + {0xa58 + PHYD_BASE_ADDR, 0x0}, + {0xa5c + PHYD_BASE_ADDR, 0x0}, + {0xa60 + PHYD_BASE_ADDR, 0x0}, + {0xa64 + PHYD_BASE_ADDR, 0x0}, + {0xa68 + PHYD_BASE_ADDR, 0x0}, + {0xa6c + PHYD_BASE_ADDR, 0x0}, + {0xa70 + PHYD_BASE_ADDR, 0x0}, + {0xa74 + PHYD_BASE_ADDR, 0x0}, + {0xa78 + PHYD_BASE_ADDR, 0x0}, + {0xa7c + PHYD_BASE_ADDR, 0x0}, + {0xb00 + PHYD_BASE_ADDR, 0x0}, + {0xb04 + PHYD_BASE_ADDR, 0x0}, + {0xb08 + PHYD_BASE_ADDR, 0x0}, + {0xb0c + PHYD_BASE_ADDR, 0x0}, + {0xb10 + PHYD_BASE_ADDR, 0x0}, + {0xb14 + PHYD_BASE_ADDR, 0x0}, + {0xb18 + PHYD_BASE_ADDR, 0x0}, + {0xb1c + PHYD_BASE_ADDR, 0x0}, + {0xb20 + PHYD_BASE_ADDR, 0x0}, + {0xb24 + PHYD_BASE_ADDR, 0x0}, + {0xb30 + PHYD_BASE_ADDR, 0x0}, + {0xb34 + PHYD_BASE_ADDR, 0x0}, + {0xb38 + PHYD_BASE_ADDR, 0x0}, + {0xb3c + PHYD_BASE_ADDR, 0x0}, + {0xb40 + PHYD_BASE_ADDR, 0x0}, + {0xb44 + PHYD_BASE_ADDR, 0x0}, + {0xb48 + PHYD_BASE_ADDR, 0x0}, + {0xb4c + PHYD_BASE_ADDR, 0x0}, + {0xb50 + PHYD_BASE_ADDR, 0x0}, + {0xb54 + PHYD_BASE_ADDR, 0x0}, + {0xDEADBEEF, 0xDEADBEEF}, +}; + +void cvx16_ddr_phyd_save_sus_res(uint32_t RTC_SRAM_BASE) +{ + // struct reg *psave_phy_regs = (struct reg *)RTC_SRAM_BASE; + uintptr_t temp = RTC_SRAM_BASE; + struct reg *psave_phy_regs = (struct reg *)temp; + int i; + + for (i = 0; i < ARRAY_SIZE(save_phy_regs) - 1; i++) { + psave_phy_regs[i].addr = save_phy_regs[i].addr; + psave_phy_regs[i].val = mmio_rd32(save_phy_regs[i].addr); + } +} + +void rtc_clr_ddr_pwrok(void) +{ + mmio_clrbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000001); +} + +void rtc_clr_rmio_pwrok(void) +{ + mmio_clrbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000002); +} + +#ifndef SUSPEND_USE_WDG_RST +void rtc_req_suspend(void) +{ + //info("Send suspend request\n"); + /* Enable power suspend wakeup source mask */ + mmio_write_32(REG_RTC_BASE + 0x3C, 0x1); // 1 = select prdata from 32K domain + mmio_write_32(REG_RTC_CTRL_BASE + RTC_CTRL0_UNLOCKKEY, 0xAB18); + if (mmio_read_32(RTC_INFO0) != MCU_FLAG) + mmio_write_32(REG_RTC_BASE + RTC_EN_PWR_WAKEUP, 0x3F); + else + mmio_write_32(REG_RTC_BASE + RTC_EN_PWR_WAKEUP, 0x0); + mmio_write_32(REG_RTC_BASE + RTC_EN_SUSPEND_REQ, 0x01); + while (mmio_read_32(REG_RTC_BASE + RTC_EN_SUSPEND_REQ) != 0x01) + ; + while (1) { + /* Send suspend request to RTC */ + mmio_write_32(REG_RTC_CTRL_BASE + RTC_CTRL0, 0x00800080); + mdelay(1); + } +} +#else +void rtc_req_wdg_rst(void) +{ + uint32_t write_data = 0; + + write_data = mmio_rd32(REG_RTC_CTRL_BASE + 0x18); //rtcsys_rst_ctrl + write_data = write_data | (0x01 << 24); //reg_rtcsys_reset_en + mmio_wr32(REG_RTC_CTRL_BASE + 0x18, write_data); // + mmio_wr32(REG_RTC_BASE + 0xE8, 0x04); // RTC_DB_REQ_WARM_RST + mmio_wr32(REG_RTC_BASE + 0xE0, 0x01); // RTC_EN_WDG_RST_REQ + mmio_wr32(REG_RTC_CTRL_BASE + 0x60, 0xA5); // write dummy register + mmio_wr32(REG_RTC_CTRL_BASE + 0x04, 0xAB18); // rtc_ctrl0_unlockkey + write_data = mmio_rd32(REG_RTC_CTRL_BASE + 0x08); // rtc_ctrl0 + //req_shdn = rtc_ctrl0[0]; + //req_sw_thm_shdn = rtc_ctrl0[1]; + //hw_thm_shdn_en = rtc_ctrl0[2]; + //req_pwr_cyc = rtc_ctrl0[3]; + //req_warm_rst = rtc_ctrl0[4]; + //req_sw_wdg_rst = rtc_ctrl0[5]; + //hw_wdg_rst_en = rtc_ctrl0[6]; + //req_suspend = rtc_ctrl0[7]; + write_data = 0xffff0000 | write_data | (0x01 << 5); + // printf("[RTC] ----> Set req_sw_wdg_rst to 1 by register setting\n"); + mmio_wr32(REG_RTC_CTRL_BASE + 0x08, write_data); //rtc_ctrl0 +} +#endif diff --git a/fsbl/plat/cv180x/ddr/ddr_sys.c b/fsbl/plat/cv180x/ddr/ddr_sys.c index c8f4f367b..2d97ff84d 100644 --- a/fsbl/plat/cv180x/ddr/ddr_sys.c +++ b/fsbl/plat/cv180x/ddr/ddr_sys.c @@ -13,6 +13,7 @@ #include #include #include +#include #define opdelay(_x) udelay((_x)/1000) @@ -164,13 +165,17 @@ void ddr_sys_resume(void) // KC_MSG("ddr_sub_resume1\n"); // pll_init - cvx16_pll_init(); + pll_init(); KC_MSG("pll_init_h finish\n"); // ctrl_init ddrc_init(); KC_MSG("2nd ctrl_init_h finish\n"); + // set axi QOS + mmio_wr32(0x030001D8, 0x008899aa); + mmio_wr32(0x030001DC, 0x00002244); + // ddr_sub_resume2 cvx16_ddr_sub_resume2(); KC_MSG("ddr_sub_resume2\n"); @@ -6232,590 +6237,39 @@ void cvx16_ddr_phyd_save(uint32_t sram_base_addr) void cvx16_ddr_phyd_restore(uint32_t sram_base_addr) { - int sram_offset = 0x0; - { - uartlog("cvx16_ddr_phyd_restore\n"); - ddr_debug_wr32(0x47); - ddr_debug_num_write(); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xc + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x10 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x14 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x18 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x1c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x20 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x24 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x28 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x2c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x40 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x44 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x48 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x4c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x50 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x54 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x58 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x5c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x60 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x64 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x68 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x70 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x74 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x80 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x84 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x88 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x8c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x90 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x94 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xac + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xbc + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xf0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xf4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xf8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xfc + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x100 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x104 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x10c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x110 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x114 + PHYD_BASE_ADDR, rddata); - // reset param_phyd_clkctrl_init_complete - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x118 + PHYD_BASE_ADDR, rddata & 0x00000000); - //------------------------------------------------------------ - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x11c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x120 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x124 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x128 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x12c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // mmio_wr32 ( 0x130 + PHYD_BASE_ADDR, rddata ); - // ca oenz set by c-code - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x134 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x138 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x140 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x144 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x148 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x14c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x150 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // param_phyd_sel_cke_oenz=1 - mmio_wr32(0x154 + PHYD_BASE_ADDR, (rddata | 0x00000001)); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x158 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x15c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x164 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x168 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x16c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x170 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x174 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x180 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x184 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x188 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x18c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x190 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x200 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // param_phya_reg_tx_byte0_en_extend_oenz_gated_dline =0 - mmio_wr32(0x204 + PHYD_BASE_ADDR, (rddata & 0xFFFBFFFF)); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x208 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x220 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // param_phya_reg_tx_byte1_en_extend_oenz_gated_dline =0 - mmio_wr32(0x224 + PHYD_BASE_ADDR, (rddata & 0xFFFBFFFF)); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x228 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x400 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x404 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x408 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x40c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x410 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x414 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x418 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x41c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x500 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x504 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x508 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x50c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x510 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x514 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x518 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x51c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x520 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x540 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x544 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x548 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x54c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x550 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x554 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x558 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x55c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x560 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x900 + PHYD_BASE_ADDR, rddata); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x904 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x908 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x90c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x910 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x914 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x918 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x91c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x920 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x924 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x928 + PHYD_BASE_ADDR, rddata ); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x92c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x930 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x934 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x938 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x940 + PHYD_BASE_ADDR, rddata); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x944 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x948 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x94c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x950 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x954 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x958 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x95c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x960 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x964 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x968 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x96c + PHYD_BASE_ADDR, rddata ); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x970 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x974 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x978 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x97c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x980 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa00 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa04 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa08 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa0c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa10 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa14 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa18 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa1c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa20 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa24 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa28 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa2c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa30 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa34 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa38 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa3c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa40 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa44 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa48 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa4c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa50 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa54 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa58 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa5c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa60 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa64 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa68 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa6c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa70 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa74 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa78 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa7c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb00 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb04 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb08 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb0c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb10 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb14 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb18 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb1c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb20 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb24 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb30 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb34 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb38 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb3c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb40 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb44 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb48 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb4c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb50 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb54 + PHYD_BASE_ADDR, rddata); + uintptr_t temp = sram_base_addr; + struct regconf *psave_phy_regs = (struct regconf *)temp; + int i = 0; + uint32_t addr; + uint32_t val; + + while (1) { + addr = psave_phy_regs[i].addr; + val = psave_phy_regs[i].val; + i++; + + if ((addr < (0x0 + PHYD_BASE_ADDR)) || (addr > (0xb54 + PHYD_BASE_ADDR))) + break; + + switch (addr) { + case (0x118 + PHYD_BASE_ADDR): + //reset param_phyd_clkctrl_init_complete + val &= 0x00000000; + break; + case (0x130 + PHYD_BASE_ADDR): + //ca oenz set by c-code + continue; + case (0x154 + PHYD_BASE_ADDR): + val |= 0x00000001; + break; + case (0x204 + PHYD_BASE_ADDR): + val &= 0xFFFBFFFF; + break; + case (0x224 + PHYD_BASE_ADDR): + val &= 0xFFFBFFFF; + break; + } + mmio_write_32(addr, val); } } diff --git a/fsbl/plat/cv180x/include/ddr/ddr.h b/fsbl/plat/cv180x/include/ddr/ddr.h index 1f424910d..fb38e4ccb 100644 --- a/fsbl/plat/cv180x/include/ddr/ddr.h +++ b/fsbl/plat/cv180x/include/ddr/ddr.h @@ -7,5 +7,4 @@ struct ddr_param { int ddr_init(const struct ddr_param *ddr_param); - #endif /* __DDR_H__ */ diff --git a/fsbl/plat/cv180x/include/ddr/ddr_suspend.h b/fsbl/plat/cv180x/include/ddr/ddr_suspend.h new file mode 100644 index 000000000..c54a6bc4b --- /dev/null +++ b/fsbl/plat/cv180x/include/ddr/ddr_suspend.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +#define SUSPEND_ENTRY __section(".suspend_entry") +#define SUSPEND_FUNC __section(".suspend_func") +#define SUSPEND_DATA __section(".suspend_data") + +SUSPEND_ENTRY void ddr_suspend_entry(void); +static SUSPEND_FUNC void ddr_sys_suspend_sus_res(void); +static SUSPEND_FUNC void cvx16_ddr_phya_pd_sus_res(void); +static SUSPEND_FUNC void cvx16_ddrc_suspend_sus_res(void); +static SUSPEND_FUNC void cvx16_ddr_phyd_save_sus_res(uint32_t); +static SUSPEND_FUNC void rtc_clr_ddr_pwrok(void); +static SUSPEND_FUNC void rtc_clr_rmio_pwrok(void); +// #define SUSPEND_USE_WDG_RST +#ifndef SUSPEND_USE_WDG_RST +static SUSPEND_FUNC void rtc_req_suspend(void); +#else +static SUSPEND_FUNC void rtc_req_wdg_rst(void); +#endif + +struct reg { + uint32_t addr; + uint32_t val; +}; diff --git a/fsbl/plat/cv180x/include/ddr/ddr_sys.h b/fsbl/plat/cv180x/include/ddr/ddr_sys.h index 120f8fac4..f4bf06fd2 100644 --- a/fsbl/plat/cv180x/include/ddr/ddr_sys.h +++ b/fsbl/plat/cv180x/include/ddr/ddr_sys.h @@ -60,10 +60,10 @@ enum train_mode { #define ddr_sram_wr32(a, b) mmio_wr32(a, b) #define ddr_debug_wr32(b) -//#define uartlog(...) tf_printf(MSG_NOTICE "U: " __VA_ARGS__) -//#define KC_MSG(...) tf_printf(MSG_NOTICE "[KC_DBG] " __VA_ARGS__) -//#define KC_MSG_TR(...) tf_printf(MSG_NOTICE "[KC_DBG_training]" __VA_ARGS__) -//#define TJ_MSG(...) tf_printf(MSG_NOTICE "[TJ Info] : " __VA_ARGS__) +// #define uartlog(...) tf_printf(MSG_NOTICE "U: " __VA_ARGS__) +// #define KC_MSG(...) tf_printf(MSG_NOTICE "[KC_DBG] " __VA_ARGS__) +// #define KC_MSG_TR(...) tf_printf(MSG_NOTICE "[KC_DBG_training]" __VA_ARGS__) +// #define TJ_MSG(...) tf_printf(MSG_NOTICE "[TJ Info] : " __VA_ARGS__) #define uartlog(...) #define KC_MSG(...) diff --git a/fsbl/plat/cv180x/include/platform.h b/fsbl/plat/cv180x/include/platform.h index 4488db79f..e88e050ad 100644 --- a/fsbl/plat/cv180x/include/platform.h +++ b/fsbl/plat/cv180x/include/platform.h @@ -51,6 +51,12 @@ enum CHIP_CONF_CMD { CHIP_CONF_CMD_DELAY_MS = 0xFFFFFFFD }; +enum CHIP_CLK_MODE { + CLK_ND = 0, + CLK_OD, + CLK_VC_OD +}; + void apply_chip_conf(const struct chip_conf chip_conf[], uint32_t size, enum CHIP_CONF_CMD scan_start, enum CHIP_CONF_CMD scan_end); @@ -126,6 +132,7 @@ void lock_efuse_chipsn(void); int load_ddr(void); int load_rest(void); int load_rest_od_sel(void); +void jump_to_warmboot_entry(void); #endif /* __ASSEMBLY__ */ diff --git a/fsbl/plat/cv181x/bl2/bl2.ld.S b/fsbl/plat/cv181x/bl2/bl2.ld.S index 232a7d8ab..05a777bb7 100644 --- a/fsbl/plat/cv181x/bl2/bl2.ld.S +++ b/fsbl/plat/cv181x/bl2/bl2.ld.S @@ -17,6 +17,8 @@ ENTRY(bl2_entrypoint) MEMORY { RAM (rwx): ORIGIN = BL2_BASE, LENGTH = BL2_SIZE + + SRAM (rwx): ORIGIN = 0x000000000C030000, LENGTH = 0x10000 } SECTIONS @@ -80,5 +82,17 @@ SECTIONS ASSERT(. <= (BL2_BASE + BL2_SIZE), "BL2 image has exceeded its limit.") + .suspend_sect : + { + . = ALIGN(8); + __suspend_sect_start = .; + KEEP(*(.suspend_entry)) + KEEP(*(.suspend_func)) + . = ALIGN(8); + __suspend_data_start = .; + KEEP(*(.suspend_data)) + . = ALIGN(8); + __suspend_sect_end = .; + } > SRAM #include } diff --git a/fsbl/plat/cv181x/bl2/bl2_main.c b/fsbl/plat/cv181x/bl2/bl2_main.c index a4f1aec18..0a5de0364 100644 --- a/fsbl/plat/cv181x/bl2/bl2_main.c +++ b/fsbl/plat/cv181x/bl2/bl2_main.c @@ -75,8 +75,6 @@ void bl2_main(void) set_rtc_en_registers(); - load_ddr(); - #ifdef OD_CLK_SEL mode = CLK_OD; #else @@ -86,6 +84,14 @@ void bl2_main(void) mode = CLK_ND; #endif #endif + +#ifdef CONFIG_PM_SLEEP +#ifndef NO_DDR_CFG //for fpga + jump_to_warmboot_entry(mode); +#endif +#endif + load_ddr(); + load_rest(mode); NOTICE("BL2 end.\n"); diff --git a/fsbl/plat/cv181x/bl2/bl2_opt.c b/fsbl/plat/cv181x/bl2/bl2_opt.c index c73fa5574..755e23869 100644 --- a/fsbl/plat/cv181x/bl2/bl2_opt.c +++ b/fsbl/plat/cv181x/bl2/bl2_opt.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -18,6 +20,7 @@ struct _time_records *time_records = (void *)TIME_RECORDS_ADDR; struct fip_param1 *fip_param1 = (void *)PARAM1_BASE; +enum CHIP_CLK_MODE chip_clk_mode = CLK_ND; static struct fip_param2 fip_param2 __aligned(BLOCK_SIZE); static union { struct ddr_param ddr_param; @@ -376,6 +379,65 @@ int load_loader_2nd(int retry, uint64_t *loader_2nd_entry) return 0; } +#ifndef NO_DDR_CFG //for fpga +static void *get_warmboot_entry(void) +{ + /* + * "FSM state change to ST_ON from the state + * 4'h0 = state changed from ST_OFF to ST_ON + * 4'h3 = state changed to ST_PWR_CYC or ST_WARM_RESET then back to ST_ON + * 4'h9 = state changed from ST_SUSP to ST_ON + */ +#define WANTED_STATE 0x9 + + NOTICE("\nREG_RTC_ST_ON_REASON=0x%x\n", mmio_read_32(REG_RTC_ST_ON_REASON)); + NOTICE("\nRTC_SRAM_FLAG_ADDR%x=0x%x\n", RTC_SRAM_FLAG_ADDR, mmio_read_32(RTC_SRAM_FLAG_ADDR)); + /* Check if RTC state changed from ST_SUSP */ + if ((mmio_read_32(REG_RTC_ST_ON_REASON) & 0xF) == WANTED_STATE) + return (void *)(uintptr_t)mmio_read_32(RTC_SRAM_FLAG_ADDR); + + return 0; +} +#endif +void rtc_set_ddr_pwrok(void) +{ + mmio_setbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000001); +} + +void rtc_set_rmio_pwrok(void) +{ + mmio_setbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000002); +} + +#ifndef NO_DDR_CFG //for fpga +static void ddr_resume(void) +{ + rtc_set_ddr_pwrok(); + rtc_set_rmio_pwrok(); + ddr_sys_resume(); +} + +void jump_to_warmboot_entry(enum CHIP_CLK_MODE mode) +{ + void (*warmboot_entry)() = get_warmboot_entry(); + + // treat next reset as normal boot + mmio_write_64(RTC_SRAM_FLAG_ADDR, 0); + if (warmboot_entry) { + INFO("WE=0x%lx\n", (uintptr_t)warmboot_entry); + + NOTICE("ddr resume...\n"); + ddr_resume(); + NOTICE("ddr resume end\n"); + + sys_pll_init(mode); + sys_switch_all_to_pll(); + + warmboot_entry(); + } +} +#endif + int load_rest(enum CHIP_CLK_MODE mode) { int retry = 0; diff --git a/fsbl/plat/cv181x/ddr/ddr.mk b/fsbl/plat/cv181x/ddr/ddr.mk index 01a45d33e..84b383b22 100644 --- a/fsbl/plat/cv181x/ddr/ddr.mk +++ b/fsbl/plat/cv181x/ddr/ddr.mk @@ -27,6 +27,7 @@ BL2_SOURCES += \ plat/${CHIP_ARCH}/ddr/ddr_pkg_info.c \ plat/${CHIP_ARCH}/ddr/ddr_sys_bring_up.c \ plat/${CHIP_ARCH}/ddr/ddr_sys.c \ + plat/${CHIP_ARCH}/ddr/ddr_suspend.c \ plat/${CHIP_ARCH}/ddr/phy_pll_init.c \ plat/${CHIP_ARCH}/ddr/cvx16_pinmux.c \ plat/${CHIP_ARCH}/ddr/cvx16_dram_cap_check.c \ diff --git a/fsbl/plat/cv181x/ddr/ddr_suspend.c b/fsbl/plat/cv181x/ddr/ddr_suspend.c new file mode 100644 index 000000000..f03719340 --- /dev/null +++ b/fsbl/plat/cv181x/ddr/ddr_suspend.c @@ -0,0 +1,384 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include +#include +#include +#include "mmio.h" +#include "reg_soc.h" +#include "phy_pll_init.h" +#include "ddr_sys.h" +#include "ddr_suspend.h" +#include "bitwise_ops.h" +// #include "regconfig.h" +#include "rtc.h" +#include "cvx16_dram_cap_check.h" +#ifdef DDR2_3 +#include +#include +#else +#include +#endif + +void ddr_suspend_entry(void) +{ + ddr_sys_suspend_sus_res(); + rtc_clr_ddr_pwrok(); + rtc_clr_rmio_pwrok(); +#ifndef SUSPEND_USE_WDG_RST + rtc_req_suspend(); +#else + rtc_req_wdg_rst(); +#endif +} + +void ddr_sys_suspend_sus_res(void) +{ + cvx16_ddrc_suspend_sus_res(); + + cvx16_ddr_phyd_save_sus_res(0x05026800); + + cvx16_ddr_phya_pd_sus_res(); +} + +void cvx16_ddrc_suspend_sus_res(void) +{ + uint32_t rddata; + + // Write 0 to PCTRL_n.port_en + for (int i = 0; i < 4; i++) + mmio_wr32(cfg_base + 0x490 + 0xb0 * i, 0x0); + + while (1) { + rddata = mmio_rd32(cfg_base + 0x3fc); + if (rddata == 0) + break; + } + + //Write 1 to PWRCTL.selfref_sw + rddata = mmio_rd32(cfg_base + 0x30); + rddata = FIELD_SET(rddata, 1, 5, 5); + mmio_wr32(cfg_base + 0x30, rddata); + + //Poll STAT.selfref_type= 2'b10 + //Poll STAT.selfref_state = 0b10 (LPDDR4 only) + while (1) { + rddata = mmio_rd32(cfg_base + 0x4); + if (FIELD_GET(rddata, 5, 4) == 0x2) + break; + } +} + +void cvx16_ddr_phya_pd_sus_res(void) +{ + uint32_t rddata; + // ----------- PHY oen/pd reset ---------------- + //OEN + //param_phyd_tx_ca_oenz 0 + //param_phyd_tx_ca_clk0_oenz 8 + //param_phyd_tx_ca_clk1_oenz 16 + rddata = 0x00010101; + mmio_wr32(0x0130 + PHYD_BASE_ADDR, rddata); + //PD + //TOP_REG_TX_CA_PD_CA 22 0 + //TOP_REG_TX_CA_PD_CKE0 24 24 + //TOP_REG_TX_CLK_PD_CLK0 26 26 + //TOP_REG_TX_CA_PD_CSB0 28 28 + //TOP_REG_TX_CA_PD_RESETZ 30 30 + //TOP_REG_TX_ZQ_PD 31 31 + //rddata[31:0] = 0x947f_ffff; + rddata = 0x947fffff; + mmio_wr32(0x40 + CV_DDR_PHYD_APB, rddata); + + //TOP_REG_TX_BYTE0_PD 0 + //TOP_REG_TX_BYTE1_PD 1 + rddata = 0x00000003; + mmio_wr32(0x00 + CV_DDR_PHYD_APB, rddata); + + //OEN + //param_phyd_sel_cke_oenz <= `PI_SD int_regin[0]; + rddata = mmio_rd32(0x0154 + PHYD_BASE_ADDR); + //rddata[0] = 0b1; + rddata = FIELD_SET(rddata, 1, 0, 0); + mmio_wr32(0x0154 + PHYD_BASE_ADDR, rddata); + + //PD + //All PHYA PD=0 + rddata = 0xffffffff; + mmio_wr32(0x40 + CV_DDR_PHYD_APB, rddata); + + //PLL PD + rddata = mmio_rd32(0x0C + CV_DDR_PHYD_APB); + //rddata[15] = 1; //TOP_REG_DDRPLL_PD + rddata = FIELD_SET(rddata, 1, 15, 15); + mmio_wr32(0x0C + CV_DDR_PHYD_APB, rddata); + + // ----------- PHY oen/pd reset ---------------- + //reg_ddr_ssc_syn_src_en =0 + rddata = mmio_rd32(0x40 + 0x03002900); + rddata = FIELD_SET(rddata, 0, 1, 1); //reg_ddr_ssc_syn_src_en + mmio_wr32(0x40 + 0x03002900, rddata); +} + +SUSPEND_DATA struct reg save_phy_regs[] = { + {0x0 + PHYD_BASE_ADDR, 0x0}, + {0x4 + PHYD_BASE_ADDR, 0x0}, + {0x8 + PHYD_BASE_ADDR, 0x0}, + {0xc + PHYD_BASE_ADDR, 0x0}, + {0x10 + PHYD_BASE_ADDR, 0x0}, + {0x14 + PHYD_BASE_ADDR, 0x0}, + {0x18 + PHYD_BASE_ADDR, 0x0}, + {0x1c + PHYD_BASE_ADDR, 0x0}, + {0x20 + PHYD_BASE_ADDR, 0x0}, + {0x24 + PHYD_BASE_ADDR, 0x0}, + {0x28 + PHYD_BASE_ADDR, 0x0}, + {0x2c + PHYD_BASE_ADDR, 0x0}, + {0x40 + PHYD_BASE_ADDR, 0x0}, + {0x44 + PHYD_BASE_ADDR, 0x0}, + {0x48 + PHYD_BASE_ADDR, 0x0}, + {0x4c + PHYD_BASE_ADDR, 0x0}, + {0x50 + PHYD_BASE_ADDR, 0x0}, + {0x54 + PHYD_BASE_ADDR, 0x0}, + {0x58 + PHYD_BASE_ADDR, 0x0}, + {0x5c + PHYD_BASE_ADDR, 0x0}, + {0x60 + PHYD_BASE_ADDR, 0x0}, + {0x64 + PHYD_BASE_ADDR, 0x0}, + {0x68 + PHYD_BASE_ADDR, 0x0}, + {0x70 + PHYD_BASE_ADDR, 0x0}, + {0x74 + PHYD_BASE_ADDR, 0x0}, + {0x80 + PHYD_BASE_ADDR, 0x0}, + {0x84 + PHYD_BASE_ADDR, 0x0}, + {0x88 + PHYD_BASE_ADDR, 0x0}, + {0x8c + PHYD_BASE_ADDR, 0x0}, + {0x90 + PHYD_BASE_ADDR, 0x0}, + {0x94 + PHYD_BASE_ADDR, 0x0}, + {0xa0 + PHYD_BASE_ADDR, 0x0}, + {0xa4 + PHYD_BASE_ADDR, 0x0}, + {0xa8 + PHYD_BASE_ADDR, 0x0}, + {0xac + PHYD_BASE_ADDR, 0x0}, + {0xb0 + PHYD_BASE_ADDR, 0x0}, + {0xb4 + PHYD_BASE_ADDR, 0x0}, + {0xb8 + PHYD_BASE_ADDR, 0x0}, + {0xbc + PHYD_BASE_ADDR, 0x0}, + {0xf8 + PHYD_BASE_ADDR, 0x0}, + {0xfc + PHYD_BASE_ADDR, 0x0}, + {0x100 + PHYD_BASE_ADDR, 0x0}, + {0x104 + PHYD_BASE_ADDR, 0x0}, + {0x10c + PHYD_BASE_ADDR, 0x0}, + {0x110 + PHYD_BASE_ADDR, 0x0}, + {0x114 + PHYD_BASE_ADDR, 0x0}, + {0x118 + PHYD_BASE_ADDR, 0x0}, + {0x11c + PHYD_BASE_ADDR, 0x0}, + {0x120 + PHYD_BASE_ADDR, 0x0}, + {0x124 + PHYD_BASE_ADDR, 0x0}, + {0x128 + PHYD_BASE_ADDR, 0x0}, + {0x12c + PHYD_BASE_ADDR, 0x0}, + {0x130 + PHYD_BASE_ADDR, 0x0}, + {0x134 + PHYD_BASE_ADDR, 0x0}, + {0x138 + PHYD_BASE_ADDR, 0x0}, + {0x140 + PHYD_BASE_ADDR, 0x0}, + {0x144 + PHYD_BASE_ADDR, 0x0}, + {0x148 + PHYD_BASE_ADDR, 0x0}, + {0x14c + PHYD_BASE_ADDR, 0x0}, + {0x150 + PHYD_BASE_ADDR, 0x0}, + {0x154 + PHYD_BASE_ADDR, 0x0}, + {0x158 + PHYD_BASE_ADDR, 0x0}, + {0x15c + PHYD_BASE_ADDR, 0x0}, + {0x164 + PHYD_BASE_ADDR, 0x0}, + {0x168 + PHYD_BASE_ADDR, 0x0}, + {0x16c + PHYD_BASE_ADDR, 0x0}, + {0x170 + PHYD_BASE_ADDR, 0x0}, + {0x174 + PHYD_BASE_ADDR, 0x0}, + {0x180 + PHYD_BASE_ADDR, 0x0}, + {0x184 + PHYD_BASE_ADDR, 0x0}, + {0x188 + PHYD_BASE_ADDR, 0x0}, + {0x18c + PHYD_BASE_ADDR, 0x0}, + {0x190 + PHYD_BASE_ADDR, 0x0}, + {0x200 + PHYD_BASE_ADDR, 0x0}, + {0x204 + PHYD_BASE_ADDR, 0x0}, + {0x208 + PHYD_BASE_ADDR, 0x0}, + {0x220 + PHYD_BASE_ADDR, 0x0}, + {0x224 + PHYD_BASE_ADDR, 0x0}, + {0x228 + PHYD_BASE_ADDR, 0x0}, + {0x400 + PHYD_BASE_ADDR, 0x0}, + {0x404 + PHYD_BASE_ADDR, 0x0}, + {0x408 + PHYD_BASE_ADDR, 0x0}, + {0x40c + PHYD_BASE_ADDR, 0x0}, + {0x410 + PHYD_BASE_ADDR, 0x0}, + {0x414 + PHYD_BASE_ADDR, 0x0}, + {0x418 + PHYD_BASE_ADDR, 0x0}, + {0x41c + PHYD_BASE_ADDR, 0x0}, + {0x500 + PHYD_BASE_ADDR, 0x0}, + {0x504 + PHYD_BASE_ADDR, 0x0}, + {0x508 + PHYD_BASE_ADDR, 0x0}, + {0x50c + PHYD_BASE_ADDR, 0x0}, + {0x510 + PHYD_BASE_ADDR, 0x0}, + {0x514 + PHYD_BASE_ADDR, 0x0}, + {0x518 + PHYD_BASE_ADDR, 0x0}, + {0x51c + PHYD_BASE_ADDR, 0x0}, + {0x520 + PHYD_BASE_ADDR, 0x0}, + {0x540 + PHYD_BASE_ADDR, 0x0}, + {0x544 + PHYD_BASE_ADDR, 0x0}, + {0x548 + PHYD_BASE_ADDR, 0x0}, + {0x54c + PHYD_BASE_ADDR, 0x0}, + {0x550 + PHYD_BASE_ADDR, 0x0}, + {0x554 + PHYD_BASE_ADDR, 0x0}, + {0x558 + PHYD_BASE_ADDR, 0x0}, + {0x55c + PHYD_BASE_ADDR, 0x0}, + {0x560 + PHYD_BASE_ADDR, 0x0}, + {0x900 + PHYD_BASE_ADDR, 0x0}, + {0x904 + PHYD_BASE_ADDR, 0x0}, + {0x908 + PHYD_BASE_ADDR, 0x0}, + {0x90c + PHYD_BASE_ADDR, 0x0}, + {0x910 + PHYD_BASE_ADDR, 0x0}, + {0x914 + PHYD_BASE_ADDR, 0x0}, + {0x918 + PHYD_BASE_ADDR, 0x0}, + {0x91c + PHYD_BASE_ADDR, 0x0}, + {0x920 + PHYD_BASE_ADDR, 0x0}, + {0x924 + PHYD_BASE_ADDR, 0x0}, + {0x928 + PHYD_BASE_ADDR, 0x0}, + {0x92c + PHYD_BASE_ADDR, 0x0}, + {0x930 + PHYD_BASE_ADDR, 0x0}, + {0x934 + PHYD_BASE_ADDR, 0x0}, + {0x938 + PHYD_BASE_ADDR, 0x0}, + {0x940 + PHYD_BASE_ADDR, 0x0}, + {0x944 + PHYD_BASE_ADDR, 0x0}, + {0x948 + PHYD_BASE_ADDR, 0x0}, + {0x94c + PHYD_BASE_ADDR, 0x0}, + {0x950 + PHYD_BASE_ADDR, 0x0}, + {0x954 + PHYD_BASE_ADDR, 0x0}, + {0x958 + PHYD_BASE_ADDR, 0x0}, + {0x95c + PHYD_BASE_ADDR, 0x0}, + {0x960 + PHYD_BASE_ADDR, 0x0}, + {0x964 + PHYD_BASE_ADDR, 0x0}, + {0x968 + PHYD_BASE_ADDR, 0x0}, + {0x96c + PHYD_BASE_ADDR, 0x0}, + {0x970 + PHYD_BASE_ADDR, 0x0}, + {0x974 + PHYD_BASE_ADDR, 0x0}, + {0x978 + PHYD_BASE_ADDR, 0x0}, + {0x97c + PHYD_BASE_ADDR, 0x0}, + {0x980 + PHYD_BASE_ADDR, 0x0}, + {0xa00 + PHYD_BASE_ADDR, 0x0}, + {0xa04 + PHYD_BASE_ADDR, 0x0}, + {0xa08 + PHYD_BASE_ADDR, 0x0}, + {0xa0c + PHYD_BASE_ADDR, 0x0}, + {0xa10 + PHYD_BASE_ADDR, 0x0}, + {0xa14 + PHYD_BASE_ADDR, 0x0}, + {0xa18 + PHYD_BASE_ADDR, 0x0}, + {0xa1c + PHYD_BASE_ADDR, 0x0}, + {0xa20 + PHYD_BASE_ADDR, 0x0}, + {0xa24 + PHYD_BASE_ADDR, 0x0}, + {0xa28 + PHYD_BASE_ADDR, 0x0}, + {0xa2c + PHYD_BASE_ADDR, 0x0}, + {0xa30 + PHYD_BASE_ADDR, 0x0}, + {0xa34 + PHYD_BASE_ADDR, 0x0}, + {0xa38 + PHYD_BASE_ADDR, 0x0}, + {0xa3c + PHYD_BASE_ADDR, 0x0}, + {0xa40 + PHYD_BASE_ADDR, 0x0}, + {0xa44 + PHYD_BASE_ADDR, 0x0}, + {0xa48 + PHYD_BASE_ADDR, 0x0}, + {0xa4c + PHYD_BASE_ADDR, 0x0}, + {0xa50 + PHYD_BASE_ADDR, 0x0}, + {0xa54 + PHYD_BASE_ADDR, 0x0}, + {0xa58 + PHYD_BASE_ADDR, 0x0}, + {0xa5c + PHYD_BASE_ADDR, 0x0}, + {0xa60 + PHYD_BASE_ADDR, 0x0}, + {0xa64 + PHYD_BASE_ADDR, 0x0}, + {0xa68 + PHYD_BASE_ADDR, 0x0}, + {0xa6c + PHYD_BASE_ADDR, 0x0}, + {0xa70 + PHYD_BASE_ADDR, 0x0}, + {0xa74 + PHYD_BASE_ADDR, 0x0}, + {0xa78 + PHYD_BASE_ADDR, 0x0}, + {0xa7c + PHYD_BASE_ADDR, 0x0}, + {0xb00 + PHYD_BASE_ADDR, 0x0}, + {0xb04 + PHYD_BASE_ADDR, 0x0}, + {0xb08 + PHYD_BASE_ADDR, 0x0}, + {0xb0c + PHYD_BASE_ADDR, 0x0}, + {0xb10 + PHYD_BASE_ADDR, 0x0}, + {0xb14 + PHYD_BASE_ADDR, 0x0}, + {0xb18 + PHYD_BASE_ADDR, 0x0}, + {0xb1c + PHYD_BASE_ADDR, 0x0}, + {0xb20 + PHYD_BASE_ADDR, 0x0}, + {0xb24 + PHYD_BASE_ADDR, 0x0}, + {0xb30 + PHYD_BASE_ADDR, 0x0}, + {0xb34 + PHYD_BASE_ADDR, 0x0}, + {0xb38 + PHYD_BASE_ADDR, 0x0}, + {0xb3c + PHYD_BASE_ADDR, 0x0}, + {0xb40 + PHYD_BASE_ADDR, 0x0}, + {0xb44 + PHYD_BASE_ADDR, 0x0}, + {0xb48 + PHYD_BASE_ADDR, 0x0}, + {0xb4c + PHYD_BASE_ADDR, 0x0}, + {0xb50 + PHYD_BASE_ADDR, 0x0}, + {0xb54 + PHYD_BASE_ADDR, 0x0}, + {0xDEADBEEF, 0xDEADBEEF}, +}; + +void cvx16_ddr_phyd_save_sus_res(uint32_t RTC_SRAM_BASE) +{ + // struct reg *psave_phy_regs = (struct reg *)RTC_SRAM_BASE; + uintptr_t temp = RTC_SRAM_BASE; + struct reg *psave_phy_regs = (struct reg *)temp; + int i; + + for (i = 0; i < ARRAY_SIZE(save_phy_regs) - 1; i++) { + psave_phy_regs[i].addr = save_phy_regs[i].addr; + psave_phy_regs[i].val = mmio_rd32(save_phy_regs[i].addr); + } +} + +void rtc_clr_ddr_pwrok(void) +{ + mmio_clrbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000001); +} + +void rtc_clr_rmio_pwrok(void) +{ + mmio_clrbits_32(REG_RTC_BASE + RTC_PG_REG, 0x00000002); +} + +#ifndef SUSPEND_USE_WDG_RST +void rtc_req_suspend(void) +{ + // info("Send suspend request\n"); + /* Enable power suspend wakeup source mask */ + mmio_write_32(REG_RTC_BASE + 0x3C, 0x1); // 1 = select prdata from 32K domain + mmio_write_32(REG_RTC_CTRL_BASE + RTC_CTRL0_UNLOCKKEY, 0xAB18); + if (mmio_read_32(RTC_INFO0) != MCU_FLAG) + mmio_write_32(REG_RTC_BASE + RTC_EN_PWR_WAKEUP, 0x3F); + else + mmio_write_32(REG_RTC_BASE + RTC_EN_PWR_WAKEUP, 0x0); + mmio_write_32(REG_RTC_BASE + RTC_EN_SUSPEND_REQ, 0x01); + while (mmio_read_32(REG_RTC_BASE + RTC_EN_SUSPEND_REQ) != 0x01) + ; + while (1) { + /* Send suspend request to RTC */ + mmio_write_32(REG_RTC_CTRL_BASE + RTC_CTRL0, 0x00800080); + mdelay(1); + } +} +#else +void rtc_req_wdg_rst(void) +{ + uint32_t write_data = 0; + + write_data = mmio_rd32(REG_RTC_CTRL_BASE + 0x18); //rtcsys_rst_ctrl + write_data = write_data | (0x01 << 24); //reg_rtcsys_reset_en + mmio_wr32(REG_RTC_CTRL_BASE + 0x18, write_data); // + mmio_wr32(REG_RTC_BASE + 0xE8, 0x04); // RTC_DB_REQ_WARM_RST + mmio_wr32(REG_RTC_BASE + 0xE0, 0x01); // RTC_EN_WDG_RST_REQ + mmio_wr32(REG_RTC_CTRL_BASE + 0x60, 0xA5); // write dummy register + mmio_wr32(REG_RTC_CTRL_BASE + 0x04, 0xAB18); // rtc_ctrl0_unlockkey + write_data = mmio_rd32(REG_RTC_CTRL_BASE + 0x08); // rtc_ctrl0 + //req_shdn = rtc_ctrl0[0]; + //req_sw_thm_shdn = rtc_ctrl0[1]; + //hw_thm_shdn_en = rtc_ctrl0[2]; + //req_pwr_cyc = rtc_ctrl0[3]; + //req_warm_rst = rtc_ctrl0[4]; + //req_sw_wdg_rst = rtc_ctrl0[5]; + //hw_wdg_rst_en = rtc_ctrl0[6]; + //req_suspend = rtc_ctrl0[7]; + write_data = 0xffff0000 | write_data | (0x01 << 5); + // printf("[RTC] ----> Set req_sw_wdg_rst to 1 by register setting\n"); + mmio_wr32(REG_RTC_CTRL_BASE + 0x08, write_data); //rtc_ctrl0 +} +#endif diff --git a/fsbl/plat/cv181x/ddr/ddr_sys.c b/fsbl/plat/cv181x/ddr/ddr_sys.c index 54cb5e2c7..215c6110a 100644 --- a/fsbl/plat/cv181x/ddr/ddr_sys.c +++ b/fsbl/plat/cv181x/ddr/ddr_sys.c @@ -12,6 +12,8 @@ #include #include #include +#include +#include #define opdelay(_x) udelay((_x)/1000) @@ -106,13 +108,17 @@ void ddr_sys_resume(void) // KC_MSG("ddr_sub_resume1\n"); // pll_init - cvx16_pll_init(); + pll_init(); KC_MSG("pll_init_h finish\n"); // ctrl_init ddrc_init(); KC_MSG("2nd ctrl_init_h finish\n"); + // set axi QOS + mmio_wr32(0x030001D8, 0x008899aa); + mmio_wr32(0x030001DC, 0x00002244); + // ddr_sub_resume2 cvx16_ddr_sub_resume2(); KC_MSG("ddr_sub_resume2\n"); @@ -6141,590 +6147,39 @@ void cvx16_ddr_phyd_save(uint32_t sram_base_addr) void cvx16_ddr_phyd_restore(uint32_t sram_base_addr) { - int sram_offset = 0x0; - { - uartlog("cvx16_ddr_phyd_restore\n"); - ddr_debug_wr32(0x47); - ddr_debug_num_write(); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xc + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x10 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x14 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x18 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x1c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x20 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x24 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x28 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x2c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x40 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x44 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x48 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x4c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x50 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x54 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x58 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x5c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x60 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x64 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x68 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x70 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x74 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x80 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x84 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x88 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x8c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x90 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x94 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xac + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xbc + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xf0 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xf4 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xf8 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xfc + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x100 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x104 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x10c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x110 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x114 + PHYD_BASE_ADDR, rddata); - // reset param_phyd_clkctrl_init_complete - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x118 + PHYD_BASE_ADDR, rddata & 0x00000000); - //------------------------------------------------------------ - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x11c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x120 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x124 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x128 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x12c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // mmio_wr32 ( 0x130 + PHYD_BASE_ADDR, rddata ); - // ca oenz set by c-code - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x134 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x138 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x140 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x144 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x148 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x14c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x150 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // param_phyd_sel_cke_oenz=1 - mmio_wr32(0x154 + PHYD_BASE_ADDR, (rddata | 0x00000001)); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x158 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x15c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x164 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x168 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x16c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x170 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x174 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x180 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x184 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x188 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x18c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x190 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x200 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // param_phya_reg_tx_byte0_en_extend_oenz_gated_dline =0 - mmio_wr32(0x204 + PHYD_BASE_ADDR, (rddata & 0xFFFBFFFF)); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x208 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x220 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - // param_phya_reg_tx_byte1_en_extend_oenz_gated_dline =0 - mmio_wr32(0x224 + PHYD_BASE_ADDR, (rddata & 0xFFFBFFFF)); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x228 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x400 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x404 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x408 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x40c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x410 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x414 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x418 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x41c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x500 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x504 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x508 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x50c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x510 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x514 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x518 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x51c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x520 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x540 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x544 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x548 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x54c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x550 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x554 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x558 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x55c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x560 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x900 + PHYD_BASE_ADDR, rddata); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x904 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x908 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x90c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x910 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x914 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x918 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x91c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x920 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x924 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x928 + PHYD_BASE_ADDR, rddata ); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x92c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x930 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x934 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x938 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x940 + PHYD_BASE_ADDR, rddata); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x944 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x948 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x94c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x950 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x954 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x958 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x95c + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x960 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x964 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x968 + PHYD_BASE_ADDR, rddata ); - // rddata = mmio_rd32(sram_base_addr + sram_offset); - // sram_offset += 4; - // mmio_wr32 ( 0x96c + PHYD_BASE_ADDR, rddata ); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x970 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x974 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x978 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x97c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0x980 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa00 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa04 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa08 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa0c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa10 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa14 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa18 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa1c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa20 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa24 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa28 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa2c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa30 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa34 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa38 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa3c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa40 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa44 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa48 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa4c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa50 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa54 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa58 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa5c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa60 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa64 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa68 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa6c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa70 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa74 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa78 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xa7c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb00 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb04 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb08 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb0c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb10 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb14 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb18 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb1c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb20 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb24 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb30 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb34 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb38 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb3c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb40 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb44 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb48 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb4c + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb50 + PHYD_BASE_ADDR, rddata); - rddata = mmio_rd32(sram_base_addr + sram_offset); - sram_offset += 4; - mmio_wr32(0xb54 + PHYD_BASE_ADDR, rddata); + uintptr_t temp = sram_base_addr; + struct regconf *psave_phy_regs = (struct regconf *)temp; + int i = 0; + uint32_t addr; + uint32_t val; + + while (1) { + addr = psave_phy_regs[i].addr; + val = psave_phy_regs[i].val; + i++; + + if ((addr < (0x0 + PHYD_BASE_ADDR)) || (addr > (0xb54 + PHYD_BASE_ADDR))) + break; + + switch (addr) { + case (0x118 + PHYD_BASE_ADDR): + //reset param_phyd_clkctrl_init_complete + val &= 0x00000000; + break; + case (0x130 + PHYD_BASE_ADDR): + //ca oenz set by c-code + continue; + case (0x154 + PHYD_BASE_ADDR): + val |= 0x00000001; + break; + case (0x204 + PHYD_BASE_ADDR): + val &= 0xFFFBFFFF; + break; + case (0x224 + PHYD_BASE_ADDR): + val &= 0xFFFBFFFF; + break; + } + mmio_write_32(addr, val); } } diff --git a/fsbl/plat/cv181x/include/ddr/ddr_suspend.h b/fsbl/plat/cv181x/include/ddr/ddr_suspend.h new file mode 100644 index 000000000..ca90defec --- /dev/null +++ b/fsbl/plat/cv181x/include/ddr/ddr_suspend.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +#define SUSPEND_ENTRY __section(".suspend_entry") +#define SUSPEND_FUNC __section(".suspend_func") +#define SUSPEND_DATA __section(".suspend_data") + +SUSPEND_ENTRY void ddr_suspend_entry(void); +static SUSPEND_FUNC void ddr_sys_suspend_sus_res(void); +static SUSPEND_FUNC void cvx16_ddr_phya_pd_sus_res(void); +static SUSPEND_FUNC void cvx16_ddrc_suspend_sus_res(void); +static SUSPEND_FUNC void cvx16_ddr_phyd_save_sus_res(uint32_t); +static SUSPEND_FUNC void rtc_clr_ddr_pwrok(void); +static SUSPEND_FUNC void rtc_clr_rmio_pwrok(void); +//#define SUSPEND_USE_WDG_RST +#ifndef SUSPEND_USE_WDG_RST +static SUSPEND_FUNC void rtc_req_suspend(void); +#else +static SUSPEND_FUNC void rtc_req_wdg_rst(void); +#endif + +struct reg { + uint32_t addr; + uint32_t val; +}; diff --git a/fsbl/plat/cv181x/include/platform.h b/fsbl/plat/cv181x/include/platform.h index b899e8878..92685757f 100644 --- a/fsbl/plat/cv181x/include/platform.h +++ b/fsbl/plat/cv181x/include/platform.h @@ -124,6 +124,7 @@ void sys_switch_all_to_pll(void); void lock_efuse_chipsn(void); int load_ddr(void); int load_rest(enum CHIP_CLK_MODE mode); +void jump_to_warmboot_entry(enum CHIP_CLK_MODE mode); #endif /* __ASSEMBLY__ */ diff --git a/fsbl/plat/cv181x/include/rtc.h b/fsbl/plat/cv181x/include/rtc.h index 67bb34346..959c13925 100644 --- a/fsbl/plat/cv181x/include/rtc.h +++ b/fsbl/plat/cv181x/include/rtc.h @@ -39,6 +39,9 @@ #define RTC_INFO2 (REG_RTC_BASE + 0x24) #define RTC_INFO3 (REG_RTC_BASE + 0x28) +#define CVI_SAPD_FLAG 0x53415044 +#define MCU_FLAG 0x8051 + #define REG_RTC_ST_ON_REASON (REG_RTC_BASE + RTC_ST_ON_REASON) #define RTCSYS_F32KLESS_BASE (RTC_SYS_BASE + 0x0002A000) @@ -46,4 +49,12 @@ #define RTC_INTERNAL_32K 0 #define RTC_EXTERNAL_32K 1 +#define PLAT_BM_TRUSTED_MAILBOX_BASE 0x0E000008 +#define PLAT_BM_TRUSTED_MAILBOX_SIZE 8 + +#define RTC_SRAM_FLAG_ADDR (RTC_CORE_SRAM_BASE + RTC_CORE_SRAM_SIZE - 8) +#define RTC_SRAM_TRUSTED_MAILBOX_BASE (RTC_SRAM_FLAG_ADDR - PLAT_BM_TRUSTED_MAILBOX_SIZE) + +#define BL31_WARMBOOT_ENTRY 0x80000040 + #endif /* __RTC_H__ */ diff --git a/fsbl/plat/cv181x/platform.c b/fsbl/plat/cv181x/platform.c index 2510fa3d1..56f1c1900 100644 --- a/fsbl/plat/cv181x/platform.c +++ b/fsbl/plat/cv181x/platform.c @@ -430,6 +430,9 @@ void sys_pll_init(enum CHIP_CLK_MODE mode) void switch_rtc_mode_1st_stage(void) { +#ifdef CONFIG_PM_SLEEP + return; +#endif uint32_t read_data; uint32_t write_data; uint32_t rtc_mode;