_CST Patches

Janosch Machowinski
2005-04-16T15:25:41Z

[-- Attachment #1: Type: text/plain, Size: 1791 bytes --]

Hey
it's the guy with the stupid questions again ;-)
And now I got a few answers I think...
ACPI specification says, that every processor has a C1
state, and on page 262 is an example of an _CST package,
where the first given C state is C2. So I would suggest following patch
to the processor_idle.c Line: 611

cx.type = obj->integer.value;

+//Test if the first entry is a C1 state, if not we fake one
+if ((cx.type != ACPI_STATE_C1) && i == 1) {
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Faking C1 State"));
+ struct acpi_processor_cx c1_fake;
+ memset(&c1_fake, 0, sizeof(c1_fake));
+
+ c1_fake.address = 0;
+ c1_fake.type = ACPI_STATE_C1;
+ c1_fake.latency = 1; //How long needs a HLT instruction to execute ?
+ c1_fake.power = 0; //We don't know anything about the power
consumption so we set it to 0
+ //We copy our fake C1 state over to the power states
+ (pr->power.count)++;
+ memcpy(&(pr->power.states[pr->power.count]), &c1_fake,
sizeof(c1_fake));
+ //Finally we avoid to have morepower + //states than
ACPI_PROCESSOR_MAX_POWER
+ if(count == ACPI_PROCESSOR_MAX_POWER)
+ count--;
+
+ //c1_fake should be freed automaticaly
+
+ }
+

if ((cx.type != ACPI_STATE_C1) &&

This patch fakes an C1 state if the given states by the _CST object
start with anything else than C1 (like on my M6NE here it start's with
C2)

By looking throug the code I also discovered some errors :
on line 492 and 539
for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
memset(pr->power.states, 0, sizeof(struct acpi_processor_cx))

my patch also replaces these lines by
for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
memset(&(pr->power.states[i]), 0, sizeof(struct acpi_processor_cx))

Greets
Janosch Machowinski

P.S.: Note the attached file is only a diff to the original
processor_idle.c

[-- Attachment #2: _CST_fakeC1.patch --]
[-- Type: text/x-patch, Size: 1179 bytes --]

493c493
< memset(&(pr->power.states[i]), 0, sizeof(struct acpi_processor_cx));
---
> memset(pr->power.states, 0, sizeof(struct acpi_processor_cx));
540c540
< memset(&(pr->power.states[i]), 0, sizeof(struct acpi_processor_cx));
---
> memset(pr->power.states, 0, sizeof(struct acpi_processor_cx));
612,632d611
< //Test if the first entry is a C1 state, if not we fake one
< if ((cx.type != ACPI_STATE_C1) && i == 1) {
< ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Faking C1 State"));
< struct acpi_processor_cx c1_fake;
< memset(&c1_fake, 0, sizeof(c1_fake));
<
< c1_fake.address = 0;
< c1_fake.type = ACPI_STATE_C1;
< c1_fake.latency = 1; //How long needs a HLT instruction to execute ?
< c1_fake.power = 0; //We don't know anything about the power consumption so we set it to 0
< //We copy our fake C1 state over to the power states
< (pr->power.count)++;
< memcpy(&(pr->power.states[pr->power.count]), &c1_fake, sizeof(c1_fake));
< //Finally we avoid to have more power states than ACPI_PROCESSOR_MAX_POWER
< if(count == ACPI_PROCESSOR_MAX_POWER)
< count--;
<
< //c1_fake should be freed automaticaly
< }
<
<