diff options
author | Stijn Tintel <stijn@linux-ipv6.be> | 2018-11-10 13:03:18 +0200 |
---|---|---|
committer | Stijn Tintel <stijn@linux-ipv6.be> | 2018-12-18 23:19:21 +0200 |
commit | f5919b65d4c671fd5083838c7a445f319f9a13c8 (patch) | |
tree | 2c791d2a5dea5bbbb0b85f86f74afce2647c0726 /target/linux/brcm2708/patches-4.14/950-0245-irqchip-bcm2836-Move-SMP-startup-code-to-arch-arm-v2.patch | |
parent | 822b4c3b250a254e74407056ccfd5c6aa38da162 (diff) | |
download | upstream-f5919b65d4c671fd5083838c7a445f319f9a13c8.tar.gz upstream-f5919b65d4c671fd5083838c7a445f319f9a13c8.tar.bz2 upstream-f5919b65d4c671fd5083838c7a445f319f9a13c8.zip |
brcm2708: add kernel 4.14 support
Patch generation process:
- rebase rpi/rpi-4.14.y on v4.14.89 from linux-stable
- git format-patch v4.14.89
Patches skipped during rebase:
- lan78xx: Read MAC address from DT if present
- lan78xx: Enable LEDs and auto-negotiation
- Revert "softirq: Let ksoftirqd do its job"
- sc16is7xx: Fix for multi-channel stall
- lan78xx: Ignore DT MAC address if already valid
- lan78xx: Simple patch to prevent some crashes
- tcp_write_queue_purge clears all the SKBs in the write queue
- Revert "lan78xx: Simple patch to prevent some crashes"
- lan78xx: Connect phy early
- Arm: mm: ftrace: Only set text back to ro after kernel has been marked ro
- Revert "Revert "softirq: Let ksoftirqd do its job""
- ASoC: cs4265: SOC_SINGLE register value error fix
- Revert "ASoC: cs4265: SOC_SINGLE register value error fix"
- Revert "net: pskb_trim_rcsum() and CHECKSUM_COMPLETE are friends"
- Revert "Revert "net: pskb_trim_rcsum() and CHECKSUM_COMPLETE are friends""
Patches dropped after rebase:
- net: Add non-mainline source for rtl8192cu wlan
- net: Fix rtl8192cu build errors on other platforms
- brcm: adds support for BCM43341 wifi
- brcmfmac: Mute expected startup 'errors'
- ARM64: Fix build break for RTL8187/RTL8192CU wifi
- ARM64: Enable RTL8187/RTL8192CU wifi in build config
- This is the driver for Sony CXD2880 DVB-T2/T tuner + demodulator
- brcmfmac: add CLM download support
- brcmfmac: request_firmware_direct is quieter
- Sets the BCDC priority to constant 0
- brcmfmac: Disable ARP offloading when promiscuous
- brcmfmac: Avoid possible out-of-bounds read
- brcmfmac: Delete redundant length check
- net: rtl8192cu: Normalize indentation
- net: rtl8192cu: Fix implicit fallthrough warnings
- Revert "Sets the BCDC priority to constant 0"
- media: cxd2880: Bump to match 4.18.y version
- media: cxd2880-spi: Bump to match 4.18.y version
- Revert "mm: alloc_contig: re-allow CMA to compact FS pages"
- Revert "Revert "mm: alloc_contig: re-allow CMA to compact FS pages""
- cxd2880: CXD2880_SPI_DRV should select DVB_CXD2880 with
MEDIA_SUBDRV_AUTOSELECT
- 950-0421-HID-hid-bigbenff-driver-for-BigBen-Interactive-PS3OF.patch
- 950-0453-Add-hid-bigbenff-to-list-of-have_special_driver-for-.patch
Make I2C built-in instead of modular as in upstream defconfig; also the
easiest way to get MFD_ARIZONA enabled, which is required by
kmod-sound-soc-rpi-cirrus.
Add missing compatible strings from
4.9/960-add-rasbperrypi-compatible.patch, using upstream names for
compute modules.
Add extra patch to enable the LEDs on lan78xx.
Compile-tested: bcm2708, bcm2709, bcm2710 (with CONFIG_ALL_KMODS=y)
Runtime-tested: bcm2708, bcm2710
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
Diffstat (limited to 'target/linux/brcm2708/patches-4.14/950-0245-irqchip-bcm2836-Move-SMP-startup-code-to-arch-arm-v2.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.14/950-0245-irqchip-bcm2836-Move-SMP-startup-code-to-arch-arm-v2.patch | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.14/950-0245-irqchip-bcm2836-Move-SMP-startup-code-to-arch-arm-v2.patch b/target/linux/brcm2708/patches-4.14/950-0245-irqchip-bcm2836-Move-SMP-startup-code-to-arch-arm-v2.patch new file mode 100644 index 0000000000..5fc584f1b1 --- /dev/null +++ b/target/linux/brcm2708/patches-4.14/950-0245-irqchip-bcm2836-Move-SMP-startup-code-to-arch-arm-v2.patch @@ -0,0 +1,314 @@ +From 827d93b06aefb4fd03f9a6a0c3774a14fd5bd291 Mon Sep 17 00:00:00 2001 +From: Stefan Wahren <stefan.wahren@i2se.com> +Date: Sun, 6 Aug 2017 17:52:02 +0200 +Subject: [PATCH 245/454] irqchip: bcm2836: Move SMP startup code to arch/arm + (v2) + +commit 88bbe85dcd37aa2662c1a83962c15009fc12503e upstream. + +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 <stefan.wahren@i2se.com> +Fixes: 41f4988cc287 ("irqchip/bcm2836: Add SMP support for the 2836") +Tested-by: Eric Anholt <eric@anholt.net> +Acked-by: Marc Zyngier <marc.zyngier@arm.com> +--- + arch/arm/mach-bcm/Makefile | 5 ++ + arch/arm/mach-bcm/board_bcm2835.c | 5 +- + arch/arm/mach-bcm/platsmp.c | 35 ++++++++++++ + arch/arm/mach-bcm/platsmp.h | 10 ++++ + drivers/irqchip/irq-bcm2836.c | 82 +---------------------------- + include/linux/irqchip/irq-bcm2836.h | 70 ++++++++++++++++++++++++ + 6 files changed, 126 insertions(+), 81 deletions(-) + create mode 100644 arch/arm/mach-bcm/platsmp.h + create mode 100644 include/linux/irqchip/irq-bcm2836.h + +--- a/arch/arm/mach-bcm/Makefile ++++ b/arch/arm/mach-bcm/Makefile +@@ -43,6 +43,11 @@ endif + + # BCM2835 + obj-$(CONFIG_ARCH_BCM2835) += board_bcm2835.o ++ifeq ($(CONFIG_ARCH_BCM2835),y) ++ifeq ($(CONFIG_ARM),y) ++obj-$(CONFIG_SMP) += platsmp.o ++endif ++endif + + # BCM5301X + obj-$(CONFIG_ARCH_BCM_5301X) += bcm_5301x.o +--- a/arch/arm/mach-bcm/board_bcm2835.c ++++ b/arch/arm/mach-bcm/board_bcm2835.c +@@ -21,6 +21,7 @@ + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + ++#include "platsmp.h" + #include <linux/dma-mapping.h> + + static void __init bcm2835_init(void) +@@ -49,6 +50,7 @@ static const char * const bcm2835_compat + #endif + #ifdef CONFIG_ARCH_MULTI_V7 + "brcm,bcm2836", ++ "brcm,bcm2837", + #endif + NULL + }; +@@ -56,5 +58,6 @@ static const char * const bcm2835_compat + DT_MACHINE_START(BCM2835, "BCM2835") + .init_machine = bcm2835_init, + .init_early = bcm2835_init_early, +- .dt_compat = bcm2835_compat ++ .dt_compat = bcm2835_compat, ++ .smp = smp_ops(bcm2836_smp_ops), + MACHINE_END +--- 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 @@ out: + 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); ++ ++ iounmap(intc_base); ++ ++ return 0; ++} ++ + static const struct smp_operations kona_smp_ops __initconst = { + .smp_prepare_cpus = bcm_smp_prepare_cpus, + .smp_boot_secondary = kona_boot_secondary, +@@ -305,3 +335,8 @@ static const struct smp_operations nsp_s + .smp_boot_secondary = nsp_boot_secondary, + }; + CPU_METHOD_OF_DECLARE(bcm_smp_nsp, "brcm,bcm-nsp-smp", &nsp_smp_ops); ++ ++const struct smp_operations bcm2836_smp_ops __initconst = { ++ .smp_boot_secondary = bcm2836_boot_secondary, ++}; ++CPU_METHOD_OF_DECLARE(bcm_smp_bcm2836, "brcm,bcm2836-smp", &bcm2836_smp_ops); +--- /dev/null ++++ b/arch/arm/mach-bcm/platsmp.h +@@ -0,0 +1,10 @@ ++/* ++ * Copyright (C) 2017 Stefan Wahren <stefan.wahren@i2se.com> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation version 2. ++ * ++ */ ++ ++extern const struct smp_operations bcm2836_smp_ops; +--- a/drivers/irqchip/irq-bcm2836.c ++++ b/drivers/irqchip/irq-bcm2836.c +@@ -19,62 +19,9 @@ + #include <linux/of_irq.h> + #include <linux/irqchip.h> + #include <linux/irqdomain.h> +-#include <asm/exception.h> +- +-#define LOCAL_CONTROL 0x000 +-#define LOCAL_PRESCALER 0x008 ++#include <linux/irqchip/irq-bcm2836.h> + +-/* +- * The low 2 bits identify the CPU that the GPU IRQ goes to, and the +- * next 2 bits identify the CPU that the GPU FIQ goes to. +- */ +-#define LOCAL_GPU_ROUTING 0x00c +-/* When setting bits 0-3, enables PMU interrupts on that CPU. */ +-#define LOCAL_PM_ROUTING_SET 0x010 +-/* When setting bits 0-3, disables PMU interrupts on that CPU. */ +-#define LOCAL_PM_ROUTING_CLR 0x014 +-/* +- * The low 4 bits of this are the CPU's timer IRQ enables, and the +- * next 4 bits are the CPU's timer FIQ enables (which override the IRQ +- * bits). +- */ +-#define LOCAL_TIMER_INT_CONTROL0 0x040 +-/* +- * The low 4 bits of this are the CPU's per-mailbox IRQ enables, and +- * the next 4 bits are the CPU's per-mailbox FIQ enables (which +- * override the IRQ bits). +- */ +-#define LOCAL_MAILBOX_INT_CONTROL0 0x050 +-/* +- * The CPU's interrupt status register. Bits are defined by the the +- * LOCAL_IRQ_* bits below. +- */ +-#define LOCAL_IRQ_PENDING0 0x060 +-/* Same status bits as above, but for FIQ. */ +-#define LOCAL_FIQ_PENDING0 0x070 +-/* +- * Mailbox write-to-set bits. There are 16 mailboxes, 4 per CPU, and +- * these bits are organized by mailbox number and then CPU number. We +- * use mailbox 0 for IPIs. The mailbox's interrupt is raised while +- * any bit is set. +- */ +-#define LOCAL_MAILBOX0_SET0 0x080 +-#define LOCAL_MAILBOX3_SET0 0x08c +-/* Mailbox write-to-clear bits. */ +-#define LOCAL_MAILBOX0_CLR0 0x0c0 +-#define LOCAL_MAILBOX3_CLR0 0x0cc +- +-#define LOCAL_IRQ_CNTPSIRQ 0 +-#define LOCAL_IRQ_CNTPNSIRQ 1 +-#define LOCAL_IRQ_CNTHPIRQ 2 +-#define LOCAL_IRQ_CNTVIRQ 3 +-#define LOCAL_IRQ_MAILBOX0 4 +-#define LOCAL_IRQ_MAILBOX1 5 +-#define LOCAL_IRQ_MAILBOX2 6 +-#define LOCAL_IRQ_MAILBOX3 7 +-#define LOCAL_IRQ_GPU_FAST 8 +-#define LOCAL_IRQ_PMU_FAST 9 +-#define LAST_IRQ LOCAL_IRQ_PMU_FAST ++#include <asm/exception.h> + + struct bcm2836_arm_irqchip_intc { + struct irq_domain *domain; +@@ -240,27 +187,6 @@ static int bcm2836_cpu_dying(unsigned in + cpu); + return 0; + } +- +-#ifdef CONFIG_ARM +-static int __init bcm2836_smp_boot_secondary(unsigned int cpu, +- struct task_struct *idle) +-{ +- unsigned long secondary_startup_phys = +- (unsigned long)virt_to_phys((void *)secondary_startup); +- +- writel(secondary_startup_phys, +- intc.base + LOCAL_MAILBOX3_SET0 + 16 * cpu); +- +- dsb(sy); /* Ensure write has completed before waking the other CPUs */ +- sev(); +- +- return 0; +-} +- +-static const struct smp_operations bcm2836_smp_ops __initconst = { +- .smp_boot_secondary = bcm2836_smp_boot_secondary, +-}; +-#endif + #endif + + static const struct irq_domain_ops bcm2836_arm_irqchip_intc_ops = { +@@ -277,10 +203,6 @@ bcm2836_arm_irqchip_smp_init(void) + bcm2836_cpu_dying); + + set_smp_cross_call(bcm2836_arm_irqchip_send_ipi); +- +-#ifdef CONFIG_ARM +- smp_set_ops(&bcm2836_smp_ops); +-#endif + #endif + } + +--- /dev/null ++++ b/include/linux/irqchip/irq-bcm2836.h +@@ -0,0 +1,70 @@ ++/* ++ * Root interrupt controller for the BCM2836 (Raspberry Pi 2). ++ * ++ * Copyright 2015 Broadcom ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++#define LOCAL_CONTROL 0x000 ++#define LOCAL_PRESCALER 0x008 ++ ++/* ++ * The low 2 bits identify the CPU that the GPU IRQ goes to, and the ++ * next 2 bits identify the CPU that the GPU FIQ goes to. ++ */ ++#define LOCAL_GPU_ROUTING 0x00c ++/* When setting bits 0-3, enables PMU interrupts on that CPU. */ ++#define LOCAL_PM_ROUTING_SET 0x010 ++/* When setting bits 0-3, disables PMU interrupts on that CPU. */ ++#define LOCAL_PM_ROUTING_CLR 0x014 ++/* ++ * The low 4 bits of this are the CPU's timer IRQ enables, and the ++ * next 4 bits are the CPU's timer FIQ enables (which override the IRQ ++ * bits). ++ */ ++#define LOCAL_TIMER_INT_CONTROL0 0x040 ++/* ++ * The low 4 bits of this are the CPU's per-mailbox IRQ enables, and ++ * the next 4 bits are the CPU's per-mailbox FIQ enables (which ++ * override the IRQ bits). ++ */ ++#define LOCAL_MAILBOX_INT_CONTROL0 0x050 ++/* ++ * The CPU's interrupt status register. Bits are defined by the the ++ * LOCAL_IRQ_* bits below. ++ */ ++#define LOCAL_IRQ_PENDING0 0x060 ++/* Same status bits as above, but for FIQ. */ ++#define LOCAL_FIQ_PENDING0 0x070 ++/* ++ * Mailbox write-to-set bits. There are 16 mailboxes, 4 per CPU, and ++ * these bits are organized by mailbox number and then CPU number. We ++ * use mailbox 0 for IPIs. The mailbox's interrupt is raised while ++ * any bit is set. ++ */ ++#define LOCAL_MAILBOX0_SET0 0x080 ++#define LOCAL_MAILBOX3_SET0 0x08c ++/* Mailbox write-to-clear bits. */ ++#define LOCAL_MAILBOX0_CLR0 0x0c0 ++#define LOCAL_MAILBOX3_CLR0 0x0cc ++ ++#define LOCAL_IRQ_CNTPSIRQ 0 ++#define LOCAL_IRQ_CNTPNSIRQ 1 ++#define LOCAL_IRQ_CNTHPIRQ 2 ++#define LOCAL_IRQ_CNTVIRQ 3 ++#define LOCAL_IRQ_MAILBOX0 4 ++#define LOCAL_IRQ_MAILBOX1 5 ++#define LOCAL_IRQ_MAILBOX2 6 ++#define LOCAL_IRQ_MAILBOX3 7 ++#define LOCAL_IRQ_GPU_FAST 8 ++#define LOCAL_IRQ_PMU_FAST 9 ++#define LAST_IRQ LOCAL_IRQ_PMU_FAST |