ich_descriptors: Revise detection for chipsets w/ ICCRIBA

Detection based on ICCRIBA and FMSBA became a little messy lately.
However, there's a new static difference: Since 300 series (Cannon
Point), there is an MDTBA field in FLUMAP1 that has always been 0
(reserved) before. Taking this into account, we can relax the checks
on ICCRIBA.

Change-Id: I587ad1abe390843d4a9e74431b6fc4b63f8ba512
Signed-off-by: Nico Huber <nico.h@gmx.de>
Original-Reviewed-on: https://review.coreboot.org/c/flashrom/+/55647
Original-Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Original-Reviewed-by: Michał Żygowski <michal.zygowski@3mdeb.com>
Reviewed-on: https://review.coreboot.org/c/flashrom-stable/+/71399
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/ich_descriptors.c b/ich_descriptors.c
index 5d08717..ed00896 100644
--- a/ich_descriptors.c
+++ b/ich_descriptors.c
@@ -916,9 +916,10 @@
 
 /*
  * Guesses a minimum chipset version based on the maximum number of
- * soft straps per generation.
+ * soft straps per generation and presence of the MIP base (MDTBA).
  */
-static enum ich_chipset guess_ich_chipset_from_content(const struct ich_desc_content *const content)
+static enum ich_chipset guess_ich_chipset_from_content(const struct ich_desc_content *const content,
+						       const struct ich_desc_upper_map *const upper)
 {
 	if (content->ICCRIBA == 0x00) {
 		if (content->MSL == 0 && content->ISL <= 2)
@@ -937,25 +938,26 @@
 		}
 		warn_peculiar_desc(true, "Ibex Peak");
 		return CHIPSET_5_SERIES_IBEX_PEAK;
-	} else if (content->ICCRIBA < 0x31 && content->FMSBA < 0x30) {
-		if (content->MSL == 0 && content->ISL <= 17)
-			return CHIPSET_BAYTRAIL;
-		if (content->MSL <= 1 && content->ISL <= 18)
-			return CHIPSET_6_SERIES_COUGAR_POINT;
-		if (content->MSL <= 1 && content->ISL <= 21)
-			return CHIPSET_8_SERIES_LYNX_POINT;
-		warn_peculiar_desc(true, "Wildcat Point");
-		return CHIPSET_9_SERIES_WILDCAT_POINT;
-	} else if (content->ICCRIBA < 0x34) {
-		if (content->NM == 6)
+	} else if (upper->MDTBA == 0x00) {
+		if (content->ICCRIBA < 0x31 && content->FMSBA < 0x30) {
+			if (content->MSL == 0 && content->ISL <= 17)
+				return CHIPSET_BAYTRAIL;
+			if (content->MSL <= 1 && content->ISL <= 18)
+				return CHIPSET_6_SERIES_COUGAR_POINT;
+			if (content->MSL <= 1 && content->ISL <= 21)
+				return CHIPSET_8_SERIES_LYNX_POINT;
+			warn_peculiar_desc(true, "Wildcat Point");
+			return CHIPSET_9_SERIES_WILDCAT_POINT;
+		}
+		if (content->NM == 6) {
+			warn_peculiar_desc(content->ICCRIBA > 0x34, "C620 series");
 			return CHIPSET_C620_SERIES_LEWISBURG;
+		}
+		warn_peculiar_desc(content->ICCRIBA != 0x31, "100 series");
 		return CHIPSET_100_SERIES_SUNRISE_POINT;
-	} else if (content->ICCRIBA == 0x34) {
-		if (content->NM == 6)
-			return CHIPSET_C620_SERIES_LEWISBURG;
-		return CHIPSET_300_SERIES_CANNON_POINT;
 	} else {
-		msg_pwarn("Unknown flash descriptor, assuming 300 series compatibility.\n");
+		if (content->ICCRIBA != 0x34)
+			msg_pwarn("Unknown flash descriptor, assuming 300 series compatibility.\n");
 		return CHIPSET_300_SERIES_CANNON_POINT;
 	}
 }
@@ -967,9 +969,10 @@
  * tinction because of the dropped number of regions field (NR).
  */
 static enum ich_chipset guess_ich_chipset(const struct ich_desc_content *const content,
-					  const struct ich_desc_component *const component)
+					  const struct ich_desc_component *const component,
+					  const struct ich_desc_upper_map *const upper)
 {
-	const enum ich_chipset guess = guess_ich_chipset_from_content(content);
+	const enum ich_chipset guess = guess_ich_chipset_from_content(content, upper);
 
 	switch (guess) {
 	case CHIPSET_300_SERIES_CANNON_POINT:
@@ -1049,7 +1052,7 @@
 	}
 
 	if (*cs == CHIPSET_ICH_UNKNOWN) {
-		*cs = guess_ich_chipset(&desc->content, &desc->component);
+		*cs = guess_ich_chipset(&desc->content, &desc->component, &desc->upper);
 		prettyprint_ich_chipset(*cs);
 	}