svn commit: r367231 - head/sys/dev/acpica

Vladimir Kondratyev wulf at FreeBSD.org
Sat Oct 31 19:47:35 UTC 2020


Author: wulf
Date: Sat Oct 31 19:47:34 2020
New Revision: 367231
URL: https://svnweb.freebsd.org/changeset/base/367231

Log:
  acpi: Tweak _DSM method evaluation helpers.
  
  - Use ACPI style for _DSM evaluation helper parameter types.
  - Constify UUID parameter.
  - Increase size of returned DSM function bitmap by acpi_DSMQuery() up to 64
    items. Old limit of 8 functions is not sufficient for JEDEC JESD245 NVDIMMs.
  - Add new acpi_EvaluateDSMTyped() helper which performs additional return
    value type check as compared with acpi_EvaluateDSM().
  - Reimplement acpi_EvaluateDSM() on top of the acpi_EvaluateDSMTyped() call.
  
  Reviewed by:	scottph, manu
  Differential Revision:	https://reviews.freebsd.org/D26602

Modified:
  head/sys/dev/acpica/acpi.c
  head/sys/dev/acpica/acpivar.h

Modified: head/sys/dev/acpica/acpi.c
==============================================================================
--- head/sys/dev/acpica/acpi.c	Sat Oct 31 19:30:23 2020	(r367230)
+++ head/sys/dev/acpica/acpi.c	Sat Oct 31 19:47:34 2020	(r367231)
@@ -2632,8 +2632,8 @@ acpi_AppendBufferResource(ACPI_BUFFER *buf, ACPI_RESOU
     return (AE_OK);
 }
 
-UINT8
-acpi_DSMQuery(ACPI_HANDLE h, uint8_t *uuid, int revision)
+UINT64
+acpi_DSMQuery(ACPI_HANDLE h, const uint8_t *uuid, int revision)
 {
     /*
      * ACPI spec 9.1.1 defines this.
@@ -2645,7 +2645,8 @@ acpi_DSMQuery(ACPI_HANDLE h, uint8_t *uuid, int revisi
      */
     ACPI_BUFFER buf;
     ACPI_OBJECT *obj;
-    UINT8 ret = 0;
+    UINT64 ret = 0;
+    int i;
 
     if (!ACPI_SUCCESS(acpi_EvaluateDSM(h, uuid, revision, 0, NULL, &buf))) {
 	ACPI_INFO(("Failed to enumerate DSM functions\n"));
@@ -2663,12 +2664,13 @@ acpi_DSMQuery(ACPI_HANDLE h, uint8_t *uuid, int revisi
      */
     switch (obj->Type) {
     case ACPI_TYPE_BUFFER:
-	ret = *(uint8_t *)obj->Buffer.Pointer;
+	for (i = 0; i < MIN(obj->Buffer.Length, sizeof(ret)); i++)
+	    ret |= (((uint64_t)obj->Buffer.Pointer[i]) << (i * 8));
 	break;
     case ACPI_TYPE_INTEGER:
 	ACPI_BIOS_WARNING((AE_INFO,
 	    "Possibly buggy BIOS with ACPI_TYPE_INTEGER for function enumeration\n"));
-	ret = obj->Integer.Value & 0xFF;
+	ret = obj->Integer.Value;
 	break;
     default:
 	ACPI_WARNING((AE_INFO, "Unexpected return type %u\n", obj->Type));
@@ -2684,9 +2686,18 @@ acpi_DSMQuery(ACPI_HANDLE h, uint8_t *uuid, int revisi
  * check the type of the returned object.
  */
 ACPI_STATUS
-acpi_EvaluateDSM(ACPI_HANDLE handle, uint8_t *uuid, int revision,
-    uint64_t function, union acpi_object *package, ACPI_BUFFER *out_buf)
+acpi_EvaluateDSM(ACPI_HANDLE handle, const uint8_t *uuid, int revision,
+    UINT64 function, ACPI_OBJECT *package, ACPI_BUFFER *out_buf)
 {
+	return (acpi_EvaluateDSMTyped(handle, uuid, revision, function,
+	    package, out_buf, ACPI_TYPE_ANY));
+}
+
+ACPI_STATUS
+acpi_EvaluateDSMTyped(ACPI_HANDLE handle, const uint8_t *uuid, int revision,
+    UINT64 function, ACPI_OBJECT *package, ACPI_BUFFER *out_buf,
+    ACPI_OBJECT_TYPE type)
+{
     ACPI_OBJECT arg[4];
     ACPI_OBJECT_LIST arglist;
     ACPI_BUFFER buf;
@@ -2697,7 +2708,7 @@ acpi_EvaluateDSM(ACPI_HANDLE handle, uint8_t *uuid, in
 
     arg[0].Type = ACPI_TYPE_BUFFER;
     arg[0].Buffer.Length = ACPI_UUID_LENGTH;
-    arg[0].Buffer.Pointer = uuid;
+    arg[0].Buffer.Pointer = __DECONST(uint8_t *, uuid);
     arg[1].Type = ACPI_TYPE_INTEGER;
     arg[1].Integer.Value = revision;
     arg[2].Type = ACPI_TYPE_INTEGER;
@@ -2714,7 +2725,7 @@ acpi_EvaluateDSM(ACPI_HANDLE handle, uint8_t *uuid, in
     arglist.Count = 4;
     buf.Pointer = NULL;
     buf.Length = ACPI_ALLOCATE_BUFFER;
-    status = AcpiEvaluateObject(handle, "_DSM", &arglist, &buf);
+    status = AcpiEvaluateObjectTyped(handle, "_DSM", &arglist, &buf, type);
     if (ACPI_FAILURE(status))
 	return (status);
 

Modified: head/sys/dev/acpica/acpivar.h
==============================================================================
--- head/sys/dev/acpica/acpivar.h	Sat Oct 31 19:30:23 2020	(r367230)
+++ head/sys/dev/acpica/acpivar.h	Sat Oct 31 19:47:34 2020	(r367231)
@@ -349,10 +349,15 @@ ACPI_STATUS	acpi_FindIndexedResource(ACPI_BUFFER *buf,
 		    ACPI_RESOURCE **resp);
 ACPI_STATUS	acpi_AppendBufferResource(ACPI_BUFFER *buf,
 		    ACPI_RESOURCE *res);
-UINT8		acpi_DSMQuery(ACPI_HANDLE h, uint8_t *uuid, int revision);
-ACPI_STATUS	acpi_EvaluateDSM(ACPI_HANDLE handle, uint8_t *uuid,
-		    int revision, uint64_t function, union acpi_object *package,
+UINT64		acpi_DSMQuery(ACPI_HANDLE h, const uint8_t *uuid,
+		    int revision);
+ACPI_STATUS	acpi_EvaluateDSM(ACPI_HANDLE handle, const uint8_t *uuid,
+		    int revision, UINT64 function, ACPI_OBJECT *package,
 		    ACPI_BUFFER *out_buf);
+ACPI_STATUS	acpi_EvaluateDSMTyped(ACPI_HANDLE handle,
+		    const uint8_t *uuid, int revision, UINT64 function,
+		    ACPI_OBJECT *package, ACPI_BUFFER *out_buf,
+		    ACPI_OBJECT_TYPE type);
 ACPI_STATUS	acpi_EvaluateOSC(ACPI_HANDLE handle, uint8_t *uuid,
 		    int revision, int count, uint32_t *caps_in,
 		    uint32_t *caps_out, bool query);


More information about the svn-src-head mailing list