mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2025-12-10 07:44:53 +01:00
ipq807x: Move psci related multicore code to board file
PSCI is only supported in HK. Change-Id: I83205697d4efdc74c9700b70d807d175b8d7f545 Signed-off-by: Santan Kumar <santank@codeaurora.org>
This commit is contained in:
parent
6e4d2c720d
commit
9cb02c6c60
3 changed files with 45 additions and 42 deletions
|
|
@ -23,13 +23,6 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||
#define SECONDARY_CORE_STACKSZ (8 * 1024)
|
||||
#define CPU_POWER_DOWN (1 << 16)
|
||||
|
||||
#define ARM_PSCI_TZ_FN_BASE 0x84000000
|
||||
#define ARM_PSCI_TZ_FN(n) (ARM_PSCI_TZ_FN_BASE + (n))
|
||||
|
||||
#define ARM_PSCI_TZ_FN_CPU_OFF ARM_PSCI_TZ_FN(2)
|
||||
#define ARM_PSCI_TZ_FN_CPU_ON ARM_PSCI_TZ_FN(3)
|
||||
#define ARM_PSCI_TZ_FN_AFFINITY_INFO ARM_PSCI_TZ_FN(4)
|
||||
|
||||
struct cpu_entry_arg {
|
||||
void *stack_ptr;
|
||||
volatile void *gd_ptr;
|
||||
|
|
@ -40,17 +33,10 @@ struct cpu_entry_arg {
|
|||
void *stack_top_ptr;
|
||||
};
|
||||
|
||||
extern unsigned int __invoke_psci_fn_smc(unsigned int, unsigned int,
|
||||
unsigned int, unsigned int);
|
||||
extern void secondary_cpu_init(void);
|
||||
|
||||
static struct cpu_entry_arg core[NR_CPUS - 1];
|
||||
|
||||
void psci_cpu_off(unsigned int state)
|
||||
{
|
||||
__invoke_psci_fn_smc(ARM_PSCI_TZ_FN_CPU_OFF, state, 0, 0);
|
||||
}
|
||||
|
||||
asmlinkage void secondary_core_entry(char *argv, int *cmd_complete,
|
||||
int *cmd_result)
|
||||
{
|
||||
|
|
@ -66,30 +52,7 @@ asmlinkage void secondary_core_entry(char *argv, int *cmd_complete,
|
|||
*cmd_complete = 1;
|
||||
|
||||
state = CPU_POWER_DOWN;
|
||||
psci_cpu_off(state);
|
||||
}
|
||||
|
||||
int psci_cpu_on(unsigned int cpuid, unsigned int entry, unsigned int arg)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __invoke_psci_fn_smc(ARM_PSCI_TZ_FN_CPU_ON, cpuid, entry, arg);
|
||||
if (err) {
|
||||
printf("Enabling CPU%d via psci failed!\n", cpuid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Enabled CPU%d via psci successfully!\n", cpuid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_psci_cpu_off(unsigned int cpuid)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __invoke_psci_fn_smc(ARM_PSCI_TZ_FN_AFFINITY_INFO, cpuid, 0, 0);
|
||||
|
||||
return err;
|
||||
bring_secondary_core_down(state);
|
||||
}
|
||||
|
||||
int do_runmulticore(cmd_tbl_t *cmdtp,
|
||||
|
|
@ -137,10 +100,10 @@ int do_runmulticore(cmd_tbl_t *cmdtp,
|
|||
for (i = 1; i < argc; i++) {
|
||||
printf("Scheduling Core %d\n", i);
|
||||
delay = 0;
|
||||
ret = psci_cpu_on(i, (unsigned int)secondary_cpu_init,
|
||||
ret = bring_sec_core_up(i, (unsigned int)secondary_cpu_init,
|
||||
(unsigned int)&(core[i - 1]));
|
||||
if (ret) {
|
||||
panic("PSCI failed for core %d\n",i);
|
||||
panic("Some problem to getting core %d up\n", i);
|
||||
}
|
||||
|
||||
while ((delay < 5) && (!(core[i - 1].cpu_up))) {
|
||||
|
|
@ -187,7 +150,7 @@ int do_runmulticore(cmd_tbl_t *cmdtp,
|
|||
while (core_on_status) {
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (core_on_status & (BIT(i - 1))) {
|
||||
if (is_psci_cpu_off(i) == 1) {
|
||||
if (is_secondary_core_off(i) == 1) {
|
||||
printf("core %d powered off\n", i);
|
||||
core_on_status &= (~BIT((i - 1)));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ qca_mmc mmc_host;
|
|||
struct sdhci_host mmc_host;
|
||||
#endif
|
||||
|
||||
extern asmlinkage void __invoke_psci_fn_smc(unsigned long, unsigned long, unsigned long, unsigned long);
|
||||
|
||||
extern loff_t board_env_offset;
|
||||
extern loff_t board_env_range;
|
||||
|
|
@ -1090,3 +1089,31 @@ int set_uuid_bootargs(char *boot_args, char *part_name, int buflen, bool gpt_fla
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int is_secondary_core_off(unsigned int cpuid)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __invoke_psci_fn_smc(ARM_PSCI_TZ_FN_AFFINITY_INFO, cpuid, 0, 0);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void bring_secondary_core_down(unsigned int state)
|
||||
{
|
||||
__invoke_psci_fn_smc(ARM_PSCI_TZ_FN_CPU_OFF, state, 0, 0);
|
||||
}
|
||||
|
||||
int bring_sec_core_up(unsigned int cpuid, unsigned int entry, unsigned int arg)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = __invoke_psci_fn_smc(ARM_PSCI_TZ_FN_CPU_ON, cpuid, entry, arg);
|
||||
if (err) {
|
||||
printf("Enabling CPU%d via psci failed!\n", cpuid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Enabled CPU%d via psci successfully!\n", cpuid);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,6 +210,19 @@
|
|||
#define USB3_PCS_TXDEEMPH_M6DB_V0 0x824
|
||||
#define USB3_PCS_TXDEEMPH_M3P5DB_V0 0x828
|
||||
|
||||
#define SECONDARY_CORE_STACKSZ (8 * 1024)
|
||||
#define CPU_POWER_DOWN (1 << 16)
|
||||
|
||||
#define ARM_PSCI_TZ_FN_BASE 0x84000000
|
||||
#define ARM_PSCI_TZ_FN(n) (ARM_PSCI_TZ_FN_BASE + (n))
|
||||
|
||||
#define ARM_PSCI_TZ_FN_CPU_OFF ARM_PSCI_TZ_FN(2)
|
||||
#define ARM_PSCI_TZ_FN_CPU_ON ARM_PSCI_TZ_FN(3)
|
||||
#define ARM_PSCI_TZ_FN_AFFINITY_INFO ARM_PSCI_TZ_FN(4)
|
||||
|
||||
unsigned int __invoke_psci_fn_smc(unsigned int, unsigned int,
|
||||
unsigned int, unsigned int);
|
||||
|
||||
struct smem_ram_ptn {
|
||||
char name[16];
|
||||
unsigned long long start;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue