* [PATCH v5 1/7] MIPS: Octeon: Header and file cleaning.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 2/7] MIPS: Octeon: Update values for CVMX_CIU_FUSE register Steven J. Hill
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips; +Cc: Steven J. Hill
From: "Steven J. Hill" <Steven.Hill@cavium.com>
In preparation for new hotplug CPU, some housekeeping:
* Clean-up header file dependencies, specifically move inclusion
of some headers to only the files that need them.
* Clean-ups from checkpatch in arch/mips/cavium-octeon/setup.c
* Add defining of NR_IRQS_LEGACY for completeness.
* Move CVMX_TMP_STR macros from top level to cvmx-asm.h
* Update some copyright dates.
* Add some missing register include files to top level.
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
---
.../cavium-octeon/executive/cvmx-helper-board.c | 2 +-
.../cavium-octeon/executive/cvmx-helper-jtag.c | 1 +
.../cavium-octeon/executive/cvmx-helper-rgmii.c | 1 +
.../cavium-octeon/executive/cvmx-helper-sgmii.c | 1 +
.../mips/cavium-octeon/executive/cvmx-helper-spi.c | 1 +
.../cavium-octeon/executive/cvmx-helper-xaui.c | 1 +
arch/mips/cavium-octeon/executive/cvmx-helper.c | 1 +
arch/mips/cavium-octeon/executive/cvmx-pko.c | 1 +
arch/mips/cavium-octeon/executive/cvmx-spi.c | 1 +
arch/mips/cavium-octeon/octeon-platform.c | 1 +
arch/mips/cavium-octeon/setup.c | 10 +-
arch/mips/cavium-octeon/smp.c | 1 +
arch/mips/include/asm/mach-cavium-octeon/irq.h | 8 ++
arch/mips/include/asm/octeon/cvmx-asm.h | 6 +-
arch/mips/include/asm/octeon/cvmx-ciu-defs.h | 141 +++++++--------------
arch/mips/include/asm/octeon/cvmx-sysinfo.h | 4 +-
arch/mips/include/asm/octeon/cvmx.h | 10 +-
17 files changed, 81 insertions(+), 110 deletions(-)
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-board.c b/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
index ab8362e..22d46fe 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper-board.c
@@ -32,7 +32,7 @@
*/
#include <asm/octeon/octeon.h>
-#include <asm/octeon/cvmx-bootinfo.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-jtag.c b/arch/mips/cavium-octeon/executive/cvmx-helper-jtag.c
index 607b4e6..e417037 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper-jtag.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper-jtag.c
@@ -33,6 +33,7 @@
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-helper-jtag.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c b/arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c
index d18ed5a..2d84490 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper-rgmii.c
@@ -30,6 +30,7 @@
* and monitoring.
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c b/arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c
index 5782833..a25275d 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper-sgmii.c
@@ -31,6 +31,7 @@
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-spi.c b/arch/mips/cavium-octeon/executive/cvmx-helper-spi.c
index ef16aa0..d9dac21 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper-spi.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper-spi.c
@@ -34,6 +34,7 @@ void __cvmx_interrupt_stxx_int_msk_enable(int index);
* and monitoring.
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
#include <asm/octeon/cvmx-spi.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c b/arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c
index 19d54e0..d692638 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper-xaui.c
@@ -32,6 +32,7 @@
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-helper.c b/arch/mips/cavium-octeon/executive/cvmx-helper.c
index 75108ec..1e807f8 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-helper.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-helper.c
@@ -31,6 +31,7 @@
*
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-pko.c b/arch/mips/cavium-octeon/executive/cvmx-pko.c
index 676fab5..ec5b013 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-pko.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-pko.c
@@ -30,6 +30,7 @@
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
#include <asm/octeon/cvmx-pko.h>
diff --git a/arch/mips/cavium-octeon/executive/cvmx-spi.c b/arch/mips/cavium-octeon/executive/cvmx-spi.c
index f51957a..d346ea7 100644
--- a/arch/mips/cavium-octeon/executive/cvmx-spi.c
+++ b/arch/mips/cavium-octeon/executive/cvmx-spi.c
@@ -30,6 +30,7 @@
* Support library for the SPI
*/
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/cvmx-config.h>
diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
index 8505db4..a605191 100644
--- a/arch/mips/cavium-octeon/octeon-platform.c
+++ b/arch/mips/cavium-octeon/octeon-platform.c
@@ -13,6 +13,7 @@
#include <linux/libfdt.h>
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-bootinfo.h>
#include <asm/octeon/cvmx-helper-board.h>
#ifdef CONFIG_USB
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index a8034d0..2085138 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -39,6 +39,7 @@
#include <asm/time.h>
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include <asm/octeon/pci-octeon.h>
#include <asm/octeon/cvmx-rst-defs.h>
@@ -165,6 +166,7 @@ static int octeon_kexec_prepare(struct kimage *image)
int argc = 0, offt;
char *str = (char *)image->segment[i].buf;
char *ptr = strchr(str, ' ');
+
while (ptr && (OCTEON_ARGV_MAX_ARGS > argc)) {
*ptr = '\0';
if (ptr[1] != ' ') {
@@ -357,6 +359,7 @@ void octeon_write_lcd(const char *s)
ioremap_nocache(octeon_bootinfo->led_display_base_addr,
8);
int i;
+
for (i = 0; i < 8; i++, s++) {
if (*s)
iowrite8(*s, lcd_address + i);
@@ -429,6 +432,7 @@ static void octeon_restart(char *command)
/* Disable all watchdogs before soft reset. They don't get cleared */
#ifdef CONFIG_SMP
int cpu;
+
for_each_online_cpu(cpu)
cvmx_write_csr(CVMX_CIU_WDOGX(cpu_logical_map(cpu)), 0);
#else
@@ -715,11 +719,13 @@ void __init prom_init(void)
if (OCTEON_IS_OCTEON2()) {
/* I/O clock runs at a different rate than the CPU. */
union cvmx_mio_rst_boot rst_boot;
+
rst_boot.u64 = cvmx_read_csr(CVMX_MIO_RST_BOOT);
octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul;
} else if (OCTEON_IS_OCTEON3()) {
/* I/O clock runs at a different rate than the CPU. */
union cvmx_rst_boot rst_boot;
+
rst_boot.u64 = cvmx_read_csr(CVMX_RST_BOOT);
octeon_io_clock_rate = 50000000 * rst_boot.s.pnr_mul;
} else {
@@ -927,6 +933,7 @@ static __init void memory_exclude_page(u64 addr, u64 *mem, u64 *size)
{
if (addr > *mem && addr < *mem + *size) {
u64 inc = addr - *mem;
+
add_memory_region(*mem, inc, BOOT_MEM_RAM);
*mem += inc;
*size -= inc;
@@ -947,6 +954,7 @@ void __init fw_init_cmdline(void)
for (i = 0; i < octeon_boot_desc_ptr->argc; i++) {
const char *arg =
cvmx_phys_to_ptr(octeon_boot_desc_ptr->argv[i]);
+
if (strlen(arcs_cmdline) + strlen(arg) + 1 <
sizeof(arcs_cmdline) - 1) {
strcat(arcs_cmdline, " ");
@@ -1202,7 +1210,7 @@ void __init device_tree_init(void)
init_octeon_system_type();
}
-static int __initdata disable_octeon_edac_p;
+static int disable_octeon_edac_p __initdata;
static int __init disable_octeon_edac(char *str)
{
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index 75e7c86..f08f175 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -21,6 +21,7 @@
#include <asm/setup.h>
#include <asm/octeon/octeon.h>
+#include <asm/octeon/cvmx-sysinfo.h>
#include "octeon_boot.h"
diff --git a/arch/mips/include/asm/mach-cavium-octeon/irq.h b/arch/mips/include/asm/mach-cavium-octeon/irq.h
index 64b86b9..7c2bf76 100644
--- a/arch/mips/include/asm/mach-cavium-octeon/irq.h
+++ b/arch/mips/include/asm/mach-cavium-octeon/irq.h
@@ -11,6 +11,14 @@
#define NR_IRQS OCTEON_IRQ_LAST
#define MIPS_CPU_IRQ_BASE OCTEON_IRQ_SW0
+/*
+ * 0 - unused.
+ * 1..8 - MIPS
+ *
+ * For a total of 9
+ */
+#define NR_IRQS_LEGACY 9
+
enum octeon_irq {
/* 1 - 8 represent the 8 MIPS standard interrupt sources */
OCTEON_IRQ_SW0 = 1,
diff --git a/arch/mips/include/asm/octeon/cvmx-asm.h b/arch/mips/include/asm/octeon/cvmx-asm.h
index 31eacc2..0c6ae93 100644
--- a/arch/mips/include/asm/octeon/cvmx-asm.h
+++ b/arch/mips/include/asm/octeon/cvmx-asm.h
@@ -4,7 +4,7 @@
* Contact: support@caviumnetworks.com
* This file is part of the OCTEON SDK
*
- * Copyright (c) 2003-2008 Cavium Networks
+ * Copyright (c) 2003-2017 Cavium, Inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, Version 2, as
@@ -32,7 +32,9 @@
#ifndef __CVMX_ASM_H__
#define __CVMX_ASM_H__
-#include <asm/octeon/octeon-model.h>
+/* turn the variable name into a string */
+#define CVMX_TMP_STR(x) CVMX_TMP_STR2(x)
+#define CVMX_TMP_STR2(x) #x
/* other useful stuff */
#define CVMX_SYNC asm volatile ("sync" : : : "memory")
diff --git a/arch/mips/include/asm/octeon/cvmx-ciu-defs.h b/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
index 6e61792..af9164b 100644
--- a/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
+++ b/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
@@ -64,94 +64,47 @@
#define CVMX_CIU_INT_SUM1 (CVMX_ADD_IO_SEG(0x0001070000000108ull))
static inline uint64_t CVMX_CIU_MBOX_CLRX(unsigned long offset)
{
- switch (cvmx_get_octeon_family()) {
- case OCTEON_CN30XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN52XX & OCTEON_FAMILY_MASK:
- case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN31XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN50XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN38XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN58XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN56XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
- case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+ if ((cvmx_get_octeon_family() & OCTEON_FAMILY_MASK) == OCTEON_CN68XX)
return CVMX_ADD_IO_SEG(0x0001070100100600ull) + (offset) * 8;
- }
- return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
+ else
+ return CVMX_ADD_IO_SEG(0x0001070000000680ull) + (offset) * 8;
}
-
static inline uint64_t CVMX_CIU_MBOX_SETX(unsigned long offset)
{
- switch (cvmx_get_octeon_family()) {
- case OCTEON_CN30XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN52XX & OCTEON_FAMILY_MASK:
- case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN31XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN50XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN38XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN58XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN56XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
- case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
+ if ((cvmx_get_octeon_family() & OCTEON_FAMILY_MASK) == OCTEON_CN68XX)
return CVMX_ADD_IO_SEG(0x0001070100100400ull) + (offset) * 8;
- }
- return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
+ else
+ return CVMX_ADD_IO_SEG(0x0001070000000600ull) + (offset) * 8;
}
-
#define CVMX_CIU_NMI (CVMX_ADD_IO_SEG(0x0001070000000718ull))
#define CVMX_CIU_PCI_INTA (CVMX_ADD_IO_SEG(0x0001070000000750ull))
#define CVMX_CIU_PP_BIST_STAT (CVMX_ADD_IO_SEG(0x00010700000007E0ull))
#define CVMX_CIU_PP_DBG (CVMX_ADD_IO_SEG(0x0001070000000708ull))
static inline uint64_t CVMX_CIU_PP_POKEX(unsigned long offset)
{
- switch (cvmx_get_octeon_family()) {
- case OCTEON_CN30XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN52XX & OCTEON_FAMILY_MASK:
- case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN31XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN50XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN38XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN58XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN56XX & OCTEON_FAMILY_MASK:
+ switch(cvmx_get_octeon_family() & OCTEON_FAMILY_MASK) {
+ case OCTEON_CN30XX:
+ case OCTEON_CN31XX:
+ case OCTEON_CN38XX:
+ case OCTEON_CN50XX:
+ case OCTEON_CN52XX:
+ case OCTEON_CN56XX:
+ case OCTEON_CN58XX:
+ case OCTEON_CN61XX:
+ case OCTEON_CN63XX:
+ case OCTEON_CN66XX:
+ case OCTEON_CN70XX:
+ case OCTEON_CNF71XX:
return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
- case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070100100200ull) + (offset) * 8;
- case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN73XX:
+ case OCTEON_CN78XX:
+ case OCTEON_CNF75XX:
+ default:
return CVMX_ADD_IO_SEG(0x0001010000030000ull) + (offset) * 8;
+ case OCTEON_CN68XX:
+ return CVMX_ADD_IO_SEG(0x0001070100100200ull) + (offset) * 8;
}
- return CVMX_ADD_IO_SEG(0x0001070000000580ull) + (offset) * 8;
}
-
#define CVMX_CIU_PP_RST (CVMX_ADD_IO_SEG(0x0001070000000700ull))
#define CVMX_CIU_QLM0 (CVMX_ADD_IO_SEG(0x0001070000000780ull))
#define CVMX_CIU_QLM1 (CVMX_ADD_IO_SEG(0x0001070000000788ull))
@@ -179,34 +132,28 @@ static inline uint64_t CVMX_CIU_PP_POKEX(unsigned long offset)
#define CVMX_CIU_TIM_MULTI_CAST (CVMX_ADD_IO_SEG(0x000107000000C200ull))
static inline uint64_t CVMX_CIU_WDOGX(unsigned long offset)
{
- switch (cvmx_get_octeon_family()) {
- case OCTEON_CN30XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN52XX & OCTEON_FAMILY_MASK:
- case OCTEON_CNF71XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN61XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN70XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN31XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN50XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN38XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN58XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN56XX & OCTEON_FAMILY_MASK:
+ switch(cvmx_get_octeon_family() & OCTEON_FAMILY_MASK) {
+ case OCTEON_CN30XX:
+ case OCTEON_CN31XX:
+ case OCTEON_CN38XX:
+ case OCTEON_CN50XX:
+ case OCTEON_CN52XX:
+ case OCTEON_CN56XX:
+ case OCTEON_CN58XX:
+ case OCTEON_CN61XX:
+ case OCTEON_CN63XX:
+ case OCTEON_CN66XX:
+ case OCTEON_CN70XX:
+ case OCTEON_CNF71XX:
return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN66XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN63XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
- case OCTEON_CN68XX & OCTEON_FAMILY_MASK:
- return CVMX_ADD_IO_SEG(0x0001070100100000ull) + (offset) * 8;
- case OCTEON_CNF75XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN73XX & OCTEON_FAMILY_MASK:
- case OCTEON_CN78XX & OCTEON_FAMILY_MASK:
+ case OCTEON_CN73XX:
+ case OCTEON_CN78XX:
+ case OCTEON_CNF75XX:
+ default:
return CVMX_ADD_IO_SEG(0x0001010000020000ull) + (offset) * 8;
+ case OCTEON_CN68XX:
+ return CVMX_ADD_IO_SEG(0x0001070100100000ull) + (offset) * 8;
}
- return CVMX_ADD_IO_SEG(0x0001070000000500ull) + (offset) * 8;
}
union cvmx_ciu_bist {
diff --git a/arch/mips/include/asm/octeon/cvmx-sysinfo.h b/arch/mips/include/asm/octeon/cvmx-sysinfo.h
index c6c3ee3..ea1381a 100644
--- a/arch/mips/include/asm/octeon/cvmx-sysinfo.h
+++ b/arch/mips/include/asm/octeon/cvmx-sysinfo.h
@@ -4,7 +4,7 @@
* Contact: support@caviumnetworks.com
* This file is part of the OCTEON SDK
*
- * Copyright (c) 2003-2016 Cavium, Inc.
+ * Copyright (c) 2003-2017 Cavium, Inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, Version 2, as
@@ -32,7 +32,7 @@
#ifndef __CVMX_SYSINFO_H__
#define __CVMX_SYSINFO_H__
-#include "cvmx-coremask.h"
+#include <asm/octeon/cvmx-bootinfo.h>
#define OCTEON_SERIAL_LEN 20
/**
diff --git a/arch/mips/include/asm/octeon/cvmx.h b/arch/mips/include/asm/octeon/cvmx.h
index 25854ab..392556a 100644
--- a/arch/mips/include/asm/octeon/cvmx.h
+++ b/arch/mips/include/asm/octeon/cvmx.h
@@ -54,8 +54,7 @@ enum cvmx_mips_space {
#endif
#include <asm/octeon/cvmx-asm.h>
-#include <asm/octeon/cvmx-packet.h>
-#include <asm/octeon/cvmx-sysinfo.h>
+#include <asm/octeon/octeon-model.h>
#include <asm/octeon/cvmx-ciu-defs.h>
#include <asm/octeon/cvmx-ciu3-defs.h>
@@ -68,8 +67,9 @@ enum cvmx_mips_space {
#include <asm/octeon/cvmx-led-defs.h>
#include <asm/octeon/cvmx-mio-defs.h>
#include <asm/octeon/cvmx-pow-defs.h>
+#include <asm/octeon/cvmx-rst-defs.h>
+#include <asm/octeon/cvmx-rnm-defs.h>
-#include <asm/octeon/cvmx-bootinfo.h>
#include <asm/octeon/cvmx-bootmem.h>
#include <asm/octeon/cvmx-l2c.h>
@@ -102,10 +102,6 @@ static inline uint32_t cvmx_get_proc_id(void)
return id;
}
-/* turn the variable name into a string */
-#define CVMX_TMP_STR(x) CVMX_TMP_STR2(x)
-#define CVMX_TMP_STR2(x) #x
-
/**
* Builds a bit mask given the required size in bits.
*
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v5 2/7] MIPS: Octeon: Update values for CVMX_CIU_FUSE register.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 1/7] MIPS: Octeon: Header and file cleaning Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 3/7] MIPS: Octeon: Add Octeon III platforms for console output Steven J. Hill
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips; +Cc: Steven J. Hill
From: "Steven J. Hill" <Steven.Hill@cavium.com>
Values for CVMX_CIU_FUSE register was incorrect for some platforms.
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
---
arch/mips/include/asm/octeon/cvmx-ciu-defs.h | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/arch/mips/include/asm/octeon/cvmx-ciu-defs.h b/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
index af9164b..2ac8168 100644
--- a/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
+++ b/arch/mips/include/asm/octeon/cvmx-ciu-defs.h
@@ -4,7 +4,7 @@
* Contact: support@caviumnetworks.com
* This file is part of the OCTEON SDK
*
- * Copyright (c) 2003-2012 Cavium Networks
+ * Copyright (c) 2003-2017 Cavium, Inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, Version 2, as
@@ -43,7 +43,31 @@
#define CVMX_CIU_EN2_PPX_IP4(offset) (CVMX_ADD_IO_SEG(0x000107000000A400ull) + ((offset) & 15) * 8)
#define CVMX_CIU_EN2_PPX_IP4_W1C(offset) (CVMX_ADD_IO_SEG(0x000107000000CC00ull) + ((offset) & 15) * 8)
#define CVMX_CIU_EN2_PPX_IP4_W1S(offset) (CVMX_ADD_IO_SEG(0x000107000000AC00ull) + ((offset) & 15) * 8)
-#define CVMX_CIU_FUSE (CVMX_ADD_IO_SEG(0x0001070000000728ull))
+#define CVMX_CIU_FUSE CVMX_CIU_FUSE_FUNC()
+static inline uint64_t CVMX_CIU_FUSE_FUNC(void)
+{
+ switch(cvmx_get_octeon_family() & OCTEON_FAMILY_MASK) {
+ case OCTEON_CN30XX:
+ case OCTEON_CN31XX:
+ case OCTEON_CN38XX:
+ case OCTEON_CN50XX:
+ case OCTEON_CN52XX:
+ case OCTEON_CN56XX:
+ case OCTEON_CN58XX:
+ case OCTEON_CN61XX:
+ case OCTEON_CN63XX:
+ case OCTEON_CN66XX:
+ case OCTEON_CN68XX:
+ case OCTEON_CN70XX:
+ case OCTEON_CNF71XX:
+ default:
+ return CVMX_ADD_IO_SEG(0x0001070000000728ull);
+ case OCTEON_CN73XX:
+ case OCTEON_CN78XX:
+ case OCTEON_CNF75XX:
+ return CVMX_ADD_IO_SEG(0x00010100000001A0ull);
+ }
+}
#define CVMX_CIU_GSTOP (CVMX_ADD_IO_SEG(0x0001070000000710ull))
#define CVMX_CIU_INT33_SUM0 (CVMX_ADD_IO_SEG(0x0001070000000110ull))
#define CVMX_CIU_INTX_EN0(offset) (CVMX_ADD_IO_SEG(0x0001070000000200ull) + ((offset) & 63) * 16)
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v5 3/7] MIPS: Octeon: Add Octeon III platforms for console output.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 1/7] MIPS: Octeon: Header and file cleaning Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 2/7] MIPS: Octeon: Update values for CVMX_CIU_FUSE register Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 4/7] MIPS: Octeon: Remove crufty KEXEC and CRASH_DUMP code Steven J. Hill
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips; +Cc: Steven J. Hill
From: "Steven J. Hill" <Steven.Hill@cavium.com>
Support Octeon III platforms when printing out the model and
SoC information during boot.
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
Acked-by: David Daney <david.daney@cavium.com>
---
arch/mips/cavium-octeon/executive/octeon-model.c | 53 ++++++++++++++++++++++--
1 file changed, 50 insertions(+), 3 deletions(-)
diff --git a/arch/mips/cavium-octeon/executive/octeon-model.c b/arch/mips/cavium-octeon/executive/octeon-model.c
index 3410523..069a996 100644
--- a/arch/mips/cavium-octeon/executive/octeon-model.c
+++ b/arch/mips/cavium-octeon/executive/octeon-model.c
@@ -67,7 +67,7 @@ static const char *__init octeon_model_get_string_buffer(uint32_t chip_id,
union cvmx_mio_fus_dat2 fus_dat2;
union cvmx_mio_fus_dat3 fus_dat3;
char fuse_model[10];
- uint32_t fuse_data = 0;
+ uint64_t fuse_data = 0;
uint64_t l2d_fus3 = 0;
if (OCTEON_IS_MODEL(OCTEON_CN3XXX) || OCTEON_IS_MODEL(OCTEON_CN5XXX))
@@ -453,11 +453,13 @@ static const char *__init octeon_model_get_string_buffer(uint32_t chip_id,
}
clock_mhz = octeon_get_clock_rate() / 1000000;
- if (family[0] != '3') {
+ if (family[0] != '3')
+ goto out;
+
+ if (OCTEON_IS_OCTEON1PLUS() || OCTEON_IS_OCTEON2()) {
int fuse_base = 384 / 8;
if (family[0] == '6')
fuse_base = 832 / 8;
-
/* Check for model in fuses, overrides normal decode */
/* This is _not_ valid for Octeon CN3XXX models */
fuse_data |= cvmx_fuse_read_byte(fuse_base + 3);
@@ -486,7 +488,52 @@ static const char *__init octeon_model_get_string_buffer(uint32_t chip_id,
family = fuse_model;
}
}
+ } else {
+ /* Format for Octeon 3. */
+ fuse_data = cvmx_read_csr(CVMX_MIO_FUS_PDF);
+ if (fuse_data & ((1ULL << 48) - 1)) {
+ char suffix_str[4] = {0};
+ char fuse_suffix[4] = {0};
+ int i;
+ int model = fuse_data & ((1ULL << 17) - 1);
+ int suf_bits = (fuse_data >> 17) & ((1ULL << 15) - 1);
+ for (i = 0; i < 3; i++) {
+ /* A-Z are encoded 1-26, 27-31 are
+ reserved values. */
+ if ((suf_bits & 0x1f) && (suf_bits & 0x1f) <= 26)
+ suffix_str[i] = 'A' + (suf_bits & 0x1f) - 1;
+ suf_bits = suf_bits >> 5;
+ }
+ if (strlen(suffix_str) && model) { /* Have both number and suffix in fuses, so both */
+ sprintf(fuse_model, "%d%s", model, suffix_str);
+ core_model = "";
+ family = fuse_model;
+ } else if (strlen(suffix_str) && !model) { /* Only have suffix, so add suffix to 'normal' model number */
+ sprintf(fuse_model, "%s%s", core_model, suffix_str);
+ core_model = fuse_model;
+ } else if (model) { /* Don't have suffix, so just use model from fuses */
+ sprintf(fuse_model, "%d", model);
+ core_model = "";
+ family = fuse_model;
+ }
+ /* in case of invalid model suffix bits
+ only set, we do nothing. */
+
+ /* Check to see if we have a custom type
+ suffix. */
+ suf_bits = (fuse_data >> 33) & ((1ULL << 15) - 1);
+ for (i = 0; i < 3; i++) {
+ /* A-Z are encoded 1-26, 27-31 are
+ reserved values. */
+ if ((suf_bits & 0x1f) && (suf_bits & 0x1f) <= 26)
+ fuse_suffix[i] = 'A' + (suf_bits & 0x1f) - 1;
+ suf_bits = suf_bits >> 5;
+ }
+ if (strlen(fuse_suffix))
+ suffix = fuse_suffix;
+ }
}
+out:
sprintf(buffer, "CN%s%sp%s-%d-%s", family, core_model, pass, clock_mhz, suffix);
return buffer;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v5 4/7] MIPS: Octeon: Remove crufty KEXEC and CRASH_DUMP code.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
` (2 preceding siblings ...)
2018-03-14 22:24 ` [PATCH v5 3/7] MIPS: Octeon: Add Octeon III platforms for console output Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 5/7] MIPS: Octeon: Populate kernel memory from cvmx_bootmem named blocks Steven J. Hill
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips; +Cc: Steven J. Hill
From: "Steven J. Hill" <Steven.Hill@cavium.com>
Get rid of obsolete KEXEC and CRASH_DUMP code. This is to
prepare for adding in the new hotplug CPU code.
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
Acked-by: David Daney <david.daney@cavium.com>
---
arch/mips/cavium-octeon/setup.c | 168 ++--------------------------------------
1 file changed, 7 insertions(+), 161 deletions(-)
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index 2085138..46e2bb0 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -100,56 +100,6 @@ static void octeon_kexec_smp_down(void *ignored)
}
#endif
-#define OCTEON_DDR0_BASE (0x0ULL)
-#define OCTEON_DDR0_SIZE (0x010000000ULL)
-#define OCTEON_DDR1_BASE (0x410000000ULL)
-#define OCTEON_DDR1_SIZE (0x010000000ULL)
-#define OCTEON_DDR2_BASE (0x020000000ULL)
-#define OCTEON_DDR2_SIZE (0x3e0000000ULL)
-#define OCTEON_MAX_PHY_MEM_SIZE (16*1024*1024*1024ULL)
-
-static struct kimage *kimage_ptr;
-
-static void kexec_bootmem_init(uint64_t mem_size, uint32_t low_reserved_bytes)
-{
- int64_t addr;
- struct cvmx_bootmem_desc *bootmem_desc;
-
- bootmem_desc = cvmx_bootmem_get_desc();
-
- if (mem_size > OCTEON_MAX_PHY_MEM_SIZE) {
- mem_size = OCTEON_MAX_PHY_MEM_SIZE;
- pr_err("Error: requested memory too large,"
- "truncating to maximum size\n");
- }
-
- bootmem_desc->major_version = CVMX_BOOTMEM_DESC_MAJ_VER;
- bootmem_desc->minor_version = CVMX_BOOTMEM_DESC_MIN_VER;
-
- addr = (OCTEON_DDR0_BASE + reserve_low_mem + low_reserved_bytes);
- bootmem_desc->head_addr = 0;
-
- if (mem_size <= OCTEON_DDR0_SIZE) {
- __cvmx_bootmem_phy_free(addr,
- mem_size - reserve_low_mem -
- low_reserved_bytes, 0);
- return;
- }
-
- __cvmx_bootmem_phy_free(addr,
- OCTEON_DDR0_SIZE - reserve_low_mem -
- low_reserved_bytes, 0);
-
- mem_size -= OCTEON_DDR0_SIZE;
-
- if (mem_size > OCTEON_DDR1_SIZE) {
- __cvmx_bootmem_phy_free(OCTEON_DDR1_BASE, OCTEON_DDR1_SIZE, 0);
- __cvmx_bootmem_phy_free(OCTEON_DDR2_BASE,
- mem_size - OCTEON_DDR1_SIZE, 0);
- } else
- __cvmx_bootmem_phy_free(OCTEON_DDR1_BASE, mem_size, 0);
-}
-
static int octeon_kexec_prepare(struct kimage *image)
{
int i;
@@ -181,72 +131,23 @@ static int octeon_kexec_prepare(struct kimage *image)
break;
}
}
-
- /*
- * Information about segments will be needed during pre-boot memory
- * initialization.
- */
- kimage_ptr = image;
return 0;
}
static void octeon_generic_shutdown(void)
{
- int i;
#ifdef CONFIG_SMP
int cpu;
-#endif
- struct cvmx_bootmem_desc *bootmem_desc;
- void *named_block_array_ptr;
- bootmem_desc = cvmx_bootmem_get_desc();
- named_block_array_ptr =
- cvmx_phys_to_ptr(bootmem_desc->named_block_array_addr);
-
-#ifdef CONFIG_SMP
+ secondary_kexec_args[2] = 0UL; /* running on secondary cpu */
+ secondary_kexec_args[3] = (unsigned long)octeon_boot_desc_ptr;
/* disable watchdogs */
for_each_online_cpu(cpu)
cvmx_write_csr(CVMX_CIU_WDOGX(cpu_logical_map(cpu)), 0);
#else
cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0);
-#endif
- if (kimage_ptr != kexec_crash_image) {
- memset(named_block_array_ptr,
- 0x0,
- CVMX_BOOTMEM_NUM_NAMED_BLOCKS *
- sizeof(struct cvmx_bootmem_named_block_desc));
- /*
- * Mark all memory (except low 0x100000 bytes) as free.
- * It is the same thing that bootloader does.
- */
- kexec_bootmem_init(octeon_bootinfo->dram_size*1024ULL*1024ULL,
- 0x100000);
- /*
- * Allocate all segments to avoid their corruption during boot.
- */
- for (i = 0; i < kimage_ptr->nr_segments; i++)
- cvmx_bootmem_alloc_address(
- kimage_ptr->segment[i].memsz + 2*PAGE_SIZE,
- kimage_ptr->segment[i].mem - PAGE_SIZE,
- PAGE_SIZE);
- } else {
- /*
- * Do not mark all memory as free. Free only named sections
- * leaving the rest of memory unchanged.
- */
- struct cvmx_bootmem_named_block_desc *ptr =
- (struct cvmx_bootmem_named_block_desc *)
- named_block_array_ptr;
-
- for (i = 0; i < bootmem_desc->named_block_num_blocks; i++)
- if (ptr[i].size)
- cvmx_bootmem_free_named(ptr[i].name);
- }
kexec_args[2] = 1UL; /* running on octeon_main_processor */
kexec_args[3] = (unsigned long)octeon_boot_desc_ptr;
-#ifdef CONFIG_SMP
- secondary_kexec_args[2] = 0UL; /* running on secondary cpu */
- secondary_kexec_args[3] = (unsigned long)octeon_boot_desc_ptr;
#endif
}
@@ -928,7 +829,6 @@ void __init prom_init(void)
}
/* Exclude a single page from the regions obtained in plat_mem_setup. */
-#ifndef CONFIG_CRASH_DUMP
static __init void memory_exclude_page(u64 addr, u64 *mem, u64 *size)
{
if (addr > *mem && addr < *mem + *size) {
@@ -944,7 +844,6 @@ static __init void memory_exclude_page(u64 addr, u64 *mem, u64 *size)
*size -= PAGE_SIZE;
}
}
-#endif /* CONFIG_CRASH_DUMP */
void __init fw_init_cmdline(void)
{
@@ -975,11 +874,7 @@ void __init plat_mem_setup(void)
uint64_t mem_alloc_size;
uint64_t total;
uint64_t crashk_end;
-#ifndef CONFIG_CRASH_DUMP
int64_t memory;
- uint64_t kernel_start;
- uint64_t kernel_size;
-#endif
total = 0;
crashk_end = 0;
@@ -1020,9 +915,6 @@ void __init plat_mem_setup(void)
CVMX_BOOTMEM_FLAG_NO_LOCKING);
if (memory >= 0) {
u64 size = mem_alloc_size;
-#ifdef CONFIG_KEXEC
- uint64_t end;
-#endif
/*
* exclude a page at the beginning and end of
@@ -1035,66 +927,20 @@ void __init plat_mem_setup(void)
memory_exclude_page(CVMX_PCIE_BAR1_PHYS_BASE +
CVMX_PCIE_BAR1_PHYS_SIZE,
&memory, &size);
-#ifdef CONFIG_KEXEC
- end = memory + mem_alloc_size;
/*
- * This function automatically merges address regions
- * next to each other if they are received in
- * incrementing order
+ * This function automatically merges address
+ * regions next to each other if they are
+ * received in incrementing order.
*/
- if (memory < crashk_base && end > crashk_end) {
- /* region is fully in */
- add_memory_region(memory,
- crashk_base - memory,
- BOOT_MEM_RAM);
- total += crashk_base - memory;
- add_memory_region(crashk_end,
- end - crashk_end,
- BOOT_MEM_RAM);
- total += end - crashk_end;
- continue;
- }
-
- if (memory >= crashk_base && end <= crashk_end)
- /*
- * Entire memory region is within the new
- * kernel's memory, ignore it.
- */
- continue;
-
- if (memory > crashk_base && memory < crashk_end &&
- end > crashk_end) {
- /*
- * Overlap with the beginning of the region,
- * reserve the beginning.
- */
- mem_alloc_size -= crashk_end - memory;
- memory = crashk_end;
- } else if (memory < crashk_base && end > crashk_base &&
- end < crashk_end)
- /*
- * Overlap with the beginning of the region,
- * chop of end.
- */
- mem_alloc_size -= end - crashk_base;
-#endif
- add_memory_region(memory, mem_alloc_size, BOOT_MEM_RAM);
+ if (size)
+ add_memory_region(memory, size, BOOT_MEM_RAM);
total += mem_alloc_size;
- /* Recovering mem_alloc_size */
- mem_alloc_size = 4 << 20;
} else {
break;
}
}
cvmx_bootmem_unlock();
- /* Add the memory region for the kernel. */
- kernel_start = (unsigned long) _text;
- kernel_size = _end - _text;
-
- /* Adjust for physical offset. */
- kernel_start &= ~0xffffffff80000000ULL;
- add_memory_region(kernel_start, kernel_size, BOOT_MEM_RAM);
#endif /* CONFIG_CRASH_DUMP */
#ifdef CONFIG_CAVIUM_RESERVE32
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v5 5/7] MIPS: Octeon: Populate kernel memory from cvmx_bootmem named blocks.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
` (3 preceding siblings ...)
2018-03-14 22:24 ` [PATCH v5 4/7] MIPS: Octeon: Remove crufty KEXEC and CRASH_DUMP code Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 6/7] MIPS: Add the concept of BOOT_MEM_KERNEL to boot_mem_map Steven J. Hill
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips; +Cc: David Daney, Carlos Munoz, Corey Minyard
From: David Daney <david.daney@cavium.com>
Command line syntax is:
mem=block:block_name1,block_name2,...
A maximum of 4 blocks are currently supported
Signed-off-by: David Daney <david.daney@cavium.com>
Signed-off-by: Carlos Munoz <carlos.munoz@caviumnetworks.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
---
arch/mips/cavium-octeon/setup.c | 66 ++++++++++++++++++++++++++++++++++++-----
1 file changed, 59 insertions(+), 7 deletions(-)
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index 46e2bb0..2855d8d 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -198,6 +198,9 @@ static int octeon_uart;
extern asmlinkage void handle_int(void);
+/* Up to four blocks may be specified. */
+static char __initdata named_memory_blocks[4][CVMX_BOOTMEM_NAME_LEN];
+
/**
* Return non zero if we are currently running in the Octeon simulator
*
@@ -774,7 +777,26 @@ void __init prom_init(void)
for (i = 0; i < argc; i++) {
const char *arg =
cvmx_phys_to_ptr(octeon_boot_desc_ptr->argv[i]);
- if ((strncmp(arg, "MEM=", 4) == 0) ||
+ if (strncmp(arg, "mem=block:", 10) == 0) {
+ const char *pos = arg + 10;
+ int j;
+
+ for (j = 0; pos[0] && j < ARRAY_SIZE(named_memory_blocks); j++) {
+ int len;
+ char *comma = strchr(pos, ',');
+ if (comma)
+ len = comma - pos;
+ else
+ len = max(strlen(pos), ARRAY_SIZE(named_memory_blocks[0]));
+ strncpy(named_memory_blocks[j], pos, len);
+ if (comma)
+ pos = comma + 1;
+ else
+ break;
+ }
+ for (j = 0; j < ARRAY_SIZE(named_memory_blocks); j++)
+ pr_err("Named Block[%d] = \"%s\"\n", j, named_memory_blocks[j]);
+ } else if ((strncmp(arg, "MEM=", 4) == 0) ||
(strncmp(arg, "mem=", 4) == 0)) {
max_memory = memparse(arg + 4, &p);
if (max_memory == 0)
@@ -875,10 +897,35 @@ void __init plat_mem_setup(void)
uint64_t total;
uint64_t crashk_end;
int64_t memory;
+ const struct cvmx_bootmem_named_block_desc *named_block;
total = 0;
crashk_end = 0;
+ if (named_memory_blocks[0][0]) {
+ /* Memory from named blocks only */
+ int i;
+
+ for (i = 0;
+ named_memory_blocks[i][0] && i < ARRAY_SIZE(named_memory_blocks);
+ i++) {
+ named_block = cvmx_bootmem_find_named_block(named_memory_blocks[i]);
+ if (!named_block) {
+ pr_err("Error: Couldn't find cvmx_bootmem block \"%s\"",
+ named_memory_blocks[i]);
+ return;
+ }
+ pr_info("Adding memory from \"%s\": %016lx @ %016lx\n",
+ named_memory_blocks[i],
+ (unsigned long)named_block->size,
+ (unsigned long)named_block->base_addr);
+ add_memory_region(named_block->base_addr, named_block->size,
+ BOOT_MEM_RAM);
+ total += named_block->size;
+ }
+ goto mem_alloc_done;
+ }
+
/*
* The Mips memory init uses the first memory location for
* some memory vectors. When SPARSEMEM is in use, it doesn't
@@ -901,18 +948,23 @@ void __init plat_mem_setup(void)
crashk_end = crashk_base + crashk_size;
}
#endif
- /*
- * When allocating memory, we want incrementing addresses from
- * bootmem_alloc so the code in add_memory_region can merge
- * regions next to each other.
- */
cvmx_bootmem_lock();
while ((boot_mem_map.nr_map < BOOT_MEM_MAP_MAX)
&& (total < max_memory)) {
+#if defined(CONFIG_64BIT) || defined(CONFIG_64BIT_PHYS_ADDR)
memory = cvmx_bootmem_phy_alloc(mem_alloc_size,
__pa_symbol(&_end), -1,
0x100000,
CVMX_BOOTMEM_FLAG_NO_LOCKING);
+#elif defined(CONFIG_HIGHMEM)
+ memory = cvmx_bootmem_phy_alloc(mem_alloc_size, 0, 1ull << 31,
+ 0x100000,
+ CVMX_BOOTMEM_FLAG_NO_LOCKING);
+#else
+ memory = cvmx_bootmem_phy_alloc(mem_alloc_size, 0, 512 << 20,
+ 0x100000,
+ CVMX_BOOTMEM_FLAG_NO_LOCKING);
+#endif
if (memory >= 0) {
u64 size = mem_alloc_size;
@@ -942,7 +994,7 @@ void __init plat_mem_setup(void)
}
cvmx_bootmem_unlock();
#endif /* CONFIG_CRASH_DUMP */
-
+mem_alloc_done:
#ifdef CONFIG_CAVIUM_RESERVE32
/*
* Now that we've allocated the kernel memory it is safe to
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v5 6/7] MIPS: Add the concept of BOOT_MEM_KERNEL to boot_mem_map.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
` (4 preceding siblings ...)
2018-03-14 22:24 ` [PATCH v5 5/7] MIPS: Octeon: Populate kernel memory from cvmx_bootmem named blocks Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:24 ` [PATCH v5 7/7] MIPS: Octeon: Add working hotplug CPU support Steven J. Hill
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips; +Cc: David Daney, Carlos Munoz
No change to memory initialization, but this gets us ready for the
next patches adding hotplug CPU and NUMA support for Octeon.
Signed-off-by: David Daney <david.daney@cavium.com>
Signed-off-by: Carlos Munoz <cmunoz@caviumnetworks.com>
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
---
arch/mips/include/asm/bootinfo.h | 1 +
arch/mips/kernel/setup.c | 30 +++++++++++++++++++++---------
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/arch/mips/include/asm/bootinfo.h b/arch/mips/include/asm/bootinfo.h
index a301a8f..199f9aa 100644
--- a/arch/mips/include/asm/bootinfo.h
+++ b/arch/mips/include/asm/bootinfo.h
@@ -92,6 +92,7 @@ extern unsigned long mips_machtype;
#define BOOT_MEM_ROM_DATA 2
#define BOOT_MEM_RESERVED 3
#define BOOT_MEM_INIT_RAM 4
+#define BOOT_MEM_KERNEL 5
/*
* A memory map that's built upon what was determined
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 5f8b0a9..9e2bb5fd 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -190,9 +190,15 @@ static void __init print_memory_map(void)
const int field = 2 * sizeof(unsigned long);
for (i = 0; i < boot_mem_map.nr_map; i++) {
- printk(KERN_INFO " memory: %0*Lx @ %0*Lx ",
- field, (unsigned long long) boot_mem_map.map[i].size,
- field, (unsigned long long) boot_mem_map.map[i].addr);
+ if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) &&
+ (boot_mem_map.map[i].type == BOOT_MEM_KERNEL))
+ printk(KERN_INFO " memory: %.*s @ %.*s ",
+ field, "----------------",
+ field, "----------------");
+ else
+ printk(KERN_INFO " memory: %0*Lx @ %0*Lx ",
+ field, (unsigned long long) boot_mem_map.map[i].size,
+ field, (unsigned long long) boot_mem_map.map[i].addr);
switch (boot_mem_map.map[i].type) {
case BOOT_MEM_RAM:
@@ -201,6 +207,9 @@ static void __init print_memory_map(void)
case BOOT_MEM_INIT_RAM:
printk(KERN_CONT "(usable after init)\n");
break;
+ case BOOT_MEM_KERNEL:
+ printk(KERN_CONT "(kernel data and code)\n");
+ break;
case BOOT_MEM_ROM_DATA:
printk(KERN_CONT "(ROM data)\n");
break;
@@ -833,6 +842,7 @@ static void __init arch_mem_init(char **cmdline_p)
{
struct memblock_region *reg;
extern void plat_mem_setup(void);
+ phys_addr_t kernel_begin, init_begin, init_end, kernel_end;
#if defined(CONFIG_CMDLINE_BOOL) && defined(CONFIG_CMDLINE_OVERRIDE)
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
@@ -871,12 +881,13 @@ static void __init arch_mem_init(char **cmdline_p)
* into another memory section you don't want that to be
* freed when the initdata is freed.
*/
- arch_mem_addpart(PFN_DOWN(__pa_symbol(&_text)) << PAGE_SHIFT,
- PFN_UP(__pa_symbol(&_edata)) << PAGE_SHIFT,
- BOOT_MEM_RAM);
- arch_mem_addpart(PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT,
- PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT,
- BOOT_MEM_INIT_RAM);
+ kernel_begin = PFN_DOWN(__pa_symbol(&_text)) << PAGE_SHIFT;
+ kernel_end = PFN_UP(__pa_symbol(&_end)) << PAGE_SHIFT;
+ init_begin = PFN_UP(__pa_symbol(&__init_begin)) << PAGE_SHIFT;
+ init_end = PFN_DOWN(__pa_symbol(&__init_end)) << PAGE_SHIFT;
+ arch_mem_addpart(kernel_begin, init_begin, BOOT_MEM_KERNEL);
+ arch_mem_addpart(init_end, kernel_end, BOOT_MEM_KERNEL);
+ arch_mem_addpart(init_begin, init_end, BOOT_MEM_INIT_RAM);
pr_info("Determined physical RAM map:\n");
print_memory_map();
@@ -961,6 +972,7 @@ static void __init resource_init(void)
case BOOT_MEM_RAM:
case BOOT_MEM_INIT_RAM:
case BOOT_MEM_ROM_DATA:
+ case BOOT_MEM_KERNEL:
res->name = "System RAM";
res->flags |= IORESOURCE_SYSRAM;
break;
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH v5 7/7] MIPS: Octeon: Add working hotplug CPU support.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
` (5 preceding siblings ...)
2018-03-14 22:24 ` [PATCH v5 6/7] MIPS: Add the concept of BOOT_MEM_KERNEL to boot_mem_map Steven J. Hill
@ 2018-03-14 22:24 ` Steven J. Hill
2018-03-14 22:45 ` [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
2018-03-22 13:31 ` James Hogan
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:24 UTC (permalink / raw)
To: linux-mips
Cc: David Daney, Leonid Rosenboim, Chandrakala Chavva, Carlos Munoz,
Corey Minyard
From: David Daney <david.daney@cavium.com>
Signed-off-by: David Daney <david.daney@cavium.com>
Signed-off-by: Leonid Rosenboim <lrosenboim@caviumnetworks.com>
Signed-off-by: Chandrakala Chavva <cchavva@caviumnetworks.com>
Signed-off-by: Carlos Munoz <cmunoz@caviumnetworks.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Signed-off-by: Steven J. Hill <steven.hill@cavium.com>
---
arch/mips/Kconfig | 2 +-
arch/mips/cavium-octeon/octeon_boot.h | 95 ---------
arch/mips/cavium-octeon/setup.c | 2 +-
arch/mips/cavium-octeon/smp.c | 235 +++++++--------------
.../asm/mach-cavium-octeon/kernel-entry-init.h | 58 ++++-
arch/mips/include/asm/mipsregs.h | 1 +
arch/mips/include/asm/octeon/cvmx-coremask.h | 26 ++-
arch/mips/include/asm/octeon/cvmx.h | 22 +-
arch/mips/include/asm/octeon/octeon.h | 2 +
9 files changed, 174 insertions(+), 269 deletions(-)
delete mode 100644 arch/mips/cavium-octeon/octeon_boot.h
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 8128c3b..73b0a1f 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -896,7 +896,7 @@ config CAVIUM_OCTEON_SOC
select EDAC_SUPPORT
select EDAC_ATOMIC_SCRUB
select SYS_SUPPORTS_LITTLE_ENDIAN
- select SYS_SUPPORTS_HOTPLUG_CPU if CPU_BIG_ENDIAN
+ select SYS_SUPPORTS_HOTPLUG_CPU
select SYS_HAS_EARLY_PRINTK
select SYS_HAS_CPU_CAVIUM_OCTEON
select HW_HAS_PCI
diff --git a/arch/mips/cavium-octeon/octeon_boot.h b/arch/mips/cavium-octeon/octeon_boot.h
deleted file mode 100644
index a6ce7c4..0000000
--- a/arch/mips/cavium-octeon/octeon_boot.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * (C) Copyright 2004, 2005 Cavium Networks
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#ifndef __OCTEON_BOOT_H__
-#define __OCTEON_BOOT_H__
-
-#include <linux/types.h>
-
-struct boot_init_vector {
- /* First stage address - in ram instead of flash */
- uint64_t code_addr;
- /* Setup code for application, NOT application entry point */
- uint32_t app_start_func_addr;
- /* k0 is used for global data - needs to be passed to other cores */
- uint32_t k0_val;
- /* Address of boot info block structure */
- uint64_t boot_info_addr;
- uint32_t flags; /* flags */
- uint32_t pad;
-};
-
-/* similar to bootloader's linux_app_boot_info but without global data */
-struct linux_app_boot_info {
-#ifdef __BIG_ENDIAN_BITFIELD
- uint32_t labi_signature;
- uint32_t start_core0_addr;
- uint32_t avail_coremask;
- uint32_t pci_console_active;
- uint32_t icache_prefetch_disable;
- uint32_t padding;
- uint64_t InitTLBStart_addr;
- uint32_t start_app_addr;
- uint32_t cur_exception_base;
- uint32_t no_mark_private_data;
- uint32_t compact_flash_common_base_addr;
- uint32_t compact_flash_attribute_base_addr;
- uint32_t led_display_base_addr;
-#else
- uint32_t start_core0_addr;
- uint32_t labi_signature;
-
- uint32_t pci_console_active;
- uint32_t avail_coremask;
-
- uint32_t padding;
- uint32_t icache_prefetch_disable;
-
- uint64_t InitTLBStart_addr;
-
- uint32_t cur_exception_base;
- uint32_t start_app_addr;
-
- uint32_t compact_flash_common_base_addr;
- uint32_t no_mark_private_data;
-
- uint32_t led_display_base_addr;
- uint32_t compact_flash_attribute_base_addr;
-#endif
-};
-
-/* If not to copy a lot of bootloader's structures
- here is only offset of requested member */
-#define AVAIL_COREMASK_OFFSET_IN_LINUX_APP_BOOT_BLOCK 0x765c
-
-/* hardcoded in bootloader */
-#define LABI_ADDR_IN_BOOTLOADER 0x700
-
-#define LINUX_APP_BOOT_BLOCK_NAME "linux-app-boot"
-
-#define LABI_SIGNATURE 0xAABBCC01
-
-/* from uboot-headers/octeon_mem_map.h */
-#define EXCEPTION_BASE_INCR (4 * 1024)
- /* Increment size for exception base addresses (4k minimum) */
-#define EXCEPTION_BASE_BASE 0
-#define BOOTLOADER_PRIV_DATA_BASE (EXCEPTION_BASE_BASE + 0x800)
-#define BOOTLOADER_BOOT_VECTOR (BOOTLOADER_PRIV_DATA_BASE)
-
-#endif /* __OCTEON_BOOT_H__ */
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index 2855d8d..068787d 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -756,7 +756,7 @@ void __init prom_init(void)
if (OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2) ||
OCTEON_IS_MODEL(OCTEON_CN31XX))
cvmx_write_csr(CVMX_CIU_SOFT_BIST, 0);
- else
+ else if (!OCTEON_IS_MODEL(OCTEON_CN78XX))
cvmx_write_csr(CVMX_CIU_SOFT_BIST, 1);
/* Default to 64MB in the simulator to speed things up */
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index f08f175..19573fb 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -3,41 +3,39 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2004-2008, 2009, 2010 Cavium Networks
+ * Copyright (C) 2004-2017 Cavium, Inc.
*/
#include <linux/cpu.h>
#include <linux/delay.h>
#include <linux/smp.h>
#include <linux/interrupt.h>
-#include <linux/kernel_stat.h>
#include <linux/sched.h>
#include <linux/sched/hotplug.h>
#include <linux/sched/task_stack.h>
#include <linux/init.h>
#include <linux/export.h>
-#include <asm/mmu_context.h>
#include <asm/time.h>
#include <asm/setup.h>
+#include <asm/cacheflush.h>
+#include <asm/tlbflush.h>
#include <asm/octeon/octeon.h>
#include <asm/octeon/cvmx-sysinfo.h>
+#include <asm/octeon/cvmx-boot-vector.h>
-#include "octeon_boot.h"
-
-volatile unsigned long octeon_processor_boot = 0xff;
-volatile unsigned long octeon_processor_sp;
-volatile unsigned long octeon_processor_gp;
+unsigned long octeon_processor_boot = ~0ul;
+unsigned long octeon_processor_sp;
+unsigned long octeon_processor_gp;
#ifdef CONFIG_RELOCATABLE
-volatile unsigned long octeon_processor_relocated_kernel_entry;
+unsigned long octeon_processor_relocated_kernel_entry;
#endif /* CONFIG_RELOCATABLE */
-#ifdef CONFIG_HOTPLUG_CPU
-uint64_t octeon_bootloader_entry_addr;
-EXPORT_SYMBOL(octeon_bootloader_entry_addr);
-#endif
+static struct cvmx_boot_vector_element *octeon_bootvector;
+static void *octeon_hotplug_entry_raw;
-extern void kernel_entry(unsigned long arg1, ...);
+/* State of each CPU. */
+DEFINE_PER_CPU(int, cpu_state);
static void octeon_icache_flush(void)
{
@@ -99,57 +97,32 @@ static irqreturn_t mailbox_interrupt(int irq, void *dev_id)
void octeon_send_ipi_single(int cpu, unsigned int action)
{
int coreid = cpu_logical_map(cpu);
- /*
- pr_info("SMP: Mailbox send cpu=%d, coreid=%d, action=%u\n", cpu,
- coreid, action);
- */
+
cvmx_write_csr(CVMX_CIU_MBOX_SETX(coreid), action);
}
static inline void octeon_send_ipi_mask(const struct cpumask *mask,
unsigned int action)
{
- unsigned int i;
-
- for_each_cpu(i, mask)
- octeon_send_ipi_single(i, action);
-}
-
-/**
- * Detect available CPUs, populate cpu_possible_mask
- */
-static void octeon_smp_hotplug_setup(void)
-{
-#ifdef CONFIG_HOTPLUG_CPU
- struct linux_app_boot_info *labi;
+ int cpu;
- if (!setup_max_cpus)
- return;
-
- labi = (struct linux_app_boot_info *)PHYS_TO_XKSEG_CACHED(LABI_ADDR_IN_BOOTLOADER);
- if (labi->labi_signature != LABI_SIGNATURE) {
- pr_info("The bootloader on this board does not support HOTPLUG_CPU.");
- return;
- }
-
- octeon_bootloader_entry_addr = labi->InitTLBStart_addr;
-#endif
+ for_each_cpu(cpu, mask)
+ octeon_send_ipi_single(cpu, action);
}
-static void __init octeon_smp_setup(void)
+static void octeon_smp_setup(void)
{
const int coreid = cvmx_get_core_num();
int cpus;
int id;
- struct cvmx_sysinfo *sysinfo = cvmx_sysinfo_get();
-
+ unsigned long t;
#ifdef CONFIG_HOTPLUG_CPU
- int core_mask = octeon_get_boot_coremask();
unsigned int num_cores = cvmx_octeon_num_cores();
#endif
+ struct cvmx_sysinfo *sysinfo = cvmx_sysinfo_get();
/* The present CPUs are initially just the boot cpu (CPU 0). */
- for (id = 0; id < NR_CPUS; id++) {
+ for (id = 0; id < num_possible_cpus(); id++) {
set_cpu_possible(id, id == 0);
set_cpu_present(id, id == 0);
}
@@ -159,7 +132,7 @@ static void __init octeon_smp_setup(void)
/* The present CPUs get the lowest CPU numbers. */
cpus = 1;
- for (id = 0; id < NR_CPUS; id++) {
+ for (id = 0; id < CONFIG_MIPS_NR_CPU_NR_MAP; id++) {
if ((id != coreid) && cvmx_coremask_is_core_set(&sysinfo->core_mask, id)) {
set_cpu_possible(cpus, true);
set_cpu_present(cpus, true);
@@ -169,15 +142,22 @@ static void __init octeon_smp_setup(void)
}
}
+ octeon_bootvector = cvmx_boot_vector_get();
+ if (!octeon_bootvector) {
+ pr_err("Error: Cannot allocate boot vector.\n");
+ return;
+ }
+ t = __pa_symbol(octeon_hotplug_entry);
+ octeon_hotplug_entry_raw = phys_to_virt(t);
+
#ifdef CONFIG_HOTPLUG_CPU
/*
* The possible CPUs are all those present on the chip. We
* will assign CPU numbers for possible cores as well. Cores
* are always consecutively numberd from 0.
*/
- for (id = 0; setup_max_cpus && octeon_bootloader_entry_addr &&
- id < num_cores && id < NR_CPUS; id++) {
- if (!(core_mask & (1 << id))) {
+ for (id = 0; id < num_cores && id < num_possible_cpus(); id++) {
+ if (!(cvmx_coremask_is_core_set(&sysinfo->core_mask, id))) {
set_cpu_possible(cpus, true);
__cpu_number_map[id] = cpus;
__cpu_logical_map[cpus] = id;
@@ -185,8 +165,6 @@ static void __init octeon_smp_setup(void)
}
}
#endif
-
- octeon_smp_hotplug_setup();
}
@@ -208,27 +186,34 @@ int plat_post_relocation(long offset)
*/
static int octeon_boot_secondary(int cpu, struct task_struct *idle)
{
- int count;
+ int node;
+ int coreid = cpu_logical_map(cpu);
+
+ pr_info("SMP: Booting CPU%02d (CoreId %2d)...\n", cpu, coreid);
- pr_info("SMP: Booting CPU%02d (CoreId %2d)...\n", cpu,
- cpu_logical_map(cpu));
+ octeon_bootvector[coreid].target_ptr = (uint64_t)octeon_hotplug_entry_raw;
+ mb();
+ /* Convert coreid to node,core spair and send NMI to target core */
+ node = cvmx_coremask_core_to_node(coreid);
+ coreid = cvmx_coremask_core_on_node(coreid);
+ if (octeon_has_feature(OCTEON_FEATURE_CIU3))
+ cvmx_write_csr_node(node, CVMX_CIU3_NMI, (1ull << coreid));
+ else
+ cvmx_write_csr(CVMX_CIU_NMI, (1 << coreid));
octeon_processor_sp = __KSTK_TOS(idle);
octeon_processor_gp = (unsigned long)(task_thread_info(idle));
- octeon_processor_boot = cpu_logical_map(cpu);
+ /* This barrier is needed to guarantee the following is done last */
mb();
- count = 10000;
- while (octeon_processor_sp && count) {
- /* Waiting for processor to get the SP and GP */
+ /* Indicate which core is being brought up out of pan */
+ octeon_processor_boot = coreid;
+
+ /* Waiting for processor to get the SP and GP */
+ while (octeon_processor_sp)
udelay(1);
- count--;
- }
- if (count == 0) {
- pr_err("Secondary boot timeout\n");
- return -ETIMEDOUT;
- }
+ octeon_processor_boot = ~0ul;
return 0;
}
@@ -256,11 +241,24 @@ static void octeon_init_secondary(void)
*/
static void __init octeon_prepare_cpus(unsigned int max_cpus)
{
+ u64 mask;
+ u64 coreid;
+
/*
* Only the low order mailbox bits are used for IPIs, leave
* the other bits alone.
*/
- cvmx_write_csr(CVMX_CIU_MBOX_CLRX(cvmx_get_core_num()), 0xffff);
+ if (OCTEON_IS_MODEL(OCTEON_CN68XX))
+ mask = 0xff;
+ else
+ mask = 0xffff;
+
+ coreid = cvmx_get_core_num();
+
+ /* Clear pending mailbox interrupts */
+ cvmx_write_csr(CVMX_CIU_MBOX_CLRX(coreid), mask);
+
+ /* Attach mailbox interrupt handler */
if (request_irq(OCTEON_IRQ_MBOX0, mailbox_interrupt,
IRQF_PERCPU | IRQF_NO_THREAD, "SMP-IPI",
mailbox_interrupt)) {
@@ -275,6 +273,8 @@ static void __init octeon_prepare_cpus(unsigned int max_cpus)
static void octeon_smp_finish(void)
{
octeon_user_io_init();
+ per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
+ mb();
/* to generate the first CPU timer interrupt */
write_c0_compare(read_c0_count() + mips_hpt_frequency / HZ);
@@ -283,9 +283,6 @@ static void octeon_smp_finish(void)
#ifdef CONFIG_HOTPLUG_CPU
-/* State of each CPU. */
-DEFINE_PER_CPU(int, cpu_state);
-
static int octeon_cpu_disable(void)
{
unsigned int cpu = smp_processor_id();
@@ -293,9 +290,6 @@ static int octeon_cpu_disable(void)
if (cpu == 0)
return -EBUSY;
- if (!octeon_bootloader_entry_addr)
- return -ENOTSUPP;
-
set_cpu_online(cpu, false);
calculate_cpu_foreign_map();
octeon_fixup_irqs();
@@ -308,108 +302,21 @@ static int octeon_cpu_disable(void)
static void octeon_cpu_die(unsigned int cpu)
{
- int coreid = cpu_logical_map(cpu);
- uint32_t mask, new_mask;
- const struct cvmx_bootmem_named_block_desc *block_desc;
-
while (per_cpu(cpu_state, cpu) != CPU_DEAD)
cpu_relax();
-
- /*
- * This is a bit complicated strategics of getting/settig available
- * cores mask, copied from bootloader
- */
-
- mask = 1 << coreid;
- /* LINUX_APP_BOOT_BLOCK is initialized in bootoct binary */
- block_desc = cvmx_bootmem_find_named_block(LINUX_APP_BOOT_BLOCK_NAME);
-
- if (!block_desc) {
- struct linux_app_boot_info *labi;
-
- labi = (struct linux_app_boot_info *)PHYS_TO_XKSEG_CACHED(LABI_ADDR_IN_BOOTLOADER);
-
- labi->avail_coremask |= mask;
- new_mask = labi->avail_coremask;
- } else { /* alternative, already initialized */
- uint32_t *p = (uint32_t *)PHYS_TO_XKSEG_CACHED(block_desc->base_addr +
- AVAIL_COREMASK_OFFSET_IN_LINUX_APP_BOOT_BLOCK);
- *p |= mask;
- new_mask = *p;
- }
-
- pr_info("Reset core %d. Available Coremask = 0x%x \n", coreid, new_mask);
- mb();
- cvmx_write_csr(CVMX_CIU_PP_RST, 1 << coreid);
- cvmx_write_csr(CVMX_CIU_PP_RST, 0);
}
void play_dead(void)
{
- int cpu = cpu_number_map(cvmx_get_core_num());
+ int cpu = smp_processor_id();
idle_task_exit();
- octeon_processor_boot = 0xff;
per_cpu(cpu_state, cpu) = CPU_DEAD;
-
- mb();
-
- while (1) /* core will be reset here */
- ;
-}
-
-static void start_after_reset(void)
-{
- kernel_entry(0, 0, 0); /* set a2 = 0 for secondary core */
-}
-
-static int octeon_update_boot_vector(unsigned int cpu)
-{
-
- int coreid = cpu_logical_map(cpu);
- uint32_t avail_coremask;
- const struct cvmx_bootmem_named_block_desc *block_desc;
- struct boot_init_vector *boot_vect =
- (struct boot_init_vector *)PHYS_TO_XKSEG_CACHED(BOOTLOADER_BOOT_VECTOR);
-
- block_desc = cvmx_bootmem_find_named_block(LINUX_APP_BOOT_BLOCK_NAME);
-
- if (!block_desc) {
- struct linux_app_boot_info *labi;
-
- labi = (struct linux_app_boot_info *)PHYS_TO_XKSEG_CACHED(LABI_ADDR_IN_BOOTLOADER);
-
- avail_coremask = labi->avail_coremask;
- labi->avail_coremask &= ~(1 << coreid);
- } else { /* alternative, already initialized */
- avail_coremask = *(uint32_t *)PHYS_TO_XKSEG_CACHED(
- block_desc->base_addr + AVAIL_COREMASK_OFFSET_IN_LINUX_APP_BOOT_BLOCK);
- }
-
- if (!(avail_coremask & (1 << coreid))) {
- /* core not available, assume, that caught by simple-executive */
- cvmx_write_csr(CVMX_CIU_PP_RST, 1 << coreid);
- cvmx_write_csr(CVMX_CIU_PP_RST, 0);
- }
-
- boot_vect[coreid].app_start_func_addr =
- (uint32_t) (unsigned long) start_after_reset;
- boot_vect[coreid].code_addr = octeon_bootloader_entry_addr;
-
mb();
-
- cvmx_write_csr(CVMX_CIU_NMI, (1 << coreid) & avail_coremask);
-
- return 0;
-}
-
-static int register_cavium_notifier(void)
-{
- return cpuhp_setup_state_nocalls(CPUHP_MIPS_SOC_PREPARE,
- "mips/cavium:prepare",
- octeon_update_boot_vector, NULL);
+ local_irq_disable();
+ while (1)
+ __asm__ __volatile__("wait\n");
}
-late_initcall(register_cavium_notifier);
#endif /* CONFIG_HOTPLUG_CPU */
diff --git a/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h b/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h
index c38b38c..cfcf4f3 100644
--- a/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h
+++ b/arch/mips/include/asm/mach-cavium-octeon/kernel-entry-init.h
@@ -3,11 +3,13 @@
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 2005-2008 Cavium Networks, Inc
+ * Copyright (C) 2005-2017 Cavium, Inc
*/
#ifndef __ASM_MACH_CAVIUM_OCTEON_KERNEL_ENTRY_H
#define __ASM_MACH_CAVIUM_OCTEON_KERNEL_ENTRY_H
+#include <asm/octeon/cvmx-asm.h>
+
#define CP0_CVMCTL_REG $9, 7
#define CP0_CVMMEMCTL_REG $11,7
#define CP0_PRID_REG $15, 0
@@ -26,6 +28,60 @@
# a3 = address of boot descriptor block
.set push
.set arch=octeon
+ b 7f
+FEXPORT(octeon_hotplug_entry)
+ move a0, zero
+ move a1, zero
+ move a2, zero
+ move a3, zero
+7:
+ mfc0 v0, CP0_STATUS
+ /* Force 64-bit addressing enabled */
+ ori v0, v0, (ST0_UX | ST0_SX | ST0_KX)
+ /* Clear NMI and SR as they are sometimes restored and 0 -> 1
+ * transitions are not allowed
+ */
+ li v1, ~(ST0_NMI | ST0_SR)
+ and v0, v1
+ mtc0 v0, CP0_STATUS
+
+ # Clear the TLB.
+ mfc0 v0, CP0_CONFIG, 1
+ ext v0, v0, MIPS_CONF1_TLBS_SHIFT, MIPS_CONF1_TLBS_SIZE
+ mfc0 v1, CP0_CONFIG, 3
+ bgez v1, 1f
+ mfc0 v1, CP0_CONFIG, 4
+ andi v1, v1, MIPS_CONF4_MMUSIZEEXT_SIZE
+ ins v0, v1, MIPS_CONF1_TLBS_SIZE, MIPS_CONF4_MMUSIZEEXT_SIZE
+1: # Number of TLBs in v0
+
+ dmtc0 zero, $2, 0 # EntryLo0
+ dmtc0 zero, $3, 0 # EntryLo1
+ dmtc0 zero, $5, 0 # PageMask
+ dla t0, 0xffffffff90000000
+10:
+ dmtc0 t0, $10, 0 # EntryHi
+ tlbp
+ mfc0 t1, $0, 0 # Index
+ bltz t1, 1f
+ tlbr
+ dmtc0 zero, $2, 0 # EntryLo0
+ dmtc0 zero, $3, 0 # EntryLo1
+ dmtc0 zero, $5, 0 # PageMask
+ tlbwi # Make it a 'normal' sized page
+ daddiu t0, t0, 8192
+ b 10b
+1:
+ mtc0 v0, $0, 0 # Index
+ tlbwi
+ .set noreorder
+ bne v0, zero, 10b
+ addiu v0, v0, -1
+ .set reorder
+
+ mtc0 zero, $0, 0 # Index
+ dmtc0 zero, $10, 0 # EntryHi
+
# Read the cavium mem control register
dmfc0 v0, CP0_CVMMEMCTL_REG
# Clear the lower 6 bits, the CVMSEG size
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index 858752d..cf8c13d 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -633,6 +633,7 @@
#define MIPS_CONF4_MMUSIZEEXT_SHIFT (0)
#define MIPS_CONF4_MMUSIZEEXT (_ULCAST_(255) << 0)
+#define MIPS_CONF4_MMUSIZEEXT_SIZE (8)
#define MIPS_CONF4_FTLBSETS_SHIFT (0)
#define MIPS_CONF4_FTLBSETS (_ULCAST_(15) << MIPS_CONF4_FTLBSETS_SHIFT)
#define MIPS_CONF4_FTLBWAYS_SHIFT (4)
diff --git a/arch/mips/include/asm/octeon/cvmx-coremask.h b/arch/mips/include/asm/octeon/cvmx-coremask.h
index 097dc09..625cf94 100644
--- a/arch/mips/include/asm/octeon/cvmx-coremask.h
+++ b/arch/mips/include/asm/octeon/cvmx-coremask.h
@@ -29,7 +29,6 @@
#ifndef __CVMX_COREMASK_H__
#define __CVMX_COREMASK_H__
-#define CVMX_MIPS_MAX_CORES 1024
/* bits per holder */
#define CVMX_COREMASK_ELTSZ 64
@@ -86,4 +85,29 @@ static inline void cvmx_coremask_clear_core(struct cvmx_coremask *pcm, int core)
pcm->coremask_bitmap[i] &= ~(1ull << n);
}
+/**
+ * For multi-node systems, return the node a core belongs to.
+ *
+ * @param core - core number (0-1023)
+ *
+ * @return node number core belongs to
+ */
+static inline int cvmx_coremask_core_to_node(int core)
+{
+ return (core >> CVMX_NODE_NO_SHIFT) & CVMX_NODE_MASK;
+}
+
+/**
+ * Given a core number on a multi-node system, return the core number for a
+ * particular node.
+ *
+ * @param core - global core number
+ *
+ * @returns core number local to the node.
+ */
+static inline int cvmx_coremask_core_on_node(int core)
+{
+ return (core & GENMASK((CVMX_NODE_NO_SHIFT - 1), 0));
+}
+
#endif /* __CVMX_COREMASK_H__ */
diff --git a/arch/mips/include/asm/octeon/cvmx.h b/arch/mips/include/asm/octeon/cvmx.h
index 392556a..06f9258 100644
--- a/arch/mips/include/asm/octeon/cvmx.h
+++ b/arch/mips/include/asm/octeon/cvmx.h
@@ -53,6 +53,17 @@ enum cvmx_mips_space {
#define CVMX_ADD_IO_SEG(add) CVMX_ADD_SEG(CVMX_IO_SEG, (add))
#endif
+#define CVMX_MAX_CORES (48)
+#define CVMX_MIPS_MAX_CORE_BITS (10) /** Maximum # of bits to define cores */
+#define CVMX_MIPS_MAX_CORES (1 << CVMX_MIPS_MAX_CORE_BITS)
+#define CVMX_NODE_NO_SHIFT (7) /* Maximum # of bits to define core in node */
+#define CVMX_NODE_BITS (2) /* Number of bits to define a node */
+#define CVMX_NODE_MASK (CVMX_MAX_NODES - 1)
+#define CVMX_MAX_NODES (1 << CVMX_NODE_BITS)
+#define CVMX_NODE_IO_SHIFT (36)
+#define CVMX_NODE_MEM_SHIFT (40)
+#define CVMX_NODE_IO_MASK ((uint64_t)CVMX_NODE_MASK << CVMX_NODE_IO_SHIFT)
+
#include <asm/octeon/cvmx-asm.h>
#include <asm/octeon/octeon-model.h>
@@ -83,7 +94,6 @@ enum cvmx_mips_space {
#define cvmx_dprintf(...) {}
#endif
-#define CVMX_MAX_CORES (16)
#define CVMX_CACHE_LINE_SIZE (128) /* In bytes */
#define CVMX_CACHE_LINE_MASK (CVMX_CACHE_LINE_SIZE - 1) /* In bytes */
#define CVMX_CACHE_LINE_ALIGNED __attribute__ ((aligned(CVMX_CACHE_LINE_SIZE)))
@@ -339,9 +349,6 @@ static inline unsigned int cvmx_get_core_num(void)
return core_num;
}
-/* Maximum # of bits to define core in node */
-#define CVMX_NODE_NO_SHIFT 7
-#define CVMX_NODE_MASK 0x3
static inline unsigned int cvmx_get_node_num(void)
{
unsigned int core_num = cvmx_get_core_num();
@@ -449,7 +456,7 @@ static inline uint64_t cvmx_get_cycle_global(void)
* 2) Check if ("type".s."field" "op" "value")
* 3) If #2 isn't true loop to #1 unless too much time has passed.
*/
-#define CVMX_WAIT_FOR_FIELD64(address, type, field, op, value, timeout_usec)\
+#define CVMX_WAIT_FOR_FIELD64_NODE(node, address, type, field, op, value, timeout_usec) \
( \
{ \
int result; \
@@ -458,7 +465,7 @@ static inline uint64_t cvmx_get_cycle_global(void)
cvmx_sysinfo_get()->cpu_clock_hz / 1000000; \
type c; \
while (1) { \
- c.u64 = cvmx_read_csr(address); \
+ c.u64 = cvmx_read_csr_node(node, address); \
if ((c.s.field) op(value)) { \
result = 0; \
break; \
@@ -474,6 +481,9 @@ static inline uint64_t cvmx_get_cycle_global(void)
/***************************************************************************/
+#define CVMX_WAIT_FOR_FIELD64(address, type, field, op, value, timeout_usec) \
+ CVMX_WAIT_FOR_FIELD64_NODE(0, address, type, field, op, value, timeout_usec)
+
/* Return the number of cores available in the chip */
static inline uint32_t cvmx_octeon_num_cores(void)
{
diff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h
index c99c4b6..0980628 100644
--- a/arch/mips/include/asm/octeon/octeon.h
+++ b/arch/mips/include/asm/octeon/octeon.h
@@ -355,6 +355,8 @@ extern uint64_t octeon_bootloader_entry_addr;
extern void (*octeon_irq_setup_secondary)(void);
+extern asmlinkage void octeon_hotplug_entry(void);
+
typedef void (*octeon_irq_ip4_handler_t)(void);
void octeon_irq_set_ip4_handler(octeon_irq_ip4_handler_t);
--
2.1.4
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH v5 0/7] Add Octeon Hotplug CPU Support.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
` (6 preceding siblings ...)
2018-03-14 22:24 ` [PATCH v5 7/7] MIPS: Octeon: Add working hotplug CPU support Steven J. Hill
@ 2018-03-14 22:45 ` Steven J. Hill
2018-03-22 13:31 ` James Hogan
8 siblings, 0 replies; 10+ messages in thread
From: Steven J. Hill @ 2018-03-14 22:45 UTC (permalink / raw)
To: linux-mips
On 03/14/2018 05:24 PM, Steven J. Hill wrote:
>
> Changes in v4:
> - Rebased against v4.16-rc5 kernel.
> - Smaller patchset due to some previous patches going upstream.
>
Yeah, should have been v5, oh well.
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH v5 0/7] Add Octeon Hotplug CPU Support.
2018-03-14 22:24 [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
` (7 preceding siblings ...)
2018-03-14 22:45 ` [PATCH v5 0/7] Add Octeon Hotplug CPU Support Steven J. Hill
@ 2018-03-22 13:31 ` James Hogan
8 siblings, 0 replies; 10+ messages in thread
From: James Hogan @ 2018-03-22 13:31 UTC (permalink / raw)
To: Steven J. Hill; +Cc: linux-mips
[-- Attachment #1: Type: text/plain, Size: 726 bytes --]
On Wed, Mar 14, 2018 at 05:24:11PM -0500, Steven J. Hill wrote:
> This patchset adds working Octeon Hotplug CPU. It has been tested
> on our 70xx and 78xx develpoment boards. The 70xx has 4 cores and
> the 78xx has 48 cores. This was also tested on an EdgerouterPRO,
> which has 2 cores.
>
> Changes in v4:
> - Rebased against v4.16-rc5 kernel.
> - Smaller patchset due to some previous patches going upstream.
NAK. Please address v4 feedback:
On Thu, Feb 08, 2018 at 10:22:47PM +0000, James Hogan wrote:
> This series doesn't appear to build even cavium_octeon_defconfig since
> patch 1, and is full of checkpatch errors and warnings.
https://patchwork.linux-mips.org/cover/17873/#29723
Thanks
James
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread