Changeset 3ef41be in rtems-libbsd


Ignore:
Timestamp:
Jan 10, 2017, 8:16:17 AM (4 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
b96abfd647154f10ea8f7fac68e25676636eded5, 9dd0bc27e3338bad08eaaf52d03265d2e7b9b4f7, 7027254d293cf3a8c888bd9f25052e96f458bc67, d164b840c3973e0793da1b3e4142b1711514b9ba
Children:
2360b08
Parents:
0436d64
git-author:
Sebastian Huber <sebastian.huber@…> (01/10/17 08:16:17)
git-committer:
Sebastian Huber <sebastian.huber@…> (01/10/17 08:53:34)
Message:

if_dwc: Use explicit cache operations

Location:
freebsd/sys/dev/dwc
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/dev/dwc/if_dwc.c

    r0436d64 r3ef41be  
    182182}
    183183
     184#ifndef __rtems__
    184185static void
    185186dwc_get1paddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
     
    190191        *(bus_addr_t *)arg = segs[0].ds_addr;
    191192}
     193#endif /* __rtems__ */
    192194
    193195static void
     
    256258}
    257259
     260#ifdef __rtems__
     261static int
     262dwc_get_segs_for_tx(struct mbuf *m, bus_dma_segment_t segs[TX_MAX_DMA_SEGS],
     263    int *nsegs)
     264{
     265        int i = 0;
     266
     267        do {
     268                if (m->m_len > 0) {
     269                        segs[i].ds_addr = mtod(m, bus_addr_t);
     270                        segs[i].ds_len = m->m_len;
     271                        rtems_cache_flush_multiple_data_lines(m->m_data, m->m_len);
     272                        ++i;
     273                }
     274
     275                m = m->m_next;
     276
     277                if (m == NULL) {
     278                        *nsegs = i;
     279
     280                        return (0);
     281                }
     282        } while (i < TX_MAX_DMA_SEGS);
     283
     284        return (EFBIG);
     285}
     286#endif /* __rtems__ */
    258287static void
    259288dwc_setup_txbuf(struct dwc_softc *sc, struct mbuf *m, int *start_tx)
     
    263292
    264293        idx = sc->tx_idx_head;
     294#ifndef __rtems__
    265295        error = bus_dmamap_load_mbuf_sg(sc->txbuf_tag, sc->txbuf_map[idx].map,
    266296            m, &seg, &nsegs, BUS_DMA_NOWAIT);
    267297
     298#else /* __rtems__ */
     299        error = dwc_get_segs_for_tx(m, segs, &nsegs);
     300#endif /* __rtems__ */
    268301        if (error == EFBIG) {
    269302                /* Too many segments!  Defrag and try again. */
     
    275308                }
    276309                m = m2;
     310#ifndef __rtems__
    277311                error = bus_dmamap_load_mbuf_sg(sc->txbuf_tag,
    278312                    sc->txbuf_map[idx].map, m, &seg, &nsegs, BUS_DMA_NOWAIT);
     313#else /* __rtems__ */
     314                error = dwc_get_segs_for_tx(m, segs, &nsegs);
     315#endif /* __rtems__ */
    279316        }
    280317        if (error != 0) {
     
    286323        sc->txbuf_map[idx].mbuf = m;
    287324
     325#ifndef __rtems__
    288326        bus_dmamap_sync(sc->txbuf_tag, sc->txbuf_map[idx].map,
    289327            BUS_DMASYNC_PREWRITE);
     328#endif /* __rtems__ */
    290329
    291330        dwc_setup_txdesc(sc, m->m_pkthdr.csum_flags, idx, segs, nsegs);
     
    519558        sc->rxdesc_ring[idx].addr = (uint32_t)paddr;
    520559        nidx = next_rxidx(sc, idx);
     560#ifndef __rtems__
    521561        sc->rxdesc_ring[idx].addr_next = sc->rxdesc_ring_paddr +        \
    522562            (nidx * sizeof(struct dwc_hwdesc));
     563#else /* __rtems__ */
     564        sc->rxdesc_ring[idx].addr_next = (uint32_t)&sc->rxdesc_ring[nidx];
     565#endif /* __rtems__ */
    523566        if (sc->mactype == DWC_GMAC_ALT_DESC)
    524567                sc->rxdesc_ring[idx].tdes1 = DDESC_CNTL_CHAINED | RX_MAX_PACKET;
     
    537580{
    538581        bus_dma_segment_t seg;
     582#ifndef __rtems__
    539583        int error, nsegs;
     584#endif /* __rtems__ */
    540585
    541586        m_adj(m, ETHER_ALIGN);
    542587
     588#ifndef __rtems__
    543589        error = bus_dmamap_load_mbuf_sg(sc->rxbuf_tag, sc->rxbuf_map[idx].map,
    544590            m, &seg, &nsegs, 0);
     
    551597        bus_dmamap_sync(sc->rxbuf_tag, sc->rxbuf_map[idx].map,
    552598            BUS_DMASYNC_PREREAD);
     599#else /* __rtems__ */
     600        rtems_cache_invalidate_multiple_data_lines(m->m_data, m->m_len);
     601        seg.ds_addr = mtod(m, bus_addr_t);
     602#endif /* __rtems__ */
    553603
    554604        sc->rxbuf_map[idx].mbuf = m;
     
    772822                        break;
    773823                bmap = &sc->txbuf_map[sc->tx_idx_tail];
     824#ifndef __rtems__
    774825                bus_dmamap_sync(sc->txbuf_tag, bmap->map,
    775826                    BUS_DMASYNC_POSTWRITE);
    776827                bus_dmamap_unload(sc->txbuf_tag, bmap->map);
     828#endif /* __rtems__ */
    777829                m_freem(bmap->mbuf);
    778830                bmap->mbuf = NULL;
     
    834886                }
    835887
     888#ifndef __rtems__
    836889                bus_dmamap_sync(sc->rxbuf_tag, sc->rxbuf_map[idx].map,
    837890                    BUS_DMASYNC_POSTREAD);
    838891                bus_dmamap_unload(sc->rxbuf_tag, sc->rxbuf_map[idx].map);
     892#endif /* __rtems__ */
    839893
    840894                len = (rdes0 >> DDESC_RDES0_FL_SHIFT) & DDESC_RDES0_FL_MASK;
     
    9521006        }
    9531007
     1008#ifndef __rtems__
    9541009        error = bus_dmamap_load(sc->txdesc_tag, sc->txdesc_map,
    9551010            sc->txdesc_ring, TX_DESC_SIZE, dwc_get1paddr,
     
    9601015                goto out;
    9611016        }
     1017#endif /* __rtems__ */
    9621018
    9631019        for (idx = 0; idx < TX_DESC_COUNT; idx++) {
     
    9711027                }
    9721028                nidx = next_txidx(sc, idx, 1);
     1029#ifndef __rtems__
    9731030                sc->txdesc_ring[idx].addr_next = sc->txdesc_ring_paddr +
    9741031                    (nidx * sizeof(struct dwc_hwdesc));
    975         }
    976 
     1032#else /* __rtems__ */
     1033                sc->txdesc_ring[idx].addr_next =
     1034                    (uint32_t)&sc->txdesc_ring[nidx];
     1035#endif /* __rtems__ */
     1036        }
     1037
     1038#ifndef __rtems__
    9771039        error = bus_dma_tag_create(
    9781040            bus_get_dma_tag(sc->dev),   /* Parent tag. */
     
    9911053                goto out;
    9921054        }
     1055#endif /* __rtems__ */
    9931056
    9941057        for (idx = 0; idx < TX_DESC_COUNT; idx++) {
     1058#ifndef __rtems__
    9951059                error = bus_dmamap_create(sc->txbuf_tag, BUS_DMA_COHERENT,
    9961060                    &sc->txbuf_map[idx].map);
     
    10001064                        goto out;
    10011065                }
     1066#endif /* __rtems__ */
    10021067        }
    10031068
     
    10311096        }
    10321097
     1098#ifndef __rtems__
    10331099        error = bus_dmamap_load(sc->rxdesc_tag, sc->rxdesc_map,
    10341100            sc->rxdesc_ring, RX_DESC_SIZE, dwc_get1paddr,
     
    10561122                goto out;
    10571123        }
     1124#endif /* __rtems__ */
    10581125
    10591126        for (idx = 0; idx < RX_DESC_COUNT; idx++) {
     1127#ifndef __rtems__
    10601128                error = bus_dmamap_create(sc->rxbuf_tag, BUS_DMA_COHERENT,
    10611129                    &sc->rxbuf_map[idx].map);
     
    10651133                        goto out;
    10661134                }
     1135#endif /* __rtems__ */
    10671136                if ((m = dwc_alloc_mbufcl(sc)) == NULL) {
    10681137                        device_printf(sc->dev, "Could not alloc mbuf\n");
     
    13141383
    13151384        /* Setup addresses */
     1385#ifndef __rtems__
    13161386        WRITE4(sc, RX_DESCR_LIST_ADDR, sc->rxdesc_ring_paddr);
    13171387        WRITE4(sc, TX_DESCR_LIST_ADDR, sc->txdesc_ring_paddr);
     1388#else /* __rtems__ */
     1389        WRITE4(sc, RX_DESCR_LIST_ADDR, (uint32_t)&sc->rxdesc_ring[0]);
     1390        WRITE4(sc, TX_DESCR_LIST_ADDR, (uint32_t)&sc->txdesc_ring[0]);
     1391#endif /* __rtems__ */
    13181392
    13191393        mtx_init(&sc->mtx, device_get_nameunit(sc->dev),
  • freebsd/sys/dev/dwc/if_dwcvar.h

    r0436d64 r3ef41be  
    6161
    6262struct dwc_bufmap {
     63#ifndef __rtems__
    6364        bus_dmamap_t            map;
     65#endif /* __rtems__ */
    6466        struct mbuf             *mbuf;
    6567};
     
    8991        bus_dmamap_t            rxdesc_map;
    9092        struct dwc_hwdesc       *rxdesc_ring;
     93#ifndef __rtems__
    9194        bus_addr_t              rxdesc_ring_paddr;
    9295        bus_dma_tag_t           rxbuf_tag;
     96#endif /* __rtems__ */
    9397        struct dwc_bufmap       rxbuf_map[RX_DESC_COUNT];
    9498        uint32_t                rx_idx;
     
    98102        bus_dmamap_t            txdesc_map;
    99103        struct dwc_hwdesc       *txdesc_ring;
     104#ifndef __rtems__
    100105        bus_addr_t              txdesc_ring_paddr;
    101106        bus_dma_tag_t           txbuf_tag;
     107#endif /* __rtems__ */
    102108        struct dwc_bufmap       txbuf_map[TX_DESC_COUNT];
    103109        uint32_t                tx_idx_head;
Note: See TracChangeset for help on using the changeset viewer.