xref: /onnv-gate/usr/src/uts/i86pc/io/acpi/acpidev/acpidev_container.c (revision 12004:93f274d4a367)
110394SMichael.Corcoran@Sun.COM /*
210394SMichael.Corcoran@Sun.COM  * CDDL HEADER START
310394SMichael.Corcoran@Sun.COM  *
410394SMichael.Corcoran@Sun.COM  * The contents of this file are subject to the terms of the
510394SMichael.Corcoran@Sun.COM  * Common Development and Distribution License (the "License").
610394SMichael.Corcoran@Sun.COM  * You may not use this file except in compliance with the License.
710394SMichael.Corcoran@Sun.COM  *
810394SMichael.Corcoran@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
910394SMichael.Corcoran@Sun.COM  * or http://www.opensolaris.org/os/licensing.
1010394SMichael.Corcoran@Sun.COM  * See the License for the specific language governing permissions
1110394SMichael.Corcoran@Sun.COM  * and limitations under the License.
1210394SMichael.Corcoran@Sun.COM  *
1310394SMichael.Corcoran@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
1410394SMichael.Corcoran@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1510394SMichael.Corcoran@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
1610394SMichael.Corcoran@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
1710394SMichael.Corcoran@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
1810394SMichael.Corcoran@Sun.COM  *
1910394SMichael.Corcoran@Sun.COM  * CDDL HEADER END
2010394SMichael.Corcoran@Sun.COM  */
2110394SMichael.Corcoran@Sun.COM /*
2211225SDana.Myers@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
2311225SDana.Myers@Sun.COM  * Use is subject to license terms.
2411225SDana.Myers@Sun.COM  */
2511225SDana.Myers@Sun.COM /*
26*12004Sjiang.liu@intel.com  * Copyright (c) 2009-2010, Intel Corporation.
2710394SMichael.Corcoran@Sun.COM  * All rights reserved.
2810394SMichael.Corcoran@Sun.COM  */
2910394SMichael.Corcoran@Sun.COM 
3010394SMichael.Corcoran@Sun.COM /*
3110394SMichael.Corcoran@Sun.COM  * There are three types of container objects defined in the ACPI Spec as below.
3210394SMichael.Corcoran@Sun.COM  * PNP0A05: Generic Container Device
3310394SMichael.Corcoran@Sun.COM  *   A device whose settings are totally controlled by its ACPI resource
3410394SMichael.Corcoran@Sun.COM  *   information, and otherwise needs no device or bus-specific driver support.
3510394SMichael.Corcoran@Sun.COM  *   This was originally known as Generic ISA Bus Device.
3610394SMichael.Corcoran@Sun.COM  *   This ID should only be used for containers that do not produce resources
3710394SMichael.Corcoran@Sun.COM  *   for consumption by child devices. Any system resources claimed by a PNP0A05
3810394SMichael.Corcoran@Sun.COM  *   device's _CRS object must be consumed by the container itself.
3910394SMichael.Corcoran@Sun.COM  * PNP0A06: Generic Container Device
4010394SMichael.Corcoran@Sun.COM  *   This device behaves exactly the same as the PNP0A05 device.
4110394SMichael.Corcoran@Sun.COM  *   This was originally known as Extended I/O Bus.
4210394SMichael.Corcoran@Sun.COM  *   This ID should only be used for containers that do not produce resources
4310394SMichael.Corcoran@Sun.COM  *   for consumption by child devices. Any system resources claimed by a PNP0A06
4410394SMichael.Corcoran@Sun.COM  *   device's _CRS object must be consumed by the container itself.
4510394SMichael.Corcoran@Sun.COM  * ACPI0004: Module Device.
4610394SMichael.Corcoran@Sun.COM  *   This device is a container object that acts as a bus node in a namespace.
4710394SMichael.Corcoran@Sun.COM  *   A Module Device without any of the _CRS, _PRS and _SRS methods behaves
4810394SMichael.Corcoran@Sun.COM  *   the same way as the Generic Container Devices (PNP0A05 or PNP0A06).
4910394SMichael.Corcoran@Sun.COM  *   If the Module Device contains a _CRS method, only the resources
5010394SMichael.Corcoran@Sun.COM  *   described in the _CRS are available for consumption by its child devices.
5110394SMichael.Corcoran@Sun.COM  *   Also, the Module Device can support _PRS and _SRS methods if _CRS is
5210394SMichael.Corcoran@Sun.COM  *   supported.
5310394SMichael.Corcoran@Sun.COM  */
5410394SMichael.Corcoran@Sun.COM 
5510394SMichael.Corcoran@Sun.COM #include <sys/types.h>
5610394SMichael.Corcoran@Sun.COM #include <sys/atomic.h>
57*12004Sjiang.liu@intel.com #include <sys/note.h>
5810394SMichael.Corcoran@Sun.COM #include <sys/sunddi.h>
5910394SMichael.Corcoran@Sun.COM #include <sys/sunndi.h>
6010394SMichael.Corcoran@Sun.COM #include <sys/acpi/acpi.h>
6110394SMichael.Corcoran@Sun.COM #include <sys/acpica.h>
6210394SMichael.Corcoran@Sun.COM #include <sys/acpidev.h>
63*12004Sjiang.liu@intel.com #include <sys/acpidev_dr.h>
6410394SMichael.Corcoran@Sun.COM #include <sys/acpidev_impl.h>
6510394SMichael.Corcoran@Sun.COM 
6610394SMichael.Corcoran@Sun.COM static ACPI_STATUS acpidev_container_probe(acpidev_walk_info_t *infop);
6710394SMichael.Corcoran@Sun.COM static acpidev_filter_result_t acpidev_container_filter(
6810394SMichael.Corcoran@Sun.COM     acpidev_walk_info_t *infop, char *devname, int maxlen);
6910394SMichael.Corcoran@Sun.COM static ACPI_STATUS acpidev_container_init(acpidev_walk_info_t *infop);
7010394SMichael.Corcoran@Sun.COM static acpidev_filter_result_t acpidev_container_filter_func(
7110394SMichael.Corcoran@Sun.COM     acpidev_walk_info_t *infop, ACPI_HANDLE hdl, acpidev_filter_rule_t *rulep,
7210394SMichael.Corcoran@Sun.COM     char *devname, int devnamelen);
7310394SMichael.Corcoran@Sun.COM 
7410394SMichael.Corcoran@Sun.COM /*
7510394SMichael.Corcoran@Sun.COM  * Default class driver for ACPI container objects.
7610394SMichael.Corcoran@Sun.COM  */
7710394SMichael.Corcoran@Sun.COM acpidev_class_t acpidev_class_container = {
7810394SMichael.Corcoran@Sun.COM 	0,				/* adc_refcnt */
7910394SMichael.Corcoran@Sun.COM 	ACPIDEV_CLASS_REV1,		/* adc_version */
8010394SMichael.Corcoran@Sun.COM 	ACPIDEV_CLASS_ID_CONTAINER,	/* adc_class_id */
8110394SMichael.Corcoran@Sun.COM 	"ACPI Container",		/* adc_class_name */
8210394SMichael.Corcoran@Sun.COM 	ACPIDEV_TYPE_CONTAINER,		/* adc_dev_type */
8310394SMichael.Corcoran@Sun.COM 	NULL,				/* adc_private */
8410394SMichael.Corcoran@Sun.COM 	NULL,				/* adc_pre_probe */
8510394SMichael.Corcoran@Sun.COM 	NULL,				/* adc_post_probe */
8610394SMichael.Corcoran@Sun.COM 	acpidev_container_probe,	/* adc_probe */
8710394SMichael.Corcoran@Sun.COM 	acpidev_container_filter,	/* adc_filter */
8810394SMichael.Corcoran@Sun.COM 	acpidev_container_init,		/* adc_init */
8910394SMichael.Corcoran@Sun.COM 	NULL,				/* adc_fini */
9010394SMichael.Corcoran@Sun.COM };
9110394SMichael.Corcoran@Sun.COM 
9210394SMichael.Corcoran@Sun.COM static char *acpidev_container_device_ids[] = {
9310394SMichael.Corcoran@Sun.COM 	ACPIDEV_HID_MODULE,
9410394SMichael.Corcoran@Sun.COM 	ACPIDEV_HID_CONTAINER1,
9510394SMichael.Corcoran@Sun.COM 	ACPIDEV_HID_CONTAINER2,
9610394SMichael.Corcoran@Sun.COM };
9710394SMichael.Corcoran@Sun.COM 
9810394SMichael.Corcoran@Sun.COM static char *acpidev_container_uid_formats[] = {
9910394SMichael.Corcoran@Sun.COM 	"CPUSCK%x",
10010394SMichael.Corcoran@Sun.COM };
10110394SMichael.Corcoran@Sun.COM 
10210394SMichael.Corcoran@Sun.COM /* Filter rule table for container objects. */
10310394SMichael.Corcoran@Sun.COM static acpidev_filter_rule_t acpidev_container_filters[] = {
10410394SMichael.Corcoran@Sun.COM 	{	/* Ignore all container objects under ACPI root object */
10510394SMichael.Corcoran@Sun.COM 		NULL,
10610394SMichael.Corcoran@Sun.COM 		0,
10710394SMichael.Corcoran@Sun.COM 		ACPIDEV_FILTER_SKIP,
10810394SMichael.Corcoran@Sun.COM 		NULL,
10910394SMichael.Corcoran@Sun.COM 		1,
11010394SMichael.Corcoran@Sun.COM 		1,
11110394SMichael.Corcoran@Sun.COM 		NULL,
11210394SMichael.Corcoran@Sun.COM 		NULL,
11310394SMichael.Corcoran@Sun.COM 	},
11410394SMichael.Corcoran@Sun.COM 	{	/* Create node and scan child for all other container objects */
11510394SMichael.Corcoran@Sun.COM 		acpidev_container_filter_func,
11610394SMichael.Corcoran@Sun.COM 		0,
11710394SMichael.Corcoran@Sun.COM 		ACPIDEV_FILTER_DEFAULT,
11810394SMichael.Corcoran@Sun.COM 		&acpidev_class_list_device,
11910394SMichael.Corcoran@Sun.COM 		2,
12010394SMichael.Corcoran@Sun.COM 		INT_MAX,
12110394SMichael.Corcoran@Sun.COM 		NULL,
12210394SMichael.Corcoran@Sun.COM 		ACPIDEV_NODE_NAME_CONTAINER,
12310394SMichael.Corcoran@Sun.COM 	}
12410394SMichael.Corcoran@Sun.COM };
12510394SMichael.Corcoran@Sun.COM 
12610394SMichael.Corcoran@Sun.COM static ACPI_STATUS
acpidev_container_probe(acpidev_walk_info_t * infop)12710394SMichael.Corcoran@Sun.COM acpidev_container_probe(acpidev_walk_info_t *infop)
12810394SMichael.Corcoran@Sun.COM {
129*12004Sjiang.liu@intel.com 	ACPI_STATUS rc = AE_OK;
13010394SMichael.Corcoran@Sun.COM 	int flags;
13110394SMichael.Corcoran@Sun.COM 
13210394SMichael.Corcoran@Sun.COM 	ASSERT(infop != NULL);
13310394SMichael.Corcoran@Sun.COM 	ASSERT(infop->awi_hdl != NULL);
13410394SMichael.Corcoran@Sun.COM 	ASSERT(infop->awi_info != NULL);
13510394SMichael.Corcoran@Sun.COM 
13610394SMichael.Corcoran@Sun.COM 	if (infop->awi_info->Type != ACPI_TYPE_DEVICE ||
13710394SMichael.Corcoran@Sun.COM 	    acpidev_match_device_id(infop->awi_info,
13810394SMichael.Corcoran@Sun.COM 	    ACPIDEV_ARRAY_PARAM(acpidev_container_device_ids)) == 0) {
13910394SMichael.Corcoran@Sun.COM 		return (AE_OK);
14010394SMichael.Corcoran@Sun.COM 	}
14110394SMichael.Corcoran@Sun.COM 
142*12004Sjiang.liu@intel.com 	flags = ACPIDEV_PROCESS_FLAG_SCAN;
143*12004Sjiang.liu@intel.com 	switch (infop->awi_op_type) {
144*12004Sjiang.liu@intel.com 	case ACPIDEV_OP_BOOT_PROBE:
145*12004Sjiang.liu@intel.com 		if (acpica_get_devcfg_feature(ACPI_DEVCFG_CONTAINER)) {
146*12004Sjiang.liu@intel.com 			flags |= ACPIDEV_PROCESS_FLAG_CREATE;
147*12004Sjiang.liu@intel.com 			acpidev_dr_check(infop);
148*12004Sjiang.liu@intel.com 		}
149*12004Sjiang.liu@intel.com 		break;
150*12004Sjiang.liu@intel.com 
151*12004Sjiang.liu@intel.com 	case ACPIDEV_OP_BOOT_REPROBE:
152*12004Sjiang.liu@intel.com 		break;
153*12004Sjiang.liu@intel.com 
154*12004Sjiang.liu@intel.com 	case ACPIDEV_OP_HOTPLUG_PROBE:
155*12004Sjiang.liu@intel.com 		if (acpica_get_devcfg_feature(ACPI_DEVCFG_CONTAINER)) {
156*12004Sjiang.liu@intel.com 			flags |= ACPIDEV_PROCESS_FLAG_CREATE |
157*12004Sjiang.liu@intel.com 			    ACPIDEV_PROCESS_FLAG_SYNCSTATUS |
158*12004Sjiang.liu@intel.com 			    ACPIDEV_PROCESS_FLAG_HOLDBRANCH;
159*12004Sjiang.liu@intel.com 		}
160*12004Sjiang.liu@intel.com 		break;
161*12004Sjiang.liu@intel.com 
162*12004Sjiang.liu@intel.com 	default:
163*12004Sjiang.liu@intel.com 		ACPIDEV_DEBUG(CE_WARN, "!acpidev: unknown operation type %u in "
16410394SMichael.Corcoran@Sun.COM 		    "acpidev_container_probe().", infop->awi_op_type);
16510394SMichael.Corcoran@Sun.COM 		rc = AE_BAD_PARAMETER;
166*12004Sjiang.liu@intel.com 		break;
167*12004Sjiang.liu@intel.com 	}
168*12004Sjiang.liu@intel.com 
169*12004Sjiang.liu@intel.com 	if (rc == AE_OK) {
170*12004Sjiang.liu@intel.com 		rc = acpidev_process_object(infop, flags);
17110394SMichael.Corcoran@Sun.COM 	}
17210394SMichael.Corcoran@Sun.COM 	if (ACPI_FAILURE(rc) && rc != AE_NOT_EXIST && rc != AE_ALREADY_EXISTS) {
17310394SMichael.Corcoran@Sun.COM 		cmn_err(CE_WARN,
17410394SMichael.Corcoran@Sun.COM 		    "!acpidev: failed to process container object %s.",
17510394SMichael.Corcoran@Sun.COM 		    infop->awi_name);
17610394SMichael.Corcoran@Sun.COM 	} else {
17710394SMichael.Corcoran@Sun.COM 		rc = AE_OK;
17810394SMichael.Corcoran@Sun.COM 	}
17910394SMichael.Corcoran@Sun.COM 
18010394SMichael.Corcoran@Sun.COM 	return (rc);
18110394SMichael.Corcoran@Sun.COM }
18210394SMichael.Corcoran@Sun.COM 
18310394SMichael.Corcoran@Sun.COM static ACPI_STATUS
acpidev_container_search_dev(ACPI_HANDLE hdl,UINT32 lvl,void * ctx,void ** retval)18410394SMichael.Corcoran@Sun.COM acpidev_container_search_dev(ACPI_HANDLE hdl, UINT32 lvl, void *ctx,
18510394SMichael.Corcoran@Sun.COM     void **retval)
18610394SMichael.Corcoran@Sun.COM {
187*12004Sjiang.liu@intel.com 	_NOTE(ARGUNUSED(hdl, retval));
188*12004Sjiang.liu@intel.com 
18910394SMichael.Corcoran@Sun.COM 	int *fp = (int *)ctx;
19010394SMichael.Corcoran@Sun.COM 
19110394SMichael.Corcoran@Sun.COM 	*fp = lvl;
19210394SMichael.Corcoran@Sun.COM 
19310394SMichael.Corcoran@Sun.COM 	return (AE_CTRL_TERMINATE);
19410394SMichael.Corcoran@Sun.COM }
19510394SMichael.Corcoran@Sun.COM 
19610394SMichael.Corcoran@Sun.COM static acpidev_filter_result_t
acpidev_container_filter_func(acpidev_walk_info_t * infop,ACPI_HANDLE hdl,acpidev_filter_rule_t * rulep,char * devname,int devnamelen)19710394SMichael.Corcoran@Sun.COM acpidev_container_filter_func(acpidev_walk_info_t *infop, ACPI_HANDLE hdl,
19810394SMichael.Corcoran@Sun.COM     acpidev_filter_rule_t *rulep, char *devname, int devnamelen)
19910394SMichael.Corcoran@Sun.COM {
20010394SMichael.Corcoran@Sun.COM 	ACPI_BUFFER buf;
20110394SMichael.Corcoran@Sun.COM 	void *retval;
20210394SMichael.Corcoran@Sun.COM 	int proc_lvl, cpu_lvl, module_lvl;
20310394SMichael.Corcoran@Sun.COM 	acpidev_filter_result_t res;
20410394SMichael.Corcoran@Sun.COM 	static char *cpu_hids[] = {
20510394SMichael.Corcoran@Sun.COM 		ACPIDEV_HID_CPU,
20610394SMichael.Corcoran@Sun.COM 	};
20710394SMichael.Corcoran@Sun.COM 	static char *module_hids[] = {
20810394SMichael.Corcoran@Sun.COM 		ACPIDEV_HID_MODULE,
20910394SMichael.Corcoran@Sun.COM 	};
21010394SMichael.Corcoran@Sun.COM 
21110394SMichael.Corcoran@Sun.COM 	res = acpidev_filter_default(infop, hdl, rulep, devname, devnamelen);
21210394SMichael.Corcoran@Sun.COM 	/* Return if we don't need to generate a device name. */
21310394SMichael.Corcoran@Sun.COM 	if (devname == NULL || res == ACPIDEV_FILTER_FAILED ||
21410394SMichael.Corcoran@Sun.COM 	    res == ACPIDEV_FILTER_SKIP) {
21510394SMichael.Corcoran@Sun.COM 		return (res);
21610394SMichael.Corcoran@Sun.COM 	}
21710394SMichael.Corcoran@Sun.COM 
21810394SMichael.Corcoran@Sun.COM 	/* Try to figure out the most specific device name for the object. */
21910394SMichael.Corcoran@Sun.COM 	retval = NULL;
22010394SMichael.Corcoran@Sun.COM 	proc_lvl = INT_MAX;
22110394SMichael.Corcoran@Sun.COM 	cpu_lvl = INT_MAX;
22210394SMichael.Corcoran@Sun.COM 	module_lvl = INT_MAX;
22310394SMichael.Corcoran@Sun.COM 
22410394SMichael.Corcoran@Sun.COM 	/* Search for ACPI Processor object. */
22510394SMichael.Corcoran@Sun.COM 	(void) AcpiWalkNamespace(ACPI_TYPE_PROCESSOR, hdl, 2,
22611225SDana.Myers@Sun.COM 	    acpidev_container_search_dev, NULL, &proc_lvl, &retval);
22710394SMichael.Corcoran@Sun.COM 
22810394SMichael.Corcoran@Sun.COM 	/* Search for CPU Device object. */
22910394SMichael.Corcoran@Sun.COM 	(void) acpidev_get_device_by_id(hdl, ACPIDEV_ARRAY_PARAM(cpu_hids), 2,
23010394SMichael.Corcoran@Sun.COM 	    B_FALSE, acpidev_container_search_dev, &cpu_lvl, &retval);
23110394SMichael.Corcoran@Sun.COM 
23210394SMichael.Corcoran@Sun.COM 	/* Search for Module Device object. */
23310394SMichael.Corcoran@Sun.COM 	(void) acpidev_get_device_by_id(hdl, ACPIDEV_ARRAY_PARAM(module_hids),
23410394SMichael.Corcoran@Sun.COM 	    2, B_FALSE, acpidev_container_search_dev, &module_lvl, &retval);
23510394SMichael.Corcoran@Sun.COM 
23610394SMichael.Corcoran@Sun.COM 	buf.Pointer = devname;
23710394SMichael.Corcoran@Sun.COM 	buf.Length = devnamelen;
23810394SMichael.Corcoran@Sun.COM 	if (cpu_lvl > proc_lvl) {
23910394SMichael.Corcoran@Sun.COM 		cpu_lvl = proc_lvl;
24010394SMichael.Corcoran@Sun.COM 	}
24110394SMichael.Corcoran@Sun.COM 	if (cpu_lvl == 1) {
24210394SMichael.Corcoran@Sun.COM 		/* CPU as child, most likely a physical CPU. */
243*12004Sjiang.liu@intel.com 		(void) strlcpy(devname, ACPIDEV_NODE_NAME_MODULE_CPU,
24410394SMichael.Corcoran@Sun.COM 		    devnamelen);
24510394SMichael.Corcoran@Sun.COM 	} else if (cpu_lvl == 2 && module_lvl == 1) {
24610394SMichael.Corcoran@Sun.COM 		/* CPU as grandchild, most likely a system board. */
247*12004Sjiang.liu@intel.com 		(void) strlcpy(devname, ACPIDEV_NODE_NAME_MODULE_SBD,
24810394SMichael.Corcoran@Sun.COM 		    devnamelen);
24910394SMichael.Corcoran@Sun.COM 	} else if (ACPI_FAILURE(AcpiGetName(infop->awi_hdl,
25010394SMichael.Corcoran@Sun.COM 	    ACPI_SINGLE_NAME, &buf))) {
25110394SMichael.Corcoran@Sun.COM 		/*
25210394SMichael.Corcoran@Sun.COM 		 * Failed to get ACPI object name; use ACPI object name
25310394SMichael.Corcoran@Sun.COM 		 * as the default name.
25410394SMichael.Corcoran@Sun.COM 		 */
255*12004Sjiang.liu@intel.com 		(void) strlcpy(devname, ACPIDEV_NODE_NAME_CONTAINER,
25610394SMichael.Corcoran@Sun.COM 		    devnamelen);
25710394SMichael.Corcoran@Sun.COM 	}
25810394SMichael.Corcoran@Sun.COM 
25910394SMichael.Corcoran@Sun.COM 	return (res);
26010394SMichael.Corcoran@Sun.COM }
26110394SMichael.Corcoran@Sun.COM 
26210394SMichael.Corcoran@Sun.COM static acpidev_filter_result_t
acpidev_container_filter(acpidev_walk_info_t * infop,char * devname,int maxlen)26310394SMichael.Corcoran@Sun.COM acpidev_container_filter(acpidev_walk_info_t *infop, char *devname, int maxlen)
26410394SMichael.Corcoran@Sun.COM {
26510394SMichael.Corcoran@Sun.COM 	acpidev_filter_result_t res;
26610394SMichael.Corcoran@Sun.COM 
26710394SMichael.Corcoran@Sun.COM 	ASSERT(infop != NULL);
26810394SMichael.Corcoran@Sun.COM 	if (infop->awi_op_type == ACPIDEV_OP_BOOT_PROBE ||
26910394SMichael.Corcoran@Sun.COM 	    infop->awi_op_type == ACPIDEV_OP_BOOT_REPROBE ||
27010394SMichael.Corcoran@Sun.COM 	    infop->awi_op_type == ACPIDEV_OP_HOTPLUG_PROBE) {
27110394SMichael.Corcoran@Sun.COM 		res = acpidev_filter_device(infop, infop->awi_hdl,
27210394SMichael.Corcoran@Sun.COM 		    ACPIDEV_ARRAY_PARAM(acpidev_container_filters),
27310394SMichael.Corcoran@Sun.COM 		    devname, maxlen);
27410394SMichael.Corcoran@Sun.COM 	} else {
27510394SMichael.Corcoran@Sun.COM 		res = ACPIDEV_FILTER_FAILED;
27610394SMichael.Corcoran@Sun.COM 	}
27710394SMichael.Corcoran@Sun.COM 
27810394SMichael.Corcoran@Sun.COM 	return (res);
27910394SMichael.Corcoran@Sun.COM }
28010394SMichael.Corcoran@Sun.COM 
28110394SMichael.Corcoran@Sun.COM static ACPI_STATUS
acpidev_container_init(acpidev_walk_info_t * infop)28210394SMichael.Corcoran@Sun.COM acpidev_container_init(acpidev_walk_info_t *infop)
28310394SMichael.Corcoran@Sun.COM {
28410394SMichael.Corcoran@Sun.COM 	static char *compatible[] = {
28510394SMichael.Corcoran@Sun.COM 		ACPIDEV_TYPE_CONTAINER,
28610394SMichael.Corcoran@Sun.COM 		ACPIDEV_HID_VIRTNEX,
28710394SMichael.Corcoran@Sun.COM 		ACPIDEV_TYPE_VIRTNEX,
28810394SMichael.Corcoran@Sun.COM 	};
28910394SMichael.Corcoran@Sun.COM 
29010394SMichael.Corcoran@Sun.COM 	ASSERT(infop != NULL);
29110394SMichael.Corcoran@Sun.COM 	ASSERT(infop->awi_hdl != NULL);
29210394SMichael.Corcoran@Sun.COM 	ASSERT(infop->awi_dip != NULL);
29310394SMichael.Corcoran@Sun.COM 
29410394SMichael.Corcoran@Sun.COM 	if (ACPI_FAILURE(acpidev_set_compatible(infop,
29510394SMichael.Corcoran@Sun.COM 	    ACPIDEV_ARRAY_PARAM(compatible)))) {
29610394SMichael.Corcoran@Sun.COM 		return (AE_ERROR);
29710394SMichael.Corcoran@Sun.COM 	}
29810394SMichael.Corcoran@Sun.COM 	if (ACPI_FAILURE(acpidev_set_unitaddr(infop,
29910394SMichael.Corcoran@Sun.COM 	    ACPIDEV_ARRAY_PARAM(acpidev_container_uid_formats), NULL))) {
30010394SMichael.Corcoran@Sun.COM 		return (AE_ERROR);
30110394SMichael.Corcoran@Sun.COM 	}
30210394SMichael.Corcoran@Sun.COM 
30310394SMichael.Corcoran@Sun.COM 	return (AE_OK);
30410394SMichael.Corcoran@Sun.COM }
305