Paul Menzel (paulepanter@users.sourceforge.net) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2189
-gerrit
commit 5d9b1d221d5daf2fa93b09c9bab67f06ce7c06ce Author: Paul Menzel paulepanter@users.sourceforge.net Date: Mon Jan 21 18:43:12 2013 +0100
AMD Persimmon, ASRock E350M1: Set P_BLK length to 6 for all processors
Currently on AMD Persimmon and ASRock E350M1 Linux complains, that the PBLK length is invalid [1].
ACPI: Invalid PBLK length [0]
Consequently, frequency scaling might not work correctly, though for these two boards it seems to work according to PowerTOP run on the ASRock E350M1.
Indeed, according to the ACPI specification [2], setting PBlockLength to 0 is only allowed if there is no PBlockAddress. Otherwise it has to be set to 6.
18.5.93 Processor (Declare Processor)
[…]
PBlockAddress provides the system I/O address for the processors register block. Each processor can supply a different such address. PBlockLength is the length of the processor register block, in bytes and is either 0 (for no P_BLK) or 6. With one exception, all processors are required to have the same PBlockLength. The exception is that the boot processor can have a non-zero PBlockLength when all other processors have a zero PBlockLength. It is valid for every processor to have a PBlockLength of 0.
And that is exactly what Linux is checking in `drivers/acpi/processor_driver.c` [3].
static int acpi_processor_get_info(struct acpi_device *device) { […] /* * On some boxes several processors use the same processor bus id. * But they are located in different scope. For example: * _SB.SCK0.CPU0 * _SB.SCK1.CPU0 * Rename the processor device bus id. And the new bus id will be * generated as the following format: * CPU+CPU ID. */ sprintf(acpi_device_bid(device), "CPU%X", pr->id); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, pr->acpi_id));
if (!object.processor.pblk_address) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); else if (object.processor.pblk_length != 6) printk(KERN_ERR PREFIX "Invalid PBLK length [%d]\n", object.processor.pblk_length); else { pr->throttling.address = object.processor.pblk_address; pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; pr->throttling.duty_width = acpi_gbl_FADT.duty_width;
pr->pblk = object.processor.pblk_address;
/* * We don't care about error returns - we just try to mark * these reserved so that nobody else is confused into thinking * that this region might be unused.. * * (In particular, allocating the IO range for Cardbus) */ request_region(pr->throttling.address, 6, "ACPI CPU throttle"); } […] }
The DSDT of for example AMD Parmer and AMD Thatcher also set it to 6 everywhere.
[1] http://www.coreboot.org/pipermail/coreboot/2013-January/073636.html [2] http://acpi.info/DOWNLOADS/ACPIspec40a.pdf [3] http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=driver...
Change-Id: Ie79fe4812532d124cc81747c75a4f3d88d00531c Signed-off-by: Paul Menzel paulepanter@users.sourceforge.net --- src/mainboard/amd/persimmon/dsdt.asl | 6 +++--- src/mainboard/asrock/e350m1/dsdt.asl | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/mainboard/amd/persimmon/dsdt.asl b/src/mainboard/amd/persimmon/dsdt.asl index dd7b4b1..22c0295 100644 --- a/src/mainboard/amd/persimmon/dsdt.asl +++ b/src/mainboard/amd/persimmon/dsdt.asl @@ -75,21 +75,21 @@ DefinitionBlock ( C001, /* name space name */ 1, /* Unique number for this processor */ 0x810, /* PBLK system I/O address !hardcoded! */ - 0x00 /* PBLKLEN for boot processor */ + 0x06 /* PBLKLEN for boot processor */ ) { } Processor( C002, /* name space name */ 2, /* Unique number for this processor */ 0x810, /* PBLK system I/O address !hardcoded! */ - 0x00 /* PBLKLEN for boot processor */ + 0x06 /* PBLKLEN for boot processor */ ) { } Processor( C003, /* name space name */ 3, /* Unique number for this processor */ 0x810, /* PBLK system I/O address !hardcoded! */ - 0x00 /* PBLKLEN for boot processor */ + 0x06 /* PBLKLEN for boot processor */ ) { } } /* End _PR scope */ diff --git a/src/mainboard/asrock/e350m1/dsdt.asl b/src/mainboard/asrock/e350m1/dsdt.asl index 1cd88b8..e34f161 100644 --- a/src/mainboard/asrock/e350m1/dsdt.asl +++ b/src/mainboard/asrock/e350m1/dsdt.asl @@ -75,21 +75,21 @@ DefinitionBlock ( C001, /* name space name */ 1, /* Unique number for this processor */ 0x810, /* PBLK system I/O address !hardcoded! */ - 0x00 /* PBLKLEN for boot processor */ + 0x06 /* PBLKLEN for boot processor */ ) { } Processor( C002, /* name space name */ 2, /* Unique number for this processor */ 0x810, /* PBLK system I/O address !hardcoded! */ - 0x00 /* PBLKLEN for boot processor */ + 0x06 /* PBLKLEN for boot processor */ ) { } Processor( C003, /* name space name */ 3, /* Unique number for this processor */ 0x810, /* PBLK system I/O address !hardcoded! */ - 0x00 /* PBLKLEN for boot processor */ + 0x06 /* PBLKLEN for boot processor */ ) { } } /* End _PR scope */