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>