1/*
2 * Copyright 2020, J��r��me Duval, jerome.duval@gmail.com.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef WMI_PRIVATE_H
6#define WMI_PRIVATE_H
7
8
9#include <ACPI.h>
10#include <new>
11#include <stdio.h>
12#include <string.h>
13
14#include <lock.h>
15#include <smbios.h>
16#include <util/AutoLock.h>
17#include <util/DoublyLinkedList.h>
18#include <wmi.h>
19
20
21//#define WMI_TRACE
22#ifndef DRIVER_NAME
23#	define DRIVER_NAME "wmi"
24#endif
25#ifdef WMI_TRACE
26#	define TRACE(x...)		dprintf("\33[33m" DRIVER_NAME ":\33[0m " x)
27#else
28#	define TRACE(x...)
29#endif
30#define TRACE_ALWAYS(x...)	dprintf("\33[33m" DRIVER_NAME ":\33[0m " x)
31#define ERROR(x...)			TRACE_ALWAYS(x)
32#define CALLED() 			TRACE("CALLED %s\n", __PRETTY_FUNCTION__)
33
34
35#define WMI_ACPI_DRIVER_NAME "drivers/wmi/acpi/driver_v1"
36#define WMI_DEVICE_MODULE_NAME "drivers/wmi/device/driver_v1"
37
38#define WMI_ASUS_DRIVER_NAME "drivers/wmi/asus/driver_v1"
39
40#define WMI_BUS_COOKIE "wmi/bus/index"
41
42
43class WMIACPI;
44class WMIDevice;
45
46
47extern device_manager_info *gDeviceManager;
48extern smbios_module_info *gSMBios;
49extern wmi_device_interface gWMIDeviceModule;
50extern driver_module_info gWMIAsusDriverModule;
51
52
53class WMIDevice {
54public:
55								WMIDevice(device_node* node);
56								~WMIDevice();
57
58			status_t			InitCheck();
59			status_t			EvaluateMethod(uint8 instance, uint32 methodId,
60									const acpi_data* in, acpi_data* out);
61			status_t			InstallEventHandler(const char* guidString,
62									acpi_notify_handler handler, void* context);
63			status_t			RemoveEventHandler(const char* guidString);
64			status_t			GetEventData(uint32 notify, acpi_data* out);
65			const char*			GetUid();
66private:
67
68private:
69			device_node*		fNode;
70			WMIACPI* 			fBus;
71			uint32				fBusCookie;
72			status_t			fInitStatus;
73};
74
75
76typedef struct {
77	uint8	guid[16];
78	union {
79		char	oid[2];
80		struct {
81			uint8 notify_id;
82		};
83	};
84	uint8	max_instance;
85	uint8	flags;
86} guid_info;
87
88
89struct wmi_info;
90typedef struct wmi_info : DoublyLinkedListLinkImpl<wmi_info> {
91	guid_info			guid;
92	acpi_notify_handler	handler;
93	void*				handler_context;
94} wmi_info;
95typedef DoublyLinkedList<wmi_info> WMIInfoList;
96
97
98
99class WMIACPI {
100public:
101								WMIACPI(device_node *node);
102								~WMIACPI();
103
104			status_t			InitCheck();
105
106			status_t			Scan();
107
108			status_t			GetBlock(uint32 busCookie,
109									uint8 instance, uint32 methodId,
110									acpi_data* out);
111			status_t			SetBlock(uint32 busCookie,
112									uint8 instance, uint32 methodId,
113									const acpi_data* in);
114			status_t			EvaluateMethod(uint32 busCookie,
115									uint8 instance, uint32 methodId,
116									const acpi_data* in, acpi_data* out);
117			status_t			InstallEventHandler(const char* guidString,
118									acpi_notify_handler handler, void* context);
119			status_t			RemoveEventHandler(const char* guidString);
120			status_t			GetEventData(uint32 notify, acpi_data* out);
121			const char*			GetUid(uint32 busCookie);
122private:
123			status_t			_SetEventGeneration(wmi_info* info,
124									bool enabled);
125			status_t			_EvaluateMethodSimple(const char* method,
126									uint64 integer);
127			void				_Notify(acpi_handle device, uint32 value);
128	static	void				_NotifyHandler(acpi_handle device,
129									uint32 value, void *context);
130
131			void				_GuidToGuidString(uint8 guid[16],
132									char* guidString);
133private:
134			device_node*		fNode;
135			acpi_device_module_info* acpi;
136			acpi_device			acpi_cookie;
137			status_t			fStatus;
138			WMIInfoList			fList;
139			wmi_info*			fWMIInfos;
140			uint32				fWMIInfoCount;
141			const char*			fUid;
142};
143
144
145#endif // WMI_PRIVATE_H
146