[PATCH 29/30] crypto: sa2ul - report SA engine hardware revision
From: Manorit Chawdhry
Date: Tue Sep 15 2026 - 06:11:39 EST
The SA2UL/SA3UL crypto engine exposes a REVISION register at offset
0x0 that encodes the major/minor hardware version (major == 2 for
SA2_UL, major == 3 minor == 0 for SA3_UL, major == 3 minor == 1 for
SA3_UL_CM). This version information is needed to detect the AES-CM
(SA3UL_CM) variant so the driver can enable the extra TRNG-priming
and AES key-expansion workarounds it requires.
Add the SA_REVISION register offset and its major/minor field masks,
read the register during probe, and log the decoded version via
dev_info() for diagnostics.
Signed-off-by: Manorit Chawdhry <m-chawdhry@xxxxxx>
Assisted-by: Sisyphus:claude-sonnet-5
---
drivers/crypto/sa2ul.c | 8 +++++++-
drivers/crypto/sa2ul.h | 9 +++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/crypto/sa2ul.c b/drivers/crypto/sa2ul.c
index d92ba1f581c0..9c4748110eef 100644
--- a/drivers/crypto/sa2ul.c
+++ b/drivers/crypto/sa2ul.c
@@ -2465,7 +2465,8 @@ static int sa_ul_probe(struct platform_device *pdev)
struct device_node *node = dev->of_node;
static void __iomem *saul_base;
struct sa_crypto_data *dev_data;
- u32 status, val;
+ u32 status, val, rev;
+ unsigned int major, minor;
int ret;
dev_data = devm_kzalloc(dev, sizeof(*dev_data), GFP_KERNEL);
@@ -2494,6 +2495,11 @@ static int sa_ul_probe(struct platform_device *pdev)
return ret;
}
+ rev = readl_relaxed(saul_base + SA_REVISION);
+ major = FIELD_GET(SA_REVISION_MAJOR_MASK, rev);
+ minor = FIELD_GET(SA_REVISION_MINOR_MASK, rev);
+ dev_info(dev, "SAxUL_VERSION: %u.%u\n", major, minor);
+
ret = sa_init_mem(dev_data);
if (ret)
goto disable_pm;
diff --git a/drivers/crypto/sa2ul.h b/drivers/crypto/sa2ul.h
index 53d2bfd895cf..c5e73ed14f44 100644
--- a/drivers/crypto/sa2ul.h
+++ b/drivers/crypto/sa2ul.h
@@ -16,9 +16,18 @@
#include <crypto/sha1.h>
#include <crypto/sha2.h>
+#define SA_REVISION 0x0000
#define SA_ENGINE_STATUS 0x0008
#define SA_ENGINE_ENABLE_CONTROL 0x1000
+/*
+ * SA_REVISION register fields (see REVISION Register, offset 0x0)
+ * major == 2: SA2_UL, major == 3: SA3_UL (minor 0 == SA3_UL, minor 1 ==
+ * SA3_UL_CM aka SA3_UL v3.1)
+ */
+#define SA_REVISION_MAJOR_MASK GENMASK(10, 8)
+#define SA_REVISION_MINOR_MASK GENMASK(5, 0)
+
struct sa_tfm_ctx;
/*
* SA_ENGINE_ENABLE_CONTROL register bits
--
2.43.0