[openwrt/openwrt] realtek: simplify SoC detection
LEDE Commits
lede-commits at lists.infradead.org
Wed Aug 6 04:41:57 PDT 2025
robimarko pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/d469690b838c2fca627e5b871a73f04775b81851
commit d469690b838c2fca627e5b871a73f04775b81851
Author: Jan Hoffmann <jan at 3e8.eu>
AuthorDate: Sat Aug 2 20:28:50 2025 +0200
realtek: simplify SoC detection
Read model name from the register instead of using hard-coded values.
Also remove detection of the unsupported Realtek ESW/SSW SoCs. The Fast
Ethernet variants of the Maple and Cypress series stay for now, but are
moved to the RTL8380/RTL8390 families.
Signed-off-by: Jan Hoffmann <jan at 3e8.eu>
Link: https://github.com/openwrt/openwrt/pull/19653
Signed-off-by: Robert Marko <robimarko at gmail.com>
---
.../mips/include/asm/mach-rtl838x/mach-rtl83xx.h | 6 +-
.../realtek/files-6.12/arch/mips/rtl838x/prom.c | 160 +++++++--------------
2 files changed, 55 insertions(+), 111 deletions(-)
diff --git a/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h b/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
index 8ea580f3d1..d53414fec7 100644
--- a/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
+++ b/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
@@ -373,12 +373,8 @@
#define RTL931X_ISR_PORT_LINK_STS_CHG (0x12B8)
/* Definition of family IDs */
-#define RTL8389_FAMILY_ID (0x8389)
-#define RTL8328_FAMILY_ID (0x8328)
-#define RTL8390_FAMILY_ID (0x8390)
-#define RTL8350_FAMILY_ID (0x8350)
#define RTL8380_FAMILY_ID (0x8380)
-#define RTL8330_FAMILY_ID (0x8330)
+#define RTL8390_FAMILY_ID (0x8390)
#define RTL9300_FAMILY_ID (0x9300)
#define RTL9310_FAMILY_ID (0x9310)
diff --git a/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c b/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c
index 68b4e5c144..32e7a064fe 100644
--- a/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c
+++ b/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c
@@ -20,6 +20,9 @@
struct rtl83xx_soc_info soc_info;
const void *fdt;
+static char soc_name[16];
+static char rtl83xx_system_type[32];
+
#ifdef CONFIG_MIPS_MT_SMP
extern const struct plat_smp_ops vsmp_smp_ops;
@@ -96,125 +99,70 @@ void __init device_tree_init(void)
const char *get_system_type(void)
{
- return soc_info.name;
+ return rtl83xx_system_type;
}
-static void __init identify_rtl9302(void)
+static uint32_t __init read_model(void)
{
- switch (sw_r32(RTL93XX_MODEL_NAME_INFO) & 0xfffffff0) {
- case 0x93020810:
- soc_info.name = "RTL9302A 12x2.5G";
- break;
- case 0x93021010:
- soc_info.name = "RTL9302B 8x2.5G";
- break;
- case 0x93021810:
- soc_info.name = "RTL9302C 16x2.5G";
- break;
- case 0x93022010:
- soc_info.name = "RTL9302D 24x2.5G";
- break;
- case 0x93020800:
- soc_info.name = "RTL9302A";
- break;
- case 0x93021000:
- soc_info.name = "RTL9302B";
- break;
- case 0x93021800:
- soc_info.name = "RTL9302C";
- break;
- case 0x93022000:
- soc_info.name = "RTL9302D";
- break;
- case 0x93023001:
- soc_info.name = "RTL9302F";
- break;
- default:
- soc_info.name = "RTL9302";
- }
-}
-
-void __init prom_init(void)
-{
- uint32_t model;
+ uint32_t model, id;
model = sw_r32(RTL838X_MODEL_NAME_INFO);
- pr_info("RTL838X model is %x\n", model);
- model = model >> 16 & 0xFFFF;
-
- if ((model != 0x8328) && (model != 0x8330) && (model != 0x8332)
- && (model != 0x8380) && (model != 0x8382)) {
- model = sw_r32(RTL839X_MODEL_NAME_INFO);
- pr_info("RTL839X model is %x\n", model);
- model = model >> 16 & 0xFFFF;
+ id = model >> 16 & 0xffff;
+ if ((id >= 0x8380 && id <= 0x8382) || id == 0x8330 || id == 0x8332) {
+ soc_info.id = id;
+ soc_info.family = RTL8380_FAMILY_ID;
+ return model;
}
- if ((model & 0x8390) != 0x8380 && (model & 0x8390) != 0x8390) {
- model = sw_r32(RTL93XX_MODEL_NAME_INFO);
- pr_info("RTL93XX model is %x\n", model);
- model = model >> 16 & 0xFFFF;
+ model = sw_r32(RTL839X_MODEL_NAME_INFO);
+ id = model >> 16 & 0xffff;
+ if ((id >= 0x8391 && id <= 0x8396) || (id >= 0x8351 && id <= 0x8353)) {
+ soc_info.id = id;
+ soc_info.family = RTL8390_FAMILY_ID;
+ return model;
}
- soc_info.id = model;
-
- switch (model) {
- case 0x8328:
- soc_info.name = "RTL8328";
- soc_info.family = RTL8328_FAMILY_ID;
- break;
- case 0x8332:
- soc_info.name = "RTL8332";
- soc_info.family = RTL8380_FAMILY_ID;
- break;
- case 0x8380:
- soc_info.name = "RTL8380";
- soc_info.family = RTL8380_FAMILY_ID;
- break;
- case 0x8382:
- soc_info.name = "RTL8382";
- soc_info.family = RTL8380_FAMILY_ID;
- break;
- case 0x8390:
- soc_info.name = "RTL8390";
- soc_info.family = RTL8390_FAMILY_ID;
- break;
- case 0x8391:
- soc_info.name = "RTL8391";
- soc_info.family = RTL8390_FAMILY_ID;
- break;
- case 0x8392:
- soc_info.name = "RTL8392";
- soc_info.family = RTL8390_FAMILY_ID;
- break;
- case 0x8393:
- soc_info.name = "RTL8393";
- soc_info.family = RTL8390_FAMILY_ID;
- break;
- case 0x9301:
- soc_info.name = "RTL9301";
- soc_info.family = RTL9300_FAMILY_ID;
- break;
- case 0x9302:
- identify_rtl9302();
+ model = sw_r32(RTL93XX_MODEL_NAME_INFO);
+ id = model >> 16 & 0xffff;
+ if (id >= 0x9301 && id <= 0x9303) {
+ soc_info.id = id;
soc_info.family = RTL9300_FAMILY_ID;
- break;
- case 0x9303:
- soc_info.name = "RTL9303";
- soc_info.family = RTL9300_FAMILY_ID;
- break;
- case 0x9311:
- soc_info.name = "RTL9311";
- soc_info.family = RTL9310_FAMILY_ID;
- break;
- case 0x9313:
- soc_info.name = "RTL9313";
+ return model;
+ } else if (id >= 0x9311 && id <= 0x9313) {
+ soc_info.id = id;
soc_info.family = RTL9310_FAMILY_ID;
- break;
- default:
- soc_info.name = "DEFAULT";
- soc_info.family = 0;
+ return model;
}
+ return 0;
+}
+
+static void __init parse_model(uint32_t model)
+{
+ int val;
+ char suffix = 0;
+
+ val = (model >> 11) & 0x1f;
+ if (val > 0 && val <= 26)
+ suffix = 'A' + (val - 1);
+
+ snprintf(soc_name, sizeof(soc_name), "RTL%04X%c",
+ soc_info.id, suffix);
+
+ soc_info.name = soc_name;
+}
+
+static void __init rtl83xx_set_system_type(void) {
+ snprintf(rtl83xx_system_type, sizeof(rtl83xx_system_type),
+ "Realtek %s", soc_info.name);
+}
+
+void __init prom_init(void)
+{
+ uint32_t model = read_model();
+ parse_model(model);
+ rtl83xx_set_system_type();
+
pr_info("SoC Type: %s\n", get_system_type());
/*
More information about the lede-commits
mailing list