ARM: 9420/1: smp: Fix SMP for xip kernels
Fix the physical address calculation of the following to get smp working on xip kernels. - secondary_data needed for secondary cpu bootup. - secondary_startup address passed through psci. - identity mapped code region needed for enabling mmu for secondary cpus. Signed-off-by: Harith George <harith.g@alifsemi.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
This commit is contained in:
parent
ed6cbe6e55
commit
9e9b0cf931
@ -411,7 +411,11 @@ ENTRY(secondary_startup)
|
|||||||
/*
|
/*
|
||||||
* Use the page tables supplied from __cpu_up.
|
* Use the page tables supplied from __cpu_up.
|
||||||
*/
|
*/
|
||||||
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
|
ldr r3, =(secondary_data + PLAT_PHYS_OFFSET - PAGE_OFFSET)
|
||||||
|
#else
|
||||||
adr_l r3, secondary_data
|
adr_l r3, secondary_data
|
||||||
|
#endif
|
||||||
mov_l r12, __secondary_switched
|
mov_l r12, __secondary_switched
|
||||||
ldrd r4, r5, [r3, #0] @ get secondary_data.pgdir
|
ldrd r4, r5, [r3, #0] @ get secondary_data.pgdir
|
||||||
ARM_BE8(eor r4, r4, r5) @ Swap r5 and r4 in BE:
|
ARM_BE8(eor r4, r4, r5) @ Swap r5 and r4 in BE:
|
||||||
|
@ -45,8 +45,15 @@ extern void secondary_startup(void);
|
|||||||
static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||||
{
|
{
|
||||||
if (psci_ops.cpu_on)
|
if (psci_ops.cpu_on)
|
||||||
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
|
return psci_ops.cpu_on(cpu_logical_map(cpu),
|
||||||
|
((phys_addr_t)(&secondary_startup)
|
||||||
|
- XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
|
||||||
|
+ CONFIG_XIP_PHYS_ADDR));
|
||||||
|
#else
|
||||||
return psci_ops.cpu_on(cpu_logical_map(cpu),
|
return psci_ops.cpu_on(cpu_logical_map(cpu),
|
||||||
virt_to_idmap(&secondary_startup));
|
virt_to_idmap(&secondary_startup));
|
||||||
|
#endif
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,8 +84,15 @@ static void identity_mapping_add(pgd_t *pgd, const char *text_start,
|
|||||||
unsigned long addr, end;
|
unsigned long addr, end;
|
||||||
unsigned long next;
|
unsigned long next;
|
||||||
|
|
||||||
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
|
addr = (phys_addr_t)(text_start) - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
|
||||||
|
+ CONFIG_XIP_PHYS_ADDR;
|
||||||
|
end = (phys_addr_t)(text_end) - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
|
||||||
|
+ CONFIG_XIP_PHYS_ADDR;
|
||||||
|
#else
|
||||||
addr = virt_to_idmap(text_start);
|
addr = virt_to_idmap(text_start);
|
||||||
end = virt_to_idmap(text_end);
|
end = virt_to_idmap(text_end);
|
||||||
|
#endif
|
||||||
pr_info("Setting up static identity map for 0x%lx - 0x%lx\n", addr, end);
|
pr_info("Setting up static identity map for 0x%lx - 0x%lx\n", addr, end);
|
||||||
|
|
||||||
prot |= PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF;
|
prot |= PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AF;
|
||||||
|
Loading…
Reference in New Issue
Block a user