/*ARGSUSED*/ static void ppb_init_hotplug(ppb_devstate_t *ppb) { ppb->hotplug_capable = B_FALSE; if (ddi_prop_exists(DDI_DEV_T_ANY, ppb->dip, DDI_PROP_DONTPASS, "hotplug-capable")) { (void) modload("misc", "pcihp"); if (pcihp_init(ppb->dip) != DDI_SUCCESS) { cmn_err(CE_WARN, "%s #%d: Failed setting hotplug framework", ddi_driver_name(ppb->dip), ddi_get_instance(ppb->dip)); } else ppb->hotplug_capable = B_TRUE; } if (ppb->hotplug_capable == B_FALSE) { /* * create minor node for devctl interfaces */ if (ddi_create_minor_node(ppb->dip, "devctl", S_IFCHR, PCI_MINOR_NUM(ddi_get_instance(ppb->dip), PCI_DEVCTL_MINOR), DDI_NT_NEXUS, 0) != DDI_SUCCESS) cmn_err(CE_WARN, "%s #%d: Failed to create a minor node", ddi_driver_name(ppb->dip), ddi_get_instance(ppb->dip)); } }
/* * This function is similar to pciehpc_slotinfo_init() with some * changes: * - no need for kernel thread to handle ATTN button events * - function ops for connect/disconnect are different * * ASSUMPTION: No conflict in doing reads to HP registers directly. * Otherwise, there are no ACPI interfaces to do LED control or to get * the hot plug capabilities (ATTN button, MRL, etc.). */ static int pciehpc_acpi_slotinfo_init(pcie_hp_ctrl_t *ctrl_p) { uint32_t slot_capabilities; pcie_hp_slot_t *slot_p = ctrl_p->hc_slots[0]; pcie_bus_t *bus_p = PCIE_DIP2BUS(ctrl_p->hc_dip); mutex_enter(&ctrl_p->hc_mutex); /* * setup DDI HP framework slot information structure */ slot_p->hs_device_num = 0; slot_p->hs_info.cn_type = DDI_HP_CN_TYPE_PCIE; slot_p->hs_info.cn_type_str = PCIE_ACPI_HP_TYPE; slot_p->hs_info.cn_child = NULL; slot_p->hs_minor = PCI_MINOR_NUM(ddi_get_instance(ctrl_p->hc_dip), slot_p->hs_device_num); /* read Slot Capabilities Register */ slot_capabilities = pciehpc_reg_get32(ctrl_p, bus_p->bus_pcie_off + PCIE_SLOTCAP); /* setup slot number/name */ pciehpc_set_slot_name(ctrl_p); /* check if Attn Button present */ ctrl_p->hc_has_attn = (slot_capabilities & PCIE_SLOTCAP_ATTN_BUTTON) ? B_TRUE : B_FALSE; /* check if Manual Retention Latch sensor present */ ctrl_p->hc_has_mrl = (slot_capabilities & PCIE_SLOTCAP_MRL_SENSOR) ? B_TRUE : B_FALSE; /* * PCI-E (draft) version 1.1 defines EMI Lock Present bit * in Slot Capabilities register. Check for it. */ ctrl_p->hc_has_emi_lock = (slot_capabilities & PCIE_SLOTCAP_EMI_LOCK_PRESENT) ? B_TRUE : B_FALSE; /* get current slot state from the hw */ pciehpc_get_slot_state(slot_p); if (slot_p->hs_info.cn_state >= DDI_HP_CN_STATE_ENABLED) slot_p->hs_condition = AP_COND_OK; mutex_exit(&ctrl_p->hc_mutex); /* setup Notify() handler for hot plug events from ACPI BIOS */ if (pciehpc_acpi_install_event_handler(ctrl_p) != AE_OK) return (DDI_FAILURE); PCIE_DBG("ACPI hot plug is enabled for slot #%d\n", slot_p->hs_phy_slot_num); return (DDI_SUCCESS); }