qatlib/force-32-bit-MMIO-CSR-reads.patch
Vladislav Dronov 1153dbfd9b Update to qatlib 26.02.0
Update to qatlib 26.02.0 @ fe4bb4b6
Add patch to force 32 bit MMIO CSR reads for GCC 16.1

Resolves: RHEL-115834

Signed-off-by: Vladislav Dronov <vdronov@redhat.com>
2026-06-28 19:24:42 +02:00

33 lines
1.4 KiB
Diff

diff --git a/quickassist/lookaside/access_layer/src/qat_direct/include/adf_platform_common.h b/quickassist/lookaside/access_layer/src/qat_direct/include/adf_platform_common.h
index 6956a5e02502..449ba2978a93 100644
--- a/quickassist/lookaside/access_layer/src/qat_direct/include/adf_platform_common.h
+++ b/quickassist/lookaside/access_layer/src/qat_direct/include/adf_platform_common.h
@@ -258,8 +258,21 @@ static inline unsigned int modulo(unsigned int data, unsigned int shift)
#define ICP_ADF_CSR_WR(csrAddr, csrOffset, val) \
(void)((*((volatile Cpa32U *)(((Cpa8U *)csrAddr) + csrOffset)) = (val)))
-/* CSR read macro */
-#define ICP_ADF_CSR_RD(csrAddr, csrOffset) \
- (*((volatile Cpa32U *)(((Cpa8U *)csrAddr) + csrOffset)))
+/*
+ * Force MMIO loads to remain 32-bit wide. GCC 16 may otherwise narrow a
+ * volatile 32-bit CSR read to a byte access when only one bit is tested,
+ * which breaks QAT mailbox CSRs that require DWORD transactions.
+ */
+static inline unsigned int icp_adf_csr_rd(void *csrAddr, unsigned int csrOffset)
+{
+ const volatile void *addr = ((char *)csrAddr) + csrOffset;
+ unsigned int val;
+
+ __asm__ __volatile__("movl (%1), %0" : "=r"(val) : "r"(addr) : "memory");
+
+ return val;
+}
+
+#define ICP_ADF_CSR_RD(csrAddr, csrOffset) icp_adf_csr_rd(csrAddr, csrOffset)
#endif /* ADF_PLATFORM_COMMON_H */
--
2.54.0