aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Dukhan <marat@fb.com>2018-03-08 12:47:27 -0800
committerMarat Dukhan <marat@fb.com>2018-03-08 12:47:27 -0800
commite5d60492ef11676cbd61bd2cc34687d77cfcaf1d (patch)
treeb704e576267271ceef02c1c2edf66934281c1bfd
parentc9453c52564a7f34a2185949cbd2d774e228f96c (diff)
downloadcpuinfo-e5d60492ef11676cbd61bd2cc34687d77cfcaf1d.tar.gz
Use ro.arch to identify Samsung Exynos in hard cases
-rw-r--r--CMakeLists.txt1
-rw-r--r--jni/Android.mk1
-rw-r--r--src/arm/android/api.h1
-rw-r--r--src/arm/android/properties.c4
-rw-r--r--src/arm/linux/api.h3
-rw-r--r--src/arm/linux/chipset.c38
-rw-r--r--test/name/android-properties-interface.c15
-rw-r--r--test/name/android-properties.cc92
-rw-r--r--test/name/ro-arch.cc67
9 files changed, 174 insertions, 48 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bdc8da1..122e278 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -648,6 +648,7 @@ IF(CPUINFO_BUILD_UNIT_TESTS)
test/name/ro-product-board.cc
test/name/ro-board-platform.cc
test/name/ro-mediatek-platform.cc
+ test/name/ro-arch.cc
test/name/ro-chipname.cc
test/name/android-properties.cc)
CPUINFO_TARGET_ENABLE_CXX11(chipset-test)
diff --git a/jni/Android.mk b/jni/Android.mk
index d1905cc..e6af6e1 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -458,6 +458,7 @@ LOCAL_SRC_FILES := \
$(LOCAL_PATH)/test/name/ro-product-board.cc \
$(LOCAL_PATH)/test/name/ro-board-platform.cc \
$(LOCAL_PATH)/test/name/ro-mediatek-platform.cc \
+ $(LOCAL_PATH)/test/name/ro-arch.cc \
$(LOCAL_PATH)/test/name/ro-chipname.cc \
$(LOCAL_PATH)/test/name/android-properties.cc
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
diff --git a/src/arm/android/api.h b/src/arm/android/api.h
index 810fe5e..24b3aae 100644
--- a/src/arm/android/api.h
+++ b/src/arm/android/api.h
@@ -9,6 +9,7 @@ enum cpuinfo_android_chipset_property {
cpuinfo_android_chipset_property_ro_product_board,
cpuinfo_android_chipset_property_ro_board_platform,
cpuinfo_android_chipset_property_ro_mediatek_platform,
+ cpuinfo_android_chipset_property_ro_arch,
cpuinfo_android_chipset_property_ro_chipname,
cpuinfo_android_chipset_property_max,
};
diff --git a/src/arm/android/properties.c b/src/arm/android/properties.c
index ba188a9..42dca9d 100644
--- a/src/arm/android/properties.c
+++ b/src/arm/android/properties.c
@@ -53,6 +53,10 @@ void cpuinfo_arm_android_parse_properties(struct cpuinfo_android_properties prop
cpuinfo_log_debug("read ro.mediatek.platform = \"%.*s\"",
ro_mediatek_platform_length, properties->ro_mediatek_platform);
+ const int ro_arch_length =
+ cpuinfo_android_property_get("ro.arch", properties->ro_arch);
+ cpuinfo_log_debug("read ro.arch = \"%.*s\"", ro_arch_length, properties->ro_arch);
+
const int ro_chipname_length =
cpuinfo_android_property_get("ro.chipname", properties->ro_chipname);
cpuinfo_log_debug("read ro.chipname = \"%.*s\"", ro_chipname_length, properties->ro_chipname);
diff --git a/src/arm/linux/api.h b/src/arm/linux/api.h
index 7bbdc01..d8f5d4c 100644
--- a/src/arm/linux/api.h
+++ b/src/arm/linux/api.h
@@ -21,6 +21,7 @@
char ro_product_board[CPUINFO_BUILD_PROP_VALUE_MAX];
char ro_board_platform[CPUINFO_BUILD_PROP_VALUE_MAX];
char ro_mediatek_platform[CPUINFO_BUILD_PROP_VALUE_MAX];
+ char ro_arch[CPUINFO_BUILD_PROP_VALUE_MAX];
char ro_chipname[CPUINFO_BUILD_PROP_VALUE_MAX];
};
#endif
@@ -292,6 +293,8 @@ struct cpuinfo_arm_chipset cpuinfo_arm_linux_decode_chipset_from_proc_cpuinfo_ha
uint32_t cores, uint32_t max_cpu_freq_max);
struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset_from_ro_mediatek_platform(
const char ro_mediatek_platform[restrict static CPUINFO_BUILD_PROP_VALUE_MAX]);
+ struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset_from_ro_arch(
+ const char ro_arch[restrict static CPUINFO_BUILD_PROP_VALUE_MAX]);
struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset_from_ro_chipname(
const char ro_chipname[restrict static CPUINFO_BUILD_PROP_VALUE_MAX]);
#endif
diff --git a/src/arm/linux/chipset.c b/src/arm/linux/chipset.c
index 6f85bf9..d137e98 100644
--- a/src/arm/linux/chipset.c
+++ b/src/arm/linux/chipset.c
@@ -2792,14 +2792,14 @@ struct cpuinfo_arm_chipset cpuinfo_arm_linux_decode_chipset_from_proc_cpuinfo_ha
*
* @param[in] platform - ro.mediatek.platform value.
*
- * @returns Decoded chipset name. If chipset could not be decoded, the resulting structure would use `unknown` vendor
- * and series identifiers.
+ * @returns Decoded chipset name. If chipset could not be decoded, the resulting structure would use `unknown`
+ * vendor and series identifiers.
*/
struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset_from_ro_mediatek_platform(
const char platform[restrict static CPUINFO_BUILD_PROP_VALUE_MAX])
{
struct cpuinfo_arm_chipset chipset;
- const char* platform_end = platform + strnlen(platform, CPUINFO_BUILD_PROP_VALUE_MAX);;
+ const char* platform_end = platform + strnlen(platform, CPUINFO_BUILD_PROP_VALUE_MAX);
/* Check MediaTek MT signature */
if (match_mt(platform, platform_end, false, &chipset)) {
@@ -2812,6 +2812,36 @@ struct cpuinfo_arm_chipset cpuinfo_arm_linux_decode_chipset_from_proc_cpuinfo_ha
};
}
+
+ /*
+ * Decodes chipset name from ro.arch Android system property.
+ *
+ * The ro.arch property is matched only against Samsung Exynos signature. Systems with other chipset rarely
+ * configure ro.arch Android system property, and can be decoded through other properties, but some Exynos
+ * chipsets are identified only in ro.arch.
+ *
+ * @param[in] arch - ro.arch value.
+ *
+ * @returns Decoded chipset name. If chipset could not be decoded, the resulting structure would use `unknown`
+ * vendor and series identifiers.
+ */
+ struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset_from_ro_arch(
+ const char arch[restrict static CPUINFO_BUILD_PROP_VALUE_MAX])
+ {
+ struct cpuinfo_arm_chipset chipset;
+ const char* arch_end = arch + strnlen(arch, CPUINFO_BUILD_PROP_VALUE_MAX);
+
+ /* Check Samsung exynosXXXX signature */
+ if (match_exynos(arch, arch_end, &chipset)) {
+ return chipset;
+ }
+
+ return (struct cpuinfo_arm_chipset) {
+ .vendor = cpuinfo_arm_chipset_vendor_unknown,
+ .series = cpuinfo_arm_chipset_series_unknown,
+ };
+ }
+
/*
* Decodes chipset name from ro.chipname Android system property.
*
@@ -3348,6 +3378,8 @@ void cpuinfo_arm_chipset_to_string(
properties->ro_board_platform, cores, max_cpu_freq_max),
[cpuinfo_android_chipset_property_ro_mediatek_platform] =
cpuinfo_arm_android_decode_chipset_from_ro_mediatek_platform(properties->ro_mediatek_platform),
+ [cpuinfo_android_chipset_property_ro_arch] =
+ cpuinfo_arm_android_decode_chipset_from_ro_arch(properties->ro_arch),
[cpuinfo_android_chipset_property_ro_chipname] =
cpuinfo_arm_android_decode_chipset_from_ro_chipname(properties->ro_chipname),
};
diff --git a/test/name/android-properties-interface.c b/test/name/android-properties-interface.c
index f68066a..4913f77 100644
--- a/test/name/android-properties-interface.c
+++ b/test/name/android-properties-interface.c
@@ -10,6 +10,7 @@ void cpuinfo_arm_android_parse_chipset_properties(
const char ro_product_board[CPUINFO_BUILD_PROP_VALUE_MAX],
const char ro_board_platform[CPUINFO_BUILD_PROP_VALUE_MAX],
const char ro_mediatek_platform[CPUINFO_BUILD_PROP_VALUE_MAX],
+ const char ro_arch[CPUINFO_BUILD_PROP_VALUE_MAX],
const char ro_chipname[CPUINFO_BUILD_PROP_VALUE_MAX],
uint32_t cores,
uint32_t max_cpu_freq_max,
@@ -20,6 +21,7 @@ void cpuinfo_arm_android_parse_chipset_properties(
strncpy(properties.ro_product_board, ro_product_board, CPUINFO_BUILD_PROP_VALUE_MAX);
strncpy(properties.ro_board_platform, ro_board_platform, CPUINFO_BUILD_PROP_VALUE_MAX);
strncpy(properties.ro_mediatek_platform, ro_mediatek_platform, CPUINFO_BUILD_PROP_VALUE_MAX);
+ strncpy(properties.ro_arch, ro_arch, CPUINFO_BUILD_PROP_VALUE_MAX);
strncpy(properties.ro_chipname, ro_chipname, CPUINFO_BUILD_PROP_VALUE_MAX);
struct cpuinfo_arm_chipset chipset =
@@ -86,6 +88,19 @@ void cpuinfo_arm_android_parse_ro_mediatek_platform(
}
}
+void cpuinfo_arm_android_parse_ro_arch(
+ const char arch[CPUINFO_BUILD_PROP_VALUE_MAX], uint32_t cores, uint32_t max_cpu_freq_max,
+ char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX])
+{
+ struct cpuinfo_arm_chipset chipset = cpuinfo_arm_android_decode_chipset_from_ro_arch(arch);
+ if (chipset.series == cpuinfo_arm_chipset_series_unknown) {
+ chipset_name[0] = 0;
+ } else {
+ cpuinfo_arm_fixup_chipset(&chipset, cores, max_cpu_freq_max);
+ cpuinfo_arm_chipset_to_string(&chipset, chipset_name);
+ }
+}
+
void cpuinfo_arm_android_parse_ro_chipname(
const char chipname[CPUINFO_BUILD_PROP_VALUE_MAX], uint32_t cores, uint32_t max_cpu_freq_max,
char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX])
diff --git a/test/name/android-properties.cc b/test/name/android-properties.cc
index d1d7820..f9062b3 100644
--- a/test/name/android-properties.cc
+++ b/test/name/android-properties.cc
@@ -14,6 +14,7 @@ extern "C" void cpuinfo_arm_android_parse_chipset_properties(
const char ro_product_board[CPUINFO_BUILD_PROP_VALUE_MAX],
const char ro_board_platform[CPUINFO_BUILD_PROP_VALUE_MAX],
const char ro_mediatek_platform[CPUINFO_BUILD_PROP_VALUE_MAX],
+ const char ro_arch[CPUINFO_HARDWARE_VALUE_MAX],
const char ro_chipname[CPUINFO_BUILD_PROP_VALUE_MAX],
uint32_t cores,
uint32_t max_cpu_freq_max,
@@ -24,110 +25,111 @@ inline std::string parse_chipset(
std::string product_board,
std::string board_platform,
std::string mediatek_platform,
+ std::string arch,
std::string chipname,
uint32_t cores=1,
uint32_t max_cpu_freq_max=0)
{
char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX];
cpuinfo_arm_android_parse_chipset_properties(
- hardware.c_str(), product_board.c_str(), board_platform.c_str(), mediatek_platform.c_str(), chipname.c_str(),
+ hardware.c_str(), product_board.c_str(), board_platform.c_str(), mediatek_platform.c_str(), arch.c_str(), chipname.c_str(),
cores, max_cpu_freq_max, chipset_name);
return std::string(chipset_name, strnlen(chipset_name, CPUINFO_ARM_CHIPSET_NAME_MAX));
}
TEST(ANDROID_PROPERTIES, disambiguate_chipset) {
EXPECT_EQ("Amlogic S812",
- parse_chipset("Amlogic Meson8", "n200C", "meson8", "", ""));
+ parse_chipset("Amlogic Meson8", "n200C", "meson8", "", "", ""));
EXPECT_EQ("HiSilicon Kirin 925",
- parse_chipset("Kirin925", "MT7-L09", "hi3630", "", ""));
+ parse_chipset("Kirin925", "MT7-L09", "hi3630", "", "", ""));
EXPECT_EQ("HiSilicon Kirin 955",
- parse_chipset("Hisilicon Kirin 955", "EVA-L09", "hi3650", "", ""));
+ parse_chipset("Hisilicon Kirin 955", "EVA-L09", "hi3650", "", "", ""));
EXPECT_EQ("Marvell PXA986",
- parse_chipset("PXA988", "PXA986", "mrvl", "", ""));
+ parse_chipset("PXA988", "PXA986", "mrvl", "", "", ""));
EXPECT_EQ("Marvell PXA986",
- parse_chipset("PXA988", "PXA986", "mrvl", "", "PXA986"));
+ parse_chipset("PXA988", "PXA986", "mrvl", "", "", "PXA986"));
EXPECT_EQ("MediaTek MT6735P",
- parse_chipset("MT6735P", "MT6735P", "mt6735m", "MT6735", ""));
+ parse_chipset("MT6735P", "MT6735P", "mt6735m", "MT6735", "", ""));
EXPECT_EQ("MediaTek MT8382",
- parse_chipset("MT8382", "MT8382", "", "MT6582", ""));
+ parse_chipset("MT8382", "MT8382", "", "MT6582", "", ""));
EXPECT_EQ("MediaTek MT6735P",
- parse_chipset("MT6735P", "unknown", "mt6735m", "MT6735", ""));
+ parse_chipset("MT6735P", "unknown", "mt6735m", "MT6735", "", ""));
EXPECT_EQ("MediaTek MT8382",
- parse_chipset("MT8382", "LenovoTAB2A7-30HC", "", "MT6582", ""));
+ parse_chipset("MT8382", "LenovoTAB2A7-30HC", "", "MT6582", "", ""));
EXPECT_EQ("Qualcomm MSM8926",
- parse_chipset("Qualcomm MSM 8226 (Flattened Device Tree)", "MSM8226", "msm8226", "", "MSM8926"));
+ parse_chipset("Qualcomm MSM 8226 (Flattened Device Tree)", "MSM8226", "msm8226", "", "", "MSM8926"));
EXPECT_EQ("Qualcomm MSM8926",
- parse_chipset("Qualcomm MSM8926", "draconis", "msm8226", "", ""));
+ parse_chipset("Qualcomm MSM8926", "draconis", "msm8226", "", "", ""));
EXPECT_EQ("Qualcomm MSM8930AB",
- parse_chipset("SAMSUNG SERRANO", "MSM8960", "msm8960", "", "MSM8930AB", 2));
+ parse_chipset("SAMSUNG SERRANO", "MSM8960", "msm8960", "", "", "MSM8930AB", 2));
EXPECT_EQ("Qualcomm MSM8940",
- parse_chipset("Qualcomm Technologies, Inc MSM8940", "msm8937_32", "msm8937", "", "", 8));
+ parse_chipset("Qualcomm Technologies, Inc MSM8940", "msm8937_32", "msm8937", "", "", "", 8));
EXPECT_EQ("Spreadtrum SC6815AS",
- parse_chipset("scx15", "SC6815AS", "scx15", "", "SC6815AS"));
+ parse_chipset("scx15", "SC6815AS", "scx15", "", "", "SC6815AS"));
EXPECT_EQ("Spreadtrum SC7727S",
- parse_chipset("sc8830", "SC7727S", "sc8830", "", "SC7727S"));
+ parse_chipset("sc8830", "SC7727S", "sc8830", "", "", "SC7727S"));
EXPECT_EQ("Spreadtrum SC7731",
- parse_chipset("sc7731", "SC7731", "sc8830", "", ""));
+ parse_chipset("sc7731", "SC7731", "sc8830", "", "", ""));
EXPECT_EQ("Spreadtrum SC7731C",
- parse_chipset("sc7731c", "sp7731cea", "sc8830", "", ""));
+ parse_chipset("sc7731c", "sp7731cea", "sc8830", "", "", ""));
}
TEST(ANDROID_PROPERTIES, ambiguous_vendors) {
EXPECT_EQ("",
- parse_chipset("MTK6580", "sp7731ceb", "sc8830", "", ""));
+ parse_chipset("MTK6580", "sp7731ceb", "sc8830", "", "", ""));
EXPECT_EQ("",
- parse_chipset("", "universal5410", "msm8974", "", ""));
+ parse_chipset("", "universal5410", "msm8974", "", "", ""));
EXPECT_EQ("",
- parse_chipset("MT6580", "universal8895", "mt6580", "MT6580", ""));
+ parse_chipset("MT6580", "universal8895", "mt6580", "MT6580", "", ""));
EXPECT_EQ("",
- parse_chipset("", "smdk4x12", "msm8974", "", "", 2));
+ parse_chipset("", "smdk4x12", "msm8974", "", "", "", 2));
}
TEST(ANDROID_PROPERTIES, unambiguous_chipset) {
EXPECT_EQ("Samsung Exynos 3470",
- parse_chipset("UNIVERSAL_GARDA", "universal_garda", "exynos3", "", "exynos3470"));
+ parse_chipset("UNIVERSAL_GARDA", "universal_garda", "exynos3", "", "exynos3470", "exynos3470"));
EXPECT_EQ("MediaTek MT6582",
- parse_chipset("APPLE A8", "APPLE A8", "", "MT6582", ""));
+ parse_chipset("APPLE A8", "APPLE A8", "", "MT6582", "", ""));
EXPECT_EQ("NovaThor U8500",
- parse_chipset("SAMSUNG GOLDEN", "DB8520H", "montblanc", "", ""));
+ parse_chipset("SAMSUNG GOLDEN", "DB8520H", "montblanc", "", "", ""));
EXPECT_EQ("MediaTek MT6580",
- parse_chipset("Qualcomm", "unknown", "mt6580", "MT6580", ""));
+ parse_chipset("Qualcomm", "unknown", "mt6580", "MT6580", "", ""));
EXPECT_EQ("HiSilicon Kirin 650",
- parse_chipset("", "hi6250", "", "", ""));
+ parse_chipset("", "hi6250", "", "", "", ""));
EXPECT_EQ("Samsung Exynos 8890",
- parse_chipset("", "universal8890", "exynos5", "", "exynos8890"));
+ parse_chipset("", "universal8890", "exynos5", "", "exynos8890", "exynos8890"));
EXPECT_EQ("MediaTek MT6582",
- parse_chipset("", "MT6582", "", "MT6582", ""));
+ parse_chipset("", "MT6582", "", "MT6582", "", ""));
EXPECT_EQ("Qualcomm MSM8994",
- parse_chipset("", "msm8994", "msm8994", "", ""));
+ parse_chipset("", "msm8994", "msm8994", "", "", ""));
EXPECT_EQ("Qualcomm APQ8064",
- parse_chipset("SAMSUNG JF", "MSM8960", "msm8960", "", "apq8064", 4));
+ parse_chipset("SAMSUNG JF", "MSM8960", "msm8960", "", "", "apq8064", 4));
EXPECT_EQ("MediaTek MT6795",
- parse_chipset("", "mt6795", "mt6795", "MT6795", ""));
+ parse_chipset("", "mt6795", "mt6795", "MT6795", "", ""));
EXPECT_EQ("Marvell PXA1908",
- parse_chipset("PXA1908", "PXA19xx", "mrvl", "", "PXA19xx"));
+ parse_chipset("PXA1908", "PXA19xx", "mrvl", "", "", "PXA19xx"));
EXPECT_EQ("Spreadtrum SC7715A",
- parse_chipset("scx15", "SM-G928G", "scx15", "", "SC7715A"));
+ parse_chipset("scx15", "SM-G928G", "scx15", "", "", "SC7715A"));
EXPECT_EQ("MediaTek MT6592",
- parse_chipset("MT6592", "lcsh92_cwet_htc_kk", "", "MT6592", ""));
+ parse_chipset("MT6592", "lcsh92_cwet_htc_kk", "", "MT6592", "", ""));
EXPECT_EQ("HiSilicon Kirin 620",
- parse_chipset("hi6210sft", "BalongV8R1SFT", "hi6210sft", "", ""));
+ parse_chipset("hi6210sft", "BalongV8R1SFT", "hi6210sft", "", "", ""));
EXPECT_EQ("Qualcomm APQ8064",
- parse_chipset("PANTECH APQ8064 EF52L", "VEGA", "msm8960", "", "apq8064", 4));
+ parse_chipset("PANTECH APQ8064 EF52L", "VEGA", "msm8960", "", "", "apq8064", 4));
EXPECT_EQ("MediaTek MT6580M",
- parse_chipset("MT6580M", "unknown", "mt6580", "MT6580", ""));
+ parse_chipset("MT6580M", "unknown", "mt6580", "MT6580", "", ""));
EXPECT_EQ("Samsung Exynos 4412",
- parse_chipset("SMDK4x12", "smdk4x12", "exynos4", "", "smdk4x12", 4));
+ parse_chipset("SMDK4x12", "smdk4x12", "exynos4", "", "", "smdk4x12", 4));
EXPECT_EQ("Samsung Exynos 7420",
- parse_chipset("SAMSUNG Exynos7420", "universal7420", "exynos5", "", "exynos7420"));
+ parse_chipset("SAMSUNG Exynos7420", "universal7420", "exynos5", "", "exynos7420", "exynos7420"));
EXPECT_EQ("MediaTek MT6582",
- parse_chipset("MT6582", "MT6582", "", "MT6582", ""));
+ parse_chipset("MT6582", "MT6582", "", "MT6582", "", ""));
EXPECT_EQ("Qualcomm MSM8916",
- parse_chipset("Qualcomm Technologies, Inc MSM8916", "msm8916", "msm8916", "", "", 4));
+ parse_chipset("Qualcomm Technologies, Inc MSM8916", "msm8916", "msm8916", "", "", "", 4));
EXPECT_EQ("Qualcomm MSM8916",
- parse_chipset("Qualcomm Technologies, Inc MSM8916", "MSM8916", "msm8916", "", "MSM8916", 4));
+ parse_chipset("Qualcomm Technologies, Inc MSM8916", "MSM8916", "msm8916", "", "", "MSM8916", 4));
EXPECT_EQ("MediaTek MT6735",
- parse_chipset("MT6735", "mt6735", "mt6735", "MT6735", ""));
+ parse_chipset("MT6735", "mt6735", "mt6735", "MT6735", "", ""));
EXPECT_EQ("MediaTek MT6737T",
- parse_chipset("Samsung GrandPrimePlus LTE CIS rev04 board based on MT6737T", "MT6737T", "mt6737t", "MT6737T", "MT6737T"));
+ parse_chipset("Samsung GrandPrimePlus LTE CIS rev04 board based on MT6737T", "MT6737T", "mt6737t", "MT6737T", "", "MT6737T"));
}
diff --git a/test/name/ro-arch.cc b/test/name/ro-arch.cc
new file mode 100644
index 0000000..cfdb268
--- /dev/null
+++ b/test/name/ro-arch.cc
@@ -0,0 +1,67 @@
+#include <gtest/gtest.h>
+
+#include <stdint.h>
+#include <string.h>
+
+#include <string>
+
+#define CPUINFO_BUILD_PROP_VALUE_MAX 92
+#define CPUINFO_ARM_CHIPSET_NAME_MAX 48
+
+extern "C" void cpuinfo_arm_android_parse_ro_arch(
+ const char arch[CPUINFO_BUILD_PROP_VALUE_MAX],
+ uint32_t cores,
+ uint32_t max_cpu_freq_max,
+ char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX]);
+
+inline std::string parse_ro_arch(
+ std::string arch, uint32_t cores=1, uint32_t max_cpu_freq_max=0)
+{
+ char arch_buffer[CPUINFO_BUILD_PROP_VALUE_MAX];
+ strncpy(arch_buffer, arch.c_str(), CPUINFO_BUILD_PROP_VALUE_MAX);
+ char chipset_name[CPUINFO_ARM_CHIPSET_NAME_MAX];
+ cpuinfo_arm_android_parse_ro_arch(
+ arch_buffer, cores, max_cpu_freq_max, chipset_name);
+ return std::string(chipset_name, strnlen(chipset_name, CPUINFO_ARM_CHIPSET_NAME_MAX));
+}
+
+TEST(RO_ARCH, samsung_exynos) {
+ EXPECT_EQ("Samsung Exynos 3470",
+ parse_ro_arch("exynos3470"));
+ EXPECT_EQ("Samsung Exynos 3475",
+ parse_ro_arch("exynos3475"));
+ EXPECT_EQ("Samsung Exynos 4415",
+ parse_ro_arch("exynos4415"));
+ EXPECT_EQ("Samsung Exynos 5260",
+ parse_ro_arch("exynos5260"));
+ EXPECT_EQ("Samsung Exynos 5410",
+ parse_ro_arch("exynos5410"));
+ EXPECT_EQ("Samsung Exynos 5420",
+ parse_ro_arch("exynos5420"));
+ EXPECT_EQ("Samsung Exynos 5422",
+ parse_ro_arch("exynos5422"));
+ EXPECT_EQ("Samsung Exynos 5430",
+ parse_ro_arch("exynos5430"));
+ EXPECT_EQ("Samsung Exynos 5433",
+ parse_ro_arch("exynos5433"));
+ EXPECT_EQ("Samsung Exynos 7420",
+ parse_ro_arch("exynos7420"));
+ EXPECT_EQ("Samsung Exynos 7570",
+ parse_ro_arch("exynos7570"));
+ EXPECT_EQ("Samsung Exynos 7580",
+ parse_ro_arch("exynos7580", 8));
+ EXPECT_EQ("Samsung Exynos 7870",
+ parse_ro_arch("exynos7870"));
+ EXPECT_EQ("Samsung Exynos 7872",
+ parse_ro_arch("exynos7872"));
+ EXPECT_EQ("Samsung Exynos 7880",
+ parse_ro_arch("exynos7880"));
+ EXPECT_EQ("Samsung Exynos 7885",
+ parse_ro_arch("exynos7885"));
+ EXPECT_EQ("Samsung Exynos 8890",
+ parse_ro_arch("exynos8890"));
+ EXPECT_EQ("Samsung Exynos 8895",
+ parse_ro_arch("exynos8895"));
+ EXPECT_EQ("Samsung Exynos 9810",
+ parse_ro_arch("exynos9810"));
+}