Changeset d45899b in rtems-libbsd


Ignore:
Timestamp:
Apr 27, 2018, 6:39:22 AM (18 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
c1e05b9ea378b2971e3d7704779112b4bc4296da, 4a77611a223ea883fb548679b516d326a020d447
Children:
ef5d536
Parents:
3fac9e9
git-author:
Sebastian Huber <sebastian.huber@…> (04/27/18 06:39:22)
git-committer:
Sebastian Huber <sebastian.huber@…> (04/27/18 07:05:37)
Message:

at91_mci: Get rid of bounce buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/arm/at91/at91_mci.c

    r3fac9e9 rd45899b  
    141141 * entire data cache, impacting overall system performance.
    142142 */
     143#ifndef __rtems__
    143144#define BBCOUNT     2
    144 #ifndef __rtems__
    145 #define BBSIZE      (16*1024)
    146 #define MAX_BLOCKS  ((BBSIZE*BBCOUNT)/512)
    147 #else /* __rtems__ */
    148145#define BBSIZE      (32*1024)
    149146#define MAX_BLOCKS  ((BBSIZE)/512)
    150147/* FIXME: It would be better to split the DMA up in that case like in the
    151148 * original driver. But that would need some rework. */
     149#else /* __rtems__ */
     150#define MAX_BLOCKS 32
    152151#endif /* __rtems__ */
    153152
     
    178177        RTEMS_INTERRUPT_LOCK_MEMBER(sc_lock)
    179178#endif /* __rtems__ */
     179#ifndef __rtems__
    180180        bus_dma_tag_t dmatag;
     181#endif /* __rtems__ */
    181182        struct mmc_host host;
    182183        int bus_busy;
    183184        struct mmc_request *req;
    184185        struct mmc_command *curcmd;
     186#ifndef __rtems__
    185187        bus_dmamap_t bbuf_map[BBCOUNT];
    186188        char      *  bbuf_vaddr[BBCOUNT]; /* bounce bufs in KVA space */
     
    188190        uint32_t     bbuf_curidx;         /* which bbuf is the active DMA buffer */
    189191        uint32_t     xfer_offset;         /* offset so far into caller's buf */
    190 #ifdef __rtems__
     192#else /* __rtems__ */
    191193        uint32_t xdma_tx_channel;
    192194        uint32_t xdma_rx_channel;
     
    208210static void at91_mci_deactivate(device_t dev);
    209211static int at91_mci_is_mci1rev2xx(void);
    210 #ifdef __rtems__
     212#ifndef __rtems__
    211213static void at91_mci_read_done(struct at91_mci_softc *sc, uint32_t sr);
     214#endif /* __rtems__ */
    212215static void at91_mci_write_done(struct at91_mci_softc *sc, uint32_t sr);
    213 #endif /* __rtems__ */
    214216
    215217#ifndef __rtems__
     
    252254}
    253255
     256#ifndef __rtems__
    254257static void
    255258at91_bswap_buf(struct at91_mci_softc *sc, void * dptr, void * sptr, uint32_t memsize)
     
    296299        *(bus_addr_t *)arg = segs[0].ds_addr;
    297300}
     301#endif /* __rtems__ */
    298302
    299303static void
     
    431435        struct sysctl_oid *soid;
    432436        device_t child;
     437#ifndef __rtems__
    433438        int err, i;
     439#else /* __rtems__ */
     440        int err;
     441#endif /* __rtems__ */
    434442
    435443#ifdef __rtems__
     
    516524        at91_mci_init(dev);
    517525
     526#ifndef __rtems__
    518527        /*
    519528         * Allocate DMA tags and maps and bounce buffers.
     
    544553         * Activate the interrupt
    545554         */
    546 #ifndef __rtems__
    547555        err = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
    548556            NULL, at91_mci_intr, sc, &sc->intrhand);
     
    605613
    606614        child = device_add_child(dev, "mmc", 0);
     615#ifdef __rtems__
     616        (void)child;
     617#endif /* __rtems__ */
    607618        device_set_ivars(dev, &sc->host);
    608619        err = bus_generic_attach(dev);
     
    616627at91_mci_detach(device_t dev)
    617628{
     629#ifndef __rtems__
    618630        struct at91_mci_softc *sc = device_get_softc(dev);
     631#endif /* __rtems__ */
    619632
    620633        at91_mci_fini(dev);
    621634        at91_mci_deactivate(dev);
    622635
     636#ifndef __rtems__
    623637        bus_dmamem_free(sc->dmatag, sc->bbuf_vaddr[0], sc->bbuf_map[0]);
    624638        bus_dmamem_free(sc->dmatag, sc->bbuf_vaddr[1], sc->bbuf_map[1]);
    625639        bus_dma_tag_destroy(sc->dmatag);
     640#endif /* __rtems__ */
    626641
    627642        return (EBUSY); /* XXX */
     
    760775static void
    761776at91_mci_setup_xdma(struct at91_mci_softc *sc, bool read, uint32_t block_size,
    762     uint32_t number_blocks, bus_addr_t paddr, uint32_t len)
     777    uint32_t block_count, void *data, uint32_t len)
    763778{
    764779        sXdmadCfg *xdma_cfg;
     
    783798        }
    784799
    785         for (i = 0; i < number_blocks; ++i) {
     800        for (i = 0; i < block_count; ++i) {
    786801                if (read) {
    787802                        dma_desc[i].mbr_sa = sa_rdr;
    788                         dma_desc[i].mbr_da = ((uint32_t)paddr) + i * block_size;
     803                        dma_desc[i].mbr_da = ((uint32_t)data) + i * block_size;
    789804                } else {
    790                         dma_desc[i].mbr_sa = ((uint32_t)paddr) + i * block_size;
     805                        dma_desc[i].mbr_sa = ((uint32_t)data) + i * block_size;
    791806                        dma_desc[i].mbr_da = da_tdr;
    792807                }
    793808                dma_desc[i].mbr_ubc = XDMA_UBC_NVIEW_NDV1 |
    794809                    XDMA_UBC_NDEN_UPDATED | (block_size/4);
    795                 if (i == number_blocks - 1) {
     810                if (i == block_count - 1) {
    796811                        dma_desc[i].mbr_ubc |= XDMA_UBC_NDE_FETCH_DIS;
    797812                        dma_desc[i].mbr_nda = 0;
     
    809824        /* FIXME: Is that correct? */
    810825        if (read) {
    811                 rtems_cache_invalidate_multiple_data_lines(paddr, len);
     826                rtems_cache_invalidate_multiple_data_lines(data, len);
    812827        } else {
    813                 rtems_cache_flush_multiple_data_lines(paddr, len);
     828                rtems_cache_flush_multiple_data_lines(data, len);
    814829        }
    815830        rtems_cache_flush_multiple_data_lines(dma_desc, sizeof(dma_desc));
     
    820835
    821836}
    822 
    823837#endif /* __rtems__ */
    824838static void
     
    826840{
    827841        uint32_t cmdr, mr;
     842        struct mmc_data *data;
    828843#ifdef __rtems__
    829         uint32_t number_blocks;
     844        uint32_t block_count;
    830845        uint32_t block_size;
    831846#endif /* __rtems__ */
    832         struct mmc_data *data;
    833847
    834848        sc->curcmd = cmd;
     
    928942        mr |=  min(data->len, 512) << 16;
    929943        WR4(sc, MCI_MR, mr | MCI_MR_PDCMODE|MCI_MR_PDCPADV);
    930 #else /* __rtems__ */
    931         mr = RD4(sc,MCI_MR);
    932         WR4(sc, MCI_MR, mr | MCI_MR_PDCPADV);
    933 
    934         WR4(sc, MCI_DMA, MCI_DMA_DMAEN | MCI_DMA_CHKSIZE_1);
    935 
    936         block_size = min(data->len, 512);
    937         number_blocks = data->len / block_size;
    938         WR4(sc, MCI_BLKR, block_size << 16 | number_blocks);
    939 #endif /* __rtems__ */
    940944
    941945        /*
     
    971975        sc->xfer_offset = 0;
    972976        sc->bbuf_curidx = 0;
     977#else /* __rtems__ */
     978        mr = RD4(sc,MCI_MR);
     979        WR4(sc, MCI_MR, mr | MCI_MR_PDCPADV);
     980
     981        WR4(sc, MCI_DMA, MCI_DMA_DMAEN | MCI_DMA_CHKSIZE_1);
     982
     983        block_size = min(data->len, 512);
     984        block_count = data->len / block_size;
     985        WR4(sc, MCI_BLKR, (block_size << 16) | block_count);
     986#endif /* __rtems__ */
    973987
    974988        if (data->flags & (MMC_DATA_READ | MMC_DATA_WRITE)) {
     989#ifndef __rtems__
    975990                uint32_t len;
    976991                uint32_t remaining = data->len;
     
    978993                int err;
    979994
    980 #ifndef __rtems__
    981995                if (remaining > (BBCOUNT*BBSIZE))
    982 #else /* __rtems__ */
    983                 if (remaining > (BBSIZE))
    984 #endif /* __rtems__ */
    985996                        panic("IO read size exceeds MAXDATA\n");
     997#endif /* __rtems__ */
    986998
    987999                if (data->flags & MMC_DATA_READ) {
     
    9901002                                len = remaining / 2;
    9911003                        else
    992 #else
    993                         /* FIXME: This reduces performance. Set up DMA in two
    994                          * parts instead like done on AT91. */
    995 #endif /* __rtems__ */
    9961004                                len = remaining;
    9971005                        err = bus_dmamap_load(sc->dmatag, sc->bbuf_map[0],
     
    10021010                        bus_dmamap_sync(sc->dmatag, sc->bbuf_map[0],
    10031011                            BUS_DMASYNC_PREREAD);
    1004 #ifndef __rtems__
    10051012                        WR4(sc, PDC_RPR, paddr);
    10061013                        WR4(sc, PDC_RCR, len / 4);
     
    10251032                        WR4(sc, PDC_PTCR, PDC_PTCR_RXTEN);
    10261033#else /* __rtems__ */
    1027                         at91_mci_setup_xdma(sc, true, block_size,
    1028                             number_blocks, paddr, len);
    1029 
    1030                         sc->bbuf_len[0] = len;
    1031                         remaining -= len;
    1032                         sc->bbuf_len[1] = 0;
    1033                         if (remaining != 0)
    1034                                 panic("Still rx-data left. This should never happen.");
     1034                        at91_mci_setup_xdma(sc, true, block_size, block_count,
     1035                            data->data, data->len);
    10351036#endif /* __rtems__ */
    10361037                } else {
     1038#ifndef __rtems__
    10371039                        len = min(BBSIZE, remaining);
    10381040                        at91_bswap_buf(sc, sc->bbuf_vaddr[0], data->data, len);
     
    10441046                        bus_dmamap_sync(sc->dmatag, sc->bbuf_map[0],
    10451047                            BUS_DMASYNC_PREWRITE);
    1046 #ifndef __rtems__
    10471048                        /*
    10481049                         * Erratum workaround:  PDC transfer length on a write
     
    10741075                        /* do not enable PDC xfer until CMDRDY asserted */
    10751076#else /* __rtems__ */
    1076                         at91_mci_setup_xdma(sc, false, block_size,
    1077                             number_blocks, paddr, len);
    1078 
    1079                         sc->bbuf_len[0] = len;
    1080                         remaining -= len;
    1081                         sc->bbuf_len[1] = 0;
    1082                         if (remaining != 0)
    1083                                 panic("Still tx-data left. This should never happen.");
    1084 
     1077                        at91_mci_setup_xdma(sc, false, block_size, block_count,
     1078                            data->data, data->len);
    10851079#endif /* __rtems__ */
    10861080                }
     
    11911185}
    11921186
     1187#ifndef __rtems__
    11931188static void
    11941189at91_mci_read_done(struct at91_mci_softc *sc, uint32_t sr)
     
    12081203         */
    12091204
    1210 #ifndef __rtems__
    12111205        bus_dmamap_sync(sc->dmatag, sc->bbuf_map[curidx], BUS_DMASYNC_POSTREAD);
    12121206        bus_dmamap_unload(sc->dmatag, sc->bbuf_map[curidx]);
    1213 #endif /* __rtems__ */
    12141207
    12151208        at91_bswap_buf(sc, dataptr + sc->xfer_offset, sc->bbuf_vaddr[curidx], len);
     
    12361229        } else {
    12371230                WR4(sc, PDC_RNCR, 0);
    1238 #ifndef __rtems__
    12391231                WR4(sc, MCI_IER, MCI_SR_ERROR | MCI_SR_ENDRX);
    1240 #else /* __rtems__ */
    1241                 WR4(sc, MCI_IER, MCI_SR_ERROR | MCI_SR_XFRDONE);
    1242 #endif /* __rtems__ */
    1243         }
    1244 }
     1232        }
     1233}
     1234#endif /* __rtems__ */
    12451235
    12461236static void
     
    12601250        WR4(sc, PDC_PTCR, PDC_PTCR_RXTDIS | PDC_PTCR_TXTDIS);
    12611251
     1252#ifndef __rtems__
    12621253        bus_dmamap_sync(sc->dmatag, sc->bbuf_map[sc->bbuf_curidx],
    12631254            BUS_DMASYNC_POSTWRITE);
    12641255        bus_dmamap_unload(sc->dmatag, sc->bbuf_map[sc->bbuf_curidx]);
     1256#endif /* __rtems__ */
    12651257
    12661258        if ((cmd->data->flags & MMC_DATA_MULTI) || (sr & MCI_SR_NOTBUSY)) {
     
    15331525#else /* __rtems__ */
    15341526                if (isr & MCI_SR_XFRDONE) {
    1535                         struct mmc_command *cmd = sc->curcmd;
    15361527                        if (cmd->data->flags & MMC_DATA_READ) {
    1537                                 at91_mci_read_done(sc, sr);
     1528                                WR4(sc, PDC_PTCR, PDC_PTCR_RXTDIS |
     1529                                    PDC_PTCR_TXTDIS);
     1530                                cmd->error = MMC_ERR_NONE;
     1531                                at91_mci_next_operation(sc);
    15381532                        } else {
    15391533                                if (sr & MCI_SR_BLKE)
Note: See TracChangeset for help on using the changeset viewer.