[PATCH] fpga: zynqmp: Make word align the configuration data

From: Nava kishore Manne
Date: Tue Mar 14 2023 - 05:42:41 EST


To avoid unwanted copies at firmware(PMUFW) this patch provides a fix
to align programmable logic(PL) configuration data if the data is not
word-aligned. To align the configuration data this patch adds a few
padding bytes and these additional padding bytes will not create any
functional impact on the PL configuration.

Signed-off-by: Nava kishore Manne <nava.kishore.manne@xxxxxxx>
---
drivers/fpga/zynqmp-fpga.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/fpga/zynqmp-fpga.c b/drivers/fpga/zynqmp-fpga.c
index c60f20949c47..70a12dc6e15c 100644
--- a/drivers/fpga/zynqmp-fpga.c
+++ b/drivers/fpga/zynqmp-fpga.c
@@ -15,6 +15,9 @@
/* Constant Definitions */
#define IXR_FPGA_DONE_MASK BIT(3)

+#define DUMMY_PAD_BYTE 0xFF
+#define FPGA_WORD_SIZE 4
+
/**
* struct zynqmp_fpga_priv - Private data structure
* @dev: Device data structure
@@ -41,18 +44,26 @@ static int zynqmp_fpga_ops_write(struct fpga_manager *mgr,
const char *buf, size_t size)
{
struct zynqmp_fpga_priv *priv;
+ int word_align, ret, index;
dma_addr_t dma_addr;
u32 eemi_flags = 0;
char *kbuf;
- int ret;

priv = mgr->priv;
+ word_align = size % FPGA_WORD_SIZE;
+ if (word_align)
+ word_align = FPGA_WORD_SIZE - word_align;
+
+ size = size + word_align;

kbuf = dma_alloc_coherent(priv->dev, size, &dma_addr, GFP_KERNEL);
if (!kbuf)
return -ENOMEM;

- memcpy(kbuf, buf, size);
+ for (index = 0; index < word_align; index++)
+ kbuf[index] = DUMMY_PAD_BYTE;
+
+ memcpy(&kbuf[index], buf, size - index);

wmb(); /* ensure all writes are done before initiate FW call */

--
2.25.1