RE: fixup for missing C1 in _CST

2010-11-11 Thread Moore, Robert
It's not clear to me from reading the ACPI spec that the Cstate sub-packages 
are required to be in any specific order.

This means that

sc-cpu_cx_states[0]

Does not necessarily have to be of type ACPI_STATE_C1, if ACPI_STATE_C1 is 
present on the machine. (unless the driver has sorted the list already.)

This looks like an area where ACPICA could sort the packages by type before 
handing off the _CST package to the driver.

Bob


-Original Message-
From: owner-freebsd-a...@freebsd.org [mailto:owner-freebsd-
a...@freebsd.org] On Behalf Of Andriy Gapon
Sent: Thursday, November 11, 2010 9:21 AM
To: freebsd-acpi@freebsd.org
Subject: fixup for missing C1 in _CST


Dear fellow FreeBSD ACPI hackers,
what is your opinion about the following patch?

The idea is to add a C1 state to available states if a bugggy BIOS supplies
us
with _CST that has states with C2, C3, etc types, but no state with C1
type.

Thanks!

diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c
index 3c675df..6c771d9 100644
--- a/sys/dev/acpica/acpi_cpu.c
+++ b/sys/dev/acpica/acpi_cpu.c
@@ -724,8 +724,21 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc)
   sc-cpu_cx_count++;
   }
 }
-AcpiOsFree(buf.Pointer);

+if (sc-cpu_cx_count  0  sc-cpu_cx_states[0].type !=
ACPI_STATE_C1) {
+  memmove(sc-cpu_cx_states[1], sc-cpu_cx_states[0],
+  sc-cpu_cx_count * sizeof(sc-cpu_cx_states[0]));
+  sc-cpu_cx_states[0].type = ACPI_STATE_C1;
+  sc-cpu_cx_states[0].trans_lat = 0;
+  sc-cpu_cx_states[0].power = 0;
+  sc-cpu_cx_states[0].p_lvlx = NULL;
+  sc-cpu_cx_states[0].res_type = 0;
+  sc-cpu_cx_count++;
+  if (sc-cpu_cx_states[1].type = ACPI_STATE_C2)
+  sc-cpu_non_c3++;
+}
+
+AcpiOsFree(buf.Pointer);
 return (0);
 }


--
Andriy Gapon
___
freebsd-acpi@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
To unsubscribe, send any mail to freebsd-acpi-unsubscr...@freebsd.org
___
freebsd-acpi@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
To unsubscribe, send any mail to freebsd-acpi-unsubscr...@freebsd.org


RE: fixup for missing C1 in _CST

2010-11-11 Thread Moore, Robert
Oops, missed it.

_CST defines ascending C-states...

Could it be that the problem is that the platform is returning a _CST package 
that is not sorted or even is sorted descending?

Bob


-Original Message-
From: owner-freebsd-a...@freebsd.org [mailto:owner-freebsd-
a...@freebsd.org] On Behalf Of Moore, Robert
Sent: Thursday, November 11, 2010 12:20 PM
To: Andriy Gapon; freebsd-acpi@freebsd.org
Cc: Lin, Ming M
Subject: RE: fixup for missing C1 in _CST

It's not clear to me from reading the ACPI spec that the Cstate sub-
packages are required to be in any specific order.

This means that

sc-cpu_cx_states[0]

Does not necessarily have to be of type ACPI_STATE_C1, if ACPI_STATE_C1 is
present on the machine. (unless the driver has sorted the list already.)

This looks like an area where ACPICA could sort the packages by type before
handing off the _CST package to the driver.

Bob


-Original Message-
From: owner-freebsd-a...@freebsd.org [mailto:owner-freebsd-
a...@freebsd.org] On Behalf Of Andriy Gapon
Sent: Thursday, November 11, 2010 9:21 AM
To: freebsd-acpi@freebsd.org
Subject: fixup for missing C1 in _CST


Dear fellow FreeBSD ACPI hackers,
what is your opinion about the following patch?

The idea is to add a C1 state to available states if a bugggy BIOS
supplies
us
with _CST that has states with C2, C3, etc types, but no state with C1
type.

Thanks!

diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c
index 3c675df..6c771d9 100644
--- a/sys/dev/acpica/acpi_cpu.c
+++ b/sys/dev/acpica/acpi_cpu.c
@@ -724,8 +724,21 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *sc)
  sc-cpu_cx_count++;
  }
 }
-AcpiOsFree(buf.Pointer);

+if (sc-cpu_cx_count  0  sc-cpu_cx_states[0].type !=
ACPI_STATE_C1) {
+ memmove(sc-cpu_cx_states[1], sc-cpu_cx_states[0],
+ sc-cpu_cx_count * sizeof(sc-cpu_cx_states[0]));
+ sc-cpu_cx_states[0].type = ACPI_STATE_C1;
+ sc-cpu_cx_states[0].trans_lat = 0;
+ sc-cpu_cx_states[0].power = 0;
+ sc-cpu_cx_states[0].p_lvlx = NULL;
+ sc-cpu_cx_states[0].res_type = 0;
+ sc-cpu_cx_count++;
+ if (sc-cpu_cx_states[1].type = ACPI_STATE_C2)
+ sc-cpu_non_c3++;
+}
+
+AcpiOsFree(buf.Pointer);
 return (0);
 }


--
Andriy Gapon
___
freebsd-acpi@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
To unsubscribe, send any mail to freebsd-acpi-unsubscr...@freebsd.org
___
freebsd-acpi@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
To unsubscribe, send any mail to freebsd-acpi-unsubscr...@freebsd.org
___
freebsd-acpi@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-acpi
To unsubscribe, send any mail to freebsd-acpi-unsubscr...@freebsd.org