* [RFC 0/1] mach-k3: Rework spl/get_boot_device()
@ 2025-08-13 10:29 Wadim Egorov
2025-08-13 10:29 ` [RFC 1/1] arm: " Wadim Egorov
0 siblings, 1 reply; 3+ messages in thread
From: Wadim Egorov @ 2025-08-13 10:29 UTC (permalink / raw)
To: trini, afd, n-francis, s-k6; +Cc: u-boot, upstream
This is an attempt to commonize some of the spl/get_boot_device() code.
I am interested in factoring out more of the spl_boot_device() code out
of the <soc>_init.c files to make it also available for non SPLs.
While at it, I came up with this change to improve the current situation
and provide a basis for further cleanup.
Before refactoring any other SoCs to follow this approach, I would like to
gather feedback on the concept. Is this a direction we want to go?
The idea is based on commit 784548efb2b7 ("ARM: uniphier: rework
spl_boot_device() and related code").
Wadim Egorov (1):
arm: mach-k3: Rework spl/get_boot_device()
arch/arm/mach-k3/Makefile | 2 +-
arch/arm/mach-k3/am62x/boot.c | 129 +++++-------------
arch/arm/mach-k3/boot-device.c | 109 +++++++++++++++
arch/arm/mach-k3/boot-device.h | 27 ++++
arch/arm/mach-k3/include/mach/am62_hardware.h | 1 +
5 files changed, 169 insertions(+), 99 deletions(-)
create mode 100644 arch/arm/mach-k3/boot-device.c
create mode 100644 arch/arm/mach-k3/boot-device.h
--
2.48.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [RFC 1/1] arm: mach-k3: Rework spl/get_boot_device()
2025-08-13 10:29 [RFC 0/1] mach-k3: Rework spl/get_boot_device() Wadim Egorov
@ 2025-08-13 10:29 ` Wadim Egorov
2025-09-10 11:32 ` Anshul Dalal
0 siblings, 1 reply; 3+ messages in thread
From: Wadim Egorov @ 2025-08-13 10:29 UTC (permalink / raw)
To: trini, afd, n-francis, s-k6; +Cc: u-boot, upstream
The current implementation requires every K3 SoC to provide its own
get_boot_device()/get_*_bootmedia() functions which look very identical.
Rework it using table lookups for SoC data and reduce code duplication.
Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
---
arch/arm/mach-k3/Makefile | 2 +-
arch/arm/mach-k3/am62x/boot.c | 129 +++++-------------
arch/arm/mach-k3/boot-device.c | 109 +++++++++++++++
arch/arm/mach-k3/boot-device.h | 27 ++++
arch/arm/mach-k3/include/mach/am62_hardware.h | 1 +
5 files changed, 169 insertions(+), 99 deletions(-)
create mode 100644 arch/arm/mach-k3/boot-device.c
create mode 100644 arch/arm/mach-k3/boot-device.h
diff --git a/arch/arm/mach-k3/Makefile b/arch/arm/mach-k3/Makefile
index b2fd5810b67..7dc77328e5c 100644
--- a/arch/arm/mach-k3/Makefile
+++ b/arch/arm/mach-k3/Makefile
@@ -6,7 +6,7 @@
obj-$(CONFIG_ARM64) += arm64/
obj-$(CONFIG_CPU_V7R) += r5/
obj-$(CONFIG_OF_LIBFDT) += common_fdt.o
-obj-y += common.o security.o k3-ddr.o
+obj-y += common.o security.o k3-ddr.o boot-device.o
obj-$(CONFIG_SOC_K3_AM62A7) += am62ax/
obj-$(CONFIG_SOC_K3_AM62P5) += am62px/
obj-$(CONFIG_SOC_K3_AM625) += am62x/
diff --git a/arch/arm/mach-k3/am62x/boot.c b/arch/arm/mach-k3/am62x/boot.c
index a3a6cda6bdb..6d458f546a6 100644
--- a/arch/arm/mach-k3/am62x/boot.c
+++ b/arch/arm/mach-k3/am62x/boot.c
@@ -3,104 +3,7 @@
#include <asm/arch/hardware.h>
#include <asm/arch/am62_spl.h>
-static u32 __get_backup_bootmedia(u32 devstat)
-{
- u32 bkup_bootmode = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_MASK) >>
- MAIN_DEVSTAT_BACKUP_BOOTMODE_SHIFT;
- u32 bkup_bootmode_cfg =
- (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK) >>
- MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT;
-
- switch (bkup_bootmode) {
- case BACKUP_BOOT_DEVICE_UART:
- return BOOT_DEVICE_UART;
-
- case BACKUP_BOOT_DEVICE_USB:
- return BOOT_DEVICE_USB;
-
- case BACKUP_BOOT_DEVICE_ETHERNET:
- return BOOT_DEVICE_ETHERNET;
-
- case BACKUP_BOOT_DEVICE_MMC:
- if (bkup_bootmode_cfg)
- return BOOT_DEVICE_MMC2;
- return BOOT_DEVICE_MMC1;
-
- case BACKUP_BOOT_DEVICE_SPI:
- return BOOT_DEVICE_SPI;
-
- case BACKUP_BOOT_DEVICE_I2C:
- return BOOT_DEVICE_I2C;
-
- case BACKUP_BOOT_DEVICE_DFU:
- if (bkup_bootmode_cfg & MAIN_DEVSTAT_BACKUP_USB_MODE_MASK)
- return BOOT_DEVICE_USB;
- return BOOT_DEVICE_DFU;
- };
-
- return BOOT_DEVICE_RAM;
-}
-
-static u32 __get_primary_bootmedia(u32 devstat)
-{
- u32 bootmode = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
- MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
- u32 bootmode_cfg = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_MASK) >>
- MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_SHIFT;
-
- switch (bootmode) {
- case BOOT_DEVICE_OSPI:
- fallthrough;
- case BOOT_DEVICE_QSPI:
- fallthrough;
- case BOOT_DEVICE_XSPI:
- fallthrough;
- case BOOT_DEVICE_SPI:
- return BOOT_DEVICE_SPI;
-
- case BOOT_DEVICE_ETHERNET_RGMII:
- fallthrough;
- case BOOT_DEVICE_ETHERNET_RMII:
- return BOOT_DEVICE_ETHERNET;
-
- case BOOT_DEVICE_EMMC:
- return BOOT_DEVICE_MMC1;
-
- case BOOT_DEVICE_MMC:
- if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK) >>
- MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT)
- return BOOT_DEVICE_MMC2;
- return BOOT_DEVICE_MMC1;
-
- case BOOT_DEVICE_DFU:
- if ((bootmode_cfg & MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK) >>
- MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT)
- return BOOT_DEVICE_USB;
- return BOOT_DEVICE_DFU;
-
- case BOOT_DEVICE_NOBOOT:
- return BOOT_DEVICE_RAM;
- }
-
- return bootmode;
-}
-
-u32 get_boot_device(void)
-{
- u32 devstat = readl(CTRLMMR_MAIN_DEVSTAT);
- u32 bootmode = *(u32 *)(K3_BOOT_PARAM_TABLE_INDEX_OCRAM);
- u32 bootmedia;
-
- if (bootmode == K3_PRIMARY_BOOTMODE)
- bootmedia = __get_primary_bootmedia(devstat);
- else
- bootmedia = __get_backup_bootmedia(devstat);
-
- debug("%s: devstat = 0x%x bootmedia = 0x%x bootmode = %d\n",
- __func__, devstat, bootmedia, bootmode);
-
- return bootmedia;
-}
+#include "../boot-device.h"
const char *get_reset_reason(void)
{
@@ -141,3 +44,33 @@ const char *get_reset_reason(void)
return "UNKNOWN";
}
+
+struct k3_boot_map am62_boot_device_primary_table[] = {
+ { BOOT_DEVICE_OSPI, 0, 0, 0, BOOT_DEVICE_SPI },
+ { BOOT_DEVICE_QSPI, 0, 0, 0, BOOT_DEVICE_SPI },
+ { BOOT_DEVICE_XSPI, 0, 0, 0, BOOT_DEVICE_SPI },
+ { BOOT_DEVICE_SPI, 0, 0, 0, BOOT_DEVICE_SPI },
+ { BOOT_DEVICE_ETHERNET_RGMII, 0, 0, 0, BOOT_DEVICE_ETHERNET },
+ { BOOT_DEVICE_ETHERNET_RMII, 0, 0, 0, BOOT_DEVICE_ETHERNET },
+ { BOOT_DEVICE_EMMC, 0, 0, 0, BOOT_DEVICE_MMC1 },
+ { BOOT_DEVICE_MMC, MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK, MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT, 1, BOOT_DEVICE_MMC2 },
+ { BOOT_DEVICE_MMC, MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK, MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT, 0, BOOT_DEVICE_MMC1 },
+ { BOOT_DEVICE_DFU, MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK, MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT, 1, BOOT_DEVICE_USB },
+ { BOOT_DEVICE_DFU, MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK, MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT, 0, BOOT_DEVICE_DFU },
+ { BOOT_DEVICE_NOBOOT, 0, 0, 0, BOOT_DEVICE_RAM },
+};
+
+struct k3_boot_map am62_boot_device_backup_table[] = {
+ { BACKUP_BOOT_DEVICE_UART, 0, 0, 0, BOOT_DEVICE_UART },
+ { BACKUP_BOOT_DEVICE_USB, 0, 0, 0, BOOT_DEVICE_USB },
+ { BACKUP_BOOT_DEVICE_ETHERNET, 0, 0, 0, BOOT_DEVICE_ETHERNET },
+ { BACKUP_BOOT_DEVICE_MMC, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 0, BOOT_DEVICE_MMC1 },
+ { BACKUP_BOOT_DEVICE_MMC, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 1, BOOT_DEVICE_MMC2 },
+ { BACKUP_BOOT_DEVICE_SPI, 0, 0, 0, BOOT_DEVICE_SPI },
+ { BACKUP_BOOT_DEVICE_I2C, 0, 0, 0, BOOT_DEVICE_I2C },
+ { BACKUP_BOOT_DEVICE_DFU, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 0, BOOT_DEVICE_DFU },
+ { BACKUP_BOOT_DEVICE_DFU, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 1, BOOT_DEVICE_USB },
+};
+
+unsigned int am62_boot_device_primary_table_count = ARRAY_SIZE(am62_boot_device_primary_table);
+unsigned int am62_boot_device_backup_table_count = ARRAY_SIZE(am62_boot_device_backup_table);
diff --git a/arch/arm/mach-k3/boot-device.c b/arch/arm/mach-k3/boot-device.c
new file mode 100644
index 00000000000..9b4f0ae7aa6
--- /dev/null
+++ b/arch/arm/mach-k3/boot-device.c
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2025 PHYTEC Messtechnik GmbH
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ */
+
+#include "boot-device.h"
+
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/am62_spl.h>
+
+struct k3_boot_device_info {
+ struct k3_boot_map *boot_device_primary_table;
+ unsigned int *boot_device_primary_count;
+ struct k3_boot_map *boot_device_backup_table;
+ unsigned int *boot_device_backup_count;
+ void __iomem *main_devstat_reg;
+ void __iomem *wkup_devstat_reg;
+ void __iomem *bootmode_addr;
+};
+
+static const struct k3_boot_device_info k3_boot_device_info[] = {
+#if defined(CONFIG_SOC_K3_AM625)
+ {
+ .boot_device_primary_table = am62_boot_device_primary_table,
+ .boot_device_primary_count = &am62_boot_device_primary_table_count,
+ .boot_device_backup_table = am62_boot_device_backup_table,
+ .boot_device_backup_count = &am62_boot_device_backup_table_count,
+ .main_devstat_reg = (void __iomem *)CTRLMMR_MAIN_DEVSTAT,
+ .wkup_devstat_reg = 0,
+ .bootmode_addr = (void __iomem *)K3_BOOT_PARAM_TABLE_INDEX_OCRAM,
+ },
+#endif
+};
+
+static u32 __get_backup_bootmedia(u32 devstat)
+{
+ u32 bkup_bootmode = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_MASK) >>
+ MAIN_DEVSTAT_BACKUP_BOOTMODE_SHIFT;
+ u32 bkup_bootmode_cfg = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK) >>
+ MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT;
+
+ const struct k3_boot_device_info *info = &k3_boot_device_info[0];
+ unsigned int i;
+
+ for (i = 0; i < *info->boot_device_backup_count; i++) {
+ struct k3_boot_map *m = &info->boot_device_backup_table[i];
+
+ if (bkup_bootmode != m->mode)
+ continue;
+
+ if (m->cfg_mask == 0)
+ return m->result;
+
+ if (((bkup_bootmode_cfg & m->cfg_mask) >> m->cfg_shift) == m->cfg_value)
+ return m->result;
+ }
+
+ return BOOT_DEVICE_RAM;
+}
+
+static u32 __get_primary_bootmedia(u32 devstat)
+{
+ u32 bootmode = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
+ MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
+ u32 bootmode_cfg = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_MASK) >>
+ MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_SHIFT;
+ const struct k3_boot_device_info *info = &k3_boot_device_info[0];
+ unsigned int i;
+
+ for (i = 0; i < *info->boot_device_primary_count; i++) {
+ struct k3_boot_map *m = &info->boot_device_primary_table[i];
+
+ if (bootmode != m->mode)
+ continue;
+
+ if (m->cfg_mask == 0)
+ return m->result;
+
+ if (((bootmode_cfg & m->cfg_mask) >> m->cfg_shift) == m->cfg_value)
+ return m->result;
+ }
+
+ return bootmode;
+}
+
+u32 get_boot_device(void)
+{
+ const struct k3_boot_device_info *info = &k3_boot_device_info[0];
+ u32 bootmode = readl(info->bootmode_addr);
+ u32 main_devstat = readl(info->main_devstat_reg);
+ u32 bootmedia;
+
+ if (!ARRAY_SIZE(k3_boot_device_info)) {
+ pr_err("%s: no boot-device info for this SoC\n", __func__);
+ return BOOT_DEVICE_NOBOOT;
+ }
+
+ if (bootmode == K3_PRIMARY_BOOTMODE)
+ bootmedia = __get_primary_bootmedia(main_devstat);
+ else
+ bootmedia = __get_backup_bootmedia(main_devstat);
+
+ debug("%s: devstat = 0x%x bootmedia = 0x%x bootmode = %d\n",
+ __func__, main_devstat, bootmedia, bootmode);
+
+ return bootmedia;
+}
diff --git a/arch/arm/mach-k3/boot-device.h b/arch/arm/mach-k3/boot-device.h
new file mode 100644
index 00000000000..351f710151b
--- /dev/null
+++ b/arch/arm/mach-k3/boot-device.h
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2025 PHYTEC Messtechnik GmbH
+ * Author: Wadim Egorov <w.egorov@phytec.de>
+ */
+
+#ifndef _K3_BOOT_DEVICE_H
+#define _K3_BOOT_DEVICE_H
+
+#include <linux/types.h>
+
+/* Descriptor for mode + optional cfg test -> normalized device */
+struct k3_boot_map {
+ u32 mode; /* Raw PRIMARY_BOOTMODE value */
+ u32 cfg_mask; /* Bits in devstat-cfg to test (0 if none) */
+ u32 cfg_shift; /* Shift right before comparing */
+ u32 cfg_value; /* Desired value after mask+shift */
+ u32 result; /* Normalized device to return */
+};
+
+extern struct k3_boot_map am62_boot_device_primary_table[];
+extern unsigned int am62_boot_device_primary_table_count;
+
+extern struct k3_boot_map am62_boot_device_backup_table[];
+extern unsigned int am62_boot_device_backup_table_count;
+
+#endif /* _K3_BOOT_DEVICE_H */
diff --git a/arch/arm/mach-k3/include/mach/am62_hardware.h b/arch/arm/mach-k3/include/mach/am62_hardware.h
index 2f5655bf24a..084f16bf2d2 100644
--- a/arch/arm/mach-k3/include/mach/am62_hardware.h
+++ b/arch/arm/mach-k3/include/mach/am62_hardware.h
@@ -10,6 +10,7 @@
#define __ASM_ARCH_AM62_HARDWARE_H
#include <config.h>
+#include <asm/io.h>
#ifndef __ASSEMBLY__
#include <linux/bitops.h>
#endif
--
2.48.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [RFC 1/1] arm: mach-k3: Rework spl/get_boot_device()
2025-08-13 10:29 ` [RFC 1/1] arm: " Wadim Egorov
@ 2025-09-10 11:32 ` Anshul Dalal
0 siblings, 0 replies; 3+ messages in thread
From: Anshul Dalal @ 2025-09-10 11:32 UTC (permalink / raw)
To: Wadim Egorov, trini, afd, n-francis, s-k6; +Cc: u-boot, upstream
Hello Wadim,
The direction of your patch looks good to me, thanks for taking the time
to refactor!
A few comments below:
On Wed Aug 13, 2025 at 3:59 PM IST, Wadim Egorov wrote:
> The current implementation requires every K3 SoC to provide its own
> get_boot_device()/get_*_bootmedia() functions which look very identical.
> Rework it using table lookups for SoC data and reduce code duplication.
>
> Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
> ---
> arch/arm/mach-k3/Makefile | 2 +-
> arch/arm/mach-k3/am62x/boot.c | 129 +++++-------------
> arch/arm/mach-k3/boot-device.c | 109 +++++++++++++++
> arch/arm/mach-k3/boot-device.h | 27 ++++
> arch/arm/mach-k3/include/mach/am62_hardware.h | 1 +
> 5 files changed, 169 insertions(+), 99 deletions(-)
> create mode 100644 arch/arm/mach-k3/boot-device.c
> create mode 100644 arch/arm/mach-k3/boot-device.h
>
> diff --git a/arch/arm/mach-k3/Makefile b/arch/arm/mach-k3/Makefile
> index b2fd5810b67..7dc77328e5c 100644
> --- a/arch/arm/mach-k3/Makefile
> +++ b/arch/arm/mach-k3/Makefile
> @@ -6,7 +6,7 @@
> obj-$(CONFIG_ARM64) += arm64/
> obj-$(CONFIG_CPU_V7R) += r5/
> obj-$(CONFIG_OF_LIBFDT) += common_fdt.o
> -obj-y += common.o security.o k3-ddr.o
> +obj-y += common.o security.o k3-ddr.o boot-device.o
> obj-$(CONFIG_SOC_K3_AM62A7) += am62ax/
> obj-$(CONFIG_SOC_K3_AM62P5) += am62px/
> obj-$(CONFIG_SOC_K3_AM625) += am62x/
> diff --git a/arch/arm/mach-k3/am62x/boot.c b/arch/arm/mach-k3/am62x/boot.c
> index a3a6cda6bdb..6d458f546a6 100644
> --- a/arch/arm/mach-k3/am62x/boot.c
> +++ b/arch/arm/mach-k3/am62x/boot.c
[snip]
> @@ -141,3 +44,33 @@ const char *get_reset_reason(void)
>
> return "UNKNOWN";
> }
> +
> +struct k3_boot_map am62_boot_device_primary_table[] = {
> + { BOOT_DEVICE_OSPI, 0, 0, 0, BOOT_DEVICE_SPI },
> + { BOOT_DEVICE_QSPI, 0, 0, 0, BOOT_DEVICE_SPI },
> + { BOOT_DEVICE_XSPI, 0, 0, 0, BOOT_DEVICE_SPI },
> + { BOOT_DEVICE_SPI, 0, 0, 0, BOOT_DEVICE_SPI },
> + { BOOT_DEVICE_ETHERNET_RGMII, 0, 0, 0, BOOT_DEVICE_ETHERNET },
> + { BOOT_DEVICE_ETHERNET_RMII, 0, 0, 0, BOOT_DEVICE_ETHERNET },
> + { BOOT_DEVICE_EMMC, 0, 0, 0, BOOT_DEVICE_MMC1 },
> + { BOOT_DEVICE_MMC, MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK, MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT, 1, BOOT_DEVICE_MMC2 },
> + { BOOT_DEVICE_MMC, MAIN_DEVSTAT_PRIMARY_MMC_PORT_MASK, MAIN_DEVSTAT_PRIMARY_MMC_PORT_SHIFT, 0, BOOT_DEVICE_MMC1 },
> + { BOOT_DEVICE_DFU, MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK, MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT, 1, BOOT_DEVICE_USB },
> + { BOOT_DEVICE_DFU, MAIN_DEVSTAT_PRIMARY_USB_MODE_MASK, MAIN_DEVSTAT_PRIMARY_USB_MODE_SHIFT, 0, BOOT_DEVICE_DFU },
> + { BOOT_DEVICE_NOBOOT, 0, 0, 0, BOOT_DEVICE_RAM },
> +};
> +
> +struct k3_boot_map am62_boot_device_backup_table[] = {
> + { BACKUP_BOOT_DEVICE_UART, 0, 0, 0, BOOT_DEVICE_UART },
> + { BACKUP_BOOT_DEVICE_USB, 0, 0, 0, BOOT_DEVICE_USB },
> + { BACKUP_BOOT_DEVICE_ETHERNET, 0, 0, 0, BOOT_DEVICE_ETHERNET },
> + { BACKUP_BOOT_DEVICE_MMC, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 0, BOOT_DEVICE_MMC1 },
> + { BACKUP_BOOT_DEVICE_MMC, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 1, BOOT_DEVICE_MMC2 },
> + { BACKUP_BOOT_DEVICE_SPI, 0, 0, 0, BOOT_DEVICE_SPI },
> + { BACKUP_BOOT_DEVICE_I2C, 0, 0, 0, BOOT_DEVICE_I2C },
> + { BACKUP_BOOT_DEVICE_DFU, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 0, BOOT_DEVICE_DFU },
> + { BACKUP_BOOT_DEVICE_DFU, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK, MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT, 1, BOOT_DEVICE_USB },
> +};
> +
> +unsigned int am62_boot_device_primary_table_count = ARRAY_SIZE(am62_boot_device_primary_table);
> +unsigned int am62_boot_device_backup_table_count = ARRAY_SIZE(am62_boot_device_backup_table);
It might be better to have boot-device.h export an extern that the
boards can set. Something like this:
boot-device.h:
extern struct k3_boot_device_info *info;
am62x/boot.c:
static const struct k3_boot_device_info am62_map = {
.boot_device_primary_table = am62_boot_device_primary_table,
.boot_device_primary_count = ARRAY_SIZE(am62_boot_device_primary_table),
.boot_device_backup_table = am62_boot_device_backup_table,
.boot_device_backup_count = ARRAY_SIZE(am62_boot_device_backup_table),
.main_devstat_reg = (void __iomem *)CTRLMMR_MAIN_DEVSTAT,
.wkup_devstat_reg = 0,
.bootmode_addr = (void __iomem *)K3_BOOT_PARAM_TABLE_INDEX_OCRAM,
};
struct k3_boot_device_info *info = &am62_map;
This would allow you to remove the SOC specifics ifdefs from
boot-device.c below.
> diff --git a/arch/arm/mach-k3/boot-device.c b/arch/arm/mach-k3/boot-device.c
> new file mode 100644
> index 00000000000..9b4f0ae7aa6
> --- /dev/null
> +++ b/arch/arm/mach-k3/boot-device.c
> @@ -0,0 +1,109 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2025 PHYTEC Messtechnik GmbH
> + * Author: Wadim Egorov <w.egorov@phytec.de>
> + */
> +
> +#include "boot-device.h"
> +
> +#include <asm/io.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/am62_spl.h>
> +
> +struct k3_boot_device_info {
> + struct k3_boot_map *boot_device_primary_table;
> + unsigned int *boot_device_primary_count;
> + struct k3_boot_map *boot_device_backup_table;
> + unsigned int *boot_device_backup_count;
> + void __iomem *main_devstat_reg;
> + void __iomem *wkup_devstat_reg;
> + void __iomem *bootmode_addr;
> +};
> +
> +static const struct k3_boot_device_info k3_boot_device_info[] = {
> +#if defined(CONFIG_SOC_K3_AM625)
> + {
> + .boot_device_primary_table = am62_boot_device_primary_table,
> + .boot_device_primary_count = &am62_boot_device_primary_table_count,
> + .boot_device_backup_table = am62_boot_device_backup_table,
> + .boot_device_backup_count = &am62_boot_device_backup_table_count,
> + .main_devstat_reg = (void __iomem *)CTRLMMR_MAIN_DEVSTAT,
> + .wkup_devstat_reg = 0,
> + .bootmode_addr = (void __iomem *)K3_BOOT_PARAM_TABLE_INDEX_OCRAM,
> + },
> +#endif
> +};
Why use an array here? We are only making use of the first entry
anyways.
> +
> +static u32 __get_backup_bootmedia(u32 devstat)
> +{
> + u32 bkup_bootmode = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_MASK) >>
> + MAIN_DEVSTAT_BACKUP_BOOTMODE_SHIFT;
> + u32 bkup_bootmode_cfg = (devstat & MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_MASK) >>
> + MAIN_DEVSTAT_BACKUP_BOOTMODE_CFG_SHIFT;
> +
> + const struct k3_boot_device_info *info = &k3_boot_device_info[0];
> + unsigned int i;
> +
> + for (i = 0; i < *info->boot_device_backup_count; i++) {
> + struct k3_boot_map *m = &info->boot_device_backup_table[i];
> +
> + if (bkup_bootmode != m->mode)
> + continue;
> +
> + if (m->cfg_mask == 0)
> + return m->result;
> +
> + if (((bkup_bootmode_cfg & m->cfg_mask) >> m->cfg_shift) == m->cfg_value)
> + return m->result;
> + }
> +
> + return BOOT_DEVICE_RAM;
> +}
> +
> +static u32 __get_primary_bootmedia(u32 devstat)
> +{
> + u32 bootmode = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_MASK) >>
> + MAIN_DEVSTAT_PRIMARY_BOOTMODE_SHIFT;
> + u32 bootmode_cfg = (devstat & MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_MASK) >>
> + MAIN_DEVSTAT_PRIMARY_BOOTMODE_CFG_SHIFT;
> + const struct k3_boot_device_info *info = &k3_boot_device_info[0];
> + unsigned int i;
> +
> + for (i = 0; i < *info->boot_device_primary_count; i++) {
> + struct k3_boot_map *m = &info->boot_device_primary_table[i];
> +
> + if (bootmode != m->mode)
> + continue;
> +
> + if (m->cfg_mask == 0)
> + return m->result;
> +
> + if (((bootmode_cfg & m->cfg_mask) >> m->cfg_shift) == m->cfg_value)
> + return m->result;
> + }
> +
> + return bootmode;
> +}
> +
> +u32 get_boot_device(void)
> +{
This might be better kept as a weak function.
> + const struct k3_boot_device_info *info = &k3_boot_device_info[0];
> + u32 bootmode = readl(info->bootmode_addr);
> + u32 main_devstat = readl(info->main_devstat_reg);
> + u32 bootmedia;
> +
> + if (!ARRAY_SIZE(k3_boot_device_info)) {
> + pr_err("%s: no boot-device info for this SoC\n", __func__);
> + return BOOT_DEVICE_NOBOOT;
> + }
> +
> + if (bootmode == K3_PRIMARY_BOOTMODE)
> + bootmedia = __get_primary_bootmedia(main_devstat);
> + else
> + bootmedia = __get_backup_bootmedia(main_devstat);
> +
> + debug("%s: devstat = 0x%x bootmedia = 0x%x bootmode = %d\n",
> + __func__, main_devstat, bootmedia, bootmode);
> +
> + return bootmedia;
> +}
> diff --git a/arch/arm/mach-k3/boot-device.h b/arch/arm/mach-k3/boot-device.h
> new file mode 100644
> index 00000000000..351f710151b
> --- /dev/null
> +++ b/arch/arm/mach-k3/boot-device.h
> @@ -0,0 +1,27 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2025 PHYTEC Messtechnik GmbH
> + * Author: Wadim Egorov <w.egorov@phytec.de>
> + */
> +
> +#ifndef _K3_BOOT_DEVICE_H
> +#define _K3_BOOT_DEVICE_H
> +
> +#include <linux/types.h>
> +
> +/* Descriptor for mode + optional cfg test -> normalized device */
> +struct k3_boot_map {
> + u32 mode; /* Raw PRIMARY_BOOTMODE value */
> + u32 cfg_mask; /* Bits in devstat-cfg to test (0 if none) */
> + u32 cfg_shift; /* Shift right before comparing */
> + u32 cfg_value; /* Desired value after mask+shift */
> + u32 result; /* Normalized device to return */
> +};
> +
> +extern struct k3_boot_map am62_boot_device_primary_table[];
> +extern unsigned int am62_boot_device_primary_table_count;
> +
> +extern struct k3_boot_map am62_boot_device_backup_table[];
> +extern unsigned int am62_boot_device_backup_table_count;
> +
You wouldn't need these 4 externs per SoC too with the above suggestion.
Regards,
Anshul
> +#endif /* _K3_BOOT_DEVICE_H */
> diff --git a/arch/arm/mach-k3/include/mach/am62_hardware.h b/arch/arm/mach-k3/include/mach/am62_hardware.h
> index 2f5655bf24a..084f16bf2d2 100644
> --- a/arch/arm/mach-k3/include/mach/am62_hardware.h
> +++ b/arch/arm/mach-k3/include/mach/am62_hardware.h
> @@ -10,6 +10,7 @@
> #define __ASM_ARCH_AM62_HARDWARE_H
>
> #include <config.h>
> +#include <asm/io.h>
> #ifndef __ASSEMBLY__
> #include <linux/bitops.h>
> #endif
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-09-10 11:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-13 10:29 [RFC 0/1] mach-k3: Rework spl/get_boot_device() Wadim Egorov
2025-08-13 10:29 ` [RFC 1/1] arm: " Wadim Egorov
2025-09-10 11:32 ` Anshul Dalal
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.