Hi,

a laptop at hand (samsung q45) has two entries for HPET device, which
point to the same actual device:

HPET: Length=56, Revision=1, Checksum=10,
        OEMID=INTEL, OEM Table ID=CRESTLNE, OEM Revision=0x6040000,
        Creator ID=LOHR, Creator Revision=0x5a

and

HPET: Length=56, Revision=1, Checksum=214,
        OEMID=PTLTD, OEM Table ID=HPETTBL, OEM Revision=0x6040000,
        Creator ID= LTP, Creator Revision=0x1

When apcihpet1 attaches it obviously can't map already mapped memory
space and boils out.

To deal with that I did a hack to count acpihpet devices and attach
only once.  kettenis pointed out that it's easier to just go for
acpihpet0 instead of acpihpet* in the kernel config file.  That works
fine for me too.

Nevertheless, this is my hack:

Index: dev/acpi/acpihpet.c
===================================================================
RCS file: /cvs/src/sys/dev/acpi/acpihpet.c,v
retrieving revision 1.12
diff -N -u -p -u -p dev/acpi/acpihpet.c
--- dev/acpi/acpihpet.c 21 Jul 2010 19:35:15 -0000      1.12
+++ dev/acpi/acpihpet.c 11 Dec 2010 20:16:06 -0000
@@ -29,6 +29,8 @@
 #include <dev/acpi/acpivar.h>
 #include <dev/acpi/acpidev.h>
 
+int hpet_attached;
+
 int acpihpet_match(struct device *, void *, void *);
 void acpihpet_attach(struct device *, struct device *, void *);
 int acpihpet_activate(struct device *, int);
@@ -87,9 +89,9 @@ acpihpet_match(struct device *parent, void *match, voi
        struct acpi_table_header *hdr;
 
        /*
-        * If we do not have a table, it is not us
+        * If we do not have a table, it is not us; attach only once
         */
-       if (aaa->aaa_table == NULL)
+       if (hpet_attached || aaa->aaa_table == NULL)
                return (0);
 
        /*
@@ -170,6 +172,7 @@ acpihpet_attach(struct device *parent, struct device *
        hpet_timecounter.tc_name = sc->sc_dev.dv_xname;
        tc_init(&hpet_timecounter);
 #endif
+       hpet_attached++;
 }
 
 #ifdef __HAVE_TIMECOUNTER

Reply via email to