1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * Copyright 2019 Broadcom Ltd.
7 #include <asm/arch/cpu.h>
10 #if defined(CONFIG_BCMBCA_DDRC)
11 #include <asm/arch/ddr.h>
13 #if defined(CONFIG_BCMBCA_PMC)
15 #include "asm/arch/BPCM.h"
17 #include "tpl_params.h"
19 #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
21 static void enable_ts0_couner(void)
23 BIUCFG
->ts0_ctrl
.CNTCR
|= 0x1;
26 static void enable_upper_memory_access(void)
28 /* enable the 8G to 16G address range for memc */
29 BIUCFG
->bac
.bac_cciaddr
= 0x55550055;
30 CCI500
->ctrl_ovr
|= (1 << 29);
33 #elif defined(CONFIG_TPL_BUILD)
34 static void cci500_enable(void)
36 /*Enable access from E2 and below */
37 CCI500
->secr_acc
|= SECURE_ACCESS_UNSECURE_ENABLE
;
40 static void enable_ns_access(void)
42 BIUCFG
->bac
.bac_permission
|= 0x33; // Linux access to BAC_CPU_THERM_TEMP
45 static void disable_memc_sram(void)
47 uint32_t addr
= MEMC_BASE
+ mc2_afx_sram_match_cfg_sram_start_addr_hi
;
49 writel(readl(addr
)&~0x80000000, addr
);
52 static void setup_ubus_rangechk(void)
54 /* Size in MB. First 2GB is set up by default */
55 int size_left
= tplparams
->ddr_size
- 2048;
56 int size
, size_bit
, i
= 1;
58 uint64_t addr
= PHYS_SDRAM_2
;
60 uint64_t addr
= 0x100000000UL
;
63 /* Fix the default of RC0 to only enable lower 2G memory for ubus master */
64 UBUS4_RANGE_CHK_SETUP
->cfg
[0].base
= 0x13;
66 /* setup the second range check for the top DDR region */
67 while (size_left
> 0 && i
< 16) {
68 /* each range checker can support up to 4GB size */
69 if (size_left
> 4096 )
75 size
= (size
<< 8); /* MB to # of 4KB */
82 UBUS4_RANGE_CHK_SETUP
->cfg
[i
].control
= 0x1f0;
83 UBUS4_RANGE_CHK_SETUP
->cfg
[i
].srcpid
[0] = 0xffffffff;
84 UBUS4_RANGE_CHK_SETUP
->cfg
[i
].seclev
= 0xffffffff;
85 UBUS4_RANGE_CHK_SETUP
->cfg
[i
].base
= (addr
&0xffffffe0) | size_bit
;
86 UBUS4_RANGE_CHK_SETUP
->cfg
[i
].base_up
= addr
>> 32;
88 addr
+= 4096UL << size_bit
;
95 #if !defined(CONFIG_SPL_BUILD)
96 void print_chipinfo(void)
98 unsigned int chipId
= (PERF
->RevID
& CHIP_ID_MASK
) >> CHIP_ID_SHIFT
;
99 unsigned int revId
= PERF
->RevID
& REV_ID_MASK
;
100 printf("Chip ID: BCM%X_%X\n",chipId
,revId
);
104 #if defined(CONFIG_BCMBCA_PMC)
105 void boost_cpu_clock(void)
107 printf("set cpu freq to 2000MHz\n");
109 pll_ch_freq_set(PMB_ADDR_BIU_PLL
, 1, 4000/800); // raise ACEBIU clock rate to 800 MHz
112 int set_cpu_freq(int freqMHz
)
116 if( freqMHz
> 2000 || freqMHz
< 400 )
118 printf("%dMHz is not supported\n", freqMHz
);
122 /* VCO at 4GHz, mdiv = Fvco/target frequency */
125 pll_ch_freq_set(PMB_ADDR_BIU_PLL
, 0, mdiv
);
131 static int reset_plls(void)
133 /* Software workaround for non-resetting eMMC PLL */
134 pll_ch_reset(PMB_ADDR_BIU_PLL
, 5, PLLBPCMRegOffset(ch45_cfg
));
138 int arch_cpu_init(void)
140 #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
142 #if defined(CONFIG_BCMBCA_DDRC)
143 spl_ddrinit_prepare();
145 enable_upper_memory_access();
146 /* enable unalgined access */
147 set_sctlr(get_sctlr() & ~CR_A
);
150 #if defined(CONFIG_TPL_BUILD)
153 setup_ubus_rangechk();
161 int bcmbca_get_boot_device(void)
163 if ((MISC
->miscStrapBus
&MISC_STRAP_BUS_BOOT_SEL_NAND_MASK
) == MISC_STRAP_BUS_BOOT_NAND
)
164 return BOOT_DEVICE_NAND
;
166 if ((MISC
->miscStrapBus
&MISC_STRAP_BUS_BOOT_SEL_MASK
) == MISC_STRAP_BUS_BOOT_SPI_NAND
)
167 return BOOT_DEVICE_SPI
;
169 if ((MISC
->miscStrapBus
&MISC_STRAP_BUS_BOOT_SEL_MASK
) == MISC_STRAP_BUS_BOOT_EMMC
)
170 return BOOT_DEVICE_MMC1
;
172 printf("Error: boot_sel straps are not set correctly\n");
174 return BOOT_DEVICE_NONE
;
177 #if !defined(CONFIG_TPL_ATF)
178 void boot_secondary_cpu(unsigned long vector
)
180 uint32_t cpu
, nr_cpus
= 4;
181 ARM_CONTROL_REG ctrl_reg
;
182 uint64_t rvbar
= vector
;
184 printf("boot secondary cpu from 0x%lx\n", vector
);
187 while (cpu
< nr_cpus
) {
190 BIUCFG
->cluster
[0].rvbar_addr
[cpu
] = rvbar
;
191 stat
= PowerOnDevice(PMB_ADDR_ORION_CPU0
+ cpu
);
192 if (stat
!= kPMC_NO_ERROR
)
193 printf("failed to power on secondary cpu %d - sts %d\n", cpu
, stat
);
195 stat
= ReadBPCMRegister(PMB_ADDR_BIU_BPCM
, ARMBPCMRegOffset(arm_control
), &ctrl_reg
.Reg32
);
196 ctrl_reg
.Bits
.cpu_reset_n
&= ~(0x1 << cpu
);
197 stat
|= WriteBPCMRegister(PMB_ADDR_BIU_BPCM
, ARMBPCMRegOffset(arm_control
), ctrl_reg
.Reg32
);
198 if (stat
!= kPMC_NO_ERROR
)
199 printf("failed to boot secondary cpu %d - sts %d\n", cpu
, stat
);