NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

port-sgimips/38932: sgimips bus_dmamap_sync() is incorrect

>Number:         38932
>Category:       port-sgimips
>Synopsis:       sgimips bus_dmamap_sync() is incorrect
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    port-sgimips-maintainer
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Jun 10 14:55:00 +0000 2008
>Release:        current
Architecture: sgimips
Machine: sgimips
        The sgimips bus_dmamap_sync() do nothing for POSTREAD/POSTWRITE
        operations, assuming the PREREAD/PREWRITE operations have properly
        flushed/invalidated the cache. But cache invalidation should be done
        on POSTREAD operations too:
        if a driver loops waiting for a device to update a memory word
        by DMA (say, a status completion word of a DMA descriptor),
        the first read will properly fetch the value from memory, but
        subsequent ones will just get again the cached value, and the
        driver will never notice the updated word. If
        bus_dmamap_sync(POSTREAD) does a cache invalidation, the driver will
        see the updated value when the device writes it to memory.

        code inspection.
        bus_dmamap_sync(POSTREAD) should do a cache invalidation.
        bus_dmamap_sync(PREREAD) should probably be turned to a NOP
        (we may still to cache invalidation in addition to cache flush
        in the case PREREAD|PREWRITE).

Home | Main Index | Thread Index | Old Index