Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Jun 2004 02:03:25 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 54883 for review
Message-ID:  <200406140203.i5E23O4q033664@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=54883

Change 54883 by rwatson@rwatson_tislabs on 2004/06/14 02:02:31

	Integrate netperf_socket.

Affected files ...

.. //depot/projects/netperf_socket/sys/amd64/amd64/pmap.c#13 integrate
.. //depot/projects/netperf_socket/sys/amd64/conf/GENERIC#8 integrate
.. //depot/projects/netperf_socket/sys/amd64/include/pmap.h#9 integrate
.. //depot/projects/netperf_socket/sys/contrib/altq/altq/altq_subr.c#2 integrate
.. //depot/projects/netperf_socket/sys/crypto/des/des_ecb.c#2 integrate
.. //depot/projects/netperf_socket/sys/crypto/des/des_enc.c#2 integrate
.. //depot/projects/netperf_socket/sys/crypto/des/des_setkey.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#22 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_acad.c#7 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_button.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_cmbat.c#4 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_ec.c#9 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_isab.c#4 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_lid.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pcib_acpi.c#5 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_resource.c#6 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpivar.h#14 integrate
.. //depot/projects/netperf_socket/sys/dev/sound/pci/emu10k1.c#6 integrate
.. //depot/projects/netperf_socket/sys/i386/i386/pmap.c#9 integrate
.. //depot/projects/netperf_socket/sys/net/if_fwsubr.c#3 integrate
.. //depot/projects/netperf_socket/sys/pc98/pc98/pc98gdc.c#4 integrate
.. //depot/projects/netperf_socket/sys/sys/_types.h#2 integrate
.. //depot/projects/netperf_socket/sys/sys/resource.h#4 integrate
.. //depot/projects/netperf_socket/sys/sys/types.h#5 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/amd64/amd64/pmap.c#13 (text+ko) ====

@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.468 2004/06/13 19:48:38 alc Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.470 2004/06/14 01:17:50 alc Exp $");
 
 /*
  *	Manages physical address maps.
@@ -464,6 +464,7 @@
 	/*
 	 * Initialize the kernel pmap (which is statically allocated).
 	 */
+	PMAP_LOCK_INIT(kernel_pmap);
 	kernel_pmap->pm_pml4 = (pdp_entry_t *) (KERNBASE + KPML4phys);
 	kernel_pmap->pm_active = -1;	/* don't allow deactivation */
 	TAILQ_INIT(&kernel_pmap->pm_pvlist);
@@ -1035,6 +1036,7 @@
 	struct pmap *pmap;
 {
 
+	PMAP_LOCK_INIT(pmap);
 	pmap->pm_pml4 = (pml4_entry_t *)(KERNBASE + KPML4phys);
 	pmap->pm_active = 0;
 	TAILQ_INIT(&pmap->pm_pvlist);
@@ -1055,6 +1057,8 @@
 	vm_page_t pml4pg;
 	static vm_pindex_t color;
 
+	PMAP_LOCK_INIT(pmap);
+
 	/*
 	 * allocate the page directory page
 	 */
@@ -1306,6 +1310,7 @@
 	atomic_subtract_int(&cnt.v_wire_count, 1);
 	vm_page_free_zero(m);
 	vm_page_unlock_queues();
+	PMAP_LOCK_DESTROY(pmap);
 }
 
 static int
@@ -1675,6 +1680,7 @@
 #endif
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
+		PMAP_LOCK(pv->pv_pmap);
 		pv->pv_pmap->pm_stats.resident_count--;
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		tpte = pte_load_clear(pte);
@@ -1702,6 +1708,7 @@
 		TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
 		m->md.pv_list_count--;
 		pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
+		PMAP_UNLOCK(pv->pv_pmap);
 		free_pv_entry(pv);
 	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
@@ -1733,6 +1740,7 @@
 
 	anychanged = 0;
 
+	PMAP_LOCK(pmap);
 	for (; sva < eva; sva = va_next) {
 
 		pml4e = pmap_pml4e(pmap, sva);
@@ -1810,6 +1818,7 @@
 	}
 	if (anychanged)
 		pmap_invalidate_all(pmap);
+	PMAP_UNLOCK(pmap);
 }
 
 /*
@@ -2183,6 +2192,7 @@
 	 * Wiring is not a hardware characteristic so there is no need to
 	 * invalidate TLB.
 	 */
+	PMAP_LOCK(pmap);
 	pte = pmap_pte(pmap, va);
 	if (wired && (*pte & PG_W) == 0) {
 		pmap->pm_stats.wired_count++;
@@ -2191,6 +2201,7 @@
 		pmap->pm_stats.wired_count--;
 		atomic_clear_long(pte, PG_W);
 	}
+	PMAP_UNLOCK(pmap);
 }
 
 
@@ -2438,6 +2449,7 @@
 	}
 #endif
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	PMAP_LOCK(pmap);
 	for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
 
 		if (pv->pv_va >= eva || pv->pv_va < sva) {
@@ -2498,6 +2510,7 @@
 		free_pv_entry(pv);
 	}
 	pmap_invalidate_all(pmap);
+	PMAP_UNLOCK(pmap);
 }
 
 /*
@@ -2530,10 +2543,13 @@
 			continue;
 		}
 #endif
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		if (*pte & PG_M) {
+			PMAP_UNLOCK(pv->pv_pmap);
 			return TRUE;
 		}
+		PMAP_UNLOCK(pv->pv_pmap);
 	}
 	return (FALSE);
 }
@@ -2593,6 +2609,7 @@
 		}
 #endif
 
+		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		pbits = *pte;
 		if (pbits & bit) {
@@ -2606,6 +2623,7 @@
 			}
 			pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
 		}
+		PMAP_UNLOCK(pv->pv_pmap);
 	}
 	if (bit == PG_RW)
 		vm_page_flag_clear(m, PG_WRITEABLE);
@@ -2666,17 +2684,20 @@
 			if (!pmap_track_modified(pv->pv_va))
 				continue;
 
+			PMAP_LOCK(pv->pv_pmap);
 			pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 
 			if (pte && ((v = pte_load(pte)) & PG_A) != 0) {
-				pte_store(pte, v & ~PG_A);
+				atomic_clear_long(pte, PG_A);
 				pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
 
 				rtval++;
 				if (rtval > 4) {
+					PMAP_UNLOCK(pv->pv_pmap);
 					break;
 				}
 			}
+			PMAP_UNLOCK(pv->pv_pmap);
 		} while ((pv = pvn) != NULL && pv != pvf);
 	}
 

==== //depot/projects/netperf_socket/sys/amd64/conf/GENERIC#8 (text+ko) ====

@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first
 # in NOTES.
 #
-# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.410 2004/06/03 21:40:41 peter Exp $
+# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.411 2004/06/13 23:03:57 obrien Exp $
 
 machine		amd64
 cpu		HAMMER
@@ -28,6 +28,7 @@
 makeoptions	DEBUG=-g		# Build kernel with gdb(1) debug symbols
 
 options 	SCHED_ULE		# ULE scheduler
+options 	ADAPTIVE_MUTEXES	# mutexes first spin lock, then sleep
 options 	INET			# InterNETworking
 options 	INET6			# IPv6 communications protocols
 options 	FFS			# Berkeley Fast Filesystem

==== //depot/projects/netperf_socket/sys/amd64/include/pmap.h#9 (text+ko) ====

@@ -39,7 +39,7 @@
  *
  *	from: hp300: @(#)pmap.h	7.2 (Berkeley) 12/16/90
  *	from: @(#)pmap.h	7.4 (Berkeley) 5/12/91
- * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.118 2004/06/13 03:44:11 alc Exp $
+ * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.119 2004/06/14 01:17:50 alc Exp $
  */
 
 #ifndef _MACHINE_PMAP_H_
@@ -129,6 +129,8 @@
 
 #ifndef LOCORE
 
+#include <sys/_lock.h>
+#include <sys/_mutex.h>
 #include <sys/queue.h>
 
 typedef u_int64_t pd_entry_t;
@@ -218,6 +220,7 @@
 };
 
 struct pmap {
+	struct mtx		pm_mtx;
 	pml4_entry_t		*pm_pml4;	/* KVA of level 4 page table */
 	TAILQ_HEAD(,pv_entry)	pm_pvlist;	/* list of mappings in pmap */
 	u_int			pm_active;	/* active on cpus */
@@ -231,6 +234,17 @@
 #ifdef _KERNEL
 extern struct pmap	kernel_pmap_store;
 #define kernel_pmap	(&kernel_pmap_store)
+
+#define	PMAP_LOCK(pmap)		mtx_lock(&(pmap)->pm_mtx)
+#define	PMAP_LOCK_ASSERT(pmap, type) \
+				mtx_assert(&(pmap)->pm_mtx, (type))
+#define	PMAP_LOCK_DESTROY(pmap)	mtx_destroy(&(pmap)->pm_mtx)
+#define	PMAP_LOCK_INIT(pmap)	mtx_init(&(pmap)->pm_mtx, "pmap", \
+				    NULL, MTX_DEF)
+#define	PMAP_LOCKED(pmap)	mtx_owned(&(pmap)->pm_mtx)
+#define	PMAP_MTX(pmap)		(&(pmap)->pm_mtx)
+#define	PMAP_TRYLOCK(pmap)	mtx_trylock(&(pmap)->pm_mtx)
+#define	PMAP_UNLOCK(pmap)	mtx_unlock(&(pmap)->pm_mtx)
 #endif
 
 /*

==== //depot/projects/netperf_socket/sys/contrib/altq/altq/altq_subr.c#2 (text+ko) ====

@@ -1,4 +1,4 @@
-/*	$FreeBSD: src/sys/contrib/altq/altq/altq_subr.c,v 1.2 2004/06/12 00:57:20 mlaier Exp $	*/
+/*	$FreeBSD: src/sys/contrib/altq/altq/altq_subr.c,v 1.3 2004/06/13 22:52:38 mlaier Exp $	*/
 /*	$KAME: altq_subr.c,v 1.21 2003/11/06 06:32:53 kjc Exp $	*/
 
 /*
@@ -71,7 +71,9 @@
 
 /* machine dependent clock related includes */
 #ifdef __FreeBSD__
+#if __FreeBSD__ < 3
 #include "opt_cpu.h"	/* for FreeBSD-2.2.8 to get i586_ctr_freq */
+#endif
 #include <machine/clock.h>
 #endif
 #if defined(__i386__)

==== //depot/projects/netperf_socket/sys/crypto/des/des_ecb.c#2 (text+ko) ====

@@ -1,7 +1,7 @@
-/*	$FreeBSD: src/sys/crypto/des/des_ecb.c,v 1.5 2002/03/05 09:19:02 ume Exp $	*/
 /*	$KAME: des_ecb.c,v 1.6 2001/09/10 04:03:58 itojun Exp $	*/
 
 /* crypto/des/ecb_enc.c */
+
 /* Copyright (C) 1995-1998 Eric Young (eay@mincom.oz.au)
  * All rights reserved.
  *
@@ -48,6 +48,9 @@
  * [including the GNU Public Licence.]
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/crypto/des/des_ecb.c,v 1.6 2004/06/14 00:38:54 obrien Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <crypto/des/des_locl.h>

==== //depot/projects/netperf_socket/sys/crypto/des/des_enc.c#2 (text+ko) ====

@@ -1,7 +1,7 @@
 /*	$KAME: des_enc.c,v 1.1 2001/09/10 04:03:58 itojun Exp $	*/
-/*	$FreeBSD: src/sys/crypto/des/des_enc.c,v 1.1 2002/03/05 09:19:02 ume Exp $	*/
 
 /* crypto/des/des_enc.c */
+
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -59,6 +59,9 @@
  * [including the GNU Public Licence.]
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/crypto/des/des_enc.c,v 1.2 2004/06/14 00:38:54 obrien Exp $");
+
 #include <sys/types.h>
 #include <crypto/des/des_locl.h>
 

==== //depot/projects/netperf_socket/sys/crypto/des/des_setkey.c#2 (text+ko) ====

@@ -1,7 +1,7 @@
-/*	$FreeBSD: src/sys/crypto/des/des_setkey.c,v 1.6 2002/03/05 09:19:02 ume Exp $	*/
 /*	$KAME: des_setkey.c,v 1.7 2001/09/10 04:03:58 itojun Exp $	*/
 
 /* crypto/des/set_key.c */
+
 /* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
  * All rights reserved.
  *
@@ -55,6 +55,10 @@
  * 1.1 added norm_expand_bits
  * 1.0 First working version
  */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: src/sys/crypto/des/des_setkey.c,v 1.7 2004/06/14 00:38:16 obrien Exp $");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <crypto/des/des_locl.h>

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#22 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.158 2004/06/13 17:29:35 njl Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi.c,v 1.159 2004/06/13 22:52:30 njl Exp $
  */
 
 #include "opt_acpi.h"
@@ -81,6 +81,9 @@
 struct mtx	acpi_mutex;
 #endif
 
+/* Local pools for managing system resources for ACPI child devices. */
+struct rman acpi_rman_io, acpi_rman_mem;
+
 struct acpi_quirks {
     char	*OemId;
     uint32_t	OemRevision;
@@ -111,10 +114,7 @@
 			uintptr_t *result);
 static int	acpi_write_ivar(device_t dev, device_t child, int index,
 			uintptr_t value);
-static int	acpi_set_resource(device_t dev, device_t child, int type,
-			int rid, u_long start, u_long count);
-static int	acpi_get_resource(device_t dev, device_t child, int type,
-			int rid, u_long *startp, u_long *countp);
+static struct resource_list *acpi_get_rlist(device_t dev, device_t child);
 static struct resource *acpi_alloc_resource(device_t bus, device_t child,
 			int type, int *rid, u_long start, u_long end,
 			u_long count, u_int flags);
@@ -162,8 +162,9 @@
     DEVMETHOD(bus_print_child,		acpi_print_child),
     DEVMETHOD(bus_read_ivar,		acpi_read_ivar),
     DEVMETHOD(bus_write_ivar,		acpi_write_ivar),
-    DEVMETHOD(bus_set_resource,		acpi_set_resource),
-    DEVMETHOD(bus_get_resource,		acpi_get_resource),
+    DEVMETHOD(bus_get_resource_list,	acpi_get_rlist),
+    DEVMETHOD(bus_set_resource,		bus_generic_rl_set_resource),
+    DEVMETHOD(bus_get_resource,		bus_generic_rl_get_resource),
     DEVMETHOD(bus_alloc_resource,	acpi_alloc_resource),
     DEVMETHOD(bus_release_resource,	acpi_release_resource),
     DEVMETHOD(bus_child_pnpinfo_str,	acpi_child_pnpinfo_str_method),
@@ -395,6 +396,20 @@
     bzero(sc, sizeof(*sc));
     sc->acpi_dev = dev;
 
+    /* Initialize resource manager. */
+    acpi_rman_io.rm_type = RMAN_ARRAY;
+    acpi_rman_io.rm_start = 0;
+    acpi_rman_io.rm_end = 0xffff;
+    acpi_rman_io.rm_descr = "I/O ports";
+    if (rman_init(&acpi_rman_io) != 0)
+	panic("acpi rman_init IO ports failed");
+    acpi_rman_mem.rm_type = RMAN_ARRAY;
+    acpi_rman_mem.rm_start = 0;
+    acpi_rman_mem.rm_end = ~0ul;
+    acpi_rman_mem.rm_descr = "I/O memory addresses";
+    if (rman_init(&acpi_rman_mem) != 0)
+	panic("acpi rman_init memory failed");
+
 #ifdef ACPI_DEBUGGER
     debugpoint = getenv("debug.acpi.debugger");
     if (debugpoint) {
@@ -824,56 +839,102 @@
 /*
  * Handle child resource allocation/removal
  */
-static int
-acpi_set_resource(device_t dev, device_t child, int type, int rid,
-		  u_long start, u_long count)
+static struct resource_list *
+acpi_get_rlist(device_t dev, device_t child)
 {
-    struct acpi_device		*ad = device_get_ivars(child);
-    struct resource_list	*rl = &ad->ad_rl;
+    struct acpi_device		*ad;
 
-    resource_list_add(rl, type, rid, start, start + count -1, count);
-
-    return(0);
-}
-
-static int
-acpi_get_resource(device_t dev, device_t child, int type, int rid,
-		  u_long *startp, u_long *countp)
-{
-    struct acpi_device		*ad = device_get_ivars(child);
-    struct resource_list	*rl = &ad->ad_rl;
-    struct resource_list_entry	*rle;
-
-    rle = resource_list_find(rl, type, rid);
-    if (!rle)
-	return(ENOENT);
-	
-    if (startp)
-	*startp = rle->start;
-    if (countp)
-	*countp = rle->count;
-
-    return (0);
+    ad = device_get_ivars(child);
+    return (&ad->ad_rl);
 }
 
 static struct resource *
 acpi_alloc_resource(device_t bus, device_t child, int type, int *rid,
-		    u_long start, u_long end, u_long count, u_int flags)
+    u_long start, u_long end, u_long count, u_int flags)
 {
     struct acpi_device *ad = device_get_ivars(child);
     struct resource_list *rl = &ad->ad_rl;
+    struct resource_list_entry *rle;
+    struct resource *res;
+    struct rman *rm;
+    int needactivate;
+
+    /*
+     * If this is an allocation of the "default" range for a given RID, and
+     * we know what the resources for this device are (i.e., they're on the
+     * child's resource list), use those start/end values.
+     */
+    if (start == 0UL && end == ~0UL) {
+	rle = resource_list_find(rl, type, *rid);
+	if (rle == NULL)
+	    return (NULL);
+	start = rle->start;
+	end = rle->end;
+	count = rle->count;
+    }
+
+    /* If we don't manage this address, pass the request up to the parent. */
+    rle = acpi_sysres_find(type, start);
+    if (rle == NULL) {
+	return (BUS_ALLOC_RESOURCE(device_get_parent(bus), child, type, rid,
+	    start, end, count, flags));
+    }
 
-    return (resource_list_alloc(rl, bus, child, type, rid, start, end, count,
-	    flags));
+    /* We only handle memory and IO resources through rman. */
+    switch (type) {
+    case SYS_RES_IOPORT:
+	rm = &acpi_rman_io;
+	break;
+    case SYS_RES_MEMORY:
+	rm = &acpi_rman_mem;
+	break;
+    default:
+	panic("acpi_alloc_resource: invalid res type %d", type);
+    }
+
+    /* If we do know it, allocate it from the local pool. */
+    needactivate = flags & RF_ACTIVE;
+    flags &= ~RF_ACTIVE;
+    res = rman_reserve_resource(rm, start, end, count, flags, child);
+    if (res == NULL)
+	return (NULL);
+
+    /* Copy the bus tag from the pre-allocated resource. */
+    rman_set_bustag(res, rman_get_bustag(rle->res));
+    if (type == SYS_RES_IOPORT)
+	rman_set_bushandle(res, res->r_start);
+
+    /* If requested, activate the resource using the parent's method. */
+    if (needactivate)
+	if (bus_activate_resource(child, type, *rid, res) != 0) {
+	    rman_release_resource(res);
+	    return (NULL);
+	}
+
+    return (res);
 }
 
 static int
-acpi_release_resource(device_t bus, device_t child, int type, int rid, struct resource *r)
+acpi_release_resource(device_t bus, device_t child, int type, int rid,
+    struct resource *r)
 {
-    struct acpi_device *ad = device_get_ivars(child);
-    struct resource_list *rl = &ad->ad_rl;
+    int ret;
+
+    /*
+     * If we know about this address, deactivate it and release it to the
+     * local pool.  If we don't, pass this request up to the parent.
+     */
+    if (acpi_sysres_find(type, rman_get_start(r)) == NULL) {
+	if (rman_get_flags(r) & RF_ACTIVE) {
+	    ret = bus_deactivate_resource(child, type, rid, r);
+	    if (ret != 0)
+		return (ret);
+	}
+	ret = rman_release_resource(r);
+    } else
+	ret = BUS_RELEASE_RESOURCE(device_get_parent(bus), child, type, rid, r);
 
-    return (resource_list_release(rl, bus, child, type, rid, r));
+    return (ret);
 }
 
 /* Allocate an IO port or memory resource, given its GAS. */
@@ -1043,8 +1104,8 @@
 {
     ACPI_HANDLE	parent;
     ACPI_STATUS	status;
+    int		i;
     static char	*scopes[] = {"\\_PR_", "\\_TZ_", "\\_SI", "\\_SB_", NULL};
-    int		i;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
     ACPI_ASSERTLOCK;
@@ -1091,6 +1152,28 @@
     return_VOID;
 }
 
+static int
+acpi_probe_order(ACPI_HANDLE handle, int level, int *order)
+{
+    int ret;
+
+    ret = 0;
+    /* IO port and memory system resource holders are first. */
+    if (acpi_MatchHid(handle, "PNP0C01") || acpi_MatchHid(handle, "PNP0C02")) {
+	*order = 1;
+	ret = 1;
+    }
+
+    /* The embedded controller is needed to handle accesses early. */
+    if (acpi_MatchHid(handle, "PNP0C09")) {
+	*order = 2;
+	ret = 1;
+    }
+
+    *order = (level + 1) * 10;
+    return (ret);
+}
+
 /*
  * Evaluate a child device and determine whether we might attach a device to
  * it.
@@ -1099,7 +1182,8 @@
 acpi_probe_child(ACPI_HANDLE handle, UINT32 level, void *context, void **status)
 {
     ACPI_OBJECT_TYPE	type;
-    device_t		child, bus = (device_t)context;
+    device_t		child, bus;
+    int			order, probe_now;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -1107,6 +1191,7 @@
     if (acpi_avoid(handle))
 	return_ACPI_STATUS (AE_OK);
 
+    bus = (device_t)context;
     if (ACPI_SUCCESS(AcpiGetType(handle, &type))) {
 	switch(type) {
 	case ACPI_TYPE_DEVICE:
@@ -1122,7 +1207,8 @@
 	     */
 	    ACPI_DEBUG_PRINT((ACPI_DB_OBJECTS, "scanning '%s'\n",
 			     acpi_name(handle)));
-	    child = BUS_ADD_CHILD(bus, level * 10, NULL, -1);
+	    probe_now = acpi_probe_order(handle, level, &order);
+	    child = BUS_ADD_CHILD(bus, order, NULL, -1);
 	    if (child == NULL)
 		break;
 
@@ -1154,6 +1240,8 @@
 	    acpi_parse_resources(child, handle, &acpi_res_parse_set, NULL);
 
 	    /* If we're debugging, probe/attach now rather than later */
+	    if (probe_now)
+		device_probe_and_attach(child);
 	    ACPI_DEBUG_EXEC(device_probe_and_attach(child));
 	    break;
 	}
@@ -1342,13 +1430,12 @@
 }
 
 /*
- * Match a HID string against a device
+ * Match a HID string against a handle
  */
 BOOLEAN
-acpi_MatchHid(device_t dev, char *hid) 
+acpi_MatchHid(ACPI_HANDLE h, char *hid) 
 {
     ACPI_DEVICE_INFO	*devinfo;
-    ACPI_HANDLE		h;
     ACPI_BUFFER		buf;
     ACPI_STATUS		error;
     int			ret, i;
@@ -1356,15 +1443,13 @@
     ACPI_ASSERTLOCK;
 
     ret = FALSE;
-    if (hid == NULL)
-	return (FALSE);
-    if ((h = acpi_get_handle(dev)) == NULL)
-	return (FALSE);
+    if (hid == NULL || h == NULL)
+	return (ret);
     buf.Pointer = NULL;
     buf.Length = ACPI_ALLOCATE_BUFFER;
     error = AcpiGetObjectInfo(h, &buf);
     if (ACPI_FAILURE(error))
-	return (FALSE);
+	return (ret);
     devinfo = (ACPI_DEVICE_INFO *)buf.Pointer;
 
     if ((devinfo->Valid & ACPI_VALID_HID) != 0 &&

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_acad.c#7 (text+ko) ====

@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_acad.c,v 1.26 2004/05/30 20:08:23 phk Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_acad.c,v 1.27 2004/06/13 22:52:30 njl Exp $
  */
 
 #include "opt_acpi.h"
@@ -137,7 +137,7 @@
 acpi_acad_probe(device_t dev)
 {
     if (acpi_get_type(dev) == ACPI_TYPE_DEVICE && !acpi_disabled("acad") &&
-	acpi_MatchHid(dev, "ACPI0003")) {
+	acpi_MatchHid(acpi_get_handle(dev), "ACPI0003")) {
 	device_set_desc(dev, "AC Adapter");
 	return (0);
     }

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_button.c#5 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpi_button.c,v 1.26 2004/05/30 20:08:23 phk Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi_button.c,v 1.27 2004/06/13 22:52:30 njl Exp $
  */
 
 #include "opt_acpi.h"
@@ -90,24 +90,26 @@
 acpi_button_probe(device_t dev)
 {
     struct acpi_button_softc	*sc;
+    ACPI_HANDLE h;
     int ret = ENXIO;
 
+    h = acpi_get_handle(dev);
     sc = device_get_softc(dev);
     if (acpi_get_type(dev) == ACPI_TYPE_DEVICE && !acpi_disabled("button")) {
-	if (acpi_MatchHid(dev, "PNP0C0C")) {
+	if (acpi_MatchHid(h, "PNP0C0C")) {
 	    device_set_desc(dev, "Power Button");
 	    sc->button_type = ACPI_POWER_BUTTON;
 	    ret = 0;
-	} else if (acpi_MatchHid(dev, "ACPI_FPB")) {
+	} else if (acpi_MatchHid(h, "ACPI_FPB")) {
 	    device_set_desc(dev, "Power Button (fixed)");
 	    sc->button_type = ACPI_POWER_BUTTON;
 	    sc->fixed = 1;
 	    ret = 0;
-	} else if (acpi_MatchHid(dev, "PNP0C0E")) {
+	} else if (acpi_MatchHid(h, "PNP0C0E")) {
 	    device_set_desc(dev, "Sleep Button");
 	    sc->button_type = ACPI_SLEEP_BUTTON;
 	    ret = 0;
-	} else if (acpi_MatchHid(dev, "ACPI_FSB")) {
+	} else if (acpi_MatchHid(h, "ACPI_FSB")) {
 	    device_set_desc(dev, "Sleep Button (fixed)");
 	    sc->button_type = ACPI_SLEEP_BUTTON;
 	    sc->fixed = 1;

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_cmbat.c#4 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/acpica/acpi_cmbat.c,v 1.29 2004/05/30 20:08:23 phk Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi_cmbat.c,v 1.30 2004/06/13 22:52:30 njl Exp $
  */
 
 #include "opt_acpi.h"
@@ -291,8 +291,8 @@
 static int
 acpi_cmbat_probe(device_t dev)
 {
-    if (acpi_get_type(dev) == ACPI_TYPE_DEVICE &&
-	!acpi_disabled("cmbat") && acpi_MatchHid(dev, "PNP0C0A")) {
+    if (acpi_get_type(dev) == ACPI_TYPE_DEVICE && !acpi_disabled("cmbat")
+	&& acpi_MatchHid(acpi_get_handle(dev), "PNP0C0A")) {
 
 	device_set_desc(dev, "Control Method Battery");
 	return (0);

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_ec.c#9 (text+ko) ====

@@ -25,7 +25,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.51 2004/05/30 20:08:23 phk Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.52 2004/06/13 22:52:30 njl Exp $
  */
 /******************************************************************************
  *
@@ -137,7 +137,7 @@
  *****************************************************************************/
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.51 2004/05/30 20:08:23 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_ec.c,v 1.52 2004/06/13 22:52:30 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -454,7 +454,7 @@
     if (DEV_ECDT(dev)) {
 	params = acpi_get_private(dev);
 	ret = 0;
-    } else if (acpi_MatchHid(dev, "PNP0C09")) {
+    } else if (acpi_MatchHid(acpi_get_handle(dev), "PNP0C09")) {
 	params = malloc(sizeof(struct acpi_ec_params), M_TEMP,
 			M_WAITOK | M_ZERO);
 	h = acpi_get_handle(dev);

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_isab.c#4 (text+ko) ====

@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_isab.c,v 1.7 2004/05/30 20:08:23 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_isab.c,v 1.8 2004/06/13 22:52:30 njl Exp $");
 
 /*
  * ISA Bridge driver for Generic ISA Bus Devices.  See section 10.7 of the
@@ -90,11 +90,13 @@
 static int
 acpi_isab_probe(device_t dev)
 {
+	ACPI_HANDLE h;
 
+	h = acpi_get_handle(dev);
 	if (acpi_get_type(dev) == ACPI_TYPE_DEVICE &&
 	    !acpi_disabled("isa") &&
 	    devclass_get_device(isab_devclass, 0) == dev &&
-	    (acpi_MatchHid(dev, "PNP0A05") || acpi_MatchHid(dev, "PNP0A06"))) {
+	    (acpi_MatchHid(h, "PNP0A05") || acpi_MatchHid(h, "PNP0A06"))) {
 		device_set_desc(dev, "ACPI Generic ISA bridge");
 		return (0);
 	}

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_lid.c#5 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_lid.c,v 1.22 2004/05/30 20:08:23 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_lid.c,v 1.23 2004/06/13 22:52:30 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -82,7 +82,7 @@
 acpi_lid_probe(device_t dev)
 {
     if (acpi_get_type(dev) == ACPI_TYPE_DEVICE && !acpi_disabled("lid") &&
-	acpi_MatchHid(dev, "PNP0C0D")) {
+	acpi_MatchHid(acpi_get_handle(dev), "PNP0C0D")) {
 
 	device_set_desc(dev, "Control Method Lid Switch");
 	return (0);

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_pcib_acpi.c#5 (text+ko) ====

@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.34 2004/05/30 20:08:23 phk Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpi_pcib_acpi.c,v 1.35 2004/06/13 22:52:30 njl Exp $
  */
 #include "opt_acpi.h"
 #include <sys/param.h>
@@ -117,7 +117,7 @@
 {
 
     if (acpi_get_type(dev) == ACPI_TYPE_DEVICE && !acpi_disabled("pci") &&
-	acpi_MatchHid(dev, "PNP0A03")) {
+	acpi_MatchHid(acpi_get_handle(dev), "PNP0A03")) {
 
 	if (pci_cfgregopen() == 0)
 		return (ENXIO);

==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_resource.c#6 (text+ko) ====

@@ -26,12 +26,13 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_resource.c,v 1.24 2004/05/30 20:08:23 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_resource.c,v 1.25 2004/06/13 22:52:30 njl Exp $");
 
 #include "opt_acpi.h"
 #include <sys/param.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
+#include <sys/malloc.h>
 #include <sys/module.h>
 
 #include <machine/bus.h>
@@ -537,72 +538,125 @@
 }
 
 /*
- * Resource-owning placeholders.
+ * Resource-owning placeholders for IO and memory pseudo-devices.
  *
- * This code "owns" system resource objects that aren't
- * otherwise useful to devices, and which shouldn't be
- * considered "free".
- *
- * Note that some systems claim *all* of the physical address space
- * with a PNP0C01 device, so we cannot correctly "own" system memory
- * here (must be done in the SMAP handler on x86 systems, for
- * example).
+ * This code allocates system resource objects that will be owned by ACPI
+ * child devices.  Really, the acpi parent device should have the resources
+ * but this would significantly affect the device probe code.
  */
 
-static int	acpi_sysresource_probe(device_t dev);
-static int	acpi_sysresource_attach(device_t dev);
+static int	acpi_sysres_probe(device_t dev);
+static int	acpi_sysres_attach(device_t dev);
 
-static device_method_t acpi_sysresource_methods[] = {
+static device_method_t acpi_sysres_methods[] = {
     /* Device interface */
-    DEVMETHOD(device_probe,	acpi_sysresource_probe),
-    DEVMETHOD(device_attach,	acpi_sysresource_attach),
+    DEVMETHOD(device_probe,	acpi_sysres_probe),
+    DEVMETHOD(device_attach,	acpi_sysres_attach),
 
     {0, 0}
 };
 
-static driver_t acpi_sysresource_driver = {
+static driver_t acpi_sysres_driver = {
     "acpi_sysresource",
-    acpi_sysresource_methods,
+    acpi_sysres_methods,
     0,
 };
 
-static devclass_t acpi_sysresource_devclass;
-DRIVER_MODULE(acpi_sysresource, acpi, acpi_sysresource_driver,
-	      acpi_sysresource_devclass, 0, 0);
+static devclass_t acpi_sysres_devclass;
+DRIVER_MODULE(acpi_sysresource, acpi, acpi_sysres_driver, acpi_sysres_devclass,
+    0, 0);
 MODULE_DEPEND(acpi_sysresource, acpi, 1, 1, 1);
 
 static int
-acpi_sysresource_probe(device_t dev)
+acpi_sysres_probe(device_t dev)
 {
-    if (!acpi_disabled("sysresource") && acpi_MatchHid(dev, "PNP0C02"))
-	device_set_desc(dev, "System Resource");
-    else
+    ACPI_HANDLE h;
+
+    h = acpi_get_handle(dev);
+    if (acpi_disabled("sysresource") ||
+	(!acpi_MatchHid(h, "PNP0C01") && !acpi_MatchHid(h, "PNP0C02")))
 	return (ENXIO);
 
+    device_set_desc(dev, "System Resource");
     device_quiet(dev);
     return (-100);
 }
 
 static int
-acpi_sysresource_attach(device_t dev)
+acpi_sysres_attach(device_t dev)
 {
-    struct resource	*res;
-    int			i, rid;
+    device_t gparent;
+    struct resource *res;
+    struct rman *rm;
+    struct resource_list_entry *rle;
+    struct resource_list *rl;
 
     /*
-     * Suck up all the resources that might have been assigned to us.
-     * Note that it's impossible to tell the difference between a
-     * resource that someone else has claimed, and one that doesn't
-     * exist.
+     * Pre-allocate/manage all memory and IO resources.  We detect duplicates
+     * by setting rle->res to the resource we got from the parent.  We can't
+     * ignore them since rman can't handle duplicates.
      */
-    for (i = 0; i < 100; i++) {
-	rid = i;
-	res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, 0);
-	rid = i;
-	res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 0);
-	rid = i;
-	res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_SHAREABLE);
+    rl = BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev);
+    SLIST_FOREACH(rle, rl, link) {
+	if (rle->res != NULL) {
+	    device_printf(dev, "duplicate resource for %lx\n", rle->start);
+	    continue;
+	}
+
+	/* Only memory and IO resources are valid here. */
+	switch (rle->type) {
+	case SYS_RES_IOPORT:
+	    rm = &acpi_rman_io;
+	    break;
+	case SYS_RES_MEMORY:
+	    rm = &acpi_rman_mem;
+	    break;
+	default:
+	    continue;
+	}
+
+	/* Pre-allocate resource and add to our rman pool. */
+	gparent = device_get_parent(device_get_parent(dev));
+	res = BUS_ALLOC_RESOURCE(gparent, dev, rle->type, &rle->rid,
+	    rle->start, rle->start + rle->count - 1, rle->count, 0);
+	if (res != NULL) {
+	    rman_manage_region(rm, rman_get_start(res), rman_get_end(res));
+	    rle->res = res;
+	}
     }
 
     return (0);
 }
+
+struct resource_list_entry *
+acpi_sysres_find(int type, u_long addr)
+{

>>> TRUNCATED FOR MAIL (1000 lines) <<<



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