* [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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ messages in thread
* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
[not found] <mailman.1.1403431201.10945.u-boot@lists.denx.de>
@ 2014-06-22 14:09 ` Nikolay Dimitrov
2014-06-22 14:24 ` gabriel huau
2014-07-08 11:24 ` Pavel Machek
0 siblings, 2 replies; 27+ messages in thread
From: Nikolay Dimitrov @ 2014-06-22 14:09 UTC (permalink / raw)
To: u-boot
Hi Gabriel,
> 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.
I think this explanation is a little misleading - if you run unmodified
versions of Android & some RTOS, they will fight for the imx6 interrupt
controller, power management and clocks. As far as I know, imx6 is not
appropriate for AMP (asymmetric multi-processing) because it doesn't
support virtualization extensions.
Kind regards,
Nikolay
^ permalink raw reply [flat|nested] 27+ messages in thread
* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
2014-06-22 14:09 ` [U-Boot] [PATCH v2] " Nikolay Dimitrov
@ 2014-06-22 14:24 ` gabriel huau
2014-06-22 15:41 ` Nikolay Dimitrov
2014-07-08 11:24 ` Pavel Machek
1 sibling, 1 reply; 27+ messages in thread
From: gabriel huau @ 2014-06-22 14:24 UTC (permalink / raw)
To: u-boot
Hi Nikolay,
I agree that you have to modify those OS to support 'multi-OS' on
different core but this customization is not part of u-boot in my sense.
For the second point, I have to disagree, the imx6 is totally
appropriate for AMP/multi-OS, in my case, I wasn't thinking about
virtualization which is something different but really about
multi-OS/Bare Metal application. The interrupt controller (GIC) can be
configured to distribute any interrupt on any core, for example, you can
have UART1 interrupt on core0 and UART2 interrupt on core1.
The only problem is the resource partitioning but as I said this is
another subject which is not really part of u-boot and I already did
some test by running Android on core0 and QNX on core1 without any
problem as a proof of concept.
A good example may be the support on this kind of application on the
Zynq: http://www.wiki.xilinx.com/Multi-OS+Support+%28AMP+%26+Hypervisor%29
This is also a Cortex A9 without the support of virtualization extensions.
Regards,
Gabriel
On 06/22/2014 07:09 AM, Nikolay Dimitrov wrote:
> Hi Gabriel,
>
>> 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.
>
> I think this explanation is a little misleading - if you run
> unmodified versions of Android & some RTOS, they will fight for the
> imx6 interrupt controller, power management and clocks. As far as I
> know, imx6 is not appropriate for AMP (asymmetric multi-processing)
> because it doesn't support virtualization extensions.
>
> Kind regards,
> Nikolay
^ permalink raw reply [flat|nested] 27+ messages in thread
* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
2014-06-22 14:24 ` gabriel huau
@ 2014-06-22 15:41 ` Nikolay Dimitrov
0 siblings, 0 replies; 27+ messages in thread
From: Nikolay Dimitrov @ 2014-06-22 15:41 UTC (permalink / raw)
To: u-boot
Hi Gabriel,
On 6/22/2014 5:24 PM, gabriel huau wrote:
> Hi Nikolay,
>
> I agree that you have to modify those OS to support 'multi-OS' on
> different core but this customization is not part of u-boot in my
> sense. For the second point, I have to disagree, the imx6 is totally
> appropriate for AMP/multi-OS, in my case, I wasn't thinking about
> virtualization which is something different but really about
> multi-OS/Bare Metal application. The interrupt controller (GIC) can be
> configured to distribute any interrupt on any core, for example, you
> can have UART1 interrupt on core0 and UART2 interrupt on core1.
> The only problem is the resource partitioning but as I said this is
> another subject which is not really part of u-boot and I already did
> some test by running Android on core0 and QNX on core1 without any
> problem as a proof of concept.
>
> A good example may be the support on this kind of application on the
> Zynq:
> http://www.wiki.xilinx.com/Multi-OS+Support+%28AMP+%26+Hypervisor%29
> This is also a Cortex A9 without the support of virtualization
> extensions.
Thanks for sharing this info, I'll check it out. I come from the
automotive industry where no one will allow running 2 OSes without
hardware isolation, so this is how my opinion about AMP on imx6 was
formed. And I agree that this actually isn't related with U-Boot itself
other than just loading the payload and starting the extra cores.
Kind regards,
Nikolay
^ permalink raw reply [flat|nested] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ messages in thread
* [U-Boot] [PATCH v2] mx6: add support of multi-processor command
2014-06-22 14:09 ` [U-Boot] [PATCH v2] " Nikolay Dimitrov
2014-06-22 14:24 ` gabriel huau
@ 2014-07-08 11:24 ` Pavel Machek
1 sibling, 0 replies; 27+ messages in thread
From: Pavel Machek @ 2014-07-08 11:24 UTC (permalink / raw)
To: u-boot
On Sun 2014-06-22 17:09:28, Nikolay Dimitrov wrote:
> Hi Gabriel,
>
> >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.
>
> I think this explanation is a little misleading - if you run
> unmodified versions of Android & some RTOS, they will fight for the
> imx6 interrupt controller, power management and clocks. As far as I
> know, imx6 is not appropriate for AMP (asymmetric multi-processing)
> because it doesn't support virtualization extensions.
I did AMP configuration on socfpga (similar to i.mx6 in this
regard). Yes, Linux needs to be modified for this to work... but it
seems mostly unmodified u-boot can be used.
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
^ permalink raw reply [flat|nested] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ 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; 27+ 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] 27+ messages in thread
end of thread, other threads:[~2014-09-03 18:45 UTC | newest]
Thread overview: 27+ 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
[not found] <mailman.1.1403431201.10945.u-boot@lists.denx.de>
2014-06-22 14:09 ` [U-Boot] [PATCH v2] " Nikolay Dimitrov
2014-06-22 14:24 ` gabriel huau
2014-06-22 15:41 ` Nikolay Dimitrov
2014-07-08 11:24 ` Pavel Machek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox