Module Name:    src
Committed By:   tsutsui
Date:           Sat Jun 13 13:35:11 UTC 2009

Modified Files:
        src/sys/arch/amd64/amd64: mainbus.c
        src/sys/arch/i386/i386: mainbus.c
        src/sys/arch/x86/x86: mp.c

Log Message:
Apply fixes from jmcneill@ for PR port-i386/38729
(ACPI kernel booted under qemu cannot detect devices):
- make MP SCANPCI function for ACPI_SCANPCI and MPBIOS_SCANPCI
  return a number of attached PCI busses
- if no valid PCI busses are attached in the MP SCANPCI function,
  try to probe and attach pci0 at mainbus as well as kernels
  with no SCANPCI options

"Feel free to check it in" from jmcne...@.
Tested in pkgsrc qemu-0.9.1 (both i386 and x86_64) on NetBSD/i386.

Note original jmcneill's patch was posted on March:
http://mail-index.NetBSD.org/port-i386/2009/03/24/msg001281.html
and I also applied it to amd64:
http://mail-index.NetBSD.org/port-i386/2009/03/24/msg001283.html
but x86 MP attach functions have been reorganized by dyoung@ on April:
http://mail-index.NetBSD.org/source-changes/2009/04/17/msg219992.html
so I've modified the original patches to adapt the changes.
(mpacpi_scan_pci() and mpbios_scan_pci() have been merged into
 common mp_pci_scan() in new arch/x86/x86/mp.c)
For netbsd-5 and netbsd-5-0 branches, the original patches should be
applied cleanly, and they have been tested by abs@ on a selection of
i386 boxes and in qemu.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/amd64/amd64/mainbus.c
cvs rdiff -u -r1.84 -r1.85 src/sys/arch/i386/i386/mainbus.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/x86/x86/mp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/amd64/mainbus.c
diff -u src/sys/arch/amd64/amd64/mainbus.c:1.27 src/sys/arch/amd64/amd64/mainbus.c:1.28
--- src/sys/arch/amd64/amd64/mainbus.c:1.27	Fri Apr 17 21:07:58 2009
+++ src/sys/arch/amd64/amd64/mainbus.c	Sat Jun 13 13:35:11 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: mainbus.c,v 1.27 2009/04/17 21:07:58 dyoung Exp $	*/
+/*	$NetBSD: mainbus.c,v 1.28 2009/06/13 13:35:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.27 2009/04/17 21:07:58 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.28 2009/06/13 13:35:11 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -253,6 +253,8 @@
 
 #if NPCI > 0
 	if (pci_mode != 0) {
+		int npcibus = 0;
+
 		mba.mba_pba.pba_iot = X86_BUS_SPACE_IO;
 		mba.mba_pba.pba_memt = X86_BUS_SPACE_MEM;
 		mba.mba_pba.pba_dmat = &pci_bus_dma_tag;
@@ -262,16 +264,16 @@
 		mba.mba_pba.pba_bus = 0;
 		mba.mba_pba.pba_bridgetag = NULL;
 #if NACPI > 0 && defined(ACPI_SCANPCI)
-		if (mpacpi_active)
-			mp_pci_scan(self, &mba.mba_pba, pcibusprint);
-		else
+		if (npcibus == 0 && mpacpi_active)
+			npcibus = mp_pci_scan(self, &mba.mba_pba, pcibusprint);
 #endif
 #if defined(MPBIOS) && defined(MPBIOS_SCANPCI)
-		if (mpbios_scanned != 0)
-			mp_pci_scan(self, &mba.mba_pba, pcibusprint);
-		else
+		if (npcibus == 0 && mpbios_scanned != 0)
+			npcibus = mp_pci_scan(self, &mba.mba_pba, pcibusprint);
 #endif
-		config_found_ia(self, "pcibus", &mba.mba_pba, pcibusprint);
+		if (npcibus == 0)
+			config_found_ia(self, "pcibus", &mba.mba_pba,
+			    pcibusprint);
 
 #if NACPI > 0
 		if (mp_verbose)

Index: src/sys/arch/i386/i386/mainbus.c
diff -u src/sys/arch/i386/i386/mainbus.c:1.84 src/sys/arch/i386/i386/mainbus.c:1.85
--- src/sys/arch/i386/i386/mainbus.c:1.84	Fri Apr 17 21:07:58 2009
+++ src/sys/arch/i386/i386/mainbus.c	Sat Jun 13 13:35:11 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: mainbus.c,v 1.84 2009/04/17 21:07:58 dyoung Exp $	*/
+/*	$NetBSD: mainbus.c,v 1.85 2009/06/13 13:35:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.84 2009/04/17 21:07:58 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.85 2009/06/13 13:35:11 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -396,6 +396,8 @@
 	 */
 #if NPCI > 0
 	if (pci_mode != 0 && ifattr_match(ifattr, "pcibus")) {
+		int npcibus = 0;
+
 		mba.mba_pba.pba_iot = X86_BUS_SPACE_IO;
 		mba.mba_pba.pba_memt = X86_BUS_SPACE_MEM;
 		mba.mba_pba.pba_dmat = &pci_bus_dma_tag;
@@ -405,16 +407,14 @@
 		mba.mba_pba.pba_bus = 0;
 		mba.mba_pba.pba_bridgetag = NULL;
 #if NACPI > 0 && defined(ACPI_SCANPCI)
-		if (sc->sc_mpacpi_active)
-			mp_pci_scan(self, &mba.mba_pba, pcibusprint);
-		else
+		if (npcibus == 0 && sc->sc_mpacpi_active)
+			npcibus = mp_pci_scan(self, &mba.mba_pba, pcibusprint);
 #endif
 #if defined(MPBIOS) && defined(MPBIOS_SCANPCI)
-		if (mpbios_scanned != 0)
-			mp_pci_scan(self, &mba.mba_pba, pcibusprint);
-		else
+		if (npcibus == 0 && mpbios_scanned != 0)
+			npcibus = mp_pci_scan(self, &mba.mba_pba, pcibusprint);
 #endif
-		if (sc->sc_pci == NULL) {
+		if (npcibus == 0 && sc->sc_pci == NULL) {
 			sc->sc_pci = config_found_ia(self, "pcibus",
 			    &mba.mba_pba, pcibusprint);
 		}

Index: src/sys/arch/x86/x86/mp.c
diff -u src/sys/arch/x86/x86/mp.c:1.1 src/sys/arch/x86/x86/mp.c:1.2
--- src/sys/arch/x86/x86/mp.c:1.1	Fri Apr 17 21:07:58 2009
+++ src/sys/arch/x86/x86/mp.c	Sat Jun 13 13:35:11 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: mp.c,v 1.1 2009/04/17 21:07:58 dyoung Exp $	*/
+/*	$NetBSD: mp.c,v 1.2 2009/06/13 13:35:11 tsutsui Exp $	*/
 
 /*
  * Copyright (c) 2003 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mp.c,v 1.1 2009/04/17 21:07:58 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mp.c,v 1.2 2009/06/13 13:35:11 tsutsui Exp $");
 
 #include "opt_multiprocessor.h"
 #include "pchb.h"
@@ -64,9 +64,10 @@
 mp_pci_scan(device_t self, struct pcibus_attach_args *pba,
 	        cfprint_t print)
 {
-	int i;
+	int i, cnt;
 	struct mp_bus *mpb;
 
+	cnt = 0;
 	for (i = 0; i < mp_nbus; i++) {
 		mpb = &mp_busses[i];
 		if (mpb->mb_name == NULL)
@@ -75,9 +76,10 @@
 			pba->pba_bus = i;
 			mpb->mb_dev =
 			    config_found_ia(self, "pcibus", pba, print);
+			cnt++;
 		}
 	}
-	return 0;
+	return cnt;
 }
 
 void

Reply via email to