[PATCH] Naive implementation of AcpiExCmosSpaceHandler()

2014-06-07 Thread Anthony Jenkins
I'm testing on FreeBSD 11.0-CURRENT #18 r266756M on an HP Envy Sleekbook 
6z-1100 (AMD A-10).  This is a naive implementation of 
AcpiExCmosSpaceHandler(), it simply uses I/O ports 0x70 and 0x71 to read/write 
CMOS registers using AcpiHwWritePort()/AcpiHwReadPort() calls. I'm new(ish) to 
the ACPICA subsystem and I'm probably not going about this the right way - I 
think I should implement an actual FreeBSD CMOS RTC device which handles the 
three PNP IDs that represent those hardware devices, but this was good enough 
for what I was trying to do.

This fixes my HP Envy 6z-1100 laptop's suspend/resume (except video fails to 
resume, but I believe that's due to backlight handling from my research). 
Before, initiating a suspend (zzz(8)) caused the laptop to suspend and 
immediately resume. Now trying to track down the backlight issue. I implemented 
a missing _BQC method which returns a single value from the _BCL listj; I think 
Linux does some kind of vendor backlight control method if this method is 
missing.

Suggestions on the patch or backlight issue welcome.
Anthony Jenkins

diff --git a/source/components/events/evhandler.c 
b/source/components/events/evhandler.c
index d17411e..4f341ca 100644
--- a/source/components/events/evhandler.c
+++ b/source/components/events/evhandler.c
@@ -142,6 +142,7 @@ UINT8
AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] =
 ACPI_ADR_SPACE_SYSTEM_MEMORY,
 ACPI_ADR_SPACE_SYSTEM_IO,
 ACPI_ADR_SPACE_PCI_CONFIG,
+ACPI_ADR_SPACE_CMOS,
 ACPI_ADR_SPACE_DATA_TABLE
 };
 
@@ -451,9 +452,12 @@ AcpiEvInstallSpaceHandler (
  */
 if ((Node-Type != ACPI_TYPE_DEVICE) 
 (Node-Type != ACPI_TYPE_PROCESSOR)  
+(Node-Type != ACPI_TYPE_REGION) 
 (Node-Type != ACPI_TYPE_THERMAL)
 (Node != AcpiGbl_RootNode))
 {
+ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+Device %p not a DEVICE, PROCESSOR, REGION, THERMAL type or root 
node.\n, Node));
 Status = AE_BAD_PARAMETER;
 goto UnlockAndExit;
 }
diff --git a/source/components/executer/exregion.c 
b/source/components/executer/exregion.c
index ea10a01..bfdd721 100644
--- a/source/components/executer/exregion.c
+++ b/source/components/executer/exregion.c
@@ -521,6 +521,20 @@ AcpiExPciConfigSpaceHandler (
 return_ACPI_STATUS (Status);
 }
 
+static UINT8 AcpiExCmosRead(ACPI_PHYSICAL_ADDRESS Address)
+{
+UINT32 Value32;
+
+AcpiHwWritePort((ACPI_IO_ADDRESS) 0x70, (UINT32) Address, 8);
+AcpiHwReadPort ((ACPI_IO_ADDRESS) 0x71, Value32, 8);
+return Value32  0xFF;
+}
+
+static void AcpiExCmosWrite(ACPI_PHYSICAL_ADDRESS Address, UINT8 Value)
+{
+AcpiHwWritePort((ACPI_IO_ADDRESS) 0x70, (UINT32) Address, 8);
+AcpiHwWritePort((ACPI_IO_ADDRESS) 0x71, (UINT32) Value, 8);
+}
 
 
/***
  *
@@ -545,7 +559,7 @@ AcpiExCmosSpaceHandler (
 UINT32  Function,
 ACPI_PHYSICAL_ADDRESS   Address,
 UINT32  BitWidth,
-UINT64  *Value,
+UINT64  *Value64,
 void*HandlerContext,
 void*RegionContext)
 {
@@ -554,7 +568,23 @@ AcpiExCmosSpaceHandler (
 
 ACPI_FUNCTION_TRACE (ExCmosSpaceHandler);
 
-
+if (Address  0x80 
+(Function == ACPI_READ || Function == ACPI_WRITE) 
+BitWidth = 64)
+{
+UINT32 i;
+UINT8 *Value = (UINT8 *)Value64;
+
+for (i = 0; i  (BitWidth + 7) / 8; ++i, ++Address, ++Value) {
+if (Function == ACPI_READ) {
+*Value = AcpiExCmosRead(Address);
+} else {
+AcpiExCmosWrite(Address, *Value);
+}
+}
+} else {
+Status = AE_BAD_PARAMETER;
+}
 return_ACPI_STATUS (Status);
 }
 
diff --git a/source/include/acconfig.h b/source/include/acconfig.h
index 6b34484..7fe2eac 100644
--- a/source/include/acconfig.h
+++ b/source/include/acconfig.h
@@ -270,7 +270,7 @@
 /* Maximum SpaceIds for Operation Regions */
 
 #define ACPI_MAX_ADDRESS_SPACE  255
-#define ACPI_NUM_DEFAULT_SPACES 4
+#define ACPI_NUM_DEFAULT_SPACES 5
 
 /* Array sizes. Used for range checking also */
 
___
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: [PATCH] Naive implementation of AcpiExCmosSpaceHandler()

2014-06-06 Thread Jung-uk Kim
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 2014-06-06 19:33:13 -0400, Adrian Chadd wrote:
 Hi!
 
 Would you mind throwing this into a bugzilla report?
 
 https://bugs.freebsd.org/bugzilla/
 
 That way it won't get lost?
 
 Let me know what number it is and I'll chase it down and get it
 into -HEAD.
...
Actually, it is a patch for upstream to review.

https://bugs.acpica.org
https://lists.acpica.org/mailman/listinfo
https://github.com/acpica/acpica

Jung-uk Kim
-BEGIN PGP SIGNATURE-
Version: GnuPG v2

iQEcBAEBAgAGBQJTkldRAAoJEHyflib82/FGnoEH/A2t0nFfkIHSEPICxvuQKucB
D1sG3oQjn4tScyL7Izy4mhGLev7b0zw0u8g1GbAkva8lrr/NSUOgBS5aS/o+LMLE
6gddnOGlpq5BZCBsddpSpKqSIahQarzDHlqhd4mhF9dox+D4XsZ8IfiVIteEjXyc
K/UscdtBHc2SKLRWpbBzm3eS2SRB0R6fRoUkPcZ1MW6y0Np95zUwsa/Ok8vemwyP
/X5u33Q2OdTSwlhQBE7hR3iszEebpvS0+cBUKcM6PFV8RZLlZXMOxdkTyx6o+nxq
5rHsoCZWOn9/yLYxs0NetoLZrm00/nq2LcMTBAE1qJZWfXxKmZ1BSAp7SKZ8zes=
=ZRDm
-END PGP SIGNATURE-
___
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: [PATCH] Naive implementation of AcpiExCmosSpaceHandler()

2014-06-06 Thread Adrian Chadd
ah! you're zetalog?


-a


On 6 June 2014 17:05, Jung-uk Kim j...@freebsd.org wrote:
 -BEGIN PGP SIGNED MESSAGE-
 Hash: SHA1

 On 2014-06-06 19:33:13 -0400, Adrian Chadd wrote:
 Hi!

 Would you mind throwing this into a bugzilla report?

 https://bugs.freebsd.org/bugzilla/

 That way it won't get lost?

 Let me know what number it is and I'll chase it down and get it
 into -HEAD.
 ...
 Actually, it is a patch for upstream to review.

 https://bugs.acpica.org
 https://lists.acpica.org/mailman/listinfo
 https://github.com/acpica/acpica

 Jung-uk Kim
 -BEGIN PGP SIGNATURE-
 Version: GnuPG v2

 iQEcBAEBAgAGBQJTkldRAAoJEHyflib82/FGnoEH/A2t0nFfkIHSEPICxvuQKucB
 D1sG3oQjn4tScyL7Izy4mhGLev7b0zw0u8g1GbAkva8lrr/NSUOgBS5aS/o+LMLE
 6gddnOGlpq5BZCBsddpSpKqSIahQarzDHlqhd4mhF9dox+D4XsZ8IfiVIteEjXyc
 K/UscdtBHc2SKLRWpbBzm3eS2SRB0R6fRoUkPcZ1MW6y0Np95zUwsa/Ok8vemwyP
 /X5u33Q2OdTSwlhQBE7hR3iszEebpvS0+cBUKcM6PFV8RZLlZXMOxdkTyx6o+nxq
 5rHsoCZWOn9/yLYxs0NetoLZrm00/nq2LcMTBAE1qJZWfXxKmZ1BSAp7SKZ8zes=
 =ZRDm
 -END PGP SIGNATURE-
___
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


[PATCH] Naive implementation of AcpiExCmosSpaceHandler()

2014-06-04 Thread Anthony Jenkins
Here's a naive implementation of AcpiExCmosSpaceHandler(), it simply uses I/O 
ports 0x70 and 0x71 to read/write CMOS registers using 
AcpiHwWritePort()/AcpiHwReadPort() calls.  I'm new(ish) to the ACPICA subsystem 
and I'm probably not going about this the right way - I think I should 
implement an actual CMOS RTC device which handles the three PNP IDs that 
represent those hardware devices, but this was good enough for what I was 
trying to do.

This fixes my HP Envy 6z-1100 laptop's suspend/resume (except video fails to 
resume, but I believe that's due to backlight handling from my research).  
Before, initiating a suspend (zzz(8)) caused the laptop to seemingly suspend 
and immediately resume.

Now trying to track down the backlight issue. I implemented a missing _BQC 
method which returns a single value from the _BCL listj; I think Linux does 
some kind of vendor backlight control method if this method is missing.

Suggestions welcome.
Anthony Jenkins

Index: sys/contrib/dev/acpica/components/events/evhandler.c
===
--- sys/contrib/dev/acpica/components/events/evhandler.c(revision 266756)
+++ sys/contrib/dev/acpica/components/events/evhandler.c(working copy)
@@ -70,6 +70,7 @@
 ACPI_ADR_SPACE_SYSTEM_MEMORY,
 ACPI_ADR_SPACE_SYSTEM_IO,
 ACPI_ADR_SPACE_PCI_CONFIG,
+ACPI_ADR_SPACE_CMOS,
 ACPI_ADR_SPACE_DATA_TABLE
 };
 
@@ -379,9 +380,12 @@
  */
 if ((Node-Type != ACPI_TYPE_DEVICE) 
 (Node-Type != ACPI_TYPE_PROCESSOR)  
+(Node-Type != ACPI_TYPE_REGION) 
 (Node-Type != ACPI_TYPE_THERMAL)
 (Node != AcpiGbl_RootNode))
 {
+ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+Device %p not a DEVICE, PROCESSOR, REGION, THERMAL type or root 
node.\n, Node));
 Status = AE_BAD_PARAMETER;
 goto UnlockAndExit;
 }
Index: sys/contrib/dev/acpica/components/executer/exregion.c
===
--- sys/contrib/dev/acpica/components/executer/exregion.c(revision 266756)
+++ sys/contrib/dev/acpica/components/executer/exregion.c(working copy)
@@ -449,7 +449,21 @@
 return_ACPI_STATUS (Status);
 }
 
+static UINT8 AcpiExCmosRead(ACPI_PHYSICAL_ADDRESS Address)
+{
+UINT32 Value32;
 
+AcpiHwWritePort((ACPI_IO_ADDRESS) 0x70, (UINT32) Address, 8);
+AcpiHwReadPort ((ACPI_IO_ADDRESS) 0x71, Value32, 8);
+return Value32  0xFF;
+}
+
+static void AcpiExCmosWrite(ACPI_PHYSICAL_ADDRESS Address, UINT8 Value)
+{
+AcpiHwWritePort((ACPI_IO_ADDRESS) 0x70, (UINT32) Address, 8);
+AcpiHwWritePort((ACPI_IO_ADDRESS) 0x71, (UINT32) Value, 8);
+}
+
 
/***
  *
  * FUNCTION:AcpiExCmosSpaceHandler
@@ -473,7 +487,7 @@
 UINT32  Function,
 ACPI_PHYSICAL_ADDRESS   Address,
 UINT32  BitWidth,
-UINT64  *Value,
+UINT64  *Value64,
 void*HandlerContext,
 void*RegionContext)
 {
@@ -482,7 +496,23 @@
 
 ACPI_FUNCTION_TRACE (ExCmosSpaceHandler);
 
+if (Address  0x80 
+(Function == ACPI_READ || Function == ACPI_WRITE) 
+BitWidth = 64)
+{
+UINT32 i;
+UINT8 *Value = (UINT8 *)Value64;
 
+for (i = 0; i  (BitWidth + 7) / 8; ++i, ++Address, ++Value) {
+if (Function == ACPI_READ) {
+*Value = AcpiExCmosRead(Address);
+} else {
+AcpiExCmosWrite(Address, *Value);
+}
+}
+} else {
+Status = AE_BAD_PARAMETER;
+}
 return_ACPI_STATUS (Status);
 }
 
Index: sys/contrib/dev/acpica/include/acconfig.h
===
--- sys/contrib/dev/acpica/include/acconfig.h(revision 266756)
+++ sys/contrib/dev/acpica/include/acconfig.h(working copy)
@@ -194,7 +194,7 @@
 /* Maximum SpaceIds for Operation Regions */
 
 #define ACPI_MAX_ADDRESS_SPACE  255
-#define ACPI_NUM_DEFAULT_SPACES 4
+#define ACPI_NUM_DEFAULT_SPACES 5
 
 /* Array sizes. Used for range checking also */
 


___
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