Picture of the Compaq Evo N410c

Getting ACPI to work on a Compaq Evo N410c running Linux How-To

The document explains how to get ACPI to work on a Compaq Evo N410c. While most of the information is available in bits and pieces in other pages, it took me quite a while to learn:

  1. that getting ACPI working on the Compaq Evo N410c was possible, even though a vanilla Kernel with ACPI support will not work.
  2. how to achieve this: finding all the pointers, answers to my questions, etc.

The solution is not perfect by any means. However, it makes the computer usable with ACPI. Readers may want to read notes about the Compaq Evo N410c Linux support in order to get some background information.

Useful links

The problem as I experienced it

When enabling ACPI in the kernel, with or without the ACPI patches, the fan was not detected, which led to overheating. I have written a precise description of the problem.

How to get ACPI (mostly) working

Foreword

Before going further, please not that I know very little about ACPI and that some statements in here may be wrong.

Step by step explanation

ACPI uses a DSDT table which, as I understand it, describes your hardware. Apparently, the DSDT table that is used by default very often does not work well. I do not know why though.

It happens that some of the problems in the DSDT table are easily fixable, which seems to improve the support a great deal even though it is not perfect.

First, I downloaded the latest kernel, 2.4.21-pre5, and the latest ACPI patch applying to 2.4, acpi-20030228-2.4.21-pre4.

Then, I mostly followed the steps described on Intel's Web site about how to override DSDTs. I will go through them here:

  1. Getting the DSDT.

    Follow their instructions.

  2. Disassemble the DSDT.

    Again, follow their instructions.

  3. Modify dsdt.dsl to fix any errors.

    This is where there instructions are a little loose. Here is a little more guidance:

  4. Recompile.

    The compiler can recompile the table even if there are errors remaining. I fixed all the ones I knew how to fix. Unknown objects errors seem tough to fix.

  5. Modify the kernel source to make it take the new table into account.

    The Intel instructions didn't work for me, so I followed different instructions.

    I put the output in drivers/acpi/dsdt_table.h, and modified osl.c in this directory. See the patch to osl.c.

  6. Compile the kernel

    I enabled all the ACPI options, and compiled the kernel.

The case of the Evo N410c

In the case of the Evo N410c, the default DSDT gave me the following errors:

Intel ACPI Component Architecture
ASL Optimizing Compiler / AML Disassembler version 20030228 [Feb 28 2003]
Copyright (C) 2000 - 2003 Intel Corporation
Supports ACPI Specification Revision 2.0b

dsdt.dsl.orig    53:             If (LEqual (\C001, 0x00))
Error    1022 -            Object does not exist ^  (\C001)

dsdt.dsl.orig   188:             Name (_HID, "*PNP0C01")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C01)

dsdt.dsl.orig   305:             Name (_HID, "*PNP0A03")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0A03)

dsdt.dsl.orig  1362:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1387:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1412:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1437:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1462:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1487:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1512:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1537:                 Name (_HID, "*PNP0C0F")
Error    1068 -      String must be entirely alphanumeric ^  (*PNP0C0F)

dsdt.dsl.orig  1719:                     Name (_HID, "*PNP0A06")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0A06)

dsdt.dsl.orig  2873:                         Name (_HID, "*PNP0501")
Error    1068 -              String must be entirely alphanumeric ^  (*PNP0501)

dsdt.dsl.orig  2996:                             Method (_OFF, 0, NotSerialized)
Warning  2019 -        Not all control paths return a value ^  (_OFF)

dsdt.dsl.orig  3019:                         Name (_HID, "*PNP0700")
Error    1068 -              String must be entirely alphanumeric ^  (*PNP0700)

dsdt.dsl.orig  3250:                         Name (_HID, "*SMCF010")
Error    1068 -              String must be entirely alphanumeric ^  (*SMCF010)

dsdt.dsl.orig  3375:                         Name (_HID, "*PNP0401")
Error    1068 -              String must be entirely alphanumeric ^  (*PNP0401)

dsdt.dsl.orig  3579:                     Name (_HID, "*PNP0C04")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0C04)

dsdt.dsl.orig  3589:                     Name (_HID, "*PNP0100")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0100)

dsdt.dsl.orig  3599:                     Name (_HID, "*PNP0200")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0200)

dsdt.dsl.orig  3611:                     Name (_HID, "*PNP0800")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0800)

dsdt.dsl.orig  3620:                     Name (_HID, "*PNP0B00")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0B00)

dsdt.dsl.orig  3631:                     Name (_HID, "*PNP0303")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0303)

dsdt.dsl.orig  3673:                     Name (_HID, "*SYN0100")
Error    1068 -          String must be entirely alphanumeric ^  (*SYN0100)

dsdt.dsl.orig  3679:                     Name (_HID, "*PNP0000")
Error    1068 -          String must be entirely alphanumeric ^  (*PNP0000)

dsdt.dsl.orig  4391:             Name (_HID, "*PNP0C0A")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0A)

dsdt.dsl.orig  4436:             Name (_HID, "*PNP0C0A")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0A)

dsdt.dsl.orig  4476:             Name (_HID, "*PNP0C0A")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0A)

dsdt.dsl.orig  4516:             Name (_HID, "*PNP0C0A")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0A)

dsdt.dsl.orig  4576:             Name (_HID, "*PNP0C0E")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0E)

dsdt.dsl.orig  4590:             Name (_HID, "*PNP0C0D")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0D)

dsdt.dsl.orig  4828:         Name (_HID, "*PNP0C02")
Error    1068 -                                   ^ String must be entirely alphanumeric (*PNP0C02)

dsdt.dsl.orig  5103:         Name (_HID, "*PNP0C02")
Error    1068 -                                   ^ String must be entirely alphanumeric (*PNP0C02)

dsdt.dsl.orig  5121:         Name (_HID, "*PNP0C02")
Error    1068 -                                   ^ String must be entirely alphanumeric (*PNP0C02)

dsdt.dsl.orig  5306:                 Store (C11B (0x1F, 0x00, 0x00, 0x00), Local0)
Error    1029 - Called method returns no value ^ 

dsdt.dsl.orig  5384:                 Store (C11B (0x08, 0x00, 0x00, 0x00), Local0)
Error    1029 - Called method returns no value ^ 

dsdt.dsl.orig  5538:             Name (_HID, "*PNP0C0B")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0B)

dsdt.dsl.orig  5548:             Name (_HID, "*PNP0C0B")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0B)

dsdt.dsl.orig  5558:             Name (_HID, "*PNP0C0B")
Error    1068 -  String must be entirely alphanumeric ^  (*PNP0C0B)

dsdt.dsl.orig  5602:                 \_PR.C000
Error    1022 -        Object does not exist ^  (\_PR.C000)

dsdt.dsl.orig  5642:                 \_PR.C000
Error    1022 -        Object does not exist ^  (\_PR.C000)

dsdt.dsl.orig  5710:                         Notify (\_PR.C000, 0x80)
Error    1022 -                        Object does not exist ^  (\_PR.C000)

ASL Input:  dsdt.dsl.orig - 5859 lines, 196276 bytes, 3499 keywords
Compilation complete. 41 Errors, 1 Warnings, 0 Remarks, 954 Optimizations

After tweaking the table, I ended up with a modified table with no errors, although one of the fixes I did was fairly random:

Intel ACPI Component Architecture
ASL Optimizing Compiler / AML Disassembler version 20030228 [Feb 28 2003]
Copyright (C) 2000 - 2003 Intel Corporation
Supports ACPI Specification Revision 2.0b

ASL Input:  dsdt.dsl - 5861 lines, 196304 bytes, 3501 keywords
AML Output: DSDT.aml - 23685 bytes 784 named objects 2717 executable opcodes

Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 955 Optimizations

This is the table I used.

Interestingly, the errors I found are close to the ones found on a Evo N600c. I found an updated table for it but didn't know what changes where made. I am not sure if I fixed everything as people with Evo N600c did, though.

The result

Note: this section was written as the result of a previous test which had a few compilation errors left.

With this modified table, I got the fan detected, as well as the batteries, thermal information. It is not perfect since the the fan is always on, but at least it doesn't overheat. Also, some programs complain that there is no ACPI support so /proc/acpi may be a little screwy. Here is what the kernel says when it boots up now:

BIOS-provided physical RAM map:
 BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
 BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 000000001ffd0000 (usable)
 BIOS-e820: 000000001ffd0000 - 000000001fff0c00 (reserved)
 BIOS-e820: 000000001fff0c00 - 000000001fffc000 (ACPI NVS)
 BIOS-e820: 000000001fffc000 - 0000000020000000 (reserved)
511MB LOWMEM available.
On node 0 totalpages: 131024
zone(0): 4096 pages.
zone(1): 126928 pages.
zone(2): 0 pages.
ACPI: RSDP (v000 COMPAQ                     ) @ 0x000f6a20
ACPI: RSDT (v001 COMPAQ CPQ004C  08194.00800) @ 0x1fff0c84
ACPI: FADT (v002 COMPAQ CPQ004C  00000.00002) @ 0x1fff0c00
ACPI: SSDT (v001 COMPAQ   CPQCPU 00000.04097) @ 0x1fff6e7b
ACPI: SSDT (v001 COMPAQ  CPQGysr 00000.04097) @ 0x1fff6ec6
ACPI: DSDT (v001 COMPAQ EVON410C 00001.00000) @ 0x00000000
ACPI: BIOS passes blacklist
Kernel command line: root=/dev/hda2 ro resume=/dev/hda4 apm=on hdc=ide-scsi
ide_setup: hdc=ide-scsi
Initializing CPU#0
Detected 1196.039 MHz processor.
Console: colour VGA+ 80x25
Calibrating delay loop... 2385.51 BogoMIPS
Memory: 515748k/524096k available (1461k kernel code, 7960k reserved, 549k data, 84k init, 0k highmem)
Dentry cache hash table entries: 65536 (order: 7, 524288 bytes)
Inode cache hash table entries: 32768 (order: 6, 262144 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 32768 (order: 5, 131072 bytes)
Page-cache hash table entries: 131072 (order: 7, 524288 bytes)
CPU: L1 I cache: 16K, L1 D cache: 16K
CPU: L2 cache: 512K
Intel machine check architecture supported.
Intel machine check reporting enabled on CPU#0.
CPU: Intel(R) Pentium(R) III Mobile CPU      1200MHz stepping 01
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Checking 'hlt' instruction... OK.
POSIX conformance testing by UNIFIX
mtrr: v1.40 (20010327) Richard Gooch (rgooch@atnf.csiro.au)
mtrr: detected mtrr type: Intel
ACPI: Subsystem revision 20030228
PCI: PCI BIOS revision 2.10 entry at 0xf03a2, last bus=3
PCI: Using configuration type 1
   tbget-0292: *** Info: Table [DSDT] replaced by host OS
 tbxface-0117 [03] acpi_load_tables      : ACPI Tables successfully acquired
Parsing all Control Methods:...................................................................................................................................................................................................................................................................
Table [DSDT] - 802 Objects with 88 Devices 259 Methods 24 Regions
Parsing all Control Methods:
Table [SSDT] - 0 Objects with 0 Devices 0 Methods 0 Regions
Parsing all Control Methods:
Table [SSDT] - 0 Objects with 0 Devices 0 Methods 0 Regions
ACPI Namespace successfully loaded at root c031c89c
evxfevnt-0092 [04] acpi_enable           : Transition to ACPI mode successful
   evgpe-0416 [06] ev_create_gpe_block   : GPE Block: 2 registers at 0000000000001028
   evgpe-0421 [06] ev_create_gpe_block   : GPE Block defined as GPE0 to GPE15
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L10 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L11 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L17 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L18 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L1C is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L1D is not valid
   evgpe-0115 [08] ev_save_method_info   : Unknown GPE method type: C1C8 (name not of form _Lnn or _Enn)
   evgpe-0416 [06] ev_create_gpe_block   : GPE Block: 2 registers at 000000000000102C
   evgpe-0421 [06] ev_create_gpe_block   : GPE Block defined as GPE16 to GPE31
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L0B is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L10 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L11 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L17 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L18 is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L1C is not valid
   evgpe-0138 [08] ev_save_method_info   : GPE number associated with method _L1D is not valid
   evgpe-0115 [08] ev_save_method_info   : Unknown GPE method type: C1C8 (name not of form _Lnn or _Enn)
Executing all Device _STA and_INI methods:...evrgnini-0261: *** Error: Could not install pci_config handler for C03E, AE_ALREADY_EXISTS
.....evrgnini-0261: *** Error: Could not install pci_config handler for C03E, AE_ALREADY_EXISTS
.............................................................evrgnini-0261: *** Error: Could not install pci_config handler for C03E, AE_ALREADY_EXISTS
...................
88 Devices found containing: 88 _STA, 7 _INI methods
Completing Region/Field/Buffer/Package initialization:.........................................................................................
Initialized 12/24 Regions 0/0 Fields 25/26 Buffers 52/61 Packages (809 nodes)
ACPI: Interpreter enabled
ACPI: Using PIC for interrupt routing
ACPI: System [ACPI] (supports S0 S3 S4bios S4 S5)
ACPI: PCI Root Bridge [C03E] (00:00)
PCI: Probing PCI hardware (bus 00)
PCI: Ignoring BAR0-3 of IDE controller 00:1f.1
Transparent bridge - Intel Corp. 82801BAM/CAM PCI Bridge
ACPI: Power Resource [C14D] (on)
ACPI: Power Resource [C161] (on)
ACPI: Power Resource [C165] (on)
ACPI: Power Resource [C168] (on)
ACPI: Power Resource [C171] (on)
ACPI: PCI Interrupt Link [C0BB] (IRQs 5 10 11, disabled)
ACPI: PCI Interrupt Link [C0BC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [C0BD] (IRQs 5 10 11, disabled)
ACPI: PCI Interrupt Link [C0BE] (IRQs 5 10 11, disabled)
ACPI: PCI Interrupt Link [C0BF] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [C0C0] (IRQs *5 10 11)
ACPI: PCI Interrupt Link [C0C1] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [C0C2] (IRQs 5 10 11, disabled)
ACPI: Power Resource [C1E0] (off)
ACPI: Power Resource [C1E1] (off)
ACPI: Power Resource [C1E2] (off)
PCI: Probing PCI hardware
ACPI: PCI Interrupt Link [C0BB] enabled at IRQ 5
ACPI: PCI Interrupt Link [C0BD] enabled at IRQ 10
ACPI: PCI Interrupt Link [C0BE] enabled at IRQ 5
ACPI: PCI Interrupt Link [C0C2] enabled at IRQ 11
PCI: Using ACPI for IRQ routing
PCI: if you experience problems, try using option 'pci=noacpi' or even 'acpi=off'
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
ACPI: AC Adapter [C18F] (on-line)
dsmthdat-0475 [44] ds_method_data_get_val: Uninitialized Local[0] at node dfe68108
 psparse-1121: *** Error: Method execution failed [\_SB_.C03E.C054.C0D2.C12F] (Node c15f9f08), AE_AML_UNINITIALIZED_LOCAL
 psparse-1121: *** Error: Method execution failed [\_SB_.C03E.C054.C0D2.C13E] (Node c15f8748), AE_AML_UNINITIALIZED_LOCAL
 psparse-1121: *** Error: Method execution failed [\_SB_.C18B._BTP] (Node c15ee3e8), AE_AML_UNINITIALIZED_LOCAL
ACPI: Battery Slot [C18B] (battery present)
ACPI: Battery Slot [C18C] (battery absent)
ACPI: Battery Slot [C18D] (battery absent)
ACPI: Battery Slot [C18E] (battery absent)
ACPI: Power Button (FF) [PWRF]
ACPI: Sleep Button (CM) [C190]
ACPI: Lid Switch [C191]
ACPI: Fan [C1E3] (off)
ACPI: Fan [C1E4] (off)
ACPI: Fan [C1E5] (off)
ACPI: Processor [C000] (supports C1 C2 C3, 2 performance states, 8 throttling states)
ACPI: Thermal Zone [TZ1] (61 C)
ACPI: Thermal Zone [C1DF] (35 C)

Also, here is what acpi says:

hugo@buena ~> acpi -V
     Battery 1: unknown, 99%
     Thermal 1: active[2], 44.0 degrees C
     Thermal 2: ok, 35.0 degrees C
  AC Adapter 1: on-line

As I said, the fan is always on so I don't think that it is terribly energy-efficient, but at least it is usable.

Going further

I have sent my semi-success story to acpi-devel in order to try and see if I can improve my situation. I am also trying to get more N600c information, and maybe N410c owners will be able to help me completing this task.

Feedback

If you have a N410c and are playing with ACPI, please report your experience to hugo@larve.net and I will try and complete this page.


Hugo Haas