Improve unisoc vendor detection, re-enable neon dot on unknown chipsets (#342)

diff --git a/src/arm/linux/aarch32-isa.c b/src/arm/linux/aarch32-isa.c
index d87a964..29663a7 100644
--- a/src/arm/linux/aarch32-isa.c
+++ b/src/arm/linux/aarch32-isa.c
@@ -149,8 +149,6 @@
 			cpuinfo_log_warning("VDOT instructions disabled: cause occasional SIGILL on Unisoc T310");
 		} else if (chipset->series == cpuinfo_arm_chipset_series_unisoc_ums && chipset->model == 312) {
 			cpuinfo_log_warning("VDOT instructions disabled: cause occasional SIGILL on Unisoc UMS312");
-		} else if (chipset->vendor == cpuinfo_arm_chipset_vendor_unknown) {
-			cpuinfo_log_warning("VDOT instructions disabled: unknown chipset");
 		} else {
 			switch (midr & (CPUINFO_ARM_MIDR_IMPLEMENTER_MASK | CPUINFO_ARM_MIDR_PART_MASK)) {
 				case UINT32_C(0x4100D0B0): /* Cortex-A76 */
diff --git a/src/arm/linux/chipset.c b/src/arm/linux/chipset.c
index 4515bf5..8bfa4f7 100644
--- a/src/arm/linux/chipset.c
+++ b/src/arm/linux/chipset.c
@@ -4010,6 +4010,20 @@
 	return *ro_board_platform_chipset;
 }
 
+static enum cpuinfo_arm_chipset_vendor disambiguate_chipset_vendor(
+	enum cpuinfo_arm_chipset_vendor vendor_a,
+	enum cpuinfo_arm_chipset_vendor vendor_b) {
+	/* Some UNISOC-based platforms reporting conflicting vendor names depending
+	 * on the source. For phones that report both UNISOC and Spreadtrum, treat it
+	 * as UNISOC. */
+	if (vendor_a == cpuinfo_arm_chipset_vendor_unisoc && vendor_b == cpuinfo_arm_chipset_vendor_spreadtrum ||
+	    vendor_a == cpuinfo_arm_chipset_vendor_spreadtrum && vendor_b == cpuinfo_arm_chipset_vendor_unisoc) {
+		return cpuinfo_arm_chipset_vendor_unisoc;
+	}
+
+	return cpuinfo_arm_chipset_vendor_unknown;
+}
+
 /*
  * Decodes chipset name from Android system properties:
  * - /proc/cpuinfo Hardware string
@@ -4070,10 +4084,19 @@
 			} else if (vendor != decoded_vendor) {
 				/* Parsing different system properties produces
 				 * different chipset vendors. This situation is
-				 * rare. */
-				cpuinfo_log_error(
-					"chipset detection failed: different chipset vendors reported in different system properties");
-				goto finish;
+				 * rare. Try to disambiguate for known cases,
+				 * otherwise treat as unknown. */
+
+				enum cpuinfo_arm_chipset_vendor disambiguated_vendor =
+					disambiguate_chipset_vendor(vendor, decoded_vendor);
+
+				if (disambiguated_vendor != cpuinfo_arm_chipset_vendor_unknown) {
+					vendor = disambiguated_vendor;
+				} else {
+					cpuinfo_log_error(
+						"chipset detection failed: different chipset vendors reported in different system properties");
+					goto finish;
+				}
 			}
 		}
 	}