From 0f389aea9e630c3b21547a5dd8dbe572a8502853 Mon Sep 17 00:00:00 2001
From: Aarya Chaumal <aarya.chaumal@gmail.com>
Date: Sun, 14 Aug 2022 23:16:44 +0530
Subject: flashrom.c: Update check_block_eraser function to use probe opcode

Update the check_block_eraser function to use probe_opcode to see if the
given block_eraser is supported by the spi master. This will help to get
a real count of usable block_erasers.

Change-Id: I6591a84ae1fe5bc1648051cc30b9393450033852
Signed-off-by: Aarya Chaumal <aarya.chaumal@gmail.com>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/66717
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
---
 flashrom.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/flashrom.c b/flashrom.c
index 573f10b3..785da6f3 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -446,6 +446,18 @@ static int check_block_eraser(const struct flashctx *flash, int k, int log)
 				 "eraseblock layout is not defined. ");
 		return 1;
 	}
+
+	if (flash->mst->buses_supported & BUS_SPI) {
+		const uint8_t *opcode = spi_get_opcode_from_erasefn(eraser.block_erase);
+		for (int i = 0; opcode[i]; i++) {
+			if (!flash->mst->spi.probe_opcode(flash, opcode[i])) {
+				if (log)
+					msg_cdbg("block erase function and layout found "
+						 "but SPI master doesn't support the function. ");
+				return 1;
+			}
+		}
+	}
 	// TODO: Once erase functions are annotated with allowed buses, check that as well.
 	return 0;
 }
-- 
cgit v1.2.3