--- i386/i386/acpi_machdep.c- Fri Sep 29 22:09:30 2000 +++ i386/i386/acpi_machdep.c Fri Sep 29 22:39:23 2000 @@ -53,6 +53,7 @@ #include #include /* for softc */ +#include #include #include @@ -88,50 +89,20 @@ #include #endif /* ACPI_NO_OSDFUNC_INLINE */ -static void acpiprobe_identify(driver_t *driver, device_t parent); -static void acpiprobe_mapmem(void); -static struct FACPbody *acpiprobe_facp(struct ACPIrsdp *rsdp); - - -static device_method_t acpiprobe_methods[] = { - /* Device interface */ - DEVMETHOD(device_identify, acpiprobe_identify), - {0, 0} -}; - -static driver_t acpiprobe_driver = { - "acpiprobe", - acpiprobe_methods, - 0, -}; - -static devclass_t acpiprobe_devclass; -DRIVER_MODULE(acpiprobe, nexus, acpiprobe_driver, acpiprobe_devclass, 0, 0); - -static void -acpiprobe_identify(driver_t *driver, device_t parent) +struct ACPIrsdp * +acpi_find_rsdp(void) { - device_t child; u_long sigaddr; struct ACPIrsdp *rsdp; - struct FACPbody *facp; u_int8_t ck, *cv; int i; /* - * If we've already got ACPI attached somehow, don't try again. - */ - if (device_find_child(parent, "acpi", 0)) { - printf("ACPI: already attached\n"); - return; - } - - /* * Search for the RSD PTR signature. */ if ((sigaddr = bios_sigsearch(0, "RSD PTR ", 8, 16, 0)) == 0) { printf("ACPI: no support in system\n"); - return; + return (NULL); } /* get a virtual pointer to the structure */ @@ -143,78 +114,10 @@ /* If checksum is OK, attach ACPI */ if (ck != 0) { printf("ACPI: Bad ACPI BIOS data checksum\n"); - return; + return (NULL); } - /* - * Handle enough of the RSDT to work out what our I/O resources are. - */ - acpi_rsdp = rsdp; - acpiprobe_mapmem(); - if ((facp = acpiprobe_facp(rsdp)) == NULL) { - printf("ACPI: can't map RSDT/FACT\n"); - return; - } - - /* - * Create the device and establish its resources. - */ - if ((child = BUS_ADD_CHILD(parent, 101, "acpi", 0)) == NULL) { - device_printf(parent, "ACPI: could not attach child\n"); - return; - } - - /* - * SMI command register - */ - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_SMI_CMD, - facp->smi_cmd, 1); - - /* - * PM1 event registers - */ - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_EVT, - facp->pm1a_evt_blk, facp->pm1_evt_len); - if (facp->pm1b_evt_blk != 0) - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_EVT, - facp->pm1b_evt_blk, facp->pm1_evt_len); - - /* - * PM1 control registers - */ - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_CNT, - facp->pm1a_cnt_blk, facp->pm1_cnt_len); - if (facp->pm1b_cnt_blk != 0) - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_CNT, - facp->pm1b_cnt_blk, facp->pm1_cnt_len); - - /* - * PM2 control register - */ - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM2_CNT, - facp->pm2_cnt_blk, facp->pm2_cnt_len); - - /* - * PM timer register - */ - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM_TMR, - facp->pm_tmr_blk, 4); - - /* - * General purpose event registers - */ - if (facp->gpe0_blk != 0) - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE0, - facp->gpe0_blk, facp->gpe0_len); - if (facp->gpe1_blk != 0) - bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE1, - facp->gpe1_blk, facp->gpe1_len); - - /* - * Notification interrupt - */ - if (facp->sci_int != 0) - bus_set_resource(child, SYS_RES_IRQ, 0, facp->sci_int, 1); + return (rsdp); } /* @@ -222,8 +125,8 @@ * and let the MI code know about them. Scan the ACPI memory map as managed * by the MI code and map it into kernel space. */ -static void -acpiprobe_mapmem(void) +void +acpi_mapmem(void) { struct vm86frame vmf; struct vm86context vmc; @@ -266,36 +169,3 @@ } } -/* - * Locate the FACP within the mapped ACPI memory. - */ -static struct FACPbody * -acpiprobe_facp(struct ACPIrsdp *rsdp) -{ - u_int32_t *ptrs; - int entries; - int i; - struct ACPIsdt *rsdt, *sdt; - char sigstring[5]; - - rsdt = (struct ACPIsdt *)acpi_pmap_ptv(rsdp->addr); - if (rsdt == NULL) { - ACPI_DEVPRINTF("can't map memory for RSDT"); - return(NULL); - } - if ((strncmp(rsdt->signature, "RSDT", 4) != 0) || - (acpi_sdt_checksum(rsdt) != 0)) { - ACPI_DEVPRINTF("RSDT is broken\n"); - return(NULL); - } - entries = (rsdt->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); - ptrs = (u_int32_t *)&rsdt->body; - - for (i = 0; i < entries; i++) { - sdt = (struct ACPIsdt *) acpi_pmap_ptv((vm_offset_t) ptrs[i]); - if (strncmp(sdt->signature, "FACP", 4) == 0 && acpi_sdt_checksum(sdt) == 0) { - return((struct FACPbody *)sdt->body); - } - } - return(NULL); -} --- i386/include/acpi_machdep.h- Fri Sep 29 22:24:44 2000 +++ i386/include/acpi_machdep.h Fri Sep 29 22:24:51 2000 @@ -32,4 +32,7 @@ #define ACPI_BUS_SPACE_IO I386_BUS_SPACE_IO #define ACPI_BUS_SPACE_MEM I386_BUS_SPACE_MEM +extern struct ACPIrsdp *acpi_find_rsdp(void); +extern void acpi_mapmem(void); + #endif /* ! _MACHINE_ACPI_MACHDEP_H_ */ --- dev/acpi/acpi.c- Fri Sep 29 22:20:38 2000 +++ dev/acpi/acpi.c Fri Sep 29 23:08:44 2000 @@ -53,6 +53,7 @@ #include #include /* for softc */ +#include #include #include @@ -124,6 +125,7 @@ /* * Bus interface */ +static void acpi_identify(driver_t *driver, device_t parent); static int acpi_probe(device_t dev); static int acpi_attach(device_t dev); static void acpi_free(struct acpi_softc *sc); @@ -333,6 +335,40 @@ } /* + * Locate the FACP within the mapped ACPI memory. + */ +static struct FACPbody * +acpi_find_facp(struct ACPIrsdp *rsdp) +{ + u_int32_t *ptrs; + int entries; + int i; + struct ACPIsdt *rsdt, *sdt; + + rsdt = (struct ACPIsdt *)acpi_pmap_ptv(rsdp->addr); + if (rsdt == NULL) { + ACPI_DEVPRINTF("can't map memory for RSDT"); + return(NULL); + } + if ((strncmp(rsdt->signature, "RSDT", 4) != 0) || + (acpi_sdt_checksum(rsdt) != 0)) { + ACPI_DEVPRINTF("RSDT is broken\n"); + return(NULL); + } + entries = (rsdt->len - SIZEOF_SDT_HDR) / sizeof(u_int32_t); + ptrs = (u_int32_t *)&rsdt->body; + + for (i = 0; i < entries; i++) { + sdt = (struct ACPIsdt *) acpi_pmap_ptv((vm_offset_t) ptrs[i]); + if (strncmp(sdt->signature, "FACP", 4) == 0 && + acpi_sdt_checksum(sdt) == 0) { + return((struct FACPbody *)sdt->body); + } + } + return(NULL); +} + +/* * Handle the FACP. */ static void @@ -971,6 +1007,95 @@ return (error); } +static void +acpi_identify(driver_t *driver, device_t parent) +{ + device_t child; + struct FACPbody *facp; + + /* + * If we've already got ACPI attached somehow, don't try again. + */ + if (device_find_child(parent, "acpi", 0)) { + printf("ACPI: already attached\n"); + return; + } + + /* + * Handle enough of the RSDT to work out what our I/O resources are. + */ + if ((acpi_rsdp = acpi_find_rsdp()) == NULL) { + return; + } + + acpi_mapmem(); + + if ((facp = acpi_find_facp(acpi_rsdp)) == NULL) { + printf("ACPI: can't map RSDT/FACT\n"); + return; + } + + /* + * Create the device and establish its resources. + */ + if ((child = BUS_ADD_CHILD(parent, 101, "acpi", 0)) == NULL) { + device_printf(parent, "ACPI: could not attach child\n"); + return; + } + + /* + * SMI command register + */ + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_SMI_CMD, + facp->smi_cmd, 1); + + /* + * PM1 event registers + */ + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_EVT, + facp->pm1a_evt_blk, facp->pm1_evt_len); + if (facp->pm1b_evt_blk != 0) + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_EVT, + facp->pm1b_evt_blk, facp->pm1_evt_len); + + /* + * PM1 control registers + */ + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1A_CNT, + facp->pm1a_cnt_blk, facp->pm1_cnt_len); + if (facp->pm1b_cnt_blk != 0) + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM1B_CNT, + facp->pm1b_cnt_blk, facp->pm1_cnt_len); + + /* + * PM2 control register + */ + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM2_CNT, + facp->pm2_cnt_blk, facp->pm2_cnt_len); + + /* + * PM timer register + */ + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_PM_TMR, + facp->pm_tmr_blk, 4); + + /* + * General purpose event registers + */ + if (facp->gpe0_blk != 0) + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE0, + facp->gpe0_blk, facp->gpe0_len); + if (facp->gpe1_blk != 0) + bus_set_resource(child, SYS_RES_IOPORT, ACPI_RES_GPE1, + facp->gpe1_blk, facp->gpe1_len); + + /* + * Notification interrupt + */ + if (facp->sci_int != 0) + bus_set_resource(child, SYS_RES_IRQ, 0, facp->sci_int, 1); +} + static int acpi_probe(device_t dev) { @@ -1113,6 +1238,7 @@ static device_method_t acpi_methods[] = { /* Device interface */ + DEVMETHOD(device_identify, acpi_identify), DEVMETHOD(device_probe, acpi_probe), DEVMETHOD(device_attach, acpi_attach), DEVMETHOD(device_resume, acpi_resume),