From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:45676) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R6G6a-0005Ho-HY for qemu-devel@nongnu.org; Wed, 21 Sep 2011 02:16:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R6G6Z-0006IG-6m for qemu-devel@nongnu.org; Wed, 21 Sep 2011 02:16:24 -0400 Received: from fmmailgate01.web.de ([217.72.192.221]:37274) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R6G6Y-0006I5-R2 for qemu-devel@nongnu.org; Wed, 21 Sep 2011 02:16:23 -0400 Message-ID: <4E798135.1050000@web.de> Date: Wed, 21 Sep 2011 08:16:21 +0200 From: Jan Kiszka MIME-Version: 1.0 References: <1316361891-8960-1-git-send-email-hpoussin@reactos.org> <4E76F5F2.7000204@siemens.com> <4E778EB7.5010706@reactos.org> <4E784E63.3050404@siemens.com> <4E7904AD.6040807@reactos.org> In-Reply-To: <4E7904AD.6040807@reactos.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Sender: jan.kiszka@web.de Subject: [Qemu-devel] [PATCH] Probe PCI existence List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: seabios Cc: =?UTF-8?B?SGVydsOpIFBvdXNzaW5lYXU=?= , "qemu-devel@nongnu.org" , Gerd Hoffmann From: Jan Kiszka This prevents lockups when trying to allocate PCI resources on an ISA-only system like QEMU can emulate. Signed-off-by: Jan Kiszka --- src/pci.c | 14 +++++++++++++- src/pci.h | 3 ++- src/pciinit.c | 7 +++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/pci.c b/src/pci.c index 49698ac..6031c9f 100644 --- a/src/pci.c +++ b/src/pci.c @@ -88,9 +88,21 @@ pci_next(int bdf, int bus) struct pci_device *PCIDevices; int MaxPCIBus VAR16VISIBLE; +// Check if PCI is available at all +int +pci_probe_host(void) +{ + outl(0x80000000, PORT_PCI_CMD); + if (inl(PORT_PCI_CMD) != 0x80000000) { + dprintf(1, "Detected non-PCI system\n"); + return -1; + } + return 0; +} + // Find all PCI devices and populate PCIDevices linked list. void -pci_probe(void) +pci_probe_devices(void) { dprintf(3, "PCI probe\n"); struct pci_device *busdevs[256]; diff --git a/src/pci.h b/src/pci.h index 3e28af2..a2a5a4c 100644 --- a/src/pci.h +++ b/src/pci.h @@ -62,7 +62,8 @@ struct pci_device { }; extern struct pci_device *PCIDevices; extern int MaxPCIBus; -void pci_probe(void); +int pci_probe_host(void); +void pci_probe_devices(void); static inline u32 pci_classprog(struct pci_device *pci) { return (pci->class << 8) | pci->prog_if; } diff --git a/src/pciinit.c b/src/pciinit.c index 597c8ea..a857da0 100644 --- a/src/pciinit.c +++ b/src/pciinit.c @@ -577,7 +577,7 @@ pci_setup(void) { if (CONFIG_COREBOOT || usingXen()) { // PCI setup already done by coreboot or Xen - just do probe. - pci_probe(); + pci_probe_devices(); return; } @@ -587,10 +587,13 @@ pci_setup(void) u32 end = BUILD_PCIMEM_END; dprintf(1, "=== PCI bus & bridge init ===\n"); + if (pci_probe_host() != 0) { + return; + } pci_bios_init_bus(); dprintf(1, "=== PCI device probing ===\n"); - pci_probe(); + pci_probe_devices(); dprintf(1, "=== PCI new allocation pass #1 ===\n"); busses = malloc_tmp(sizeof(*busses) * busses_count); -- 1.7.3.4