From owner-svn-src-projects@FreeBSD.ORG Mon Jun 4 18:16:19 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B3883106564A; Mon, 4 Jun 2012 18:16:19 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 9DB988FC15; Mon, 4 Jun 2012 18:16:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q54IGJEQ057568; Mon, 4 Jun 2012 18:16:19 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q54IGJKR057562; Mon, 4 Jun 2012 18:16:19 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201206041816.q54IGJKR057562@svn.freebsd.org> From: Marcel Moolenaar Date: Mon, 4 Jun 2012 18:16:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r236573 - projects/altix2/sys/dev/isp X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Jun 2012 18:16:19 -0000 Author: marcel Date: Mon Jun 4 18:16:19 2012 New Revision: 236573 URL: http://svn.freebsd.org/changeset/base/236573 Log: Rewrite using busdma/mi. Things tend to become simpler... Note that isp_sbus.c has not been converted yet. Modified: projects/altix2/sys/dev/isp/isp_freebsd.c projects/altix2/sys/dev/isp/isp_freebsd.h projects/altix2/sys/dev/isp/isp_library.c projects/altix2/sys/dev/isp/isp_library.h projects/altix2/sys/dev/isp/isp_pci.c Modified: projects/altix2/sys/dev/isp/isp_freebsd.c ============================================================================== --- projects/altix2/sys/dev/isp/isp_freebsd.c Mon Jun 4 18:02:09 2012 (r236572) +++ projects/altix2/sys/dev/isp/isp_freebsd.c Mon Jun 4 18:16:19 2012 (r236573) @@ -5795,11 +5795,11 @@ void isp_common_dmateardown(ispsoftc_t *isp, struct ccb_scsiio *csio, uint32_t hdl) { if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { - bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_POSTREAD); + busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_POSTREAD); } else { - bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_POSTWRITE); + busdma_sync(PISP_PCMD(csio)->dmap, BUSDMA_SYNC_POSTWRITE); } - bus_dmamap_unload(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap); + busdma_md_unload(PISP_PCMD(csio)->dmap); } void Modified: projects/altix2/sys/dev/isp/isp_freebsd.h ============================================================================== --- projects/altix2/sys/dev/isp/isp_freebsd.h Mon Jun 4 18:02:09 2012 (r236572) +++ projects/altix2/sys/dev/isp/isp_freebsd.h Mon Jun 4 18:16:19 2012 (r236573) @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -150,7 +151,7 @@ typedef struct tstate { */ struct isp_pcmd { struct isp_pcmd * next; - bus_dmamap_t dmap; /* dma map for this command */ + busdma_md_t dmap; /* dma map for this command */ struct ispsoftc * isp; /* containing isp */ struct callout wdog; /* watchdog timer */ }; @@ -167,8 +168,8 @@ struct isp_fc { struct cam_path *path; struct ispsoftc *isp; struct proc *kproc; - bus_dma_tag_t tdmat; - bus_dmamap_t tdmap; + busdma_tag_t tdmat; + busdma_md_t tdmd; uint64_t def_wwpn; uint64_t def_wwnn; uint32_t loop_down_time; @@ -245,10 +246,10 @@ struct isposinfo { * DMA related sdtuff */ bus_space_tag_t bus_tag; - bus_dma_tag_t dmat; bus_space_handle_t bus_handle; - bus_dma_tag_t cdmat; - bus_dmamap_t cdmap; + busdma_tag_t dmat; + busdma_tag_t cdmat; + busdma_md_t cdmd; /* * Command and transaction related related stuff @@ -358,25 +359,21 @@ switch (type) { \ case SYNC_SFORDEV: \ { \ struct isp_fc *fc = ISP_FC_PC(isp, chan); \ - bus_dmamap_sync(fc->tdmat, fc->tdmap, \ - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \ + busdma_sync(fc->tdmd, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \ break; \ } \ case SYNC_REQUEST: \ - bus_dmamap_sync(isp->isp_osinfo.cdmat, \ - isp->isp_osinfo.cdmap, \ + busdma_sync(isp->isp_osinfo.cdmd, \ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); \ break; \ case SYNC_SFORCPU: \ { \ struct isp_fc *fc = ISP_FC_PC(isp, chan); \ - bus_dmamap_sync(fc->tdmat, fc->tdmap, \ - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); \ + busdma_sync(fc->tdmd, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); \ break; \ } \ case SYNC_RESULT: \ - bus_dmamap_sync(isp->isp_osinfo.cdmat, \ - isp->isp_osinfo.cdmap, \ + busdma_sync(isp->isp_osinfo.cdmd, \ BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); \ break; \ case SYNC_REG: \ @@ -411,24 +408,22 @@ default: \ #define XS_T struct ccb_scsiio #define XS_DMA_ADDR_T bus_addr_t -#define XS_GET_DMA64_SEG(a, b, c) \ -{ \ - ispds64_t *d = a; \ - bus_dma_segment_t *e = b; \ - uint32_t f = c; \ - e += f; \ - d->ds_base = DMA_LO32(e->ds_addr); \ - d->ds_basehi = DMA_HI32(e->ds_addr); \ - d->ds_count = e->ds_len; \ +#define XS_GET_DMA64_SEG(a, md, c) \ +{ \ + ispds64_t *_d = a; \ + u_int _n = c; \ + bus_addr_t _a = busdma_md_get_busaddr(md, _n); \ + _d->ds_base = DMA_LO32(_a); \ + _d->ds_basehi = DMA_HI32(_a); \ + _d->ds_count = busdma_md_get_size(md, _n); \ } -#define XS_GET_DMA_SEG(a, b, c) \ -{ \ - ispds_t *d = a; \ - bus_dma_segment_t *e = b; \ - uint32_t f = c; \ - e += f; \ - d->ds_base = DMA_LO32(e->ds_addr); \ - d->ds_count = e->ds_len; \ +#define XS_GET_DMA_SEG(a, md, c) \ +{ \ + ispds_t *_d = a; \ + u_int _n = c; \ + bus_addr_t _a = busdma_md_get_busaddr(md, _n); \ + _d->ds_base = DMA_LO32(_a); \ + _d->ds_count = busdma_md_get_size(md, _n); \ } #define XS_ISP(ccb) cam_sim_softc(xpt_path_sim((ccb)->ccb_h.path)) #define XS_CHANNEL(ccb) cam_sim_bus(xpt_path_sim((ccb)->ccb_h.path)) @@ -660,27 +655,8 @@ void isp_common_dmateardown(ispsoftc_t * /* * Platform Version specific defines */ -#ifdef ISP_USE_BUSDMA #include -#define BUS_DMA_ROOTARG(x) x -#define isp_dma_tag_create(dev, align, bndry, lowaddr, hiaddr, filter, \ - f_arg, maxsize, nsegs, maxsegsz, flags, tag_p) \ - busdma_tag_create(dev, lowaddr, align, bndry, maxsize, nsegs, \ - maxsegsz, flags, (busdma_tag_t *)tag_p) - -#define isp_dma_tag_derive(parent, align, bndry, lowaddr, highaddr, \ - filter, f_arg, maxsize, nsegs, maxsegsz, flags, tag_p) \ - busdma_tag_derive((busdma_tag_t)parent, lowaddr, align, bndry, \ - maxsize, nsegs, maxsegsz, flags, (busdma_tag_t *)tag_p) -#else -#define BUS_DMA_ROOTARG(x) bus_get_dma_tag(x) -#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \ - bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \ - busdma_lock_mutex, &isp->isp_osinfo.lock, z) -#define isp_dma_tag_derive isp_dma_tag_create -#endif /* ISP_USE_BUSDMA */ - #define isp_setup_intr bus_setup_intr #define isp_sim_alloc(a, b, c, d, e, f, g, h) \ Modified: projects/altix2/sys/dev/isp/isp_library.c ============================================================================== --- projects/altix2/sys/dev/isp/isp_library.c Mon Jun 4 18:02:09 2012 (r236572) +++ projects/altix2/sys/dev/isp/isp_library.c Mon Jun 4 18:16:19 2012 (r236573) @@ -58,7 +58,8 @@ const char *isp_class3_roles[4] = { * Called with the first queue entry at least partially filled out. */ int -isp_send_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir) +isp_send_cmd(ispsoftc_t *isp, void *fqe, busdma_md_t md, uint32_t totalcnt, + isp_ddir_t ddir) { uint8_t storage[QENTRY_LEN]; uint8_t type, nqe; @@ -66,6 +67,7 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe, ispds_t *dsp = NULL; ispds64_t *dsp64 = NULL; void *qe0, *qe1; + u_int nsegs; qe0 = isp_getrqentry(isp); if (qe0 == NULL) { @@ -75,6 +77,7 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe, type = ((isphdr_t *)fqe)->rqs_entry_type; nqe = 1; + nsegs = busdma_md_get_nsegs(md); /* * If we have no data to transmit, just copy the first IOCB and start it up. @@ -131,9 +134,9 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe, for (seg = curseg = 0; curseg < seglim; curseg++) { if (dsp64) { - XS_GET_DMA64_SEG(dsp64++, segp, seg++); + XS_GET_DMA64_SEG(dsp64++, md, seg++); } else { - XS_GET_DMA_SEG(dsp++, segp, seg++); + XS_GET_DMA_SEG(dsp++, md, seg++); } } @@ -167,9 +170,9 @@ isp_send_cmd(ispsoftc_t *isp, void *fqe, } for (curseg = 0; curseg < seglim; curseg++) { if (dsp64) { - XS_GET_DMA64_SEG(dsp64++, segp, seg++); + XS_GET_DMA64_SEG(dsp64++, md, seg++); } else { - XS_GET_DMA_SEG(dsp++, segp, seg++); + XS_GET_DMA_SEG(dsp++, md, seg++); } } if (dsp64) { @@ -2007,7 +2010,8 @@ isp_put_ct_hdr(ispsoftc_t *isp, ct_hdr_t * Called with the first queue entry at least partially filled out. */ int -isp_send_tgt_cmd(ispsoftc_t *isp, void *fqe, void *segp, uint32_t nsegs, uint32_t totalcnt, isp_ddir_t ddir, void *snsptr, uint32_t snslen) +isp_send_tgt_cmd(ispsoftc_t *isp, void *fqe, busdma_md_t md, uint32_t totalcnt, + isp_ddir_t ddir, void *snsptr, uint32_t snslen) { uint8_t storage[QENTRY_LEN], storage2[QENTRY_LEN]; uint8_t type, nqe; @@ -2015,6 +2019,7 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void * ispds_t *dsp = NULL; ispds64_t *dsp64 = NULL; void *qe0, *qe1, *sqe = NULL; + u_int nsegs; qe0 = isp_getrqentry(isp); if (qe0 == NULL) { @@ -2025,6 +2030,7 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void * type = ((isphdr_t *)fqe)->rqs_entry_type; nqe = 1; seglim = 0; + nsegs = busdma_md_get_nsegs(md); /* * If we have no data to transmit, just copy the first IOCB and start it up. @@ -2140,9 +2146,9 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void * for (seg = curseg = 0; curseg < seglim; curseg++) { if (dsp64) { - XS_GET_DMA64_SEG(dsp64++, segp, seg++); + XS_GET_DMA64_SEG(dsp64++, md, seg++); } else { - XS_GET_DMA_SEG(dsp++, segp, seg++); + XS_GET_DMA_SEG(dsp++, md, seg++); } } @@ -2181,9 +2187,9 @@ isp_send_tgt_cmd(ispsoftc_t *isp, void * } for (curseg = 0; curseg < seglim; curseg++) { if (dsp64) { - XS_GET_DMA64_SEG(dsp64++, segp, seg++); + XS_GET_DMA64_SEG(dsp64++, md, seg++); } else { - XS_GET_DMA_SEG(dsp++, segp, seg++); + XS_GET_DMA_SEG(dsp++, md, seg++); } } if (dsp64) { Modified: projects/altix2/sys/dev/isp/isp_library.h ============================================================================== --- projects/altix2/sys/dev/isp/isp_library.h Mon Jun 4 18:02:09 2012 (r236572) +++ projects/altix2/sys/dev/isp/isp_library.h Mon Jun 4 18:16:19 2012 (r236573) @@ -36,7 +36,7 @@ * stuff figured out, you can make all the code in one spot. */ typedef enum { ISP_TO_DEVICE, ISP_FROM_DEVICE, ISP_NOXFR} isp_ddir_t; -int isp_send_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t); +int isp_send_cmd(ispsoftc_t *, void *, busdma_md_t, uint32_t, isp_ddir_t); /* * Handle management functions. @@ -155,7 +155,7 @@ void isp_put_ct_hdr(ispsoftc_t *isp, ct_ #include "isp_target.h" #endif -int isp_send_tgt_cmd(ispsoftc_t *, void *, void *, uint32_t, uint32_t, isp_ddir_t, void *, uint32_t); +int isp_send_tgt_cmd(ispsoftc_t *, void *, busdma_md_t, uint32_t, isp_ddir_t, void *, uint32_t); int isp_allocate_xs_tgt(ispsoftc_t *, void *, uint32_t *); void *isp_find_xs_tgt(ispsoftc_t *, uint32_t); Modified: projects/altix2/sys/dev/isp/isp_pci.c ============================================================================== --- projects/altix2/sys/dev/isp/isp_pci.c Mon Jun 4 18:02:09 2012 (r236572) +++ projects/altix2/sys/dev/isp/isp_pci.c Mon Jun 4 18:16:19 2012 (r236573) @@ -354,7 +354,7 @@ struct isp_pcisoftc { int rgd; void * ih; int16_t pci_poff[_NREG_BLKS]; - bus_dma_tag_t dmat; + busdma_tag_t dmat; int msicount; }; @@ -1436,75 +1436,14 @@ isp_pci_wr_reg_2400(ispsoftc_t *isp, int } } - -struct imush { - ispsoftc_t *isp; - caddr_t vbase; - int chan; - int error; -}; - -static void imc(void *, bus_dma_segment_t *, int, int); -static void imc1(void *, bus_dma_segment_t *, int, int); - -static void -imc(void *arg, bus_dma_segment_t *segs, int nseg, int error) -{ - struct imush *imushp = (struct imush *) arg; - - if (error) { - imushp->error = error; - return; - } - if (nseg != 1) { - imushp->error = EINVAL; - return; - } - isp_prt(imushp->isp, ISP_LOGDEBUG0, "request/result area @ 0x%jx/0x%jx", (uintmax_t) segs->ds_addr, (uintmax_t) segs->ds_len); - imushp->isp->isp_rquest = imushp->vbase; - imushp->isp->isp_rquest_dma = segs->ds_addr; - segs->ds_addr += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(imushp->isp)); - imushp->vbase += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(imushp->isp)); - imushp->isp->isp_result_dma = segs->ds_addr; - imushp->isp->isp_result = imushp->vbase; - -#ifdef ISP_TARGET_MODE - if (IS_24XX(imushp->isp)) { - segs->ds_addr += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(imushp->isp)); - imushp->vbase += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(imushp->isp)); - imushp->isp->isp_atioq_dma = segs->ds_addr; - imushp->isp->isp_atioq = imushp->vbase; - } -#endif -} - -static void -imc1(void *arg, bus_dma_segment_t *segs, int nseg, int error) -{ - struct imush *imushp = (struct imush *) arg; - if (error) { - imushp->error = error; - return; - } - if (nseg != 1) { - imushp->error = EINVAL; - return; - } - isp_prt(imushp->isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx", (uintmax_t) segs->ds_addr, (uintmax_t) segs->ds_len); - FCPARAM(imushp->isp, imushp->chan)->isp_scdma = segs->ds_addr; - FCPARAM(imushp->isp, imushp->chan)->isp_scratch = imushp->vbase; -} - static int isp_pci_mbxdma(ispsoftc_t *isp) { - caddr_t base; uint32_t len; int i, error, ns, cmap = 0; bus_size_t slim; /* segment size */ bus_addr_t llim; /* low limit of unavailable dma */ bus_addr_t hlim; /* high limit of unavailable dma */ - struct imush im; /* * Already been here? If so, leave... @@ -1553,11 +1492,13 @@ isp_pci_mbxdma(ispsoftc_t *isp) } #endif - if (isp_dma_tag_create(BUS_DMA_ROOTARG(ISP_PCD(isp)), 1, slim, llim, hlim, NULL, NULL, BUS_SPACE_MAXSIZE, ISP_NSEGS, slim, 0, &isp->isp_osinfo.dmat)) { + error = busdma_tag_create(ISP_PCD(isp), 1, slim, llim, + BUS_SPACE_MAXSIZE, ISP_NSEGS, slim, 0, &isp->isp_osinfo.dmat); + if (error) { free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); ISP_LOCK(isp); isp_prt(isp, ISP_LOGERR, "could not create master dma tag"); - return (1); + return (error); } len = sizeof (isp_hdl_t) * isp->isp_maxcmds; @@ -1606,7 +1547,9 @@ isp_pci_mbxdma(ispsoftc_t *isp) * Create a tag for the control spaces. We don't always need this * to be 32 bits, but we do this for simplicity and speed's sake. */ - if (isp_dma_tag_derive(isp->isp_osinfo.dmat, QENTRY_LEN, slim, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, len, ns, slim, 0, &isp->isp_osinfo.cdmat)) { + error = busdma_tag_derive(isp->isp_osinfo.dmat, QENTRY_LEN, slim, + BUS_SPACE_MAXADDR_32BIT, len, ns, slim, 0, &isp->isp_osinfo.cdmat); + if (error) { isp_prt(isp, ISP_LOGERR, "cannot create a dma tag for control spaces"); free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); free(isp->isp_xflist, M_DEVBUF); @@ -1614,62 +1557,65 @@ isp_pci_mbxdma(ispsoftc_t *isp) free(isp->isp_tgtlist, M_DEVBUF); #endif ISP_LOCK(isp); - return (1); + return (error); } - if (bus_dmamem_alloc(isp->isp_osinfo.cdmat, (void **)&base, BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &isp->isp_osinfo.cdmap) != 0) { + error = busdma_mem_alloc(isp->isp_osinfo.cdmat, 0, + &isp->isp_osinfo.cdmd); + if (error != 0) { isp_prt(isp, ISP_LOGERR, "cannot allocate %d bytes of CCB memory", len); - bus_dma_tag_destroy(isp->isp_osinfo.cdmat); + busdma_tag_destroy(isp->isp_osinfo.cdmat); free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); free(isp->isp_xflist, M_DEVBUF); #ifdef ISP_TARGET_MODE free(isp->isp_tgtlist, M_DEVBUF); #endif ISP_LOCK(isp); - return (1); + return (error); } - im.isp = isp; - im.chan = 0; - im.vbase = base; - im.error = 0; - - bus_dmamap_load(isp->isp_osinfo.cdmat, isp->isp_osinfo.cdmap, base, len, imc, &im, 0); - if (im.error) { - isp_prt(isp, ISP_LOGERR, "error %d loading dma map for control areas", im.error); - goto bad; + isp->isp_rquest = (void *)busdma_md_get_vaddr(isp->isp_osinfo.cdmd, 0); + isp->isp_rquest_dma = busdma_md_get_busaddr(isp->isp_osinfo.cdmd, 0); + isp->isp_result_dma = isp->isp_rquest_dma + ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + isp->isp_result = (char *)isp->isp_rquest + ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + +#ifdef ISP_TARGET_MODE + if (IS_24XX(isp)) { + isp->isp_atioq_dma = isp->isp_result_dma + ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); + isp->isp_atioq = (char *)isp->isp_result + ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); } +#endif if (IS_FC(isp)) { for (cmap = 0; cmap < isp->isp_nchan; cmap++) { struct isp_fc *fc = ISP_FC_PC(isp, cmap); - if (isp_dma_tag_derive(isp->isp_osinfo.dmat, 64, slim, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, ISP_FC_SCRLEN, 1, slim, 0, &fc->tdmat)) { + error = busdma_tag_derive(isp->isp_osinfo.dmat, 64, + slim, BUS_SPACE_MAXADDR_32BIT, ISP_FC_SCRLEN, 1, + slim, 0, &fc->tdmat); + if (error) goto bad; - } - if (bus_dmamem_alloc(fc->tdmat, (void **)&base, BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &fc->tdmap) != 0) { - bus_dma_tag_destroy(fc->tdmat); - goto bad; - } - im.isp = isp; - im.chan = cmap; - im.vbase = base; - im.error = 0; - bus_dmamap_load(fc->tdmat, fc->tdmap, base, ISP_FC_SCRLEN, imc1, &im, 0); - if (im.error) { - bus_dmamem_free(fc->tdmat, base, fc->tdmap); - bus_dma_tag_destroy(fc->tdmat); + error = busdma_mem_alloc(fc->tdmat, 0, &fc->tdmd); + if (error) { + busdma_tag_destroy(fc->tdmat); goto bad; } + isp_prt(isp, ISP_LOGDEBUG0, "scdma @ 0x%jx/0x%jx", + (uintmax_t)busdma_md_get_busaddr(fc->tdmd, 0), + (uintmax_t)busdma_md_get_size(fc->tdmd, 0)); + FCPARAM(isp, cmap)->isp_scdma = + busdma_md_get_busaddr(fc->tdmd, 0); + FCPARAM(isp, cmap)->isp_scratch = + (void *)busdma_md_get_vaddr(fc->tdmd, 0); } } for (i = 0; i < isp->isp_maxcmds; i++) { struct isp_pcmd *pcmd = &isp->isp_osinfo.pcmd_pool[i]; - error = bus_dmamap_create(isp->isp_osinfo.dmat, 0, &pcmd->dmap); + error = busdma_md_create(isp->isp_osinfo.dmat, 0, &pcmd->dmap); if (error) { isp_prt(isp, ISP_LOGERR, "error %d creating per-cmd DMA maps", error); while (--i >= 0) { - bus_dmamap_destroy(isp->isp_osinfo.dmat, isp->isp_osinfo.pcmd_pool[i].dmap); + busdma_md_destroy(isp->isp_osinfo.pcmd_pool[i].dmap); } goto bad; } @@ -1687,11 +1633,11 @@ isp_pci_mbxdma(ispsoftc_t *isp) bad: while (--cmap >= 0) { struct isp_fc *fc = ISP_FC_PC(isp, cmap); - bus_dmamem_free(fc->tdmat, base, fc->tdmap); - bus_dma_tag_destroy(fc->tdmat); + busdma_mem_free(fc->tdmd); + busdma_tag_destroy(fc->tdmat); } - bus_dmamem_free(isp->isp_osinfo.cdmat, base, isp->isp_osinfo.cdmap); - bus_dma_tag_destroy(isp->isp_osinfo.cdmat); + busdma_mem_free(isp->isp_osinfo.cdmd); + busdma_tag_destroy(isp->isp_osinfo.cdmat); free(isp->isp_xflist, M_DEVBUF); #ifdef ISP_TARGET_MODE free(isp->isp_tgtlist, M_DEVBUF); @@ -1713,26 +1659,16 @@ typedef struct { #define MUSHERR_NOQENTRIES -2 #ifdef ISP_TARGET_MODE -static void tdma2_2(void *, bus_dma_segment_t *, int, bus_size_t, int); -static void tdma2(void *, bus_dma_segment_t *, int, int); - -static void -tdma2_2(void *arg, bus_dma_segment_t *dm_segs, int nseg, bus_size_t mapsize, int error) -{ - mush_t *mp; - mp = (mush_t *)arg; - mp->mapsize = mapsize; - tdma2(arg, dm_segs, nseg, error); -} static void -tdma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) +tdma_cb(void *arg, busdma_md_t md, int error) { mush_t *mp; ispsoftc_t *isp; struct ccb_scsiio *csio; isp_ddir_t ddir; ispreq_t *rq; + u_int nseg; mp = (mush_t *) arg; if (error) { @@ -1742,6 +1678,8 @@ tdma2(void *arg, bus_dma_segment_t *dm_s csio = mp->cmd_token; isp = mp->isp; rq = mp->rq; + ddir = ISP_NOXFR; + nseg = busdma_md_get_nsegs(md); if (nseg) { if (sizeof (bus_addr_t) > 4) { if (nseg >= ISP_NSEG64_MAX) { @@ -1760,48 +1698,30 @@ tdma2(void *arg, bus_dma_segment_t *dm_s } } if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { - bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE); + busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE); ddir = ISP_TO_DEVICE; } else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { - bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); + busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); ddir = ISP_FROM_DEVICE; - } else { - dm_segs = NULL; - nseg = 0; - ddir = ISP_NOXFR; } - } else { - dm_segs = NULL; - nseg = 0; - ddir = ISP_NOXFR; } - if (isp_send_tgt_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir, &csio->sense_data, csio->sense_len) != CMD_QUEUED) { + if (isp_send_tgt_cmd(isp, rq, md, XS_XFRLEN(csio), ddir, + &csio->sense_data, csio->sense_len) != CMD_QUEUED) { mp->error = MUSHERR_NOQENTRIES; } } #endif -static void dma2_2(void *, bus_dma_segment_t *, int, bus_size_t, int); -static void dma2(void *, bus_dma_segment_t *, int, int); - -static void -dma2_2(void *arg, bus_dma_segment_t *dm_segs, int nseg, bus_size_t mapsize, int error) -{ - mush_t *mp; - mp = (mush_t *)arg; - mp->mapsize = mapsize; - dma2(arg, dm_segs, nseg, error); -} - static void -dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) +dma_cb(void *arg, busdma_md_t md, int error) { mush_t *mp; ispsoftc_t *isp; struct ccb_scsiio *csio; isp_ddir_t ddir; ispreq_t *rq; + u_int nseg; mp = (mush_t *) arg; if (error) { @@ -1811,6 +1731,8 @@ dma2(void *arg, bus_dma_segment_t *dm_se csio = mp->cmd_token; isp = mp->isp; rq = mp->rq; + ddir = ISP_NOXFR; + nseg = busdma_md_get_nsegs(md); if (nseg) { if (sizeof (bus_addr_t) > 4) { if (nseg >= ISP_NSEG64_MAX) { @@ -1831,21 +1753,15 @@ dma2(void *arg, bus_dma_segment_t *dm_se } } if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { - bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); + busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD); ddir = ISP_FROM_DEVICE; } else if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) { - bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE); + busdma_sync(PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREWRITE); ddir = ISP_TO_DEVICE; - } else { - ddir = ISP_NOXFR; } - } else { - dm_segs = NULL; - nseg = 0; - ddir = ISP_NOXFR; } - if (isp_send_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir) != CMD_QUEUED) { + if (isp_send_cmd(isp, rq, md, XS_XFRLEN(csio), ddir) != CMD_QUEUED) { mp->error = MUSHERR_NOQENTRIES; } } @@ -1854,8 +1770,7 @@ static int isp_pci_dmasetup(ispsoftc_t *isp, struct ccb_scsiio *csio, void *ff) { mush_t mush, *mp; - void (*eptr)(void *, bus_dma_segment_t *, int, int); - void (*eptr2)(void *, bus_dma_segment_t *, int, bus_size_t, int); + busdma_callback_f cbf; mp = &mush; mp->isp = isp; @@ -1865,47 +1780,43 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct mp->mapsize = 0; #ifdef ISP_TARGET_MODE - if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO) { - eptr = tdma2; - eptr2 = tdma2_2; - } else + if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO) + cbf = tdma_cb; + else #endif - { - eptr = dma2; - eptr2 = dma2_2; - } - + cbf = dma_cb; - if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE || (csio->dxfer_len == 0)) { - (*eptr)(mp, NULL, 0, 0); + if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE || + (csio->dxfer_len == 0)) { + (*cbf)(mp, NULL, 0); } else if ((csio->ccb_h.flags & CAM_SCATTER_VALID) == 0) { + int error; if ((csio->ccb_h.flags & CAM_DATA_PHYS) == 0) { - int error; - error = bus_dmamap_load(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, csio->data_ptr, csio->dxfer_len, eptr, mp, 0); + error = busdma_md_load_linear(PISP_PCMD(csio)->dmap, + csio->data_ptr, csio->dxfer_len, cbf, mp, 0); + } else { + error = busdma_md_load_phys(PISP_PCMD(csio)->dmap, + (uintptr_t)csio->data_ptr, csio->dxfer_len, cbf, + mp, 0); + } #if 0 - xpt_print(csio->ccb_h.path, "%s: bus_dmamap_load " "ptr %p len %d returned %d\n", __func__, csio->data_ptr, csio->dxfer_len, error); + xpt_print(csio->ccb_h.path, "%s: busdma_md_load ptr %p len %d " + "returned %d\n", __func__, csio->data_ptr, csio->dxfer_len, + error); #endif - - if (error == EINPROGRESS) { - bus_dmamap_unload(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap); - mp->error = EINVAL; - isp_prt(isp, ISP_LOGERR, "deferred dma allocation not supported"); - } else if (error && mp->error == 0) { + if (error == EINPROGRESS) { + busdma_md_unload(PISP_PCMD(csio)->dmap); + mp->error = EINVAL; + isp_prt(isp, ISP_LOGERR, + "deferred dma allocation not supported"); + } else if (error && mp->error == 0) { #ifdef DIAGNOSTIC - isp_prt(isp, ISP_LOGERR, "error %d in dma mapping code", error); + isp_prt(isp, ISP_LOGERR, + "error %d in dma mapping code", error); #endif - mp->error = error; - } - } else { - /* Pointer to physical buffer */ - struct bus_dma_segment seg; - seg.ds_addr = (bus_addr_t)(vm_offset_t)csio->data_ptr; - seg.ds_len = csio->dxfer_len; - (*eptr)(mp, &seg, 1, 0); + mp->error = error; } } else { - struct bus_dma_segment *segs; - if ((csio->ccb_h.flags & CAM_DATA_PHYS) != 0) { isp_prt(isp, ISP_LOGERR, "Physical segment pointers unsupported"); mp->error = EINVAL; @@ -1929,16 +1840,16 @@ isp_pci_dmasetup(ispsoftc_t *isp, struct sguio.uio_resid = csio->dxfer_len; sguio.uio_segflg = UIO_SYSSPACE; - error = bus_dmamap_load_uio(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, &sguio, eptr2, mp, 0); + error = busdma_md_load_uio(PISP_PCMD(csio)->dmap, + &sguio, cbf, mp, 0); if (error != 0 && mp->error == 0) { isp_prt(isp, ISP_LOGERR, "error %d in dma mapping code", error); mp->error = error; } } else { - /* Just use the segments provided */ - segs = (struct bus_dma_segment *) csio->data_ptr; - (*eptr)(mp, segs, csio->sglist_cnt, 0); + isp_prt(isp, ISP_LOGERR, "Physical segment pointers unsupported"); + mp->error = EINVAL; } } if (mp->error) {