@@ -4008,6 +4008,20 @@ static inline struct cpuinfo_arm_chipset disambiguate_spreadtrum_chipset(
40084008 return * ro_board_platform_chipset ;
40094009}
40104010
4011+ static enum cpuinfo_arm_chipset_vendor disambiguate_chipset_vendor (
4012+ enum cpuinfo_arm_chipset_vendor vendor_a ,
4013+ enum cpuinfo_arm_chipset_vendor vendor_b ) {
4014+ /* Some UNISOC-based platforms reporting conflicting vendor names depending
4015+ * on the source. For phones that report both UNISOC and Spreadtrum, treat it
4016+ * as UNISOC. */
4017+ if (vendor_a == cpuinfo_arm_chipset_vendor_unisoc && vendor_b == cpuinfo_arm_chipset_vendor_spreadtrum ||
4018+ vendor_a == cpuinfo_arm_chipset_vendor_spreadtrum && vendor_b == cpuinfo_arm_chipset_vendor_unisoc ) {
4019+ return cpuinfo_arm_chipset_vendor_unisoc ;
4020+ }
4021+
4022+ return cpuinfo_arm_chipset_vendor_unknown ;
4023+ }
4024+
40114025/*
40124026 * Decodes chipset name from Android system properties:
40134027 * - /proc/cpuinfo Hardware string
@@ -4068,10 +4082,19 @@ struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset(
40684082 } else if (vendor != decoded_vendor ) {
40694083 /* Parsing different system properties produces
40704084 * different chipset vendors. This situation is
4071- * rare. */
4072- cpuinfo_log_error (
4073- "chipset detection failed: different chipset vendors reported in different system properties" );
4074- goto finish ;
4085+ * rare. Try to disambiguate for known cases,
4086+ * otherwise treat as unknown. */
4087+
4088+ enum cpuinfo_arm_chipset_vendor disambiguated_vendor =
4089+ disambiguate_chipset_vendor (vendor , decoded_vendor );
4090+
4091+ if (disambiguated_vendor != cpuinfo_arm_chipset_vendor_unknown ) {
4092+ vendor = disambiguated_vendor ;
4093+ } else {
4094+ cpuinfo_log_error (
4095+ "chipset detection failed: different chipset vendors reported in different system properties" );
4096+ goto finish ;
4097+ }
40754098 }
40764099 }
40774100 }
0 commit comments