Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F110451867
D22906.id65919.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
11 KB
Referenced Files
None
Subscribers
None
D22906.id65919.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D22906: Simplify busdma tag creation
Attached
Detach File
Event Timeline
Log In to Comment