Changeset ef5d536 in rtems-libbsd


Ignore:
Timestamp:
Apr 27, 2018, 8:14:44 AM (13 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
b5f8d4831d66364b7391e3660560cb9bbecada2e, 31b5c87357cee83d6a3419c5d801a9bf16912714
Children:
b1404f2
Parents:
d45899b
Message:

at91_mci: Simplify XDMA usage

File:
1 edited

Legend:

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

    rd45899b ref5d536  
    148148 * original driver. But that would need some rework. */
    149149#else /* __rtems__ */
    150 #define MAX_BLOCKS 32
     150#define MAX_BLOCKS 256
    151151#endif /* __rtems__ */
    152152
     
    191191        uint32_t     xfer_offset;         /* offset so far into caller's buf */
    192192#else /* __rtems__ */
     193        LinkedListDescriporView1 xdma_desc;
    193194        uint32_t xdma_tx_channel;
    194195        uint32_t xdma_rx_channel;
     
    771772
    772773#ifdef __rtems__
    773 static LinkedListDescriporView1 dma_desc[MAX_BLOCKS];
    774 
    775774static void
    776 at91_mci_setup_xdma(struct at91_mci_softc *sc, bool read, uint32_t block_size,
    777     uint32_t block_count, void *data, uint32_t len)
    778 {
    779         sXdmadCfg *xdma_cfg;
    780         uint32_t xdma_channel;
     775at91_mci_setup_xdma(struct at91_mci_softc *sc, bool read, void *data,
     776    uint32_t len)
     777{
    781778        const uint32_t xdma_cndc = XDMAC_CNDC_NDVIEW_NDV1 |
    782779            XDMAC_CNDC_NDE_DSCR_FETCH_EN |
    783780            XDMAC_CNDC_NDSUP_SRC_PARAMS_UPDATED |
    784781            XDMAC_CNDC_NDDUP_DST_PARAMS_UPDATED;
    785         const uint32_t sa_rdr = (uint32_t)(sc->mem_res->r_bushandle + MCI_RDR);
    786         const uint32_t da_tdr = (uint32_t)(sc->mem_res->r_bushandle + MCI_TDR);
    787782        const uint32_t xdma_interrupt = XDMAC_CIE_BIE | XDMAC_CIE_DIE |
    788783            XDMAC_CIE_FIE | XDMAC_CIE_RBIE | XDMAC_CIE_WBIE | XDMAC_CIE_ROIE;
     784        sXdmadCfg *xdma_cfg;
     785        uint32_t xdma_channel;
    789786        eXdmadRC rc;
    790         size_t i;
     787
     788        if (len % 4 != 0)
     789                panic("invalid XDMA transfer length");
    791790
    792791        if (read) {
    793792                xdma_cfg = &sc->xdma_rx_cfg;
    794793                xdma_channel = sc->xdma_rx_channel;
     794                sc->xdma_desc.mbr_sa = (uint32_t)(sc->mem_res->r_bushandle +
     795                    MCI_RDR);
     796                sc->xdma_desc.mbr_da = (uint32_t)data;
     797                rtems_cache_invalidate_multiple_data_lines(data, len);
    795798        } else {
    796799                xdma_cfg = &sc->xdma_tx_cfg;
    797800                xdma_channel = sc->xdma_tx_channel;
    798         }
    799 
    800         for (i = 0; i < block_count; ++i) {
    801                 if (read) {
    802                         dma_desc[i].mbr_sa = sa_rdr;
    803                         dma_desc[i].mbr_da = ((uint32_t)data) + i * block_size;
    804                 } else {
    805                         dma_desc[i].mbr_sa = ((uint32_t)data) + i * block_size;
    806                         dma_desc[i].mbr_da = da_tdr;
    807                 }
    808                 dma_desc[i].mbr_ubc = XDMA_UBC_NVIEW_NDV1 |
    809                     XDMA_UBC_NDEN_UPDATED | (block_size/4);
    810                 if (i == block_count - 1) {
    811                         dma_desc[i].mbr_ubc |= XDMA_UBC_NDE_FETCH_DIS;
    812                         dma_desc[i].mbr_nda = 0;
    813                 } else {
    814                         dma_desc[i].mbr_ubc |= XDMA_UBC_NDE_FETCH_EN;
    815                         dma_desc[i].mbr_nda = (uint32_t) &dma_desc[i+1];
    816                 }
    817         }
     801                sc->xdma_desc.mbr_sa = (uint32_t)data;
     802                sc->xdma_desc.mbr_da = (uint32_t)(sc->mem_res->r_bushandle +
     803                    MCI_TDR);
     804                rtems_cache_flush_multiple_data_lines(data, len);
     805        }
     806
     807        sc->xdma_desc.mbr_ubc = XDMA_UBC_NVIEW_NDV1 |
     808            XDMA_UBC_NDEN_UPDATED | (len / 4);
     809        sc->xdma_desc.mbr_ubc |= XDMA_UBC_NDE_FETCH_DIS;
     810        sc->xdma_desc.mbr_nda = 0;
    818811
    819812        rc = XDMAD_ConfigureTransfer(pXdmad, xdma_channel, xdma_cfg, xdma_cndc,
    820             (uint32_t)dma_desc, xdma_interrupt);
     813            (uint32_t)&sc->xdma_desc, xdma_interrupt);
    821814        if (rc != XDMAD_OK)
    822                 panic("Could not configure XDMA: %d.", rc);
    823 
    824         /* FIXME: Is that correct? */
    825         if (read) {
    826                 rtems_cache_invalidate_multiple_data_lines(data, len);
    827         } else {
    828                 rtems_cache_flush_multiple_data_lines(data, len);
    829         }
    830         rtems_cache_flush_multiple_data_lines(dma_desc, sizeof(dma_desc));
     815                panic("configure XDMA failed: %d", rc);
     816
     817        rtems_cache_flush_multiple_data_lines(&sc->xdma_desc, sizeof(sc->xdma_desc));
    831818
    832819        rc = XDMAD_StartTransfer(pXdmad, xdma_channel);
    833820        if (rc != XDMAD_OK)
    834                 panic("Could not start XDMA: %d.", rc);
    835 
     821                panic("start XDMA failed: %d", rc);
    836822}
    837823#endif /* __rtems__ */
     
    10321018                        WR4(sc, PDC_PTCR, PDC_PTCR_RXTEN);
    10331019#else /* __rtems__ */
    1034                         at91_mci_setup_xdma(sc, true, block_size, block_count,
    1035                             data->data, data->len);
     1020                        at91_mci_setup_xdma(sc, true, data->data, data->len);
    10361021#endif /* __rtems__ */
    10371022                } else {
     
    10751060                        /* do not enable PDC xfer until CMDRDY asserted */
    10761061#else /* __rtems__ */
    1077                         at91_mci_setup_xdma(sc, false, block_size, block_count,
    1078                             data->data, data->len);
     1062                        at91_mci_setup_xdma(sc, false, data->data, data->len);
    10791063#endif /* __rtems__ */
    10801064                }
Note: See TracChangeset for help on using the changeset viewer.