/*ARGSUSED*/ static ACPI_STATUS acpidev_scope_init(acpidev_walk_info_t *infop) { char unitaddr[32]; char *compatible[] = { ACPIDEV_HID_SCOPE, ACPIDEV_TYPE_SCOPE, ACPIDEV_HID_VIRTNEX, ACPIDEV_TYPE_VIRTNEX, }; ASSERT(infop != NULL); ASSERT(infop->awi_hdl != NULL); ASSERT(infop->awi_dip != NULL); if (ACPI_FAILURE(acpidev_set_compatible(infop, ACPIDEV_ARRAY_PARAM(compatible)))) { return (AE_ERROR); } (void) snprintf(unitaddr, sizeof (unitaddr), "%u", atomic_inc_32_nv(&acpidev_scope_unitaddr) - 1); if (ACPI_FAILURE(acpidev_set_unitaddr(infop, NULL, 0, unitaddr))) { return (AE_ERROR); } return (AE_OK); }
static ACPI_STATUS acpidev_memory_init(acpidev_walk_info_t *infop) { char *compatible[] = { ACPIDEV_TYPE_MEMORY, "mem" }; ASSERT(infop != NULL); ASSERT(infop->awi_hdl != NULL); ASSERT(infop->awi_dip != NULL); if (ACPI_FAILURE(acpidev_resource_process(infop, B_TRUE))) { cmn_err(CE_WARN, "!acpidev: failed to process resources of " "memory device %s.", infop->awi_name); return (AE_ERROR); } if (ACPI_FAILURE(acpidev_set_compatible(infop, ACPIDEV_ARRAY_PARAM(compatible)))) { return (AE_ERROR); } if (ACPI_FAILURE(acpidev_set_unitaddr(infop, ACPIDEV_ARRAY_PARAM(acpidev_memory_uid_formats), NULL))) { return (AE_ERROR); } return (AE_OK); }
static ACPI_STATUS acpidev_cpu_init(acpidev_walk_info_t *infop) { int count; uint32_t pxmid; dev_info_t *dip; ACPI_HANDLE hdl; char unitaddr[64]; char **compatpp; static char *compatible[] = { ACPIDEV_HID_PROCESSOR, ACPIDEV_TYPE_CPU, "cpu" }; ASSERT(infop != NULL); dip = infop->awi_dip; hdl = infop->awi_hdl; /* Create "apic_id", "processor_id" and "proximity_id" properties. */ if (ndi_prop_update_int(DDI_DEV_T_NONE, dip, ACPIDEV_PROP_NAME_PROCESSOR_ID, infop->awi_scratchpad[0]) != NDI_SUCCESS) { cmn_err(CE_WARN, "!acpidev: failed to set processor_id property for %s.", infop->awi_name); return (AE_ERROR); } if (ndi_prop_update_int(DDI_DEV_T_NONE, dip, ACPIDEV_PROP_NAME_LOCALAPIC_ID, infop->awi_scratchpad[1]) != NDI_SUCCESS) { cmn_err(CE_WARN, "!acpidev: failed to set apic_id property for %s.", infop->awi_name); return (AE_ERROR); } if (ACPI_SUCCESS(acpidev_cpu_get_proximity_id(infop->awi_hdl, infop->awi_scratchpad[1], &pxmid))) { if (ndi_prop_update_int(DDI_DEV_T_NONE, dip, ACPIDEV_PROP_NAME_PROXIMITY_ID, pxmid) != NDI_SUCCESS) { cmn_err(CE_WARN, "!acpidev: failed to set proximity id " "property for %s.", infop->awi_name); return (AE_ERROR); } } /* Set "compatible" property for CPU dip */ count = sizeof (compatible) / sizeof (compatible[0]); if (infop->awi_info->Type == ACPI_TYPE_PROCESSOR) { compatpp = compatible; } else if (infop->awi_info->Type == ACPI_TYPE_DEVICE) { /* * skip first item for pseudo processor HID. * acpidev_set_compatible() will handle HID/CID for CPU device. */ compatpp = &compatible[1]; count--; } else { return (AE_BAD_PARAMETER); } if (ACPI_FAILURE(acpidev_set_compatible(infop, compatpp, count))) { return (AE_ERROR); } /* * Set device unit-address property. * First try to generate meaningful unit address from _UID, * then use Processor Id if that fails. */ if ((infop->awi_info->Valid & ACPI_VALID_UID) == 0 || acpidev_generate_unitaddr(infop->awi_info->UniqueId.String, ACPIDEV_ARRAY_PARAM(acpidev_cpu_uid_formats), unitaddr, sizeof (unitaddr)) == NULL) { (void) snprintf(unitaddr, sizeof (unitaddr), "%u", (uint32_t)infop->awi_scratchpad[0]); } if (ACPI_FAILURE(acpidev_set_unitaddr(infop, NULL, 0, unitaddr))) { return (AE_ERROR); } /* * Build binding information for CPUs. */ if (infop->awi_op_type == ACPIDEV_OP_BOOT_PROBE || infop->awi_op_type == ACPIDEV_OP_BOOT_REPROBE || infop->awi_op_type == ACPIDEV_OP_HOTPLUG_PROBE) { if (ACPI_FAILURE(acpica_add_processor_to_map( infop->awi_scratchpad[0], hdl, infop->awi_scratchpad[1]))) { cmn_err(CE_WARN, "!acpidev: failed to bind processor " "id/object handle for %s.", infop->awi_name); return (AE_ERROR); } } else { ACPIDEV_DEBUG(CE_WARN, "!acpidev: unknown operation type %u in acpidev_cpu_init.", infop->awi_op_type); return (AE_BAD_PARAMETER); } return (AE_OK); }