svn commit: r349466 - in head/sys: conf dev/altera/msgdma mips/conf
Ruslan Bukin
br at FreeBSD.org
Thu Jun 27 18:08:20 UTC 2019
Author: br
Date: Thu Jun 27 18:08:18 2019
New Revision: 349466
URL: https://svnweb.freebsd.org/changeset/base/349466
Log:
Add support for extended descriptor format to Altera mSGDMA driver.
The format to use depends on hardware configuration (synthesis-time),
so make it compile-time kernel option.
Extended format allows DMA engine to operate with 64-bit memory addresses.
Sponsored by: DARPA, AFRL
Modified:
head/sys/conf/options
head/sys/dev/altera/msgdma/msgdma.c
head/sys/dev/altera/msgdma/msgdma.h
head/sys/mips/conf/BERI_DE4_BASE
Modified: head/sys/conf/options
==============================================================================
--- head/sys/conf/options Thu Jun 27 17:59:15 2019 (r349465)
+++ head/sys/conf/options Thu Jun 27 18:08:18 2019 (r349466)
@@ -861,6 +861,12 @@ AH_INTERRUPT_DEBUGGING opt_ah.h
# XXX do not use this for AR9130
AH_AR5416_INTERRUPT_MITIGATION opt_ah.h
+# options for the Altera mSGDMA driver (altera_msgdma)
+ALTERA_MSGDMA_DESC_STD opt_altera_msgdma.h
+ALTERA_MSGDMA_DESC_EXT opt_altera_msgdma.h
+ALTERA_MSGDMA_DESC_PF_STD opt_altera_msgdma.h
+ALTERA_MSGDMA_DESC_PF_EXT opt_altera_msgdma.h
+
# options for the Broadcom BCM43xx driver (bwi)
BWI_DEBUG opt_bwi.h
BWI_DEBUG_VERBOSE opt_bwi.h
Modified: head/sys/dev/altera/msgdma/msgdma.c
==============================================================================
--- head/sys/dev/altera/msgdma/msgdma.c Thu Jun 27 17:59:15 2019 (r349465)
+++ head/sys/dev/altera/msgdma/msgdma.c Thu Jun 27 18:08:18 2019 (r349466)
@@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
#include <dev/xdma/xdma.h>
#include "xdma_if.h"
+#include "opt_altera_msgdma.h"
#include <dev/altera/msgdma/msgdma.h>
@@ -470,8 +471,8 @@ msgdma_channel_submit_sg(device_t dev, struct xdma_cha
struct msgdma_channel *chan;
struct msgdma_desc *desc;
struct msgdma_softc *sc;
- uint32_t src_addr_lo;
- uint32_t dst_addr_lo;
+ bus_addr_t src_addr_lo;
+ bus_addr_t dst_addr_lo;
uint32_t len;
uint32_t tmp;
int i;
@@ -481,14 +482,18 @@ msgdma_channel_submit_sg(device_t dev, struct xdma_cha
chan = (struct msgdma_channel *)xchan->chan;
for (i = 0; i < sg_n; i++) {
- src_addr_lo = (uint32_t)sg[i].src_addr;
- dst_addr_lo = (uint32_t)sg[i].dst_addr;
+ src_addr_lo = sg[i].src_addr;
+ dst_addr_lo = sg[i].dst_addr;
len = (uint32_t)sg[i].len;
dprintf("%s: src %x dst %x len %d\n", __func__,
src_addr_lo, dst_addr_lo, len);
desc = chan->descs[chan->idx_head];
+#if defined(ALTERA_MSGDMA_DESC_EXT) || defined(ALTERA_MSGDMA_DESC_PF_EXT)
+ desc->read_hi = htole32(src_addr_lo >> 32);
+ desc->write_hi = htole32(dst_addr_lo >> 32);
+#endif
desc->read_lo = htole32(src_addr_lo);
desc->write_lo = htole32(dst_addr_lo);
desc->length = htole32(len);
Modified: head/sys/dev/altera/msgdma/msgdma.h
==============================================================================
--- head/sys/dev/altera/msgdma/msgdma.h Thu Jun 27 17:59:15 2019 (r349465)
+++ head/sys/dev/altera/msgdma/msgdma.h Thu Jun 27 18:08:18 2019 (r349466)
@@ -30,6 +30,8 @@
* $FreeBSD$
*/
+#include "opt_altera_msgdma.h"
+
/* Altera mSGDMA registers. */
#define DMA_STATUS 0x00
#define STATUS_RESETTING (1 << 6)
@@ -75,22 +77,74 @@
#define WRITE4_DESC(_sc, _reg, _val) \
bus_space_write_4(_sc->bst_d, _sc->bsh_d, _reg, htole32(_val))
-/* Prefetcher-disabled descriptor format. */
-struct msgdma_desc_nonpf {
- uint32_t src_addr;
- uint32_t dst_addr;
+#if defined(ALTERA_MSGDMA_DESC_STD)
+
+/* Standard descriptor format with prefetcher disabled. */
+struct msgdma_desc {
+ uint32_t read_lo;
+ uint32_t write_lo;
uint32_t length;
uint32_t control;
};
-/* Prefetcher-enabled descriptor format. */
+#elif defined(ALTERA_MSGDMA_DESC_EXT)
+
+/* Extended descriptor format with prefetcher disabled. */
struct msgdma_desc {
uint32_t read_lo;
uint32_t write_lo;
uint32_t length;
+ uint8_t write_burst;
+ uint8_t read_burst;
+ uint16_t seq_num;
+ uint16_t write_stride;
+ uint16_t read_stride;
+ uint32_t read_hi;
+ uint32_t write_hi;
+ uint32_t control;
+};
+
+#elif defined(ALTERA_MSGDMA_DESC_PF_STD)
+
+/* Standard descriptor format with prefetcher enabled. */
+struct msgdma_desc {
+ uint32_t read_lo;
+ uint32_t write_lo;
+ uint32_t length;
uint32_t next;
uint32_t transferred;
uint32_t status;
uint32_t reserved;
uint32_t control;
};
+
+#elif defined(ALTERA_MSGDMA_DESC_PF_EXT)
+
+/* Extended descriptor format with prefetcher enabled. */
+struct msgdma_desc {
+ uint32_t read_lo;
+ uint32_t write_lo;
+ uint32_t length;
+ uint32_t next;
+ uint32_t transferred;
+ uint32_t status;
+ uint32_t reserved;
+ uint8_t write_burst;
+ uint8_t read_burst;
+ uint16_t seq_num;
+ uint16_t write_stride;
+ uint16_t read_stride;
+ uint32_t read_hi;
+ uint32_t write_hi;
+ uint32_t next_hi;
+ uint32_t reserved1;
+ uint32_t reserved2;
+ uint32_t reserved3;
+ uint32_t control;
+};
+
+#else
+
+#error "mSGDMA descriptor format (kernel option) is not set."
+
+#endif
Modified: head/sys/mips/conf/BERI_DE4_BASE
==============================================================================
--- head/sys/mips/conf/BERI_DE4_BASE Thu Jun 27 17:59:15 2019 (r349465)
+++ head/sys/mips/conf/BERI_DE4_BASE Thu Jun 27 18:08:18 2019 (r349466)
@@ -44,6 +44,7 @@ options DEVICE_POLLING
#
# DMA support
#
+options ALTERA_MSGDMA_DESC_PF_STD
device xdma
device altera_softdma
device altera_msgdma
More information about the svn-src-head
mailing list