device_attach: acpi_hpet0 attach returned 12

Dimitry Andric dimitry at andric.com
Wed Dec 3 11:01:21 PST 2008


Hi,

Apparently there's a HPET on one of my 7.1-ALMOST-STABLE machines, and
it's enabled in the BIOS too, but it fails to attach:

  Copyright (c) 1992-2008 The FreeBSD Project.
  Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
	  The Regents of the University of California. All rights reserved.
  FreeBSD is a registered trademark of The FreeBSD Foundation.
  FreeBSD 7.1-PRERELEASE #0: Fri Nov 28 16:04:48 CET 2008
      dim at vfbsd7.home.andric.com:/usr/obj/usr/src/sys/TENSOR
  Timecounter "i8254" frequency 1193182 Hz quality 0
  CPU: VIA Esther processor 1200MHz (1200.01-MHz 686-class CPU)
    Origin = "CentaurHauls"  Id = 0x6a9  Stepping = 9
    Features=0xa7c9baff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,APIC,SEP,MTRR,PGE,CMOV,PAT,CLFLUSH,ACPI,MMX,FXSR,SSE,SSE2,TM,PBE>
    Features2=0x181<SSE3,EST,TM2>
    VIA Padlock Features=0x3fcc<RNG,AES,AES-CTR,SHA1,SHA256,RSA>
  real memory  = 518914048 (494 MB)
  avail memory = 498270208 (475 MB)
  ACPI APIC Table: <CN700  AWRDACPI>
  ioapic0 <Version 0.3> irqs 0-23 on motherboard
  kbd1 at kbdmux0
  cryptosoft0: <software crypto> on motherboard
  padlock0: <AES-CBC,SHA1,SHA256> on motherboard
  acpi0: <CN700 AWRDACPI> on motherboard
  acpi0: [ITHREAD]
  acpi0: Power Button (fixed)
  acpi0: reservation of 0, a0000 (3) failed
  acpi0: reservation of 100000, 1ede0000 (3) failed
  Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
  acpi_timer0: <24-bit timer at 3.579545MHz> port 0x408-0x40b on acpi0
  acpi_hpet0: <High Precision Event Timer> iomem 0xfe800000-0xfe8003ff on acpi0
  device_attach: acpi_hpet0 attach returned 12
  [...]

It looks like the HPET should be at address 0xfe800000-0xfe8003ff, but
if I look in the output of "devinfo -rv", I see the following:

  nexus0
    cryptosoft0
    padlock0
    apic0
    acpi0
	Interrupt request lines:
	    9
	I/O ports:
	    0x10-0x1f
	    0x22-0x3f
	    0x44-0x5f
	    0x62-0x63
	    0x65-0x6f
	    0x74-0x7f
	    0x91-0x93
	    0xa2-0xbf
	    0xe0-0xef
	    0x290-0x297
	    0x400-0x47f
	    0x4d0-0x4d1
	    0x500-0x50f
	    0x800-0x805
	I/O memory addresses:
	    0xf0000-0xfffff
	    0x1eee0000-0x1eefffff
	    0xfe800000-0xfe8000ff
  [...]

So apparently the ACPI memory range information says the HPET only uses
256 bytes of iomem, while FreeBSD assumes 1024.  The latter is correct,
at least according to the Intel HPET spec I dug up somewhere.

When I dump ACPI info using acpidump -dt, I see:

  [...]
  /*
    HPET: Length=56, Revision=1, Checksum=196,
	  OEMID=CN700, OEM Table ID=AWRDACPI, OEM Revision=0x42302e31,
	  Creator ID=AWRD, Creator Revision=0x98
	  HPET Number=0
	  ADDR=0xfe800000:0[0] (Memory)   HW Rev=0x1
	  Comparitors=2
	  Counter Size=0
	  Legacy IRQ routing capable={TRUE}
	  PCI Vendor ID=0x1106
	  Minimal Tick=144
   */
  [...]
	  Device (MEM)
	  {
	      Name (_HID, EisaId ("PNP0C01"))
	      Method (_CRS, 0, NotSerialized)
	      {
		  Name (BUF0, ResourceTemplate ()
		  {
		      Memory32Fixed (ReadOnly,
			  0x000F0000,         // Address Base
			  0x00010000,         // Address Length
			  )
		      Memory32Fixed (ReadWrite,
			  0xFE800000,         // Address Base
			  0x00000100,         // Address Length
			  )
  [...]
	      Device (HPET)
	      {
		  Name (_HID, EisaId ("PNP0103"))
		  Name (ATT3, ResourceTemplate ()
		  {
		      IRQNoFlags ()
			  {0}
		      IRQNoFlags ()
			  {8}
		      Memory32Fixed (ReadWrite,
			  0xFE800000,         // Address Base
			  0x00000400,         // Address Length
			  )
		  })
  [...]

So apparently the devinfo information is gotten from ACPI's "Device
(MEM)" declaration, which seems to be inconsistent with the "Device
(HPET)" declaration later on.

My question is therefore: is this just buggy ACPI information in the
BIOS, and can I override it with a custom DSDT file in the boot loader?

Or is there some other workaround?


More information about the freebsd-stable mailing list