From patchwork Mon Oct 12 14:20:46 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Michael S. Tsirkin" X-Patchwork-Id: 35764 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id A4988B7088 for ; Tue, 13 Oct 2009 01:32:33 +1100 (EST) Received: from localhost ([127.0.0.1]:54892 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MxLws-0006yI-0m for incoming@patchwork.ozlabs.org; Mon, 12 Oct 2009 10:32:30 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MxLnh-0007sn-5m for qemu-devel@nongnu.org; Mon, 12 Oct 2009 10:23:01 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MxLnb-0007nq-Ib for qemu-devel@nongnu.org; Mon, 12 Oct 2009 10:22:59 -0400 Received: from [199.232.76.173] (port=60843 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MxLnb-0007nc-5W for qemu-devel@nongnu.org; Mon, 12 Oct 2009 10:22:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58480) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MxLna-0006FL-O9 for qemu-devel@nongnu.org; Mon, 12 Oct 2009 10:22:55 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n9CEMr4J031377; Mon, 12 Oct 2009 10:22:53 -0400 Received: from redhat.com (vpn-10-53.str.redhat.com [10.32.10.53]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with SMTP id n9CEMnuH007996; Mon, 12 Oct 2009 10:22:50 -0400 Date: Mon, 12 Oct 2009 16:20:46 +0200 From: "Michael S. Tsirkin" To: Gleb Natapov Message-ID: <20091012142046.GC13357@redhat.com> References: <1255287547-28329-3-git-send-email-gleb@redhat.com> <20091011215356.GC6411@redhat.com> <20091012065024.GS16702@redhat.com> <20091012095225.GA11741@redhat.com> <20091012100821.GE16702@redhat.com> <20091012110335.GA12546@redhat.com> <20091012114841.GF16702@redhat.com> <20091012115916.GA12834@redhat.com> <20091012120857.GI16702@redhat.com> <20091012132025.GA13022@redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20091012132025.GA13022@redhat.com> User-Agent: Mutt/1.5.19 (2009-01-05) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: kevin@koconnor.net, qemu-devel@nongnu.org Subject: [Qemu-devel] seabios: fix low bits in ROM and I/O sizing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This cleans up handling of low bits during BAR sizing, to match PCI spec requirements, and to use symbolic constants from pci_regs.h Issues fixed: For ROM BARs, bit 0 is writeable (enable bit), which we not only don't want to set, but it will stick and make us think it's an I/O port resource. Further, PCI spec defines the following bits as reserved: - bit 1 in I/O BAR - bits 10:1 in ROM BAR and we should be careful and preserve any values there, and should ignore anything we read from these registers. Bits 3:2 in I/O BAR might be writeable, so it is wrong to mask them when calculating BAR size. Spec references: See 6.2.5.1 for I/O and memory, and 6.2.5.2 for ROM, 6.1 for reserved bit handling; pages 225, 228 and 214 in PCI spec revision 3.0. See also Qemu pcbios commit 6ddb9f5c742b2b82b1755d7ec2a127f6e20e3806 Original-by: Gleb Natapov Signed-off-by: Michael S. Tsirkin --- So, here's my latest version, I fixed some TABs versus spaces here. Gleb, if you want to rewrite it using 0xffffffff, or go back to your original patch, go ahead. It's not really important, either way. If you are OK as is, let me know and I will try to get this merged. diff --git a/src/pciinit.c b/src/pciinit.c index 7d2ea00..031d2f9 100644 --- a/src/pciinit.c +++ b/src/pciinit.c @@ -136,16 +136,23 @@ static void pci_bios_init_device(u16 bdf) /* default memory mappings */ for (i = 0; i < PCI_NUM_REGIONS; i++) { int ofs; - u32 val, size; - + u32 val, mask, size; if (i == PCI_ROM_SLOT) ofs = PCI_ROM_ADDRESS; else ofs = PCI_BASE_ADDRESS_0 + i * 4; - pci_config_writel(bdf, ofs, 0xffffffff); + + val = pci_config_readl(bdf, ofs); + if (i == PCI_ROM_SLOT) + mask = PCI_ROM_ADDRESS_MASK; + else if (val & PCI_BASE_ADDRESS_SPACE_IO) + mask = PCI_BASE_ADDRESS_IO_MASK; + else + mask = PCI_BASE_ADDRESS_MEM_MASK; + pci_config_writel(bdf, ofs, val | mask); val = pci_config_readl(bdf, ofs); if (val != 0) { - size = (~(val & ~0xf)) + 1; + size = (~(val & mask)) + 1; if (val & PCI_BASE_ADDRESS_SPACE_IO) paddr = &pci_bios_io_addr; else if (size >= 0x04000000)