[coreboot] New patch to review for coreboot: 5d9b1d2 AMD Persimmon, ASRock E350M1: Set P_BLK length to 6 for all processors

Paul Menzel (paulepanter@users.sourceforge.net) gerrit at coreboot.org
Thu Jan 24 13:51:09 CET 2013


Paul Menzel (paulepanter at 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 at 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=drivers/acpi/processor_driver.c;h=e83311bf1ebdaaaea1adbf2de1351cca907d3465;hb=5da1f88b8b727dc3a66c52d4513e871be6d43d19#l351
    
    Change-Id: Ie79fe4812532d124cc81747c75a4f3d88d00531c
    Signed-off-by: Paul Menzel <paulepanter at 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 */



More information about the coreboot mailing list