All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] mx6: add support of multi-processor command
@ 2014-06-21 18:29 Gabriel Huau
  2014-06-21 21:36 ` Fabio Estevam
                   ` (5 more replies)
  0 siblings, 6 replies; 23+ messages in thread
From: Gabriel Huau @ 2014-06-21 18:29 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
---
 arch/arm/cpu/armv7/mx6/Makefile          |   1 +
 arch/arm/cpu/armv7/mx6/mp.c              | 131 +++++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx6/imx-regs.h |  13 +++
 3 files changed, 145 insertions(+)
 create mode 100644 arch/arm/cpu/armv7/mx6/mp.c

diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
index d7285fc..ec08526 100644
--- a/arch/arm/cpu/armv7/mx6/Makefile
+++ b/arch/arm/cpu/armv7/mx6/Makefile
@@ -9,3 +9,4 @@
 
 obj-y	:= soc.o clock.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
+obj-$(CONFIG_MP)             += mp.o
diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
new file mode 100644
index 0000000..a805be8
--- /dev/null
+++ b/arch/arm/cpu/armv7/mx6/mp.c
@@ -0,0 +1,131 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * (C) Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/imx-regs.h>
+
+int cpu_reset(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg |= SRC_SCR_CORE_1_RESET_MASK;
+		break;
+
+	case 2:
+		reg |= SRC_SCR_CORE_2_RESET_MASK;
+		break;
+
+	case 3:
+		reg |= SRC_SCR_CORE_3_RESET_MASK;
+		break;
+	}
+
+	/* Software reset of the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int cpu_status(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
+		break;
+
+	case 2:
+		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
+		break;
+
+	case 3:
+		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
+		break;
+	}
+
+	return 0;
+}
+
+int cpu_release(int nr, int argc, char *const argv[])
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+	uint32_t boot_addr;
+
+	boot_addr = simple_strtoul(argv[0], NULL, 16);
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		__raw_writel(boot_addr, &src->gpr3);
+		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		__raw_writel(boot_addr, &src->gpr5);
+		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		__raw_writel(boot_addr, &src->gpr7);
+		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* CPU N is ready to start */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int is_core_valid(unsigned int nr)
+{
+	if (nr < 0 || nr >= CONFIG_NUM_CPUS)
+		return 0;
+
+	return 1;
+}
+
+int cpu_disable(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* Disable the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
index 1f19727..3f8c2ee 100644
--- a/arch/arm/include/asm/arch-mx6/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
@@ -225,6 +225,19 @@
 
 extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
 
+#define SRC_SCR_CORE_1_RESET_OFFSET     14
+#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
+#define SRC_SCR_CORE_2_RESET_OFFSET     15
+#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
+#define SRC_SCR_CORE_3_RESET_OFFSET     16
+#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
+#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
+#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
+#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
+#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
+#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
+#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
-- 
2.0.0.rc2

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

* [U-Boot] [PATCH] mx6: add support of multi-processor command
  2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
@ 2014-06-21 21:36 ` Fabio Estevam
  2014-06-21 23:55 ` [U-Boot] [PATCH v2] " Gabriel Huau
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 23+ messages in thread
From: Fabio Estevam @ 2014-06-21 21:36 UTC (permalink / raw)
  To: u-boot

On Sat, Jun 21, 2014 at 3:29 PM, Gabriel Huau <contact@huau-gabriel.fr> wrote:
> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>

Please provide a commit log explaining in details the purpose of the
"multi-processor" command.

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

* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
  2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
  2014-06-21 21:36 ` Fabio Estevam
@ 2014-06-21 23:55 ` Gabriel Huau
  2014-06-22  9:14   ` Jeroen Hofstee
  2014-06-22 16:56 ` [U-Boot] [PATCH v3] " Gabriel Huau
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 23+ messages in thread
From: Gabriel Huau @ 2014-06-21 23:55 UTC (permalink / raw)
  To: u-boot

This allows u-boot to load different OS or Bare Metal application on the
different cores of the i.MX6DQ.
For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.

Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
---
 arch/arm/cpu/armv7/mx6/Makefile          |   1 +
 arch/arm/cpu/armv7/mx6/mp.c              | 131 +++++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx6/imx-regs.h |  13 +++
 3 files changed, 145 insertions(+)
 create mode 100644 arch/arm/cpu/armv7/mx6/mp.c

diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
index d7285fc..ec08526 100644
--- a/arch/arm/cpu/armv7/mx6/Makefile
+++ b/arch/arm/cpu/armv7/mx6/Makefile
@@ -9,3 +9,4 @@
 
 obj-y	:= soc.o clock.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
+obj-$(CONFIG_MP)             += mp.o
diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
new file mode 100644
index 0000000..a805be8
--- /dev/null
+++ b/arch/arm/cpu/armv7/mx6/mp.c
@@ -0,0 +1,131 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * (C) Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/imx-regs.h>
+
+int cpu_reset(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg |= SRC_SCR_CORE_1_RESET_MASK;
+		break;
+
+	case 2:
+		reg |= SRC_SCR_CORE_2_RESET_MASK;
+		break;
+
+	case 3:
+		reg |= SRC_SCR_CORE_3_RESET_MASK;
+		break;
+	}
+
+	/* Software reset of the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int cpu_status(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
+		break;
+
+	case 2:
+		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
+		break;
+
+	case 3:
+		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
+		break;
+	}
+
+	return 0;
+}
+
+int cpu_release(int nr, int argc, char *const argv[])
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+	uint32_t boot_addr;
+
+	boot_addr = simple_strtoul(argv[0], NULL, 16);
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		__raw_writel(boot_addr, &src->gpr3);
+		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		__raw_writel(boot_addr, &src->gpr5);
+		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		__raw_writel(boot_addr, &src->gpr7);
+		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* CPU N is ready to start */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int is_core_valid(unsigned int nr)
+{
+	if (nr < 0 || nr >= CONFIG_NUM_CPUS)
+		return 0;
+
+	return 1;
+}
+
+int cpu_disable(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* Disable the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
index 1f19727..3f8c2ee 100644
--- a/arch/arm/include/asm/arch-mx6/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
@@ -225,6 +225,19 @@
 
 extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
 
+#define SRC_SCR_CORE_1_RESET_OFFSET     14
+#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
+#define SRC_SCR_CORE_2_RESET_OFFSET     15
+#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
+#define SRC_SCR_CORE_3_RESET_OFFSET     16
+#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
+#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
+#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
+#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
+#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
+#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
+#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
-- 
2.0.0

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

* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
  2014-06-21 23:55 ` [U-Boot] [PATCH v2] " Gabriel Huau
@ 2014-06-22  9:14   ` Jeroen Hofstee
  2014-06-22 16:56     ` gabriel huau
  0 siblings, 1 reply; 23+ messages in thread
From: Jeroen Hofstee @ 2014-06-22  9:14 UTC (permalink / raw)
  To: u-boot

Hello Gabriel,

On 22-06-14 01:55, Gabriel Huau wrote:
> This allows u-boot to load different OS or Bare Metal application on the
> different cores of the i.MX6DQ.
> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>
> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
funny..
> +int is_core_valid(unsigned int nr)
> +{
> +	if (nr < 0 || nr >= CONFIG_NUM_CPUS)
> +		return 0;
> +
> +	return 1;
> +}
> +
>
I am not sure if u-boot has rules for it, but personally I would prefer
not to test values which are obvious unsigned for negativity, since it
causes unnecessary noise when compiling u-boot with W=1, W=2.

Regards,
Jeroen

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

* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
  2014-06-22  9:14   ` Jeroen Hofstee
@ 2014-06-22 16:56     ` gabriel huau
  0 siblings, 0 replies; 23+ messages in thread
From: gabriel huau @ 2014-06-22 16:56 UTC (permalink / raw)
  To: u-boot

Agreed, I'll submit a patch to fix that.

Regards,
Gabriel

On 06/22/2014 02:14 AM, Jeroen Hofstee wrote:
> Hello Gabriel,
>
> On 22-06-14 01:55, Gabriel Huau wrote:
>> This allows u-boot to load different OS or Bare Metal application on the
>> different cores of the i.MX6DQ.
>> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS 
>> on cpu1.
>>
>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
> funny..
>> +int is_core_valid(unsigned int nr)
>> +{
>> +    if (nr < 0 || nr >= CONFIG_NUM_CPUS)
>> +        return 0;
>> +
>> +    return 1;
>> +}
>> +
>>
> I am not sure if u-boot has rules for it, but personally I would prefer
> not to test values which are obvious unsigned for negativity, since it
> causes unnecessary noise when compiling u-boot with W=1, W=2.
>
> Regards,
> Jeroen
>
>

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

* [U-Boot] [PATCH v3] mx6: add support of multi-processor command
  2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
  2014-06-21 21:36 ` Fabio Estevam
  2014-06-21 23:55 ` [U-Boot] [PATCH v2] " Gabriel Huau
@ 2014-06-22 16:56 ` Gabriel Huau
  2014-06-24 12:50   ` Stefano Babic
  2014-06-25  2:32 ` [U-Boot] [PATCH v4] " Gabriel Huau
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 23+ messages in thread
From: Gabriel Huau @ 2014-06-22 16:56 UTC (permalink / raw)
  To: u-boot

This allows u-boot to load different OS or Bare Metal application on the
different cores of the i.MX6DQ.
For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.

Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
---
Changes for v2:
	- Add a commit log message to explain the purpose of this patch
Changes for v3:
	- Remove unnecessary check for unsigned values when they are negative

 arch/arm/cpu/armv7/mx6/Makefile          |   1 +
 arch/arm/cpu/armv7/mx6/mp.c              | 131 +++++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx6/imx-regs.h |  13 +++
 3 files changed, 145 insertions(+)
 create mode 100644 arch/arm/cpu/armv7/mx6/mp.c

diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
index d7285fc..ec08526 100644
--- a/arch/arm/cpu/armv7/mx6/Makefile
+++ b/arch/arm/cpu/armv7/mx6/Makefile
@@ -9,3 +9,4 @@
 
 obj-y	:= soc.o clock.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
+obj-$(CONFIG_MP)             += mp.o
diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
new file mode 100644
index 0000000..8105fcc
--- /dev/null
+++ b/arch/arm/cpu/armv7/mx6/mp.c
@@ -0,0 +1,131 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * (C) Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/imx-regs.h>
+
+int cpu_reset(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg |= SRC_SCR_CORE_1_RESET_MASK;
+		break;
+
+	case 2:
+		reg |= SRC_SCR_CORE_2_RESET_MASK;
+		break;
+
+	case 3:
+		reg |= SRC_SCR_CORE_3_RESET_MASK;
+		break;
+	}
+
+	/* Software reset of the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int cpu_status(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
+		break;
+
+	case 2:
+		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
+		break;
+
+	case 3:
+		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
+		break;
+	}
+
+	return 0;
+}
+
+int cpu_release(int nr, int argc, char *const argv[])
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+	uint32_t boot_addr;
+
+	boot_addr = simple_strtoul(argv[0], NULL, 16);
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		__raw_writel(boot_addr, &src->gpr3);
+		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		__raw_writel(boot_addr, &src->gpr5);
+		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		__raw_writel(boot_addr, &src->gpr7);
+		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* CPU N is ready to start */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int is_core_valid(unsigned int nr)
+{
+	if (nr >= CONFIG_NUM_CPUS)
+		return 0;
+
+	return 1;
+}
+
+int cpu_disable(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* Disable the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
index 1f19727..3f8c2ee 100644
--- a/arch/arm/include/asm/arch-mx6/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
@@ -225,6 +225,19 @@
 
 extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
 
+#define SRC_SCR_CORE_1_RESET_OFFSET     14
+#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
+#define SRC_SCR_CORE_2_RESET_OFFSET     15
+#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
+#define SRC_SCR_CORE_3_RESET_OFFSET     16
+#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
+#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
+#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
+#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
+#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
+#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
+#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
-- 
2.0.0

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

* [U-Boot] [PATCH v3] mx6: add support of multi-processor command
  2014-06-22 16:56 ` [U-Boot] [PATCH v3] " Gabriel Huau
@ 2014-06-24 12:50   ` Stefano Babic
  2014-06-25  0:22     ` gabriel huau
  0 siblings, 1 reply; 23+ messages in thread
From: Stefano Babic @ 2014-06-24 12:50 UTC (permalink / raw)
  To: u-boot

Hi Gabriel,

On 22/06/2014 18:56, Gabriel Huau wrote:
> This allows u-boot to load different OS or Bare Metal application on the
> different cores of the i.MX6DQ.
> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
> 
> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
> ---
> Changes for v2:
> 	- Add a commit log message to explain the purpose of this patch
> Changes for v3:
> 	- Remove unnecessary check for unsigned values when they are negative
> 
>  arch/arm/cpu/armv7/mx6/Makefile          |   1 +
>  arch/arm/cpu/armv7/mx6/mp.c              | 131 +++++++++++++++++++++++++++++++
>  arch/arm/include/asm/arch-mx6/imx-regs.h |  13 +++
>  3 files changed, 145 insertions(+)
>  create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
> 
> diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
> index d7285fc..ec08526 100644
> --- a/arch/arm/cpu/armv7/mx6/Makefile
> +++ b/arch/arm/cpu/armv7/mx6/Makefile
> @@ -9,3 +9,4 @@
>  
>  obj-y	:= soc.o clock.o
>  obj-$(CONFIG_SECURE_BOOT)    += hab.o
> +obj-$(CONFIG_MP)             += mp.o
> diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c

Do you have a user of this code ? I do not see it at the mopment.

> new file mode 100644
> index 0000000..8105fcc
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/mx6/mp.c
> @@ -0,0 +1,131 @@
> +/*
> + * (C) Copyright 2014
> + * Gabriel Huau <contact@huau-gabriel.fr>
> + *
> + * (C) Copyright 2009 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/errno.h>
> +#include <asm/arch/imx-regs.h>
> +
> +int cpu_reset(int nr)
> +{

As cpu__ are quite too generic and could conflict, I suggest to use more
specific names indicating that you are enabling/disabling a core on the
cpu. Something like imx_core_reset() or whatever you choose.

> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		reg |= SRC_SCR_CORE_1_RESET_MASK;
> +		break;
> +
> +	case 2:
> +		reg |= SRC_SCR_CORE_2_RESET_MASK;
> +		break;
> +
> +	case 3:
> +		reg |= SRC_SCR_CORE_3_RESET_MASK;
> +		break;
> +	}
> +
> +	/* Software reset of the CPU N */
> +	__raw_writel(reg, &src->scr);
> +
> +	return 0;
> +}
> +
> +int cpu_status(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
> +		break;
> +
> +	case 2:
> +		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
> +		break;
> +
> +	case 3:
> +		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +int cpu_release(int nr, int argc, char *const argv[])
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +	uint32_t boot_addr;
> +
> +	boot_addr = simple_strtoul(argv[0], NULL, 16);
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		__raw_writel(boot_addr, &src->gpr3);
> +		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
> +		break;
> +
> +	case 2:
> +		__raw_writel(boot_addr, &src->gpr5);
> +		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
> +		break;
> +
> +	case 3:
> +		__raw_writel(boot_addr, &src->gpr7);
> +		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
> +		break;
> +	}
> +
> +	/* CPU N is ready to start */
> +	__raw_writel(reg, &src->scr);
> +
> +	return 0;
> +}
> +
> +int is_core_valid(unsigned int nr)
> +{
> +	if (nr >= CONFIG_NUM_CPUS)

And where is defined CONFIG_NUM_CPUS ?

Why do we have to configure it ? The number is related to the running
SOC and cannot be changed.

> +		return 0;
> +
> +	return 1;
> +}
> +
> +int cpu_disable(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
> +		break;
> +
> +	case 2:
> +		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
> +		break;
> +
> +	case 3:
> +		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
> +		break;
> +	}
> +
> +	/* Disable the CPU N */
> +	__raw_writel(reg, &src->scr);
> +
> +	return 0;
> +}
> diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
> index 1f19727..3f8c2ee 100644
> --- a/arch/arm/include/asm/arch-mx6/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
> @@ -225,6 +225,19 @@
>  
>  extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
>  
> +#define SRC_SCR_CORE_1_RESET_OFFSET     14
> +#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
> +#define SRC_SCR_CORE_2_RESET_OFFSET     15
> +#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
> +#define SRC_SCR_CORE_3_RESET_OFFSET     16
> +#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
> +#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
> +#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
> +#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
> +#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
> +#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
> +#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
> +
>  /* System Reset Controller (SRC) */
>  struct src {
>  	u32	scr;


Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH v3] mx6: add support of multi-processor command
  2014-06-24 12:50   ` Stefano Babic
@ 2014-06-25  0:22     ` gabriel huau
  0 siblings, 0 replies; 23+ messages in thread
From: gabriel huau @ 2014-06-25  0:22 UTC (permalink / raw)
  To: u-boot

Hi Stefano,

On 06/24/2014 05:50 AM, Stefano Babic wrote:
> Hi Gabriel,
>
> On 22/06/2014 18:56, Gabriel Huau wrote:
>> This allows u-boot to load different OS or Bare Metal application on the
>> different cores of the i.MX6DQ.
>> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>>
>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
>> ---
>> Changes for v2:
>> 	- Add a commit log message to explain the purpose of this patch
>> Changes for v3:
>> 	- Remove unnecessary check for unsigned values when they are negative
>>
>>   arch/arm/cpu/armv7/mx6/Makefile          |   1 +
>>   arch/arm/cpu/armv7/mx6/mp.c              | 131 +++++++++++++++++++++++++++++++
>>   arch/arm/include/asm/arch-mx6/imx-regs.h |  13 +++
>>   3 files changed, 145 insertions(+)
>>   create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
>>
>> diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
>> index d7285fc..ec08526 100644
>> --- a/arch/arm/cpu/armv7/mx6/Makefile
>> +++ b/arch/arm/cpu/armv7/mx6/Makefile
>> @@ -9,3 +9,4 @@
>>   
>>   obj-y	:= soc.o clock.o
>>   obj-$(CONFIG_SECURE_BOOT)    += hab.o
>> +obj-$(CONFIG_MP)             += mp.o
>> diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
> Do you have a user of this code ? I do not see it at the mopment.
>
I didn't enable the configuration in the board file so it won't be 
available by default, should I do it? or should we leave the user to add 
this command in their board file?
>> new file mode 100644
>> index 0000000..8105fcc
>> --- /dev/null
>> +++ b/arch/arm/cpu/armv7/mx6/mp.c
>> @@ -0,0 +1,131 @@
>> +/*
>> + * (C) Copyright 2014
>> + * Gabriel Huau <contact@huau-gabriel.fr>
>> + *
>> + * (C) Copyright 2009 Freescale Semiconductor, Inc.
>> + *
>> + * SPDX-License-Identifier:	GPL-2.0+
>> + */
>> +
>> +#include <common.h>
>> +#include <asm/io.h>
>> +#include <asm/errno.h>
>> +#include <asm/arch/imx-regs.h>
>> +
>> +int cpu_reset(int nr)
>> +{
> As cpu__ are quite too generic and could conflict, I suggest to use more
> specific names indicating that you are enabling/disabling a core on the
> cpu. Something like imx_core_reset() or whatever you choose.
The name 'cpu_reset' is not really my choice, when you enable the 
command MP you have to defines these functions (common/cmd_mp.c), I'm 
open to any suggestion but anyway we will have to define these function 
(except if I missed
something).

To avoid any conflict, I've defined them in the SoC code (they did the 
same for PowerPC), so another SoC can define these functions without any 
conflict.

>> +	uint32_t reg;
>> +	struct src *src = (struct src *)SRC_BASE_ADDR;
>> +
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		reg |= SRC_SCR_CORE_1_RESET_MASK;
>> +		break;
>> +
>> +	case 2:
>> +		reg |= SRC_SCR_CORE_2_RESET_MASK;
>> +		break;
>> +
>> +	case 3:
>> +		reg |= SRC_SCR_CORE_3_RESET_MASK;
>> +		break;
>> +	}
>> +
>> +	/* Software reset of the CPU N */
>> +	__raw_writel(reg, &src->scr);
>> +
>> +	return 0;
>> +}
>> +
>> +int cpu_status(int nr)
>> +{
>> +	uint32_t reg;
>> +	struct src *src = (struct src *)SRC_BASE_ADDR;
>> +
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
>> +		break;
>> +
>> +	case 2:
>> +		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
>> +		break;
>> +
>> +	case 3:
>> +		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
>> +		break;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +int cpu_release(int nr, int argc, char *const argv[])
>> +{
>> +	uint32_t reg;
>> +	struct src *src = (struct src *)SRC_BASE_ADDR;
>> +	uint32_t boot_addr;
>> +
>> +	boot_addr = simple_strtoul(argv[0], NULL, 16);
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		__raw_writel(boot_addr, &src->gpr3);
>> +		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
>> +		break;
>> +
>> +	case 2:
>> +		__raw_writel(boot_addr, &src->gpr5);
>> +		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
>> +		break;
>> +
>> +	case 3:
>> +		__raw_writel(boot_addr, &src->gpr7);
>> +		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
>> +		break;
>> +	}
>> +
>> +	/* CPU N is ready to start */
>> +	__raw_writel(reg, &src->scr);
>> +
>> +	return 0;
>> +}
>> +
>> +int is_core_valid(unsigned int nr)
>> +{
>> +	if (nr >= CONFIG_NUM_CPUS)
> And where is defined CONFIG_NUM_CPUS ?
>
> Why do we have to configure it ? The number is related to the running
> SOC and cannot be changed.
>
By default, I didn't enable the common MP for the mx6, but the 
CONFIG_NUM_CPUS should be defined in the config file of the SoC (Quad => 
4, Dual => 2, Solo => 1).
I think a better way will be to read directly the SCU registers to get 
the current CPU configuration of the board, I'll update the patch.

>> +		return 0;
>> +
>> +	return 1;
>> +}
>> +
>> +int cpu_disable(int nr)
>> +{
>> +	uint32_t reg;
>> +	struct src *src = (struct src *)SRC_BASE_ADDR;
>> +
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
>> +		break;
>> +
>> +	case 2:
>> +		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
>> +		break;
>> +
>> +	case 3:
>> +		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
>> +		break;
>> +	}
>> +
>> +	/* Disable the CPU N */
>> +	__raw_writel(reg, &src->scr);
>> +
>> +	return 0;
>> +}
>> diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
>> index 1f19727..3f8c2ee 100644
>> --- a/arch/arm/include/asm/arch-mx6/imx-regs.h
>> +++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
>> @@ -225,6 +225,19 @@
>>   
>>   extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
>>   
>> +#define SRC_SCR_CORE_1_RESET_OFFSET     14
>> +#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
>> +#define SRC_SCR_CORE_2_RESET_OFFSET     15
>> +#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
>> +#define SRC_SCR_CORE_3_RESET_OFFSET     16
>> +#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
>> +#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
>> +#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
>> +#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
>> +#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
>> +#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
>> +#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
>> +
>>   /* System Reset Controller (SRC) */
>>   struct src {
>>   	u32	scr;
>
> Best regards,
> Stefano Babic
>
>

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

* [U-Boot] [PATCH v4] mx6: add support of multi-processor command
  2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
                   ` (2 preceding siblings ...)
  2014-06-22 16:56 ` [U-Boot] [PATCH v3] " Gabriel Huau
@ 2014-06-25  2:32 ` Gabriel Huau
  2014-07-08  9:18   ` Stefano Babic
  2014-07-12 22:31 ` [U-Boot] [PATCH v5] " Gabriel Huau
  2014-07-26 18:35 ` [U-Boot] [PATCH v6] " Gabriel Huau
  5 siblings, 1 reply; 23+ messages in thread
From: Gabriel Huau @ 2014-06-25  2:32 UTC (permalink / raw)
  To: u-boot

This allows u-boot to load different OS or Bare Metal application on the
different cores of the i.MX6DQ.
For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.

Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
---
Changes for v2:
	- Add a commit log message to explain the purpose of this patch
Changes for v3:
	- Remove unnecessary check for unsigned values when they are negative
Changes for v4:
	- Add CONFIG_MP to the common mx6 configuration
	- Get the number of CPUs dynamically instead of using a macro

 arch/arm/cpu/armv7/mx6/Makefile           |   1 +
 arch/arm/cpu/armv7/mx6/mp.c               | 134 ++++++++++++++++++++++++++++++
 arch/arm/cpu/armv7/mx6/soc.c              |   6 ++
 arch/arm/include/asm/arch-mx6/imx-regs.h  |  13 +++
 arch/arm/include/asm/arch-mx6/sys_proto.h |   2 +
 include/configs/mx6_common.h              |   2 +
 6 files changed, 158 insertions(+)
 create mode 100644 arch/arm/cpu/armv7/mx6/mp.c

diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
index d7285fc..ec08526 100644
--- a/arch/arm/cpu/armv7/mx6/Makefile
+++ b/arch/arm/cpu/armv7/mx6/Makefile
@@ -9,3 +9,4 @@
 
 obj-y	:= soc.o clock.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
+obj-$(CONFIG_MP)             += mp.o
diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
new file mode 100644
index 0000000..85003d3
--- /dev/null
+++ b/arch/arm/cpu/armv7/mx6/mp.c
@@ -0,0 +1,134 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * (C) Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/imx-regs.h>
+
+int cpu_reset(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg |= SRC_SCR_CORE_1_RESET_MASK;
+		break;
+
+	case 2:
+		reg |= SRC_SCR_CORE_2_RESET_MASK;
+		break;
+
+	case 3:
+		reg |= SRC_SCR_CORE_3_RESET_MASK;
+		break;
+	}
+
+	/* Software reset of the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int cpu_status(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
+		break;
+
+	case 2:
+		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
+		break;
+
+	case 3:
+		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
+		break;
+	}
+
+	return 0;
+}
+
+int cpu_release(int nr, int argc, char *const argv[])
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+	uint32_t boot_addr;
+
+	boot_addr = simple_strtoul(argv[0], NULL, 16);
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		__raw_writel(boot_addr, &src->gpr3);
+		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		__raw_writel(boot_addr, &src->gpr5);
+		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		__raw_writel(boot_addr, &src->gpr7);
+		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* CPU N is ready to start */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int is_core_valid(unsigned int core)
+{
+	uint32_t nr_cores = get_nr_cpus();
+
+	if (core > nr_cores)
+		return 0;
+
+	return 1;
+}
+
+int cpu_disable(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* Disable the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
index 1725279..9a01b7e 100644
--- a/arch/arm/cpu/armv7/mx6/soc.c
+++ b/arch/arm/cpu/armv7/mx6/soc.c
@@ -35,6 +35,12 @@ struct scu_regs {
 	u32	fpga_rev;
 };
 
+u32 get_nr_cpus(void)
+{
+	struct scu_regs *scu = (struct scu_regs *)SCU_BASE_ADDR;
+	return readl(&scu->config) & 3;
+}
+
 u32 get_cpu_rev(void)
 {
 	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
index 1f19727..3f8c2ee 100644
--- a/arch/arm/include/asm/arch-mx6/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
@@ -225,6 +225,19 @@
 
 extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
 
+#define SRC_SCR_CORE_1_RESET_OFFSET     14
+#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
+#define SRC_SCR_CORE_2_RESET_OFFSET     15
+#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
+#define SRC_SCR_CORE_3_RESET_OFFSET     16
+#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
+#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
+#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
+#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
+#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
+#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
+#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h
index 38851a1..b2558e7 100644
--- a/arch/arm/include/asm/arch-mx6/sys_proto.h
+++ b/arch/arm/include/asm/arch-mx6/sys_proto.h
@@ -11,6 +11,8 @@
 #include <asm/imx-common/regs-common.h>
 #include "../arch-imx/cpu.h"
 
+u32 get_nr_cpus(void);
+
 #define is_soc_rev(rev)	((get_cpu_rev() & 0xFF) - rev)
 u32 get_cpu_rev(void);
 
diff --git a/include/configs/mx6_common.h b/include/configs/mx6_common.h
index 8a8920f..44489da 100644
--- a/include/configs/mx6_common.h
+++ b/include/configs/mx6_common.h
@@ -29,4 +29,6 @@
 #define CONFIG_SYS_PL310_BASE	L2_PL310_BASE
 #endif
 
+#define CONFIG_MP
+
 #endif
-- 
2.0.0

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

* [U-Boot] [PATCH v4] mx6: add support of multi-processor command
  2014-06-25  2:32 ` [U-Boot] [PATCH v4] " Gabriel Huau
@ 2014-07-08  9:18   ` Stefano Babic
  0 siblings, 0 replies; 23+ messages in thread
From: Stefano Babic @ 2014-07-08  9:18 UTC (permalink / raw)
  To: u-boot

Hi Gabriel,

On 25/06/2014 04:32, Gabriel Huau wrote:
> This allows u-boot to load different OS or Bare Metal application on the
> different cores of the i.MX6DQ.
> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
> 
> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
> ---
> Changes for v2:
> 	- Add a commit log message to explain the purpose of this patch
> Changes for v3:
> 	- Remove unnecessary check for unsigned values when they are negative
> Changes for v4:
> 	- Add CONFIG_MP to the common mx6 configuration
> 	- Get the number of CPUs dynamically instead of using a macro
> 
>  arch/arm/cpu/armv7/mx6/Makefile           |   1 +
>  arch/arm/cpu/armv7/mx6/mp.c               | 134 ++++++++++++++++++++++++++++++
>  arch/arm/cpu/armv7/mx6/soc.c              |   6 ++
>  arch/arm/include/asm/arch-mx6/imx-regs.h  |  13 +++
>  arch/arm/include/asm/arch-mx6/sys_proto.h |   2 +
>  include/configs/mx6_common.h              |   2 +
>  6 files changed, 158 insertions(+)
>  create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
> 

Your patch breaks some i.MX6 boards:

Configuring for udoo_quad - Board: udoo, Options:
IMX_CONFIG=board/udoo/udoo.cfg,MX6Q,DDR_MB=1024
common/board_f.c:45:20: fatal error: asm/mp.h: No such file or directory
make[1]: *** [common/board_f.o] Error 1

In fact, board_f.c includes asm/mp.h if CONFIG_MP is set. Can you take a
look ? Thanks !

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
                   ` (3 preceding siblings ...)
  2014-06-25  2:32 ` [U-Boot] [PATCH v4] " Gabriel Huau
@ 2014-07-12 22:31 ` Gabriel Huau
  2014-07-13  9:58   ` Wolfgang Denk
  2014-07-15  7:49   ` Stefano Babic
  2014-07-26 18:35 ` [U-Boot] [PATCH v6] " Gabriel Huau
  5 siblings, 2 replies; 23+ messages in thread
From: Gabriel Huau @ 2014-07-12 22:31 UTC (permalink / raw)
  To: u-boot

This allows u-boot to load different OS or Bare Metal application on the
different cores of the i.MX6DQ.
For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.

Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
---
Changes for v2:
	- Add a commit log message to explain the purpose of this patch
Changes for v3:
	- Remove unnecessary check for unsigned values when they are negative
Changes for v4:
	- Add CONFIG_MP to the common mx6 configuration
	- Get the number of CPUs dynamically instead of using a macro
Changes for v5:
	- Rebase on the last update of the tree (conflicts solved)
	- Add a dummy header to solve build issue regarding the common/board_f.c

 arch/arm/cpu/armv7/mx6/Makefile           |   1 +
 arch/arm/cpu/armv7/mx6/mp.c               | 134 ++++++++++++++++++++++++++++++
 arch/arm/cpu/armv7/mx6/soc.c              |   6 ++
 arch/arm/include/asm/arch-mx6/imx-regs.h  |  13 +++
 arch/arm/include/asm/arch-mx6/sys_proto.h |   1 +
 arch/arm/include/asm/mp.h                 |  11 +++
 include/configs/mx6_common.h              |   2 +
 7 files changed, 168 insertions(+)
 create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
 create mode 100644 arch/arm/include/asm/mp.h

diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
index 6dc9f8e..bf6effc 100644
--- a/arch/arm/cpu/armv7/mx6/Makefile
+++ b/arch/arm/cpu/armv7/mx6/Makefile
@@ -10,3 +10,4 @@
 obj-y	:= soc.o clock.o
 obj-$(CONFIG_SPL_BUILD)	     += ddr.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
+obj-$(CONFIG_MP)             += mp.o
diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
new file mode 100644
index 0000000..85003d3
--- /dev/null
+++ b/arch/arm/cpu/armv7/mx6/mp.c
@@ -0,0 +1,134 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * (C) Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/imx-regs.h>
+
+int cpu_reset(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg |= SRC_SCR_CORE_1_RESET_MASK;
+		break;
+
+	case 2:
+		reg |= SRC_SCR_CORE_2_RESET_MASK;
+		break;
+
+	case 3:
+		reg |= SRC_SCR_CORE_3_RESET_MASK;
+		break;
+	}
+
+	/* Software reset of the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int cpu_status(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
+		break;
+
+	case 2:
+		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
+		break;
+
+	case 3:
+		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
+		break;
+	}
+
+	return 0;
+}
+
+int cpu_release(int nr, int argc, char *const argv[])
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+	uint32_t boot_addr;
+
+	boot_addr = simple_strtoul(argv[0], NULL, 16);
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		__raw_writel(boot_addr, &src->gpr3);
+		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		__raw_writel(boot_addr, &src->gpr5);
+		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		__raw_writel(boot_addr, &src->gpr7);
+		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* CPU N is ready to start */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
+
+int is_core_valid(unsigned int core)
+{
+	uint32_t nr_cores = get_nr_cpus();
+
+	if (core > nr_cores)
+		return 0;
+
+	return 1;
+}
+
+int cpu_disable(int nr)
+{
+	uint32_t reg;
+	struct src *src = (struct src *)SRC_BASE_ADDR;
+
+	reg = __raw_readl(&src->scr);
+
+	switch (nr) {
+	case 1:
+		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
+		break;
+
+	case 2:
+		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
+		break;
+
+	case 3:
+		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
+		break;
+	}
+
+	/* Disable the CPU N */
+	__raw_writel(reg, &src->scr);
+
+	return 0;
+}
diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
index f20bdeb..19429b2 100644
--- a/arch/arm/cpu/armv7/mx6/soc.c
+++ b/arch/arm/cpu/armv7/mx6/soc.c
@@ -35,6 +35,12 @@ struct scu_regs {
 	u32	fpga_rev;
 };
 
+u32 get_nr_cpus(void)
+{
+	struct scu_regs *scu = (struct scu_regs *)SCU_BASE_ADDR;
+	return readl(&scu->config) & 3;
+}
+
 u32 get_cpu_rev(void)
 {
 	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
index a69a753..a90cbe9 100644
--- a/arch/arm/include/asm/arch-mx6/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
@@ -227,6 +227,19 @@
 
 extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
 
+#define SRC_SCR_CORE_1_RESET_OFFSET     14
+#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
+#define SRC_SCR_CORE_2_RESET_OFFSET     15
+#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
+#define SRC_SCR_CORE_3_RESET_OFFSET     16
+#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
+#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
+#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
+#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
+#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
+#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
+#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h
index 42d30f5..7cbc133 100644
--- a/arch/arm/include/asm/arch-mx6/sys_proto.h
+++ b/arch/arm/include/asm/arch-mx6/sys_proto.h
@@ -14,6 +14,7 @@
 #define soc_rev() (get_cpu_rev() & 0xFF)
 #define is_soc_rev(rev)        (soc_rev() - rev)
 
+#define is_soc_rev(rev)	((get_cpu_rev() & 0xFF) - rev)
 u32 get_cpu_rev(void);
 
 /* returns MXC_CPU_ value */
diff --git a/arch/arm/include/asm/mp.h b/arch/arm/include/asm/mp.h
new file mode 100644
index 0000000..8cf8d88
--- /dev/null
+++ b/arch/arm/include/asm/mp.h
@@ -0,0 +1,11 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#ifndef _ASM_MP_H_
+#define _ASM_MP_H_
+
+#endif
diff --git a/include/configs/mx6_common.h b/include/configs/mx6_common.h
index e4a5cc5..135a3f5 100644
--- a/include/configs/mx6_common.h
+++ b/include/configs/mx6_common.h
@@ -28,4 +28,6 @@
 #define CONFIG_SYS_PL310_BASE	L2_PL310_BASE
 #endif
 
+#define CONFIG_MP
+
 #endif
-- 
2.0.0

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-07-12 22:31 ` [U-Boot] [PATCH v5] " Gabriel Huau
@ 2014-07-13  9:58   ` Wolfgang Denk
  2014-07-13 23:16     ` gabriel huau
  2014-07-15  7:49   ` Stefano Babic
  1 sibling, 1 reply; 23+ messages in thread
From: Wolfgang Denk @ 2014-07-13  9:58 UTC (permalink / raw)
  To: u-boot

Dear Gabriel Huau,

In message <1405204264-10922-1-git-send-email-contact@huau-gabriel.fr> you wrote:
> This allows u-boot to load different OS or Bare Metal application on the
> different cores of the i.MX6DQ.
> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.

Has this patch really to be specific for the quad core version?  Can
we not also support the dual core version in the same way?

...
> +int cpu_reset(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		reg |= SRC_SCR_CORE_1_RESET_MASK;
> +		break;
> +
> +	case 2:
> +		reg |= SRC_SCR_CORE_2_RESET_MASK;
> +		break;
> +
> +	case 3:
> +		reg |= SRC_SCR_CORE_3_RESET_MASK;
> +		break;
> +	}

I feel this should not be hardwired for 4 cores, and I also think we
should avoid using such a switch statement here.  All you need is an
index into an array.

> +int cpu_status(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
> +		break;
> +
> +	case 2:
> +		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
> +		break;
> +
> +	case 3:
> +		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
> +		break;
> +	}

Ditto. Such code duplication does not scale. Please rework to avoid
the switch.

> +	switch (nr) {
> +	case 1:
> +		__raw_writel(boot_addr, &src->gpr3);
> +		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
> +		break;
> +
> +	case 2:
> +		__raw_writel(boot_addr, &src->gpr5);
> +		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
> +		break;
> +
> +	case 3:
> +		__raw_writel(boot_addr, &src->gpr7);
> +		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
> +		break;
> +	}
> +
> +	/* CPU N is ready to start */
> +	__raw_writel(reg, &src->scr);

Ditto here.

And can you please explain why you are using __raw_writel() here?

> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
> +		break;
> +
> +	case 2:
> +		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
> +		break;
> +
> +	case 3:
> +		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
> +		break;
> +	}
> +
> +	/* Disable the CPU N */
> +	__raw_writel(reg, &src->scr);

Again, please avoid the switch.

We have read-modify-write macros which you could use, unless you
really have to use the __raw_*() accessors.  Why is this needed?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"A little knowledge is a dangerous thing."                - Doug Gwyn

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-07-13  9:58   ` Wolfgang Denk
@ 2014-07-13 23:16     ` gabriel huau
  0 siblings, 0 replies; 23+ messages in thread
From: gabriel huau @ 2014-07-13 23:16 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang,

On 07/13/2014 02:58 AM, Wolfgang Denk wrote:
> Dear Gabriel Huau,
>
> In message <1405204264-10922-1-git-send-email-contact@huau-gabriel.fr> you wrote:
>> This allows u-boot to load different OS or Bare Metal application on the
>> different cores of the i.MX6DQ.
>> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
> Has this patch really to be specific for the quad core version?  Can
> we not also support the dual core version in the same way?
>
> ...

Nope, but it makes sense for only Dual and Quad version. I'll update the 
commit message to be more specific.

>> +int cpu_reset(int nr)
>> +{
>> +	uint32_t reg;
>> +	struct src *src = (struct src *)SRC_BASE_ADDR;
>> +
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		reg |= SRC_SCR_CORE_1_RESET_MASK;
>> +		break;
>> +
>> +	case 2:
>> +		reg |= SRC_SCR_CORE_2_RESET_MASK;
>> +		break;
>> +
>> +	case 3:
>> +		reg |= SRC_SCR_CORE_3_RESET_MASK;
>> +		break;
>> +	}
> I feel this should not be hardwired for 4 cores, and I also think we
> should avoid using such a switch statement here.  All you need is an
> index into an array.

Agreed.

>> +int cpu_status(int nr)
>> +{
>> +	uint32_t reg;
>> +	struct src *src = (struct src *)SRC_BASE_ADDR;
>> +
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
>> +		break;
>> +
>> +	case 2:
>> +		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
>> +		break;
>> +
>> +	case 3:
>> +		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
>> +		break;
>> +	}
> Ditto. Such code duplication does not scale. Please rework to avoid
> the switch.
>
>> +	switch (nr) {
>> +	case 1:
>> +		__raw_writel(boot_addr, &src->gpr3);
>> +		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
>> +		break;
>> +
>> +	case 2:
>> +		__raw_writel(boot_addr, &src->gpr5);
>> +		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
>> +		break;
>> +
>> +	case 3:
>> +		__raw_writel(boot_addr, &src->gpr7);
>> +		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
>> +		break;
>> +	}
>> +
>> +	/* CPU N is ready to start */
>> +	__raw_writel(reg, &src->scr);
> Ditto here.
>
> And can you please explain why you are using __raw_writel() here?

No particular reason, I'll update with the generic macro.
>> +	reg = __raw_readl(&src->scr);
>> +
>> +	switch (nr) {
>> +	case 1:
>> +		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
>> +		break;
>> +
>> +	case 2:
>> +		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
>> +		break;
>> +
>> +	case 3:
>> +		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
>> +		break;
>> +	}
>> +
>> +	/* Disable the CPU N */
>> +	__raw_writel(reg, &src->scr);
> Again, please avoid the switch.
>
> We have read-modify-write macros which you could use, unless you
> really have to use the __raw_*() accessors.  Why is this needed?
>
> Best regards,
>
> Wolfgang Denk

I'll send a version 6 with your correction.

Regards,
Gabriel

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-07-12 22:31 ` [U-Boot] [PATCH v5] " Gabriel Huau
  2014-07-13  9:58   ` Wolfgang Denk
@ 2014-07-15  7:49   ` Stefano Babic
  2014-07-15 14:13     ` gabriel huau
  1 sibling, 1 reply; 23+ messages in thread
From: Stefano Babic @ 2014-07-15  7:49 UTC (permalink / raw)
  To: u-boot

Hi Gabriel,

On 13/07/2014 00:31, Gabriel Huau wrote:
> This allows u-boot to load different OS or Bare Metal application on the
> different cores of the i.MX6DQ.
> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
> 
> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
> ---
> Changes for v2:
> 	- Add a commit log message to explain the purpose of this patch
> Changes for v3:
> 	- Remove unnecessary check for unsigned values when they are negative
> Changes for v4:
> 	- Add CONFIG_MP to the common mx6 configuration
> 	- Get the number of CPUs dynamically instead of using a macro
> Changes for v5:
> 	- Rebase on the last update of the tree (conflicts solved)

However, I get several warnings applying your patch:

arch/arm/include/asm/arch/sys_proto.h:17:0: warning: "is_soc_rev"
redefined [enabled by default]
arch/arm/include/asm/arch/sys_proto.h:15:0: note: this is the location
of the previous definition


and:

arch/arm/cpu/armv7/mx6/mp.c:101:2: warning: implicit declaration of
function 'get_nr_cpus' [-Wimplicit-function-declaration]
In file included from arch/arm/imx-common/cpu.c:15:0:

You muxt fix them.

> 	- Add a dummy header to solve build issue regarding the common/board_f.c
> 

I do not think this is the best solution. An empty file is a file that
is not needed.

>  arch/arm/cpu/armv7/mx6/Makefile           |   1 +
>  arch/arm/cpu/armv7/mx6/mp.c               | 134 ++++++++++++++++++++++++++++++
>  arch/arm/cpu/armv7/mx6/soc.c              |   6 ++
>  arch/arm/include/asm/arch-mx6/imx-regs.h  |  13 +++
>  arch/arm/include/asm/arch-mx6/sys_proto.h |   1 +
>  arch/arm/include/asm/mp.h                 |  11 +++
>  include/configs/mx6_common.h              |   2 +
>  7 files changed, 168 insertions(+)
>  create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
>  create mode 100644 arch/arm/include/asm/mp.h
> 

I have just investigate a bit. The file is included by common/board_f.c
but it is, frankly, quite not used. There are several prototype inside it:

void setup_mp(void);
void cpu_mp_lmb_reserve(struct lmb *lmb);
int is_core_disabled(int nr);

They are not used at all.

u32 determine_mp_bootpg(unsigned int *pagesize);

This is the only one that is used.

Then it makes more sense to drop mp.h from board_f.c and add a prototype
for determine_mp_bootpg(). This function is already protected by:

#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))


> diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
> index 6dc9f8e..bf6effc 100644
> --- a/arch/arm/cpu/armv7/mx6/Makefile
> +++ b/arch/arm/cpu/armv7/mx6/Makefile
> @@ -10,3 +10,4 @@
>  obj-y	:= soc.o clock.o
>  obj-$(CONFIG_SPL_BUILD)	     += ddr.o
>  obj-$(CONFIG_SECURE_BOOT)    += hab.o
> +obj-$(CONFIG_MP)             += mp.o
> diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
> new file mode 100644
> index 0000000..85003d3
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/mx6/mp.c
> @@ -0,0 +1,134 @@
> +/*
> + * (C) Copyright 2014
> + * Gabriel Huau <contact@huau-gabriel.fr>
> + *
> + * (C) Copyright 2009 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/errno.h>
> +#include <asm/arch/sys_proto.h>
> +#include <asm/arch/imx-regs.h>
> +
> +int cpu_reset(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		reg |= SRC_SCR_CORE_1_RESET_MASK;
> +		break;
> +
> +	case 2:
> +		reg |= SRC_SCR_CORE_2_RESET_MASK;
> +		break;
> +
> +	case 3:
> +		reg |= SRC_SCR_CORE_3_RESET_MASK;
> +		break;
> +	}
> +
> +	/* Software reset of the CPU N */
> +	__raw_writel(reg, &src->scr);
> +
> +	return 0;
> +}
> +
> +int cpu_status(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		printf("core 1: %d\n", !!(reg & SRC_SCR_CORE_1_ENABLE_MASK));
> +		break;
> +
> +	case 2:
> +		printf("core 2: %d\n", !!(reg & SRC_SCR_CORE_2_ENABLE_MASK));
> +		break;
> +
> +	case 3:
> +		printf("core 3: %d\n", !!(reg & SRC_SCR_CORE_3_ENABLE_MASK));
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +int cpu_release(int nr, int argc, char *const argv[])
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +	uint32_t boot_addr;
> +
> +	boot_addr = simple_strtoul(argv[0], NULL, 16);
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		__raw_writel(boot_addr, &src->gpr3);
> +		reg |= SRC_SCR_CORE_1_ENABLE_MASK;
> +		break;
> +
> +	case 2:
> +		__raw_writel(boot_addr, &src->gpr5);
> +		reg |= SRC_SCR_CORE_2_ENABLE_MASK;
> +		break;
> +
> +	case 3:
> +		__raw_writel(boot_addr, &src->gpr7);
> +		reg |= SRC_SCR_CORE_3_ENABLE_MASK;
> +		break;
> +	}
> +
> +	/* CPU N is ready to start */
> +	__raw_writel(reg, &src->scr);
> +
> +	return 0;
> +}
> +
> +int is_core_valid(unsigned int core)
> +{
> +	uint32_t nr_cores = get_nr_cpus();
> +
> +	if (core > nr_cores)
> +		return 0;
> +
> +	return 1;
> +}
> +
> +int cpu_disable(int nr)
> +{
> +	uint32_t reg;
> +	struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +	reg = __raw_readl(&src->scr);
> +
> +	switch (nr) {
> +	case 1:
> +		reg &= ~SRC_SCR_CORE_1_ENABLE_MASK;
> +		break;
> +
> +	case 2:
> +		reg &= ~SRC_SCR_CORE_2_ENABLE_MASK;
> +		break;
> +
> +	case 3:
> +		reg &= ~SRC_SCR_CORE_3_ENABLE_MASK;
> +		break;
> +	}
> +
> +	/* Disable the CPU N */
> +	__raw_writel(reg, &src->scr);
> +
> +	return 0;
> +}
> diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
> index f20bdeb..19429b2 100644
> --- a/arch/arm/cpu/armv7/mx6/soc.c
> +++ b/arch/arm/cpu/armv7/mx6/soc.c
> @@ -35,6 +35,12 @@ struct scu_regs {
>  	u32	fpga_rev;
>  };
>  
> +u32 get_nr_cpus(void)
> +{
> +	struct scu_regs *scu = (struct scu_regs *)SCU_BASE_ADDR;
> +	return readl(&scu->config) & 3;
> +}
> +
>  u32 get_cpu_rev(void)
>  {
>  	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
> diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
> index a69a753..a90cbe9 100644
> --- a/arch/arm/include/asm/arch-mx6/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
> @@ -227,6 +227,19 @@
>  
>  extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
>  
> +#define SRC_SCR_CORE_1_RESET_OFFSET     14
> +#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
> +#define SRC_SCR_CORE_2_RESET_OFFSET     15
> +#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
> +#define SRC_SCR_CORE_3_RESET_OFFSET     16
> +#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
> +#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
> +#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
> +#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
> +#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
> +#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
> +#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
> +
>  /* System Reset Controller (SRC) */
>  struct src {
>  	u32	scr;
> diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h
> index 42d30f5..7cbc133 100644
> --- a/arch/arm/include/asm/arch-mx6/sys_proto.h
> +++ b/arch/arm/include/asm/arch-mx6/sys_proto.h
> @@ -14,6 +14,7 @@
>  #define soc_rev() (get_cpu_rev() & 0xFF)
>  #define is_soc_rev(rev)        (soc_rev() - rev)
>  
> +#define is_soc_rev(rev)	((get_cpu_rev() & 0xFF) - rev)

You see, is_soc_rev() is defined twice !

>  u32 get_cpu_rev(void);
>  
>  /* returns MXC_CPU_ value */
> diff --git a/arch/arm/include/asm/mp.h b/arch/arm/include/asm/mp.h
> new file mode 100644
> index 0000000..8cf8d88
> --- /dev/null
> +++ b/arch/arm/include/asm/mp.h
> @@ -0,0 +1,11 @@
> +/*
> + * (C) Copyright 2014
> + * Gabriel Huau <contact@huau-gabriel.fr>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#ifndef _ASM_MP_H_
> +#define _ASM_MP_H_
> +
> +#endif
> diff --git a/include/configs/mx6_common.h b/include/configs/mx6_common.h
> index e4a5cc5..135a3f5 100644
> --- a/include/configs/mx6_common.h
> +++ b/include/configs/mx6_common.h
> @@ -28,4 +28,6 @@
>  #define CONFIG_SYS_PL310_BASE	L2_PL310_BASE
>  #endif
>  
> +#define CONFIG_MP
> +
>  #endif
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-07-15  7:49   ` Stefano Babic
@ 2014-07-15 14:13     ` gabriel huau
  2014-07-15 19:35       ` Stefano Babic
  0 siblings, 1 reply; 23+ messages in thread
From: gabriel huau @ 2014-07-15 14:13 UTC (permalink / raw)
  To: u-boot

On 07/15/2014 12:49 AM, Stefano Babic wrote:
> Hi Gabriel,
>
> On 13/07/2014 00:31, Gabriel Huau wrote:
>> This allows u-boot to load different OS or Bare Metal application on the
>> different cores of the i.MX6DQ.
>> For example: we can run Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>>
>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
>> ---
>> Changes for v2:
>> 	- Add a commit log message to explain the purpose of this patch
>> Changes for v3:
>> 	- Remove unnecessary check for unsigned values when they are negative
>> Changes for v4:
>> 	- Add CONFIG_MP to the common mx6 configuration
>> 	- Get the number of CPUs dynamically instead of using a macro
>> Changes for v5:
>> 	- Rebase on the last update of the tree (conflicts solved)
> However, I get several warnings applying your patch:
>
> arch/arm/include/asm/arch/sys_proto.h:17:0: warning: "is_soc_rev"
> redefined [enabled by default]
> arch/arm/include/asm/arch/sys_proto.h:15:0: note: this is the location
> of the previous definition
>
>
> and:
>
> arch/arm/cpu/armv7/mx6/mp.c:101:2: warning: implicit declaration of
> function 'get_nr_cpus' [-Wimplicit-function-declaration]
> In file included from arch/arm/imx-common/cpu.c:15:0:
>
> You muxt fix them.

My bad during the merge conflict, I'll fix that for the next version of 
the patch.

>> 	- Add a dummy header to solve build issue regarding the common/board_f.c
>>
> I do not think this is the best solution. An empty file is a file that
> is not needed.
>
>>   arch/arm/cpu/armv7/mx6/Makefile           |   1 +
>>   arch/arm/cpu/armv7/mx6/mp.c               | 134 ++++++++++++++++++++++++++++++
>>   arch/arm/cpu/armv7/mx6/soc.c              |   6 ++
>>   arch/arm/include/asm/arch-mx6/imx-regs.h  |  13 +++
>>   arch/arm/include/asm/arch-mx6/sys_proto.h |   1 +
>>   arch/arm/include/asm/mp.h                 |  11 +++
>>   include/configs/mx6_common.h              |   2 +
>>   7 files changed, 168 insertions(+)
>>   create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
>>   create mode 100644 arch/arm/include/asm/mp.h
>>
> I have just investigate a bit. The file is included by common/board_f.c
> but it is, frankly, quite not used. There are several prototype inside it:
>
> void setup_mp(void);
> void cpu_mp_lmb_reserve(struct lmb *lmb);
> int is_core_disabled(int nr);
>
> They are not used at all.
>
> u32 determine_mp_bootpg(unsigned int *pagesize);
>
> This is the only one that is used.
>
> Then it makes more sense to drop mp.h from board_f.c and add a prototype
> for determine_mp_bootpg(). This function is already protected by:
>
> #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))

I agree adding an empty is not necessary the best solution, but I'd 
rather not to add any cpu/board specific defines in the common/ folder. 
That's why I think we should keep CONFIG_PM as this is a generic define. 
If necessary, I can propose another patch to fix it.

> Best regards,
> Stefano Babic
>

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-07-15 14:13     ` gabriel huau
@ 2014-07-15 19:35       ` Stefano Babic
  2014-07-15 19:59         ` Gabriel Huau
  0 siblings, 1 reply; 23+ messages in thread
From: Stefano Babic @ 2014-07-15 19:35 UTC (permalink / raw)
  To: u-boot

Hi Gabriel,

On 15/07/2014 16:13, gabriel huau wrote:

>> I have just investigate a bit. The file is included by common/board_f.c
>> but it is, frankly, quite not used. There are several prototype inside
>> it:
>>
>> void setup_mp(void);
>> void cpu_mp_lmb_reserve(struct lmb *lmb);
>> int is_core_disabled(int nr);
>>
>> They are not used at all.
>>
>> u32 determine_mp_bootpg(unsigned int *pagesize);
>>
>> This is the only one that is used.
>>
>> Then it makes more sense to drop mp.h from board_f.c and add a prototype
>> for determine_mp_bootpg(). This function is already protected by:
>>
>> #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) ||
>> defined(CONFIG_E500))
> 
> I agree adding an empty is not necessary the best solution, but I'd
> rather not to add any cpu/board specific defines in the common/ folder.
> That's why I think we should keep CONFIG_PM as this is a generic define.
> If necessary, I can propose another patch to fix it.

I think we are saying the same thing. I agree letting CONFIG_MP, this is
not the point. But prototype for determine_mp_bootg() can be moved in a
powerpc include file and board_f does not need to include any mp.h

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH v5] mx6: add support of multi-processor command
  2014-07-15 19:35       ` Stefano Babic
@ 2014-07-15 19:59         ` Gabriel Huau
  0 siblings, 0 replies; 23+ messages in thread
From: Gabriel Huau @ 2014-07-15 19:59 UTC (permalink / raw)
  To: u-boot

Agreed, I misunderstood sorry. I'll do the modification for the next 
version of the patch.

Thanks!
Regards,
Gabriel

On 07/15/2014 12:35 PM, Stefano Babic wrote:
> Hi Gabriel,
>
> On 15/07/2014 16:13, gabriel huau wrote:
>
>>> I have just investigate a bit. The file is included by common/board_f.c
>>> but it is, frankly, quite not used. There are several prototype inside
>>> it:
>>>
>>> void setup_mp(void);
>>> void cpu_mp_lmb_reserve(struct lmb *lmb);
>>> int is_core_disabled(int nr);
>>>
>>> They are not used at all.
>>>
>>> u32 determine_mp_bootpg(unsigned int *pagesize);
>>>
>>> This is the only one that is used.
>>>
>>> Then it makes more sense to drop mp.h from board_f.c and add a prototype
>>> for determine_mp_bootpg(). This function is already protected by:
>>>
>>> #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) ||
>>> defined(CONFIG_E500))
>> I agree adding an empty is not necessary the best solution, but I'd
>> rather not to add any cpu/board specific defines in the common/ folder.
>> That's why I think we should keep CONFIG_PM as this is a generic define.
>> If necessary, I can propose another patch to fix it.
> I think we are saying the same thing. I agree letting CONFIG_MP, this is
> not the point. But prototype for determine_mp_bootg() can be moved in a
> powerpc include file and board_f does not need to include any mp.h
>
> Best regards,
> Stefano Babic
>

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

* [U-Boot] [PATCH v6] mx6: add support of multi-processor command
  2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
                   ` (4 preceding siblings ...)
  2014-07-12 22:31 ` [U-Boot] [PATCH v5] " Gabriel Huau
@ 2014-07-26 18:35 ` Gabriel Huau
  2014-07-28 15:15   ` Stefano Babic
  5 siblings, 1 reply; 23+ messages in thread
From: Gabriel Huau @ 2014-07-26 18:35 UTC (permalink / raw)
  To: u-boot

This allows u-boot to load different OS or Bare Metal application on
different cores of the i.MX6 SoC.
For example: running Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.

Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
---
Changes for v2:
	- Add a commit log message to explain the purpose of this patch
Changes for v3:
	- Remove unnecessary check for unsigned values when they are negative
Changes for v4:
	- Add CONFIG_MP to the common mx6 configuration
	- Get the number of CPUs dynamically instead of using a macro
Changes for v5:
	- Rebase on the last update of the tree (conflicts solved)
Changes for v6:
	- Remove useless switch case
	- Update board_f to not depend on mp.h unnecessary
	- Fix build warnings
	- Update commit message

 arch/arm/cpu/armv7/mx6/Makefile           |  1 +
 arch/arm/cpu/armv7/mx6/mp.c               | 87 +++++++++++++++++++++++++++++++
 arch/arm/cpu/armv7/mx6/soc.c              |  6 +++
 arch/arm/include/asm/arch-mx6/imx-regs.h  | 13 +++++
 arch/arm/include/asm/arch-mx6/sys_proto.h |  1 +
 common/board_f.c                          |  8 +--
 include/configs/mx6_common.h              |  2 +
 7 files changed, 114 insertions(+), 4 deletions(-)
 create mode 100644 arch/arm/cpu/armv7/mx6/mp.c

diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
index 6dc9f8e..bf6effc 100644
--- a/arch/arm/cpu/armv7/mx6/Makefile
+++ b/arch/arm/cpu/armv7/mx6/Makefile
@@ -10,3 +10,4 @@
 obj-y	:= soc.o clock.o
 obj-$(CONFIG_SPL_BUILD)	     += ddr.o
 obj-$(CONFIG_SECURE_BOOT)    += hab.o
+obj-$(CONFIG_MP)             += mp.o
diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
new file mode 100644
index 0000000..9f034d6
--- /dev/null
+++ b/arch/arm/cpu/armv7/mx6/mp.c
@@ -0,0 +1,87 @@
+/*
+ * (C) Copyright 2014
+ * Gabriel Huau <contact@huau-gabriel.fr>
+ *
+ * (C) Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/imx-regs.h>
+
+#define MAX_CPUS 4
+static struct src *src = (struct src *)SRC_BASE_ADDR;
+
+static uint32_t cpu_reset_mask[MAX_CPUS] = {
+	0, /* We don't really want to modify the cpu0 */
+	SRC_SCR_CORE_1_RESET_MASK,
+	SRC_SCR_CORE_2_RESET_MASK,
+	SRC_SCR_CORE_3_RESET_MASK
+};
+
+static uint32_t cpu_ctrl_mask[MAX_CPUS] = {
+	0, /* We don't really want to modify the cpu0 */
+	SRC_SCR_CORE_1_ENABLE_MASK,
+	SRC_SCR_CORE_2_ENABLE_MASK,
+	SRC_SCR_CORE_3_ENABLE_MASK
+};
+
+int cpu_reset(int nr)
+{
+	/* Software reset of the CPU N */
+	src->scr |= cpu_reset_mask[nr];
+	return 0;
+}
+
+int cpu_status(int nr)
+{
+	printf("core %d => %d\n", nr, !!(src->scr & cpu_ctrl_mask[nr]));
+	return 0;
+}
+
+int cpu_release(int nr, int argc, char *const argv[])
+{
+	uint32_t boot_addr;
+
+	boot_addr = simple_strtoul(argv[0], NULL, 16);
+
+	switch (nr) {
+	case 1:
+		src->gpr3 = boot_addr;
+		break;
+	case 2:
+		src->gpr5 = boot_addr;
+		break;
+	case 3:
+		src->gpr7 = boot_addr;
+		break;
+	default:
+		return 1;
+	}
+
+	/* CPU N is ready to start */
+	src->scr |= cpu_ctrl_mask[nr];
+
+	return 0;
+}
+
+int is_core_valid(unsigned int core)
+{
+	uint32_t nr_cores = get_nr_cpus();
+
+	if (core > nr_cores)
+		return 0;
+
+	return 1;
+}
+
+int cpu_disable(int nr)
+{
+	/* Disable the CPU N */
+	src->scr &= ~cpu_ctrl_mask[nr];
+	return 0;
+}
diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
index f20bdeb..19429b2 100644
--- a/arch/arm/cpu/armv7/mx6/soc.c
+++ b/arch/arm/cpu/armv7/mx6/soc.c
@@ -35,6 +35,12 @@ struct scu_regs {
 	u32	fpga_rev;
 };
 
+u32 get_nr_cpus(void)
+{
+	struct scu_regs *scu = (struct scu_regs *)SCU_BASE_ADDR;
+	return readl(&scu->config) & 3;
+}
+
 u32 get_cpu_rev(void)
 {
 	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
index a69a753..a90cbe9 100644
--- a/arch/arm/include/asm/arch-mx6/imx-regs.h
+++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
@@ -227,6 +227,19 @@
 
 extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
 
+#define SRC_SCR_CORE_1_RESET_OFFSET     14
+#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
+#define SRC_SCR_CORE_2_RESET_OFFSET     15
+#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
+#define SRC_SCR_CORE_3_RESET_OFFSET     16
+#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
+#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
+#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
+#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
+#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
+#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
+#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
+
 /* System Reset Controller (SRC) */
 struct src {
 	u32	scr;
diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h
index 42d30f5..306d699 100644
--- a/arch/arm/include/asm/arch-mx6/sys_proto.h
+++ b/arch/arm/include/asm/arch-mx6/sys_proto.h
@@ -14,6 +14,7 @@
 #define soc_rev() (get_cpu_rev() & 0xFF)
 #define is_soc_rev(rev)        (soc_rev() - rev)
 
+u32 get_nr_cpus(void);
 u32 get_cpu_rev(void);
 
 /* returns MXC_CPU_ value */
diff --git a/common/board_f.c b/common/board_f.c
index 6203d85..e1dbdf3 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -34,6 +34,9 @@
 #ifdef CONFIG_MPC5xxx
 #include <mpc5xxx.h>
 #endif
+#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
+#include <asm/mp.h>
+#endif
 
 #include <os.h>
 #include <post.h>
@@ -43,9 +46,6 @@
 #include <watchdog.h>
 #include <asm/errno.h>
 #include <asm/io.h>
-#ifdef CONFIG_MP
-#include <asm/mp.h>
-#endif
 #include <asm/sections.h>
 #ifdef CONFIG_X86
 #include <asm/init_helpers.h>
@@ -381,7 +381,7 @@ static int setup_dest_addr(void)
 	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
 	gd->relocaddr = gd->ram_top;
 	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
-#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
+#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
 	/*
 	 * We need to make sure the location we intend to put secondary core
 	 * boot code is reserved and not used by any part of u-boot
diff --git a/include/configs/mx6_common.h b/include/configs/mx6_common.h
index e4a5cc5..135a3f5 100644
--- a/include/configs/mx6_common.h
+++ b/include/configs/mx6_common.h
@@ -28,4 +28,6 @@
 #define CONFIG_SYS_PL310_BASE	L2_PL310_BASE
 #endif
 
+#define CONFIG_MP
+
 #endif
-- 
2.0.0

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

* [U-Boot] [PATCH v6] mx6: add support of multi-processor command
  2014-07-26 18:35 ` [U-Boot] [PATCH v6] " Gabriel Huau
@ 2014-07-28 15:15   ` Stefano Babic
  2014-09-03 18:00     ` York Sun
  0 siblings, 1 reply; 23+ messages in thread
From: Stefano Babic @ 2014-07-28 15:15 UTC (permalink / raw)
  To: u-boot

Hi Gabriel,

On 26/07/2014 20:35, Gabriel Huau wrote:
> This allows u-boot to load different OS or Bare Metal application on
> different cores of the i.MX6 SoC.
> For example: running Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
> 
> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
> ---
> Changes for v2:
> 	- Add a commit log message to explain the purpose of this patch
> Changes for v3:
> 	- Remove unnecessary check for unsigned values when they are negative
> Changes for v4:
> 	- Add CONFIG_MP to the common mx6 configuration
> 	- Get the number of CPUs dynamically instead of using a macro
> Changes for v5:
> 	- Rebase on the last update of the tree (conflicts solved)
> Changes for v6:
> 	- Remove useless switch case
> 	- Update board_f to not depend on mp.h unnecessary
> 	- Fix build warnings
> 	- Update commit message
> 
>  arch/arm/cpu/armv7/mx6/Makefile           |  1 +
>  arch/arm/cpu/armv7/mx6/mp.c               | 87 +++++++++++++++++++++++++++++++
>  arch/arm/cpu/armv7/mx6/soc.c              |  6 +++
>  arch/arm/include/asm/arch-mx6/imx-regs.h  | 13 +++++
>  arch/arm/include/asm/arch-mx6/sys_proto.h |  1 +
>  common/board_f.c                          |  8 +--
>  include/configs/mx6_common.h              |  2 +
>  7 files changed, 114 insertions(+), 4 deletions(-)
>  create mode 100644 arch/arm/cpu/armv7/mx6/mp.c
> 
> diff --git a/arch/arm/cpu/armv7/mx6/Makefile b/arch/arm/cpu/armv7/mx6/Makefile
> index 6dc9f8e..bf6effc 100644
> --- a/arch/arm/cpu/armv7/mx6/Makefile
> +++ b/arch/arm/cpu/armv7/mx6/Makefile
> @@ -10,3 +10,4 @@
>  obj-y	:= soc.o clock.o
>  obj-$(CONFIG_SPL_BUILD)	     += ddr.o
>  obj-$(CONFIG_SECURE_BOOT)    += hab.o
> +obj-$(CONFIG_MP)             += mp.o
> diff --git a/arch/arm/cpu/armv7/mx6/mp.c b/arch/arm/cpu/armv7/mx6/mp.c
> new file mode 100644
> index 0000000..9f034d6
> --- /dev/null
> +++ b/arch/arm/cpu/armv7/mx6/mp.c
> @@ -0,0 +1,87 @@
> +/*
> + * (C) Copyright 2014
> + * Gabriel Huau <contact@huau-gabriel.fr>
> + *
> + * (C) Copyright 2009 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/errno.h>
> +#include <asm/arch/sys_proto.h>
> +#include <asm/arch/imx-regs.h>
> +
> +#define MAX_CPUS 4
> +static struct src *src = (struct src *)SRC_BASE_ADDR;
> +
> +static uint32_t cpu_reset_mask[MAX_CPUS] = {
> +	0, /* We don't really want to modify the cpu0 */
> +	SRC_SCR_CORE_1_RESET_MASK,
> +	SRC_SCR_CORE_2_RESET_MASK,
> +	SRC_SCR_CORE_3_RESET_MASK
> +};
> +
> +static uint32_t cpu_ctrl_mask[MAX_CPUS] = {
> +	0, /* We don't really want to modify the cpu0 */
> +	SRC_SCR_CORE_1_ENABLE_MASK,
> +	SRC_SCR_CORE_2_ENABLE_MASK,
> +	SRC_SCR_CORE_3_ENABLE_MASK
> +};
> +
> +int cpu_reset(int nr)
> +{
> +	/* Software reset of the CPU N */
> +	src->scr |= cpu_reset_mask[nr];
> +	return 0;
> +}
> +
> +int cpu_status(int nr)
> +{
> +	printf("core %d => %d\n", nr, !!(src->scr & cpu_ctrl_mask[nr]));
> +	return 0;
> +}
> +
> +int cpu_release(int nr, int argc, char *const argv[])
> +{
> +	uint32_t boot_addr;
> +
> +	boot_addr = simple_strtoul(argv[0], NULL, 16);
> +
> +	switch (nr) {
> +	case 1:
> +		src->gpr3 = boot_addr;
> +		break;
> +	case 2:
> +		src->gpr5 = boot_addr;
> +		break;
> +	case 3:
> +		src->gpr7 = boot_addr;
> +		break;
> +	default:
> +		return 1;
> +	}
> +
> +	/* CPU N is ready to start */
> +	src->scr |= cpu_ctrl_mask[nr];
> +
> +	return 0;
> +}
> +
> +int is_core_valid(unsigned int core)
> +{
> +	uint32_t nr_cores = get_nr_cpus();
> +
> +	if (core > nr_cores)
> +		return 0;
> +
> +	return 1;
> +}
> +
> +int cpu_disable(int nr)
> +{
> +	/* Disable the CPU N */
> +	src->scr &= ~cpu_ctrl_mask[nr];
> +	return 0;
> +}
> diff --git a/arch/arm/cpu/armv7/mx6/soc.c b/arch/arm/cpu/armv7/mx6/soc.c
> index f20bdeb..19429b2 100644
> --- a/arch/arm/cpu/armv7/mx6/soc.c
> +++ b/arch/arm/cpu/armv7/mx6/soc.c
> @@ -35,6 +35,12 @@ struct scu_regs {
>  	u32	fpga_rev;
>  };
>  
> +u32 get_nr_cpus(void)
> +{
> +	struct scu_regs *scu = (struct scu_regs *)SCU_BASE_ADDR;
> +	return readl(&scu->config) & 3;
> +}
> +
>  u32 get_cpu_rev(void)
>  {
>  	struct anatop_regs *anatop = (struct anatop_regs *)ANATOP_BASE_ADDR;
> diff --git a/arch/arm/include/asm/arch-mx6/imx-regs.h b/arch/arm/include/asm/arch-mx6/imx-regs.h
> index a69a753..a90cbe9 100644
> --- a/arch/arm/include/asm/arch-mx6/imx-regs.h
> +++ b/arch/arm/include/asm/arch-mx6/imx-regs.h
> @@ -227,6 +227,19 @@
>  
>  extern void imx_get_mac_from_fuse(int dev_id, unsigned char *mac);
>  
> +#define SRC_SCR_CORE_1_RESET_OFFSET     14
> +#define SRC_SCR_CORE_1_RESET_MASK       (1<<SRC_SCR_CORE_1_RESET_OFFSET)
> +#define SRC_SCR_CORE_2_RESET_OFFSET     15
> +#define SRC_SCR_CORE_2_RESET_MASK       (1<<SRC_SCR_CORE_2_RESET_OFFSET)
> +#define SRC_SCR_CORE_3_RESET_OFFSET     16
> +#define SRC_SCR_CORE_3_RESET_MASK       (1<<SRC_SCR_CORE_3_RESET_OFFSET)
> +#define SRC_SCR_CORE_1_ENABLE_OFFSET    22
> +#define SRC_SCR_CORE_1_ENABLE_MASK      (1<<SRC_SCR_CORE_1_ENABLE_OFFSET)
> +#define SRC_SCR_CORE_2_ENABLE_OFFSET    23
> +#define SRC_SCR_CORE_2_ENABLE_MASK      (1<<SRC_SCR_CORE_2_ENABLE_OFFSET)
> +#define SRC_SCR_CORE_3_ENABLE_OFFSET    24
> +#define SRC_SCR_CORE_3_ENABLE_MASK      (1<<SRC_SCR_CORE_3_ENABLE_OFFSET)
> +
>  /* System Reset Controller (SRC) */
>  struct src {
>  	u32	scr;
> diff --git a/arch/arm/include/asm/arch-mx6/sys_proto.h b/arch/arm/include/asm/arch-mx6/sys_proto.h
> index 42d30f5..306d699 100644
> --- a/arch/arm/include/asm/arch-mx6/sys_proto.h
> +++ b/arch/arm/include/asm/arch-mx6/sys_proto.h
> @@ -14,6 +14,7 @@
>  #define soc_rev() (get_cpu_rev() & 0xFF)
>  #define is_soc_rev(rev)        (soc_rev() - rev)
>  
> +u32 get_nr_cpus(void);
>  u32 get_cpu_rev(void);
>  
>  /* returns MXC_CPU_ value */
> diff --git a/common/board_f.c b/common/board_f.c
> index 6203d85..e1dbdf3 100644
> --- a/common/board_f.c
> +++ b/common/board_f.c
> @@ -34,6 +34,9 @@
>  #ifdef CONFIG_MPC5xxx
>  #include <mpc5xxx.h>
>  #endif
> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
> +#include <asm/mp.h>
> +#endif
>  
>  #include <os.h>
>  #include <post.h>
> @@ -43,9 +46,6 @@
>  #include <watchdog.h>
>  #include <asm/errno.h>
>  #include <asm/io.h>
> -#ifdef CONFIG_MP
> -#include <asm/mp.h>
> -#endif
>  #include <asm/sections.h>
>  #ifdef CONFIG_X86
>  #include <asm/init_helpers.h>
> @@ -381,7 +381,7 @@ static int setup_dest_addr(void)
>  	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
>  	gd->relocaddr = gd->ram_top;
>  	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
> -#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>  	/*
>  	 * We need to make sure the location we intend to put secondary core
>  	 * boot code is reserved and not used by any part of u-boot
> diff --git a/include/configs/mx6_common.h b/include/configs/mx6_common.h
> index e4a5cc5..135a3f5 100644
> --- a/include/configs/mx6_common.h
> +++ b/include/configs/mx6_common.h
> @@ -28,4 +28,6 @@
>  #define CONFIG_SYS_PL310_BASE	L2_PL310_BASE
>  #endif
>  
> +#define CONFIG_MP
> +
>  #endif


Fine with me. If there are not further comments, I will merge it soon.

Acked-by: Stefano Babic <sbabic@denx.de>

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================

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

* [U-Boot] [PATCH v6] mx6: add support of multi-processor command
  2014-07-28 15:15   ` Stefano Babic
@ 2014-09-03 18:00     ` York Sun
  2014-09-03 18:26       ` Gabriel Huau
  0 siblings, 1 reply; 23+ messages in thread
From: York Sun @ 2014-09-03 18:00 UTC (permalink / raw)
  To: u-boot

On 07/28/2014 08:15 AM, Stefano Babic wrote:
> Hi Gabriel,
> 
> On 26/07/2014 20:35, Gabriel Huau wrote:
>> This allows u-boot to load different OS or Bare Metal application on
>> different cores of the i.MX6 SoC.
>> For example: running Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>>
>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
>> ---
>> Changes for v2:
>> 	- Add a commit log message to explain the purpose of this patch
>> Changes for v3:
>> 	- Remove unnecessary check for unsigned values when they are negative
>> Changes for v4:
>> 	- Add CONFIG_MP to the common mx6 configuration
>> 	- Get the number of CPUs dynamically instead of using a macro
>> Changes for v5:
>> 	- Rebase on the last update of the tree (conflicts solved)
>> Changes for v6:
>> 	- Remove useless switch case
>> 	- Update board_f to not depend on mp.h unnecessary
>> 	- Fix build warnings
>> 	- Update commit message
>>

<snip>

>> --- a/common/board_f.c
>> +++ b/common/board_f.c
>> @@ -34,6 +34,9 @@
>>  #ifdef CONFIG_MPC5xxx
>>  #include <mpc5xxx.h>
>>  #endif
>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>> +#include <asm/mp.h>
>> +#endif
>>  
>>  #include <os.h>
>>  #include <post.h>
>> @@ -43,9 +46,6 @@
>>  #include <watchdog.h>
>>  #include <asm/errno.h>
>>  #include <asm/io.h>
>> -#ifdef CONFIG_MP
>> -#include <asm/mp.h>
>> -#endif
>>  #include <asm/sections.h>
>>  #ifdef CONFIG_X86
>>  #include <asm/init_helpers.h>
>> @@ -381,7 +381,7 @@ static int setup_dest_addr(void)
>>  	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
>>  	gd->relocaddr = gd->ram_top;
>>  	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
>> -#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))

I didn't notice this patch until it got merged. Why dropping CONFIG_MP here?
This change breaks these boards

 MPC8536DS MPC8536DS_36BIT MPC8536DS_SDCARD MPC8536DS_SPIFLASH qemu-ppce500

York

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

* [U-Boot] [PATCH v6] mx6: add support of multi-processor command
  2014-09-03 18:00     ` York Sun
@ 2014-09-03 18:26       ` Gabriel Huau
  2014-09-03 18:36         ` York Sun
  0 siblings, 1 reply; 23+ messages in thread
From: Gabriel Huau @ 2014-09-03 18:26 UTC (permalink / raw)
  To: u-boot

Hi York,

On 09/03/2014 11:00 AM, York Sun wrote:
> On 07/28/2014 08:15 AM, Stefano Babic wrote:
>> Hi Gabriel,
>>
>> On 26/07/2014 20:35, Gabriel Huau wrote:
>>> This allows u-boot to load different OS or Bare Metal application on
>>> different cores of the i.MX6 SoC.
>>> For example: running Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>>>
>>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
>>> ---
>>> Changes for v2:
>>> 	- Add a commit log message to explain the purpose of this patch
>>> Changes for v3:
>>> 	- Remove unnecessary check for unsigned values when they are negative
>>> Changes for v4:
>>> 	- Add CONFIG_MP to the common mx6 configuration
>>> 	- Get the number of CPUs dynamically instead of using a macro
>>> Changes for v5:
>>> 	- Rebase on the last update of the tree (conflicts solved)
>>> Changes for v6:
>>> 	- Remove useless switch case
>>> 	- Update board_f to not depend on mp.h unnecessary
>>> 	- Fix build warnings
>>> 	- Update commit message
>>>
> <snip>
>
>>> --- a/common/board_f.c
>>> +++ b/common/board_f.c
>>> @@ -34,6 +34,9 @@
>>>   #ifdef CONFIG_MPC5xxx
>>>   #include <mpc5xxx.h>
>>>   #endif
>>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>> +#include <asm/mp.h>
>>> +#endif
>>>   
>>>   #include <os.h>
>>>   #include <post.h>
>>> @@ -43,9 +46,6 @@
>>>   #include <watchdog.h>
>>>   #include <asm/errno.h>
>>>   #include <asm/io.h>
>>> -#ifdef CONFIG_MP
>>> -#include <asm/mp.h>
>>> -#endif
>>>   #include <asm/sections.h>
>>>   #ifdef CONFIG_X86
>>>   #include <asm/init_helpers.h>
>>> @@ -381,7 +381,7 @@ static int setup_dest_addr(void)
>>>   	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
>>>   	gd->relocaddr = gd->ram_top;
>>>   	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
>>> -#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
> I didn't notice this patch until it got merged. Why dropping CONFIG_MP here?
> This change breaks these boards
>
>   MPC8536DS MPC8536DS_36BIT MPC8536DS_SDCARD MPC8536DS_SPIFLASH qemu-ppce500
>
> York

Sorry, I didn't see the break for these boards.
'asm/mp.h' is used only for the powerpc board and using CONFIG_MP force 
the other architecture (or board) to create an empty header.
As this header was here to use only specific features (not generic), I 
removed it and put the include guards only for the boards needed.

Can't we add these boards to the board_f.c?

Regards,
Gabriel

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

* [U-Boot] [PATCH v6] mx6: add support of multi-processor command
  2014-09-03 18:26       ` Gabriel Huau
@ 2014-09-03 18:36         ` York Sun
  2014-09-03 18:45           ` Gabriel Huau
  0 siblings, 1 reply; 23+ messages in thread
From: York Sun @ 2014-09-03 18:36 UTC (permalink / raw)
  To: u-boot

On 09/03/2014 11:26 AM, Gabriel Huau wrote:
> Hi York,
> 
> On 09/03/2014 11:00 AM, York Sun wrote:
>> On 07/28/2014 08:15 AM, Stefano Babic wrote:
>>> Hi Gabriel,
>>>
>>> On 26/07/2014 20:35, Gabriel Huau wrote:
>>>> This allows u-boot to load different OS or Bare Metal application on
>>>> different cores of the i.MX6 SoC.
>>>> For example: running Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>>>>
>>>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
>>>> ---
>>>> Changes for v2:
>>>> 	- Add a commit log message to explain the purpose of this patch
>>>> Changes for v3:
>>>> 	- Remove unnecessary check for unsigned values when they are negative
>>>> Changes for v4:
>>>> 	- Add CONFIG_MP to the common mx6 configuration
>>>> 	- Get the number of CPUs dynamically instead of using a macro
>>>> Changes for v5:
>>>> 	- Rebase on the last update of the tree (conflicts solved)
>>>> Changes for v6:
>>>> 	- Remove useless switch case
>>>> 	- Update board_f to not depend on mp.h unnecessary
>>>> 	- Fix build warnings
>>>> 	- Update commit message
>>>>
>> <snip>
>>
>>>> --- a/common/board_f.c
>>>> +++ b/common/board_f.c
>>>> @@ -34,6 +34,9 @@
>>>>   #ifdef CONFIG_MPC5xxx
>>>>   #include <mpc5xxx.h>
>>>>   #endif
>>>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>>> +#include <asm/mp.h>
>>>> +#endif
>>>>   
>>>>   #include <os.h>
>>>>   #include <post.h>
>>>> @@ -43,9 +46,6 @@
>>>>   #include <watchdog.h>
>>>>   #include <asm/errno.h>
>>>>   #include <asm/io.h>
>>>> -#ifdef CONFIG_MP
>>>> -#include <asm/mp.h>
>>>> -#endif
>>>>   #include <asm/sections.h>
>>>>   #ifdef CONFIG_X86
>>>>   #include <asm/init_helpers.h>
>>>> @@ -381,7 +381,7 @@ static int setup_dest_addr(void)
>>>>   	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
>>>>   	gd->relocaddr = gd->ram_top;
>>>>   	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
>>>> -#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>> I didn't notice this patch until it got merged. Why dropping CONFIG_MP here?
>> This change breaks these boards
>>
>>   MPC8536DS MPC8536DS_36BIT MPC8536DS_SDCARD MPC8536DS_SPIFLASH qemu-ppce500
>>
>> York
> 
> Sorry, I didn't see the break for these boards.
> 'asm/mp.h' is used only for the powerpc board and using CONFIG_MP force 
> the other architecture (or board) to create an empty header.
> As this header was here to use only specific features (not generic), I 
> removed it and put the include guards only for the boards needed.
> 
> Can't we add these boards to the board_f.c?
> 

I don't mind to change the guard for asm/mp.h. But you shouldn't remove the
guard for the function call. Not all powerpc SoCs support SMP. You could use

+#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
+#include <asm/mp.h>
+#endif

York

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

* [U-Boot] [PATCH v6] mx6: add support of multi-processor command
  2014-09-03 18:36         ` York Sun
@ 2014-09-03 18:45           ` Gabriel Huau
  0 siblings, 0 replies; 23+ messages in thread
From: Gabriel Huau @ 2014-09-03 18:45 UTC (permalink / raw)
  To: u-boot

On 09/03/2014 11:36 AM, York Sun wrote:
> On 09/03/2014 11:26 AM, Gabriel Huau wrote:
>> Hi York,
>>
>> On 09/03/2014 11:00 AM, York Sun wrote:
>>> On 07/28/2014 08:15 AM, Stefano Babic wrote:
>>>> Hi Gabriel,
>>>>
>>>> On 26/07/2014 20:35, Gabriel Huau wrote:
>>>>> This allows u-boot to load different OS or Bare Metal application on
>>>>> different cores of the i.MX6 SoC.
>>>>> For example: running Android on cpu0 and a RT OS like QNX/FreeRTOS on cpu1.
>>>>>
>>>>> Signed-off-by: Gabriel Huau <contact@huau-gabriel.fr>
>>>>> ---
>>>>> Changes for v2:
>>>>> 	- Add a commit log message to explain the purpose of this patch
>>>>> Changes for v3:
>>>>> 	- Remove unnecessary check for unsigned values when they are negative
>>>>> Changes for v4:
>>>>> 	- Add CONFIG_MP to the common mx6 configuration
>>>>> 	- Get the number of CPUs dynamically instead of using a macro
>>>>> Changes for v5:
>>>>> 	- Rebase on the last update of the tree (conflicts solved)
>>>>> Changes for v6:
>>>>> 	- Remove useless switch case
>>>>> 	- Update board_f to not depend on mp.h unnecessary
>>>>> 	- Fix build warnings
>>>>> 	- Update commit message
>>>>>
>>> <snip>
>>>
>>>>> --- a/common/board_f.c
>>>>> +++ b/common/board_f.c
>>>>> @@ -34,6 +34,9 @@
>>>>>    #ifdef CONFIG_MPC5xxx
>>>>>    #include <mpc5xxx.h>
>>>>>    #endif
>>>>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>>>> +#include <asm/mp.h>
>>>>> +#endif
>>>>>    
>>>>>    #include <os.h>
>>>>>    #include <post.h>
>>>>> @@ -43,9 +46,6 @@
>>>>>    #include <watchdog.h>
>>>>>    #include <asm/errno.h>
>>>>>    #include <asm/io.h>
>>>>> -#ifdef CONFIG_MP
>>>>> -#include <asm/mp.h>
>>>>> -#endif
>>>>>    #include <asm/sections.h>
>>>>>    #ifdef CONFIG_X86
>>>>>    #include <asm/init_helpers.h>
>>>>> @@ -381,7 +381,7 @@ static int setup_dest_addr(void)
>>>>>    	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
>>>>>    	gd->relocaddr = gd->ram_top;
>>>>>    	debug("Ram top: %08lX\n", (ulong)gd->ram_top);
>>>>> -#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>>>> +#if (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
>>> I didn't notice this patch until it got merged. Why dropping CONFIG_MP here?
>>> This change breaks these boards
>>>
>>>    MPC8536DS MPC8536DS_36BIT MPC8536DS_SDCARD MPC8536DS_SPIFLASH qemu-ppce500
>>>
>>> York
>> Sorry, I didn't see the break for these boards.
>> 'asm/mp.h' is used only for the powerpc board and using CONFIG_MP force
>> the other architecture (or board) to create an empty header.
>> As this header was here to use only specific features (not generic), I
>> removed it and put the include guards only for the boards needed.
>>
>> Can't we add these boards to the board_f.c?
>>
> I don't mind to change the guard for asm/mp.h. But you shouldn't remove the
> guard for the function call. Not all powerpc SoCs support SMP. You could use
>
> +#if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
> +#include <asm/mp.h>
> +#endif
>
> York
>

Oh! I see what you mean, my bad, sorry.
I'll propose the fix as soon as possible to revert the modification on 
the include guard and modify the one for the asm/mp.h

Regards,
Gabriel

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

end of thread, other threads:[~2014-09-03 18:45 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-21 18:29 [U-Boot] [PATCH] mx6: add support of multi-processor command Gabriel Huau
2014-06-21 21:36 ` Fabio Estevam
2014-06-21 23:55 ` [U-Boot] [PATCH v2] " Gabriel Huau
2014-06-22  9:14   ` Jeroen Hofstee
2014-06-22 16:56     ` gabriel huau
2014-06-22 16:56 ` [U-Boot] [PATCH v3] " Gabriel Huau
2014-06-24 12:50   ` Stefano Babic
2014-06-25  0:22     ` gabriel huau
2014-06-25  2:32 ` [U-Boot] [PATCH v4] " Gabriel Huau
2014-07-08  9:18   ` Stefano Babic
2014-07-12 22:31 ` [U-Boot] [PATCH v5] " Gabriel Huau
2014-07-13  9:58   ` Wolfgang Denk
2014-07-13 23:16     ` gabriel huau
2014-07-15  7:49   ` Stefano Babic
2014-07-15 14:13     ` gabriel huau
2014-07-15 19:35       ` Stefano Babic
2014-07-15 19:59         ` Gabriel Huau
2014-07-26 18:35 ` [U-Boot] [PATCH v6] " Gabriel Huau
2014-07-28 15:15   ` Stefano Babic
2014-09-03 18:00     ` York Sun
2014-09-03 18:26       ` Gabriel Huau
2014-09-03 18:36         ` York Sun
2014-09-03 18:45           ` Gabriel Huau

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.