spi_master: Introduce SPI_MASTER_4BA feature flag

Backport upstream `commit 1cf407b4f8`.

Add a feature flag SPI_MASTER_4BA to `struct spi_master` that advertises
programmer-side support for 4-byte addresses in generic commands (and
read/write commands if the master uses the default implementations). Set
it for all masters that handle commands address-agnostic.

Don't prefer native 4BA instructions if the master doesn't support them.

BUG=chromium:478356
BRANCH=none
TEST=still builds

Change-Id: I3ee46ae7502e2f0d986a2f101a1e7135fb5c54df
Signed-off-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/flashrom/+/1710339
Reviewed-by: Sam McNally <sammc@chromium.org>
diff --git a/programmer.h b/programmer.h
index 172f45d..b13e21d 100644
--- a/programmer.h
+++ b/programmer.h
@@ -20,6 +20,8 @@
 #ifndef __PROGRAMMER_H__
 #define __PROGRAMMER_H__ 1
 
+#include <stdint.h>
+
 #include "flash.h"	/* for chipaddr and flashctx */
 
 enum programmer {
@@ -567,8 +569,12 @@
 #define MAX_DATA_UNSPECIFIED 0
 #define MAX_DATA_READ_UNLIMITED 64 * 1024
 #define MAX_DATA_WRITE_UNLIMITED 256
+
+#define SPI_MASTER_4BA			(1U << 0)  /**< Can handle 4-byte addresses */
+
 struct spi_master {
 	enum spi_controller type;
+	uint32_t features;
 	unsigned int max_data_read;
 	unsigned int max_data_write;
 	int (*command)(const struct flashctx *flash, unsigned int writecnt, unsigned int readcnt,
@@ -756,4 +762,11 @@
 struct libusb_device_handle *usb_dev_get_by_vid_pid_number(
 		struct libusb_context *usb_ctx, uint16_t vid, uint16_t pid, unsigned int num);
 
+/* spi_master feature checks */
+static inline bool spi_master_4ba(const struct flashctx *const flash)
+{
+	return flash->mst->buses_supported & BUS_SPI &&
+		flash->mst->spi.features & SPI_MASTER_4BA;
+}
+
 #endif				/* !__PROGRAMMER_H__ */