From owner-freebsd-arm@FreeBSD.ORG Fri Jan 30 07:56:30 2009 Return-Path: Delivered-To: arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 520C310656C0 for ; Fri, 30 Jan 2009 07:56:30 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from pele.citylink.co.nz (pele.citylink.co.nz [202.8.44.226]) by mx1.freebsd.org (Postfix) with ESMTP id EACBA8FC12 for ; Fri, 30 Jan 2009 07:56:29 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from localhost (localhost [127.0.0.1]) by pele.citylink.co.nz (Postfix) with ESMTP id 13365FF05 for ; Fri, 30 Jan 2009 20:26:54 +1300 (NZDT) X-Virus-Scanned: Debian amavisd-new at citylink.co.nz Received: from pele.citylink.co.nz ([127.0.0.1]) by localhost (pele.citylink.co.nz [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hy+A1D2CmLoH for ; Fri, 30 Jan 2009 20:26:50 +1300 (NZDT) Received: from citylink.fud.org.nz (unknown [202.8.44.45]) by pele.citylink.co.nz (Postfix) with ESMTP for ; Fri, 30 Jan 2009 20:26:50 +1300 (NZDT) Received: by citylink.fud.org.nz (Postfix, from userid 1001) id E58451142C; Fri, 30 Jan 2009 20:26:49 +1300 (NZDT) Date: Thu, 29 Jan 2009 23:26:49 -0800 From: Andrew Thompson To: arm@freebsd.org Message-ID: <20090130072649.GF73709@citylink.fud.org.nz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.17 (2007-11-01) Cc: Subject: busdma problem X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to the StrongARM Processor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Jan 2009 07:56:30 -0000 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++; } } }