From d469690b838c2fca627e5b871a73f04775b81851 Mon Sep 17 00:00:00 2001 From: Jan Hoffmann Date: Sat, 2 Aug 2025 20:28:50 +0200 Subject: [PATCH] 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 Link: https://github.com/openwrt/openwrt/pull/19653 Signed-off-by: Robert Marko --- .../include/asm/mach-rtl838x/mach-rtl83xx.h | 6 +- .../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()); /* -- 2.30.2