On Wed, Apr 22, 2020 at 05:53:46PM -0400, Mouse wrote:
>               s = splhigh()
>               while (fewer than n samples copied)
>                       DMASYNC_POSTREAD for sample at offset o

That should be PREREAD (to make sure the dma'd data is visible for the
cpu)

>                       read sample at offset o

and teh POSTREAD should be here

>                       if value is "impossible", break

missig PREWRITE here

>                       set sample at offset o to "impossible" value
>                       DMASYNC_PREWRITE for sample at offset o

and this should be POSTWRITE

>                       store sample in buffer[]
>               splx(s)
>               uiomove from buffer[]
>               if we found an "impossible" value, break;

See the example in the -current man page:

              An example of using bus_dmamap_sync(), involving multiple read-
              write use of a single mapping might look like this:

              bus_dmamap_load(...);

              while (not done) {
                      /* invalidate soon-to-be-stale cache blocks */
                      bus_dmamap_sync(..., BUS_DMASYNC_PREREAD);

                      [ do read DMA ]

                      /* copy from bounce */
                      bus_dmamap_sync(..., BUS_DMASYNC_POSTREAD);

                      /* read data now in driver-provided buffer */

                      [ computation ]

                      /* data to be written now in driver-provided buffer */

                      /* flush write buffers and writeback, copy to bounce */
                      bus_dmamap_sync(..., BUS_DMASYNC_PREWRITE);

                      [ do write DMA ]

                      /* probably a no-op, but provided for consistency */
                      bus_dmamap_sync(..., BUS_DMASYNC_POSTWRITE);
              }

              bus_dmamap_unload(...);

I always have to look up the direction, but READ is when CPU reads data
provided by the device.

Martin

Reply via email to