git: 2ddfcc013c25 - main - LinuxKPI: acpi: provide union [linuxkpi]_acpi_(object|buffer)

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Fri, 04 Jul 2025 03:22:40 UTC
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=2ddfcc013c251f13c8c9b24970b8134ddd49afea

commit 2ddfcc013c251f13c8c9b24970b8134ddd49afea
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2025-06-15 10:38:56 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2025-07-04 03:22:22 +0000

    LinuxKPI: acpi: provide union [linuxkpi]_acpi_(object|buffer)
    
    Provide union acpi_(object|buffer) as linuxkpi_ versions and in Linux
    native lower case spelling so that driver code compiles unmodified.
    
    Use the linuxkpi_ prefix to avoid name clashes with the native ACPI
    implementation which uses CamelCase.
    
    Use the linuxkpi_ names internally and redefine the linuxkpi_ unions
    to their native names so they are avail as expected in drivers.
    
    As a transition to not break drm-kmod which has in-place (no #ifdef)
    changes from Linux spelling ot FreeBSD spelling, introduce
    LINUXKPI_WANT_LINUX_ACPI so we have the Linux spelling as an opt-in.
    That way the transition can happen gracefully and once "top-of-trees"
    are all sorted we can remove the #ifdefs here again.
    
    Bump __FreeBSD_version to be able to detect this change.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      3 days
    Reviewed by:    wulf (previous version), dumbbell
    Differential Revision: https://reviews.freebsd.org/D50863
---
 sys/compat/linuxkpi/common/include/acpi/acpi.h | 76 ++++++++++++++++++++++++--
 1 file changed, 71 insertions(+), 5 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/acpi/acpi.h b/sys/compat/linuxkpi/common/include/acpi/acpi.h
index e0218bdde12e..1e398d05ba20 100644
--- a/sys/compat/linuxkpi/common/include/acpi/acpi.h
+++ b/sys/compat/linuxkpi/common/include/acpi/acpi.h
@@ -3,6 +3,10 @@
  *
  * Copyright (c) 2017 Mark Johnston <markj@FreeBSD.org>
  * Copyright (c) 2020 Vladimir Kondratyev <wulf@FreeBSD.org>
+ * Copyright (c) 2025 The FreeBSD Foundation
+ *
+ * Portions of this software were developed by Björn Zeeb
+ * under sponsorship from the FreeBSD Foundation.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -30,6 +34,13 @@
 #ifndef _LINUXKPI_ACPI_ACPI_H_
 #define _LINUXKPI_ACPI_ACPI_H_
 
+/*
+ * LINUXKPI_WANT_LINUX_ACPI is a temporary workaround to allow drm-kmod
+ * to update all needed branches without breaking builds.
+ * Once that happened and checks are implemented based on __FreeBSD_verison
+ * we will remove these conditions again.
+ */
+
 /*
  * FreeBSD import of ACPICA has a typedef for BOOLEAN which conflicts with
  * amdgpu driver. Workaround it on preprocessor level.
@@ -46,8 +57,8 @@ typedef int64_t			INT64;
 #include <contrib/dev/acpica/include/acpi.h>
 #undef BOOLEAN
 
+typedef	ACPI_IO_ADDRESS		acpi_io_address;
 typedef ACPI_HANDLE		acpi_handle;
-typedef ACPI_OBJECT		acpi_object;
 typedef ACPI_OBJECT_HANDLER	acpi_object_handler;
 typedef ACPI_OBJECT_TYPE	acpi_object_type;
 typedef ACPI_STATUS		acpi_status;
@@ -55,12 +66,62 @@ typedef ACPI_STRING		acpi_string;
 typedef ACPI_SIZE		acpi_size;
 typedef ACPI_WALK_CALLBACK	acpi_walk_callback;
 
+union linuxkpi_acpi_object {
+	acpi_object_type type;
+	struct {
+		acpi_object_type type;
+		UINT64 value;
+	} integer;
+	struct {
+		acpi_object_type type;
+		UINT32 length;
+		char *pointer;
+	} string;
+	struct {
+		acpi_object_type type;
+		UINT32 length;
+		UINT8 *pointer;
+	} buffer;
+	struct {
+		acpi_object_type type;
+		UINT32 count;
+		union linuxkpi_acpi_object *elements;
+	} package;
+	struct {
+		acpi_object_type type;
+		acpi_object_type actual_type;
+		acpi_handle handle;
+	} reference;
+	struct {
+		acpi_object_type type;
+		UINT32 proc_id;
+		acpi_io_address pblk_address;
+		UINT32 pblk_length;
+	} processor;
+	struct {
+		acpi_object_type type;
+		UINT32 system_level;
+		UINT32 resource_order;
+	} power_resource;
+};
+
+#ifdef	LINUXKPI_WANT_LINUX_ACPI
+struct linuxkpi_acpi_buffer {
+	acpi_size length;	/* Length in bytes of the buffer */
+	void *pointer;		/* pointer to buffer */
+};
+
+typedef	struct linuxkpi_acpi_buffer	lkpi_acpi_buffer_t;
+#else
+typedef	ACPI_BUFFER			lkpi_acpi_buffer_t;
+#endif
+
 static inline ACPI_STATUS
 acpi_evaluate_object(ACPI_HANDLE Object, ACPI_STRING Pathname,
-    ACPI_OBJECT_LIST *ParameterObjects, ACPI_BUFFER *ReturnObjectBuffer)
+    ACPI_OBJECT_LIST *ParameterObjects, lkpi_acpi_buffer_t *ReturnObjectBuffer)
 {
 	return (AcpiEvaluateObject(
-	    Object, Pathname, ParameterObjects, ReturnObjectBuffer));
+	    Object, Pathname, ParameterObjects, (ACPI_BUFFER *)ReturnObjectBuffer));
 }
 
 static inline const char *
@@ -83,9 +144,9 @@ acpi_get_data(ACPI_HANDLE ObjHandle, ACPI_OBJECT_HANDLER Handler, void **Data)
 }
 
 static inline ACPI_STATUS
-acpi_get_name(ACPI_HANDLE Object, UINT32 NameType, ACPI_BUFFER *RetPathPtr)
+acpi_get_name(ACPI_HANDLE Object, UINT32 NameType, lkpi_acpi_buffer_t *RetPathPtr)
 {
-	return (AcpiGetName(Object, NameType, RetPathPtr));
+	return (AcpiGetName(Object, NameType, (ACPI_BUFFER *)RetPathPtr));
 }
 
 static inline ACPI_STATUS
@@ -101,4 +162,9 @@ acpi_put_table(ACPI_TABLE_HEADER *Table)
 	AcpiPutTable(Table);
 }
 
+#ifdef	LINUXKPI_WANT_LINUX_ACPI
+#define	acpi_object		linuxkpi_acpi_object
+#define	acpi_buffer		linuxkpi_acpi_buffer
+#endif
+
 #endif /* _LINUXKPI_ACPI_ACPI_H_ */