Module Name: src Committed By: snj Date: Sat Sep 23 17:55:13 UTC 2017
Modified Files: src/sys/arch/x68k/dev [netbsd-8]: dmacvar.h fd.c intio_dmac.c vs.c Log Message: Pull up following revision(s) (requested by isaki in ticket #290): sys/arch/x68k/dev/dmacvar.h: revision 1.11-1.12 via patch sys/arch/x68k/dev/intio_dmac.c: revision 1.36-1.37 via patch sys/arch/x68k/dev/fd.c: revision 1.120 via patch sys/arch/x68k/dev/vs.c: revision 1.45-1.46 via patch Use dmac_prepare_xfer(). >From Y.Sugahara. -- Allow dmac_alloc_channel() to specify DCR and OCR. FDC uses 'Cycle Steal Mode with Hold' but ADPCM should use 'Cycle Steal Mode without Hold' on x68k. >From Y.Suhagara and it was found by XM6i. -- Fix a Continue Operation. Patch from Y.Sugahara. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.10.76.1 src/sys/arch/x68k/dev/dmacvar.h cvs rdiff -u -r1.119 -r1.119.8.1 src/sys/arch/x68k/dev/fd.c cvs rdiff -u -r1.35 -r1.35.22.1 src/sys/arch/x68k/dev/intio_dmac.c cvs rdiff -u -r1.37 -r1.37.2.1 src/sys/arch/x68k/dev/vs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x68k/dev/dmacvar.h diff -u src/sys/arch/x68k/dev/dmacvar.h:1.10 src/sys/arch/x68k/dev/dmacvar.h:1.10.76.1 --- src/sys/arch/x68k/dev/dmacvar.h:1.10 Wed Jun 25 13:30:24 2008 +++ src/sys/arch/x68k/dev/dmacvar.h Sat Sep 23 17:55:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dmacvar.h,v 1.10 2008/06/25 13:30:24 isaki Exp $ */ +/* $NetBSD: dmacvar.h,v 1.10.76.1 2017/09/23 17:55:13 snj Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -55,8 +55,6 @@ struct dmac_dma_xfer { struct dmac_sg_array *dx_array; /* DMAC array chain */ int dx_done; #endif - int dx_nextoff; /* for continued operation */ - int dx_nextsize; }; /* @@ -99,9 +97,14 @@ struct dmac_softc { #define DMAC_MAXSEGSZ 0xff00 #define DMAC_BOUNDARY 0 -struct dmac_channel_stat *dmac_alloc_channel(device_t, int, const char *, - int, dmac_intr_handler_t, void *, int, dmac_intr_handler_t, void *); - /* ch, name, normalv, normal, errorv, error */ +struct dmac_channel_stat *dmac_alloc_channel(device_t, + int, /* ch */ + const char *, /* name */ + int, dmac_intr_handler_t, void *, /* normal handler */ + int, dmac_intr_handler_t, void *, /* error handler */ + uint8_t, /* dcr */ + uint8_t /* ocr */ +); int dmac_free_channel(device_t, int, void *); /* ch, channel */ struct dmac_dma_xfer *dmac_alloc_xfer(struct dmac_channel_stat *, Index: src/sys/arch/x68k/dev/fd.c diff -u src/sys/arch/x68k/dev/fd.c:1.119 src/sys/arch/x68k/dev/fd.c:1.119.8.1 --- src/sys/arch/x68k/dev/fd.c:1.119 Thu Jan 12 14:24:53 2017 +++ src/sys/arch/x68k/dev/fd.c Sat Sep 23 17:55:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: fd.c,v 1.119 2017/01/12 14:24:53 isaki Exp $ */ +/* $NetBSD: fd.c,v 1.119.8.1 2017/09/23 17:55:13 snj Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.119 2017/01/12 14:24:53 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.119.8.1 2017/09/23 17:55:13 snj Exp $"); #include "opt_ddb.h" #include "opt_m68k_arch.h" @@ -487,7 +487,10 @@ fdcattach(device_t parent, device_t self /* Initialize DMAC channel */ fdc->sc_dmachan = dmac_alloc_channel(parent, ia->ia_dma, "fdc", ia->ia_dmaintr, fdcdmaintr, fdc, - ia->ia_dmaintr + 1, fdcdmaerrintr, fdc); + ia->ia_dmaintr + 1, fdcdmaerrintr, fdc, + (DMAC_DCR_XRM_CSWH | DMAC_DCR_OTYP_EASYNC | DMAC_DCR_OPS_8BIT), + (DMAC_OCR_SIZE_BYTE | DMAC_OCR_REQG_EXTERNAL)); + if (bus_dmamap_create(fdc->sc_dmat, FDC_MAXIOSIZE, 1, DMAC_MAXSEGSZ, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &fdc->sc_dmamap)) { aprint_error_dev(self, "can't set up intio DMA map\n"); Index: src/sys/arch/x68k/dev/intio_dmac.c diff -u src/sys/arch/x68k/dev/intio_dmac.c:1.35 src/sys/arch/x68k/dev/intio_dmac.c:1.35.22.1 --- src/sys/arch/x68k/dev/intio_dmac.c:1.35 Wed Mar 26 08:17:59 2014 +++ src/sys/arch/x68k/dev/intio_dmac.c Sat Sep 23 17:55:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: intio_dmac.c,v 1.35 2014/03/26 08:17:59 christos Exp $ */ +/* $NetBSD: intio_dmac.c,v 1.35.22.1 2017/09/23 17:55:13 snj Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #include "opt_m68k_arch.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intio_dmac.c,v 1.35 2014/03/26 08:17:59 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intio_dmac.c,v 1.35.22.1 2017/09/23 17:55:13 snj Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -159,9 +159,10 @@ dmac_init_channels(struct dmac_softc *sc * Channel initialization/deinitialization per user device. */ struct dmac_channel_stat * -dmac_alloc_channel(device_t self, int ch, const char *name, int normalv, - dmac_intr_handler_t normal, void *normalarg, int errorv, - dmac_intr_handler_t error, void *errorarg) +dmac_alloc_channel(device_t self, int ch, const char *name, + int normalv, dmac_intr_handler_t normal, void *normalarg, + int errorv, dmac_intr_handler_t error, void *errorarg, + uint8_t dcr, uint8_t ocr) { struct intio_softc *intio = device_private(self); struct dmac_softc *dmac = device_private(intio->sc_dmac); @@ -201,9 +202,8 @@ dmac_alloc_channel(device_t self, int ch /* fill the channel status structure by the default values. */ strcpy(chan->ch_name, name); - chan->ch_dcr = (DMAC_DCR_XRM_CSWH | DMAC_DCR_OTYP_EASYNC | - DMAC_DCR_OPS_8BIT); - chan->ch_ocr = (DMAC_OCR_SIZE_BYTE | DMAC_OCR_REQG_EXTERNAL); + chan->ch_dcr = dcr; + chan->ch_ocr = ocr; chan->ch_normalv = normalv; chan->ch_errorv = errorv; chan->ch_normal = normal; @@ -217,6 +217,7 @@ dmac_alloc_channel(device_t self, int ch bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_DCR, chan->ch_dcr); bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CPR, 0); + /* OCR will be written at dmac_load_xfer() */ /* * X68k physical user space is a subset of the kernel space; @@ -283,7 +284,6 @@ dmac_alloc_xfer(struct dmac_channel_stat xf->dx_array = chan->ch_map; xf->dx_done = 0; #endif - xf->dx_nextoff = xf->dx_nextsize = -1; return xf; } @@ -299,8 +299,6 @@ dmac_load_xfer(struct dmac_softc *dmac, xf->dx_ocr |= DMAC_OCR_CHAIN_DISABLED; else { xf->dx_ocr |= DMAC_OCR_CHAIN_ARRAY; - xf->dx_nextoff = ~0; - xf->dx_nextsize = ~0; } bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CSR, 0xff); @@ -351,6 +349,8 @@ dmac_start_xfer_offset(struct dmac_softc struct dmac_channel_stat *chan = xf->dx_channel; struct x68k_bus_dmamap *dmamap = xf->dx_dmamap; int go = DMAC_CCR_STR|DMAC_CCR_INT; + bus_addr_t paddr; + uint8_t csr; #ifdef DMAC_ARRAYCHAIN int c; #endif @@ -390,20 +390,21 @@ dmac_start_xfer_offset(struct dmac_softc if (dmamap->dm_mapsize != dmamap->dm_segs[0].ds_len) panic("dmac_start_xfer_offset: dmamap curruption"); #endif - if (offset == xf->dx_nextoff && - size == xf->dx_nextsize) { - /* Use continued operation */ + paddr = dmamap->dm_segs[0].ds_addr + offset; + csr = bus_space_read_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CSR); + if ((csr & DMAC_CSR_ACT) != 0) { + /* Use 'Continue Mode' */ + bus_space_write_4(dmac->sc_bst, chan->ch_bht, + DMAC_REG_BAR, paddr); + bus_space_write_2(dmac->sc_bst, chan->ch_bht, + DMAC_REG_BTCR, (int) size); go |= DMAC_CCR_CNT; - xf->dx_nextoff += size; + go &= ~DMAC_CCR_STR; } else { bus_space_write_4(dmac->sc_bst, chan->ch_bht, - DMAC_REG_MAR, - (int) dmamap->dm_segs[0].ds_addr - + offset); + DMAC_REG_MAR, paddr); bus_space_write_2(dmac->sc_bst, chan->ch_bht, DMAC_REG_MTCR, (int) size); - xf->dx_nextoff = offset; - xf->dx_nextsize = size; } #ifdef DMAC_ARRAYCHAIN xf->dx_done = 1; @@ -435,13 +436,6 @@ dmac_start_xfer_offset(struct dmac_softc #endif bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CCR, go); - if (xf->dx_nextoff != ~0) { - bus_space_write_4(dmac->sc_bst, chan->ch_bht, - DMAC_REG_BAR, xf->dx_nextoff); - bus_space_write_2(dmac->sc_bst, chan->ch_bht, - DMAC_REG_BTCR, xf->dx_nextsize); - } - return 0; } @@ -562,7 +556,6 @@ dmac_abort_xfer(struct dmac_softc *dmac, bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CCR, DMAC_CCR_INT | DMAC_CCR_SAB); bus_space_write_1(dmac->sc_bst, chan->ch_bht, DMAC_REG_CSR, 0xff); - xf->dx_nextoff = xf->dx_nextsize = -1; return 0; } Index: src/sys/arch/x68k/dev/vs.c diff -u src/sys/arch/x68k/dev/vs.c:1.37 src/sys/arch/x68k/dev/vs.c:1.37.2.1 --- src/sys/arch/x68k/dev/vs.c:1.37 Thu Jun 1 02:45:08 2017 +++ src/sys/arch/x68k/dev/vs.c Sat Sep 23 17:55:13 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: vs.c,v 1.37 2017/06/01 02:45:08 chs Exp $ */ +/* $NetBSD: vs.c,v 1.37.2.1 2017/09/23 17:55:13 snj Exp $ */ /* * Copyright (c) 2001 Tetsuya Isaki. All rights reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vs.c,v 1.37 2017/06/01 02:45:08 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vs.c,v 1.37.2.1 2017/09/23 17:55:13 snj Exp $"); #include "audio.h" #include "vs.h" @@ -243,7 +243,9 @@ vs_attach(device_t parent, device_t self sc->sc_dmat = ia->ia_dmat; sc->sc_dma_ch = dmac_alloc_channel(parent, ia->ia_dma, "vs", ia->ia_dmaintr, vs_dmaintr, sc, - ia->ia_dmaintr+1, vs_dmaerrintr, sc); + ia->ia_dmaintr+1, vs_dmaerrintr, sc, + (DMAC_DCR_XRM_CSWOH | DMAC_DCR_OTYP_EASYNC | DMAC_DCR_OPS_8BIT), + (DMAC_OCR_SIZE_BYTE | DMAC_OCR_REQG_EXTERNAL)); aprint_normal_dev(self, "MSM6258V ADPCM voice synthesizer\n"); @@ -504,7 +506,6 @@ vs_trigger_output(void *hdl, void *start { struct vs_softc *sc; struct vs_dma *vd; - struct dmac_dma_xfer *xf; struct dmac_channel_stat *chan; DPRINTF(2, ("vs_trigger_output: start=%p, bsize=%d, intr=%p, arg=%p\n", @@ -530,17 +531,13 @@ vs_trigger_output(void *hdl, void *start vs_set_sr(sc, sc->sc_current.prate); vs_set_po(sc, VS_PANOUT_LR); - xf = dmac_alloc_xfer(chan, sc->sc_dmat, vd->vd_map); - sc->sc_current.xfer = xf; - chan->ch_dcr = (DMAC_DCR_XRM_CSWOH | DMAC_DCR_OTYP_EASYNC | - DMAC_DCR_OPS_8BIT); - chan->ch_ocr = DMAC_OCR_REQG_EXTERNAL; - xf->dx_ocr = DMAC_OCR_DIR_MTD; - xf->dx_scr = DMAC_SCR_MAC_COUNT_UP | DMAC_SCR_DAC_NO_COUNT; - xf->dx_device = sc->sc_addr + MSM6258_DATA*2 + 1; + sc->sc_current.xfer = dmac_prepare_xfer(chan, sc->sc_dmat, vd->vd_map, + DMAC_OCR_DIR_MTD, + (DMAC_SCR_MAC_COUNT_UP | DMAC_SCR_DAC_NO_COUNT), + sc->sc_addr + MSM6258_DATA * 2 + 1); - dmac_load_xfer(chan->ch_softc, xf); - dmac_start_xfer_offset(chan->ch_softc, xf, 0, sc->sc_current.blksize); + dmac_start_xfer_offset(chan->ch_softc, sc->sc_current.xfer, 0, + sc->sc_current.blksize); bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 2); return 0; @@ -553,7 +550,6 @@ vs_trigger_input(void *hdl, void *start, { struct vs_softc *sc; struct vs_dma *vd; - struct dmac_dma_xfer *xf; struct dmac_channel_stat *chan; DPRINTF(2, ("vs_trigger_input: start=%p, bsize=%d, intr=%p, arg=%p\n", @@ -577,17 +573,14 @@ vs_trigger_input(void *hdl, void *start, } vs_set_sr(sc, sc->sc_current.rrate); - xf = dmac_alloc_xfer(chan, sc->sc_dmat, vd->vd_map); - sc->sc_current.xfer = xf; - chan->ch_dcr = (DMAC_DCR_XRM_CSWOH | DMAC_DCR_OTYP_EASYNC | - DMAC_DCR_OPS_8BIT); - chan->ch_ocr = DMAC_OCR_REQG_EXTERNAL; - xf->dx_ocr = DMAC_OCR_DIR_DTM; - xf->dx_scr = DMAC_SCR_MAC_COUNT_UP | DMAC_SCR_DAC_NO_COUNT; - xf->dx_device = sc->sc_addr + MSM6258_DATA*2 + 1; - dmac_load_xfer(chan->ch_softc, xf); - dmac_start_xfer_offset(chan->ch_softc, xf, 0, sc->sc_current.blksize); + sc->sc_current.xfer = dmac_prepare_xfer(chan, sc->sc_dmat, vd->vd_map, + DMAC_OCR_DIR_DTM, + (DMAC_SCR_MAC_COUNT_UP | DMAC_SCR_DAC_NO_COUNT), + sc->sc_addr + MSM6258_DATA * 2 + 1); + + dmac_start_xfer_offset(chan->ch_softc, sc->sc_current.xfer, 0, + sc->sc_current.blksize); bus_space_write_1(sc->sc_iot, sc->sc_ioh, MSM6258_STAT, 4); return 0;