Date: Thu, 1 Aug 2013 03:43:52 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r253851 - projects/altix2/sys/dev/isp Message-ID: <201308010343.r713hqYf028967@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Thu Aug 1 03:43:52 2013 New Revision: 253851 URL: http://svnweb.freebsd.org/changeset/base/253851 Log: Port the sbus attached to busdma/mi now that I have my Netra fired up... Modified: projects/altix2/sys/dev/isp/isp_sbus.c Modified: projects/altix2/sys/dev/isp/isp_sbus.c ============================================================================== --- projects/altix2/sys/dev/isp/isp_sbus.c Thu Aug 1 02:57:04 2013 (r253850) +++ projects/altix2/sys/dev/isp/isp_sbus.c Thu Aug 1 03:43:52 2013 (r253851) @@ -432,36 +432,14 @@ isp_sbus_wr_reg(ispsoftc_t *isp, int reg MEMORYBARRIER(isp, SYNC_REG, offset, 2, -1); } -struct imush { - ispsoftc_t *isp; - int error; -}; - -static void imc(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; - } else { - ispsoftc_t *isp =imushp->isp; - bus_addr_t addr = segs->ds_addr; - - isp->isp_rquest_dma = addr; - addr += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); - isp->isp_result_dma = addr; - } -} - static int isp_sbus_mbxdma(ispsoftc_t *isp) { - caddr_t base; uint32_t len; int i, error; - struct imush im; + uintptr_t vaddr; + bus_addr_t busaddr; + size_t size; /* * Already been here? If so, leave... @@ -492,17 +470,16 @@ isp_sbus_mbxdma(ispsoftc_t *isp) isp->isp_xflist[len].cmd = &isp->isp_xflist[len+1]; } isp->isp_xffree = isp->isp_xflist; - len = sizeof (bus_dmamap_t) * isp->isp_maxcmds; - if (isp_dma_tag_create(BUS_DMA_ROOTARG(ISP_SBD(isp)), 1, - BUS_SPACE_MAXADDR_24BIT+1, BUS_SPACE_MAXADDR_32BIT, - BUS_SPACE_MAXADDR_32BIT, NULL, NULL, BUS_SPACE_MAXSIZE_32BIT, - ISP_NSEG_MAX, BUS_SPACE_MAXADDR_24BIT, 0, &isp->isp_osinfo.dmat)) { + error = busdma_tag_create(ISP_SBD(isp), 1, BUS_SPACE_MAXADDR_24BIT+1, + BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXSIZE_32BIT, ISP_NSEG_MAX, + BUS_SPACE_MAXADDR_24BIT, 0, 0, &isp->isp_osinfo.dmat); + if (error) { isp_prt(isp, ISP_LOGERR, "could not create master dma tag"); free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); free(isp->isp_xflist, M_DEVBUF); ISP_LOCK(isp); - return(1); + return(error); } /* @@ -511,38 +488,38 @@ isp_sbus_mbxdma(ispsoftc_t *isp) len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); len += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); - if (isp_dma_tag_derive(isp->isp_osinfo.dmat, QENTRY_LEN, - BUS_SPACE_MAXADDR_24BIT+1, BUS_SPACE_MAXADDR_32BIT, - BUS_SPACE_MAXADDR_32BIT, NULL, NULL, len, 1, - BUS_SPACE_MAXADDR_24BIT, 0, &isp->isp_osinfo.cdmat)) { + error = busdma_tag_derive(isp->isp_osinfo.dmat, QENTRY_LEN, + BUS_SPACE_MAXADDR_24BIT+1, BUS_SPACE_MAXADDR_32BIT, len, 1, + BUS_SPACE_MAXADDR_24BIT, 0, 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); 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, BUSDMA_ALLOC_CONSISTENT, + &isp->isp_osinfo.cdmd); + if (error) { 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); ISP_LOCK(isp); - return (1); + return (error); } 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; } @@ -555,24 +532,24 @@ isp_sbus_mbxdma(ispsoftc_t *isp) } isp->isp_osinfo.pcmd_free = &isp->isp_osinfo.pcmd_pool[0]; - im.isp = isp; - 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; - } + busaddr = busdma_md_get_busaddr(isp->isp_osinfo.cdmd, 0); + vaddr = busdma_md_get_vaddr(isp->isp_osinfo.cdmd, 0); + + isp->isp_rquest = (void *)vaddr; + isp->isp_rquest_dma = busaddr; + size = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); + busaddr += size; + vaddr += size; + + isp->isp_result = (void *)vaddr; + isp->isp_result_dma = busaddr; - isp->isp_rquest = base; - base += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); - isp->isp_result = base; ISP_LOCK(isp); return (0); bad: - 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); free(isp->isp_osinfo.pcmd_pool, M_DEVBUF); isp->isp_rquest = NULL; @@ -590,16 +567,15 @@ typedef struct { #define MUSHERR_NOQENTRIES -2 -static void dma2(void *, bus_dma_segment_t *, int, int); - static void -dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) +dma2(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) { @@ -609,23 +585,23 @@ dma2(void *arg, bus_dma_segment_t *dm_se csio = mp->cmd_token; isp = mp->isp; rq = mp->rq; - if (nseg) { + if (md != NULL) { + nseg = busdma_md_get_nsegs(md); 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, BUSDMA_SYNC_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, BUSDMA_SYNC_PREWRITE); ddir = ISP_TO_DEVICE; } else { ddir = ISP_NOXFR; } } else { - dm_segs = NULL; - nseg = 0; + md = NULL; ddir = ISP_NOXFR; } - if (isp_send_cmd(isp, rq, dm_segs, nseg, XS_XFRLEN(csio), ddir, NULL) != CMD_QUEUED) { + if (isp_send_cmd(isp, rq, md, XS_XFRLEN(csio), ddir, NULL) != CMD_QUEUED) { mp->error = MUSHERR_NOQENTRIES; } } @@ -634,7 +610,6 @@ static int isp_sbus_dmasetup(ispsoftc_t *isp, struct ccb_scsiio *csio, void *ff) { mush_t mush, *mp; - void (*eptr)(void *, bus_dma_segment_t *, int, int); int error; mp = &mush; @@ -644,12 +619,10 @@ isp_sbus_dmasetup(ispsoftc_t *isp, struc mp->error = 0; mp->mapsize = 0; - eptr = dma2; - - error = bus_dmamap_load_ccb(isp->isp_osinfo.dmat, - PISP_PCMD(csio)->dmap, (union ccb *)csio, eptr, mp, 0); + error = busdma_md_load_ccb(PISP_PCMD(csio)->dmap, (union ccb *)csio, + dma2, mp, 0); if (error == EINPROGRESS) { - bus_dmamap_unload(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap); + busdma_md_unload(PISP_PCMD(csio)->dmap); mp->error = EINVAL; isp_prt(isp, ISP_LOGERR, "deferred dma allocation not supported");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308010343.r713hqYf028967>