Date: Thu, 29 Jan 2009 23:26:49 -0800 From: Andrew Thompson <thompsa@FreeBSD.org> To: arm@freebsd.org Subject: busdma problem Message-ID: <20090130072649.GF73709@citylink.fud.org.nz>
next in thread | raw e-mail | index | archive | help
Hi, I am having an issue with busdma when bounce buffers are used. I have patched _bus_dmamap_sync_bp() to print out the details when a bounce happens and also print the driver buffer before and after. During normal dma everything is fine, Before: 0xc7c1ab40 data=c1:4b:a4:80:c0:5d:ed:78:00:00:08:0d:c1:1f:46:78:00:00:20:02:00:00:20:02: [...do dma...] After: 0xc7c1ab40 data=2c:03:4e:00:6f:00:76:00:61:00:74:00:65:00:6c:00:20:00:57:00:69:00:72:00: The buffer 2c:03:4e:00:... is the correct response from the hardware. When a bounce buffer is used I see the correct data come in and be bcopy'd to my memory region but it is not visible when read later. Before: 0xc7c29b40 data=c1:50:19:00:c0:5d:ed:f8:00:00:08:0d:c1:1f:46:78:00:00:20:02:00:00:20:02: dma bounced 0x1271000 -> 0xc7c29b40 len=193 data=2c:03:4e:00:6f:00:76:00:61:00:74:00:65:00:6c:00:20:00:57:00:69:00:72:00: After: 0xc7c29b40 data=c1:50:19:00:c0:5d:ed:f8:00:00:08:0d:c1:1f:46:78:00:00:20:02:00:00:20:02: This is on an xscale ixp425 with 128m memory, the PCI dma tag is limited to 64m. Andrew Index: src/sys/arm/arm/busdma_machdep.c =================================================================== --- src/sys/arm/arm/busdma_machdep.c (revision 13717) +++ src/sys/arm/arm/busdma_machdep.c (working copy) @@ -1128,6 +1128,19 @@ } static void +dbgprint_safe(const uint8_t *buf, int len) +{ + const uint8_t *p; + int i; + + if (len > 24) + len = 24; + + for (i = 0, p = buf; i < len; i++, p++) + printf("%02x:", *p); +} + +static void _bus_dmamap_sync_bp(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op) { struct bounce_page *bpage; @@ -1144,6 +1157,7 @@ cpu_l2cache_wb_range(bpage->vaddr, bpage->datacount); } + dmat->bounce_zone->total_bounced++; } if (op & BUS_DMASYNC_POSTREAD) { if (bpage->vaddr_nocache == 0) { @@ -1155,6 +1169,12 @@ bcopy((void *)(bpage->vaddr_nocache != 0 ? bpage->vaddr_nocache : bpage->vaddr), (void *)bpage->datavaddr, bpage->datacount); + printf("dma bounced %p -> %p len=%d data=", + (void *)bpage->busaddr, (void *)bpage->datavaddr, + bpage->datacount); + dbgprint_safe((void *)bpage->datavaddr, bpage->datacount); + printf("\n"); + dmat->bounce_zone->total_bounced++; } } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090130072649.GF73709>