Page MenuHomeFreeBSD

D22906.id65919.diff
No OneTemporary

D22906.id65919.diff

Index: sys/dev/mpr/mpr.c
===================================================================
--- sys/dev/mpr/mpr.c
+++ sys/dev/mpr/mpr.c
@@ -1311,6 +1311,7 @@
static int
mpr_alloc_hw_queues(struct mpr_softc *sc)
{
+ struct dma_tag_template t;
bus_addr_t queues_busaddr;
uint8_t *queues;
int qsize, fqsize, pqsize;
@@ -1332,17 +1333,12 @@
pqsize = sc->pqdepth * 8;
qsize = fqsize + pqsize;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 16, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- qsize, /* maxsize */
- 1, /* nsegments */
- qsize, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->queues_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.alignment = 16;
+ t.lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ t.maxsize = t.maxsegsize = qsize;
+ t.nsegments = 1;
+ if (bus_dma_tag_simple(&t, &sc->queues_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate queues DMA tag\n");
return (ENOMEM);
}
@@ -1370,6 +1366,7 @@
static int
mpr_alloc_replies(struct mpr_softc *sc)
{
+ struct dma_tag_template t;
int rsize, num_replies;
/* Store the reply frame size in bytes rather than as 32bit words */
@@ -1383,17 +1380,12 @@
num_replies = max(sc->fqdepth, sc->num_replies);
rsize = sc->replyframesz * num_replies;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 4, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- rsize, /* maxsize */
- 1, /* nsegments */
- rsize, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->reply_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.alignment = 4;
+ t.lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ t.maxsize = t.maxsegsize = rsize;
+ t.nsegments = 1;
+ if (bus_dma_tag_simple(&t, &sc->reply_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate replies DMA tag\n");
return (ENOMEM);
}
@@ -1440,21 +1432,17 @@
static int
mpr_alloc_requests(struct mpr_softc *sc)
{
+ struct dma_tag_template t;
struct mpr_command *cm;
int i, rsize, nsegs;
rsize = sc->reqframesz * sc->num_reqs;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 16, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- rsize, /* maxsize */
- 1, /* nsegments */
- rsize, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->req_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.alignment = 16;
+ t.lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ t.maxsize = t.maxsegsize = rsize;
+ t.nsegments = 1;
+ if (bus_dma_tag_simple(&t, &sc->req_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate request DMA tag\n");
return (ENOMEM);
}
@@ -1476,17 +1464,11 @@
return (ENOMEM);
}
rsize = sc->chain_frame_size * sc->num_chains;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 16, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- rsize, /* maxsize */
- howmany(rsize, PAGE_SIZE), /* nsegments */
- rsize, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->chain_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.alignment = 16;
+ t.maxsize = t.maxsegsize = rsize;
+ t.nsegments = howmany(rsize, PAGE_SIZE);
+ if (bus_dma_tag_simple(&t, &sc->chain_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate chain DMA tag\n");
return (ENOMEM);
}
@@ -1504,17 +1486,11 @@
}
rsize = MPR_SENSE_LEN * sc->num_reqs;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 1, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- rsize, /* maxsize */
- 1, /* nsegments */
- rsize, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->sense_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ t.maxsize = t.maxsegsize = rsize;
+ t.nsegments = 1;
+ if (bus_dma_tag_simple(&t, &sc->sense_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate sense DMA tag\n");
return (ENOMEM);
}
@@ -1540,18 +1516,12 @@
}
nsegs = (sc->maxio / PAGE_SIZE) + 1;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 1, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- BUS_SPACE_MAXSIZE_32BIT,/* maxsize */
- nsegs, /* nsegments */
- BUS_SPACE_MAXSIZE_32BIT,/* maxsegsize */
- BUS_DMA_ALLOCNOW, /* flags */
- busdma_lock_mutex, /* lockfunc */
- &sc->mpr_mtx, /* lockarg */
- &sc->buffer_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.nsegments = nsegs;
+ t.flags = BUS_DMA_ALLOCNOW;
+ t.lockfunc = busdma_lock_mutex;
+ t.lockfuncarg = &sc->mpr_mtx;
+ if (bus_dma_tag_simple(&t, &sc->buffer_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate buffer DMA tag\n");
return (ENOMEM);
}
@@ -1608,9 +1578,10 @@
static int
mpr_alloc_nvme_prp_pages(struct mpr_softc *sc)
{
+ struct dma_tag_template t;
+ struct mpr_prp_page *prp_page;
int PRPs_per_page, PRPs_required, pages_required;
int rsize, i;
- struct mpr_prp_page *prp_page;
/*
* Assuming a MAX_IO_SIZE of 1MB and a PAGE_SIZE of 4k, the max number
@@ -1637,17 +1608,12 @@
sc->prp_buffer_size = PAGE_SIZE * pages_required;
rsize = sc->prp_buffer_size * NVME_QDEPTH;
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 4, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- rsize, /* maxsize */
- 1, /* nsegments */
- rsize, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->prp_page_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.alignment = 4;
+ t.lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ t.maxsize = t.maxsegsize = rsize;
+ t.nsegments = 1;
+ if (bus_dma_tag_simple(&t, &sc->prp_page_dmat)) {
mpr_dprint(sc, MPR_ERROR, "Cannot allocate NVMe PRP DMA "
"tag\n");
return (ENOMEM);
Index: sys/dev/mpr/mpr_pci.c
===================================================================
--- sys/dev/mpr/mpr_pci.c
+++ sys/dev/mpr/mpr_pci.c
@@ -220,6 +220,7 @@
static int
mpr_pci_attach(device_t dev)
{
+ struct dma_tag_template t;
struct mpr_softc *sc;
struct mpr_ident *m;
int error, i;
@@ -267,17 +268,8 @@
sc->mpr_bhandle = rman_get_bushandle(sc->mpr_regs_resource);
/* Allocate the parent DMA tag */
- if (bus_dma_tag_create( bus_get_dma_tag(dev), /* parent */
- 1, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- BUS_SPACE_MAXSIZE_32BIT,/* maxsize */
- BUS_SPACE_UNRESTRICTED, /* nsegments */
- BUS_SPACE_MAXSIZE_32BIT,/* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->mpr_parent_dmat)) {
+ bus_dma_tag_init(bus_get_dma_tag(dev), &t);
+ if (bus_dma_tag_simple(&t, &sc->mpr_parent_dmat)) {
mpr_printf(sc, "Cannot allocate parent DMA tag\n");
mpr_pci_free(sc);
return (ENOMEM);
Index: sys/dev/mpr/mpr_user.c
===================================================================
--- sys/dev/mpr/mpr_user.c
+++ sys/dev/mpr/mpr_user.c
@@ -1453,6 +1453,7 @@
uint32_t *return_code)
{
mpr_fw_diagnostic_buffer_t *pBuffer;
+ struct dma_tag_template t;
struct mpr_busdma_context *ctx;
uint8_t extended_type, buffer_type, i;
uint32_t buffer_size;
@@ -1514,17 +1515,11 @@
*return_code = MPR_FW_DIAG_ERROR_NO_BUFFER;
return (MPR_DIAG_FAILURE);
}
- if (bus_dma_tag_create( sc->mpr_parent_dmat, /* parent */
- 1, 0, /* algnmnt, boundary */
- BUS_SPACE_MAXADDR_32BIT,/* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- buffer_size, /* maxsize */
- 1, /* nsegments */
- buffer_size, /* maxsegsize */
- 0, /* flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->fw_diag_dmat)) {
+ bus_dma_tag_init(sc->mpr_parent_dmat, &t);
+ t.lowaddr = BUS_SPACE_MAXADDR_32BIT;
+ t.maxsize = t.maxsegsize = buffer_size;
+ t.nsegments = 1;
+ if (bus_dma_tag_simple(&t, &sc->fw_diag_dmat)) {
mpr_dprint(sc, MPR_ERROR,
"Cannot allocate FW diag buffer DMA tag\n");
*return_code = MPR_FW_DIAG_ERROR_NO_BUFFER;
Index: sys/sys/bus_dma.h
===================================================================
--- sys/sys/bus_dma.h
+++ sys/sys/bus_dma.h
@@ -179,6 +179,24 @@
bus_size_t maxsegsz, int flags, bus_dma_lock_t *lockfunc,
void *lockfuncarg, bus_dma_tag_t *dmat);
+struct dma_tag_template {
+ bus_dma_tag_t parent;
+ bus_size_t alignment;
+ bus_addr_t boundary;
+ bus_addr_t lowaddr;
+ bus_addr_t highaddr;
+ bus_dma_filter_t *filtfunc;
+ void *filtfuncarg;
+ bus_size_t maxsize;
+ int nsegments;
+ bus_size_t maxsegsize;
+ int flags;
+ bus_dma_lock_t *lockfunc;
+ void *lockfuncarg;
+};
+void bus_dma_tag_init(bus_dma_tag_t parent, struct dma_tag_template *t);
+int bus_dma_tag_simple(struct dma_tag_template *t, bus_dma_tag_t *dmat);
+
/*
* Set the memory domain to be used for allocations.
*
Index: sys/x86/x86/busdma_machdep.c
===================================================================
--- sys/x86/x86/busdma_machdep.c
+++ sys/x86/x86/busdma_machdep.c
@@ -238,6 +238,29 @@
return (error);
}
+void
+bus_dma_tag_init(bus_dma_tag_t parent, struct dma_tag_template *t)
+{
+ t->parent = parent;
+ t->alignment = 1;
+ t->boundary = 0;
+ t->lowaddr = t->highaddr = BUS_SPACE_MAXADDR;
+ t->filtfunc = t->filtfuncarg = t->lockfunc = t->lockfuncarg = NULL;
+ t->maxsize = t->maxsegsize = BUS_SPACE_MAXSIZE;
+ t->nsegments = BUS_SPACE_UNRESTRICTED;
+ t->flags = 0;
+}
+
+int
+bus_dma_tag_simple(struct dma_tag_template *t, bus_dma_tag_t *dmat)
+{
+
+ return (bus_dma_tag_create(t->parent, t->alignment, t->boundary,
+ t->lowaddr, t->highaddr, t->filtfunc, t->filtfuncarg, t->maxsize,
+ t->nsegments, t->maxsegsize, t->flags, t->lockfunc, t->lockfuncarg,
+ dmat));
+}
+
int
bus_dma_tag_destroy(bus_dma_tag_t dmat)
{

File Metadata

Mime Type
text/plain
Expires
Wed, Feb 19, 3:46 PM (16 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16723355
Default Alt Text
D22906.id65919.diff (11 KB)

Event Timeline