Thread (1 message) 1 message, 1 author, 2017-08-07

[PATCH 3/3] irqchip: bcm2836: Move SMP startup code to arch/arm

From: Stefan Wahren <hidden>
Date: 2017-08-07 09:04:30
Also in: linux-devicetree

Am 07.08.2017 um 09:47 schrieb Phil Elwell:
Hi Stefan,

On 06/08/2017 23:32, Stefan Wahren wrote:
quoted
In order to easily provide SMP for BCM2837 on 32-bit and 64-bit
the SMP startup code was placed in irq-bcm2836. That's not the
right approach. So move this code where it belongs.

Signed-off-by: Stefan Wahren <redacted>
Fixes: 41f4988cc287 ("irqchip/bcm2836: Add SMP support for the 2836")
---
 arch/arm/mach-bcm/Makefile          |  3 ++
 arch/arm/mach-bcm/platsmp.c         | 35 ++++++++++++++++
 drivers/irqchip/irq-bcm2836.c       | 79 +------------------------------------
 include/linux/irqchip/irq-bcm2836.h | 70 ++++++++++++++++++++++++++++++++
 4 files changed, 110 insertions(+), 77 deletions(-)
 create mode 100644 include/linux/irqchip/irq-bcm2836.h
diff --git a/arch/arm/mach-bcm/Makefile b/arch/arm/mach-bcm/Makefile
index 980f585..637cd9e 100644
--- a/arch/arm/mach-bcm/Makefile
+++ b/arch/arm/mach-bcm/Makefile
@@ -43,6 +43,9 @@ endif
 
 # BCM2835
 obj-$(CONFIG_ARCH_BCM2835)	+= board_bcm2835.o
+ifeq ($(CONFIG_ARCH_BCM2835),y)
+obj-$(CONFIG_SMP)		+= platsmp.o
+endif
 
 # BCM5301X
 obj-$(CONFIG_ARCH_BCM_5301X)	+= bcm_5301x.o
diff --git a/arch/arm/mach-bcm/platsmp.c b/arch/arm/mach-bcm/platsmp.c
index 9e3f275..3fa1a99 100644
--- a/arch/arm/mach-bcm/platsmp.c
+++ b/arch/arm/mach-bcm/platsmp.c
@@ -17,6 +17,7 @@
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/irqchip/irq-bcm2836.h>
 #include <linux/jiffies.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
@@ -287,6 +288,35 @@ static int nsp_boot_secondary(unsigned int cpu, struct task_struct *idle)
 	return ret;
 }
 
+static int bcm2836_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+	void __iomem *intc_base;
+	struct device_node *dn;
+	char *name;
+
+	name = "brcm,bcm2836-l1-intc";
+	dn = of_find_compatible_node(NULL, NULL, name);
+	if (!dn) {
+		pr_err("unable to find intc node\n");
+		return -ENODEV;
+	}
+
+	intc_base = of_iomap(dn, 0);
+	of_node_put(dn);
+
+	if (!intc_base) {
+		pr_err("unable to remap intc base register\n");
+		return -ENOMEM;
+	}
+
+	writel(virt_to_phys(secondary_startup),
+	       intc_base + LOCAL_MAILBOX3_SET0 + 16 * cpu);
I was going to upstream the patch to add dsb+sev today, but now the goalposts are
(literally) moving. Should I produce two patchsets - one for before your patch is
appied, and one for after - or will you add the required lines here?:
 
+       dsb(sy); /* Ensure write has completed before waking the other CPUs */
+       sev();
+
Since Marc make it clear that he won't accept any patches before this
cleanup, please base your patch on top of this repo:

https://github.com/anholt/linux/commits/bcm2835-soc-smp-cleanup

Btw Eric reported problems [1] about this change, is this fixed now?

[1] -
https://github.com/raspberrypi/linux/issues/1989#issuecomment-318180597
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help