Index: pxa2x0_lcd.c =================================================================== RCS file: /cvsroot/src/sys/arch/arm/xscale/pxa2x0_lcd.c,v retrieving revision 1.28 diff -u -r1.28 pxa2x0_lcd.c --- pxa2x0_lcd.c 13 Mar 2010 11:15:52 -0000 1.28 +++ pxa2x0_lcd.c 7 Aug 2010 17:31:02 -0000 @@ -78,6 +78,12 @@ const struct lcd_panel_geometry *geom; } pxa2x0_lcd_console; +#ifdef PXA2X0_LCD_WRITETHROUGH +int pxa2x0_lcd_writethrough = 1; /* patchable */ +#else +int pxa2x0_lcd_writethrough = 0; +#endif + int lcdintr(void *); static void pxa2x0_lcd_initialize(struct pxa2x0_lcd_softc *, @@ -330,6 +336,9 @@ iot = sc->iot; ioh = sc->ioh; + bus_dmamap_sync(sc->dma_tag, scr->dma, 0, scr->buf_size, + BUS_DMASYNC_PREWRITE); + save = disable_interrupts(I32_bit); switch (scr->depth) { @@ -533,10 +542,31 @@ } error = bus_dmamem_map(dma_tag, scr->segs, scr->nsegs, size, - (void **)&scr->buf_va, busdma_flag | BUS_DMA_COHERENT); + (void **)&scr->buf_va, + busdma_flag | (pxa2x0_lcd_writethrough ? 0 : BUS_DMA_COHERENT)); if (error) goto bad; + /* XXX: should we have BUS_DMA_WRITETHROUGH in MI bus_dma(9) API? */ + if (pxa2x0_lcd_writethrough) { + pt_entry_t *ptep; + vaddr_t va, eva; + + va = (vaddr_t)scr->buf_va; + eva = va + size; + while (va < eva) { + /* take from arm/arm32/bus_dma.c:_bus_dmamem_map() */ + cpu_dcache_wbinv_range(va, PAGE_SIZE); + cpu_drain_writebuf(); + ptep = vtopte(va); + *ptep &= ~L2_S_CACHE_MASK; + *ptep |= L2_C; + PTE_SYNC(ptep); + tlb_flush(); + va += PAGE_SIZE; + } + } + memset(scr->buf_va, 0, scr->buf_size); /* map memory for DMA */ @@ -896,7 +926,8 @@ return -1; return bus_dmamem_mmap(sc->dma_tag, scr->segs, scr->nsegs, - offset, prot, BUS_DMA_WAITOK|BUS_DMA_COHERENT); + offset, prot, + BUS_DMA_WAITOK | (pxa2x0_lcd_writethrough ? 0 : BUS_DMA_COHERENT)); }