From owner-freebsd-stable@FreeBSD.ORG Tue May 19 15:28:09 2009 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 344221065673 for ; Tue, 19 May 2009 15:28:09 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id E8BA28FC0A for ; Tue, 19 May 2009 15:28:08 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id 7E6F246B90; Tue, 19 May 2009 11:28:08 -0400 (EDT) Received: from jhbbsd.hudson-trading.com (unknown [209.249.190.8]) by bigwig.baldwin.cx (Postfix) with ESMTPA id 66A8E8A028; Tue, 19 May 2009 11:28:07 -0400 (EDT) From: John Baldwin To: freebsd-stable@freebsd.org Date: Tue, 19 May 2009 09:56:09 -0400 User-Agent: KMail/1.9.7 References: <4A0CF934.4000706@incunabulum.net> <200905150850.19843.jhb@freebsd.org> <4A0E779B.4040309@incunabulum.net> In-Reply-To: <4A0E779B.4040309@incunabulum.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200905190956.10095.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.0.1 (bigwig.baldwin.cx); Tue, 19 May 2009 11:28:07 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.95 at bigwig.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-2.5 required=4.2 tests=AWL,BAYES_00,RDNS_NONE autolearn=no version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on bigwig.baldwin.cx Cc: Bruce Simpson Subject: Re: Boot panic w/7.2-STABLE on amd64: resource_list_alloc X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 May 2009 15:28:09 -0000 On Saturday 16 May 2009 4:21:47 am Bruce Simpson wrote: > John Baldwin wrote: > > ... > > Sounds like the ATA driver is allocating the same BAR twice. Hmm, yes, it > > allocates the resources once for each channel it seems in the ata_ali_sata > > attachment. Looking in ata-chipset.c, all the other chipsets are good about > > allocating these resources in their chipinit routines rather than the > > per-channel allocate routine. Well, except ata_pci_allocate() is also > > busted. *sigh* I can work on a patch for HEAD if you are willing to test. > > > > Yes, ata is gnarly in places... > > If a fix can be dropped straight into a 7.2 tree, then that is even > better... I could try testing a NanoBSD image of HEAD on this machine if > the change set delta between branches is sufficiently huge to prevent > backporting the fix; this is my desktop machine and this is the only > critical bug I've run into so far with 7.2. Try this fix for HEAD. I can do a 7.x patch as well, but it needs my other fix for different ATA breakage merged as well (as it adds support for chipset-specific data in the ATA controller backends). Note that in 7.x all the chipset code lives in sys/dev/ata/ata-chipset.c. Also, I plan to merge the other ATA fixes to 7 today. --- //depot/vendor/freebsd/src/sys/dev/ata/chipsets/ata-acerlabs.c 2009/03/04 18:30:14 +++ //depot/user/jhb/acpipci/dev/ata/chipsets/ata-acerlabs.c 2009/05/18 16:08:13 @@ -63,6 +63,9 @@ #define ALI_NEW 0x02 #define ALI_SATA 0x04 +struct ali_sata_resources { + struct resource *bars[4]; +}; /* * Acer Labs Inc (ALI) chipset support functions @@ -98,6 +101,8 @@ ata_ali_chipinit(device_t dev) { struct ata_pci_controller *ctlr = device_get_softc(dev); + struct ali_sata_resources *res; + int i, rid; if (ata_setup_interrupt(dev, ata_generic_intr)) return ENXIO; @@ -113,6 +118,22 @@ if ((ctlr->chip->chipid == ATA_ALI_5288) && (ata_ahci_chipinit(dev) != ENXIO)) return 0; + + /* Allocate resources for later use by channel attach routines. */ + res = malloc(sizeof(struct ali_sata_resources), M_TEMP, M_WAITOK); + for (i = 0; i < 4; i++) { + rid = PCIR_BAR(i); + res->bars[i] = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, + RF_ACTIVE); + if (res->bars[i] == NULL) { + device_printf(dev, "Failed to allocate BAR %d\n", i); + for (i--; i >=0; i--) + bus_release_resource(dev, SYS_RES_IOPORT, + PCIR_BAR(i), res->bars[i]); + free(res, M_TEMP); + } + } + ctlr->chipset_data = res; break; case ALI_NEW: @@ -168,20 +189,18 @@ device_t parent = device_get_parent(dev); struct ata_pci_controller *ctlr = device_get_softc(parent); struct ata_channel *ch = device_get_softc(dev); + struct ali_sata_resources *res; struct resource *io = NULL, *ctlio = NULL; int unit01 = (ch->unit & 1), unit10 = (ch->unit & 2); - int i, rid; - - rid = PCIR_BAR(0) + (unit01 ? 8 : 0); - io = bus_alloc_resource_any(parent, SYS_RES_IOPORT, &rid, RF_ACTIVE); - if (!io) - return ENXIO; + int i; - rid = PCIR_BAR(1) + (unit01 ? 8 : 0); - ctlio = bus_alloc_resource_any(parent, SYS_RES_IOPORT, &rid, RF_ACTIVE); - if (!ctlio) { - bus_release_resource(dev, SYS_RES_IOPORT, ATA_IOADDR_RID, io); - return ENXIO; + res = ctlr->chipset_data; + if (unit01) { + io = res->bars[2]; + ctlio = res->bars[3]; + } else { + io = res->bars[0]; + ctlio = res->bars[1]; } for (i = ATA_DATA; i <= ATA_COMMAND; i ++) { -- John Baldwin