firmware: raspberrypi: Use correct device for DMA mappings
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 26 Mar 2024 19:58:06 +0000 (21:58 +0200)
committerFlorian Fainelli <florian.fainelli@broadcom.com>
Thu, 4 Apr 2024 16:49:20 +0000 (09:49 -0700)
The buffer used to transfer data over the mailbox interface is mapped
using the client's device. This is incorrect, as the device performing
the DMA transfer is the mailbox itself. Fix it by using the mailbox
controller device instead.

This requires including the mailbox_controller.h header to dereference
the mbox_chan and mbox_controller structures. The header is not meant to
be included by clients. This could be fixed by extending the client API
with a function to access the controller's device.

Fixes: 4e3d60656a72 ("ARM: bcm2835: Add the Raspberry Pi firmware driver")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Stefan Wahren <wahrenst@gmx.net>
Tested-by: Ivan T. Ivanov <iivanov@suse.de>
Link: https://lore.kernel.org/r/20240326195807.15163-3-laurent.pinchart@ideasonboard.com
Signed-off-by: Florian Fainelli <florian.fainelli@broadcom.com>
drivers/firmware/raspberrypi.c

index 322aada20f7421fea3a8d4ca6d95d81a2e897619..ac34876a97f8b046bc177437118b9c94db580cc7 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/kref.h>
 #include <linux/mailbox_client.h>
+#include <linux/mailbox_controller.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
@@ -97,8 +98,8 @@ int rpi_firmware_property_list(struct rpi_firmware *fw,
        if (size & 3)
                return -EINVAL;
 
-       buf = dma_alloc_coherent(fw->cl.dev, PAGE_ALIGN(size), &bus_addr,
-                                GFP_ATOMIC);
+       buf = dma_alloc_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size),
+                                &bus_addr, GFP_ATOMIC);
        if (!buf)
                return -ENOMEM;
 
@@ -126,7 +127,7 @@ int rpi_firmware_property_list(struct rpi_firmware *fw,
                ret = -EINVAL;
        }
 
-       dma_free_coherent(fw->cl.dev, PAGE_ALIGN(size), buf, bus_addr);
+       dma_free_coherent(fw->chan->mbox->dev, PAGE_ALIGN(size), buf, bus_addr);
 
        return ret;
 }