Skip to content

Commit 322d1b3

Browse files
dgarskedanielinux
authored andcommitted
Refactor DDR law setup for use with stage 2 as stack.
1 parent b3e2fb9 commit 322d1b3

File tree

10 files changed

+148
-162
lines changed

10 files changed

+148
-162
lines changed

config/examples/nxp-t2080.config

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ UART_FLASH?=0
1414
ALLOW_DOWNGRADE?=0
1515
NVM_FLASH_WRITEONCE?=0
1616
WOLFBOOT_VERSION?=0
17-
V?=1
1817
NO_MPU?=0
1918
SPMATH?=0
2019
SPMATHALL?=1

hal/nxp_p1021.c

Lines changed: 63 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,6 @@ enum elbc_amask_sizes {
348348

349349
/* DDR */
350350
/* DDR3: 512MB, 333.333 MHz (666.667 MT/s) */
351-
#define DDR_SIZE (512 * 1024 * 1024)
352351
#define DDR_CS0_BNDS_VAL 0x0000001F
353352
#define DDR_CS0_CONFIG_VAL 0x80014202
354353
#define DDR_CS_CONFIG_2_VAL 0x00000000
@@ -633,18 +632,6 @@ void hal_espi_deinit(void)
633632
}
634633
#endif /* ENABLE_ESPI */
635634

636-
637-
static void set_law(uint8_t idx, uint32_t addr, uint32_t trgt_id,
638-
uint32_t law_sz)
639-
{
640-
set32(LAWAR(idx), 0); /* reset */
641-
set32(LAWBAR(idx), addr >> 12);
642-
set32(LAWAR(idx), LAWAR_ENABLE | LAWAR_TRGT_ID(trgt_id) | law_sz);
643-
644-
/* Read back so that we sync the writes */
645-
(void)get32(LAWAR(idx));
646-
}
647-
648635
/* ---- DUART Driver ---- */
649636
#ifdef DEBUG_UART
650637

@@ -841,7 +828,7 @@ static int hal_flash_init(void)
841828
uint32_t flash_id[1] = {0};
842829

843830
/* eLBC - NAND Flash */
844-
set_law(4, FLASH_BASE_ADDR, LAW_TRGT_ELBC, LAW_SIZE_1MB);
831+
set_law(4, 0, FLASH_BASE_ADDR, LAW_TRGT_ELBC, LAW_SIZE_1MB, 1);
845832

846833
#ifdef BOOT_ROM_ADDR
847834
/* if this code is executing from BOOT ROM we cannot init eLBC yet */
@@ -904,62 +891,64 @@ static void hal_ddr_init(void)
904891
#ifdef ENABLE_DDR
905892
uint32_t reg;
906893

894+
/* Map LAW for DDR */
895+
set_law(6, 0, DDR_ADDRESS, LAW_TRGT_DDR, LAW_SIZE_512MB, 0);
896+
907897
/* If DDR is not already enabled */
908-
if ((get32(DDR_SDRAM_CFG) & DDR_SDRAM_CFG_MEM_EN) == 0) {
909-
/* Map LAW for DDR */
910-
set_law(6, DDR_ADDRESS, LAW_TRGT_DDR, LAW_SIZE_512MB);
911-
912-
/* Setup DDR CS (chip select) bounds */
913-
set32(DDR_CS_BNDS(0), DDR_CS0_BNDS_VAL);
914-
set32(DDR_CS_CONFIG(0), DDR_CS0_CONFIG_VAL);
915-
set32(DDR_CS_CONFIG_2(0), DDR_CS_CONFIG_2_VAL);
916-
917-
/* DDR SDRAM timing configuration */
918-
set32(DDR_TIMING_CFG_3, DDR_TIMING_CFG_3_VAL);
919-
set32(DDR_TIMING_CFG_0, DDR_TIMING_CFG_0_VAL);
920-
set32(DDR_TIMING_CFG_1, DDR_TIMING_CFG_1_VAL);
921-
set32(DDR_TIMING_CFG_2, DDR_TIMING_CFG_2_VAL);
922-
923-
set32(DDR_SDRAM_MODE, DDR_SDRAM_MODE_VAL);
924-
set32(DDR_SDRAM_MODE_2, DDR_SDRAM_MODE_2_VAL);
925-
set32(DDR_SDRAM_MD_CNTL, DDR_SDRAM_MD_CNTL_VAL);
926-
set32(DDR_SDRAM_INTERVAL, DDR_SDRAM_INTERVAL_VAL);
927-
set32(DDR_DATA_INIT, DDR_DATA_INIT_VAL);
928-
set32(DDR_SDRAM_CLK_CNTL, DDR_SDRAM_CLK_CNTL_VAL);
929-
set32(DDR_TIMING_CFG_4, DDR_TIMING_CFG_4_VAL);
930-
set32(DDR_TIMING_CFG_5, DDR_TIMING_CFG_5_VAL);
931-
set32(DDR_ZQ_CNTL, DDR_ZQ_CNTL_VAL);
932-
set32(DDR_WRLVL_CNTL, DDR_WRLVL_CNTL_VAL);
933-
934-
set32(DDR_SR_CNTR, 0);
935-
set32(DDR_SDRAM_RCW_1, 0);
936-
set32(DDR_SDRAM_RCW_2, 0);
937-
938-
set32(DDR_DDRCDR_1, DDR_DDRCDR_1_VAL);
939-
940-
941-
set32(DDR_SDRAM_CFG_2, DDR_SDRAM_CFG_2_VAL);
942-
set32(DDR_INIT_ADDR, 0);
943-
set32(DDR_INIT_EXT_ADDR, 0);
944-
set32(DDR_DDRCDR_2, DDR_DDRCDR_2_VAL);
945-
946-
/* Set values, but do not enable the DDR yet */
947-
set32(DDR_SDRAM_CFG, ((DDR_SDRAM_CFG_VAL & ~DDR_SDRAM_CFG_MEM_EN)));
948-
asm volatile("sync;isync");
949-
950-
/* busy wait for ~500us */
951-
udelay(500);
952-
953-
/* Enable controller */
954-
reg = get32(DDR_SDRAM_CFG) & ~DDR_SDRAM_CFG_BI;
955-
set32(DDR_SDRAM_CFG, reg | DDR_SDRAM_CFG_MEM_EN);
956-
asm volatile("sync;isync");
957-
958-
/* Wait for data initialization to complete */
959-
while (get32(DDR_SDRAM_CFG_2) & DDR_SDRAM_CFG_2_D_INIT) {
960-
/* busy wait loop - throttle polling */
961-
udelay(1);
962-
}
898+
if ((get32(DDR_SDRAM_CFG) & DDR_SDRAM_CFG_MEM_EN)) {
899+
return;
900+
}
901+
902+
/* Setup DDR CS (chip select) bounds */
903+
set32(DDR_CS_BNDS(0), DDR_CS0_BNDS_VAL);
904+
set32(DDR_CS_CONFIG(0), DDR_CS0_CONFIG_VAL);
905+
set32(DDR_CS_CONFIG_2(0), DDR_CS_CONFIG_2_VAL);
906+
907+
/* DDR SDRAM timing configuration */
908+
set32(DDR_TIMING_CFG_3, DDR_TIMING_CFG_3_VAL);
909+
set32(DDR_TIMING_CFG_0, DDR_TIMING_CFG_0_VAL);
910+
set32(DDR_TIMING_CFG_1, DDR_TIMING_CFG_1_VAL);
911+
set32(DDR_TIMING_CFG_2, DDR_TIMING_CFG_2_VAL);
912+
913+
set32(DDR_SDRAM_MODE, DDR_SDRAM_MODE_VAL);
914+
set32(DDR_SDRAM_MODE_2, DDR_SDRAM_MODE_2_VAL);
915+
set32(DDR_SDRAM_MD_CNTL, DDR_SDRAM_MD_CNTL_VAL);
916+
set32(DDR_SDRAM_INTERVAL, DDR_SDRAM_INTERVAL_VAL);
917+
set32(DDR_DATA_INIT, DDR_DATA_INIT_VAL);
918+
set32(DDR_SDRAM_CLK_CNTL, DDR_SDRAM_CLK_CNTL_VAL);
919+
set32(DDR_TIMING_CFG_4, DDR_TIMING_CFG_4_VAL);
920+
set32(DDR_TIMING_CFG_5, DDR_TIMING_CFG_5_VAL);
921+
set32(DDR_ZQ_CNTL, DDR_ZQ_CNTL_VAL);
922+
set32(DDR_WRLVL_CNTL, DDR_WRLVL_CNTL_VAL);
923+
924+
set32(DDR_SR_CNTR, 0);
925+
set32(DDR_SDRAM_RCW_1, 0);
926+
set32(DDR_SDRAM_RCW_2, 0);
927+
928+
set32(DDR_DDRCDR_1, DDR_DDRCDR_1_VAL);
929+
930+
931+
set32(DDR_SDRAM_CFG_2, DDR_SDRAM_CFG_2_VAL);
932+
set32(DDR_INIT_ADDR, 0);
933+
set32(DDR_INIT_EXT_ADDR, 0);
934+
set32(DDR_DDRCDR_2, DDR_DDRCDR_2_VAL);
935+
936+
/* Set values, but do not enable the DDR yet */
937+
set32(DDR_SDRAM_CFG, ((DDR_SDRAM_CFG_VAL & ~DDR_SDRAM_CFG_MEM_EN)));
938+
asm volatile("sync;isync");
939+
940+
/* busy wait for ~500us */
941+
udelay(500);
942+
943+
/* Enable controller */
944+
reg = get32(DDR_SDRAM_CFG) & ~DDR_SDRAM_CFG_BI;
945+
set32(DDR_SDRAM_CFG, reg | DDR_SDRAM_CFG_MEM_EN);
946+
asm volatile("sync;isync");
947+
948+
/* Wait for data initialization to complete */
949+
while (get32(DDR_SDRAM_CFG_2) & DDR_SDRAM_CFG_2_D_INIT) {
950+
/* busy wait loop - throttle polling */
951+
udelay(1);
963952
}
964953
#endif /* ENABLE_DDR */
965954
}
@@ -983,10 +972,10 @@ void hal_early_init(void)
983972
static int hal_pcie_init(void)
984973
{
985974
/* Map LAW for PCIe */
986-
set_law(0, CONFIG_SYS_PCIE1_MEM_PHYS, LAW_TRGT_PCIE1, LAW_SIZE_512MB),
987-
set_law(1, CONFIG_SYS_PCIE1_IO_PHYS, LAW_TRGT_PCIE1, LAW_SIZE_64KB),
988-
set_law(2, CONFIG_SYS_PCIE2_MEM_PHYS, LAW_TRGT_PCIE2, LAW_SIZE_512MB),
989-
set_law(3, CONFIG_SYS_PCIE2_IO_PHYS, LAW_TRGT_PCIE2, LAW_SIZE_64KB),
975+
set_law(0, 0, CONFIG_SYS_PCIE1_MEM_PHYS, LAW_TRGT_PCIE1, LAW_SIZE_512MB, 1),
976+
set_law(1, 0, CONFIG_SYS_PCIE1_IO_PHYS, LAW_TRGT_PCIE1, LAW_SIZE_64KB, 1),
977+
set_law(2, 0, CONFIG_SYS_PCIE2_MEM_PHYS, LAW_TRGT_PCIE2, LAW_SIZE_512MB, 1),
978+
set_law(3, 0, CONFIG_SYS_PCIE2_IO_PHYS, LAW_TRGT_PCIE2, LAW_SIZE_64KB, 1),
990979

991980
/* Map TLB for PCIe */
992981
set_tlb(1, 2, CONFIG_SYS_PCIE2_MEM_VIRT, CONFIG_SYS_PCIE2_MEM_PHYS, 0,
@@ -1011,7 +1000,7 @@ static int hal_pcie_init(void)
10111000
static int hal_cpld_init(void)
10121001
{
10131002
/* Setup Local Access Window (LAW) for CPLD/BCSR */
1014-
set_law(5, BCSR_BASE, LAW_TRGT_ELBC, LAW_SIZE_256KB);
1003+
set_law(5, 0, BCSR_BASE, LAW_TRGT_ELBC, LAW_SIZE_256KB, 1);
10151004
/* Setup TLB MMU (Translation Lookaside Buffer) for CPLD/BCSR */
10161005
set_tlb(1, 8, BCSR_BASE, BCSR_BASE, 0, MAS3_SX | MAS3_SW | MAS3_SR,
10171006
MAS2_I | MAS2_G, 0, BOOKE_PAGESZ_256K, 1);

hal/nxp_ppc.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#define CCSRBAR_SIZE BOOKE_PAGESZ_1M
3333

3434
#define ENABLE_DDR
35+
#define DDR_SIZE (512 * 1024 * 1024)
3536

3637
/* Memory used for transferring blocks to/from NAND.
3738
* Maps to eLBC FCM internal 8KB region (by hardware) */
@@ -85,6 +86,7 @@
8586
#endif
8687

8788
#define ENABLE_DDR
89+
#define DDR_SIZE (2048ULL * 1024ULL * 1024ULL)
8890

8991
#define FLASH_BASE_ADDR 0xEC000000
9092
#define FLASH_BASE_PHYS_HIGH 0xFULL
@@ -120,6 +122,7 @@
120122
#define ENABLE_INTERRUPTS
121123

122124
#define ENABLE_DDR
125+
#define DDR_SIZE (8192 * 1024 * 1024)
123126

124127
#define FLASH_BASE_ADDR 0xE8000000
125128
#define FLASH_BASE_PHYS_HIGH 0x0ULL
@@ -300,9 +303,9 @@
300303

301304
/* T1024/T2080 LAW - Local Access Window (Memory Map) - RM 2.4 */
302305
#define LAWBAR_BASE(n) (0xC00 + (n * 0x10))
303-
#define LAWBARH(n) *((volatile uint32_t*)(CCSRBAR + LAWBAR_BASE(n) + 0x0))
304-
#define LAWBARL(n) *((volatile uint32_t*)(CCSRBAR + LAWBAR_BASE(n) + 0x4))
305-
#define LAWAR(n) *((volatile uint32_t*)(CCSRBAR + LAWBAR_BASE(n) + 0x8))
306+
#define LAWBARH(n) ((volatile uint32_t*)(CCSRBAR + LAWBAR_BASE(n) + 0x0))
307+
#define LAWBARL(n) ((volatile uint32_t*)(CCSRBAR + LAWBAR_BASE(n) + 0x4))
308+
#define LAWAR(n) ((volatile uint32_t*)(CCSRBAR + LAWBAR_BASE(n) + 0x8))
306309

307310
#define LAWAR_ENABLE (1<<31)
308311
#define LAWAR_TRGT_ID(id) (id<<20)
@@ -623,6 +626,8 @@ extern void set_tlb(uint8_t tlb, uint8_t esel, uint32_t epn, uint32_t rpn,
623626
uint8_t iprot);
624627
extern void disable_tlb1(uint8_t esel);
625628
extern void flush_cache(uint32_t start_addr, uint32_t size);
629+
extern void set_law(uint8_t idx, uint32_t addr_h, uint32_t addr_l,
630+
uint32_t trgt_id, uint32_t law_sz, int reset);
626631

627632
/* from hal/nxp_*.c */
628633
extern void uart_init(void);

hal/nxp_t1024.c

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,6 @@ enum ifc_amask_sizes {
419419

420420
/* DDR4 - 2GB */
421421
/* 1600 MT/s (64-bit, CL=12, ECC on) */
422-
#define DDR_SIZE (2048ULL * 1024ULL * 1024ULL)
423-
424422
#define DDR_CS0_BNDS_VAL 0x0000007F
425423
#define DDR_CS1_BNDS_VAL 0x008000BF
426424
#define DDR_CS2_BNDS_VAL 0x0100013F
@@ -612,22 +610,10 @@ static void udelay(uint32_t delay_us)
612610
wait_ticks(delay_us * DELAY_US);
613611
}
614612

615-
static void set_law(uint8_t idx, uint32_t addr_h, uint32_t addr_l,
616-
uint32_t trgt_id, uint32_t law_sz)
617-
{
618-
LAWAR(idx) = 0; /* reset */
619-
LAWBARH(idx) = addr_h;
620-
LAWBARL(idx) = addr_l;
621-
LAWAR(idx) = (LAWAR_ENABLE | LAWAR_TRGT_ID(trgt_id) | law_sz);
622-
623-
/* Read back so that we sync the writes */
624-
(void)LAWAR(idx);
625-
}
626-
627613
static void law_init(void)
628614
{
629615
/* Buffer Manager (BMan) (control) - probably not required */
630-
set_law(3, 0xF, 0xF4000000, LAW_TRGT_BMAN, LAW_SIZE_32MB);
616+
set_law(3, 0xF, 0xF4000000, LAW_TRGT_BMAN, LAW_SIZE_32MB, 1);
631617
}
632618

633619

@@ -876,14 +862,14 @@ static void hal_ddr_init(void)
876862
#ifdef ENABLE_DDR
877863
uint32_t reg;
878864

865+
/* Map LAW for DDR */
866+
set_law(15, 0, DDR_ADDRESS, LAW_TRGT_DDR_1, LAW_SIZE_2GB, 0);
867+
879868
/* If DDR is already enabled then just return */
880-
if (get32(DDR_SDRAM_CFG) & DDR_SDRAM_CFG_MEM_EN) {
869+
if ((get32(DDR_SDRAM_CFG) & DDR_SDRAM_CFG_MEM_EN)) {
881870
return;
882871
}
883872

884-
/* Map LAW for DDR */
885-
set_law(15, 0, DDR_ADDRESS, LAW_TRGT_DDR_1, LAW_SIZE_2GB);
886-
887873
/* Set early for clock / pin */
888874
set32(DDR_SDRAM_CLK_CNTL, DDR_SDRAM_CLK_CNTL_VAL);
889875

@@ -945,7 +931,7 @@ static void hal_ddr_init(void)
945931
set32(DDR_SDRAM_RCW_5, 0);
946932
set32(DDR_SDRAM_RCW_6, 0);
947933
set32(DDR_DDRCDR_1, DDR_DDRCDR_1_VAL);
948-
set32(DDR_SDRAM_CFG_2, DDR_SDRAM_CFG_2_VAL);
934+
set32(DDR_SDRAM_CFG_2, (DDR_SDRAM_CFG_2_VAL | DDR_SDRAM_CFG_2_D_INIT));
949935
set32(DDR_INIT_ADDR, 0);
950936
set32(DDR_INIT_EXT_ADDR, 0);
951937
set32(DDR_DDRCDR_2, DDR_DDRCDR_2_VAL);
@@ -1001,14 +987,6 @@ static void hal_ddr_init(void)
1001987
/* Errata A-009663 - Write real precharge interval */
1002988
set32(DDR_SDRAM_INTERVAL, DDR_SDRAM_INTERVAL_VAL);
1003989
#endif
1004-
1005-
/* DDR - TBL=1, Entry 12/13 */
1006-
set_tlb(1, 12, DDR_ADDRESS, DDR_ADDRESS, 0,
1007-
MAS3_SX | MAS3_SW | MAS3_SR, MAS2_M,
1008-
0, BOOKE_PAGESZ_1G, 1);
1009-
set_tlb(1, 13, DDR_ADDRESS + 0x40000000, DDR_ADDRESS + 0x40000000, 0,
1010-
MAS3_SX | MAS3_SW | MAS3_SR, MAS2_M,
1011-
0, BOOKE_PAGESZ_1G, 1);
1012990
#endif
1013991
}
1014992

@@ -1067,7 +1045,7 @@ static void hal_cpld_init(void)
10671045

10681046
/* IFC - CPLD */
10691047
set_law(2, CPLD_BASE_PHYS_HIGH, CPLD_BASE,
1070-
LAW_TRGT_IFC, LAW_SIZE_4KB);
1048+
LAW_TRGT_IFC, LAW_SIZE_4KB, 1);
10711049

10721050
/* CPLD - TBL=1, Entry 11 */
10731051
set_tlb(1, 11, CPLD_BASE, CPLD_BASE, CPLD_BASE_PHYS_HIGH,

hal/nxp_t1024.ld

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ OUTPUT_ARCH( "powerpc" )
22

33
ENTRY( _reset )
44

5-
HEAP_SIZE = 4K; /* heap not used */
6-
STACK_SIZE = 128K;
7-
85
MEMORY
96
{
107
/* DDR4 - 2GB (offset by destination address and 4KB boot region) */
@@ -14,8 +11,8 @@ MEMORY
1411
/* L1 SRAM - 16KB */
1512
L1RAM (rwx) : ORIGIN = 0xF8F80000, LENGTH = 0x4000
1613

17-
/* L2 SRAM - 160KB */
18-
L2RAM (rwx) : ORIGIN = 0xFDFC0000, LENGTH = 0x28000
14+
/* Platform SRAM - 160KB */
15+
PSRAM (rwx) : ORIGIN = 0xFDFC0000, LENGTH = 0x28000
1916
}
2017

2118
SECTIONS
@@ -82,9 +79,10 @@ SECTIONS
8279

8380
}
8481

82+
/* DDR heap/stack */
8583
PROVIDE(_start_heap = _end);
84+
PROVIDE(_end_stack = ORIGIN(DRAM) + (LENGTH(DRAM)));
8685

87-
/* If relocated to DDR already then use stack end from DDR */
88-
/* If debugging and DDR is not ready, use L1 or L2 */
89-
PROVIDE(_end_stack = _end + HEAP_SIZE + STACK_SIZE );
90-
/* PROVIDE(_end_stack = ORIGIN(L2RAM) + (LENGTH(L2RAM)) ); */
86+
/* Platform SRAM heap/stack */
87+
/* PROVIDE(_start_heap = ORIGIN(PSRAM)); */
88+
/* PROVIDE(_end_stack = ORIGIN(PSRAM) + (LENGTH(PSRAM))); */

hal/nxp_t1024_stage1.ld

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ MEMORY
2121
/* L1 SRAM - 16KB */
2222
L1RAM (rwx) : ORIGIN = 0xF8F80000, LENGTH = 0x4000
2323

24-
/* L2 SRAM - 160KB */
25-
L2RAM (rwx) : ORIGIN = 0xFDFC0000, LENGTH = 0x28000
24+
/* Platform SRAM - 160KB */
25+
PSRAM (rwx) : ORIGIN = 0xFDFC0000, LENGTH = 0x28000
2626

2727
/* DDR - 2GB: Start at 16MB to avoid using 0x0 (NULL) addresses */
2828
DRAM (rwx) : ORIGIN = 0x1000000, LENGTH = 0x7FFFFFFF - 0x1000000
@@ -105,5 +105,6 @@ SECTIONS
105105

106106
}
107107

108-
PROVIDE(_start_heap = ORIGIN(L2RAM));
109-
PROVIDE(_end_stack = ORIGIN(L2RAM) + (LENGTH(L2RAM)) );
108+
/* Platform SRAM heap/stack */
109+
PROVIDE(_start_heap = ORIGIN(PSRAM));
110+
PROVIDE(_end_stack = ORIGIN(PSRAM) + (LENGTH(PSRAM)));

0 commit comments

Comments
 (0)