[PATCH 0/2] rockchip: rk35xx: Implement checkboard() to print SoC variant

Information about what SoC model, variant and version can be found in OTP. This series use this information in checkboard() to print out the running SoC model, variant and version.
There are some asumptions taken on how some of the OTP values are encoded, however for my boards this seem to match and something like the following is shown with this applied:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
SoC: RK3582 v1 SoC: RK3588 v0 SoC: RK3588 v1 SoC: RK3588S v0 SoC: RK3588S v1 SoC: RK3588S2 v1
Jonas Karlman (2): rockchip: rk356x: Implement checkboard() to print SoC variant rockchip: rk3588: Implement checkboard() to print SoC variant
arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/dts/rk3588s-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ arch/arm/mach-rockchip/rk3588/rk3588.c | 56 ++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +- configs/generic-rk3588_defconfig | 2 +- 6 files changed, 131 insertions(+), 2 deletions(-)

Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se --- arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/rk356x-u-boot.dtsi b/arch/arm/dts/rk356x-u-boot.dtsi index 0a0943b462a9..24a976cf7e21 100644 --- a/arch/arm/dts/rk356x-u-boot.dtsi +++ b/arch/arm/dts/rk356x-u-boot.dtsi @@ -87,6 +87,10 @@ bootph-all; };
+&otp { + bootph-some-ram; +}; + &pcfg_pull_none { bootph-all; }; diff --git a/arch/arm/mach-rockchip/rk3568/rk3568.c b/arch/arm/mach-rockchip/rk3568/rk3568.c index 768a37393290..fc4c140ab970 100644 --- a/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -4,6 +4,7 @@ */
#include <dm.h> +#include <misc.h> #include <asm/armv8/mmu.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/grf_rk3568.h> @@ -133,3 +134,67 @@ int arch_cpu_init(void) #endif return 0; } + +#define RK3568_OTP_CPU_CODE_OFFSET 0x02 +#define RK3568_OTP_SPECIFICATION_OFFSET 0x07 +#define RK3568_OTP_CPU_VERSION_OFFSET 0x08 +#define RK3568_OTP_PERFORMANCE_OFFSET 0x22 + +int checkboard(void) +{ + u8 cpu_code[2], specification, package, cpu_version, performance; + struct udevice *dev; + char suffix[3]; + int ret; + + ret = uclass_get_device_by_driver(UCLASS_MISC, + DM_DRIVER_GET(rockchip_otp), &dev); + if (ret) { + debug("%s: could not find otp device, ret=%d\n", __func__, ret); + return 0; + } + + /* cpu-code: SoC model, 0x35 0x66 or 0x35 0x68 */ + ret = misc_read(dev, RK3568_OTP_CPU_CODE_OFFSET, cpu_code, 2); + if (ret < 0) { + debug("%s: could not read cpu-code, ret=%d\n", __func__, ret); + return 0; + } + + /* specification: SoC variant, 0x2 for RK3568B2 and 0xA for RK3568J */ + ret = misc_read(dev, RK3568_OTP_SPECIFICATION_OFFSET, &specification, 1); + if (ret < 0) { + debug("%s: could not read specification, ret=%d\n", __func__, ret); + return 0; + } + /* package: likely SoC variant revision, 0x2 for RK3568B2 */ + package = specification >> 5; + specification &= 0x1f; + + /* cpu-version: chip version, e.g. second letter of lot number */ + ret = misc_read(dev, RK3568_OTP_CPU_VERSION_OFFSET, &cpu_version, 1); + if (ret < 0) { + debug("%s: could not read cpu-version, ret=%d\n", __func__, ret); + return 0; + } + cpu_version >>= 3; + cpu_version &= 0x7; + + /* performance: used to identify RK3566T SoC variant */ + ret = misc_read(dev, RK3568_OTP_PERFORMANCE_OFFSET, &performance, 1); + if (ret < 0) { + debug("%s: could not read performance, ret=%d\n", __func__, ret); + return 0; + } + if (performance & 0x0f) + specification = 0x14; /* T-variant */ + + suffix[0] = specification > 1 ? '@' + specification : 0; + suffix[1] = package > 1 ? '0' + package : 0; + suffix[2] = 0; + + printf("SoC: RK%02x%02x%s v%u\n", + cpu_code[0], cpu_code[1], suffix, cpu_version); + + return 0; +} diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig index 1d06f3411fe0..f79f0e84400b 100644 --- a/configs/generic-rk3568_defconfig +++ b/configs/generic-rk3568_defconfig @@ -22,7 +22,6 @@ CONFIG_SPL_LOAD_FIT=y CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3568-generic.dtb" # CONFIG_DISPLAY_CPUINFO is not set -CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set @@ -31,6 +30,7 @@ CONFIG_SYS_SPI_U_BOOT_OFFS=0x60000 CONFIG_SPL_ATF=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y +CONFIG_CMD_MISC=y CONFIG_CMD_MMC=y CONFIG_CMD_ROCKUSB=y CONFIG_CMD_USB_MASS_STORAGE=y

Hi Jonas,
On Fri, 18 Oct 2024 at 10:34, Jonas Karlman jonas@kwiboo.se wrote:
Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-)
Instead of this, can you use add a CPU driver? Then it should happen automatically - see print_cpuinfo().
diff --git a/arch/arm/dts/rk356x-u-boot.dtsi b/arch/arm/dts/rk356x-u-boot.dtsi index 0a0943b462a9..24a976cf7e21 100644 --- a/arch/arm/dts/rk356x-u-boot.dtsi +++ b/arch/arm/dts/rk356x-u-boot.dtsi @@ -87,6 +87,10 @@ bootph-all; };
+&otp {
bootph-some-ram;
+};
&pcfg_pull_none { bootph-all; }; diff --git a/arch/arm/mach-rockchip/rk3568/rk3568.c b/arch/arm/mach-rockchip/rk3568/rk3568.c index 768a37393290..fc4c140ab970 100644 --- a/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -4,6 +4,7 @@ */
#include <dm.h> +#include <misc.h> #include <asm/armv8/mmu.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/grf_rk3568.h> @@ -133,3 +134,67 @@ int arch_cpu_init(void) #endif return 0; }
+#define RK3568_OTP_CPU_CODE_OFFSET 0x02 +#define RK3568_OTP_SPECIFICATION_OFFSET 0x07 +#define RK3568_OTP_CPU_VERSION_OFFSET 0x08 +#define RK3568_OTP_PERFORMANCE_OFFSET 0x22
+int checkboard(void) +{
u8 cpu_code[2], specification, package, cpu_version, performance;
struct udevice *dev;
char suffix[3];
int ret;
ret = uclass_get_device_by_driver(UCLASS_MISC,
DM_DRIVER_GET(rockchip_otp), &dev);
if (ret) {
debug("%s: could not find otp device, ret=%d\n", __func__, ret);
return 0;
}
/* cpu-code: SoC model, 0x35 0x66 or 0x35 0x68 */
ret = misc_read(dev, RK3568_OTP_CPU_CODE_OFFSET, cpu_code, 2);
if (ret < 0) {
debug("%s: could not read cpu-code, ret=%d\n", __func__, ret);
return 0;
}
/* specification: SoC variant, 0x2 for RK3568B2 and 0xA for RK3568J */
ret = misc_read(dev, RK3568_OTP_SPECIFICATION_OFFSET, &specification, 1);
if (ret < 0) {
debug("%s: could not read specification, ret=%d\n", __func__, ret);
return 0;
}
/* package: likely SoC variant revision, 0x2 for RK3568B2 */
package = specification >> 5;
specification &= 0x1f;
/* cpu-version: chip version, e.g. second letter of lot number */
ret = misc_read(dev, RK3568_OTP_CPU_VERSION_OFFSET, &cpu_version, 1);
if (ret < 0) {
debug("%s: could not read cpu-version, ret=%d\n", __func__, ret);
return 0;
}
cpu_version >>= 3;
cpu_version &= 0x7;
/* performance: used to identify RK3566T SoC variant */
ret = misc_read(dev, RK3568_OTP_PERFORMANCE_OFFSET, &performance, 1);
if (ret < 0) {
debug("%s: could not read performance, ret=%d\n", __func__, ret);
return 0;
}
if (performance & 0x0f)
specification = 0x14; /* T-variant */
suffix[0] = specification > 1 ? '@' + specification : 0;
suffix[1] = package > 1 ? '0' + package : 0;
suffix[2] = 0;
printf("SoC: RK%02x%02x%s v%u\n",
cpu_code[0], cpu_code[1], suffix, cpu_version);
return 0;
+} diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig index 1d06f3411fe0..f79f0e84400b 100644 --- a/configs/generic-rk3568_defconfig +++ b/configs/generic-rk3568_defconfig @@ -22,7 +22,6 @@ CONFIG_SPL_LOAD_FIT=y CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3568-generic.dtb" # CONFIG_DISPLAY_CPUINFO is not set -CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set @@ -31,6 +30,7 @@ CONFIG_SYS_SPI_U_BOOT_OFFS=0x60000 CONFIG_SPL_ATF=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y +CONFIG_CMD_MISC=y CONFIG_CMD_MMC=y CONFIG_CMD_ROCKUSB=y CONFIG_CMD_USB_MASS_STORAGE=y -- 2.46.2
Regards, Simon

Hi Simon,
On 2024-10-19 04:00, Simon Glass wrote:
Hi Jonas,
On Fri, 18 Oct 2024 at 10:34, Jonas Karlman jonas@kwiboo.se wrote:
Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-)
Instead of this, can you use add a CPU driver? Then it should happen automatically - see print_cpuinfo().
Unfortunately the CPU driver seem to be more related to the /cpus nodes, e.g. the arm cores included in these SoCs and not really related to the overall SoC used by the board.
This instead depend on the DISPLAY_BOARDINFO and its checkboard() as the type of SoC seem more related to the board soc target.
Regards, Jonas
diff --git a/arch/arm/dts/rk356x-u-boot.dtsi b/arch/arm/dts/rk356x-u-boot.dtsi index 0a0943b462a9..24a976cf7e21 100644 --- a/arch/arm/dts/rk356x-u-boot.dtsi +++ b/arch/arm/dts/rk356x-u-boot.dtsi @@ -87,6 +87,10 @@ bootph-all; };
+&otp {
bootph-some-ram;
+};
&pcfg_pull_none { bootph-all; }; diff --git a/arch/arm/mach-rockchip/rk3568/rk3568.c b/arch/arm/mach-rockchip/rk3568/rk3568.c index 768a37393290..fc4c140ab970 100644 --- a/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -4,6 +4,7 @@ */
#include <dm.h> +#include <misc.h> #include <asm/armv8/mmu.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/grf_rk3568.h> @@ -133,3 +134,67 @@ int arch_cpu_init(void) #endif return 0; }
+#define RK3568_OTP_CPU_CODE_OFFSET 0x02 +#define RK3568_OTP_SPECIFICATION_OFFSET 0x07 +#define RK3568_OTP_CPU_VERSION_OFFSET 0x08 +#define RK3568_OTP_PERFORMANCE_OFFSET 0x22
+int checkboard(void) +{
u8 cpu_code[2], specification, package, cpu_version, performance;
struct udevice *dev;
char suffix[3];
int ret;
ret = uclass_get_device_by_driver(UCLASS_MISC,
DM_DRIVER_GET(rockchip_otp), &dev);
if (ret) {
debug("%s: could not find otp device, ret=%d\n", __func__, ret);
return 0;
}
/* cpu-code: SoC model, 0x35 0x66 or 0x35 0x68 */
ret = misc_read(dev, RK3568_OTP_CPU_CODE_OFFSET, cpu_code, 2);
if (ret < 0) {
debug("%s: could not read cpu-code, ret=%d\n", __func__, ret);
return 0;
}
/* specification: SoC variant, 0x2 for RK3568B2 and 0xA for RK3568J */
ret = misc_read(dev, RK3568_OTP_SPECIFICATION_OFFSET, &specification, 1);
if (ret < 0) {
debug("%s: could not read specification, ret=%d\n", __func__, ret);
return 0;
}
/* package: likely SoC variant revision, 0x2 for RK3568B2 */
package = specification >> 5;
specification &= 0x1f;
/* cpu-version: chip version, e.g. second letter of lot number */
ret = misc_read(dev, RK3568_OTP_CPU_VERSION_OFFSET, &cpu_version, 1);
if (ret < 0) {
debug("%s: could not read cpu-version, ret=%d\n", __func__, ret);
return 0;
}
cpu_version >>= 3;
cpu_version &= 0x7;
/* performance: used to identify RK3566T SoC variant */
ret = misc_read(dev, RK3568_OTP_PERFORMANCE_OFFSET, &performance, 1);
if (ret < 0) {
debug("%s: could not read performance, ret=%d\n", __func__, ret);
return 0;
}
if (performance & 0x0f)
specification = 0x14; /* T-variant */
suffix[0] = specification > 1 ? '@' + specification : 0;
suffix[1] = package > 1 ? '0' + package : 0;
suffix[2] = 0;
printf("SoC: RK%02x%02x%s v%u\n",
cpu_code[0], cpu_code[1], suffix, cpu_version);
return 0;
+} diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig index 1d06f3411fe0..f79f0e84400b 100644 --- a/configs/generic-rk3568_defconfig +++ b/configs/generic-rk3568_defconfig @@ -22,7 +22,6 @@ CONFIG_SPL_LOAD_FIT=y CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3568-generic.dtb" # CONFIG_DISPLAY_CPUINFO is not set -CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set @@ -31,6 +30,7 @@ CONFIG_SYS_SPI_U_BOOT_OFFS=0x60000 CONFIG_SPL_ATF=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y +CONFIG_CMD_MISC=y CONFIG_CMD_MMC=y CONFIG_CMD_ROCKUSB=y CONFIG_CMD_USB_MASS_STORAGE=y -- 2.46.2
Regards, Simon

Hi Jonas,
On Sun, 20 Oct 2024 at 00:24, Jonas Karlman jonas@kwiboo.se wrote:
Hi Simon,
On 2024-10-19 04:00, Simon Glass wrote:
Hi Jonas,
On Fri, 18 Oct 2024 at 10:34, Jonas Karlman jonas@kwiboo.se wrote:
Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +- 3 files changed, 70 insertions(+), 1 deletion(-)
Instead of this, can you use add a CPU driver? Then it should happen automatically - see print_cpuinfo().
Unfortunately the CPU driver seem to be more related to the /cpus nodes, e.g. the arm cores included in these SoCs and not really related to the overall SoC used by the board.
This instead depend on the DISPLAY_BOARDINFO and its checkboard() as the type of SoC seem more related to the board soc target.
OK.
Can we get plumb it into try_sysinfo() somehow? Perhaps add a sysinfo driver which returns a new SYSINFO_ID_SOC option?
I'm just trying to handle things using driver model, etc. rather than weak functions.
Regards, Jonas

Hi Jonas,
On 2024/10/19 00:34, Jonas Karlman wrote:
Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
Did you get these types from different board, or is there a document for this?
I didn't see this kind of document :(
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +-
Please split the driver change and config/dts change in different patch.
Thanks, - Kever
3 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/rk356x-u-boot.dtsi b/arch/arm/dts/rk356x-u-boot.dtsi index 0a0943b462a9..24a976cf7e21 100644 --- a/arch/arm/dts/rk356x-u-boot.dtsi +++ b/arch/arm/dts/rk356x-u-boot.dtsi @@ -87,6 +87,10 @@ bootph-all; };
+&otp {
- bootph-some-ram;
+};
- &pcfg_pull_none { bootph-all; };
diff --git a/arch/arm/mach-rockchip/rk3568/rk3568.c b/arch/arm/mach-rockchip/rk3568/rk3568.c index 768a37393290..fc4c140ab970 100644 --- a/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -4,6 +4,7 @@ */
#include <dm.h> +#include <misc.h> #include <asm/armv8/mmu.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/grf_rk3568.h> @@ -133,3 +134,67 @@ int arch_cpu_init(void) #endif return 0; }
+#define RK3568_OTP_CPU_CODE_OFFSET 0x02 +#define RK3568_OTP_SPECIFICATION_OFFSET 0x07 +#define RK3568_OTP_CPU_VERSION_OFFSET 0x08 +#define RK3568_OTP_PERFORMANCE_OFFSET 0x22
+int checkboard(void) +{
- u8 cpu_code[2], specification, package, cpu_version, performance;
- struct udevice *dev;
- char suffix[3];
- int ret;
- ret = uclass_get_device_by_driver(UCLASS_MISC,
DM_DRIVER_GET(rockchip_otp), &dev);
- if (ret) {
debug("%s: could not find otp device, ret=%d\n", __func__, ret);
return 0;
- }
- /* cpu-code: SoC model, 0x35 0x66 or 0x35 0x68 */
- ret = misc_read(dev, RK3568_OTP_CPU_CODE_OFFSET, cpu_code, 2);
- if (ret < 0) {
debug("%s: could not read cpu-code, ret=%d\n", __func__, ret);
return 0;
- }
- /* specification: SoC variant, 0x2 for RK3568B2 and 0xA for RK3568J */
- ret = misc_read(dev, RK3568_OTP_SPECIFICATION_OFFSET, &specification, 1);
- if (ret < 0) {
debug("%s: could not read specification, ret=%d\n", __func__, ret);
return 0;
- }
- /* package: likely SoC variant revision, 0x2 for RK3568B2 */
- package = specification >> 5;
- specification &= 0x1f;
- /* cpu-version: chip version, e.g. second letter of lot number */
- ret = misc_read(dev, RK3568_OTP_CPU_VERSION_OFFSET, &cpu_version, 1);
- if (ret < 0) {
debug("%s: could not read cpu-version, ret=%d\n", __func__, ret);
return 0;
- }
- cpu_version >>= 3;
- cpu_version &= 0x7;
- /* performance: used to identify RK3566T SoC variant */
- ret = misc_read(dev, RK3568_OTP_PERFORMANCE_OFFSET, &performance, 1);
- if (ret < 0) {
debug("%s: could not read performance, ret=%d\n", __func__, ret);
return 0;
- }
- if (performance & 0x0f)
specification = 0x14; /* T-variant */
- suffix[0] = specification > 1 ? '@' + specification : 0;
- suffix[1] = package > 1 ? '0' + package : 0;
- suffix[2] = 0;
- printf("SoC: RK%02x%02x%s v%u\n",
cpu_code[0], cpu_code[1], suffix, cpu_version);
- return 0;
+} diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig index 1d06f3411fe0..f79f0e84400b 100644 --- a/configs/generic-rk3568_defconfig +++ b/configs/generic-rk3568_defconfig @@ -22,7 +22,6 @@ CONFIG_SPL_LOAD_FIT=y CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3568-generic.dtb" # CONFIG_DISPLAY_CPUINFO is not set -CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set @@ -31,6 +30,7 @@ CONFIG_SYS_SPI_U_BOOT_OFFS=0x60000 CONFIG_SPL_ATF=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y +CONFIG_CMD_MISC=y CONFIG_CMD_MMC=y CONFIG_CMD_ROCKUSB=y CONFIG_CMD_USB_MASS_STORAGE=y

Hi Kever,
On 2024-10-30 07:40, Kever Yang wrote:
Hi Jonas,
On 2024/10/19 00:34, Jonas Karlman wrote:
Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3566 v1 SoC: RK3566 v2 SoC: RK3566T v2 SoC: RK3568 v2 SoC: RK3568B2 v2 SoC: RK3568J v2
Did you get these types from different board, or is there a document for this?
These are the unique prints running the checkboard() on different rk356x boards I have.
I didn't see this kind of document :(
I did not find this information in any document, this was mostly based on patterns in observed OTP values sampled from different boards.
Information for cpu-code (3566 or 3568) and cpu-version (0, 1 or 2) was picked from vendor 4.19/5.10/6.1 DTs from the OTP nvmem cells.
The cpu-version also seem to correspond to the second letter of the lot number, e.g. 0x0 = xAxxxxxx yyww, 0x1 = xBxxxxxx yyww etc.
Information about the B, J and S variant seem to be consistent for both rk356x and rk3588. Vendor 5.10/6.1 kernel driver for cpufreq/gpu/opp use specification_serial_number nvmem cell to detect rk3588 M (0xd) and J (0xa) variants.
The value seemed to correspond to 0x1 = A, 0x2 = B, ..., 0xa = J, 0xd = M, 0x13 = S, i.e. '@' + <value> = variant char in ascii table.
Information about the B2 or S2 revision seemed to correspond to the package_serial_number nvmem cells on rk3588. Similar bits also seemed to exist for rk356x even if there was no ref to package_serial_number in any vendor DT for rk356x. E.g. on boards with B2 or S2 soc variants had package_serial_number = 0x2, rest of my boards had a value of 0x1.
The T-variant of rk3566 did not seem to follow above pattern and it instead use specification_serial_number = 0x1. A commit "arm64: dts: rockchip: rk3568: adjust opp-table for rk356x-t" [1] instead pointed to a performance nvmem cell.
For all my RK3566T boards that performance byte in OTP was 0x51, and if I play with that value: 0x51 >> 2 = 0x14 => 'T'-variant ;-)
If you have any details and/or can confirm if some of my assumptions above are correct or not correct that would be nice :-)
[1] https://github.com/radxa/kernel/commit/2dfd51da472e7ebb5ef0d3db78f902454af82...
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se
arch/arm/dts/rk356x-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3568/rk3568.c | 65 ++++++++++++++++++++++++++ configs/generic-rk3568_defconfig | 2 +-
Please split the driver change and config/dts change in different patch.
I will split in a v2 and look into reworking this as a sysinfo driver.
Regards, Jonas
Thanks,
- Kever
3 files changed, 70 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/rk356x-u-boot.dtsi b/arch/arm/dts/rk356x-u-boot.dtsi index 0a0943b462a9..24a976cf7e21 100644 --- a/arch/arm/dts/rk356x-u-boot.dtsi +++ b/arch/arm/dts/rk356x-u-boot.dtsi @@ -87,6 +87,10 @@ bootph-all; };
+&otp {
- bootph-some-ram;
+};
- &pcfg_pull_none { bootph-all; };
diff --git a/arch/arm/mach-rockchip/rk3568/rk3568.c b/arch/arm/mach-rockchip/rk3568/rk3568.c index 768a37393290..fc4c140ab970 100644 --- a/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -4,6 +4,7 @@ */
#include <dm.h> +#include <misc.h> #include <asm/armv8/mmu.h> #include <asm/arch-rockchip/bootrom.h> #include <asm/arch-rockchip/grf_rk3568.h> @@ -133,3 +134,67 @@ int arch_cpu_init(void) #endif return 0; }
+#define RK3568_OTP_CPU_CODE_OFFSET 0x02 +#define RK3568_OTP_SPECIFICATION_OFFSET 0x07 +#define RK3568_OTP_CPU_VERSION_OFFSET 0x08 +#define RK3568_OTP_PERFORMANCE_OFFSET 0x22
+int checkboard(void) +{
- u8 cpu_code[2], specification, package, cpu_version, performance;
- struct udevice *dev;
- char suffix[3];
- int ret;
- ret = uclass_get_device_by_driver(UCLASS_MISC,
DM_DRIVER_GET(rockchip_otp), &dev);
- if (ret) {
debug("%s: could not find otp device, ret=%d\n", __func__, ret);
return 0;
- }
- /* cpu-code: SoC model, 0x35 0x66 or 0x35 0x68 */
- ret = misc_read(dev, RK3568_OTP_CPU_CODE_OFFSET, cpu_code, 2);
- if (ret < 0) {
debug("%s: could not read cpu-code, ret=%d\n", __func__, ret);
return 0;
- }
- /* specification: SoC variant, 0x2 for RK3568B2 and 0xA for RK3568J */
- ret = misc_read(dev, RK3568_OTP_SPECIFICATION_OFFSET, &specification, 1);
- if (ret < 0) {
debug("%s: could not read specification, ret=%d\n", __func__, ret);
return 0;
- }
- /* package: likely SoC variant revision, 0x2 for RK3568B2 */
- package = specification >> 5;
- specification &= 0x1f;
- /* cpu-version: chip version, e.g. second letter of lot number */
- ret = misc_read(dev, RK3568_OTP_CPU_VERSION_OFFSET, &cpu_version, 1);
- if (ret < 0) {
debug("%s: could not read cpu-version, ret=%d\n", __func__, ret);
return 0;
- }
- cpu_version >>= 3;
- cpu_version &= 0x7;
- /* performance: used to identify RK3566T SoC variant */
- ret = misc_read(dev, RK3568_OTP_PERFORMANCE_OFFSET, &performance, 1);
- if (ret < 0) {
debug("%s: could not read performance, ret=%d\n", __func__, ret);
return 0;
- }
- if (performance & 0x0f)
specification = 0x14; /* T-variant */
- suffix[0] = specification > 1 ? '@' + specification : 0;
- suffix[1] = package > 1 ? '0' + package : 0;
- suffix[2] = 0;
- printf("SoC: RK%02x%02x%s v%u\n",
cpu_code[0], cpu_code[1], suffix, cpu_version);
- return 0;
+} diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig index 1d06f3411fe0..f79f0e84400b 100644 --- a/configs/generic-rk3568_defconfig +++ b/configs/generic-rk3568_defconfig @@ -22,7 +22,6 @@ CONFIG_SPL_LOAD_FIT=y CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3568-generic.dtb" # CONFIG_DISPLAY_CPUINFO is not set -CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set @@ -31,6 +30,7 @@ CONFIG_SYS_SPI_U_BOOT_OFFS=0x60000 CONFIG_SPL_ATF=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y +CONFIG_CMD_MISC=y CONFIG_CMD_MMC=y CONFIG_CMD_ROCKUSB=y CONFIG_CMD_USB_MASS_STORAGE=y

Implement checkboard() to print current SoC model, e.g. one of:
SoC: RK3582 v1 SoC: RK3588 v0 SoC: RK3588 v1 SoC: RK3588S v0 SoC: RK3588S v1 SoC: RK3588S2 v1
when U-Boot proper is started.
Information about what SoC model, variant and version is read from OTP.
Signed-off-by: Jonas Karlman jonas@kwiboo.se --- arch/arm/dts/rk3588s-u-boot.dtsi | 4 ++ arch/arm/mach-rockchip/rk3588/rk3588.c | 56 ++++++++++++++++++++++++++ configs/generic-rk3588_defconfig | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/arch/arm/dts/rk3588s-u-boot.dtsi b/arch/arm/dts/rk3588s-u-boot.dtsi index 09d8b311cec5..8880d162b11c 100644 --- a/arch/arm/dts/rk3588s-u-boot.dtsi +++ b/arch/arm/dts/rk3588s-u-boot.dtsi @@ -69,6 +69,10 @@ bootph-all; };
+&otp { + bootph-some-ram; +}; + &pcfg_pull_down { bootph-all; }; diff --git a/arch/arm/mach-rockchip/rk3588/rk3588.c b/arch/arm/mach-rockchip/rk3588/rk3588.c index e2dac2a5b806..6317fabd5de3 100644 --- a/arch/arm/mach-rockchip/rk3588/rk3588.c +++ b/arch/arm/mach-rockchip/rk3588/rk3588.c @@ -4,6 +4,8 @@ * Copyright (c) 2022 Edgeble AI Technologies Pvt. Ltd. */
+#include <dm.h> +#include <misc.h> #include <spl.h> #include <asm/armv8/mmu.h> #include <asm/arch-rockchip/bootrom.h> @@ -178,3 +180,57 @@ int arch_cpu_init(void) return 0; } #endif + +#define RK3588_OTP_CPU_CODE_OFFSET 0x02 +#define RK3588_OTP_SPECIFICATION_OFFSET 0x06 +#define RK3588_OTP_CPU_VERSION_OFFSET 0x1c + +int checkboard(void) +{ + u8 cpu_code[2], specification, package, cpu_version; + struct udevice *dev; + char suffix[3]; + int ret; + + ret = uclass_get_device_by_driver(UCLASS_MISC, + DM_DRIVER_GET(rockchip_otp), &dev); + if (ret) { + debug("%s: could not find otp device, ret=%d\n", __func__, ret); + return 0; + } + + /* cpu-code: SoC model, 0x35 0x82 or 0x35 0x88 */ + ret = misc_read(dev, RK3588_OTP_CPU_CODE_OFFSET, cpu_code, 2); + if (ret < 0) { + debug("%s: could not read cpu-code, ret=%d\n", __func__, ret); + return 0; + } + + /* specification: SoC variant, 0x2 for RK3588S and RK3588S2 */ + ret = misc_read(dev, RK3588_OTP_SPECIFICATION_OFFSET, &specification, 1); + if (ret < 0) { + debug("%s: could not read specification, ret=%d\n", __func__, ret); + return 0; + } + /* package: likely SoC variant revision, 0x2 for RK3588S2 */ + package = specification >> 5; + specification &= 0x1f; + + /* cpu-version: chip version, e.g. second letter of lot number */ + ret = misc_read(dev, RK3588_OTP_CPU_VERSION_OFFSET, &cpu_version, 1); + if (ret < 0) { + debug("%s: could not read cpu-version, ret=%d\n", __func__, ret); + return 0; + } + cpu_version >>= 3; + cpu_version &= 0x7; + + suffix[0] = specification > 1 ? '@' + specification : 0; + suffix[1] = package > 1 ? '0' + package : 0; + suffix[2] = 0; + + printf("SoC: RK%02x%02x%s v%u\n", + cpu_code[0], cpu_code[1], suffix, cpu_version); + + return 0; +} diff --git a/configs/generic-rk3588_defconfig b/configs/generic-rk3588_defconfig index ebe883ed5972..51e31dce3a96 100644 --- a/configs/generic-rk3588_defconfig +++ b/configs/generic-rk3588_defconfig @@ -18,13 +18,13 @@ CONFIG_SPL_LOAD_FIT=y CONFIG_LEGACY_IMAGE_FORMAT=y CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-generic.dtb" # CONFIG_DISPLAY_CPUINFO is not set -CONFIG_DISPLAY_BOARDINFO_LATE=y CONFIG_SPL_MAX_SIZE=0x40000 CONFIG_SPL_PAD_TO=0x7f8000 # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set CONFIG_SPL_ATF=y CONFIG_CMD_GPIO=y CONFIG_CMD_GPT=y +CONFIG_CMD_MISC=y CONFIG_CMD_MMC=y CONFIG_CMD_ROCKUSB=y CONFIG_CMD_USB_MASS_STORAGE=y

On 2024-10-18 18:34, Jonas Karlman wrote:
[snip]
- /* specification: SoC variant, 0x2 for RK3588S and RK3588S2 */
Will fix this comment in a future v2, 0x2 should be replaced with 0x13.
- ret = misc_read(dev, RK3588_OTP_SPECIFICATION_OFFSET, &specification, 1);
- if (ret < 0) {
debug("%s: could not read specification, ret=%d\n", __func__, ret);
return 0;
- }
[snip]
participants (3)
-
Jonas Karlman
-
Kever Yang
-
Simon Glass