diff mbox

[v4,2/5] ARM: BCM: Clean up SMP support for Broadcom Kona

Message ID 1448987049-17041-3-git-send-email-kapilh@broadcom.com (mailing list archive)
State New, archived
Headers show

Commit Message

Kapil Hali Dec. 1, 2015, 4:24 p.m. UTC
These changes cleans up SMP implementaion for Broadcom's
Kona SoC which are required for handling SMP for iProc
family of SoCs at a single place for BCM NSP and BCM Kona.

Signed-off-by: Kapil Hali <kapilh@broadcom.com>
---
 arch/arm/boot/dts/bcm11351.dtsi |  2 +-
 arch/arm/boot/dts/bcm21664.dtsi |  2 +-
 arch/arm/mach-bcm/kona_smp.c    | 82 +++++++++++++++++++++++++++--------------
 3 files changed, 56 insertions(+), 30 deletions(-)

Comments

Florian Fainelli Dec. 1, 2015, 11:07 p.m. UTC | #1
On 01/12/15 08:24, Kapil Hali wrote:
> These changes cleans up SMP implementaion for Broadcom's
> Kona SoC which are required for handling SMP for iProc
> family of SoCs at a single place for BCM NSP and BCM Kona.
> 
> Signed-off-by: Kapil Hali <kapilh@broadcom.com>

Applied to soc/next, thanks!
Florian Fainelli Dec. 2, 2015, 1:54 a.m. UTC | #2
On 01/12/15 08:24, Kapil Hali wrote:
> These changes cleans up SMP implementaion for Broadcom's
> Kona SoC which are required for handling SMP for iProc
> family of SoCs at a single place for BCM NSP and BCM Kona.

FWIW, I gave this patch a try on a Capri board, and this still brings-up
the two CPUs successfully:

MMC read: dev # 0, block # 114688, count 32768 ...

100% (32768/32768 blocks)

32768 blocks read: OK

## Starting application at 0x80008000 ...

Uncompressing Linux... done, booting the kernel.

[    0.000000] Booting Linux on physical CPU 0x0

[    0.000000] Linux version 4.4.0-rc1-00005-ge49c96ed573e
(fainelli@fainelli-desktop) (gcc version 4.
8.5 (Broadcom stbgcc-4.8-1.4) ) #605 SMP Tue Dec 1 17:53:02 PST 2015

[    0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7),
cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing
instruction cache
[    0.000000] Machine model: BCM28155 AP board

[    0.000000] cma: Reserved 16 MiB at 0xbf000000

[    0.000000] Memory policy: Data cache writealloc

[    0.000000] PERCPU: Embedded 12 pages/cpu @ef7d3000 s18752 r8192
d22208 u49152
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.
Total pages: 260608
[    0.000000] Kernel command line: console=ttyS0,115200n8

[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)

[    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288
bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144
bytes)
[    0.000000] Memory: 1009696K/1048576K available (6384K kernel code,
279K rwdata, 2268K rodata, 4152
K init, 218K bss, 22496K reserved, 16384K cma-reserved, 245760K highmem)

[    0.000000] Virtual kernel memory layout:

[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)

[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)

[    0.000000]     vmalloc : 0xf0800000 - 0xff800000   ( 240 MB)

[    0.000000]     lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)

[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)

[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)

[    0.000000]       .text : 0xc0008000 - 0xc087b694   (8654 kB)

[    0.000000]       .init : 0xc087c000 - 0xc0c8a000   (4152 kB)

[    0.000000]       .data : 0xc0c8a000 - 0xc0ccfdf8   ( 280 kB)

[    0.000000]        .bss : 0xc0cd2000 - 0xc0d08bac   ( 219 kB)

[    0.000000] Hierarchical RCU implementation.

[    0.000000]  Build-time adjustment of leaf fanout to 32.

[    0.000000]  RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.

[    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=32,
nr_cpu_ids=2
[    0.000000] NR_IRQS:16 nr_irqs:16 16

[    0.000000] __ccu_wait_bit: slave_ccu/0x0484 bit 18 was never set

[    0.000000] __peri_clk_init: error initializing gate for bsc3

[    0.000000] Broadcom slave_ccu initialization had errors

[    0.000000] sched_clock: 32 bits at 1kHz, resolution 1000000ns, wraps
every 2147483647500000ns
[    0.000000] Console: colour dummy device 80x30

[    0.006000] Calibrating delay loop... 2383.87 BogoMIPS (lpj=1191936)

[    0.006000] pid_max: default: 32768 minimum: 301

[    0.006000] Mount-cache hash table entries: 2048 (order: 1, 8192
bytes)
[    0.006000] Mountpoint-cache hash table entries: 2048 (order: 1, 8192
bytes)
[    0.006000] CPU: Testing write buffer coherency: ok

[    0.006000] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000

[    0.006000] Setting up static identity map for 0x800082c0 -
0x80008318
[    0.015000] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001

[    0.015000] Brought up 2 CPUs

[    0.015000] SMP: Total of 2 processors activated (7200.76 BogoMIPS).

[    0.015000] CPU: All CPU(s) started in SVC mode.

[    0.015000] devtmpfs: initialized

[    0.016000] VFP support v0.3: implementor 41 architecture 3 part 30
variant 9 rev 4
[    0.016000] clocksource: jiffies: mask: 0xffffffff max_cycles:
0xffffffff, max_idle_ns: 19112604462
75000 ns

[    0.016000] pinctrl core: initialized pinctrl subsystem

[    0.017000] NET: Registered protocol family 16

[    0.017000] DMA: preallocated 256 KiB pool for atomic coherent
allocations
[    0.023000] cpuidle: using governor ladder

[    0.025000] cpuidle: using governor menu

[    0.026000] Kona Secure API initialized

[    0.026000] BCM-L2C-310 cache controller enabled, 16 ways, 512 kB

[    0.026000] BCM-L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x1e050000

[    0.026000] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1
watchpoint registers.
[    0.026000] hw-breakpoint: maximum watchpoint size is 4 bytes.

[    0.033000] SCSI subsystem initialized

[    0.033000] usbcore: registered new interface driver usbfs

[    0.033000] usbcore: registered new interface driver hub

[    0.033000] usbcore: registered new device driver usb

[    0.033000] Linux video capture interface: v2.00

[    0.033000] pps_core: LinuxPPS API ver. 1 registered

[    0.033000] pps_core: Software ver. 5.3.6 - Copyright 2005-2007
Rodolfo Giometti <giometti@linux.it
>

[    0.033000] PTP clock support registered

[    0.034000] Advanced Linux Sound Architecture Driver Initialized.

[    0.037000] NET: Registered protocol family 2

[    0.037000] TCP established hash table entries: 8192 (order: 3, 32768
bytes)
[    0.038000] TCP bind hash table entries: 8192 (order: 4, 65536 bytes)

[    0.038000] TCP: Hash tables configured (established 8192 bind 8192)

[    0.038000] UDP hash table entries: 512 (order: 2, 16384 bytes)

[    0.038000] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)

[    0.038000] NET: Registered protocol family 1

[    0.038000] RPC: Registered named UNIX socket transport module.

[    0.038000] RPC: Registered udp transport module.

[    0.038000] RPC: Registered tcp transport module.

[    0.038000] RPC: Registered tcp NFSv4.1 backchannel transport module.

[    0.114000] futex hash table entries: 512 (order: 3, 32768 bytes)

[    0.114000] squashfs: version 4.0 (2009/01/31) Phillip Lougher

[    0.114000] NFS: Registering the id_resolver key type

[    0.114000] Key type id_resolver registered

[    0.114000] Key type id_legacy registered

[    0.114000] nfs4filelayout_init: NFSv4 File Layout Driver
Registering...
[    0.114000] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.

[    0.114000] fuse init (API version 7.23)

[    0.115000] bounce: pool size: 64 pages

[    0.115000] Block layer SCSI generic (bsg) driver version 0.4 loaded
(major 252)
[    0.115000] io scheduler noop registered

[    0.115000] io scheduler deadline registered

[    0.115000] io scheduler cfq registered (default)

[    0.115000] bcm-kona-gpio 35003000.gpio: Setting up Kona GPIO

[    0.138000] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled

[    0.139000] console [ttyS0] disabled

[    0.139000] 3e000000.uart: ttyS0 at MMIO 0x3e000000 (irq = 17,
base_baud = 808290) is a 16550A
[    0.415000] console [ttyS0] enabled

[    0.421000] brd: module loaded

[    0.423000] loop: module loaded

[    0.424000] libphy: Fixed MDIO Bus: probed

[    0.425000] cnic: QLogic cnicDriver v2.5.22 (July 20, 2015)

[    0.426000] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k

[    0.427000] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.

[    0.428000] pegasus: v0.9.3 (2013/04/25), Pegasus/Pegasus II USB
Ethernet driver
[    0.429000] usbcore: registered new interface driver pegasus

[    0.430000] usbcore: registered new interface driver asix

[    0.431000] usbcore: registered new interface driver ax88179_178a

[    0.432000] usbcore: registered new interface driver cdc_ether

[    0.433000] usbcore: registered new interface driver cdc_ncm

[    0.434000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI)
Driver
[    0.435000] ehci-pci: EHCI PCI platform driver

[    0.436000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver

[    0.437000] ohci-pci: OHCI PCI platform driver

[    0.438000] usbcore: registered new interface driver usb-storage

[    0.439000] mousedev: PS/2 mouse device common for all mice

[    0.440000] i2c /dev entries driver

[    0.441000] bcm-kona-i2c 3e016000.i2c: device registered successfully

[    0.442000] bcm-kona-i2c 3e017000.i2c: device registered successfully

[    0.443000] bcm-kona-i2c 3e018000.i2c: device registered successfully

[    0.444000] bcm-kona-i2c 3500d000.i2c: device registered successfully

[    0.445000] gspca_main: v2.14.0 registered

[    0.446000] sdhci: Secure Digital Host Controller Interface driver

[    0.447000] sdhci: Copyright(c) Pierre Ossman

[    0.448000] sdhci-pltfm: SDHCI platform and OF driver helper

[    0.452000] sdhci-kona 3f190000.sdio: No vmmc regulator found

[    0.453000] sdhci-kona 3f190000.sdio: No vqmmc regulator found

[    0.483000] mmc0: SDHCI controller on 3f190000.sdio [3f190000.sdio]
using ADMA
[    0.485000] sdhci-kona 3f1b0000.sdio: Got CD GPIO

[    0.489000] sdhci-kona 3f1b0000.sdio: No vmmc regulator found

[    0.490000] sdhci-kona 3f1b0000.sdio: No vqmmc regulator found

[    0.519000] mmc1: SDHCI controller on 3f1b0000.sdio [3f1b0000.sdio]
using ADMA
[    0.520000] usbcore: registered new interface driver usbhid

[    0.521000] usbhid: USB HID core driver

[    0.522000] NET: Registered protocol family 17

[    0.523000] bridge: automatic filtering via arp/ip/ip6tables has been
deprecated. Update your scrip
ts to load br_netfilter if you need this.

[    0.524000] 8021q: 802.1Q VLAN Support v1.8

[    0.525000] Key type dns_resolver registered

[    0.526000] Registering SWP/SWPB emulation handler

[    0.527000] ALSA device list:

[    0.528000]   No soundcards found.

[    0.529000] ttyS0 - failed to request DMA

[    0.531000] Freeing unused kernel memory: 4152K (c087c000 - c0c8a000)

starting pid 1114, tty '': '/etc/init.d/rcS'

Mounting virtual filesystems

[    0.548000] mmc0: MAN_BKOPS_EN bit is not set

[    0.554000] mmc0: new high speed MMC card at address 0001

[    0.557000] mmcblk0: mmc0:0001 016G4A 14.8 GiB

[    0.560000] mmcblk0boot0: mmc0:0001 016G4A partition 1 2.00 MiB

* WARNING: THIS STB CONTAINS GPLv3 SOFTWARE[    0.564000] mmcblk0boot1:
mmc0:0001 016G4A partition 2 2
.00 MiB


* GPLv3 programs must be removed in order to enable security.

* See: http://www.gnu.org/licenses/gpl-faq.html#Tivoization

[    0.570000] mmcblk0rpmb: mmc0:0001 016G4A partition 3 256 KiB

Configuring lo interface

[    0.577000] Alternate GPT is invalid, using primary GPT.

[    0.580000]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14
p15
Starting network services

starting pid 1211, tty '': '/bin/cttyhack /bin/sh -l'

#

# ps awwux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1 22.0  0.1   1928  1244 ?        Ss   00:00   0:00 init

root         2  0.0  0.0      0     0 ?        S    00:00   0:00
[kthreadd]
root         3  0.0  0.0      0     0 ?        S    00:00   0:00
[ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    00:00   0:00
[kworker/0:0]
root         5  0.0  0.0      0     0 ?        S<   00:00   0:00
[kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    00:00   0:00
[kworker/u4:0]
root         7  0.0  0.0      0     0 ?        S    00:00   0:00
[rcu_sched]
root         8  0.0  0.0      0     0 ?        S    00:00   0:00
[rcu_bh]
root         9  0.0  0.0      0     0 ?        S    00:00   0:00
[migration/0]
root        10  0.0  0.0      0     0 ?        S    00:00   0:00
[watchdog/0]
root        11  0.0  0.0      0     0 ?        S    00:00   0:00
[watchdog/1]
root        12  0.0  0.0      0     0 ?        S    00:00   0:00
[migration/1]
root        13  0.0  0.0      0     0 ?        S    00:00   0:00
[ksoftirqd/1]
root        14  0.0  0.0      0     0 ?        S    00:00   0:00
[kworker/1:0]
root        15  0.0  0.0      0     0 ?        S<   00:00   0:00
[kworker/1:0H]
root        16  0.0  0.0      0     0 ?        S    00:00   0:00
[kdevtmpfs]
root        17  2.0  0.0      0     0 ?        S    00:00   0:00
[kworker/u4:1]
root        18  0.0  0.0      0     0 ?        S<   00:00   0:00 [perf]

root        24  0.0  0.0      0     0 ?        S    00:00   0:00
[kworker/u4:2]
root       248  0.0  0.0      0     0 ?        S    00:00   0:00
[khungtaskd]
root       249  0.0  0.0      0     0 ?        S<   00:00   0:00
[writeback]
root       250  0.0  0.0      0     0 ?        S<   00:00   0:00
[crypto]
root       252  0.0  0.0      0     0 ?        S<   00:00   0:00
[bioset]
root       253  0.0  0.0      0     0 ?        S    00:00   0:00
[kworker/0:1]
root       254  0.0  0.0      0     0 ?        S<   00:00   0:00
[kblockd]
root       256  0.0  0.0      0     0 ?        S<   00:00   0:00
[ata_sff]
root       376  0.0  0.0      0     0 ?        S<   00:00   0:00
[rpciod]
root       389  0.0  0.0      0     0 ?        S    00:00   0:00 [kswapd0]
root       390  0.0  0.0      0     0 ?        S    00:00   0:00
[fsnotify_mark]
root       391  0.0  0.0      0     0 ?        S<   00:00   0:00 [nfsiod]
root       943  0.0  0.0      0     0 ?        S    00:00   0:00
[kworker/1:1]
root       947  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       950  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       951  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       952  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       953  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       954  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       955  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       956  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       957  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       958  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       959  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       960  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       961  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       962  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       963  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       964  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root       998  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1001  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1004  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1007  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1010  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1013  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1016  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1019  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1051  0.0  0.0      0     0 ?        S<   00:00   0:00 [cnic_wq]
root      1074  0.0  0.0      0     0 ?        S<   00:00   0:00 [kpsmoused]
root      1092  0.0  0.0      0     0 ?        S    00:00   0:00
[irq/24-mmc0]
root      1094  0.0  0.0      0     0 ?        S    00:00   0:00
[irq/25-mmc1]
root      1096  0.0  0.0      0     0 ?        S    00:00   0:00
[irq/31-3f1b0000]
root      1111  0.0  0.0      0     0 ?        S<   00:00   0:00 [deferwq]
root      1127  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1130  0.0  0.0      0     0 ?        S    00:00   0:00 [mmcqd/0]
root      1131  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1133  0.0  0.0      0     0 ?        S    00:00   0:00
[mmcqd/0boot0]
root      1134  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1137  0.0  0.0      0     0 ?        S    00:00   0:00
[mmcqd/0boot1]
root      1138  0.0  0.0      0     0 ?        S<   00:00   0:00 [bioset]
root      1140  0.0  0.0      0     0 ?        S    00:00   0:00
[mmcqd/0rpmb]
bin       1174  0.0  0.1   1452  1072 ?        Ss   00:00   0:00 portmap
root      1210  0.0  0.0   1928    56 ?        Ss   00:00   0:00 telnetd
root      1211  0.0  0.1   1968  1632 ttyS0    Ss   00:00   0:00 /bin/sh -l
root      1219  0.0  0.1   1948  1124 ttyS0    R+   00:00   0:00 ps awwux
c# cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 0 (v7l)
BogoMIPS        : 2383.87
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

processor       : 1
model name      : ARMv7 Processor rev 0 (v7l)
BogoMIPS        : 4816.89
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

Hardware        : BCM281xx Broadcom Application Processor
Revision        : 0000
Serial          : 0000000000000000
#
diff mbox

Patch

diff --git a/arch/arm/boot/dts/bcm11351.dtsi b/arch/arm/boot/dts/bcm11351.dtsi
index 2ddaa51..3dc7a8c 100644
--- a/arch/arm/boot/dts/bcm11351.dtsi
+++ b/arch/arm/boot/dts/bcm11351.dtsi
@@ -31,7 +31,6 @@ 
 		#address-cells = <1>;
 		#size-cells = <0>;
 		enable-method = "brcm,bcm11351-cpu-method";
-		secondary-boot-reg = <0x3500417c>;
 
 		cpu0: cpu@0 {
 			device_type = "cpu";
@@ -42,6 +41,7 @@ 
 		cpu1: cpu@1 {
 			device_type = "cpu";
 			compatible = "arm,cortex-a9";
+			secondary-boot-reg = <0x3500417c>;
 			reg = <1>;
 		};
 	};
diff --git a/arch/arm/boot/dts/bcm21664.dtsi b/arch/arm/boot/dts/bcm21664.dtsi
index 2016b72..3f525be 100644
--- a/arch/arm/boot/dts/bcm21664.dtsi
+++ b/arch/arm/boot/dts/bcm21664.dtsi
@@ -31,7 +31,6 @@ 
 		#address-cells = <1>;
 		#size-cells = <0>;
 		enable-method = "brcm,bcm11351-cpu-method";
-		secondary-boot-reg = <0x35004178>;
 
 		cpu0: cpu@0 {
 			device_type = "cpu";
@@ -42,6 +41,7 @@ 
 		cpu1: cpu@1 {
 			device_type = "cpu";
 			compatible = "arm,cortex-a9";
+			secondary-boot-reg = <0x35004178>;
 			reg = <1>;
 		};
 	};
diff --git a/arch/arm/mach-bcm/kona_smp.c b/arch/arm/mach-bcm/kona_smp.c
index 66a0465..15af781 100644
--- a/arch/arm/mach-bcm/kona_smp.c
+++ b/arch/arm/mach-bcm/kona_smp.c
@@ -1,5 +1,5 @@ 
 /*
- * Copyright (C) 2014 Broadcom Corporation
+ * Copyright (C) 2014-2015 Broadcom Corporation
  * Copyright 2014 Linaro Limited
  *
  * This program is free software; you can redistribute it and/or
@@ -30,9 +30,10 @@ 
 
 /* Name of device node property defining secondary boot register location */
 #define OF_SECONDARY_BOOT	"secondary-boot-reg"
+#define MPIDR_CPUID_BITMASK	0x3
 
 /* I/O address of register used to coordinate secondary core startup */
-static u32	secondary_boot;
+static u32	secondary_boot_addr;
 
 /*
  * Enable the Cortex A9 Snoop Control Unit
@@ -78,44 +79,68 @@  static int __init scu_a9_enable(void)
 static void __init bcm_smp_prepare_cpus(unsigned int max_cpus)
 {
 	static cpumask_t only_cpu_0 = { CPU_BITS_CPU0 };
-	struct device_node *node;
+	struct device_node *cpus_node = NULL;
+	struct device_node *cpu_node = NULL;
 	int ret;
 
-	BUG_ON(secondary_boot);		/* We're called only once */
-
 	/*
 	 * This function is only called via smp_ops->smp_prepare_cpu().
 	 * That only happens if a "/cpus" device tree node exists
 	 * and has an "enable-method" property that selects the SMP
 	 * operations defined herein.
 	 */
-	node = of_find_node_by_path("/cpus");
-	BUG_ON(!node);
-
-	/*
-	 * Our secondary enable method requires a "secondary-boot-reg"
-	 * property to specify a register address used to request the
-	 * ROM code boot a secondary code.  If we have any trouble
-	 * getting this we fall back to uniprocessor mode.
-	 */
-	if (of_property_read_u32(node, OF_SECONDARY_BOOT, &secondary_boot)) {
-		pr_err("%s: missing/invalid " OF_SECONDARY_BOOT " property\n",
-			node->name);
-		ret = -ENOENT;		/* Arrange to disable SMP */
-		goto out;
+	cpus_node = of_find_node_by_path("/cpus");
+	if (!cpus_node)
+		return;
+
+	for_each_child_of_node(cpus_node, cpu_node) {
+		u32 cpuid;
+
+		if (of_node_cmp(cpu_node->type, "cpu"))
+			continue;
+
+		if (of_property_read_u32(cpu_node, "reg", &cpuid)) {
+			pr_debug("%s: missing reg property\n",
+				     cpu_node->full_name);
+			ret = -ENOENT;
+			goto out;
+		}
+
+		/*
+		 * "secondary-boot-reg" property should be defined only
+		 * for secondary cpu
+		 */
+		if ((cpuid & MPIDR_CPUID_BITMASK) == 1) {
+			/*
+			 * Our secondary enable method requires a
+			 * "secondary-boot-reg" property to specify a register
+			 * address used to request the ROM code boot a secondary
+			 * core. If we have any trouble getting this we fall
+			 * back to uniprocessor mode.
+			 */
+			if (of_property_read_u32(cpu_node,
+						OF_SECONDARY_BOOT,
+						&secondary_boot_addr)) {
+				pr_warn("%s: no" OF_SECONDARY_BOOT "property\n",
+					cpu_node->name);
+				ret = -ENOENT;
+				goto out;
+			}
+		}
 	}
 
 	/*
-	 * Enable the SCU on Cortex A9 based SoCs.  If -ENOENT is
+	 * Enable the SCU on Cortex A9 based SoCs. If -ENOENT is
 	 * returned, the SoC reported a uniprocessor configuration.
 	 * We bail on any other error.
 	 */
 	ret = scu_a9_enable();
 out:
-	of_node_put(node);
+	of_node_put(cpu_node);
+	of_node_put(cpus_node);
+
 	if (ret) {
 		/* Update the CPU present map to reflect uniprocessor mode */
-		BUG_ON(ret != -ENOENT);
 		pr_warn("disabling SMP\n");
 		init_cpu_present(&only_cpu_0);
 	}
@@ -139,7 +164,7 @@  out:
  * - Wait for the secondary boot register to be re-written, which
  *   indicates the secondary core has started.
  */
-static int bcm_boot_secondary(unsigned int cpu, struct task_struct *idle)
+static int kona_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
 	void __iomem *boot_reg;
 	phys_addr_t boot_func;
@@ -154,15 +179,16 @@  static int bcm_boot_secondary(unsigned int cpu, struct task_struct *idle)
 		return -EINVAL;
 	}
 
-	if (!secondary_boot) {
+	if (!secondary_boot_addr) {
 		pr_err("required secondary boot register not specified\n");
 		return -EINVAL;
 	}
 
-	boot_reg = ioremap_nocache((phys_addr_t)secondary_boot, sizeof(u32));
+	boot_reg = ioremap_nocache(
+			(phys_addr_t)secondary_boot_addr, sizeof(u32));
 	if (!boot_reg) {
 		pr_err("unable to map boot register for cpu %u\n", cpu_id);
-		return -ENOSYS;
+		return -ENOMEM;
 	}
 
 	/*
@@ -191,12 +217,12 @@  static int bcm_boot_secondary(unsigned int cpu, struct task_struct *idle)
 
 	pr_err("timeout waiting for cpu %u to start\n", cpu_id);
 
-	return -ENOSYS;
+	return -ENXIO;
 }
 
 static struct smp_operations bcm_smp_ops __initdata = {
 	.smp_prepare_cpus	= bcm_smp_prepare_cpus,
-	.smp_boot_secondary	= bcm_boot_secondary,
+	.smp_boot_secondary	= kona_boot_secondary,
 };
 CPU_METHOD_OF_DECLARE(bcm_smp_bcm281xx, "brcm,bcm11351-cpu-method",
 			&bcm_smp_ops);