@@ -4068,10 +4068,19 @@ struct cpuinfo_arm_chipset cpuinfo_arm_android_decode_chipset(
40684068 } else if (vendor != decoded_vendor ) {
40694069 /* Parsing different system properties produces
40704070 * 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 ;
4071+ * rare. Try to disambiguate for known cases,
4072+ * otherwise treat as unknown. */
4073+
4074+ cpuinfo_arm_chipset_vendor disambiguated_vendor =
4075+ disambiguate_chipset_vendor (vendor , decoded_vendor );
4076+
4077+ if (disambiguated_vendor != cpuinfo_arm_chipset_vendor_unknown ) {
4078+ vendor = disambiguated_vendor ;
4079+ } else {
4080+ cpuinfo_log_error (
4081+ "chipset detection failed: different chipset vendors reported in different system properties" );
4082+ goto finish ;
4083+ }
40754084 }
40764085 }
40774086 }
@@ -4291,4 +4300,18 @@ struct cpuinfo_arm_chipset cpuinfo_arm_linux_decode_chipset(
42914300 return chipset ;
42924301}
42934302
4303+ static struct cpuinfo_arm_chipset_vendor disambiguate_chipset_vendor (
4304+ cpuinfo_arm_chipset_vendor vendor_a ,
4305+ cpuinfo_arm_chipset_vendor vendor_b ) {
4306+ /* Some UNISOC-based platforms reporting conflicting vendor names depending
4307+ * on the source. For phones that report both UNISOC and Spreadtrum, treat it
4308+ * as UNISOC. */
4309+ if (vendor_a == cpuinfo_arm_chipset_vendor_unisoc && vendor_b == cpuinfo_arm_chipset_vendor_spreadtrum ||
4310+ vendor_a == cpuinfo_arm_chipset_vendor_spreadtrum && vendor_b == cpuinfo_arm_chipset_vendor_unisoc ) {
4311+ return cpuinfo_arm_chipset_vendor_unisoc ;
4312+ }
4313+
4314+ return cpuinfo_arm_chipset_vendor_unknown ;
4315+ }
4316+
42944317#endif
0 commit comments