driver/pci: Fix compiling error
Subsystems (3)
PATCH 1/28 driver/pci: Fix compiling error
Fix compiling error in case CONFIG_SYS_PCIE2_MEM_VIRT or CONFIG_SYS_PCIE3_MEM_VIRT not defined.
--- drivers/pci/fsl_pci_init.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/pci/fsl_pci_init.c +4 -0
@@ -276,14 +276,18 @@ static void fsl_pcie_boot_master_release_slave(int port) release_addr =CONFIG_SYS_PCIE1_MEM_VIRT +CONFIG_SRIO_PCIE_BOOT_BRR_OFFSET ;break ; +#ifdef CONFIG_SYS_PCIE2_MEM_VIRT case 2 : release_addr =CONFIG_SYS_PCIE2_MEM_VIRT +CONFIG_SRIO_PCIE_BOOT_BRR_OFFSET ;break ; +#endif +#ifdef CONFIG_SYS_PCIE3_MEM_VIRT case 3 : release_addr =CONFIG_SYS_PCIE3_MEM_VIRT +CONFIG_SRIO_PCIE_BOOT_BRR_OFFSET ;break ; +#endif default : release_addr =0 ;break ;
Signature · 1 line
1.7.9.5
PATCH 2/28 powerpc/DPAA: Fix compiling error
FSL_HW_PORTAL_PME is used even when CONFIG_SYS_DPAA_PME is not defined. Remove the #ifdef.
--- arch/powerpc/include/asm/fsl_portals.h | 2 -- 1 file changed, 2 deletions(-)
arch/powerpc/include/asm/fsl_portals.h +0 -2
@@ -32,9 +32,7 @@ enum fsl_dpaa_dev { FSL_HW_PORTAL_FMAN2,#endif #endif -#ifdef CONFIG_SYS_DPAA_PME FSL_HW_PORTAL_PME, -#endif #ifdef CONFIG_SYS_FSL_RAID_ENGINE FSL_HW_PORTAL_RAID_ENGINE,#endif
Signature · 1 line
1.7.9.5
PATCH 3/28 powerpc/85xx: Add determining and report IFC frequency
In reply to York SunFrom: Kumar Gala <[email protected]>
--- arch/powerpc/cpu/mpc85xx/cpu.c | 4 ++++ arch/powerpc/cpu/mpc85xx/speed.c | 11 +++++++++++ 2 files changed, 15 insertions(+)
arch/powerpc/cpu/mpc85xx/cpu.c +4 -0
@@ -181,6 +181,10 @@ int checkcpu (void) }#endif +#if defined(CONFIG_FSL_IFC ) +printf ("IFC:%-4s MHz\n" ,strmhz (buf1, sysinfo.freqLocalBus)); +#endif +#ifdef CONFIG_CPM2 printf ("CPM: %s MHz\n" ,strmhz (buf1, sysinfo.freqSystemBus));#endif
arch/powerpc/cpu/mpc85xx/speed.c +11 -0
@@ -39,6 +39,10 @@ DECLARE_GLOBAL_DATA_PTR;void get_sys_info (sys_info_t * sysInfo) {volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); +#ifdef CONFIG_FSL_IFC +struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR ; +u32 ccr; +#endif #ifdef CONFIG_FSL_CORENET volatile ccsr_clk_t *clk = (void *)(CONFIG_SYS_FSL_CORENET_CLK_ADDR );unsigned int cpu;
@@ -228,6 +232,13 @@ void get_sys_info (sys_info_t * sysInfo) sysInfo->freqLocalBus = lcrr_div; }#endif + +#if defined(CONFIG_FSL_IFC ) + ccr =in_be32 (&ifc_regs->ifc_ccr); + ccr = ((ccr &IFC_CCR_CLK_DIV_MASK ) >>IFC_CCR_CLK_DIV_SHIFT ) +1 ; + + sysInfo->freqLocalBus = sysInfo->freqSystemBus / ccr; +#endif }
Signature · 1 line
1.7.9.5
PATCH 4/28 powerpc/mpc85xx: Introduce new macros to add and delete TLB entries
In reply to York SunThese assembly macros simplify codes to add and delete temporary TLB entries.
--- arch/powerpc/cpu/mpc85xx/start.S | 309 ++++++++++++++++---------------------- 1 file changed, 130 insertions(+), 179 deletions(-)
arch/powerpc/cpu/mpc85xx/start.S +130 -179
@@ -211,6 +211,77 @@ l2_disabled: andi. r1,r3,L1CSR0_DCE at l beq 2b + .macro create_tlb1_entry esel ts tsize epn wimg rpn perm phy_high scratch + lis \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@l + mtspr MAS0, \scratch + lis \scratch, FSL_BOOKE_MAS1(1, 1, 0, \ts, \tsize)@h + ori \scratch, \scratch, FSL_BOOKE_MAS1(1, 1, 0, \ts, \tsize)@l + mtspr MAS1, \scratch + lis \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@h + ori \scratch, \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@l + mtspr MAS2, \scratch + lis \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@h + ori \scratch, \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@l + mtspr MAS3, \scratch + lis \scratch, \phy_high at h + ori \scratch, \scratch, \phy_high at l + mtspr MAS7, \scratch + isync + msync + tlbwe + isync + .endm + + .macro create_tlb0_entry esel ts tsize epn wimg rpn perm phy_high scratch + lis \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@l + mtspr MAS0, \scratch + lis \scratch, FSL_BOOKE_MAS1(1, 0, 0, \ts, \tsize)@h + ori \scratch, \scratch, FSL_BOOKE_MAS1(1, 0, 0, \ts, \tsize)@l + mtspr MAS1, \scratch + lis \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@h + ori \scratch, \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@l + mtspr MAS2, \scratch + lis \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@h + ori \scratch, \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@l + mtspr MAS3, \scratch + lis \scratch, \phy_high at h + ori \scratch, \scratch, \phy_high at l + mtspr MAS7, \scratch + isync + msync + tlbwe + isync + .endm + + .macro delete_tlb1_entry esel scratch + lis \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@l + mtspr MAS0, \scratch + li \scratch, 0 + mtspr MAS1, \scratch + isync + msync + tlbwe + isync + .endm + + .macro delete_tlb0_entry esel epn wimg scratch + lis \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@l + mtspr MAS0, \scratch + li \scratch, 0 + mtspr MAS1, \scratch + lis \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@h + ori \scratch, \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@l + mtspr MAS2, \scratch + isync + msync + tlbwe + isync + .endm + #if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(CONFIG_NAND_SPL) /* * TLB entry for debuggging in AS1
@@ -220,61 +291,35 @@ l2_disabled: * in AS1. */ - lis r6,FSL_BOOKE_MAS0(1, - CONFIG_SYS_PPC_E500_DEBUG_TLB, 0)@h - ori r6,r6,FSL_BOOKE_MAS0(1, - CONFIG_SYS_PPC_E500_DEBUG_TLB, 0)@l - #if !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) /* * TLB entry is created for IVPR + IVOR15 to map on valid OP code address * bacause flash's virtual address maps to 0xff800000 - 0xffffffff. * and this window is outside of 4K boot window. */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_4M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_4M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, - (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, - (MAS2_I|MAS2_G))@l + create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, + 0, BOOKE_PAGESZ_4M, + CONFIG_SYS_MONITOR_BASE & 0xffc00000, MAS2_I|MAS2_G, + 0xffc00000, MAS3_SX|MAS3_SW|MAS3_SR, + 0, r6 - /* The 85xx has the default boot window 0xff800000 - 0xffffffff */ - lis r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l #elif !defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SECURE_BOOT) - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE,(MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE,(MAS2_I|MAS2_G))@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, + 0, BOOKE_PAGESZ_1M, + CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, + CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, + 0, r6 #else /* * TLB entry is created for IVPR + IVOR15 to map on valid OP code address * because "nexti" will resize TLB to 4K */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, - (MAS2_I))@l - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, + 0, BOOKE_PAGESZ_256K, + CONFIG_SYS_MONITOR_BASE, MAS2_I, + CONFIG_SYS_MONITOR_BASE, MAS3_SX|MAS3_SW|MAS3_SR, + 0, r6 #endif - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - tlbwe - isync #endif /*
@@ -392,27 +437,11 @@ l2_disabled: */ /* create a temp mapping TLB0[0] for LBCR */ - lis r6,FSL_BOOKE_MAS0(0, 0, 0)@h - ori r6,r6,FSL_BOOKE_MAS0(0, 0, 0)@l - - lis r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l - - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - isync - msync - tlbwe + create_tlb0_entry 0, + 0, BOOKE_PAGESZ_4K, + CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G, + CONFIG_SYS_LBC_ADDR, MAS3_SW|MAS3_SR, + 0, r6 /* Set LBCR register */ lis r4,CONFIG_SYS_LBCR_ADDR at h
@@ -551,49 +580,22 @@ create_ccsr_new_tlb: ori r8, r8, CONFIG_SYS_CCSRBAR at l lis r9, (CONFIG_SYS_CCSRBAR + 0x1000)@h ori r9, r9, (CONFIG_SYS_CCSRBAR + 0x1000)@l - lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l - lis r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h - ori r1, r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l - lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW, 0, (MAS3_SW|MAS3_SR))@h - ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW, 0, (MAS3_SW|MAS3_SR))@l -#ifdef CONFIG_ENABLE_36BIT_PHYS - lis r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH at h - ori r7, r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH at l - mtspr MAS7, r7 -#endif - mtspr MAS0, r0 - mtspr MAS1, r1 - mtspr MAS2, r2 - mtspr MAS3, r3 - isync - msync - tlbwe - + create_tlb0_entry 0, \ + 0, BOOKE_PAGESZ_4K, \ + CONFIG_SYS_CCSRBAR, MAS2_I|MAS2_G, \ + CONFIG_SYS_CCSRBAR_PHYS_LOW, MAS3_SW|MAS3_SR, \ + CONFIG_SYS_CCSRBAR_PHYS_HIGH, r3 /* * Create a TLB for the current location of CCSR. Register R9 is reserved * for the virtual address of this TLB (CONFIG_SYS_CCSRBAR + 0x1000). */ create_ccsr_old_tlb: - lis r0, FSL_BOOKE_MAS0(0, 1, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 1, 0)@l - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@l - lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SW|MAS3_SR))@h - ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SW|MAS3_SR))@l -#ifdef CONFIG_ENABLE_36BIT_PHYS - li r7, 0 /* The default CCSR address is always a 32-bit number */ - mtspr MAS7, r7 -#endif - mtspr MAS0, r0 - /* MAS1 is the same as above */ - mtspr MAS2, r2 - mtspr MAS3, r3 - isync - msync - tlbwe + create_tlb0_entry 1, \ + 0, BOOKE_PAGESZ_4K, \ + CONFIG_SYS_CCSRBAR + 0x1000, MAS2_I|MAS2_G, \ + CONFIG_SYS_CCSRBAR_DEFAULT, MAS3_SW|MAS3_SR, \ + 0, r3 /* The default CCSR address is always a 32-bit number */ + /* * We have a TLB for what we think is the current (old) CCSR. Let's
@@ -743,27 +745,9 @@ write_new_ccsrbar: /* Delete the temporary TLBs */ delete_temp_tlbs: - lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l - li r1, 0 - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l - mtspr MAS0, r0 - mtspr MAS1, r1 - mtspr MAS2, r2 - isync - msync - tlbwe + delete_tlb0_entry 0, CONFIG_SYS_CCSRBAR, MAS2_I|MAS2_G, r3 + delete_tlb0_entry 1, CONFIG_SYS_CCSRBAR + 0x1000, MAS2_I|MAS2_G, r3 - lis r0, FSL_BOOKE_MAS0(0, 1, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 1, 0)@l - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@l - mtspr MAS0, r0 - mtspr MAS2, r2 - isync - msync - tlbwe #endif /* #if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS) */ #ifdef CONFIG_SYS_FSL_ERRATUM_A004510
@@ -1019,83 +1003,50 @@ create_init_ram_area: #if !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) /* create a temp mapping in AS=1 to the 4M boot window */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, (MAS2_I|MAS2_G))@l + create_tlb1_entry 15, \ + 1, BOOKE_PAGESZ_4M, \ + CONFIG_SYS_MONITOR_BASE & 0xffc00000, MAS2_I|MAS2_G, \ + 0xffc00000, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 - /* The 85xx has the default boot window 0xff800000 - 0xffffffff */ - lis r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l #elif !defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SECURE_BOOT) /* create a temp mapping in AS = 1 for Flash mapping * created by PBL for ISBC code */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry 15, \ + 1, BOOKE_PAGESZ_1M, \ + CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ + CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 #else /* * create a temp mapping in AS=1 to the 1M CONFIG_SYS_MONITOR_BASE space, the main * image has been relocated to CONFIG_SYS_MONITOR_BASE on the second stage. */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry 15, \ + 1, BOOKE_PAGESZ_1M, \ + CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ + CONFIG_SYS_MONITOR_BASE, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 #endif - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - isync - msync - tlbwe - /* create a temp mapping in AS=1 to the stack */ - lis r6,FSL_BOOKE_MAS0(1, 14, 0)@h - ori r6,r6,FSL_BOOKE_MAS0(1, 14, 0)@l - - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l - #if defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW) && \ defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH) - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l - li r10,CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH - mtspr MAS7,r10 + create_tlb1_entry 14, \ + 1, BOOKE_PAGESZ_16K, \ + CONFIG_SYS_INIT_RAM_ADDR, 0, \ + CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, MAS3_SX|MAS3_SW|MAS3_SR, \ + CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH, r6 + #else - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry 14, \ + 1, BOOKE_PAGESZ_16K, \ + CONFIG_SYS_INIT_RAM_ADDR, 0, \ + CONFIG_SYS_INIT_RAM_ADDR, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 #endif - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - isync - msync - tlbwe - lis r6,MSR_IS|MSR_DS|MSR_DE at h ori r6,r6,MSR_IS|MSR_DS|MSR_DE at l lis r7,switch_as at h
Signature · 1 line
1.7.9.5
PATCH 4/28 powerpc/mpc85xx: Introduce new macros to add and delete TLB entries
This is causing a bunch of non QorIQ boards to stop building. Please investigate:
$ ./MAKEALL MPC8548CDS Configuring for MPC8548CDS board... start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression start.S:300: Error: missing ')' start.S:300: Error: missing ')' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression start.S:300: Error: missing ')' start.S:300: Error: missing ')' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression start.S:300: Error: missing ')' start.S:300: Error: missing ')' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression start.S:300: Error: missing ')' start.S:300: Error: missing ')' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression start.S:300: Error: missing ')' start.S:300: Error: missing ')' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression start.S:300: Error: missing ')' start.S:300: Error: missing ')' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: syntax error; found `h', expected `,' start.S:300: Error: junk at end of line: `h' start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: syntax error; found `l', expected `,' start.S:300: Error: junk at end of line: `l' start.S:300: Error: missing operand start.S:301: Error: junk at end of line, first unrecognized character is `0' start.S:302: Error: junk at end of line, first unrecognized character is `0' start.S:303: Error: junk at end of line, first unrecognized character is `0' start.S:304: Error: junk at end of line, first unrecognized character is `0'
Quoted 408 lines · York Sun
These assembly macros simplify codes to add and delete temporary TLB entries.
Signed-off-by York Sun <[email protected]>--- arch/powerpc/cpu/mpc85xx/start.S | 309 ++++++++++++++++---------------------- 1 file changed, 130 insertions(+), 179 deletions(-)arch/powerpc/cpu/mpc85xx/start.S +130
-180@@ -211,6 +211,77 @@ l2_disabled: andi. r1,r3,L1CSR0_DCE at l beq 2b + .macro create_tlb1_entry esel ts tsize epn wimg rpn perm phy_high scratch + lis \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@l + mtspr MAS0, \scratch + lis \scratch, FSL_BOOKE_MAS1(1, 1, 0, \ts, \tsize)@h + ori \scratch, \scratch, FSL_BOOKE_MAS1(1, 1, 0, \ts, \tsize)@l + mtspr MAS1, \scratch + lis \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@h + ori \scratch, \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@l + mtspr MAS2, \scratch + lis \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@h + ori \scratch, \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@l + mtspr MAS3, \scratch + lis \scratch, \phy_high at h + ori \scratch, \scratch, \phy_high at l + mtspr MAS7, \scratch + isync + msync + tlbwe + isync + .endm + + .macro create_tlb0_entry esel ts tsize epn wimg rpn perm phy_high scratch + lis \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@l + mtspr MAS0, \scratch + lis \scratch, FSL_BOOKE_MAS1(1, 0, 0, \ts, \tsize)@h + ori \scratch, \scratch, FSL_BOOKE_MAS1(1, 0, 0, \ts, \tsize)@l + mtspr MAS1, \scratch + lis \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@h + ori \scratch, \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@l + mtspr MAS2, \scratch + lis \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@h + ori \scratch, \scratch, FSL_BOOKE_MAS3(\rpn, 0, \perm)@l + mtspr MAS3, \scratch + lis \scratch, \phy_high at h + ori \scratch, \scratch, \phy_high at l + mtspr MAS7, \scratch + isync + msync + tlbwe + isync + .endm + + .macro delete_tlb1_entry esel scratch + lis \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(1, \esel, 0)@l + mtspr MAS0, \scratch + li \scratch, 0 + mtspr MAS1, \scratch + isync + msync + tlbwe + isync + .endm + + .macro delete_tlb0_entry esel epn wimg scratch + lis \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@h + ori \scratch, \scratch, FSL_BOOKE_MAS0(0, \esel, 0)@l + mtspr MAS0, \scratch + li \scratch, 0 + mtspr MAS1, \scratch + lis \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@h + ori \scratch, \scratch, FSL_BOOKE_MAS2(\epn, \wimg)@l + mtspr MAS2, \scratch + isync + msync + tlbwe + isync + .endm + #if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(CONFIG_NAND_SPL) /* * TLB entry for debuggging in AS1@@ -220,61 +291,35 @@ l2_disabled: * in AS1. */ - lis r6,FSL_BOOKE_MAS0(1, - CONFIG_SYS_PPC_E500_DEBUG_TLB, 0)@h - ori r6,r6,FSL_BOOKE_MAS0(1, - CONFIG_SYS_PPC_E500_DEBUG_TLB, 0)@l - #if !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) /* * TLB entry is created for IVPR + IVOR15 to map on valid OP code address * bacause flash's virtual address maps to 0xff800000 - 0xffffffff. * and this window is outside of 4K boot window. */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_4M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_4M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, - (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, - (MAS2_I|MAS2_G))@l + create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, + 0, BOOKE_PAGESZ_4M, + CONFIG_SYS_MONITOR_BASE & 0xffc00000, MAS2_I|MAS2_G, + 0xffc00000, MAS3_SX|MAS3_SW|MAS3_SR, + 0, r6 - /* The 85xx has the default boot window 0xff800000 - 0xffffffff */ - lis r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l #elif !defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SECURE_BOOT) - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE,(MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE,(MAS2_I|MAS2_G))@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, + 0, BOOKE_PAGESZ_1M, + CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, + CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, + 0, r6 #else /* * TLB entry is created for IVPR + IVOR15 to map on valid OP code address * because "nexti" will resize TLB to 4K */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, - (MAS2_I))@l - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry CONFIG_SYS_PPC_E500_DEBUG_TLB, + 0, BOOKE_PAGESZ_256K, + CONFIG_SYS_MONITOR_BASE, MAS2_I, + CONFIG_SYS_MONITOR_BASE, MAS3_SX|MAS3_SW|MAS3_SR, + 0, r6 #endif - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - tlbwe - isync #endif /*@@ -392,27 +437,11 @@ l2_disabled: */ /* create a temp mapping TLB0[0] for LBCR */ - lis r6,FSL_BOOKE_MAS0(0, 0, 0)@h - ori r6,r6,FSL_BOOKE_MAS0(0, 0, 0)@l - - lis r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G)@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_LBC_ADDR, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l - - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - isync - msync - tlbwe + create_tlb0_entry 0, + 0, BOOKE_PAGESZ_4K, + CONFIG_SYS_LBC_ADDR, MAS2_I|MAS2_G, + CONFIG_SYS_LBC_ADDR, MAS3_SW|MAS3_SR, + 0, r6 /* Set LBCR register */ lis r4,CONFIG_SYS_LBCR_ADDR at h@@ -551,49 +580,22 @@ create_ccsr_new_tlb: ori r8, r8, CONFIG_SYS_CCSRBAR at l lis r9, (CONFIG_SYS_CCSRBAR + 0x1000)@h ori r9, r9, (CONFIG_SYS_CCSRBAR + 0x1000)@l - lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l - lis r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@h - ori r1, r1, FSL_BOOKE_MAS1(1, 0, 0, 0, BOOKE_PAGESZ_4K)@l - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l - lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW, 0, (MAS3_SW|MAS3_SR))@h - ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_PHYS_LOW, 0, (MAS3_SW|MAS3_SR))@l -#ifdef CONFIG_ENABLE_36BIT_PHYS - lis r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH at h - ori r7, r7, CONFIG_SYS_CCSRBAR_PHYS_HIGH at l - mtspr MAS7, r7 -#endif - mtspr MAS0, r0 - mtspr MAS1, r1 - mtspr MAS2, r2 - mtspr MAS3, r3 - isync - msync - tlbwe - + create_tlb0_entry 0, \ + 0, BOOKE_PAGESZ_4K, \ + CONFIG_SYS_CCSRBAR, MAS2_I|MAS2_G, \ + CONFIG_SYS_CCSRBAR_PHYS_LOW, MAS3_SW|MAS3_SR, \ + CONFIG_SYS_CCSRBAR_PHYS_HIGH, r3 /* * Create a TLB for the current location of CCSR. Register R9 is reserved * for the virtual address of this TLB (CONFIG_SYS_CCSRBAR + 0x1000). */ create_ccsr_old_tlb: - lis r0, FSL_BOOKE_MAS0(0, 1, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 1, 0)@l - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@l - lis r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SW|MAS3_SR))@h - ori r3, r3, FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SW|MAS3_SR))@l -#ifdef CONFIG_ENABLE_36BIT_PHYS - li r7, 0 /* The default CCSR address is always a 32-bit number */ - mtspr MAS7, r7 -#endif - mtspr MAS0, r0 - /* MAS1 is the same as above */ - mtspr MAS2, r2 - mtspr MAS3, r3 - isync - msync - tlbwe + create_tlb0_entry 1, \ + 0, BOOKE_PAGESZ_4K, \ + CONFIG_SYS_CCSRBAR + 0x1000, MAS2_I|MAS2_G, \ + CONFIG_SYS_CCSRBAR_DEFAULT, MAS3_SW|MAS3_SR, \ + 0, r3 /* The default CCSR address is always a 32-bit number */ + /* * We have a TLB for what we think is the current (old) CCSR. Let's@@ -743,27 +745,9 @@ write_new_ccsrbar: /* Delete the temporary TLBs */ delete_temp_tlbs: - lis r0, FSL_BOOKE_MAS0(0, 0, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 0, 0)@l - li r1, 0 - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l - mtspr MAS0, r0 - mtspr MAS1, r1 - mtspr MAS2, r2 - isync - msync - tlbwe + delete_tlb0_entry 0, CONFIG_SYS_CCSRBAR, MAS2_I|MAS2_G, r3 + delete_tlb0_entry 1, CONFIG_SYS_CCSRBAR + 0x1000, MAS2_I|MAS2_G, r3 - lis r0, FSL_BOOKE_MAS0(0, 1, 0)@h - ori r0, r0, FSL_BOOKE_MAS0(0, 1, 0)@l - lis r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@h - ori r2, r2, FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR + 0x1000, (MAS2_I|MAS2_G))@l - mtspr MAS0, r0 - mtspr MAS2, r2 - isync - msync - tlbwe #endif /* #if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS) */ #ifdef CONFIG_SYS_FSL_ERRATUM_A004510@@ -1019,83 +1003,50 @@ create_init_ram_area: #if !defined(CONFIG_SYS_RAMBOOT) && !defined(CONFIG_SECURE_BOOT) /* create a temp mapping in AS=1 to the 4M boot window */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE & 0xffc00000, (MAS2_I|MAS2_G))@l + create_tlb1_entry 15, \ + 1, BOOKE_PAGESZ_4M, \ + CONFIG_SYS_MONITOR_BASE & 0xffc00000, MAS2_I|MAS2_G, \ + 0xffc00000, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 - /* The 85xx has the default boot window 0xff800000 - 0xffffffff */ - lis r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l #elif !defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SECURE_BOOT) /* create a temp mapping in AS = 1 for Flash mapping * created by PBL for ISBC code */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_PBI_FLASH_WINDOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry 15, \ + 1, BOOKE_PAGESZ_1M, \ + CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ + CONFIG_SYS_PBI_FLASH_WINDOW, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 #else /* * create a temp mapping in AS=1 to the 1M CONFIG_SYS_MONITOR_BASE space, the main * image has been relocated to CONFIG_SYS_MONITOR_BASE on the second stage. */ - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_MONITOR_BASE, (MAS2_I|MAS2_G))@l - - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_MONITOR_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry 15, \ + 1, BOOKE_PAGESZ_1M, \ + CONFIG_SYS_MONITOR_BASE, MAS2_I|MAS2_G, \ + CONFIG_SYS_MONITOR_BASE, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 #endif - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - isync - msync - tlbwe - /* create a temp mapping in AS=1 to the stack */ - lis r6,FSL_BOOKE_MAS0(1, 14, 0)@h - ori r6,r6,FSL_BOOKE_MAS0(1, 14, 0)@l - - lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@h - ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_16K)@l - - lis r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h - ori r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l - #if defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW) && \ defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH) - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0, - (MAS3_SX|MAS3_SW|MAS3_SR))@l - li r10,CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH - mtspr MAS7,r10 + create_tlb1_entry 14, \ + 1, BOOKE_PAGESZ_16K, \ + CONFIG_SYS_INIT_RAM_ADDR, 0, \ + CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, MAS3_SX|MAS3_SW|MAS3_SR, \ + CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH, r6 + #else - lis r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h - ori r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l + create_tlb1_entry 14, \ + 1, BOOKE_PAGESZ_16K, \ + CONFIG_SYS_INIT_RAM_ADDR, 0, \ + CONFIG_SYS_INIT_RAM_ADDR, MAS3_SX|MAS3_SW|MAS3_SR, \ + 0, r6 #endif - mtspr MAS0,r6 - mtspr MAS1,r7 - mtspr MAS2,r8 - mtspr MAS3,r9 - isync - msync - tlbwe - lis r6,MSR_IS|MSR_DS|MSR_DE at h ori r6,r6,MSR_IS|MSR_DS|MSR_DE at l lis r7,switch_as at h --1.7.9.5
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot
PATCH 4/28 powerpc/mpc85xx: Introduce new macros to add and delete TLB entries
Quoted 12 lines · Andy Fleming
This is causing a bunch of non QorIQ boards to stop building. Please investigate:
$ ./MAKEALL MPC8548CDS Configuring for MPC8548CDS board... start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: missing operand start.S:300: Error: bad expression start.S:300: Error: bad expression
Thanks for catching it. I thought I run MAKEALL for mpc85xx. I may have missed this one after a rebase. Sending a patch to fix soon.
York
PATCH 5/28 powerpc/mpc85xx: Enable L2 at the beginning of U-boot for E6500
In reply to York SunUsing E6500 L1 cache as initram requires L2 cache enabled. Add l2-cache cluster enabling.
Setup stash id for L1 cache as (coreID) * 2 + 32 + 0 Setup stash id for L2 cache as (cluster) * 2 + 32 + 1 Stash id for L2 is only set for Chassis 2.
--- arch/powerpc/cpu/mpc85xx/cpu_init.c | 50 ++++++++++++++++++++++++++-- arch/powerpc/cpu/mpc85xx/fdt.c | 14 +++++++- arch/powerpc/cpu/mpc85xx/release.S | 14 ++++---- arch/powerpc/cpu/mpc85xx/start.S | 37 ++++++++++++++++++++- arch/powerpc/include/asm/immap_85xx.h | 59 +++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+), 11 deletions(-)
arch/powerpc/cpu/mpc85xx/cpu_init.c +48 -2
@@ -295,6 +295,43 @@ static void __fsl_serdes__init(void) } __attribute__((weak,alias ("__fsl_serdes__init" )))void fsl_serdes_init (void ); +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +int enable_cluster_l2 (void ) +{ +int i =0 ; +u32 cluster; +ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); +struct ccsr_cluster_l2 __iomem *l2cache; + + cluster =in_be32 (&gur->tp_cluster[i].lower); +if (cluster &TP_CLUSTER_EOC ) +return 0 ; + +/* The first cache has already been set up, so skip it */ + i++; + +/* Look through the remaining clusters, and set up their caches */ +do { + l2cache = (void __iomem *)(CONFIG_SYS_FSL_CLUSTER_1_L2 + i *0x40000 ); + cluster =in_be32 (&gur->tp_cluster[i].lower); + +/* set stash ID to (cluster) * 2 + 32 + 1 */ +clrsetbits_be32 (&l2cache->l2csr1,0xff ,32 + i *2 +1 ); + +printf ("enable l2 for cluster %d %p\n" , i, l2cache); + +out_be32 (&l2cache->l2csr0,L2CSR0_L2FI |L2CSR0_L2LFC ); +while ((in_be32 (&l2cache->l2csr0) & + (L2CSR0_L2FI |L2CSR0_L2LFC )) !=0 ) + ; +out_be32 (&l2cache->l2csr0,L2CSR0_L2E ); + i++; + }while (!(cluster &TP_CLUSTER_EOC )); + +return 0 ; +} +#endif +/* * Initialize L2 as cache. *
@@ -306,7 +343,12 @@ int cpu_init_r(void) {__maybe_unused u32 svr =get_svr ();#ifdef CONFIG_SYS_LBC_LCRR -volatile fsl_lbc_t *lbc =LBC_BASE_ADDR ; +fsl_lbc_t *lbc = (void __iomem *)LBC_BASE_ADDR ; +#endif +#ifdef CONFIG_L2_CACHE +ccsr_l2cache_t *l2cache = (void __iomem *)CONFIG_SYS_MPC85xx_L2_ADDR; +#elif defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2 ) +struct ccsr_cluster_l2 * l2cache = (void __iomem *)CONFIG_SYS_FSL_CLUSTER_1_L2 ;#endif #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \
@@ -356,7 +398,6 @@ int cpu_init_r(void)puts ("L2: " );#if defined(CONFIG_L2_CACHE ) -volatile ccsr_l2cache_t *l2cache = (void *)CONFIG_SYS_MPC85xx_L2_ADDR;volatile uint cache_ctl;uint ver;u32 l2siz_field;
@@ -467,6 +508,11 @@ int cpu_init_r(void) } skip_l2: +#elif defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2 ) +if (l2cache->l2csr0 &L2CSR0_L2E ) +printf ("%d KB enabled\n" , (l2cache->l2cfg0 &0x3fff ) *64 ); + +enable_cluster_l2 ();#else puts ("disabled\n" );#endif
arch/powerpc/cpu/mpc85xx/fdt.c +13 -1
@@ -220,12 +220,19 @@ static inline void ft_fixup_l2cache(void *blob) /* we dont bother w/L3 since no platform of this type has one */ } -#elif defined(CONFIG_BACKSIDE_L2_CACHE) +#elif defined(CONFIG_BACKSIDE_L2_CACHE) || \ + defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2)static inline void ft_fixup_l2cache (void *blob) {int off, l2_off, l3_off =-1 ;u32 *ph; +#ifdef CONFIG_BACKSIDE_L2_CACHE u32 l2cfg0 =mfspr (SPRN_L2CFG0 ); +#else +struct ccsr_cluster_l2 *l2cache = + (struct ccsr_cluster_l2 __iomem *)(CONFIG_SYS_FSL_CLUSTER_1_L2 ); +u32 l2cfg0 =in_be32 (&l2cache->l2cfg0); +#endif u32 size, line_size, num_ways, num_sets;int has_l2 =1 ;
@@ -257,7 +264,12 @@ static inline void ft_fixup_l2cache(void *blob)if (has_l2) {#ifdef CONFIG_SYS_CACHE_STASHING u32 *reg = (u32 *)fdt_getprop (blob, off,"reg" ,0 ); +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +/* Only initialize every eighth thread */ +if (reg && !((*reg) %8 )) +#else if (reg) +#endif fdt_setprop_cell (blob, l2_off,"cache-stash-id" , (*reg *2 ) +32 +1 );#endif
arch/powerpc/cpu/mpc85xx/release.S +7 -7
@@ -183,13 +183,6 @@ __secondary_start_page: slwi r8,r4,5 add r10,r3,r8 -#if defined(CONFIG_E500MC) && defined(CONFIG_SYS_CACHE_STASHING) - /* set stash id to (coreID) * 2 + 32 + L1 CT (0) */ - slwi r8,r4,1 - addi r8,r8,32 - mtspr L1CSR2,r8 -#endif - #ifdef CONFIG_E6500 mfspr r0,SPRN_PIR /*
@@ -209,6 +202,13 @@ __secondary_start_page: mtspr SPRN_PIR,r4 /* write to PIR register */ +#ifdef CONFIG_SYS_CACHE_STASHING + /* set stash id to (coreID) * 2 + 32 + L1 CT (0) */ + slwi r8,r4,1 + addi r8,r8,32 + mtspr L1CSR2,r8 +#endif + #if defined(CONFIG_SYS_P4080_ERRATUM_CPU22) || \ defined(CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011) /*
arch/powerpc/cpu/mpc85xx/start.S +36 -1
@@ -169,7 +169,7 @@ l2_disabled: * */ -#if defined(CONFIG_E500MC) && defined(CONFIG_SYS_CACHE_STASHING) +#ifdef CONFIG_SYS_CACHE_STASHING /* set stash id to (coreID) * 2 + 32 + L1 CT (0) */ li r2,(32 + 0) mtspr L1CSR2,r2
@@ -750,6 +750,41 @@ delete_temp_tlbs: #endif /* #if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS) */ +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +create_ccsr_l2_tlb: + /* + * Create a TLB for the MMR location of CCSR + * to access L2CSR0 register + */ + create_tlb0_entry 0, \ + 0, BOOKE_PAGESZ_4K, \ + CONFIG_SYS_CCSRBAR + 0xC20000, MAS2_I|MAS2_G, \ + CONFIG_SYS_CCSRBAR_PHYS_LOW + 0xC20000, MAS3_SW|MAS3_SR, \ + CONFIG_SYS_CCSRBAR_PHYS_HIGH, r3 + +enable_l2_cluster_l2: + /* enable L2 cache */ + lis r3, (CONFIG_SYS_CCSRBAR + 0xC20000)@h + ori r3, r3, (CONFIG_SYS_CCSRBAR + 0xC20000)@l + li r4, 33 /* stash id */ + stw r4, 4(r3) + lis r4, (L2CSR0_L2FI|L2CSR0_L2LFC)@h + ori r4, r4, (L2CSR0_L2FI|L2CSR0_L2LFC)@l + sync + stw r4, 0(r3) /* invalidate L2 */ +1: sync + lwz r0, 0(r3) + twi 0, r0, 0 + isync + and. r1, r0, r4 + bne 1b + lis r4, L2CSR0_L2E at h + sync + stw r4, 0(r3) /* eanble L2 */ +delete_ccsr_l2_tlb: + delete_tlb0_entry 0, CONFIG_SYS_CCSRBAR + 0xC20000, MAS2_I|MAS2_G, r3 +#endif + #ifdef CONFIG_SYS_FSL_ERRATUM_A004510 #define DCSR_LAWBARH0 (CONFIG_SYS_CCSRBAR + 0x1000) #define LAW_SIZE_1M 0x13
arch/powerpc/include/asm/immap_85xx.h +59 -0
69 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH 6/28 powerpc/mpc85xx: change RCW MEM_PLL_PLAT for Chassis generation 2
In reply to York SunChassis generation 2 has different mask and shift. Use macro instead of magic numbers.
--- arch/powerpc/cpu/mpc85xx/speed.c | 4 +++- arch/powerpc/include/asm/immap_85xx.h | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-)
arch/powerpc/cpu/mpc85xx/speed.c +3 -1
@@ -85,7 +85,9 @@ void get_sys_info (sys_info_t * sysInfo) sysInfo->freqDDRBus = sysclk; sysInfo->freqSystemBus *= (in_be32 (&gur->rcwsr[0 ]) >>25 ) &0x1f ; - mem_pll_rat = (in_be32 (&gur->rcwsr[0 ]) >>17 ) &0x1f ; + mem_pll_rat = (in_be32 (&gur->rcwsr[0 ]) >> +FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT ) + &FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK ;if (mem_pll_rat >2 ) sysInfo->freqDDRBus *= mem_pll_rat;else
arch/powerpc/include/asm/immap_85xx.h +7 -0
@@ -1755,6 +1755,13 @@ typedef struct ccsr_gur {u32 brrl;/* Boot release */ u8 res17[24 ];u32 rcwsr[16 ];/* Reset control word status */ +#ifndef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 17 +#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK 0x1f +#else +#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 16 +#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK 0x3f +#endif #define FSL_CORENET_RCWSR4_SRDS_PRTCL 0xfc000000#define FSL_CORENET_RCWSR5_DDR_SYNC 0x00000080#define FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT 7
Signature · 1 line
1.7.9.5
PATCH 7/28 powerpc/mpc85xx: check number of cores
In reply to York SunPanic if the number of cores is more than CONFIG_MAX_CPUS because it will surely overflow gd structure.
--- arch/powerpc/cpu/mpc85xx/cpu.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/powerpc/cpu/mpc85xx/cpu.c +5 -0
@@ -127,6 +127,11 @@ int checkcpu (void)printf (", Version: %d.%d, (0x%08x)\n" , major, minor, pvr); +if (nr_cores >CONFIG_MAX_CPUS ) { +panic ("\nUnexpected number of cores: %d, max is %d\n" , + nr_cores,CONFIG_MAX_CPUS ); + } +get_sys_info (&sysinfo);puts ("Clock Configuration:" );
Signature · 1 line
1.7.9.5
PATCH 8/28 powerpc/mpc85xx: Fix core cluster PLL calculation for Chassis generation 2
In reply to York SunCorenet based SoCs have different core clocks starting from Chassis generation 2. Cores are organized into clusters. Each cluster has up to 4 cores sharing same clock, which can be chosen from one of three PLLs in the cluster group with one of the devisors /1, /2 or /4. Two clusters are put together as a cluster group. These two clusters share the PLLs but may have different divisor. For example, core 0~3 are in cluster 1. Core 4~7 are in cluster 2. Core 8~11 are in cluster 3 and so on. Cluster 1 and 2 are cluster group A. Cluster 3 and 4 are in cluster group B. Cluster group A has PLL1, PLL2, PLL3. Cluster group B has PLL4, PLL5. Core 0~3 may have PLL1/2, core 4~7 may have PLL2/2. Core 8~11 may have PLL4/1.
PME and FMan blocks can take different PLLs, configured by RCW.
--- arch/powerpc/cpu/mpc85xx/speed.c | 138 ++++++++++++++++++++++++++++++--- arch/powerpc/include/asm/immap_85xx.h | 36 +++++---- 2 files changed, 148 insertions(+), 26 deletions(-)
arch/powerpc/cpu/mpc85xx/speed.c +128 -10
@@ -76,8 +76,8 @@ void get_sys_info (sys_info_t * sysInfo) [13] = 2, /* CC4 PPL / 2 */ [14] = 4, /* CC4 PPL / 4 */ }; -uint lcrr_div, i, freqCC_PLL[4 ], rcw_tmp; -uint ratio[4 ]; +uint i, freqCC_PLL[6 ], rcw_tmp; +uint ratio[6 ];unsigned long sysclk =CONFIG_SYS_CLK_FREQ ;uint mem_pll_rat;
@@ -97,21 +97,139 @@ void get_sys_info (sys_info_t * sysInfo) ratio[1 ] = (in_be32 (&clk->pllc2gsr) >>1 ) &0x3f ; ratio[2 ] = (in_be32 (&clk->pllc3gsr) >>1 ) &0x3f ; ratio[3 ] = (in_be32 (&clk->pllc4gsr) >>1 ) &0x3f ; -for (i =0 ; i <4 ; i++) { + ratio[4 ] = (in_be32 (&clk->pllc5gsr) >>1 ) &0x3f ; + ratio[5 ] = (in_be32 (&clk->pllc6gsr) >>1 ) &0x3f ; +for (i =0 ; i <6 ; i++) {if (ratio[i] >4 ) freqCC_PLL[i] = sysclk * ratio[i];else freqCC_PLL[i] = sysInfo->freqSystemBus * ratio[i]; } - rcw_tmp =in_be32 (&gur->rcwsr[3 ]); +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +/* +* Each cluster has up to 4 cores, sharing the same PLL selection. +* The cluster assignment is fixed per SoC. There is no way identify the +* assignment so far, presuming the "first configuration" which is to +* fill the lower cluster group first before moving up to next group. +* PLL1, PLL2, PLL3 are cluster group A, feeding core 0~3 on cluster 1 +* and core 4~7 on cluster 2 +* PLL4, PLL5, PLL6 are cluster group B, feeding core 8~11 on cluster 3 +* and core 12~15 on cluster 4 if existing +*/ for_each_cpu (i, cpu,cpu_numcores (),cpu_mask ()) { -u32 c_pll_sel = (in_be32 (&clk->clkc0csr + cpu*8 ) >>27 ) &0xf ; +u32 c_pll_sel = (in_be32 (&clk->clkc0csr + (cpu /4 ) *8 ) >>27 ) + &0xf ;u32 cplx_pll = core_cplx_PLL[c_pll_sel]; +if (cplx_pll >3 ) +printf ("Unsupported architecture configuration" +" in function %s\n" , __func__); + cplx_pll += (cpu /8 ) *3 ; sysInfo->freqProcessor[cpu] = freqCC_PLL[cplx_pll] / core_cplx_PLL_div[c_pll_sel]; } +#define PME_CLK_SEL 0xe0000000 +#define PME_CLK_SHIFT 29 +#define FM1_CLK_SEL 0x1c000000 +#define FM1_CLK_SHIFT 26 + rcw_tmp =in_be32 (&gur->rcwsr[7 ]); + +#ifdef CONFIG_SYS_DPAA_PME +switch ((rcw_tmp &PME_CLK_SEL ) >>PME_CLK_SHIFT ) { +case 1 : + sysInfo->freqPME = freqCC_PLL[0 ]; +break ; +case 2 : + sysInfo->freqPME = freqCC_PLL[0 ] /2 ; +break ; +case 3 : + sysInfo->freqPME = freqCC_PLL[0 ] /3 ; +break ; +case 4 : + sysInfo->freqPME = freqCC_PLL[0 ] /4 ; +break ; +case 6 : + sysInfo->freqPME = freqCC_PLL[1 ] /2 ; +break ; +case 7 : + sysInfo->freqPME = freqCC_PLL[1 ] /3 ; +break ; +default : +printf ("Error: Unknown PME clock select!\n" ); +case 0 : + sysInfo->freqPME = sysInfo->freqSystemBus /2 ; +break ; + + } +#endif +#ifdef CONFIG_SYS_DPAA_FMAN +switch ((rcw_tmp &FM1_CLK_SEL ) >>FM1_CLK_SHIFT ) { +case 1 : + sysInfo->freqFMan[0 ] = freqCC_PLL[3 ]; +break ; +case 2 : + sysInfo->freqFMan[0 ] = freqCC_PLL[3 ] /2 ; +break ; +case 3 : + sysInfo->freqFMan[0 ] = freqCC_PLL[3 ] /3 ; +break ; +case 4 : + sysInfo->freqFMan[0 ] = freqCC_PLL[3 ] /4 ; +break ; +case 6 : + sysInfo->freqFMan[0 ] = freqCC_PLL[4 ] /2 ; +break ; +case 7 : + sysInfo->freqFMan[0 ] = freqCC_PLL[4 ] /3 ; +break ; +default : +printf ("Error: Unknown FMan1 clock select!\n" ); +case 0 : + sysInfo->freqFMan[0 ] = sysInfo->freqSystemBus /2 ; +break ; + } +#if (CONFIG_SYS_NUM_FMAN ) ==2 +#define FM2_CLK_SEL 0x00000038 +#define FM2_CLK_SHIFT 3 + rcw_tmp =in_be32 (&gur->rcwsr[15 ]); +switch ((rcw_tmp &FM2_CLK_SEL ) >>FM2_CLK_SHIFT ) { +case 1 : + sysInfo->freqFMan[1 ] = freqCC_PLL[4 ]; +break ; +case 2 : + sysInfo->freqFMan[1 ] = freqCC_PLL[4 ] /2 ; +break ; +case 3 : + sysInfo->freqFMan[1 ] = freqCC_PLL[4 ] /3 ; +break ; +case 4 : + sysInfo->freqFMan[1 ] = freqCC_PLL[4 ] /4 ; +break ; +case 6 : + sysInfo->freqFMan[1 ] = freqCC_PLL[3 ] /2 ; +break ; +case 7 : + sysInfo->freqFMan[1 ] = freqCC_PLL[3 ] /3 ; +break ; +default : +printf ("Error: Unknown FMan2 clock select!\n" ); +case 0 : + sysInfo->freqFMan[1 ] = sysInfo->freqSystemBus /2 ; +break ; + } +#endif /* CONFIG_SYS_NUM_FMAN == 2 */ +#endif /* CONFIG_SYS_DPAA_FMAN */ + +#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ + +for_each_cpu (i, cpu,cpu_numcores (),cpu_mask ()) { +u32 c_pll_sel = (in_be32 (&clk->clkc0csr + cpu*8 ) >>27 ) &0xf ; +u32 cplx_pll = core_cplx_PLL[c_pll_sel]; + + sysInfo->freqProcessor[cpu] = + freqCC_PLL[cplx_pll] / core_cplx_PLL_div[c_pll_sel]; + }#define PME_CLK_SEL 0x80000000#define FM1_CLK_SEL 0x40000000#define FM2_CLK_SEL 0x20000000
@@ -157,11 +275,10 @@ void get_sys_info (sys_info_t * sysInfo)#endif #endif -#else -uint plat_ratio,e500_ratio,half_freqSystemBus; -#if defined(CONFIG_FSL_LBC ) -uint lcrr_div; -#endif +#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ + +#else /* CONFIG_FSL_CORENET */ +uint plat_ratio, e500_ratio, half_freqSystemBus;int i;#ifdef CONFIG_QE __maybe_unused u32 qe_ratio;
@@ -208,6 +325,7 @@ void get_sys_info (sys_info_t * sysInfo)#endif /* CONFIG_FSL_CORENET */ #if defined(CONFIG_FSL_LBC ) +uint lcrr_div;#if defined(CONFIG_SYS_LBC_LCRR )/* We will program LCRR to this value later */ lcrr_div =CONFIG_SYS_LBC_LCRR &LCRR_CLKDIV ;
arch/powerpc/include/asm/immap_85xx.h +20 -16
@@ -1887,34 +1887,38 @@ typedef struct ccsr_gur {#define rmuliodnr rio1maintliodnrtypedef struct ccsr_clk { -u32 clkc0csr;/* Core 0 Clock control/status */ +u32 clkc0csr;/* 0x000 Core 0 Clock control/status */ u8 res1[0x1c ]; -u32 clkc1csr;/* Core 1 Clock control/status */ +u32 clkc1csr;/* 0x020 Core 1 Clock control/status */ u8 res2[0x1c ]; -u32 clkc2csr;/* Core 2 Clock control/status */ +u32 clkc2csr;/* 0x040 Core 2 Clock control/status */ u8 res3[0x1c ]; -u32 clkc3csr;/* Core 3 Clock control/status */ +u32 clkc3csr;/* 0x060 Core 3 Clock control/status */ u8 res4[0x1c ]; -u32 clkc4csr;/* Core 4 Clock control/status */ +u32 clkc4csr;/* 0x080 Core 4 Clock control/status */ u8 res5[0x1c ]; -u32 clkc5csr;/* Core 5 Clock control/status */ +u32 clkc5csr;/* 0x0a0 Core 5 Clock control/status */ u8 res6[0x1c ]; -u32 clkc6csr;/* Core 6 Clock control/status */ +u32 clkc6csr;/* 0x0c0 Core 6 Clock control/status */ u8 res7[0x1c ]; -u32 clkc7csr;/* Core 7 Clock control/status */ +u32 clkc7csr;/* 0x0e0 Core 7 Clock control/status */ u8 res8[0x71c ]; -u32 pllc1gsr;/* Cluster PLL 1 General Status */ +u32 pllc1gsr;/* 0x800 Cluster PLL 1 General Status */ u8 res10[0x1c ]; -u32 pllc2gsr;/* Cluster PLL 2 General Status */ +u32 pllc2gsr;/* 0x820 Cluster PLL 2 General Status */ u8 res11[0x1c ]; -u32 pllc3gsr;/* Cluster PLL 3 General Status */ +u32 pllc3gsr;/* 0x840 Cluster PLL 3 General Status */ u8 res12[0x1c ]; -u32 pllc4gsr;/* Cluster PLL 4 General Status */ -u8 res13[0x39c ]; -u32 pllpgsr;/* Platform PLL General Status */ +u32 pllc4gsr;/* 0x860 Cluster PLL 4 General Status */ +u8 res13[0x1c ]; +u32 pllc5gsr;/* 0x880 Cluster PLL 5 General Status */ u8 res14[0x1c ]; -u32 plldgsr;/* DDR PLL General Status */ -u8 res15[0x3dc ]; +u32 pllc6gsr;/* 0x8a0 Cluster PLL 6 General Status */ +u8 res15[0x35c ]; +u32 pllpgsr;/* 0xc00 Platform PLL General Status */ +u8 res16[0x1c ]; +u32 plldgsr;/* 0xc20 DDR PLL General Status */ +u8 res17[0x3dc ]; }ccsr_clk_t ;#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
Signature · 1 line
1.7.9.5
PATCH 9/28 powerpc/mpc85xx: expand SERDES reference clock select bit
In reply to York SunExpand the reference clock select to three bits
000: 100 MHz
001: 125 MHz
010: 156.25MHz
011: 150 MHz
100: 161.1328125 MHz
All others reserved
--- arch/powerpc/include/asm/immap_85xx.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/immap_85xx.h +2 -1
@@ -2403,11 +2403,12 @@ typedef struct serdes_corenet {#define SRDS_RSTCTL_RSTERR 0x20000000#define SRDS_RSTCTL_SDPD 0x00000020u32 pllcr0;/* PLL Control Register 0 */ -#define SRDS_PLLCR0_RFCK_SEL_MASK 0x30000000 +#define SRDS_PLLCR0_RFCK_SEL_MASK 0x70000000#define SRDS_PLLCR0_RFCK_SEL_100 0x00000000#define SRDS_PLLCR0_RFCK_SEL_125 0x10000000#define SRDS_PLLCR0_RFCK_SEL_156_25 0x20000000#define SRDS_PLLCR0_RFCK_SEL_150 0x30000000 +#define SRDS_PLLCR0_RFCK_SEL_161_13 0x40000000#define SRDS_PLLCR0_FRATE_SEL_MASK 0x00030000#define SRDS_PLLCR0_FRATE_SEL_5 0x00000000#define SRDS_PLLCR0_FRATE_SEL_6_25 0x00010000
Signature · 1 line
1.7.9.5
PATCH 10/28 powerpc/e6500: Move QCSP registers for QMan v3
In reply to York SunThe QCSP registers are expanded and moved from offset 0 to offset 0x1000 for SoCs with QMan v3.
--- arch/powerpc/include/asm/immap_85xx.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/immap_85xx.h +12 -1
@@ -2535,13 +2535,16 @@ typedef struct ccsr_sec {#endif typedef struct ccsr_qman { +#ifdef CONFIG_SYS_FSL_QMAN_V3 + u8 res0[0x200]; +#else struct { u32 qcsp_lio_cfg; /* 0x0 - SW Portal n LIO cfg */ u32 qcsp_io_cfg; /* 0x4 - SW Portal n IO cfg */ u32 res; u32 qcsp_dd_cfg; /* 0xc - SW Portal n Dynamic Debug cfg */ } qcsp[32]; - +#endif /* Not actually reserved, but irrelevant to u-boot */ u8 res[0xbf8 - 0x200]; u32 ip_rev_1;
@@ -2566,6 +2569,14 @@ typedef struct ccsr_qman {u32 ci_rlm_cfg;/* Initiator Read Latency Monitor Cfg */ u32 ci_rlm_avg;/* Initiator Read Latency Monitor Avg */ u8 res7[0x2e8 ]; +#ifdef CONFIG_SYS_FSL_QMAN_V3 +struct { +u32 qcsp_lio_cfg;/* 0x0 - SW Portal n LIO cfg */ +u32 qcsp_io_cfg;/* 0x4 - SW Portal n IO cfg */ +u32 res; +u32 qcsp_dd_cfg;/* 0xc - SW Portal n Dynamic Debug cfg*/ + } qcsp[50 ]; +#endif } ccsr_qman_t; typedef struct ccsr_bman {
Signature · 1 line
1.7.9.5
PATCH 11/28 powerpc/mpc85xx: Add RCW bits and registers for SerDes for corenet2
In reply to York SunCorenet 2nd generation Chassis has different RCW and registers for SerDes.
--- arch/powerpc/include/asm/immap_85xx.h | 98 +++++++++++++++++++++++++++++++-- 1 file changed, 93 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/immap_85xx.h +93 -5
@@ -1755,13 +1755,30 @@ typedef struct ccsr_gur {u32 brrl;/* Boot release */ u8 res17[24 ];u32 rcwsr[16 ];/* Reset control word status */ -#ifndef CONFIG_SYS_FSL_QORIQ_CHASSIS2 -#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 17 -#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK 0x1f -#else + +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 #define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 16#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK 0x3f -#endif +#define FSL_CORENET2_RCWSR4_SRDS1_PRTCL 0xfc000000 +#define FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT 26 +#define FSL_CORENET2_RCWSR4_SRDS2_PRTCL 0x00fe0000 +#define FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT 17 +#define FSL_CORENET2_RCWSR4_SRDS3_PRTCL 0x0000f800 +#define FSL_CORENET2_RCWSR4_SRDS3_PRTCL_SHIFT 11 +#define FSL_CORENET2_RCWSR4_SRDS4_PRTCL 0x000000f8 +#define FSL_CORENET2_RCWSR4_SRDS4_PRTCL_SHIFT 3 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S1_PLL1 0x00800000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S1_PLL2 0x00400000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S2_PLL1 0x00200000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S2_PLL2 0x00100000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S3_PLL1 0x00080000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S3_PLL2 0x00040000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL1 0x00020000 +#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S4_PLL2 0x00010000 + +#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ +#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_SHIFT 17 +#define FSL_CORENET_RCWSR0_MEM_PLL_RAT_MASK 0x1f#define FSL_CORENET_RCWSR4_SRDS_PRTCL 0xfc000000#define FSL_CORENET_RCWSR5_DDR_SYNC 0x00000080#define FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT 7
@@ -1769,6 +1786,8 @@ typedef struct ccsr_gur {#define FSL_CORENET_RCWSR6_BOOT_LOC 0x0f800000#define FSL_CORENET_RCWSRn_SRDS_LPD_B2 0x3c000000/* bits 162..165 */ #define FSL_CORENET_RCWSRn_SRDS_LPD_B3 0x003c0000/* bits 170..173 */ +#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ +#define FSL_CORENET_RCWSR7_MCK_TO_PLAT_RAT 0x00400000#define FSL_CORENET_RCWSR8_HOST_AGT_B1 0x00e00000#define FSL_CORENET_RCWSR8_HOST_AGT_B2 0x00100000
@@ -2395,6 +2414,74 @@ typedef struct ccsr_gur {#define SDHCDCR_CD_INV 0x80000000/* invert SDHC card detect */ +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +#define MAX_SERDES 4 +typedef struct serdes_corenet { + struct { + u32 rstctl; /* Reset Control Register */ +#define SRDS_RSTCTL_RST 0x80000000 +#define SRDS_RSTCTL_RSTDONE 0x40000000 +#define SRDS_RSTCTL_RSTERR 0x20000000 +#define SRDS_RSTCTL_SWRST 0x10000000 +#define SRDS_RSTCTL_SDPD 0x00000020 + u32 pllcr0; /* PLL Control Register 0 */ +#define SRDS_PLLCR0_POFF 0x80000000 +#define SRDS_PLLCR0_RFCK_SEL_MASK 0x70000000 +#define SRDS_PLLCR0_RFCK_SEL_100 0x00000000 +#define SRDS_PLLCR0_RFCK_SEL_125 0x10000000 +#define SRDS_PLLCR0_RFCK_SEL_156_25 0x20000000 +#define SRDS_PLLCR0_RFCK_SEL_150 0x30000000 +#define SRDS_PLLCR0_RFCK_SEL_161_13 0x40000000 +#define SRDS_PLLCR0_RFCK_SEL_122_88 0x50000000 +#define SRDS_PLLCR0_FRATE_SEL_MASK 0x000f0000 +#define SRDS_PLLCR0_FRATE_SEL_5 0x00000000 +#define SRDS_PLLCR0_FRATE_SEL_3_75 0x00050000 +#define SRDS_PLLCR0_FRATE_SEL_5_15 0x00060000 +#define SRDS_PLLCR0_FRATE_SEL_4 0x00070000 +#define SRDS_PLLCR0_FRATE_SEL_3_12 0x00090000 +#define SRDS_PLLCR0_FRATE_SEL_3 0x000a0000 + u32 pllcr1; /* PLL Control Register 1 */ +#define SRDS_PLLCR1_PLL_BWSEL 0x08000000 + u32 res_0c; /* 0x00c */ + u32 pllcr3; + u32 pllcr4; + u8 res_18[0x20-0x18]; + } bank[2]; + u8 res_40[0x90-0x40]; + u32 srdstcalcr; /* 0x90 TX Calibration Control */ + u8 res_94[0xa0-0x94]; + u32 srdsrcalcr; /* 0xa0 RX Calibration Control */ + u8 res_a4[0xb0-0xa4]; + u32 srdsgr0; /* 0xb0 General Register 0 */ + u8 res_b4[0xe0-0xb4]; + u32 srdspccr0; /* 0xe0 Protocol Converter Config 0 */ + u32 srdspccr1; /* 0xe4 Protocol Converter Config 1 */ + u32 srdspccr2; /* 0xe8 Protocol Converter Config 2 */ + u32 srdspccr3; /* 0xec Protocol Converter Config 3 */ + u32 srdspccr4; /* 0xf0 Protocol Converter Config 4 */ + u8 res_f4[0x100-0xf4]; + struct { + u32 lnpssr; /* 0x100, 0x120, ..., 0x1e0 */ + u8 res_104[0x120-0x104]; + } srdslnpssr[8]; + u8 res_200[0x800-0x200]; + struct { + u32 gcr0; /* 0x800 General Control Register 0 */ + u32 gcr1; /* 0x804 General Control Register 1 */ + u32 gcr2; /* 0x808 General Control Register 2 */ + u32 res_80c; + u32 recr0; /* 0x810 Receive Equalization Control */ + u32 res_814; + u32 tecr0; /* 0x818 Transmit Equalization Control */ + u32 res_81c; + u32 ttlcr0; /* 0x820 Transition Tracking Loop Ctrl 0 */ + u8 res_824[0x840-0x824]; + } lane[8]; /* Lane A, B, C, D, E, F, G, H */ + u8 res_a00[0x1000-0xa00]; /* from 0xa00 to 0xfff */ +} serdes_corenet_t; + +#else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ + typedef struct serdes_corenet { struct { u32 rstctl; /* Reset Control Register */
@@ -2452,6 +2539,7 @@ typedef struct serdes_corenet { } lane[24];u32 res6[384 ]; } serdes_corenet_t; +#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ enum {FSL_SRDS_B1_LANE_A =0 ,
Signature · 1 line
1.7.9.5
PATCH 12/28 powerpc/corenet2: Add SerDes for corenet2
In reply to York SunCreate new files to handle 2nd generation Chassis as the registers are organized differently.
- Add SerDes protocol parsing and detection
- Add support of 4 SerDes
- Add CPRI protocol in fsl_serdes.h
The Common Public Radio Interface (CPRI) is publicly available specification that standardizes the protocol interface between the radio equipment control (REC) and the radio equipment (RE) in wireless basestations. This allows interoperability of equipment from different vendors,and preserves the software investment made by wireless service providers.
--- arch/powerpc/cpu/mpc85xx/Makefile | 3 +- arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.c | 203 ++++++++++++++++++++++++ arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h | 26 +++ arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.h | 3 - arch/powerpc/include/asm/config_mpc85xx.h | 4 + arch/powerpc/include/asm/fsl_serdes.h | 42 +++++ arch/powerpc/include/asm/immap_85xx.h | 4 + 7 files changed, 281 insertions(+), 4 deletions(-) create mode 100644 arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.c create mode 100644 arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h
arch/powerpc/cpu/mpc85xx/Makefile +2 -1
@@ -83,7 +83,8 @@ COBJS-$(CONFIG_PPC_P5020) += p5020_ids.o COBJS-$(CONFIG_QE) += qe_io.o COBJS-$(CONFIG_CPM2) += serial_scc.o -COBJS-$(CONFIG_FSL_CORENET) += fsl_corenet_serdes.o +COBJS-$(CONFIG_SYS_FSL_QORIQ_CHASSIS1) += fsl_corenet_serdes.o +COBJS-$(CONFIG_SYS_FSL_QORIQ_CHASSIS2) += fsl_corenet2_serdes.o # SoC specific SERDES support COBJS-$(CONFIG_MPC8536) += mpc8536_serdes.o
arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.c new file +203 -0
203 lines not on this page · raw message
arch/powerpc/cpu/mpc85xx/fsl_corenet2_serdes.h new file +26 -0
@@ -0,0 +1,26 @@ +/* +* Copyright 2012 Freescale Semiconductor, Inc. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +#ifndef __FSL_CORENET2_SERDES_H +#define __FSL_CORENET2_SERDES_H + +int is_serdes_prtcl_valid (int serdes,u32 prtcl); +int serdes_lane_enabled (int lane); +enum srds_prtcl serdes_get_prtcl (int serdes,int cfg,int lane); +#endif /* __FSL_CORENET2_SERDES_H */
arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.h +0 -3
@@ -22,9 +22,6 @@#ifndef __FSL_CORENET_SERDES_H#define __FSL_CORENET_SERDES_H -#define SRDS_MAX_LANES 18 -#define SRDS_MAX_BANK 3 -enum srds_bank {FSL_SRDS_BANK_1 =0 , FSL_SRDS_BANK_2 = 1,
arch/powerpc/include/asm/config_mpc85xx.h +4 -0
@@ -311,6 +311,7 @@#define CONFIG_SYS_FSL_SRIO_MSG_UNIT_NUM 2#elif defined(CONFIG_PPC_P2041 )/* also supports P2040 */ +#define CONFIG_SYS_FSL_QORIQ_CHASSIS1 #define CONFIG_MAX_CPUS 4#define CONFIG_SYS_FSL_NUM_CC_PLLS 2#define CONFIG_SYS_FSL_NUM_LAWS 32
@@ -340,6 +341,7 @@#define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000#elif defined(CONFIG_PPC_P3041 ) +#define CONFIG_SYS_FSL_QORIQ_CHASSIS1 #define CONFIG_MAX_CPUS 4#define CONFIG_SYS_FSL_NUM_CC_PLLS 2#define CONFIG_SYS_FSL_NUM_LAWS 32
@@ -369,6 +371,7 @@#define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xf0000000#elif defined(CONFIG_PPC_P4080 )/* also supports P4040 */ +#define CONFIG_SYS_FSL_QORIQ_CHASSIS1 #define CONFIG_MAX_CPUS 8#define CONFIG_SYS_FSL_NUM_CC_PLLS 4#define CONFIG_SYS_FSL_NUM_LAWS 32
@@ -408,6 +411,7 @@#define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xff000000#elif defined(CONFIG_PPC_P5020 )/* also supports P5010 */ +#define CONFIG_SYS_FSL_QORIQ_CHASSIS1 #define CONFIG_MAX_CPUS 2#define CONFIG_SYS_FSL_NUM_CC_PLLS 2#define CONFIG_SYS_FSL_NUM_LAWS 32
arch/powerpc/include/asm/fsl_serdes.h +42 -0
66 lines not on this page · raw message
arch/powerpc/include/asm/immap_85xx.h +4 -0
@@ -2416,6 +2416,8 @@ typedef struct ccsr_gur { #ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 #define MAX_SERDES 4 +#define SRDS_MAX_LANES 8 +#define SRDS_MAX_BANK 2 typedef struct serdes_corenet { struct { u32 rstctl; /* Reset Control Register */
@@ -2482,6 +2484,8 @@ typedef struct serdes_corenet { #else /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ +#define SRDS_MAX_LANES 18 +#define SRDS_MAX_BANK 3 typedef struct serdes_corenet { struct { u32 rstctl; /* Reset Control Register */
Signature · 1 line
1.7.9.5
PATCH 13/28 powerpc/corenet2: fix mismatch DDR sync bit from RCW
In reply to York SunCorenet 2nd generation Chassis doesn't have ddr_sync bit in RCW. Only async mode is supported.
--- arch/powerpc/cpu/mpc85xx/cpu.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/powerpc/cpu/mpc85xx/cpu.c +8 -2
@@ -60,7 +60,8 @@ int checkcpu (void)uint major, minor;struct cpu_type *cpu;char buf1[32 ], buf2[32 ]; -#if defined(CONFIG_DDR_CLK_FREQ ) || defined(CONFIG_FSL_CORENET ) +#if defined(CONFIG_DDR_CLK_FREQ ) || \ + (defined(CONFIG_FSL_CORENET ) && !defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2 ))volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);#endif /* CONFIG_FSL_CORENET */ #ifdef CONFIG_DDR_CLK_FREQ
@@ -68,8 +69,13 @@ int checkcpu (void) >> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;#else #ifdef CONFIG_FSL_CORENET -u32 ddr_sync = ((gur->rcwsr[5 ]) &FSL_CORENET_RCWSR5_DDR_SYNC ) +u32 ddr_sync ; +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 + ddr_sync =0 ;/* only async mode is supported */ +#else + ddr_sync = ((gur->rcwsr[5 ]) &FSL_CORENET_RCWSR5_DDR_SYNC ) >>FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT ; +#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ #else u32 ddr_ratio =0 ;#endif /* CONFIG_FSL_CORENET */
Signature · 1 line
1.7.9.5
PATCH 14/28 board/freescale/common: VSC3316/VSC3308 initialization code
In reply to York SunFrom: Shaveta Leekha <[email protected]>
Add code for configuring VSC3316/3308 crosspoint switches Add README to understand the APIs
- VSC 3316/3308 is a low-power, low-cost asynchronous crosspoint switch capable of data rates upto 11.5Gbps. VSC3316 has 16 input and 16 output ports whereas VSC3308 has 8 input and 8 output ports. Programming of these devices are performed by two-wire or four-wire serial interface.
--- board/freescale/common/Makefile | 1 + board/freescale/common/vsc3316_3308.c | 184 +++++++++++++++++++++++++++++++++ board/freescale/common/vsc3316_3308.h | 34 ++++++ doc/README.VSC3316-3308 | 43 ++++++++ 4 files changed, 262 insertions(+) create mode 100644 board/freescale/common/vsc3316_3308.c create mode 100644 board/freescale/common/vsc3316_3308.h create mode 100644 doc/README.VSC3316-3308
board/freescale/common/Makefile +1 -0
@@ -53,6 +53,7 @@ COBJS-$(CONFIG_P2020DS) += ics307_clk.o COBJS-$(CONFIG_P3041DS) += ics307_clk.o COBJS-$(CONFIG_P4080DS) += ics307_clk.o COBJS-$(CONFIG_P5020DS) += ics307_clk.o +COBJS-$(CONFIG_VSC_CROSSBAR) += vsc3316_3308.o # deal with common files for P-series corenet based devices SUBLIB-$(CONFIG_P2041RDB) += p_corenet/libp_corenet.o
board/freescale/common/vsc3316_3308.c new file +184 -0
184 lines not on this page · raw message
board/freescale/common/vsc3316_3308.h new file +34 -0
@@ -0,0 +1,34 @@ +/* +* Copyright 2012 Freescale Semiconductor, Inc. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, +* MA 02111-1307 USA +*/ + +#ifndef __VSC_CROSSBAR_H_ +#define __VSC_CROSSBAR_H 1_ + +#include <common.h> +#include <i2c.h> +#include <errno.h> + +int vsc_if_enable (unsigned int vsc_addr); +int vsc3316_config (unsigned int vsc_addr,const int8_t con_arr[][2 ], +unsigned int num_con); +int vsc3308_config (unsigned int vsc_addr,const int8_t con_arr[][2 ], +unsigned int num_con); +void vsc_wp_config (unsigned int vsc_addr); + +#endif /* __VSC_CROSSBAR_H_ */
doc/README.VSC3316-3308 new file +43 -0
43 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH 15/28 powerpc/mpc85xx: Add T4 device definitions
In reply to York SunFrom: Andy Fleming <[email protected]>
The T4 has added devices to previous corenet implementations:
* SEC has 3 more DECO units
* New PMAN device
* New DCE device
This doesn't add full support for the new devices. Just some preliminary support.
Move PMAN LIODN to upper half of register
Despite having only one LIODN, the PMAN LIODN is stored in the upper half of the register. Re-use the 2-LIODN code and just set the LIODN as if the second one is 0. This results in the actual LIODN being written to the upper half of the register.
--- arch/powerpc/include/asm/fsl_liodn.h | 6 +++++ arch/powerpc/include/asm/fsl_portals.h | 3 +++ arch/powerpc/include/asm/immap_85xx.h | 41 ++++++++++++++++++++++++++++++-- 3 files changed, 48 insertions(+), 2 deletions(-)
arch/powerpc/include/asm/fsl_liodn.h +6 -0
@@ -118,6 +118,12 @@ extern void fdt_fixup_liodn(void *blob); CONFIG_SYS_FSL_CORENET_PME_OFFSET, \ CONFIG_SYS_FSL_CORENET_PME_OFFSET) +#define SET_PMAN_LIODN (num, liodn) \ + SET_LIODN_ENTRY_2("fsl,pman", liodn, 0, \ + offsetof(struct ccsr_pman, ppa1) + \ + CONFIG_SYS_FSL_CORENET_PMAN##num##_OFFSET, \ + CONFIG_SYS_FSL_CORENET_PMAN##num##_OFFSET) +/* -1 from portID due to how immap has the registers */ #define FM_PPID_RX_PORT_OFFSET (fmNum, portID) \ CONFIG_SYS_FSL_FM##fmNum##_OFFSET + \
arch/powerpc/include/asm/fsl_portals.h +3 -0
@@ -39,6 +39,9 @@ enum fsl_dpaa_dev {#ifdef CONFIG_SYS_DPAA_RMAN FSL_HW_PORTAL_RMAN,#endif +#ifdef CONFIG_SYS_DPAA_DCE + FSL_HW_PORTAL_DCE, +#endif };
arch/powerpc/include/asm/immap_85xx.h +39 -2
69 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH 16/28 powerpc/mpc85xx: Add T4240 SoC
In reply to York SunAdd support for Freescale T4240 SoC. Feature of T4240 are (incomplete list):
12 dual-threaded e6500 cores built on Power Architecture? technology
Arranged as clusters of four cores sharing a 2 MB L2 cache. Up to 1.8 GHz at 1.0 V with 64-bit ISA support (Power Architecture
v2.06-compliant)
Three levels of instruction: user, supervisor, and hypervisor
1.5 MB CoreNet Platform Cache (CPC)
Hierarchical interconnect fabric
CoreNet fabric supporting coherent and non-coherent transactions with
prioritization and bandwidth allocation amongst CoreNet end-points
1.6 Tbps coherent read bandwidth
Queue Manager (QMan) fabric supporting packet-level queue management and
quality of service scheduling
Three 64-bit DDR3/3L SDRAM memory controllers with ECC and interleaving
support
Memory prefetch engine (PMan)
Data Path Acceleration Architecture (DPAA) incorporating acceleration for
the following functions:
Packet parsing, classification, and distribution (Frame Manager 1.1) Queue management for scheduling, packet sequencing, and congestion
management (Queue Manager 1.1)
Hardware buffer management for buffer allocation and de-allocation
(BMan 1.1)
Cryptography acceleration (SEC 5.0) at up to 40 Gbps
RegEx Pattern Matching Acceleration (PME 2.1) at up to 10 Gbps Decompression/Compression Acceleration (DCE 1.0) at up to 20 Gbps DPAA chip-to-chip interconnect via RapidIO Message Manager (RMAN 1.0)
32 SerDes lanes at up to 10.3125 GHz
Ethernet interfaces
Up to four 10 Gbps Ethernet MACs
Up to sixteen 1 Gbps Ethernet MACs
Maximum configuration of 4 x 10 GE + 8 x 1 GE
High-speed peripheral interfaces
Four PCI Express 2.0/3.0 controllers
Two Serial RapidIO 2.0 controllers/ports running at up to 5 GHz with
Type 11 messaging and Type 9 data streaming support
Interlaken look-aside interface for serial TCAM connection
Additional peripheral interfaces
Two serial ATA (SATA 2.0) controllers
Two high-speed USB 2.0 controllers with integrated PHY Enhanced secure digital host controller (SD/MMC/eMMC) Enhanced serial peripheral interface (eSPI)
Four I2C controllers
Four 2-pin or two 4-pin UARTs
Integrated Flash controller supporting NAND and NOR flash
Two eight-channel DMA engines
Support for hardware virtualization and partitioning enforcement QorIQ Platform's Trust Architecture 1.1
--- arch/powerpc/cpu/mpc85xx/Makefile | 3 + arch/powerpc/cpu/mpc85xx/t4240_ids.c | 203 ++++++++++++++++++++++++ arch/powerpc/cpu/mpc85xx/t4240_serdes.c | 237 +++++++++++++++++++++++++++++ arch/powerpc/cpu/mpc8xxx/cpu.c | 2 + arch/powerpc/cpu/mpc8xxx/srio.c | 21 ++- arch/powerpc/include/asm/config_mpc85xx.h | 28 ++++ arch/powerpc/include/asm/immap_85xx.h | 88 ++++++++++- arch/powerpc/include/asm/processor.h | 2 + drivers/net/fm/Makefile | 1 + drivers/net/fm/init.c | 18 +++ drivers/net/fm/t4240.c | 128 ++++++++++++++++ drivers/pci/fsl_pci_init.c | 25 ++- include/fm_eth.h | 8 + 13 files changed, 752 insertions(+), 12 deletions(-) create mode 100644 arch/powerpc/cpu/mpc85xx/t4240_ids.c create mode 100644 arch/powerpc/cpu/mpc85xx/t4240_serdes.c create mode 100644 drivers/net/fm/t4240.c
arch/powerpc/cpu/mpc85xx/Makefile +3 -0
@@ -67,6 +67,7 @@ COBJS-$(CONFIG_PPC_P3041) += ddr-gen3.o COBJS-$(CONFIG_PPC_P4080) += ddr-gen3.o COBJS-$(CONFIG_PPC_P5020) += ddr-gen3.o COBJS-$(CONFIG_BSC9131) += ddr-gen3.o +COBJS-$(CONFIG_PPC_T4240) += ddr-gen3.o COBJS-$(CONFIG_CPM2) += ether_fcc.o COBJS-$(CONFIG_OF_LIBFDT) += fdt.o
@@ -80,6 +81,7 @@ COBJS-$(CONFIG_PPC_P2041) += p2041_ids.o COBJS-$(CONFIG_PPC_P3041) += p3041_ids.o COBJS-$(CONFIG_PPC_P4080) += p4080_ids.o COBJS-$(CONFIG_PPC_P5020) += p5020_ids.o +COBJS-$(CONFIG_PPC_T4240) += t4240_ids.o COBJS-$(CONFIG_QE) += qe_io.o COBJS-$(CONFIG_CPM2) += serial_scc.o
@@ -111,6 +113,7 @@ COBJS-$(CONFIG_PPC_P2041) += p2041_serdes.o COBJS-$(CONFIG_PPC_P3041) += p3041_serdes.o COBJS-$(CONFIG_PPC_P4080) += p4080_serdes.o COBJS-$(CONFIG_PPC_P5020) += p5020_serdes.o +COBJS-$(CONFIG_PPC_T4240) += t4240_serdes.o COBJS = $(COBJS-y) COBJS += cpu.o
arch/powerpc/cpu/mpc85xx/t4240_ids.c new file +203 -0
203 lines not on this page · raw message
arch/powerpc/cpu/mpc85xx/t4240_serdes.c new file +237 -0
237 lines not on this page · raw message
arch/powerpc/cpu/mpc8xxx/cpu.c +2 -0
@@ -75,6 +75,8 @@ struct cpu_type cpu_type_list [] = { CPU_TYPE_ENTRY(P5020, P5020, 2), CPU_TYPE_ENTRY(BSC9130, 9130, 1), CPU_TYPE_ENTRY(BSC9131, 9131, 1), + CPU_TYPE_ENTRY(T4240, T4240, 0), + CPU_TYPE_ENTRY(T4120, T4120, 0), #elif defined(CONFIG_MPC86xx)CPU_TYPE_ENTRY (8610 ,8610 ,1 ), CPU_TYPE_ENTRY(8641, 8641, 2),
arch/powerpc/cpu/mpc8xxx/srio.c +16 -5
@@ -33,8 +33,13 @@#define SRIO_LCSBA1CSR 0x60000000#if defined(CONFIG_FSL_CORENET ) +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +#define _DEVDISR_SRIO1 FSL_CORENET_DEVDISR3_SRIO1 +#define _DEVDISR_SRIO2 FSL_CORENET_DEVDISR3_SRIO2 +#else #define _DEVDISR_SRIO1 FSL_CORENET_DEVDISR_SRIO1#define _DEVDISR_SRIO2 FSL_CORENET_DEVDISR_SRIO2 +#endif #define _DEVDISR_RMU FSL_CORENET_DEVDISR_RMU#define CONFIG_SYS_MPC8xxx_GUTS_ADDR CONFIG_SYS_MPC85xx_GUTS_ADDR#elif defined(CONFIG_MPC85xx)
@@ -56,7 +61,13 @@ void srio_init(void) {ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC8xxx_GUTS_ADDR;int srio1_used =0 , srio2_used =0 ; +u32 *devdisr; +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 + devdisr = &gur->devdisr3; +#else + devdisr = &gur->devdisr; +#endif if (is_serdes_configured (SRIO1 )) { set_next_law(CONFIG_SYS_SRIO1_MEM_PHYS, law_size_bits(CONFIG_SYS_SRIO1_MEM_SIZE),
@@ -82,16 +93,16 @@ void srio_init(void)#ifdef CONFIG_FSL_CORENET /* On FSL_CORENET devices we can disable individual ports */ if (!srio1_used) -setbits_be32 (&gur->devdisr,FSL_CORENET_DEVDISR_SRIO1 ); +setbits_be32 (devdisr, _DEVDISR_SRIO1);if (!srio2_used) -setbits_be32 (&gur->devdisr,FSL_CORENET_DEVDISR_SRIO2 ); +setbits_be32 (devdisr, _DEVDISR_SRIO2);#endif /* neither port is used - disable everything */ if (!srio1_used && !srio2_used) { -setbits_be32 (&gur->devdisr, _DEVDISR_SRIO1); -setbits_be32 (&gur->devdisr, _DEVDISR_SRIO2); -setbits_be32 (&gur->devdisr, _DEVDISR_RMU); +setbits_be32 (devdisr, _DEVDISR_SRIO1); +setbits_be32 (devdisr, _DEVDISR_SRIO2); +setbits_be32 (devdisr, _DEVDISR_RMU); } }
arch/powerpc/include/asm/config_mpc85xx.h +28 -0
@@ -449,6 +449,34 @@#define CONFIG_SYS_FSL_ERRATUM_IFC_A003399 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111 +#elif defined(CONFIG_PPC_T4240 ) +#define CONFIG_FSL_CORENET /* Freescale CoreNet platform */ +#define CONFIG_SYS_FSL_QORIQ_CHASSIS2 /* Freescale Chassis generation 2 */ +#define CONFIG_SYS_FSL_QMAN_V3 /* QMAN version 3 */ +#define CONFIG_MAX_CPUS 12 +#define CONFIG_SYS_FSL_NUM_CC_PLLS 5 +#define CONFIG_SYS_FSL_NUM_LAWS 32 +#define CONFIG_SYS_FSL_SRDS_3 +#define CONFIG_SYS_FSL_SRDS_4 +#define CONFIG_SYS_FSL_SEC_COMPAT 4 +#define CONFIG_SYS_NUM_FMAN 2 +#define CONFIG_SYS_NUM_FM1_DTSEC 8 +#define CONFIG_SYS_NUM_FM1_10GEC 2 +#define CONFIG_SYS_NUM_FM2_DTSEC 8 +#define CONFIG_SYS_NUM_FM2_10GEC 2 +#define CONFIG_NUM_DDR_CONTROLLERS 3 +#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_4_7 +#define CONFIG_SYS_FM_MURAM_SIZE 0x60000 +#define CONFIG_SYS_FSL_TBCLK_DIV 16 +#define CONFIG_SYS_FSL_PCIE_COMPAT "fsl,qoriq-pcie-v3.0" +#define CONFIG_SYS_FSL_SRIO_MAX_PORTS 2 +#define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9 +#define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5 +#define CONFIG_SYS_FSL_USB1_PHY_ENABLE +#define CONFIG_SYS_FSL_USB2_PHY_ENABLE +#define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY +#define CONFIG_SYS_CCSRBAR_DEFAULT 0xfe000000 +#else #error Processor type not defined for this platform#endif
arch/powerpc/include/asm/immap_85xx.h +86 -2
135 lines not on this page · raw message
arch/powerpc/include/asm/processor.h +2 -0
@@ -1095,6 +1095,8 @@#define SVR_P4080 0x820000#define SVR_P5010 0x822100#define SVR_P5020 0x822000 +#define SVR_T4240 0x824000 +#define SVR_T4120 0x824001#define SVR_8610 0x80A000#define SVR_8641 0x809000
drivers/net/fm/Makefile +1 -0
@@ -40,6 +40,7 @@ COBJS-$(CONFIG_PPC_P2041) += p5020.o COBJS-$(CONFIG_PPC_P3041) += p5020.o COBJS-$(CONFIG_PPC_P4080) += p4080.o COBJS-$(CONFIG_PPC_P5020) += p5020.o +COBJS-$(CONFIG_PPC_T4240) += t4240.o endif COBJS := $(COBJS-y)
drivers/net/fm/init.c +18 -0
@@ -38,6 +38,15 @@ struct fm_eth_info fm_info[] = {#if (CONFIG_SYS_NUM_FM1_DTSEC >=5 ) FM_DTSEC_INFO_INITIALIZER(1, 5),#endif +#if (CONFIG_SYS_NUM_FM1_DTSEC >=6 ) + FM_DTSEC_INFO_INITIALIZER(1, 6), +#endif +#if (CONFIG_SYS_NUM_FM1_DTSEC >=7 ) + FM_DTSEC_INFO_INITIALIZER(1, 9), +#endif +#if (CONFIG_SYS_NUM_FM1_DTSEC >=8 ) + FM_DTSEC_INFO_INITIALIZER(1, 10), +#endif #if (CONFIG_SYS_NUM_FM2_DTSEC >=1 ) FM_DTSEC_INFO_INITIALIZER(2, 1),#endif
@@ -53,6 +62,15 @@ struct fm_eth_info fm_info[] = {#if (CONFIG_SYS_NUM_FM2_DTSEC >=5 ) FM_DTSEC_INFO_INITIALIZER(2, 5),#endif +#if (CONFIG_SYS_NUM_FM2_DTSEC >=6 ) + FM_DTSEC_INFO_INITIALIZER(2, 6), +#endif +#if (CONFIG_SYS_NUM_FM2_DTSEC >=7 ) + FM_DTSEC_INFO_INITIALIZER(2, 9), +#endif +#if (CONFIG_SYS_NUM_FM2_DTSEC >=8 ) + FM_DTSEC_INFO_INITIALIZER(2, 10), +#endif #if (CONFIG_SYS_NUM_FM1_10GEC >=1 ) FM_TGEC_INFO_INITIALIZER(1, 1),#endif
drivers/net/fm/t4240.c new file +128 -0
128 lines not on this page · raw message
drivers/pci/fsl_pci_init.c +20 -5
@@ -664,10 +664,17 @@ int fsl_configure_pcie(struct fsl_pci_info *info, }#if defined(CONFIG_FSL_CORENET ) +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 +#define _DEVDISR_PCIE1 FSL_CORENET_DEVDISR3_PCIE1 +#define _DEVDISR_PCIE2 FSL_CORENET_DEVDISR3_PCIE2 +#define _DEVDISR_PCIE3 FSL_CORENET_DEVDISR3_PCIE3 +#define _DEVDISR_PCIE4 FSL_CORENET_DEVDISR3_PCIE4 +#else #define _DEVDISR_PCIE1 FSL_CORENET_DEVDISR_PCIE1#define _DEVDISR_PCIE2 FSL_CORENET_DEVDISR_PCIE2#define _DEVDISR_PCIE3 FSL_CORENET_DEVDISR_PCIE3#define _DEVDISR_PCIE4 FSL_CORENET_DEVDISR_PCIE4 +#endif #define CONFIG_SYS_MPC8xxx_GUTS_ADDR CONFIG_SYS_MPC85xx_GUTS_ADDR#elif defined(CONFIG_MPC85xx)#define _DEVDISR_PCIE1 MPC85xx_DEVDISR_PCIE
@@ -747,34 +754,42 @@ int fsl_pcie_init_board(int busno) {struct fsl_pci_info pci_info;ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC8xxx_GUTS_ADDR; -u32 devdisr =in_be32 (&gur->devdisr); +u32 devdisr; +u32 *addr; + +#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 + addr = &gur->devdisr3; +#else + addr = &gur->devdisr; +#endif + devdisr =in_be32 (addr);#ifdef CONFIG_PCIE1 SET_STD_PCIE_INFO (pci_info,1 ); busno =fsl_pcie_init_ctrl (busno, devdisr,PCIE1 , &pci_info);#else -setbits_be32 (&gur->devdisr, _DEVDISR_PCIE1);/* disable */ +setbits_be32 (addr, _DEVDISR_PCIE1);/* disable */ #endif #ifdef CONFIG_PCIE2 SET_STD_PCIE_INFO (pci_info,2 ); busno =fsl_pcie_init_ctrl (busno, devdisr,PCIE2 , &pci_info);#else -setbits_be32 (&gur->devdisr, _DEVDISR_PCIE2);/* disable */ +setbits_be32 (addr, _DEVDISR_PCIE2);/* disable */ #endif #ifdef CONFIG_PCIE3 SET_STD_PCIE_INFO (pci_info,3 ); busno =fsl_pcie_init_ctrl (busno, devdisr,PCIE3 , &pci_info);#else -setbits_be32 (&gur->devdisr, _DEVDISR_PCIE3);/* disable */ +setbits_be32 (addr, _DEVDISR_PCIE3);/* disable */ #endif #ifdef CONFIG_PCIE4 SET_STD_PCIE_INFO (pci_info,4 ); busno =fsl_pcie_init_ctrl (busno, devdisr,PCIE4 , &pci_info);#else -setbits_be32 (&gur->devdisr, _DEVDISR_PCIE4);/* disable */ +setbits_be32 (addr, _DEVDISR_PCIE4);/* disable */ #endif return busno;
include/fm_eth.h +8 -0
@@ -30,13 +30,21 @@ enum fm_port {FM1_DTSEC3 ,FM1_DTSEC4 ,FM1_DTSEC5 , +FM1_DTSEC6 , +FM1_DTSEC9 , +FM1_DTSEC10 ,FM1_10GEC1 , +FM1_10GEC2 ,FM2_DTSEC1 ,FM2_DTSEC2 ,FM2_DTSEC3 ,FM2_DTSEC4 ,FM2_DTSEC5 , +FM2_DTSEC6 , +FM2_DTSEC9 , +FM2_DTSEC10 ,FM2_10GEC1 , +FM2_10GEC2 , NUM_FM_PORTS, };
Signature · 1 line
1.7.9.5
PATCH 17/28 powerpc/mpc85xx: Add B4860 and variant SoCs
In reply to York SunAdd support for Freescale B4860 and variant SoCs. Features of B4860 are (incomplete list):
Six fully-programmable StarCore SC3900 FVP subsystems, divided into three
clusters-each core runs up to 1.2 GHz, with an architecture highly optimized for wireless base station applications
Four dual-thread e6500 Power Architecture processors organized in one
cluster-each core runs up to 1.8 GHz
Two DDR3/3L controllers for high-speed, industry-standard memory interface
each runs at up to 1866.67 MHz
MAPLE-B3 hardware acceleration-for forward error correction schemes
including Turbo or Viterbi decoding, Turbo encoding and rate matching, MIMO MMSE equalization scheme, matrix operations, CRC insertion and check, DFT/iDFT and FFT/iFFT calculations, PUSCH/PDSCH acceleration, and UMTS chip rate acceleration
CoreNet fabric that fully supports coherency using MESI protocol between
the e6500 cores, SC3900 FVP cores, memories and external interfaces. CoreNet fabric interconnect runs at 667 MHz and supports coherent and non-coherent out of order transactions with prioritization and bandwidth allocation amongst CoreNet endpoints.
Data Path Acceleration Architecture, which includes the following:
Frame Manager (FMan), which supports in-line packet parsing and general
classification to enable policing and QoS-based packet distribution
Queue Manager (QMan) and Buffer Manager (BMan), which allow offloading
of queue management, task management, load distribution, flow ordering, buffer management, and allocation tasks from the cores
Security engine (SEC 5.3)-crypto-acceleration for protocols such as
IPsec, SSL, and 802.16
RapidIO manager (RMAN) - Support SRIO types 8, 9, 10, and 11 (inbound and
outbound). Supports types 5, 6 (outbound only)
Large internal cache memory with snooping and stashing capabilities for
bandwidth saving and high utilization of processor elements. The 9856-Kbyte internal memory space includes the following:
32 Kbyte L1 ICache per e6500/SC3900 core
32 Kbyte L1 DCache per e6500/SC3900 core
2048 Kbyte unified L2 cache for each SC3900 FVP cluster
2048 Kbyte unified L2 cache for the e6500 cluster
Two 512 Kbyte shared L3 CoreNet platform caches (CPC)
Sixteen 10-GHz SerDes lanes serving:
Two Serial RapidIO interfaces. Each supports up to 4 lanes and a total
of up to 8 lanes
Up to 8-lanes Common Public Radio Interface (CPRI) controller for glue-
less antenna connection
Two 10-Gbit Ethernet controllers (10GEC)
Six 1G/2.5-Gbit Ethernet controllers for network communications PCI Express controller
Debug (Aurora)
Two OCeaN DMAs
Various system peripherals
182 32-bit timers
--- arch/powerpc/cpu/mpc85xx/Makefile | 3 + arch/powerpc/cpu/mpc85xx/b4860_ids.c | 141 +++++++++++++++++++++++++ arch/powerpc/cpu/mpc85xx/b4860_serdes.c | 162 +++++++++++++++++++++++++++++ arch/powerpc/cpu/mpc8xxx/cpu.c | 7 ++ arch/powerpc/include/asm/config_mpc85xx.h | 23 ++++ arch/powerpc/include/asm/immap_85xx.h | 10 ++ arch/powerpc/include/asm/processor.h | 7 ++ drivers/net/fm/Makefile | 1 + drivers/net/fm/b4860.c | 79 ++++++++++++++ 9 files changed, 433 insertions(+) create mode 100644 arch/powerpc/cpu/mpc85xx/b4860_ids.c create mode 100644 arch/powerpc/cpu/mpc85xx/b4860_serdes.c create mode 100644 drivers/net/fm/b4860.c
arch/powerpc/cpu/mpc85xx/Makefile +3 -0
@@ -68,6 +68,7 @@ COBJS-$(CONFIG_PPC_P4080) += ddr-gen3.o COBJS-$(CONFIG_PPC_P5020) += ddr-gen3.o COBJS-$(CONFIG_BSC9131) += ddr-gen3.o COBJS-$(CONFIG_PPC_T4240) += ddr-gen3.o +COBJS-$(CONFIG_PPC_B4860) += ddr-gen3.o COBJS-$(CONFIG_CPM2) += ether_fcc.o COBJS-$(CONFIG_OF_LIBFDT) += fdt.o
@@ -82,6 +83,7 @@ COBJS-$(CONFIG_PPC_P3041) += p3041_ids.o COBJS-$(CONFIG_PPC_P4080) += p4080_ids.o COBJS-$(CONFIG_PPC_P5020) += p5020_ids.o COBJS-$(CONFIG_PPC_T4240) += t4240_ids.o +COBJS-$(CONFIG_PPC_B4860) += b4860_ids.o COBJS-$(CONFIG_QE) += qe_io.o COBJS-$(CONFIG_CPM2) += serial_scc.o
@@ -114,6 +116,7 @@ COBJS-$(CONFIG_PPC_P3041) += p3041_serdes.o COBJS-$(CONFIG_PPC_P4080) += p4080_serdes.o COBJS-$(CONFIG_PPC_P5020) += p5020_serdes.o COBJS-$(CONFIG_PPC_T4240) += t4240_serdes.o +COBJS-$(CONFIG_PPC_B4860) += b4860_serdes.o COBJS = $(COBJS-y) COBJS += cpu.o
arch/powerpc/cpu/mpc85xx/b4860_ids.c new file +141 -0
141 lines not on this page · raw message
arch/powerpc/cpu/mpc85xx/b4860_serdes.c new file +162 -0
162 lines not on this page · raw message
arch/powerpc/cpu/mpc8xxx/cpu.c +7 -0
@@ -77,6 +77,13 @@ struct cpu_type cpu_type_list [] = { CPU_TYPE_ENTRY(BSC9131, 9131, 1), CPU_TYPE_ENTRY(T4240, T4240, 0), CPU_TYPE_ENTRY(T4120, T4120, 0), + CPU_TYPE_ENTRY(B4860, B4860, 0), + CPU_TYPE_ENTRY(G4860, G4860, 0), + CPU_TYPE_ENTRY(G4060, G4060, 0), + CPU_TYPE_ENTRY(B4440, B4440, 0), + CPU_TYPE_ENTRY(G4440, G4440, 0), + CPU_TYPE_ENTRY(B4420, B4420, 0), + CPU_TYPE_ENTRY(B4220, B4220, 0), #elif defined(CONFIG_MPC86xx)CPU_TYPE_ENTRY (8610 ,8610 ,1 ), CPU_TYPE_ENTRY(8641, 8641, 2),
arch/powerpc/include/asm/config_mpc85xx.h +23 -0
@@ -477,6 +477,29 @@#define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY #define CONFIG_SYS_CCSRBAR_DEFAULT 0xfe000000 +#elif defined(CONFIG_PPC_B4860 ) +#define CONFIG_FSL_CORENET /* Freescale CoreNet platform */ +#define CONFIG_SYS_FSL_QORIQ_CHASSIS2 /* Freescale Chassis generation 2 */ +#define CONFIG_SYS_FSL_QMAN_V3 /* QMAN version 3 */ +#define CONFIG_MAX_CPUS 4 +#define CONFIG_SYS_FSL_NUM_CC_PLLS 4 +#define CONFIG_SYS_FSL_NUM_LAWS 32 +#define CONFIG_SYS_FSL_SEC_COMPAT 4 +#define CONFIG_SYS_NUM_FMAN 1 +#define CONFIG_SYS_NUM_FM1_DTSEC 6 +#define CONFIG_SYS_NUM_FM1_10GEC 2 +#define CONFIG_NUM_DDR_CONTROLLERS 1 +#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_4_7 +#define CONFIG_SYS_FM_MURAM_SIZE 0x60000 +#define CONFIG_SYS_FSL_TBCLK_DIV 16 +#define CONFIG_SYS_FSL_PCIE_COMPAT "fsl,qoriq-pcie-v2.4" +#define CONFIG_SYS_FSL_SRIO_MAX_PORTS 2 +#define CONFIG_SYS_FSL_SRIO_OB_WIN_NUM 9 +#define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5 +#define CONFIG_SYS_FSL_USB1_PHY_ENABLE +#define CONFIG_SYS_FSL_ERRATUM_A_004934 +#define CONFIG_SYS_CCSRBAR_DEFAULT 0xfe000000 +#else #error Processor type not defined for this platform#endif
arch/powerpc/include/asm/immap_85xx.h +10 -0
@@ -1727,6 +1727,7 @@ typedef struct ccsr_gur {#define FSL_CORENET_DEVDISR2_10GEC2_2 0x00000400#define FSL_CORENET_DEVDISR2_FM1 0x00000080#define FSL_CORENET_DEVDISR2_FM2 0x00000040 +#define FSL_CORENET_DEVDISR2_CPRI 0x00000008#define FSL_CORENET_DEVDISR3_PCIE1 0x80000000#define FSL_CORENET_DEVDISR3_PCIE2 0x40000000#define FSL_CORENET_DEVDISR3_PCIE3 0x20000000
@@ -1736,6 +1737,9 @@ typedef struct ccsr_gur {#define FSL_CORENET_DEVDISR3_QMAN 0x00080000#define FSL_CORENET_DEVDISR3_BMAN 0x00040000#define FSL_CORENET_DEVDISR3_LA1 0x00008000 +#define FSL_CORENET_DEVDISR3_MAPLE1 0x00000800 +#define FSL_CORENET_DEVDISR3_MAPLE2 0x00000400 +#define FSL_CORENET_DEVDISR3_MAPLE3 0x00000200#define FSL_CORENET_DEVDISR4_I2C1 0x80000000#define FSL_CORENET_DEVDISR4_I2C2 0x40000000#define FSL_CORENET_DEVDISR4_DUART1 0x20000000
@@ -1751,6 +1755,7 @@ typedef struct ccsr_gur {#define FSL_CORENET_DEVDISR5_GPIO 0x00400000#define FSL_CORENET_DEVDISR5_DBG 0x00200000#define FSL_CORENET_DEVDISR5_NAL 0x00100000 +#define FSL_CORENET_DEVDISR5_TIMERS 0x00020000#define FSL_CORENET_NUM_DEVDISR 5#else #define FSL_CORENET_DEVDISR_PCIE1 0x80000000
@@ -1833,6 +1838,11 @@ typedef struct ccsr_gur {#define FSL_CORENET2_RCWSR4_SRDS3_PRTCL_SHIFT 11#define FSL_CORENET2_RCWSR4_SRDS4_PRTCL 0x000000f8#define FSL_CORENET2_RCWSR4_SRDS4_PRTCL_SHIFT 3 +#elif defined(CONFIG_PPC_B4860 ) +#define FSL_CORENET2_RCWSR4_SRDS1_PRTCL 0xfe000000 +#define FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT 25 +#define FSL_CORENET2_RCWSR4_SRDS2_PRTCL 0x00ff0000 +#define FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT 16#endif #define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S1_PLL1 0x00800000#define FSL_CORENET2_RCWSR5_SRDS_PLL_PD_S1_PLL2 0x00400000
arch/powerpc/include/asm/processor.h +7 -0
@@ -1097,6 +1097,13 @@#define SVR_P5020 0x822000#define SVR_T4240 0x824000#define SVR_T4120 0x824001 +#define SVR_B4860 0X868000 +#define SVR_G4860 0x868001 +#define SVR_G4060 0x868003 +#define SVR_B4440 0x868100 +#define SVR_G4440 0x868101 +#define SVR_B4420 0x868102 +#define SVR_B4220 0x868103#define SVR_8610 0x80A000#define SVR_8641 0x809000
drivers/net/fm/Makefile +1 -0
@@ -41,6 +41,7 @@ COBJS-$(CONFIG_PPC_P3041) += p5020.o COBJS-$(CONFIG_PPC_P4080) += p4080.o COBJS-$(CONFIG_PPC_P5020) += p5020.o COBJS-$(CONFIG_PPC_T4240) += t4240.o +COBJS-$(CONFIG_PPC_B4860) += b4860.o endif COBJS := $(COBJS-y)
drivers/net/fm/b4860.c new file +79 -0
79 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH 18/28 fm/mEMAC: add mEMAC frame work
In reply to York SunFrom: Roy Zang <[email protected]>
The multirate ethernet media access controller (mEMAC) interfaces to 10Gbps and below Ethernet/IEEE 802.3 networks via either RGMII/RMII interfaces or XAUI/XFI/SGMII/QSGMII using the high-speed SerDes interface.
--- arch/powerpc/include/asm/config_mpc85xx.h | 2 + arch/powerpc/include/asm/fsl_fman.h | 17 ++ arch/powerpc/include/asm/fsl_memac.h | 271 +++++++++++++++++++++++++++++ drivers/net/fm/Makefile | 4 + drivers/net/fm/eth.c | 39 ++++- drivers/net/fm/memac.c | 132 ++++++++++++++ drivers/net/fm/memac_phy.c | 150 ++++++++++++++++ include/fm_eth.h | 45 ++++- include/fsl_mdio.h | 6 +- 9 files changed, 661 insertions(+), 5 deletions(-) create mode 100644 arch/powerpc/include/asm/fsl_memac.h create mode 100644 drivers/net/fm/memac.c create mode 100644 drivers/net/fm/memac_phy.c
arch/powerpc/include/asm/config_mpc85xx.h +2 -0
@@ -466,6 +466,7 @@#define CONFIG_SYS_NUM_FM2_10GEC 2#define CONFIG_NUM_DDR_CONTROLLERS 3#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_4_7 +#define CONFIG_SYS_FMAN_V3 #define CONFIG_SYS_FM_MURAM_SIZE 0x60000#define CONFIG_SYS_FSL_TBCLK_DIV 16#define CONFIG_SYS_FSL_PCIE_COMPAT "fsl,qoriq-pcie-v3.0"
@@ -490,6 +491,7 @@#define CONFIG_SYS_NUM_FM1_10GEC 2#define CONFIG_NUM_DDR_CONTROLLERS 1#define CONFIG_SYS_FSL_DDR_VER FSL_DDR_VER_4_7 +#define CONFIG_SYS_FMAN_V3 #define CONFIG_SYS_FM_MURAM_SIZE 0x60000#define CONFIG_SYS_FSL_TBCLK_DIV 16#define CONFIG_SYS_FSL_PCIE_COMPAT "fsl,qoriq-pcie-v2.4"
arch/powerpc/include/asm/fsl_fman.h +17 -0
@@ -423,6 +423,14 @@ typedef struct fm_10gec_mdio {u8 res[4 *1024 ]; } fm_10gec_mdio_t; +typedef struct fm_memac { +u8 res[4 *1024 ]; +}fm_memac_t ; + +typedef struct fm_memac_mdio { +u8 res[4 *1024 ]; +}fm_memac_mdio_t ; +typedef struct fm_1588 {u8 res[4 *1024 ]; }fm_1588_t ;
@@ -446,6 +454,14 @@ typedef struct ccsr_fman {u8 res1[8 *1024 ];fm_soft_parser_t fm_soft_parser;u8 res2[96 *1024 ]; +#ifdef CONFIG_SYS_FMAN_V3 + struct { + fm_memac_t fm_memac; + fm_memac_mdio_t fm_memac_mdio; + } memac[10]; + u8 res4[32*1024]; + fm_memac_mdio_t fm_dedicated_mdio[2]; +#else struct { fm_dtsec_t fm_dtesc; fm_mdio_t fm_mdio;
@@ -455,6 +471,7 @@ typedef struct ccsr_fman { fm_10gec_mdio_t fm_10gec_mdio; } mac_10g[1 ];u8 res4[48 *1024 ]; +#endif fm_1588_t fm_1588;u8 res5[4 *1024 ]; } ccsr_fman_t;
arch/powerpc/include/asm/fsl_memac.h new file +271 -0
271 lines not on this page · raw message
drivers/net/fm/Makefile +4 -0
@@ -32,6 +32,10 @@ COBJS-y += init.o COBJS-y += tgec.o COBJS-y += tgec_phy.o +# Soc have FMAN v3 with mEMAC +COBJS-$(CONFIG_SYS_FMAN_V3) += memac_phy.o +COBJS-$(CONFIG_SYS_FMAN_V3) += memac.o + # SoC specific SERDES support COBJS-$(CONFIG_P1017) += p1023.o COBJS-$(CONFIG_P1023) += p1023.o
drivers/net/fm/eth.c +37 -2
@@ -1,5 +1,5 @@/* -* Copyright 2009-2011 Freescale Semiconductor, Inc. +* Copyright 2009-2012 Freescale Semiconductor, Inc. * Dave Liu <[email protected]> * * This program is free software; you can redistribute it and/or
@@ -28,6 +28,7 @@#include <phy.h> #include <asm/fsl_dtsec.h> #include <asm/fsl_tgec.h> +#include <asm/fsl_memac.h> #include "fm.h"
@@ -47,6 +48,28 @@ static int num_controllers;/* Configure the TBI for SGMII operation */ void dtsec_configure_serdes (struct fm_eth *priv) { +#ifdef CONFIG_SYS_FMAN_V3 +u32 value; +struct mii_dev bus; + bus.priv = priv->mac->phyregs; + +/* SGMII IF mode + AN enable */ + value =PHY_SGMII_IF_MODE_AN |PHY_SGMII_IF_MODE_SGMII ; +memac_mdio_write (&bus,0 ,MDIO_DEVAD_NONE ,0x14 , value); + +/* Dev ability according to SGMII specification */ + value =PHY_SGMII_DEV_ABILITY_SGMII ; +memac_mdio_write (&bus,0 ,MDIO_DEVAD_NONE ,0x4 , value); + +/* Adjust link timer for SGMII - +1.6 ms in units of 8 ns = 2 * 10^5 = 0x30d40 */ +memac_mdio_write (&bus,0 ,MDIO_DEVAD_NONE ,0x13 ,0x3 ); +memac_mdio_write (&bus,0 ,MDIO_DEVAD_NONE ,0x12 ,0xd40 ); + +/* Restart AN */ + value =PHY_SGMII_CR_DEF_VAL |PHY_SGMII_CR_RESET_AN ; +memac_mdio_write (&bus,0 ,MDIO_DEVAD_NONE ,0 , value); +#else struct dtsec *regs = priv->mac->base;struct tsec_mii_mng *phyregs = priv->mac->phyregs;
@@ -60,15 +83,18 @@ void dtsec_configure_serdes(struct fm_eth *priv) TBIANA_SGMII_ACK);tsec_local_mdio_write (phyregs,in_be32 (®s->tbipa),0 ,TBI_CR ,TBICR_SETTINGS ); +#endif }static void dtsec_init_phy (struct eth_device *dev) {struct fm_eth *fm_eth = dev->priv; -struct dtsec *regs = (struct dtsec *)fm_eth->mac->base; +#ifndef CONFIG_SYS_FMAN_V3 +struct dtsec *regs = (struct dtsec *)fm_eth->mac->base;/* Assign a Physical address to the TBI */ out_be32 (®s->tbipa,CONFIG_SYS_TBIPA_VALUE ); +#endif if (fm_eth->enet_if ==PHY_INTERFACE_MODE_SGMII )dtsec_configure_serdes (fm_eth);
@@ -541,6 +567,10 @@ static int fm_eth_init_mac(struct fm_eth *fm_eth, struct ccsr_fman *reg) num = fm_eth->num; +#ifdef CONFIG_SYS_FMAN_V3 + base = ®->memac[num].fm_memac; + phyregs = ®->memac[num].fm_memac_mdio; +#else /* Get the mac registers base address */ if (fm_eth->type ==FM_ETH_1G_E ) { base = ®->mac_1g[num].fm_dtesc;
@@ -549,6 +579,7 @@ static int fm_eth_init_mac(struct fm_eth *fm_eth, struct ccsr_fman *reg) base = ®->mac_10g[num].fm_10gec; phyregs = ®->mac_10g[num].fm_10gec_mdio; } +#endif /* alloc mac controller */ mac =malloc (sizeof (struct fsl_enet_mac ));
@@ -559,10 +590,14 @@ static int fm_eth_init_mac(struct fm_eth *fm_eth, struct ccsr_fman *reg)/* save the mac to fm_eth struct */ fm_eth->mac = mac; +#ifdef CONFIG_SYS_FMAN_V3 +init_memac (mac, base, phyregs,MAX_RXBUF_LEN ); +#else if (fm_eth->type ==FM_ETH_1G_E )init_dtsec (mac, base, phyregs,MAX_RXBUF_LEN );else init_tgec (mac, base, phyregs,MAX_RXBUF_LEN ); +#endif return 1 ; }
drivers/net/fm/memac.c new file +132 -0
132 lines not on this page · raw message
drivers/net/fm/memac_phy.c new file +150 -0
150 lines not on this page · raw message
include/fm_eth.h +43 -2
76 lines not on this page · raw message
include/fsl_mdio.h +5 -1
@@ -1,5 +1,5 @@/* -* Copyright 2009-2010 Freescale Semiconductor, Inc. +* Copyright 2009-2012 Freescale Semiconductor, Inc. * Jun-jie Zhang <[email protected]> * Mingkai Hu <[email protected]> *
@@ -51,6 +51,10 @@ int tsec_local_mdio_read(struct tsec_mii_mng *phyregs, int port_addr,int tsec_phy_read (struct mii_dev *bus,int addr,int dev_addr,int regnum);int tsec_phy_write (struct mii_dev *bus,int addr,int dev_addr,int regnum,u16 value); +int memac_mdio_write (struct mii_dev *bus,int port_addr,int dev_addr, +int regnum,u16 value); +int memac_mdio_read (struct mii_dev *bus,int port_addr,int dev_addr, +int regnum);struct fsl_pq_mdio_info {struct tsec_mii_mng *regs;
Signature · 1 line
1.7.9.5
PATCH 19/28 powerpc/mpc8xxx: Update DDR registers
In reply to York SunDDRC ver 4.7 adds DDR_SLOW bit in sdram_cfg_2 register. This bit needs to be set for speed lower than 1250MT/s.
CDR1 and CDR2 are control driver registers. ODT termination valueis for IOs are defined. Starting from DDRC 4.7, the decoding of ODT for IOs is
000 -> Termsel off 001 -> 120 Ohm 010 -> 180 Ohm 011 -> 75 Ohm 100 -> 110 Ohm 101 -> 60 Ohm 110 -> 70 Ohm 111 -> 47 Ohm
Add two write leveling registers. Each QDS now has its own write leveling start value. In case of zero value, the value of QDS0 will be used. These values are board-specific and are set in board files.
Extend DDR register timing_cfg_1 to have 4 bits for each field.
DDR control driver registers and write leveling registers are added to interactive debugging for easy access.
--- arch/powerpc/cpu/mpc85xx/ddr-gen3.c | 5 +++++ arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c | 22 ++++++++++++++++++-- arch/powerpc/cpu/mpc8xxx/ddr/interactive.c | 12 ++++++++++- arch/powerpc/include/asm/config_mpc85xx.h | 2 ++ arch/powerpc/include/asm/fsl_ddr_sdram.h | 30 ++++++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 3 deletions(-)
arch/powerpc/cpu/mpc85xx/ddr-gen3.c +5 -0
@@ -121,6 +121,11 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,out_be32 (&ddr->timing_cfg_5, regs->timing_cfg_5);out_be32 (&ddr->ddr_zq_cntl, regs->ddr_zq_cntl);out_be32 (&ddr->ddr_wrlvl_cntl, regs->ddr_wrlvl_cntl); +if (regs->ddr_wrlvl_cntl_2) +out_be32 (&ddr->ddr_wrlvl_cntl_2, regs->ddr_wrlvl_cntl_2); +if (regs->ddr_wrlvl_cntl_3) +out_be32 (&ddr->ddr_wrlvl_cntl_3, regs->ddr_wrlvl_cntl_3); +out_be32 (&ddr->ddr_sr_cntr, regs->ddr_sr_cntr);out_be32 (&ddr->ddr_sdram_rcw_1, regs->ddr_sdram_rcw_1);out_be32 (&ddr->ddr_sdram_rcw_2, regs->ddr_sdram_rcw_2);
arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c +20 -2
@@ -451,8 +451,8 @@ static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr, | ((caslat_ctrl & 0xF) << 16) | ((refrec_ctrl &0xF ) <<12 ) | ((wrrec_mclk &0x0F ) <<8 ) - | ((acttoact_mclk &0x07 ) <<4 ) - | ((wrtord_mclk &0x07 ) <<0 ) + | ((acttoact_mclk &0x0F ) <<4 ) + | ((wrtord_mclk &0x0F ) <<0 ) );debug ("FSLDDR: timing_cfg_1 = 0x%08x\n" , ddr->timing_cfg_1); }
@@ -659,6 +659,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,unsigned int dqs_cfg;/* DQS configuration */ unsigned int odt_cfg =0 ;/* ODT configuration */ unsigned int num_pr;/* Number of posted refreshes */ +unsigned int slow =0 ;/* DDR will be run less than 1250 */ unsigned int obc_cfg;/* On-The-Fly Burst Chop Cfg */ unsigned int ap_en;/* Address Parity Enable */ unsigned int d_init;/* DRAM data initialization */
@@ -692,6 +693,10 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr, obc_cfg =0 ;#endif +#if (CONFIG_SYS_FSL_DDR_VER >=FSL_DDR_VER_4_7 ) + slow =get_ddr_freq (0 ) <1249000000 ; +#endif +if (popts->registered_dimm_en) { rcw_en =1 ; ap_en = popts->ap_en;
@@ -720,6 +725,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr, | ((dqs_cfg & 0x3) << 26) | ((odt_cfg &0x3 ) <<21 ) | ((num_pr &0xf ) <<12 ) + | ((slow &1 ) <<11 ) | (qd_en <<9 ) | (unq_mrs_en <<8 ) | ((obc_cfg &0x1 ) <<6 )
@@ -1347,6 +1353,11 @@ static void set_ddr_wrlvl_cntl(fsl_ddr_cfg_regs_t *ddr, unsigned int wrlvl_en, | ((wrlvl_start & 0x1F) << 0) );debug ("FSLDDR: wrlvl_cntl = 0x%08x\n" , ddr->ddr_wrlvl_cntl); + ddr->ddr_wrlvl_cntl_2 = popts->wrlvl_ctl_2; +debug ("FSLDDR: wrlvl_cntl_2 = 0x%08x\n" , ddr->ddr_wrlvl_cntl_2); + ddr->ddr_wrlvl_cntl_3 = popts->wrlvl_ctl_3; +debug ("FSLDDR: wrlvl_cntl_3 = 0x%08x\n" , ddr->ddr_wrlvl_cntl_3); + }/* DDR Self Refresh Counter (DDR_SR_CNTR) */
@@ -1370,6 +1381,12 @@ static void set_ddr_cdr1(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts)debug ("FSLDDR: ddr_cdr1 = 0x%08x\n" , ddr->ddr_cdr1); } +static void set_ddr_cdr2 (fsl_ddr_cfg_regs_t *ddr,const memctl_options_t *popts) +{ + ddr->ddr_cdr2 = popts->ddr_cdr2; +debug ("FSLDDR: ddr_cdr2 = 0x%08x\n" , ddr->ddr_cdr2); +} +unsigned int check_fsl_memctl_config_regs (const fsl_ddr_cfg_regs_t *ddr) {
@@ -1569,6 +1586,7 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts, cas_latency, additive_latency);set_ddr_cdr1 (ddr, popts); +set_ddr_cdr2 (ddr, popts);set_ddr_sdram_cfg (ddr, popts, common_dimm); ip_rev =fsl_ddr_get_version ();if (ip_rev >0x40400 )
arch/powerpc/cpu/mpc8xxx/ddr/interactive.c +11 -1
@@ -452,6 +452,8 @@ static void fsl_ddr_options_edit(fsl_ddr_info_t *pinfo,CTRL_OPTIONS (rcw_override),CTRL_OPTIONS (rcw_1),CTRL_OPTIONS (rcw_2), +CTRL_OPTIONS (ddr_cdr1), +CTRL_OPTIONS (ddr_cdr2),CTRL_OPTIONS (tCKE_clock_pulse_width_ps),CTRL_OPTIONS (tFAW_window_four_activates_ps), CTRL_OPTIONS(trwt_override),
@@ -518,6 +520,8 @@ static void print_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr)CFG_REGS (timing_cfg_5),CFG_REGS (ddr_zq_cntl),CFG_REGS (ddr_wrlvl_cntl), +CFG_REGS (ddr_wrlvl_cntl_2), +CFG_REGS (ddr_wrlvl_cntl_3),CFG_REGS (ddr_sr_cntr),CFG_REGS (ddr_sdram_rcw_1), CFG_REGS(ddr_sdram_rcw_2),
@@ -525,6 +529,7 @@ static void print_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr)CFG_REGS (ddr_cdr2),CFG_REGS (err_disable),CFG_REGS (err_int_en), + CFG_REGS(ddr_eor), };static const unsigned int n_opts =ARRAY_SIZE (options);
@@ -584,6 +589,8 @@ static void fsl_ddr_regs_edit(fsl_ddr_info_t *pinfo,CFG_REGS (timing_cfg_5),CFG_REGS (ddr_zq_cntl),CFG_REGS (ddr_wrlvl_cntl), +CFG_REGS (ddr_wrlvl_cntl_2), +CFG_REGS (ddr_wrlvl_cntl_3),CFG_REGS (ddr_sr_cntr),CFG_REGS (ddr_sdram_rcw_1), CFG_REGS(ddr_sdram_rcw_2),
@@ -593,7 +600,7 @@ static void fsl_ddr_regs_edit(fsl_ddr_info_t *pinfo,CFG_REGS (err_int_en),CFG_REGS (ddr_sdram_rcw_2),CFG_REGS (ddr_sdram_rcw_2), - + CFG_REGS(ddr_eor), };static const unsigned int n_opts =ARRAY_SIZE (options);
@@ -689,6 +696,8 @@ static void print_memctl_options(const memctl_options_t *popts)CTRL_OPTIONS (rcw_override),CTRL_OPTIONS (rcw_1),CTRL_OPTIONS (rcw_2), +CTRL_OPTIONS_HEX (ddr_cdr1), +CTRL_OPTIONS_HEX (ddr_cdr2),CTRL_OPTIONS (tCKE_clock_pulse_width_ps),CTRL_OPTIONS (tFAW_window_four_activates_ps), CTRL_OPTIONS(trwt_override),
@@ -1597,6 +1606,7 @@ unsigned long long fsl_ddr_interactive(fsl_ddr_info_t *pinfo)* doesn't return */ do_reset (NULL ,0 ,0 ,NULL ); +printf ("Reset didn't work\n" ); }if (strcmp (argv[0 ],"recompute" ) ==0 ) {
arch/powerpc/include/asm/config_mpc85xx.h +2 -0
@@ -27,6 +27,8 @@#error "Do not define CONFIG_SYS_CCSRBAR_DEFAULT in the board header file."#endif +#define FSL_DDR_VER_4_7 47 +/* Number of TLB CAM entries we have on FSL Book-E chips */ #if defined(CONFIG_E500MC )#define CONFIG_SYS_NUM_TLBCAMS 64
arch/powerpc/include/asm/fsl_ddr_sdram.h +30 -0
@@ -145,6 +145,31 @@ typedef ddr3_spd_eeprom_t generic_spd_eeprom_t;/* DDR_CDR1 */ #define DDR_CDR1_DHC_EN 0x80000000 +#define DDR_CDR1_ODT_SHIFT 17 +#define DDR_CDR1_ODT_MASK 0x6 +#define DDR_CDR2_ODT_MASK 0x1 +#define DDR_CDR1_ODT (x) ((x & DDR_CDR1_ODT_MASK) << DDR_CDR1_ODT_SHIFT) +#define DDR_CDR2_ODT (x) (x & DDR_CDR2_ODT_MASK) + +#if (defined(CONFIG_SYS_FSL_DDR_VER ) && \ + (CONFIG_SYS_FSL_DDR_VER >=FSL_DDR_VER_4_7 )) +#define DDR_CDR_ODT_OFF 0x0 +#define DDR_CDR_ODT_120ohm 0x1 +#define DDR_CDR_ODT_180ohm 0x2 +#define DDR_CDR_ODT_75ohm 0x3 +#define DDR_CDR_ODT_110ohm 0x4 +#define DDR_CDR_ODT_60hm 0x5 +#define DDR_CDR_ODT_70ohm 0x6 +#define DDR_CDR_ODT_47ohm 0x7 +#else +#define DDR_CDR_ODT_75ohm 0x0 +#define DDR_CDR_ODT_55ohm 0x1 +#define DDR_CDR_ODT_60ohm 0x2 +#define DDR_CDR_ODT_50ohm 0x3 +#define DDR_CDR_ODT_150ohm 0x4 +#define DDR_CDR_ODT_43ohm 0x5 +#define DDR_CDR_ODT_120ohm 0x6 +#endif /* Record of register values computed */ typedef struct fsl_ddr_cfg_regs_s {
@@ -177,6 +202,8 @@ typedef struct fsl_ddr_cfg_regs_s {unsigned int timing_cfg_5;unsigned int ddr_zq_cntl;unsigned int ddr_wrlvl_cntl; +unsigned int ddr_wrlvl_cntl_2; +unsigned int ddr_wrlvl_cntl_3;unsigned int ddr_sr_cntr;unsigned int ddr_sdram_rcw_1;unsigned int ddr_sdram_rcw_2;
@@ -262,6 +289,8 @@ typedef struct memctl_options_s {unsigned int wrlvl_override;unsigned int wrlvl_sample;/* Write leveling */ unsigned int wrlvl_start; +unsigned int wrlvl_ctl_2; +unsigned int wrlvl_ctl_3;unsigned int half_strength_driver_enable;unsigned int twoT_en;
@@ -288,6 +317,7 @@ typedef struct memctl_options_s {unsigned int rcw_2;/* control register 1 */ unsigned int ddr_cdr1; +unsigned int ddr_cdr2;unsigned int trwt_override;unsigned int trwt;/* read-to-write turnaround */
Signature · 1 line
1.7.9.5
PATCH 20/28 powerpc/mpc8xxx: Fix DDR driver handling quad-rank DIMMs and address calculation
In reply to York SunFix handling quad-rank DIMMs in a system with two DIMM slots and first slot supports both dual-rank DIMM and quad-rank DIMM.
For systems with quad-rank DIMM and double dual-rank DIMMs, cs_config registers need to be enabled to maintain proper ODT operation. The inactive CS should have bnds registers cleared.
Fix the turnaround timing for systems with all chip-selects enabled. This wasn't an issue before because DDR was running lower than 1600MT/s with this interleaving mode.
Fix DDR address calculation. It wasn't an issue until we have multiple controllers with each more than 4GB and interleaving is disabled.
It also fixes the message of DDR: 2 GiB (DDR3, 64-bit, CL=0.5, ECC off) when debugging DDR and first DDR controller is disabled. With the fix, the first enabled controller information will be displayed.
--- arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c | 62 +++++++++++++++----- .../cpu/mpc8xxx/ddr/lc_common_dimm_params.c | 16 ++++- arch/powerpc/cpu/mpc8xxx/ddr/options.c | 12 ++++ arch/powerpc/cpu/mpc8xxx/ddr/util.c | 12 ++++ arch/powerpc/include/asm/fsl_ddr_sdram.h | 2 + 5 files changed, 87 insertions(+), 17 deletions(-)
arch/powerpc/cpu/mpc8xxx/ddr/ctrl_regs.c +48 -14
@@ -229,6 +229,26 @@ static void set_csn_config_2(int i, fsl_ddr_cfg_regs_t *ddr)/* -3E = 667 CL5, -25 = CL6 800, -25E = CL5 800 */ #if !defined(CONFIG_FSL_DDR1 ) +static inline int avoid_odt_overlap (const dimm_params_t *dimm_params) +{ +#if CONFIG_DIMM_SLOTS_PER_CTLR ==1 +if (dimm_params[0 ].n_ranks ==4 ) +return 1 ; +#endif + +#if CONFIG_DIMM_SLOTS_PER_CTLR ==2 +if ((dimm_params[0 ].n_ranks ==2 ) && + (dimm_params[1 ].n_ranks ==2 )) +return 1 ; + +#ifdef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE +if (dimm_params[0 ].n_ranks ==4 ) +return 1 ; +#endif +#endif +return 0 ; +} +/* * DDR SDRAM Timing Configuration 0 (TIMING_CFG_0) *
@@ -236,7 +256,8 @@ static void set_csn_config_2(int i, fsl_ddr_cfg_regs_t *ddr)* dreams up non-zero default values to be backwards compatible. */ static void set_timing_cfg_0 (fsl_ddr_cfg_regs_t *ddr, -const memctl_options_t *popts) +const memctl_options_t *popts, +const dimm_params_t *dimm_params) {unsigned char trwt_mclk =0 ;/* Read-to-write turnaround */ unsigned char twrt_mclk =0 ;/* Write-to-read turnaround */
@@ -266,7 +287,18 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr,unsigned int data_rate =get_ddr_freq (0 ); tmrd_mclk =4 ;/* set the turnaround time */ - trwt_mclk =1 ; + +/* +* for single quad-rank DIMM and two dual-rank DIMMs +* to avoid ODT overlap +*/ +if (avoid_odt_overlap (dimm_params)) { + twwt_mclk =2 ; + trrt_mclk =1 ; + } +/* for faster clock, need more time for data setup */ + trwt_mclk = (data_rate/1000000 >1800 ) ?2 :1 ; +if ((data_rate/1000000 >1150 ) || (popts->memctl_interleaving)) twrt_mclk =1 ;
@@ -1483,7 +1515,7 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,break ; } sa = common_dimm->base_address; - ea = common_dimm->total_mem -1 ; + ea = sa + common_dimm->total_mem -1 ; }else if (!popts->memctl_interleaving) {/* * If memory interleaving between controllers is NOT
@@ -1497,7 +1529,7 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,switch (popts->ba_intlv_ctl &FSL_DDR_CS0_CS1_CS2_CS3 ) {case FSL_DDR_CS0_CS1_CS2_CS3 : sa = common_dimm->base_address; - ea = common_dimm->total_mem -1 ; + ea = sa + common_dimm->total_mem -1 ;break ;case FSL_DDR_CS0_CS1_AND_CS2_CS3 :if ((i >=2 ) && (dimm_number ==0 )) {
@@ -1554,17 +1586,19 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts, sa >>=24 ; ea >>=24 ; - ddr->cs[i].bnds = (0 - | ((sa &0xFFF ) <<16 )/* starting address MSB */ - | ((ea &0xFFF ) <<0 )/* ending address MSB */ - ); +if (cs_en) { + ddr->cs[i].bnds = (0 + | ((sa &0xFFF ) <<16 )/* starting address MSB */ + | ((ea &0xFFF ) <<0 )/* ending address MSB */ + ); + }else { +debug ("FSLDDR: setting bnds to 0 for inactive CS\n" ); + ddr->cs[i].bnds =0 ; + }debug ("FSLDDR: cs[%d]_bnds = 0x%08x\n" , i, ddr->cs[i].bnds); -if (cs_en) { -set_csn_config (dimm_number, i, ddr, popts, dimm_params); -set_csn_config_2 (i, ddr); - }else -debug ("CS%d is disabled.\n" , i); +set_csn_config (dimm_number, i, ddr, popts, dimm_params); +set_csn_config_2 (i, ddr); }/*
@@ -1577,7 +1611,7 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,set_ddr_eor (ddr, popts);#if !defined(CONFIG_FSL_DDR1 ) -set_timing_cfg_0 (ddr, popts); +set_timing_cfg_0 (ddr, popts, dimm_params);#endif set_timing_cfg_3 (ddr, popts, common_dimm, cas_latency);
arch/powerpc/cpu/mpc8xxx/ddr/lc_common_dimm_params.c +13 -3
@@ -76,7 +76,7 @@ compute_cas_latency_ddr3(const dimm_params_t *dimm_params,unsigned int compute_lowest_common_dimm_parameters (const dimm_params_t *dimm_params,common_timing_params_t *outpdimm, -unsigned int number_of_dimms) +const unsigned int number_of_dimms) {unsigned int i, j;
@@ -126,13 +126,20 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params, temp1++;continue ; } + +/* +* check if quad-rank DIMM is plugged if +* CONFIG_CHIP_SELECT_QUAD_CAPABLE is not defined +* Only the board with proper design is capable +*/ +#ifndef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE if (dimm_params[i].n_ranks ==4 && \CONFIG_CHIP_SELECTS_PER_CTRL /CONFIG_DIMM_SLOTS_PER_CTLR <4 ) {printf ("Found Quad-rank DIMM, not able to support." ); temp1++;continue ; } - +#endif /* * Find minimum tCKmax_ps to find fastest slow speed, * i.e., this is the slowest the whole system can go.
@@ -236,11 +243,14 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,if (outpdimm->all_DIMMs_registered)for (j =0 ; j <16 ; j++) { outpdimm->rcw[j] = dimm_params[0 ].rcw[j]; -for (i =1 ; i < number_of_dimms; i++) +for (i =1 ; i < number_of_dimms; i++) { +if (!dimm_params[i].n_ranks) +continue ;if (dimm_params[i].rcw[j] != dimm_params[0 ].rcw[j]) { temp1 =1 ;break ; } + } }if (temp1 !=0 )
arch/powerpc/cpu/mpc8xxx/ddr/options.c +12 -0
@@ -510,6 +510,14 @@ unsigned int populate_memctl_options(int all_DIMMs_registered, } }else if (CONFIG_DIMM_SLOTS_PER_CTLR ==2 ) {switch (pdimm[0 ].n_ranks) { +#ifdef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE +case 4 : + pdodt = single_Q; +if (pdimm[1 ].n_ranks) +printf ("Error: Quad- and Dual-rank DIMMs " +"cannot be used together\n" ); +break ; +#endif case 2 :switch (pdimm[1 ].n_ranks) {case 2 :
@@ -912,6 +920,10 @@ done: "interleaving disabled!\n", ctrl_num); }#elif (CONFIG_DIMM_SLOTS_PER_CTLR ==2 ) +#ifdef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE +if (pdimm[0 ].n_ranks ==4 ) +break ; +#endif if ((pdimm[0 ].n_ranks <2 ) && (pdimm[1 ].n_ranks <2 )) { popts->ba_intlv_ctl =0 ; printf("Not enough bank(chip-select) for "
arch/powerpc/cpu/mpc8xxx/ddr/util.c +12 -0
@@ -140,6 +140,18 @@ void board_add_ram_info(int use_default)uint32_t sdram_cfg =in_be32 (&ddr->sdram_cfg);int cas_lat; +#if CONFIG_NUM_DDR_CONTROLLERS >=2 +if (!(sdram_cfg &SDRAM_CFG_MEM_EN )) { + ddr = (void *)CONFIG_SYS_MPC85xx_DDR2_ADDR; + sdram_cfg =in_be32 (&ddr->sdram_cfg); + } +#endif +#if CONFIG_NUM_DDR_CONTROLLERS >=3 +if (!(sdram_cfg &SDRAM_CFG_MEM_EN )) { + ddr = (void *)CONFIG_SYS_MPC85xx_DDR3_ADDR; + sdram_cfg =in_be32 (&ddr->sdram_cfg); + } +#endif puts (" (DDR" );switch ((sdram_cfg &SDRAM_CFG_SDRAM_TYPE_MASK ) >>SDRAM_CFG_SDRAM_TYPE_SHIFT ) {
arch/powerpc/include/asm/fsl_ddr_sdram.h +2 -0
@@ -84,6 +84,8 @@ typedef ddr3_spd_eeprom_t generic_spd_eeprom_t;#define FSL_DDR_4WAY_4KB_INTERLEAVING 0x1C#define FSL_DDR_4WAY_8KB_INTERLEAVING 0x1D +#define SDRAM_CS_CONFIG_EN 0x80000000 +/* DDR_SDRAM_CFG - DDR SDRAM Control Configuration */ #define SDRAM_CFG_MEM_EN 0x80000000
Signature · 1 line
1.7.9.5
PATCH 21/28 powerpc/mpc8xxx: Fix DDR initialization waiting for D_INIT
In reply to York SunWhen ECC is enabled, DDR controller needs to initialize the data and ecc. The wait time can be calcuated with total memory size, bus width, bus speed and interleaving mode. If it went wrong, it is bettert to timeout than waiting for D_INIT to clear, where it probably hangs.
--- arch/powerpc/cpu/mpc85xx/ddr-gen3.c | 80 +++++++++++++++++++++--------- arch/powerpc/cpu/mpc8xxx/ddr/main.c | 12 ++++- arch/powerpc/cpu/mpc8xxx/ddr/util.c | 4 +- arch/powerpc/include/asm/fsl_ddr_sdram.h | 2 + 4 files changed, 71 insertions(+), 27 deletions(-)
arch/powerpc/cpu/mpc85xx/ddr-gen3.c +56 -24
@@ -18,12 +18,13 @@void fsl_ddr_set_memctl_regs (const fsl_ddr_cfg_regs_t *regs,unsigned int ctrl_num) { -unsigned int i; +unsigned int i, bus_width;volatile ccsr_ddr_t *ddr;u32 temp_sdram_cfg; +u32 total_gb_size_per_controller; +int timeout, timeout_save;#ifdef CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 volatile ccsr_local_ecm_t *ecm = (void *)CONFIG_SYS_MPC85xx_ECM_ADDR; -u32 total_gb_size_per_controller;unsigned int csn_bnds_backup =0 , cs_sa, cs_ea, *csn_bnds_t;int csn =-1 ;#endif
@@ -52,8 +53,8 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,return ; } -out_be32 (&ddr->eor, regs->ddr_eor); - +if (regs->ddr_eor) +out_be32 (&ddr->eor, regs->ddr_eor);#ifdef CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 debug ("Workaround for ERRATUM_DDR111_DDR134\n" );for (i =0 ; i <CONFIG_CHIP_SELECTS_PER_CTRL ; i++) {
@@ -275,9 +276,46 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,out_be32 (&ddr->sdram_cfg, temp_sdram_cfg |SDRAM_CFG_MEM_EN ); asmvolatile ("sync;isync" ); + total_gb_size_per_controller =0 ; +for (i =0 ; i <CONFIG_CHIP_SELECTS_PER_CTRL ; i++) { +if (!(regs->cs[i].config &0x80000000 )) +continue ; + total_gb_size_per_controller +=1 << ( + ((regs->cs[i].config >>14 ) &0x3 ) +2 + + ((regs->cs[i].config >>8 ) &0x7 ) +12 + + ((regs->cs[i].config >>0 ) &0x7 ) +8 + +3 - ((regs->ddr_sdram_cfg >>19 ) &0x3 ) - +26 );/* minus 26 (count of 64M) */ + } +if (fsl_ddr_get_intl3r () &0x80000000 )/* 3-way interleaving */ + total_gb_size_per_controller *=3 ; +else if (regs->cs[0 ].config &0x20000000 )/* 2-way interleaving */ + total_gb_size_per_controller <<=1 ; +/* +* total memory / bus width = transactions needed +* transactions needed / data rate = seconds +* to add plenty of buffer, double the time +* For example, 2GB on 666MT/s 64-bit bus takes about 402ms +* Let's wait for 800ms +*/ + bus_width =3 - ((ddr->sdram_cfg &SDRAM_CFG_DBW_MASK ) + >>SDRAM_CFG_DBW_SHIFT ); + timeout = ((total_gb_size_per_controller << (6 - bus_width)) *100 / + (get_ddr_freq (0 ) >>20 )) <<1 ; + timeout_save = timeout; + total_gb_size_per_controller >>=4 ;/* shift down to gb size */ +debug ("total %d GB\n" , total_gb_size_per_controller); +debug ("Need to wait up to %d * 10ms\n" , timeout); +/* Poll DDR_SDRAM_CFG_2[D_INIT] bit until auto-data init is done. */ -while (in_be32 (&ddr->sdram_cfg_2) &SDRAM_CFG2_D_INIT ) +while ((in_be32 (&ddr->sdram_cfg_2) &SDRAM_CFG2_D_INIT ) && + (timeout >=0 )) {udelay (10000 );/* throttle polling rate */ + timeout--; + } + +if (timeout <=0 ) +printf ("Waiting for D_INIT timeout. Memory may not work.\n" );#ifdef CONFIG_SYS_FSL_ERRATUM_DDR111_DDR134 /* continue this workaround */
@@ -335,23 +373,9 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,while (in_be32 (&ddr->debug[1 ]) &0x400 )udelay (10000 );/* throttle polling rate */ -/* 7. Wait for 400ms/GB */ - total_gb_size_per_controller =0 ; -for (i =0 ; i <CONFIG_CHIP_SELECTS_PER_CTRL ; i++) { -if (i == csn) { - total_gb_size_per_controller += - ((csn_bnds_backup &0xFFFF ) >>6 ) - - (csn_bnds_backup >>22 ) +1 ; - }else { - total_gb_size_per_controller += - ((regs->cs[i].bnds &0xFFFF ) >>6 ) - - (regs->cs[i].bnds >>22 ) +1 ; - } - } -if (in_be32 (&ddr->sdram_cfg) &0x80000 ) - total_gb_size_per_controller <<=1 ; -debug ("Wait for %d ms\n" , total_gb_size_per_controller *400 ); -udelay (total_gb_size_per_controller *400000 ); +/* 7. Wait for state machine 2nd run, roughly 400ms/GB */ +debug ("Wait for %d * 10ms\n" , timeout_save); +udelay (timeout_save *10000 );/* 8. Set sdram_cfg_2[dinit] if options requires */ setbits_be32(&ddr->sdram_cfg_2,
@@ -359,8 +383,16 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,debug ("Setting sdram_cfg_2 to 0x%08x\n" ,in_be32 (&ddr->sdram_cfg_2));/* 9. Poll until dinit is cleared */ -while (in_be32 (&ddr->sdram_cfg_2) &SDRAM_CFG2_D_INIT ) -udelay (10000 ); + timeout = timeout_save; +debug ("Need to wait up to %d * 10ms\n" , timeout); +while ((in_be32 (&ddr->sdram_cfg_2) &SDRAM_CFG2_D_INIT ) && + (timeout >=0 )) { +udelay (10000 );/* throttle polling rate */ + timeout--; + } + +if (timeout <=0 ) +printf ("Waiting for D_INIT timeout. Memory may not work.\n" );/* 10. Clear EEBACR[3] */ clrbits_be32 (&ecm->eebacr,10000000 );
arch/powerpc/cpu/mpc8xxx/ddr/main.c +11 -1
@@ -526,6 +526,17 @@ phys_size_t fsl_ddr_sdram(void)#endif total_memory =fsl_ddr_compute (&info,STEP_GET_SPD ,0 ); +/* setup 3-way interleaving before enabling DDRC */ +switch (info.memctl_opts[0 ].memctl_interleaving_mode) { +case FSL_DDR_3WAY_1KB_INTERLEAVING : +case FSL_DDR_3WAY_4KB_INTERLEAVING : +case FSL_DDR_3WAY_8KB_INTERLEAVING : +fsl_ddr_set_intl3r (info.memctl_opts[0 ].memctl_interleaving_mode); +break ; +default : +break ; + } +/* Program configuration registers. */ for (i =0 ; i <CONFIG_NUM_DDR_CONTROLLERS ; i++) {debug ("Programming controller %u\n" , i);
@@ -561,7 +572,6 @@ phys_size_t fsl_ddr_sdram(void)case FSL_DDR_3WAY_8KB_INTERLEAVING : law_memctl =LAW_TRGT_IF_DDR_INTLV_123 ;if (i ==0 ) { -fsl_ddr_set_intl3r (info.memctl_opts[i].memctl_interleaving_mode);fsl_ddr_set_lawbar (&info.common_timing_params[i], law_memctl, i); }
arch/powerpc/cpu/mpc8xxx/ddr/util.c +2 -2
@@ -142,13 +142,13 @@ void board_add_ram_info(int use_default)#if CONFIG_NUM_DDR_CONTROLLERS >=2 if (!(sdram_cfg &SDRAM_CFG_MEM_EN )) { - ddr = (void *)CONFIG_SYS_MPC85xx_DDR2_ADDR; + ddr = (void __iomem *)CONFIG_SYS_MPC85xx_DDR2_ADDR; sdram_cfg =in_be32 (&ddr->sdram_cfg); }#endif #if CONFIG_NUM_DDR_CONTROLLERS >=3 if (!(sdram_cfg &SDRAM_CFG_MEM_EN )) { - ddr = (void *)CONFIG_SYS_MPC85xx_DDR3_ADDR; + ddr = (void __iomem *)CONFIG_SYS_MPC85xx_DDR3_ADDR; sdram_cfg =in_be32 (&ddr->sdram_cfg); }#endif
arch/powerpc/include/asm/fsl_ddr_sdram.h +2 -0
@@ -98,6 +98,7 @@ typedef ddr3_spd_eeprom_t generic_spd_eeprom_t;#define SDRAM_CFG_SDRAM_TYPE_SHIFT 24#define SDRAM_CFG_DYN_PWR 0x00200000#define SDRAM_CFG_DBW_MASK 0x00180000 +#define SDRAM_CFG_DBW_SHIFT 19#define SDRAM_CFG_32_BE 0x00080000#define SDRAM_CFG_16_BE 0x00100000#define SDRAM_CFG_8_BE 0x00040000
@@ -330,6 +331,7 @@ extern phys_size_t fsl_ddr_sdram_size(void);extern int fsl_use_spd (void );extern void fsl_ddr_set_memctl_regs (const fsl_ddr_cfg_regs_t *regs,unsigned int ctrl_num); +u32 fsl_ddr_get_intl3r (void );/* * The 85xx boards have a common prototype for fixed_sdram so put the
Signature · 1 line
1.7.9.5
PATCH 22/28 powerpc/mpc85xx: software workaround for DDR erratum A-004468
In reply to York SunBoot space translation utilizes the pre-translation address to select the DDR controller target. However, the post-translation address will be presented to the selected DDR controller. It is possible that the pre- translation address selects one DDR controller but the post-translation address exists in a different DDR controller when using certain DDR controller interleaving modes. The device may fail to boot under these circumstances. Note that a DDR MSE error will not be detected since DDR controller bounds registers are programmed to be the same when configured for DDR controller interleaving.
--- arch/powerpc/cpu/mpc85xx/cmd_errata.c | 3 + arch/powerpc/cpu/mpc85xx/fdt.c | 2 +- arch/powerpc/cpu/mpc85xx/mp.c | 96 ++++++++++++++++++++++++++--- arch/powerpc/cpu/mpc86xx/fdt.c | 2 +- arch/powerpc/cpu/mpc86xx/mp.c | 9 ++- arch/powerpc/cpu/mpc8xxx/ddr/util.c | 10 +++ arch/powerpc/include/asm/config_mpc85xx.h | 1 + arch/powerpc/include/asm/mp.h | 2 +- arch/powerpc/lib/board.c | 4 +- 9 files changed, 111 insertions(+), 18 deletions(-)
arch/powerpc/cpu/mpc85xx/cmd_errata.c +3 -0
@@ -76,6 +76,9 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])#if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC111 )puts ("Work-around for Erratum ESDHC111 enabled\n" );#endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A004468 +puts ("Work-around for Erratum A004468 enabled\n" ); +#endif #if defined(CONFIG_SYS_FSL_ERRATUM_ESDHC135 )puts ("Work-around for Erratum ESDHC135 enabled\n" );#endif
arch/powerpc/cpu/mpc85xx/fdt.c +1 -1
@@ -48,7 +48,7 @@ void ft_fixup_cpu(void *blob, u64 memory_limit) {int off;ulong spin_tbl_addr =get_spin_phys_addr (); -u32 bootpg =determine_mp_bootpg (); +u32 bootpg =determine_mp_bootpg (NULL );u32 id =get_my_id ();const char *enable_method;
arch/powerpc/cpu/mpc85xx/mp.c +86 -10
153 lines not on this page · raw message
arch/powerpc/cpu/mpc86xx/fdt.c +1 -1
@@ -20,7 +20,7 @@ void ft_cpu_setup(void *blob, bd_t *bd) {#ifdef CONFIG_MP int off; -u32 bootpg =determine_mp_bootpg (); +u32 bootpg =determine_mp_bootpg (NULL );#endif do_fixup_by_prop_u32(blob, "device_type", "cpu", 4,
arch/powerpc/cpu/mpc86xx/mp.c +6 -3
@@ -90,8 +90,11 @@ int cpu_release(int nr, int argc, char * const argv[])return 1 ; } -u32 determine_mp_bootpg (void ) +u32 determine_mp_bootpg (unsigned int *pagesize) { +if (pagesize) + *pagesize =4096 ; +/* if we have 4G or more of memory, put the boot page at 4Gb-1M */ if ((u64 )gd->ram_size >0xfffff000 )return (0xfff00000 );
@@ -101,7 +104,7 @@ u32 determine_mp_bootpg(void)void cpu_mp_lmb_reserve (struct lmb *lmb) { -u32 bootpg =determine_mp_bootpg (); +u32 bootpg =determine_mp_bootpg (NULL );/* tell u-boot we stole a page */ lmb_reserve (lmb, bootpg,4096 );
@@ -115,7 +118,7 @@ void setup_mp(void) {extern ulong __secondary_start_page;ulong fixup = (ulong)&__secondary_start_page; -u32 bootpg =determine_mp_bootpg (); +u32 bootpg =determine_mp_bootpg (NULL );u32 bootpg_va;if (bootpg >=CONFIG_SYS_MAX_DDR_BAT_SIZE ) {
arch/powerpc/cpu/mpc8xxx/ddr/util.c +10 -0
@@ -121,6 +121,16 @@ void fsl_ddr_set_intl3r(const unsigned int granule_size)#endif } +u32 fsl_ddr_get_intl3r (void ) +{ +u32 val =0 ; +#ifdef CONFIG_E6500 +u32 *mcintl3r = (void *) (CONFIG_SYS_IMMR +0x18004 ); + val = *mcintl3r; +#endif +return val; +} +void board_add_ram_info (int use_default) {#if defined(CONFIG_MPC83xx)
arch/powerpc/include/asm/config_mpc85xx.h +1 -0
@@ -478,6 +478,7 @@#define CONFIG_SYS_FSL_USB1_PHY_ENABLE #define CONFIG_SYS_FSL_USB2_PHY_ENABLE #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY +#define CONFIG_SYS_FSL_ERRATUM_A004468 #define CONFIG_SYS_CCSRBAR_DEFAULT 0xfe000000#elif defined(CONFIG_PPC_B4860 )
arch/powerpc/include/asm/mp.h +1 -1
@@ -25,7 +25,7 @@void setup_mp (void );void cpu_mp_lmb_reserve (struct lmb *lmb); -u32 determine_mp_bootpg (void ); +u32 determine_mp_bootpg (unsigned int *pagesize);int is_core_disabled (int nr);#ifdef CONFIG_E6500
arch/powerpc/lib/board.c +2 -2
@@ -440,8 +440,8 @@ void board_init_f(ulong bootflag)* We need to make sure the location we intend to put secondary core * boot code is reserved and not used by any part of u-boot */ -if (addr >determine_mp_bootpg ()) { - addr =determine_mp_bootpg (); +if (addr >determine_mp_bootpg (NULL )) { + addr =determine_mp_bootpg (NULL );debug ("Reserving MP boot page to %08lx\n" , addr); }#endif
Signature · 1 line
1.7.9.5
PATCH 23/28 powerpc/mpc85xx: Add workaround for DDR erratum A004934
In reply to York SunAfter DDR controller is enabled, it performs a calibration for the transmit data vs DQS paths. During this calibration, the DDR controller may make an inaccurate calculation, resulting in a non-optimal tap point.
--- arch/powerpc/cpu/mpc85xx/cmd_errata.c | 3 +++ arch/powerpc/cpu/mpc85xx/ddr-gen3.c | 3 +++ arch/powerpc/include/asm/config_mpc85xx.h | 1 + 3 files changed, 7 insertions(+)
arch/powerpc/cpu/mpc85xx/cmd_errata.c +3 -0
@@ -130,6 +130,9 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])#ifdef CONFIG_SYS_FSL_ERRATUM_A004510 puts ("Work-around for Erratum A004510 enabled\n" );#endif +#ifdef CONFIG_SYS_FSL_ERRATUM_A_004934 +puts ("Work-around for Erratum A004934 enabled\n" ); +#endif return 0 ; }
arch/powerpc/cpu/mpc85xx/ddr-gen3.c +3 -0
@@ -140,6 +140,9 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,out_be32 (&ddr->debug[i], regs->debug[i]); } } +#ifdef CONFIG_SYS_FSL_ERRATUM_A_004934 +out_be32 (&ddr->debug[28 ],0x00003000 ); +#endif #ifdef CONFIG_SYS_FSL_ERRATUM_DDR_A003474 out_be32 (&ddr->debug[12 ],0x00000015 );
arch/powerpc/include/asm/config_mpc85xx.h +1 -0
@@ -479,6 +479,7 @@#define CONFIG_SYS_FSL_USB2_PHY_ENABLE #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY #define CONFIG_SYS_FSL_ERRATUM_A004468 +#define CONFIG_SYS_FSL_ERRATUM_A_004934 #define CONFIG_SYS_CCSRBAR_DEFAULT 0xfe000000#elif defined(CONFIG_PPC_B4860 )
Signature · 1 line
1.7.9.5
PATCH 24/28 powerpc/mpc8xxx: Add auto select bank interleaving mode
In reply to York SunBased on populated DIMMs, automatically select from cs0_cs1_cs2_cs3 or cs0_cs1 interleaving, or non-interleaving if not available.
Fix the message of interleaving disabled if controller interleaving is enabled but DIMMs don't support it.
--- arch/powerpc/cpu/mpc8xxx/ddr/options.c | 33 +++++++++++++++++++++++++++++++- doc/README.fsl-ddr | 5 +++++ 2 files changed, 37 insertions(+), 1 deletion(-)
arch/powerpc/cpu/mpc8xxx/ddr/options.c +32 -1
@@ -474,6 +474,34 @@ static const struct dynamic_odt odt_unknown[4] = { } };#endif + +/* +* Automatically seleect bank interleaving mode based on DIMMs +* in this order: cs0_cs1_cs2_cs3, cs0_cs1, null. +* This function only deal with one or two slots per controller. +*/ +static inline unsigned int auto_bank_intlv (dimm_params_t *pdimm) +{ +#if (CONFIG_DIMM_SLOTS_PER_CTLR ==1 ) +if (pdimm[0 ].n_ranks ==4 ) +return FSL_DDR_CS0_CS1_CS2_CS3 ; +else if (pdimm[0 ].n_ranks ==2 ) +return FSL_DDR_CS0_CS1 ; +#elif (CONFIG_DIMM_SLOTS_PER_CTLR ==2 ) +#ifdef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE +if (pdimm[0 ].n_ranks ==4 ) +return FSL_DDR_CS0_CS1_CS2_CS3 ; +#endif +if (pdimm[0 ].n_ranks ==2 ) { +if (pdimm[1 ].n_ranks ==2 ) +return FSL_DDR_CS0_CS1_CS2_CS3 ; +else +return FSL_DDR_CS0_CS1 ; + } +#endif +return 0 ; +} + unsigned int populate_memctl_options(int all_DIMMs_registered, memctl_options_t *popts, dimm_params_t *pdimm,
@@ -908,6 +936,9 @@ done:else if (hwconfig_subarg_cmp_f ("fsl_ddr" ,"bank_intlv" ,"cs0_cs1_cs2_cs3" , buf)) popts->ba_intlv_ctl =FSL_DDR_CS0_CS1_CS2_CS3 ; +else if (hwconfig_subarg_cmp_f ("fsl_ddr" ,"bank_intlv" , +"auto" , buf)) + popts->ba_intlv_ctl =auto_bank_intlv (pdimm);else printf ("hwconfig has unrecognized parameter for bank_intlv.\n" );switch (popts->ba_intlv_ctl &FSL_DDR_CS0_CS1_CS2_CS3 ) {
@@ -1075,7 +1106,7 @@ void check_interleaving_options(fsl_ddr_info_t *pinfo)break ; }debug ("%d of %d controllers are interleaving.\n" , j, k); -if (j != k) { +if (j && (j != k)) {for (i =0 ; i <CONFIG_NUM_DDR_CONTROLLERS ; i++) pinfo->memctl_opts[i].memctl_interleaving =0 ; printf("Not all controllers have compatible "
doc/README.fsl-ddr +5 -0
@@ -103,6 +103,11 @@ The ways to configure the ddr interleaving mode # bank(chip-select) interleaving (cs0+cs1+cs2+cs3) (4x1) setenv hwconfig "fsl_ddr:bank_intlv=cs0_cs1_cs2_cs3" + # bank(chip-select) interleaving (auto) + setenv hwconfig "fsl_ddr:bank_intlv=auto" + This auto mode only select from cs0_cs1_cs2_cs3, cs0_cs1, null dependings + on DIMMs. + Memory controller address hashing ================================== If the DDR controller supports address hashing, it can be enabled by hwconfig.
Signature · 1 line
1.7.9.5
PATCH 25/28 powerpc/mpc8xxx: Fix DDR SPD failed message
In reply to York SunSince empty DIMM slot is allowed on other than the first slot, remove the error message if SPD is not found in this case.
--- arch/powerpc/cpu/mpc8xxx/ddr/main.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
arch/powerpc/cpu/mpc8xxx/ddr/main.c +13 -1
@@ -77,7 +77,19 @@ static void __get_spd(generic_spd_eeprom_t *spd, u8 i2c_address) sizeof(generic_spd_eeprom_t));if (ret) { -printf ("DDR: failed to read SPD from address %u\n" , i2c_address); + if (i2c_address == +#ifdef SPD_EEPROM_ADDRESS + SPD_EEPROM_ADDRESS +#elif defined(SPD_EEPROM_ADDRESS1 ) + SPD_EEPROM_ADDRESS1 +#endif + ) { + printf("DDR: failed to read SPD from address %u\n", + i2c_address); + } else { +debug ("DDR: failed to read SPD from address %u\n" , + i2c_address); + } memset(spd, 0, sizeof(generic_spd_eeprom_t)); } }
Signature · 1 line
1.7.9.5
PATCH 26/28 powerpc/mpc85xx: Remove R6 from spin table
In reply to York SunR6 was in ePAPR draft version but was dropped in official spec. Removing it to comply.
--- arch/powerpc/cpu/mpc85xx/mp.c | 8 +++----- arch/powerpc/cpu/mpc85xx/release.S | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-)
arch/powerpc/cpu/mpc85xx/mp.c +3 -5
@@ -86,9 +86,8 @@ int cpu_status(int nr)printf ("\n" );printf ("table @ 0x%p\n" , table);printf (" addr - 0x%08x\n" , table[BOOT_ENTRY_ADDR_LOWER ]); -printf (" pir - 0x%08x\n" , table[BOOT_ENTRY_PIR ]);printf (" r3 - 0x%08x\n" , table[BOOT_ENTRY_R3_LOWER ]); -printf (" r6 - 0x%08x\n" , table[BOOT_ENTRY_R6_LOWER ]); +printf (" pir - 0x%08x\n" , table[BOOT_ENTRY_PIR ]); }return 0 ;
@@ -151,7 +150,6 @@ static u8 boot_entry_map[4] = {0 ,BOOT_ENTRY_PIR , BOOT_ENTRY_R3_LOWER, - BOOT_ENTRY_R6_LOWER, };int cpu_release (int nr,int argc,char *const argv[])
@@ -174,8 +172,8 @@ int cpu_release(int nr, int argc, char * const argv[]) boot_addr =simple_strtoull (argv[0 ],NULL ,16 ); -/* handle pir, r3, r6 */ -for (i =1 ; i <4 ; i++) { +/* handle pir, r3 */ +for (i =1 ; i <3 ; i++) {if (argv[i][0 ] !='-' ) {u8 entry = boot_entry_map[i]; val =simple_strtoul (argv[i],NULL ,16 );
arch/powerpc/cpu/mpc85xx/release.S +1 -1
@@ -366,7 +366,7 @@ __secondary_start_page: lwz r3,ENTRY_R3_LOWER(r10) li r4,0 li r5,0 - lwz r6,ENTRY_R6_LOWER(r10) + li r6,0 lis r7,(64*1024*1024)@h li r8,0 li r9,0
Signature · 1 line
1.7.9.5
PATCH 27/28 powerpc/mpc85xx: Rewrite spin table to comply with ePAPR v1.1
In reply to York SunMove spin table to cached memory to comply with ePAPR v1.1. Load R3 with 64-bit value if CONFIG_SYS_PPC64 is defined.
'M' bit is set for DDR TLB to maintain cache coherence.
See details in doc/README.mpc85xx-spin-table.
--- README | 6 + arch/powerpc/cpu/mpc85xx/fdt.c | 13 ++- arch/powerpc/cpu/mpc85xx/mp.c | 61 +++++----- arch/powerpc/cpu/mpc85xx/mp.h | 5 +- arch/powerpc/cpu/mpc85xx/release.S | 179 +++++++++++++++++------------ arch/powerpc/cpu/mpc85xx/tlb.c | 2 +- arch/powerpc/include/asm/config_mpc85xx.h | 3 + doc/README.mpc85xx-spin-table | 26 +++++ 8 files changed, 183 insertions(+), 112 deletions(-) create mode 100644 doc/README.mpc85xx-spin-table
README +6 -0
@@ -363,6 +363,12 @@ The following options need to be configured: ICache only when Code runs from RAM. - 85xx CPU Options: + CONFIG_SYS_PPC64 + + Specifies that the core is a 64-bit PowerPC implementation (implements + the "64" category of the Power ISA). This is necessary for ePAPR + compliance, among other possible reasons. + CONFIG_SYS_FSL_TBCLK_DIV Defines the core time base clock divider ratio compared to the
arch/powerpc/cpu/mpc85xx/fdt.c +11 -2
@@ -47,7 +47,7 @@ extern void ft_srio_setup(void *blob);void ft_fixup_cpu (void *blob,u64 memory_limit) {int off; -ulong spin_tbl_addr =get_spin_phys_addr (); +phys_addr_t spin_tbl_addr =get_spin_phys_addr ();u32 bootpg =determine_mp_bootpg (NULL );u32 id =get_my_id ();const char *enable_method;
@@ -97,7 +97,16 @@ void ft_fixup_cpu(void *blob, u64 memory_limit)if ((u64 )bootpg < memory_limit) { off =fdt_add_mem_rsv (blob, bootpg, (u64 )4096 );if (off <0 ) -printf ("%s: %s\n" , __FUNCTION__,fdt_strerror (off)); +printf ("Failed to reserve memory for bootpg: %s\n" , +fdt_strerror (off)); + } +/* Reserve spin table page */ +if (spin_tbl_addr < memory_limit) { + off =fdt_add_mem_rsv (blob, + (spin_tbl_addr & ~0xffful ),4096 ); +if (off <0 ) +printf ("Failed to reserve memory for spin table: %s\n" , +fdt_strerror (off)); } }#endif
arch/powerpc/cpu/mpc85xx/mp.c +30 -31
121 lines not on this page · raw message
arch/powerpc/cpu/mpc85xx/mp.h +2 -3
@@ -3,8 +3,7 @@#include <asm/mp.h> -ulong get_spin_phys_addr (void ); -ulong get_spin_virt_addr (void ); +phys_addr_t get_spin_phys_addr (void );u32 get_my_id (void );int hold_cores_in_reset (int verbose);
@@ -16,7 +15,7 @@ int hold_cores_in_reset(int verbose);#define BOOT_ENTRY_PIR 5#define BOOT_ENTRY_R6_UPPER 6#define BOOT_ENTRY_R6_LOWER 7 -#define NUM_BOOT_ENTRY 8 +#define NUM_BOOT_ENTRY 16/* pad to 64 bytes */ #define SIZE_BOOT_ENTRY (NUM_BOOT_ENTRY * sizeof(u32))#endif
arch/powerpc/cpu/mpc85xx/release.S +104 -75
234 lines not on this page · raw message
arch/powerpc/cpu/mpc85xx/tlb.c +1 -1
@@ -249,7 +249,7 @@ setup_ddr_tlbs_phys(phys_addr_t p_addr, unsigned int memsize_in_meg) {int i;unsigned int tlb_size; -unsigned int wimge =0 ; +unsigned int wimge =MAS2_M ;unsigned int ram_tlb_address = (unsigned int )CONFIG_SYS_DDR_SDRAM_BASE ;unsigned int max_cam;u64 size, memsize = (u64 )memsize_in_meg <<20 ;
arch/powerpc/include/asm/config_mpc85xx.h +3 -0
@@ -413,6 +413,7 @@#define CONFIG_SYS_FSL_CORENET_SNOOPVEC_COREONLY 0xff000000#elif defined(CONFIG_PPC_P5020 )/* also supports P5010 */ +#define CONFIG_SYS_PPC64 /* 64-bit core */ #define CONFIG_SYS_FSL_QORIQ_CHASSIS1 #define CONFIG_MAX_CPUS 2#define CONFIG_SYS_FSL_NUM_CC_PLLS 2
@@ -452,6 +453,7 @@#define CONFIG_SYS_FSL_ERRATUM_ESDHC111 #elif defined(CONFIG_PPC_T4240 ) +#define CONFIG_SYS_PPC64 /* 64-bit core */ #define CONFIG_FSL_CORENET /* Freescale CoreNet platform */ #define CONFIG_SYS_FSL_QORIQ_CHASSIS2 /* Freescale Chassis generation 2 */ #define CONFIG_SYS_FSL_QMAN_V3 /* QMAN version 3 */
@@ -483,6 +485,7 @@#define CONFIG_SYS_CCSRBAR_DEFAULT 0xfe000000#elif defined(CONFIG_PPC_B4860 ) +#define CONFIG_SYS_PPC64 /* 64-bit core */ #define CONFIG_FSL_CORENET /* Freescale CoreNet platform */ #define CONFIG_SYS_FSL_QORIQ_CHASSIS2 /* Freescale Chassis generation 2 */ #define CONFIG_SYS_FSL_QMAN_V3 /* QMAN version 3 */
doc/README.mpc85xx-spin-table new file +26 -0
@@ -0,0 +1,26 @@ +Spin table in cache +===================================== +As specified by ePAPR v1.1, the spin table needs to be in cached memory. After +DDR is initialized and U-boot relocates itself into DDR, the spin table is +accessible for core 0. It is part of release.S, within 4KB range after +__secondary_start_page. For other cores to use the spin table, the booting +process is described below: + +Core 0 sets up the reset page on the top 4K of memory (or 4GB if total memory +is more than 4GB), and creates a TLB to map it to 0xffff_f000, regardless of +the physical address of this page, with WIMGE=0b01010. Core 0 also enables boot +page translation for secondary cores to use this page of memory. Then 4KB +memory is copied from __secondary_start_page to the boot page, after flusing +cache because this page is mapped as normal DDR. Before copying the reset page, +core 0 puts the physical address of the spin table (which is in release.S and +relocated to the top of mapped memory) into a variable __spin_table_addr so +that secondary cores can see it. + +When secondary cores boot up from 0xffff_f000 page, they only have one default +TLB. While booting, they set up another TLB in AS=1 space and jump into +the new space. The new TLB covers the physical address of the spin table page, +with WIMGE =0b00100. Now secondary cores can keep polling the spin table +without stress DDR bus because both the code and the spin table is in cache. + +For the above to work, DDR has to set the 'M' bit of WIMGE, in order to keep +cache coherence.
Signature · 1 line
1.7.9.5
PATCH 27/28 powerpc/mpc85xx: Rewrite spin table to comply with ePAPR v1.1
Quoted 8 lines · York Sun
Move spin table to cached memory to comply with ePAPR v1.1. Load R3 with 64-bit value if
CONFIG_SYS_PPC64is defined.'M' bit is set for DDR TLB to maintain cache coherence.
See details in doc/README.mpc85xx-spin-table.
Signed-off-by York Sun <[email protected]>
Quoted 12 lines
--- README | 6 + arch/powerpc/cpu/mpc85xx/fdt.c | 13 ++- arch/powerpc/cpu/mpc85xx/mp.c | 61 +++++----- arch/powerpc/cpu/mpc85xx/mp.h | 5 +- arch/powerpc/cpu/mpc85xx/release.S | 179 +++++++++++++++++------------ arch/powerpc/cpu/mpc85xx/tlb.c | 2 +- arch/powerpc/include/asm/config_mpc85xx.h | 3 + doc/README.mpc85xx-spin-table | 26 +++++ 8 files changed, 183 insertions(+), 112 deletions(-) create mode 100644 doc/README.mpc85xx-spin-table
As we discussed internally, this patch needs to be RFC until changes go into Linux to be compatible with a cacheable spin table.
-Scott
PATCH 28/28 powerpc/mpc85xx: Add CONFIG_DDR_CLK_FREQ for corenet platform
In reply to York SunNew corenet platforms with chassis2 have separated DDR clock inputs. Use CONFIG_DDR_CLK_FREQ for DDR clock. This patch also cleans up the logic of detecting and displaying synchronous vs asynchronous mode.
--- arch/powerpc/cpu/mpc85xx/cpu.c | 26 ++++++++++++++++---------- arch/powerpc/cpu/mpc85xx/speed.c | 4 ++++ 2 files changed, 20 insertions(+), 10 deletions(-)
arch/powerpc/cpu/mpc85xx/cpu.c +16 -10
@@ -60,26 +60,32 @@ int checkcpu (void)uint major, minor;struct cpu_type *cpu;char buf1[32 ], buf2[32 ]; -#if defined(CONFIG_DDR_CLK_FREQ ) || \ - (defined(CONFIG_FSL_CORENET ) && !defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2 )) +#if (defined(CONFIG_DDR_CLK_FREQ ) || \ + defined(CONFIG_FSL_CORENET )) && !defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2 )volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);#endif /* CONFIG_FSL_CORENET */ -#ifdef CONFIG_DDR_CLK_FREQ -u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO) - >> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT; -#else + +/* +* Cornet platforms use ddr sync bit in RCW to indicate sync vs async +* mode. Previous platform use ddr ratio to do the same. This +* information is only for display here. +*/ #ifdef CONFIG_FSL_CORENET -u32 ddr_sync ;#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2 - ddr_sync =0 ;/* only async mode is supported */ +u32 ddr_sync =0 ;/* only async mode is supported */ #else - ddr_sync = ((gur->rcwsr[5 ]) &FSL_CORENET_RCWSR5_DDR_SYNC ) +u32 ddr_sync = ((gur->rcwsr[5 ]) &FSL_CORENET_RCWSR5_DDR_SYNC ) >>FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT ;#endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */ +#else /* CONFIG_FSL_CORENET */ +#ifdef CONFIG_DDR_CLK_FREQ +u32 ddr_ratio = ((gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO) + >> MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;#else u32 ddr_ratio =0 ; -#endif /* CONFIG_FSL_CORENET */ #endif /* CONFIG_DDR_CLK_FREQ */ +#endif /* CONFIG_FSL_CORENET */ +unsigned int i, core, nr_cores =cpu_numcores ();u32 mask =cpu_mask ();
arch/powerpc/cpu/mpc85xx/speed.c +4 -0
@@ -82,7 +82,11 @@ void get_sys_info (sys_info_t * sysInfo)uint mem_pll_rat; sysInfo->freqSystemBus = sysclk; +#ifdef CONFIG_DDR_CLK_FREQ + sysInfo->freqDDRBus =CONFIG_DDR_CLK_FREQ ; +#else sysInfo->freqDDRBus = sysclk; +#endif sysInfo->freqSystemBus *= (in_be32 (&gur->rcwsr[0 ]) >>25 ) &0x1f ; mem_pll_rat = (in_be32(&gur->rcwsr[0]) >>
Signature · 1 line
1.7.9.5