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