Skip site navigation (1)Skip section navigation (2)
Date:      20 Dec 2004 16:39:15 -0000
From:      Sven Petai <hadara@bsd.ee>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        sos@FreeBSD.org
Subject:   alpha/75317: ATA DMA broken on PCalpha
Message-ID:  <20041220163915.90711.qmail@bsd.ee>
Resent-Message-ID: <200412201640.iBKGeC7d096936@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         75317
>Category:       alpha
>Synopsis:       ATA DMA broken on PCalpha
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    freebsd-alpha
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Dec 20 16:40:12 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Sven Petai
>Release:        FreeBSD 6.0-CURRENT
>Organization:
NPO BSD Estonia
>Environment:
>Description:
Machine fails to boot with various different symptoms after mounting root, sometimes
it hangs, sometimes it gets machine check etc. I traced it down to introduction
of version 1.129 of the file src/sys/dev/ata/ata-dma.c which among other changes removes code
that did split up segments into page sized chunks to avoid running into some kind
of bug in busdma. it was commented as:
"A maximum segment size was specified for bus_dma_tag_create, but
 some busdma code does not seem to honor this, so fix up if needed."

>How-To-Repeat:
Just try to boot fbsd 5.3 release on similar hardware.

>Fix:
easy & ugly workaround is to just disable ata dma from the loader with
set hw.ata.ata_dma=0
maybe a little bit better workaround is following patch, which just reverts to 
previous behaviour:

--- sys/dev/ata/ata-dma.c.orig  Mon Dec 20 08:27:25 2004
+++ sys/dev/ata/ata-dma.c       Mon Dec 20 08:47:15 2004
@@ -198,16 +198,22 @@
 {
     struct ata_dmasetprd_args *args = xsc;
     struct ata_dma_prdentry *prd = args->dmatab;
-    int i;
+    int i,j;
+    bus_size_t cnt;
+    u_int32_t lastcount;

     if ((args->error = error))
        return;

+    lastcount = j = 0;
     for (i = 0; i < nsegs; i++) {
-       prd[i].addr = htole32(segs[i].ds_addr);
-       prd[i].count = htole32(segs[i].ds_len);
+       for (cnt = 0; cnt < segs[i].ds_len; cnt += PAGE_SIZE, j++) {
+             prd[j].addr = htole32(segs[i].ds_addr + cnt);
+             lastcount = ulmin(segs[i].ds_len - cnt, PAGE_SIZE) & 0xffff;
+             prd[j].count = htole32(lastcount);
+        }
     }
-    prd[i - 1].count |= htole32(ATA_DMA_EOT);
+    prd[j - 1].count |= htole32(lastcount | ATA_DMA_EOT);
 }

 static int


of course the real solution should be finding and fixing the bug in busdma code.
>Release-Note:
>Audit-Trail:
>Unformatted:
 >System: FreeBSD alpha 6.0-CURRENT FreeBSD 6.0-CURRENT #23: Mon Dec 20 05:07:30 EET 2004     root@alpha:/mnt/disk/obj/usr/src/sys/HADARA  alpha
 dmesg can be found @ http://bsd.ee/~hadara/debug/pcalpha/kernel.txt
 but relevant details of it should be:
 Digital AlphaPC 164LX 533 MHz, 531MHz
 8192 byte page size, 1 processor.
 ...
 ad0: 1226MB <FUJITSU M1636TAU/5045> [2491/16/63] at ata0-master WDMA2
 ad1: 3052MB <SAMSUNG SV0322A/JK200-36> [11024/9/63] at ata0-slave WDMA2
 ...
 this is IDE only machine



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041220163915.90711.qmail>