Date: Tue, 15 May 2007 14:22:23 +0900 From: Takanori Watanabe <takawata@init-main.com> To: acpi@freebsd.org Subject: Re: acpi_hpet not found Message-ID: <200705150522.l4F5MNXL022699@sana.init-main.com>
next in thread | raw e-mail | index | archive | help
In message <200705150309.l4F39Z9d021438@sana.init-main.com>, Takanori Watanabe さんいわく: >In message <4648D460.9040400@root.org>, Nate Lawson wrote: >>Takanori Watanabe wrote: >>> In message <200705142056.05598.h.schmalzbauer@omnisec.de>, Harald Schmalzba >u >>er >>> さんいわく: >>>> Hello, >>>> >>>> on my workstation the HPEtimer is not found, but it's enabled in 32-bit mo >d >>e >>>> in BIOS, so I think there is one... It's a 965P (ich8) chipset. >>>> >>>> I can't find anything regarding HPET in tha man pages. Any hints? >>> >>> Show your acpi tables. It may have to support HPET table. >> >> >>Here's what I got from his post: >> >>/* >> HPET: Length=56, Revision=1, Checksum=232, >> OEMID=GBT, OEM Table ID=GBTUACPI, OEM Revision=0x42302e31, >> Creator ID=GBTU, Creator Revision=0x98 >> HPET Number=0 >> ADDR=0xfed00000:0[0] (Memory) HW Rev=0x1 >> Comparitors=2 >> Counter Size=1 >> Legacy IRQ routing capable={TRUE} >> PCI Vendor ID=0x8086 >> Minimal Tick=16 >> */ >> >>But he has no Device of type PNP0103. So we need to implement >>table-based HPET probing, not just AML PNP probing. This is similar to >>how we handle ECDT for the embedded controller. >> >>When we do that, we also need to work around the fact that the address >>bit width is wrong (0). > >I have patch for this on RELENG_6. And I have it for CURRENT.(Untested) Index: acpi.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi.c,v retrieving revision 1.235 diff -u -r1.235 acpi.c - --- acpi.c 25 Apr 2007 16:22:18 -0000 1.235 +++ acpi.c 30 Apr 2007 15:58:34 -0000 @@ -503,6 +503,7 @@ * a problem but should be addressed eventually. */ acpi_ec_ecdt_probe(dev); + acpi_hpet_table_probe(dev); /* Bring device objects and regions online. */ if (ACPI_FAILURE(status = AcpiInitializeObjects(flags))) { Index: acpi_hpet.c =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpi_hpet.c,v retrieving revision 1.6 diff -u -r1.6 acpi_hpet.c - --- acpi_hpet.c 28 Mar 2007 22:28:48 -0000 1.6 +++ acpi_hpet.c 6 Apr 2007 04:10:51 -0000 @@ -41,6 +41,8 @@ ACPI_SERIAL_DECL(hpet, "ACPI HPET support"); +static devclass_t acpi_hpet_devclass; + /* ACPI CA debugging */ #define _COMPONENT ACPI_TIMER ACPI_MODULE_NAME("HPET") @@ -77,17 +79,52 @@ sc = tc->tc_priv; return (bus_read_4(sc->mem_res, HPET_OFFSET_VALUE)); } +#define DEV_HPET(x) (acpi_get_magic(x) == (int)&acpi_hpet_devclass) +void +acpi_hpet_table_probe(device_t parent) +{ + ACPI_TABLE_HPET *hpet; + ACPI_TABLE_HEADER *hdr; + ACPI_STATUS status; + device_t child; + + /*Currently, id and minimam clock tick info. is discarded.*/ + + status = AcpiGetTable(ACPI_SIG_HPET, 1, (ACPI_TABLE_HEADER **)&hdr); + + if (ACPI_FAILURE(status)) + return; + + hpet = (ACPI_TABLE_HPET *) hdr; + child = BUS_ADD_CHILD(parent, 0, "acpi_hpet", hpet->Sequence); + if (child == NULL) { + printf("%s: can't add child\n", __func__); + return; + } + + acpi_set_magic(child, (int)&acpi_hpet_devclass); + bus_set_resource(child, SYS_RES_MEMORY, 0, hpet->Address.Address, HPET_MEM_WIDTH); + if(device_probe_and_attach(child) != 0) + device_delete_child(parent, child); +} static int acpi_hpet_probe(device_t dev) { ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__); - - - - if (acpi_disabled("hpet") || - - ACPI_ID_PROBE(device_get_parent(dev), dev, hpet_ids) == NULL || - - device_get_unit(dev) != 0) + /*First of all, hpet hpet should not disabled.*/ + if(acpi_disabled("hpet")) + return ENXIO; + + /*Already knows */ + if(DEV_HPET(dev)){ + return 0; + } + + if (ACPI_ID_PROBE(device_get_parent(dev), dev, hpet_ids) == NULL || + devclass_get_device(acpi_hpet_devclass, device_get_unit(dev))) return (ENXIO); - - + device_set_desc(dev, "High Precision Event Timer"); return (0); } @@ -211,7 +248,6 @@ sizeof(struct acpi_hpet_softc), }; - -static devclass_t acpi_hpet_devclass; DRIVER_MODULE(acpi_hpet, acpi, acpi_hpet_driver, acpi_hpet_devclass, 0, 0); MODULE_DEPEND(acpi_hpet, acpi, 1, 1, 1); Index: acpivar.h =================================================================== RCS file: /home/ncvs/src/sys/dev/acpica/acpivar.h,v retrieving revision 1.104 diff -u -r1.104 acpivar.h - --- acpivar.h 22 Mar 2007 18:16:40 -0000 1.104 +++ acpivar.h 28 Mar 2007 15:44:43 -0000 @@ -407,6 +407,8 @@ /* Embedded controller. */ void acpi_ec_ecdt_probe(device_t); +/* HPET table probe*/ +void acpi_hpet_table_probe(device_t); /* AC adapter interface. */ int acpi_acad_get_acline(int *); ------- End of Forwarded Message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200705150522.l4F5MNXL022699>