All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/4] MIPS: OCTEON: run-time checks for HOTPLUG_CPU
@ 2014-06-27 21:59 Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 1/4] MIPS: OCTEON: SMP: delete redundant check Aaro Koskinen
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Aaro Koskinen @ 2014-06-27 21:59 UTC (permalink / raw
  To: linux-mips, Ralf Baechle, David Daney; +Cc: Aaro Koskinen

Hi,

Here's a second attempt to be able to run an OCTEON kernel configured
with HOTPLUG_CPU on systems with legacy bootloaders that do not support it.

Aaro Koskinen (4):
  MIPS: OCTEON: SMP: delete redundant check
  MIPS: OCTEON: watchdog: don't jump to bootloader without entry address
  MIPS: OCTEON: support disabling HOTPLUG_CPU run-time
  MIPS: OCTEON: disable HOTPLUG_CPU if the bootloader version is
    incorrect

 arch/mips/cavium-octeon/smp.c      | 23 +++++++-------
 drivers/watchdog/octeon-wdt-main.c | 62 +++++++++++++++++++++-----------------
 2 files changed, 46 insertions(+), 39 deletions(-)

-- 
2.0.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/4] MIPS: OCTEON: SMP: delete redundant check
  2014-06-27 21:59 [PATCH v2 0/4] MIPS: OCTEON: run-time checks for HOTPLUG_CPU Aaro Koskinen
@ 2014-06-27 21:59 ` Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 2/4] MIPS: OCTEON: watchdog: don't jump to bootloader without entry address Aaro Koskinen
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Aaro Koskinen @ 2014-06-27 21:59 UTC (permalink / raw
  To: linux-mips, Ralf Baechle, David Daney; +Cc: Aaro Koskinen

The same check is already done earlier in octeon_smp_hotplug_setup().

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Acked-by: David Daney <david.daney@cavium.com>
---
 arch/mips/cavium-octeon/smp.c | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index a7b3ae1..2c8d156 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -192,14 +192,6 @@ static void octeon_init_secondary(void)
  */
 void octeon_prepare_cpus(unsigned int max_cpus)
 {
-#ifdef CONFIG_HOTPLUG_CPU
-	struct linux_app_boot_info *labi;
-
-	labi = (struct linux_app_boot_info *)PHYS_TO_XKSEG_CACHED(LABI_ADDR_IN_BOOTLOADER);
-
-	if (labi->labi_signature != LABI_SIGNATURE)
-		panic("The bootloader version on this board is incorrect.");
-#endif
 	/*
 	 * Only the low order mailbox bits are used for IPIs, leave
 	 * the other bits alone.
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/4] MIPS: OCTEON: watchdog: don't jump to bootloader without entry address
  2014-06-27 21:59 [PATCH v2 0/4] MIPS: OCTEON: run-time checks for HOTPLUG_CPU Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 1/4] MIPS: OCTEON: SMP: delete redundant check Aaro Koskinen
@ 2014-06-27 21:59 ` Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 3/4] MIPS: OCTEON: support disabling HOTPLUG_CPU run-time Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 4/4] MIPS: OCTEON: disable HOTPLUG_CPU if the bootloader version is incorrect Aaro Koskinen
  3 siblings, 0 replies; 5+ messages in thread
From: Aaro Koskinen @ 2014-06-27 21:59 UTC (permalink / raw
  To: linux-mips, Ralf Baechle, David Daney; +Cc: Aaro Koskinen, linux-watchdog

If CONFIG_HOTPLUG_CPU is set, the driver thinks bootloader entry
address is configured and we should jump there. However, this is
not necessarily true if the kernel is booted on a system
with older/incompatible bootloader.

Add dynamic checks for the bootloader entry address.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Cc: linux-watchdog@vger.kernel.org
---
 drivers/watchdog/octeon-wdt-main.c | 62 +++++++++++++++++++++-----------------
 1 file changed, 34 insertions(+), 28 deletions(-)

diff --git a/drivers/watchdog/octeon-wdt-main.c b/drivers/watchdog/octeon-wdt-main.c
index 4baf2d7..8453531 100644
--- a/drivers/watchdog/octeon-wdt-main.c
+++ b/drivers/watchdog/octeon-wdt-main.c
@@ -145,35 +145,39 @@ static void __init octeon_wdt_build_stage1(void)
 
 	uasm_i_mfc0(&p, K0, C0_STATUS);
 #ifdef CONFIG_HOTPLUG_CPU
-	uasm_il_bbit0(&p, &r, K0, ilog2(ST0_NMI), label_enter_bootloader);
+	if (octeon_bootloader_entry_addr)
+		uasm_il_bbit0(&p, &r, K0, ilog2(ST0_NMI),
+			      label_enter_bootloader);
 #endif
 	/* Force 64-bit addressing enabled */
 	uasm_i_ori(&p, K0, K0, ST0_UX | ST0_SX | ST0_KX);
 	uasm_i_mtc0(&p, K0, C0_STATUS);
 
 #ifdef CONFIG_HOTPLUG_CPU
-	uasm_i_mfc0(&p, K0, C0_EBASE);
-	/* Coreid number in K0 */
-	uasm_i_andi(&p, K0, K0, 0xf);
-	/* 8 * coreid in bits 16-31 */
-	uasm_i_dsll_safe(&p, K0, K0, 3 + 16);
-	uasm_i_ori(&p, K0, K0, 0x8001);
-	uasm_i_dsll_safe(&p, K0, K0, 16);
-	uasm_i_ori(&p, K0, K0, 0x0700);
-	uasm_i_drotr_safe(&p, K0, K0, 32);
-	/*
-	 * Should result in: 0x8001,0700,0000,8*coreid which is
-	 * CVMX_CIU_WDOGX(coreid) - 0x0500
-	 *
-	 * Now ld K0, CVMX_CIU_WDOGX(coreid)
-	 */
-	uasm_i_ld(&p, K0, 0x500, K0);
-	/*
-	 * If bit one set handle the NMI as a watchdog event.
-	 * otherwise transfer control to bootloader.
-	 */
-	uasm_il_bbit0(&p, &r, K0, 1, label_enter_bootloader);
-	uasm_i_nop(&p);
+	if (octeon_bootloader_entry_addr) {
+		uasm_i_mfc0(&p, K0, C0_EBASE);
+		/* Coreid number in K0 */
+		uasm_i_andi(&p, K0, K0, 0xf);
+		/* 8 * coreid in bits 16-31 */
+		uasm_i_dsll_safe(&p, K0, K0, 3 + 16);
+		uasm_i_ori(&p, K0, K0, 0x8001);
+		uasm_i_dsll_safe(&p, K0, K0, 16);
+		uasm_i_ori(&p, K0, K0, 0x0700);
+		uasm_i_drotr_safe(&p, K0, K0, 32);
+		/*
+		 * Should result in: 0x8001,0700,0000,8*coreid which is
+		 * CVMX_CIU_WDOGX(coreid) - 0x0500
+		 *
+		 * Now ld K0, CVMX_CIU_WDOGX(coreid)
+		 */
+		uasm_i_ld(&p, K0, 0x500, K0);
+		/*
+		 * If bit one set handle the NMI as a watchdog event.
+		 * otherwise transfer control to bootloader.
+		 */
+		uasm_il_bbit0(&p, &r, K0, 1, label_enter_bootloader);
+		uasm_i_nop(&p);
+	}
 #endif
 
 	/* Clear Dcache so cvmseg works right. */
@@ -194,11 +198,13 @@ static void __init octeon_wdt_build_stage1(void)
 	uasm_i_dmfc0(&p, K0, C0_DESAVE);
 
 #ifdef CONFIG_HOTPLUG_CPU
-	uasm_build_label(&l, p, label_enter_bootloader);
-	/* Jump to the bootloader and restore K0 */
-	UASM_i_LA(&p, K0, (long)octeon_bootloader_entry_addr);
-	uasm_i_jr(&p, K0);
-	uasm_i_dmfc0(&p, K0, C0_DESAVE);
+	if (octeon_bootloader_entry_addr) {
+		uasm_build_label(&l, p, label_enter_bootloader);
+		/* Jump to the bootloader and restore K0 */
+		UASM_i_LA(&p, K0, (long)octeon_bootloader_entry_addr);
+		uasm_i_jr(&p, K0);
+		uasm_i_dmfc0(&p, K0, C0_DESAVE);
+	}
 #endif
 	uasm_resolve_relocs(relocs, labels);
 
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 3/4] MIPS: OCTEON: support disabling HOTPLUG_CPU run-time
  2014-06-27 21:59 [PATCH v2 0/4] MIPS: OCTEON: run-time checks for HOTPLUG_CPU Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 1/4] MIPS: OCTEON: SMP: delete redundant check Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 2/4] MIPS: OCTEON: watchdog: don't jump to bootloader without entry address Aaro Koskinen
@ 2014-06-27 21:59 ` Aaro Koskinen
  2014-06-27 21:59 ` [PATCH v2 4/4] MIPS: OCTEON: disable HOTPLUG_CPU if the bootloader version is incorrect Aaro Koskinen
  3 siblings, 0 replies; 5+ messages in thread
From: Aaro Koskinen @ 2014-06-27 21:59 UTC (permalink / raw
  To: linux-mips, Ralf Baechle, David Daney; +Cc: Aaro Koskinen

If nosmp kernel option given, we can assume HOTPLUG_CPU is disabled.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Acked-by: David Daney <david.daney@cavium.com>
---
 arch/mips/cavium-octeon/smp.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index 2c8d156..ea96930 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -84,6 +84,9 @@ static void octeon_smp_hotplug_setup(void)
 #ifdef CONFIG_HOTPLUG_CPU
 	struct linux_app_boot_info *labi;
 
+	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)
 		panic("The bootloader version on this board is incorrect.");
@@ -129,7 +132,7 @@ static void octeon_smp_setup(void)
 	 * will assign CPU numbers for possible cores as well.	Cores
 	 * are always consecutively numberd from 0.
 	 */
-	for (id = 0; id < num_cores && id < NR_CPUS; id++) {
+	for (id = 0; setup_max_cpus && id < num_cores && id < NR_CPUS; id++) {
 		if (!(core_mask & (1 << id))) {
 			set_cpu_possible(cpus, true);
 			__cpu_number_map[id] = cpus;
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 4/4] MIPS: OCTEON: disable HOTPLUG_CPU if the bootloader version is incorrect
  2014-06-27 21:59 [PATCH v2 0/4] MIPS: OCTEON: run-time checks for HOTPLUG_CPU Aaro Koskinen
                   ` (2 preceding siblings ...)
  2014-06-27 21:59 ` [PATCH v2 3/4] MIPS: OCTEON: support disabling HOTPLUG_CPU run-time Aaro Koskinen
@ 2014-06-27 21:59 ` Aaro Koskinen
  3 siblings, 0 replies; 5+ messages in thread
From: Aaro Koskinen @ 2014-06-27 21:59 UTC (permalink / raw
  To: linux-mips, Ralf Baechle, David Daney; +Cc: Aaro Koskinen

Disable HOTPLUG_CPU functionality if the bootloader version is incorrect.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
---
 arch/mips/cavium-octeon/smp.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index ea96930..ecd903d 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -88,8 +88,10 @@ static void octeon_smp_hotplug_setup(void)
 		return;
 
 	labi = (struct linux_app_boot_info *)PHYS_TO_XKSEG_CACHED(LABI_ADDR_IN_BOOTLOADER);
-	if (labi->labi_signature != LABI_SIGNATURE)
-		panic("The bootloader version on this board is incorrect.");
+	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
@@ -132,7 +134,8 @@ static void octeon_smp_setup(void)
 	 * will assign CPU numbers for possible cores as well.	Cores
 	 * are always consecutively numberd from 0.
 	 */
-	for (id = 0; setup_max_cpus && id < num_cores && id < NR_CPUS; id++) {
+	for (id = 0; setup_max_cpus && octeon_bootloader_entry_addr &&
+		     id < num_cores && id < NR_CPUS; id++) {
 		if (!(core_mask & (1 << id))) {
 			set_cpu_possible(cpus, true);
 			__cpu_number_map[id] = cpus;
@@ -232,6 +235,9 @@ static int octeon_cpu_disable(void)
 	if (cpu == 0)
 		return -EBUSY;
 
+	if (!octeon_bootloader_entry_addr)
+		return -ENOTSUPP;
+
 	set_cpu_online(cpu, false);
 	cpu_clear(cpu, cpu_callin_map);
 	local_irq_disable();
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-06-27 22:01 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-27 21:59 [PATCH v2 0/4] MIPS: OCTEON: run-time checks for HOTPLUG_CPU Aaro Koskinen
2014-06-27 21:59 ` [PATCH v2 1/4] MIPS: OCTEON: SMP: delete redundant check Aaro Koskinen
2014-06-27 21:59 ` [PATCH v2 2/4] MIPS: OCTEON: watchdog: don't jump to bootloader without entry address Aaro Koskinen
2014-06-27 21:59 ` [PATCH v2 3/4] MIPS: OCTEON: support disabling HOTPLUG_CPU run-time Aaro Koskinen
2014-06-27 21:59 ` [PATCH v2 4/4] MIPS: OCTEON: disable HOTPLUG_CPU if the bootloader version is incorrect Aaro Koskinen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.