@@ -4010,6 +4010,20 @@ static inline struct cpuinfo_arm_chipset disambiguate_spreadtrum_chipset(
40104010 return * ro_board_platform_chipset ;
40114011}
40124012
4013+ static enum cpuinfo_arm_chipset_vendor disambiguate_chipset_vendor (
4014+ enum cpuinfo_arm_chipset_vendor vendor_a ,
4015+ enum cpuinfo_arm_chipset_vendor vendor_b ) {
4016+ /* Some UNISOC-based platforms reporting conflicting vendor names depending
4017+ * on the source. For phones that report both UNISOC and Spreadtrum, treat it
4018+ * as UNISOC. */
4019+ if (vendor_a == cpuinfo_arm_chipset_vendor_unisoc && vendor_b == cpuinfo_arm_chipset_vendor_spreadtrum ||
4020+ vendor_a == cpuinfo_arm_chipset_vendor_spreadtrum && vendor_b == cpuinfo_arm_chipset_vendor_unisoc ) {
4021+ return cpuinfo_arm_chipset_vendor_unisoc ;
4022+ }
4023+
4024+ return cpuinfo_arm_chipset_vendor_unknown ;
4025+ }
4026+
40134027/*
40144028 * Decodes chipset name from Android system properties:
40154029 * - /proc/cpuinfo Hardware string
@@ -4070,10 +4084,19 @@ struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset(
40704084 } else if (vendor != decoded_vendor ) {
40714085 /* Parsing different system properties produces
40724086 * different chipset vendors. This situation is
4073- * rare. */
4074- cpuinfo_log_error (
4075- "chipset detection failed: different chipset vendors reported in different system properties" );
4076- goto finish ;
4087+ * rare. Try to disambiguate for known cases,
4088+ * otherwise treat as unknown. */
4089+
4090+ enum cpuinfo_arm_chipset_vendor disambiguated_vendor =
4091+ disambiguate_chipset_vendor (vendor , decoded_vendor );
4092+
4093+ if (disambiguated_vendor != cpuinfo_arm_chipset_vendor_unknown ) {
4094+ vendor = disambiguated_vendor ;
4095+ } else {
4096+ cpuinfo_log_error (
4097+ "chipset detection failed: different chipset vendors reported in different system properties" );
4098+ goto finish ;
4099+ }
40774100 }
40784101 }
40794102 }
0 commit comments