This pull request contains SoC changes for Broadcom ARM-based SoCs:

- Chris prepares support for the BCM23550 by removing reset code in the
   BCM21664 machine code since a proper drivers/power/reset driver is provided and
   shared, he then adds a machine entry point for BCM23550 and updates the SMP
   code to bring-up the secondary cores on BCM23550
 
 - Ben fixes a warning in the Kona L2 SMC code by adding the missing include file
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJXY1beAAoJEIfQlpxEBwcEFKYQAN0/ba6mCFmr8DLthDJkqeMt
 yrVeVRB1H6HYnt2cqaG/tbEeZZ+d+S4PhyRbHtAQ4cjgUq0qw8HNc/paN68K4pj0
 JuY/52T2mL9WY9f96VBOAnmyRGC2YjTO3xC902BHOVBqQnYzHZm/ki9nxePo8F98
 JTAsZuTR+NthfWuwFAAhI6xRws8d9jLXsirPPld6iuRo48/3UoxnHIzz+dQJghIy
 EVqXf3ckL09LYZqvY6dagcWQxR0RC80Z2hHska4uRirfmPjFKXYM6NvftKu3YaKz
 cRC0bE6t4WR7YX3LCLYWMers7rnElhfqpgvwJVvYnnwDTpc7469CF9ql2IJSM+Dj
 8DDX9pHWwNZTaHglmigIW8inaOS3ChtOb+V5nZxAsaSh5h9W99JTbpnFjqgvBZ0x
 uHHwsiv6xWDDujeD5lF6+VcVekk1WGoJ8ALaa4MBxdasljw9SyRpb3q8PWXAcbk2
 WMPBhED6OdfRuQ/Gf2466LcM1LBkd0nL5mYUZtN/py5B2xtvHgmee2H9AZQQlHhb
 DhmXpjG4gV5ySInJs30HrK1Z6iELa+hI3gouhsqCCo4Tj+EK7/yGRncUZ02tHjEk
 Tnmf3tepkX1paukYriVwLwRtuf3KkJJH5U+P4wRR/vREewbIy9iqaQFTg2IZUJr9
 Mh4vZRnzjw0Qgjy0M4Dj
 =zoLK
 -----END PGP SIGNATURE-----

Merge tag 'arm-soc/for-4.8/soc' of http://github.com/Broadcom/stblinux into next/soc

This pull request contains SoC changes for Broadcom ARM-based SoCs:

- Chris prepares support for the BCM23550 by removing reset code in the
  BCM21664 machine code since a proper drivers/power/reset driver is provided and
  shared, he then adds a machine entry point for BCM23550 and updates the SMP
  code to bring-up the secondary cores on BCM23550

- Ben fixes a warning in the Kona L2 SMC code by adding the missing include file

* tag 'arm-soc/for-4.8/soc' of http://github.com/Broadcom/stblinux:
  ARM: bcm: fix missing include of kona_l2_cache.h
  ARM: BCM23550 SMP support
  ARM: Add support for Broadcom BCM23550 SoC
  ARM: bcm21664: Remove reset code

Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
Olof Johansson 2016-06-19 22:42:25 -07:00
commit 8739a229b6
6 changed files with 98 additions and 45 deletions

View File

@ -111,9 +111,17 @@ config ARCH_BCM_21664
Enable support for the BCM21664 family, which includes Enable support for the BCM21664 family, which includes
BCM21663 and BCM21664 variants. BCM21663 and BCM21664 variants.
config ARCH_BCM_23550
bool "Broadcom BCM23550 SoC"
depends on ARCH_MULTI_V7
select ARCH_BCM_MOBILE
select HAVE_SMP
help
Enable support for the BCM23550.
config ARCH_BCM_MOBILE_L2_CACHE config ARCH_BCM_MOBILE_L2_CACHE
bool "Broadcom mobile SoC level 2 cache support" bool "Broadcom mobile SoC level 2 cache support"
depends on ARCH_BCM_MOBILE depends on ARCH_BCM_281XX || ARCH_BCM_21664
default y default y
select CACHE_L2X0 select CACHE_L2X0
select ARCH_BCM_MOBILE_SMC select ARCH_BCM_MOBILE_SMC
@ -128,7 +136,7 @@ config ARCH_BCM_MOBILE_SMP
select HAVE_ARM_SCU select HAVE_ARM_SCU
select ARM_ERRATA_764369 select ARM_ERRATA_764369
help help
SMP support for the BCM281XX and BCM21664 SoC families. SMP support for the BCM281XX, BCM21664 and BCM23550 SoC families.
Provided as an option so SMP support for SoCs of this type Provided as an option so SMP support for SoCs of this type
can be disabled for an SMP-enabled kernel. can be disabled for an SMP-enabled kernel.

View File

@ -26,7 +26,10 @@ obj-$(CONFIG_ARCH_BCM_281XX) += board_bcm281xx.o
# BCM21664 # BCM21664
obj-$(CONFIG_ARCH_BCM_21664) += board_bcm21664.o obj-$(CONFIG_ARCH_BCM_21664) += board_bcm21664.o
# BCM281XX and BCM21664 SMP support # BCM23550
obj-$(CONFIG_ARCH_BCM_23550) += board_bcm23550.o
# BCM281XX, BCM21664 and BCM23550 SMP support
obj-$(CONFIG_ARCH_BCM_MOBILE_SMP) += platsmp.o obj-$(CONFIG_ARCH_BCM_MOBILE_SMP) += platsmp.o
# BCM281XX and BCM21664 L2 cache control # BCM281XX and BCM21664 L2 cache control

View File

@ -11,53 +11,12 @@
* GNU General Public License for more details. * GNU General Public License for more details.
*/ */
#include <linux/of_address.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/io.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include "kona_l2_cache.h" #include "kona_l2_cache.h"
#define RSTMGR_DT_STRING "brcm,bcm21664-resetmgr"
#define RSTMGR_REG_WR_ACCESS_OFFSET 0
#define RSTMGR_REG_CHIP_SOFT_RST_OFFSET 4
#define RSTMGR_WR_PASSWORD 0xa5a5
#define RSTMGR_WR_PASSWORD_SHIFT 8
#define RSTMGR_WR_ACCESS_ENABLE 1
static void bcm21664_restart(enum reboot_mode mode, const char *cmd)
{
void __iomem *base;
struct device_node *resetmgr;
resetmgr = of_find_compatible_node(NULL, NULL, RSTMGR_DT_STRING);
if (!resetmgr) {
pr_emerg("Couldn't find " RSTMGR_DT_STRING "\n");
return;
}
base = of_iomap(resetmgr, 0);
if (!base) {
pr_emerg("Couldn't map " RSTMGR_DT_STRING "\n");
return;
}
/*
* A soft reset is triggered by writing a 0 to bit 0 of the soft reset
* register. To write to that register we must first write the password
* and the enable bit in the write access enable register.
*/
writel((RSTMGR_WR_PASSWORD << RSTMGR_WR_PASSWORD_SHIFT) |
RSTMGR_WR_ACCESS_ENABLE,
base + RSTMGR_REG_WR_ACCESS_OFFSET);
writel(0, base + RSTMGR_REG_CHIP_SOFT_RST_OFFSET);
/* Wait for reset */
while (1);
}
static void __init bcm21664_init(void) static void __init bcm21664_init(void)
{ {
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
@ -71,6 +30,5 @@ static const char * const bcm21664_dt_compat[] = {
DT_MACHINE_START(BCM21664_DT, "BCM21664 Broadcom Application Processor") DT_MACHINE_START(BCM21664_DT, "BCM21664 Broadcom Application Processor")
.init_machine = bcm21664_init, .init_machine = bcm21664_init,
.restart = bcm21664_restart,
.dt_compat = bcm21664_dt_compat, .dt_compat = bcm21664_dt_compat,
MACHINE_END MACHINE_END

View File

@ -0,0 +1,25 @@
/*
* Copyright (C) 2016 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 version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/of_platform.h>
#include <asm/mach/arch.h>
static const char * const bcm23550_dt_compat[] = {
"brcm,bcm23550",
NULL,
};
DT_MACHINE_START(BCM23550_DT, "BCM23550 Broadcom Application Processor")
.dt_compat = bcm23550_dt_compat,
MACHINE_END

View File

@ -17,6 +17,7 @@
#include <asm/hardware/cache-l2x0.h> #include <asm/hardware/cache-l2x0.h>
#include "bcm_kona_smc.h" #include "bcm_kona_smc.h"
#include "kona_l2_cache.h"
void __init kona_l2_cache_init(void) void __init kona_l2_cache_init(void)
{ {

View File

@ -19,6 +19,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/smp.h> #include <linux/smp.h>
@ -255,6 +256,57 @@ static int kona_boot_secondary(unsigned int cpu, struct task_struct *idle)
return -ENXIO; return -ENXIO;
} }
/* Cluster Dormant Control command to bring CPU into a running state */
#define CDC_CMD 6
#define CDC_CMD_OFFSET 0
#define CDC_CMD_REG(cpu) (CDC_CMD_OFFSET + 4*(cpu))
/*
* BCM23550 has a Cluster Dormant Control block that keeps the core in
* idle state. A command needs to be sent to the block to bring the CPU
* into running state.
*/
static int bcm23550_boot_secondary(unsigned int cpu, struct task_struct *idle)
{
void __iomem *cdc_base;
struct device_node *dn;
char *name;
int ret;
/* Make sure a CDC node exists before booting the
* secondary core.
*/
name = "brcm,bcm23550-cdc";
dn = of_find_compatible_node(NULL, NULL, name);
if (!dn) {
pr_err("unable to find cdc node\n");
return -ENODEV;
}
cdc_base = of_iomap(dn, 0);
of_node_put(dn);
if (!cdc_base) {
pr_err("unable to remap cdc base register\n");
return -ENOMEM;
}
/* Boot the secondary core */
ret = kona_boot_secondary(cpu, idle);
if (ret)
goto out;
/* Bring this CPU to RUN state so that nIRQ nFIQ
* signals are unblocked.
*/
writel_relaxed(CDC_CMD, cdc_base + CDC_CMD_REG(cpu));
out:
iounmap(cdc_base);
return ret;
}
static int nsp_boot_secondary(unsigned int cpu, struct task_struct *idle) static int nsp_boot_secondary(unsigned int cpu, struct task_struct *idle)
{ {
int ret; int ret;
@ -283,6 +335,12 @@ static const struct smp_operations bcm_smp_ops __initconst = {
CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method", CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method",
&bcm_smp_ops); &bcm_smp_ops);
static const struct smp_operations bcm23550_smp_ops __initconst = {
.smp_boot_secondary = bcm23550_boot_secondary,
};
CPU_METHOD_OF_DECLARE(bcm_smp_bcm23550, "brcm,bcm23550",
&bcm23550_smp_ops);
static const struct smp_operations nsp_smp_ops __initconst = { static const struct smp_operations nsp_smp_ops __initconst = {
.smp_prepare_cpus = bcm_smp_prepare_cpus, .smp_prepare_cpus = bcm_smp_prepare_cpus,
.smp_boot_secondary = nsp_boot_secondary, .smp_boot_secondary = nsp_boot_secondary,