Add a couple of functions to look up the segment and part name using SIP
calls. These will be used to print more accurate CPU information in
print_cpuinfo().

Signed-off-by: David Lechner <[email protected]>
---
 arch/arm/mach-mediatek/cpu.c | 55 ++++++++++++++++++++++++++++++++++++++++++++
 arch/arm/mach-mediatek/cpu.h | 14 +++++++++++
 2 files changed, 69 insertions(+)

diff --git a/arch/arm/mach-mediatek/cpu.c b/arch/arm/mach-mediatek/cpu.c
index 8e8bc4f9cea..56a41e42df6 100644
--- a/arch/arm/mach-mediatek/cpu.c
+++ b/arch/arm/mach-mediatek/cpu.c
@@ -8,6 +8,11 @@
 #include <init.h>
 #include <wdt.h>
 #include <dm/uclass-internal.h>
+#include <linux/arm-smccc.h>
+#include <linux/types.h>
+
+#define MTK_SIP_PLAT_BINFO ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, 
ARM_SMCCC_SMC_64, \
+                                             ARM_SMCCC_OWNER_SIP, 0x529)
 
 int arch_cpu_init(void)
 {
@@ -21,3 +26,53 @@ void enable_caches(void)
        /* Enable D-cache. I-cache is already enabled in start.S */
        dcache_enable();
 }
+
+/**
+ * mediatek_sip_part_name - get the part name
+ *
+ * Retrieve the part name of platform description.
+ *
+ * This only applicable to SoCs that support SIP plat binfo SMC call.
+ *
+ * Returns: the part name or 0 if error or no part name
+ */
+u32 mediatek_sip_part_name(void)
+{
+       if (CONFIG_IS_ENABLED(TARGET_MT8188) || 
CONFIG_IS_ENABLED(TARGET_MT8189) ||
+           CONFIG_IS_ENABLED(TARGET_MT8195) || 
CONFIG_IS_ENABLED(TARGET_MT8365)) {
+               struct arm_smccc_res res __maybe_unused;
+
+               arm_smccc_smc(MTK_SIP_PLAT_BINFO, 0, 0, 0, 0, 0, 0, 0, &res);
+               if (res.a0)
+                       return 0;
+
+               return res.a1;
+       }
+
+       return 0;
+}
+
+/**
+ * mediatek_sip_segment_name - get the segment name
+ *
+ * Retrieve the segment name of platform description.
+ *
+ * This only applicable to SoCs that support SIP plat binfo SMC call.
+ *
+ * Returns: the segment name or 0 if error or no segment name
+ */
+u32 mediatek_sip_segment_name(void)
+{
+       if (CONFIG_IS_ENABLED(TARGET_MT8188) || 
CONFIG_IS_ENABLED(TARGET_MT8189) ||
+           CONFIG_IS_ENABLED(TARGET_MT8195) || 
CONFIG_IS_ENABLED(TARGET_MT8365)) {
+               struct arm_smccc_res res __maybe_unused;
+
+               arm_smccc_smc(MTK_SIP_PLAT_BINFO, 1, 0, 0, 0, 0, 0, 0, &res);
+               if (res.a0)
+                       return 0;
+
+               return res.a1;
+       }
+
+       return 0;
+}
diff --git a/arch/arm/mach-mediatek/cpu.h b/arch/arm/mach-mediatek/cpu.h
new file mode 100644
index 00000000000..768284e487f
--- /dev/null
+++ b/arch/arm/mach-mediatek/cpu.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2026 MediaTek Inc.
+ */
+
+#ifndef _MACH_MEDIATEK_CPU_H_
+#define _MACH_MEDIATEK_CPU_H_
+
+#include <linux/types.h>
+
+u32 mediatek_sip_segment_name(void);
+u32 mediatek_sip_part_name(void);
+
+#endif /* _MACH_MEDIATEK_CPU_H_ */

-- 
2.43.0

Reply via email to