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