From: Michael Tretter <m.tretter@pengutronix.de> To: barebox@lists.infradead.org Cc: lst@pengutronix.de Subject: [PATCH v2 3/3] firmware: zynqmp-fpga: do not use DMA coherent memory for bitstream Date: Thu, 19 Aug 2021 10:12:51 +0200 Message-ID: <20210819081251.726840-4-m.tretter@pengutronix.de> (raw) In-Reply-To: <20210819081251.726840-1-m.tretter@pengutronix.de> Trying to do unaligned access of coherent memory on AArch64 will lead to an abort. This can happen when the FPGA loader copies the bitstream to the temporary buffer for the transfer to the FPGA. Convert the driver to use regular memory for the temporary buffer to prevent the issue. Signed-off-by: Michael Tretter <m.tretter@pengutronix.de> --- Changelog: v2: - drop dma_sync_single_for_device and use dma_map_single to flush - fix missing free of DMA memory in case of mapping error - use size_of(buf_size) to clarify extra space in buffer --- drivers/firmware/zynqmp-fpga.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/firmware/zynqmp-fpga.c b/drivers/firmware/zynqmp-fpga.c index 667910479aa7..b76607f7eec1 100644 --- a/drivers/firmware/zynqmp-fpga.c +++ b/drivers/firmware/zynqmp-fpga.c @@ -203,7 +203,7 @@ static int fpgamgr_program_finish(struct firmware_handler *fh) size_t body_length; int header_length = 0; enum xilinx_byte_order byte_order; - u64 addr; + dma_addr_t addr; int status = 0; u8 flags = ZYNQMP_FPGA_BIT_ONLY_BIN; @@ -237,11 +237,10 @@ static int fpgamgr_program_finish(struct firmware_handler *fh) /* * The PMU FW variants without the ZYNQMP_PM_FEATURE_SIZE_NOT_NEEDED * feature expect a pointer to the bitstream size, which is stored in - * memory. Allocate some extra space at the end of the buffer for the + * memory. Allocate extra space at the end of the buffer for the * bitstream size. */ - buf_aligned = dma_alloc_coherent(body_length + sizeof(buf_size), - DMA_ADDRESS_BROKEN); + buf_aligned = dma_alloc(body_length + sizeof(buf_size)); if (!buf_aligned) { status = -ENOBUFS; goto err_free; @@ -254,8 +253,6 @@ static int fpgamgr_program_finish(struct firmware_handler *fh) else memcpy((u32 *)buf_aligned, body, body_length); - addr = (u64)buf_aligned; - if (mgr->features & ZYNQMP_PM_FEATURE_SIZE_NOT_NEEDED) { buf_size = body_length; } else { @@ -263,11 +260,21 @@ static int fpgamgr_program_finish(struct firmware_handler *fh) buf_size = addr + body_length; } - status = mgr->eemi_ops->fpga_load(addr, buf_size, flags); + addr = dma_map_single(&mgr->dev, buf_aligned, + body_length + sizeof(buf_size), DMA_TO_DEVICE); + if (dma_mapping_error(&mgr->dev, addr)) { + status = -EFAULT; + goto err_free_dma; + } + + status = mgr->eemi_ops->fpga_load((u64)addr, buf_size, flags); + dma_unmap_single(&mgr->dev, addr, body_length + sizeof(buf_size), + DMA_TO_DEVICE); if (status < 0) dev_err(&mgr->dev, "unable to load fpga\n"); - dma_free_coherent(buf_aligned, 0, body_length + sizeof(buf_size)); +err_free_dma: + dma_free(buf_aligned); err_free: free(mgr->buf); -- 2.30.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2021-08-19 8:14 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-08-19 8:12 [PATCH v2 0/3] firmware: zynqmp-fpga: fix fpga loading with optimized string functions Michael Tretter 2021-08-19 8:12 ` [PATCH v2 1/3] firmware: zynqmp-fpga: initialize flags at function start Michael Tretter 2021-08-19 8:12 ` [PATCH v2 2/3] firmware: zynqmp-fpga: avoid additional buffer for size argument Michael Tretter 2021-08-19 8:12 ` Michael Tretter [this message] 2021-08-23 13:51 ` [PATCH v2 0/3] firmware: zynqmp-fpga: fix fpga loading with optimized string functions Sascha Hauer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210819081251.726840-4-m.tretter@pengutronix.de \ --to=m.tretter@pengutronix.de \ --cc=barebox@lists.infradead.org \ --cc=lst@pengutronix.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
mail archive of the barebox mailing list This inbox may be cloned and mirrored by anyone: git clone --mirror https://lore.barebox.org/barebox/0 barebox/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 barebox barebox/ https://lore.barebox.org/barebox \ barebox@lists.infradead.org barebox@lists.infradead.org public-inbox-index barebox Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git