Commit 9e9b0cf9 authored by Harith G's avatar Harith G Committed by Russell King (Oracle)
Browse files

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: default avatarHarith George <harith.g@alifsemi.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
parent ed6cbe6e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -411,7 +411,11 @@ ENTRY(secondary_startup)
	/*
	 * 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
#endif
	mov_l	r12, __secondary_switched
	ldrd	r4, r5, [r3, #0]		@ get secondary_data.pgdir
ARM_BE8(eor	r4, r4, r5)			@ Swap r5 and r4 in BE:
+7 −0
Original line number Diff line number Diff line
@@ -45,8 +45,15 @@ extern void secondary_startup(void);
static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
{
	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),
					virt_to_idmap(&secondary_startup));
#endif
	return -ENODEV;
}

+7 −0
Original line number Diff line number Diff line
@@ -84,8 +84,15 @@ static void identity_mapping_add(pgd_t *pgd, const char *text_start,
	unsigned long addr, end;
	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);
	end = virt_to_idmap(text_end);
#endif
	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;