From f6b1c44d1f70d5f298b911f2c1dcd802b0d11339 Mon Sep 17 00:00:00 2001 From: Scott Long Date: Tue, 1 Jul 2003 15:52:06 +0000 Subject: Mega busdma API commit. Add two new arguments to bus_dma_tag_create(): lockfunc and lockfuncarg. Lockfunc allows a driver to provide a function for managing its locking semantics while using busdma. At the moment, this is used for the asynchronous busdma_swi and callback mechanism. Two lockfunc implementations are provided: busdma_lock_mutex() performs standard mutex operations on the mutex that is specified from lockfuncarg. dftl_lock() is a panic implementation and is defaulted to when NULL, NULL are passed to bus_dma_tag_create(). The only time that NULL, NULL should ever be used is when the driver ensures that bus_dmamap_load() will not be deferred. Drivers that do not provide their own locking can pass busdma_lock_mutex,&Giant args in order to preserve the former behaviour. sparc64 and powerpc do not provide real busdma_swi functions, so this is largely a noop on those platforms. The busdma_swi on is64 is not properly locked yet, so warnings will be emitted on this platform when busdma callback deferrals happen. If anyone gets panics or warnings from dflt_lock() being called, please let me know right away. Reviewed by: tmm, gibbs --- sys/dev/advansys/adv_eisa.c | 8 ++++++++ sys/dev/advansys/adv_isa.c | 6 ++++++ sys/dev/advansys/adv_pci.c | 6 ++++++ sys/dev/advansys/advansys.c | 6 ++++++ sys/dev/advansys/adw_pci.c | 4 ++++ sys/dev/advansys/adwcam.c | 10 ++++++++++ 6 files changed, 40 insertions(+) (limited to 'sys/dev/advansys') diff --git a/sys/dev/advansys/adv_eisa.c b/sys/dev/advansys/adv_eisa.c index 4884317a5c63a..aba0f7dd516c7 100644 --- a/sys/dev/advansys/adv_eisa.c +++ b/sys/dev/advansys/adv_eisa.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include @@ -183,6 +185,8 @@ adv_eisa_attach(device_t dev) /* nsegments */ ~0, /* maxsegsz */ ADV_EISA_MAX_DMA_COUNT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adv_b->parent_dmat); if (error != 0) { @@ -221,6 +225,8 @@ adv_eisa_attach(device_t dev) /* nsegments */ ~0, /* maxsegsz */ ADV_EISA_MAX_DMA_COUNT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adv->parent_dmat); if (error != 0) { @@ -252,6 +258,8 @@ adv_eisa_attach(device_t dev) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &overrun_dmat) != 0) { adv_free(adv); goto bad; diff --git a/sys/dev/advansys/adv_isa.c b/sys/dev/advansys/adv_isa.c index e8eca4ea5f157..fdeafc223fa6c 100644 --- a/sys/dev/advansys/adv_isa.c +++ b/sys/dev/advansys/adv_isa.c @@ -50,6 +50,8 @@ #include #include #include +#include +#include #include #include @@ -230,6 +232,8 @@ adv_isa_probe(device_t dev) /* nsegments */ ~0, /* maxsegsz */ maxsegsz, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adv->parent_dmat); if (error != 0) { @@ -256,6 +260,8 @@ adv_isa_probe(device_t dev) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ NULL, + /* lockarg */ NULL, &overrun_dmat) != 0) { adv_free(adv); bus_release_resource(dev, SYS_RES_IOPORT, 0, diff --git a/sys/dev/advansys/adv_pci.c b/sys/dev/advansys/adv_pci.c index 0891f48b8fd50..1719972b7df0a 100644 --- a/sys/dev/advansys/adv_pci.c +++ b/sys/dev/advansys/adv_pci.c @@ -63,6 +63,8 @@ #include #include #include +#include +#include #include #include @@ -197,6 +199,8 @@ adv_pci_attach(device_t dev) /* nsegments */ ~0, /* maxsegsz */ ADV_PCI_MAX_DMA_COUNT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adv->parent_dmat); if (error != 0) { @@ -223,6 +227,8 @@ adv_pci_attach(device_t dev) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &overrun_dmat) != 0) { bus_dma_tag_destroy(adv->parent_dmat); adv_free(adv); diff --git a/sys/dev/advansys/advansys.c b/sys/dev/advansys/advansys.c index 3a50c3e6ad12d..b581625e9c609 100644 --- a/sys/dev/advansys/advansys.c +++ b/sys/dev/advansys/advansys.c @@ -51,6 +51,8 @@ #include #include #include +#include +#include #include #include @@ -1331,6 +1333,8 @@ adv_attach(adv) /* nsegments */ max_sg, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ BUS_DMA_ALLOCNOW, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adv->buffer_dmat) != 0) { return (ENXIO); } @@ -1350,6 +1354,8 @@ adv_attach(adv) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adv->sense_dmat) != 0) { return (ENXIO); } diff --git a/sys/dev/advansys/adw_pci.c b/sys/dev/advansys/adw_pci.c index b843005a5d6a7..c0ed43667c02c 100644 --- a/sys/dev/advansys/adw_pci.c +++ b/sys/dev/advansys/adw_pci.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include @@ -268,6 +270,8 @@ adw_pci_attach(device_t dev) /* nsegments */ ~0, /* maxsegsz */ ADW_PCI_MAX_DMA_COUNT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adw->parent_dmat); adw->init_level++; diff --git a/sys/dev/advansys/adwcam.c b/sys/dev/advansys/adwcam.c index 74bd9ceb0c939..aedf3b32e37a5 100644 --- a/sys/dev/advansys/adwcam.c +++ b/sys/dev/advansys/adwcam.c @@ -49,6 +49,8 @@ #include #include #include +#include +#include #include #include @@ -1022,6 +1024,8 @@ adw_init(struct adw_softc *adw) /* nsegments */ ADW_SGSIZE, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ BUS_DMA_ALLOCNOW, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adw->buffer_dmat) != 0) { return (ENOMEM); } @@ -1043,6 +1047,8 @@ adw_init(struct adw_softc *adw) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adw->carrier_dmat) != 0) { return (ENOMEM); } @@ -1102,6 +1108,8 @@ adw_init(struct adw_softc *adw) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adw->acb_dmat) != 0) { return (ENOMEM); } @@ -1137,6 +1145,8 @@ adw_init(struct adw_softc *adw) /* nsegments */ 1, /* maxsegsz */ BUS_SPACE_MAXSIZE_32BIT, /* flags */ 0, + /* lockfunc */ busdma_lock_mutex, + /* lockarg */ &Giant, &adw->sg_dmat) != 0) { return (ENOMEM); } -- cgit v1.3