Module Name:    src
Committed By:   rin
Date:           Tue Dec  1 04:15:04 UTC 2020

Modified Files:
        src/sys/arch/arm/broadcom: bcm2835_dmac.h bcm2835_emmc.c
            bcm2835_sdhost.c

Log Message:
Data written to bcmdmac(4) should be in little-endian.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/broadcom/bcm2835_dmac.h
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/arm/broadcom/bcm2835_emmc.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/broadcom/bcm2835_sdhost.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/broadcom/bcm2835_dmac.h
diff -u src/sys/arch/arm/broadcom/bcm2835_dmac.h:1.4 src/sys/arch/arm/broadcom/bcm2835_dmac.h:1.5
--- src/sys/arch/arm/broadcom/bcm2835_dmac.h:1.4	Sun Aug  9 13:06:44 2015
+++ src/sys/arch/arm/broadcom/bcm2835_dmac.h	Tue Dec  1 04:15:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_dmac.h,v 1.4 2015/08/09 13:06:44 mlelstv Exp $ */
+/* $NetBSD: bcm2835_dmac.h,v 1.5 2020/12/01 04:15:04 rin Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -29,6 +29,8 @@
 #ifndef BCM2835_DMAC_H
 #define BCM2835_DMAC_H
 
+#include <sys/endian.h>
+
 #define DMAC_CS(n)		(0x00 + (0x100 * (n)))
 #define  DMAC_CS_RESET		__BIT(31)
 #define  DMAC_CS_ABORT		__BIT(30)
@@ -62,6 +64,9 @@
 #define  DMAC_DEBUG_FIFO_ERROR	__BIT(1)
 #define  DMAC_DEBUG_READ_LAST_NOT_SET_ERROR __BIT(0)
 
+/*
+ * Byte-order is little endain.
+ */
 struct bcm_dmac_conblk {
 	uint32_t	cb_ti;
 #define DMAC_TI_NO_WIDE_BURSTS	__BIT(26)
@@ -108,5 +113,16 @@ void bcm_dmac_set_conblk_addr(struct bcm
 int bcm_dmac_transfer(struct bcm_dmac_channel *);
 void bcm_dmac_halt(struct bcm_dmac_channel *);
 
+static inline void
+bcm_dmac_swap_conblk(struct bcm_dmac_conblk *conblk)
+{
+
+	HTOLE32(conblk->cb_ti);
+	HTOLE32(conblk->cb_source_ad);
+	HTOLE32(conblk->cb_dest_ad);
+	HTOLE32(conblk->cb_txfr_len);
+	HTOLE32(conblk->cb_stride);
+	HTOLE32(conblk->cb_nextconbk);
+}
 
 #endif /* !BCM2835_DMAC_H */

Index: src/sys/arch/arm/broadcom/bcm2835_emmc.c
diff -u src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.38 src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.39
--- src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.38	Fri Aug 28 13:13:55 2020
+++ src/sys/arch/arm/broadcom/bcm2835_emmc.c	Tue Dec  1 04:15:04 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_emmc.c,v 1.38 2020/08/28 13:13:55 skrll Exp $	*/
+/*	$NetBSD: bcm2835_emmc.c,v 1.39 2020/12/01 04:15:04 rin Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.38 2020/08/28 13:13:55 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.39 2020/12/01 04:15:04 rin Exp $");
 
 #include "bcmdmac.h"
 
@@ -327,6 +327,7 @@ bcmemmc_xfer_data_dma(struct sdhc_softc 
 			    sc->sc_dmamap->dm_segs[0].ds_addr +
 			    sizeof(struct bcm_dmac_conblk) * (seg+1);
 		}
+		bcm_dmac_swap_conblk(&sc->sc_cblk[seg]);
 		sc->sc_cblk[seg].cb_padding[0] = 0;
 		sc->sc_cblk[seg].cb_padding[1] = 0;
 	}

Index: src/sys/arch/arm/broadcom/bcm2835_sdhost.c
diff -u src/sys/arch/arm/broadcom/bcm2835_sdhost.c:1.5 src/sys/arch/arm/broadcom/bcm2835_sdhost.c:1.6
--- src/sys/arch/arm/broadcom/bcm2835_sdhost.c:1.5	Sun May 31 23:52:19 2020
+++ src/sys/arch/arm/broadcom/bcm2835_sdhost.c	Tue Dec  1 04:15:04 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_sdhost.c,v 1.5 2020/05/31 23:52:19 thorpej Exp $ */
+/* $NetBSD: bcm2835_sdhost.c,v 1.6 2020/12/01 04:15:04 rin Exp $ */
 
 /*-
  * Copyright (c) 2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_sdhost.c,v 1.5 2020/05/31 23:52:19 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_sdhost.c,v 1.6 2020/12/01 04:15:04 rin Exp $");
 
 #include "bcmdmac.h"
 
@@ -397,6 +397,7 @@ sdhost_dma_transfer(struct sdhost_softc 
 			    sc->sc_dmamap->dm_segs[0].ds_addr +
 			    sizeof(struct bcm_dmac_conblk) * (seg+1);
 		}
+		bcm_dmac_swap_conblk(&sc->sc_cblk[seg]);
 		sc->sc_cblk[seg].cb_padding[0] = 0;
 		sc->sc_cblk[seg].cb_padding[1] = 0;
 	}

Reply via email to