Merge branch '2020-05-18-reduce-size-of-common.h'
[oweals/u-boot.git] / arch / arm / mach-bcm283x / mbox.c
index 3b17a31eacfd6e5ab092e53bca87c4d0d408ca92..da9faafe1ddc64d21bf6354f4684d7a7b89e023a 100644 (file)
@@ -1,12 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2012 Stephen Warren
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <cpu_func.h>
+#include <log.h>
+#include <asm/cache.h>
 #include <asm/io.h>
+#include <asm/arch/base.h>
 #include <asm/arch/mbox.h>
+#include <phys2bus.h>
 
 #define TIMEOUT 1000 /* ms */
 
@@ -27,7 +31,7 @@ int bcm2835_mbox_call_raw(u32 chan, u32 send, u32 *recv)
        /* Drain any stale responses */
 
        for (;;) {
-               val = readl(&regs->status);
+               val = readl(&regs->mail0_status);
                if (val & BCM2835_MBOX_STATUS_RD_EMPTY)
                        break;
                if (get_timer(0) >= endtime) {
@@ -40,7 +44,7 @@ int bcm2835_mbox_call_raw(u32 chan, u32 send, u32 *recv)
        /* Wait for space to send */
 
        for (;;) {
-               val = readl(&regs->status);
+               val = readl(&regs->mail1_status);
                if (!(val & BCM2835_MBOX_STATUS_WR_FULL))
                        break;
                if (get_timer(0) >= endtime) {
@@ -58,7 +62,7 @@ int bcm2835_mbox_call_raw(u32 chan, u32 send, u32 *recv)
        /* Wait for the response */
 
        for (;;) {
-               val = readl(&regs->status);
+               val = readl(&regs->mail0_status);
                if (!(val & BCM2835_MBOX_STATUS_RD_EMPTY))
                        break;
                if (get_timer(0) >= endtime) {
@@ -110,10 +114,21 @@ int bcm2835_mbox_call_prop(u32 chan, struct bcm2835_mbox_hdr *buffer)
        dump_buf(buffer);
 #endif
 
-       ret = bcm2835_mbox_call_raw(chan, (u32)buffer, &rbuffer);
+       flush_dcache_range((unsigned long)buffer,
+                          (unsigned long)((void *)buffer +
+                          roundup(buffer->buf_size, ARCH_DMA_MINALIGN)));
+
+       ret = bcm2835_mbox_call_raw(chan,
+                                   phys_to_bus((unsigned long)buffer),
+                                   &rbuffer);
        if (ret)
                return ret;
-       if (rbuffer != (u32)buffer) {
+
+       invalidate_dcache_range((unsigned long)buffer,
+                               (unsigned long)((void *)buffer +
+                               roundup(buffer->buf_size, ARCH_DMA_MINALIGN)));
+
+       if (rbuffer != phys_to_bus((unsigned long)buffer)) {
                printf("mbox: Response buffer mismatch\n");
                return -1;
        }