On the Zynq-7000, the lowest 512KiB of physical address space usually
contains RAM that is usable by the CPUs. However, many other bus
masters, such as the Ethernet and SDIO controllers, are not able to
access the 256KiB range that starts at physical address 0x40000.

So far I have used a device tree that says that RAM starts at 0x80000,
to avoid the DMA hole. This is unconventional, though. Typically the
memory node for Zynq-7000 specifies 0x0 as the starting address for RAM.

I think armv7 DMA constraint should be adjusted on the Zynq-7000 so that
less device tree customization would be needed.

This diff makes armv7 efiboot and kernel handle the
openbsd,dma-constraint device tree property, with a tweak for the Zynq.
The code is similar to what is already present on arm64 and riscv64.

OK?

Index: arch/armv7/armv7/armv7_machdep.c
===================================================================
RCS file: src/sys/arch/armv7/armv7/armv7_machdep.c,v
retrieving revision 1.63
diff -u -p -r1.63 armv7_machdep.c
--- arch/armv7/armv7/armv7_machdep.c    25 Mar 2021 04:12:01 -0000      1.63
+++ arch/armv7/armv7/armv7_machdep.c    4 Oct 2021 13:32:11 -0000
@@ -453,6 +453,12 @@ initarm(void *arg0, void *arg1, void *ar
                len = fdt_node_property(node, "openbsd,uefi-mmap-desc-ver", 
&prop);
                if (len == sizeof(mmap_desc_ver))
                        mmap_desc_ver = bemtoh32((uint32_t *)prop);
+
+               len = fdt_node_property(node, "openbsd,dma-constraint", &prop);
+               if (len == sizeof(uint64_t[2])) {
+                       dma_constraint.ucr_low = bemtoh64((uint64_t *)prop);
+                       dma_constraint.ucr_high = bemtoh64((uint64_t *)prop + 
1);
+               }
        }
 
        process_kernel_args();
Index: arch/armv7/stand/efiboot/conf.c
===================================================================
RCS file: src/sys/arch/armv7/stand/efiboot/conf.c,v
retrieving revision 1.31
diff -u -p -r1.31 conf.c
--- arch/armv7/stand/efiboot/conf.c     10 Jun 2021 22:17:58 -0000      1.31
+++ arch/armv7/stand/efiboot/conf.c     4 Oct 2021 13:32:11 -0000
@@ -42,7 +42,7 @@
 #include "efidev.h"
 #include "efipxe.h"
 
-const char version[] = "1.18";
+const char version[] = "1.19";
 int    debug = 0;
 
 struct fs_ops file_system[] = {
Index: arch/armv7/stand/efiboot/efiboot.c
===================================================================
RCS file: src/sys/arch/armv7/stand/efiboot/efiboot.c,v
retrieving revision 1.34
diff -u -p -r1.34 efiboot.c
--- arch/armv7/stand/efiboot/efiboot.c  7 Jun 2021 21:18:31 -0000       1.34
+++ arch/armv7/stand/efiboot/efiboot.c  4 Oct 2021 13:32:11 -0000
@@ -435,6 +435,28 @@ efi_framebuffer(void)
            sizeof(framebuffer_path));
 }
 
+uint64_t dma_constraint[2] = { 0, -1 };
+
+void
+efi_dma_constraint(void)
+{
+       void *node;
+
+       /* Raspberry Pi 4 is "special". */
+       node = fdt_find_node("/");
+       if (fdt_node_is_compatible(node, "brcm,bcm2711"))
+               dma_constraint[1] = htobe64(0x3bffffff);
+
+       /* Not all bus masters can access 0x40000-0x7ffff on Zynq-7000. */
+       if (fdt_node_is_compatible(node, "xlnx,zynq-7000"))
+               dma_constraint[0] = htobe64(0x00080000);
+
+       /* Pass DMA constraint. */
+       node = fdt_find_node("/chosen");
+       fdt_node_add_property(node, "openbsd,dma-constraint",
+           dma_constraint, sizeof(dma_constraint));
+}
+
 void
 efi_console(void)
 {
@@ -515,6 +537,7 @@ efi_makebootargs(char *bootargs, int how
 
        efi_framebuffer();
        efi_console();
+       efi_dma_constraint();
 
        fdt_finalize();
 

Reply via email to