summaryrefslogtreecommitdiff
path: root/thermal/thermalclient/simtc.c
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /thermal/thermalclient/simtc.c
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'thermal/thermalclient/simtc.c')
-rw-r--r--thermal/thermalclient/simtc.c332
1 files changed, 332 insertions, 0 deletions
diff --git a/thermal/thermalclient/simtc.c b/thermal/thermalclient/simtc.c
new file mode 100644
index 00000000..d83ac37e
--- /dev/null
+++ b/thermal/thermalclient/simtc.c
@@ -0,0 +1,332 @@
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ simtc.c
+
+Abstract:
+
+ The module implements a simulated thermal client.
+
+@@BEGIN_DDKSPLIT
+Author:
+
+ Nicholas Brekhus (NiBrekhu) 26-Jul-2011
+
+Revision History:
+
+@@END_DDKSPLIT
+--*/
+
+//-------------------------------------------------------------------- Includes
+
+#include "simtc.h"
+
+//--------------------------------------------------------------------- Globals
+
+ULONG SimThermalClientDebug = SIMTC_PRINT_ALWAYS;
+
+//------------------------------------------------------------------ Prototypes
+
+DRIVER_INITIALIZE DriverEntry;
+
+EVT_WDF_DRIVER_DEVICE_ADD SimTcDriverDeviceAdd;
+
+DEVICE_ACTIVE_COOLING SimTcEngageActiveCooling;
+DEVICE_PASSIVE_COOLING SimTcEngagePassiveCooling;
+
+//--------------------------------------------------------------------- Pragmas
+
+#pragma alloc_text(INIT, DriverEntry)
+#pragma alloc_text(PAGE, SimTcDriverDeviceAdd)
+#pragma alloc_text(PAGE, SimTcEngageActiveCooling)
+#pragma alloc_text(PAGE, SimTcEngagePassiveCooling)
+
+//------------------------------------------------------------------- Functions
+
+NTSTATUS
+DriverEntry (
+ PDRIVER_OBJECT DriverObject,
+ PUNICODE_STRING RegistryPath
+ )
+
+/*++
+
+Routine Description:
+
+ DriverEntry initializes the driver and is the first routine called by the
+ system after the driver is loaded. DriverEntry configures and creates a WDF
+ driver object.
+
+Parameters Description:
+
+ DriverObject - Supplies a pointer to the driver object.
+
+ RegistryPath - Supplies a pointer to a unicode string representing the path
+ to the driver-specific key in the registry.
+
+Return Value:
+
+ NTSTATUS.
+
+--*/
+
+{
+
+ WDF_OBJECT_ATTRIBUTES DriverAttributes;
+ WDF_DRIVER_CONFIG DriverConfig;
+ NTSTATUS Status;
+
+ DebugEnter();
+
+ WDF_DRIVER_CONFIG_INIT(&DriverConfig, SimTcDriverDeviceAdd);
+
+ //
+ // Initialize attributes and a context area for the driver object.
+ //
+
+ WDF_OBJECT_ATTRIBUTES_INIT(&DriverAttributes);
+ DriverAttributes.SynchronizationScope = WdfSynchronizationScopeNone;
+
+ //
+ // Create the driver object
+ //
+
+ Status = WdfDriverCreate(DriverObject,
+ RegistryPath,
+ &DriverAttributes,
+ &DriverConfig,
+ WDF_NO_HANDLE);
+
+ if (!NT_SUCCESS(Status)) {
+ DebugPrint(SIMTC_ERROR,
+ "WdfDriverCreate() Failed. Status 0x%x\n",
+ Status);
+
+ goto DriverEntryEnd;
+ }
+
+DriverEntryEnd:
+ DebugExitStatus(Status);
+ return Status;
+}
+
+NTSTATUS
+SimTcDriverDeviceAdd (
+ WDFDRIVER Driver,
+ PWDFDEVICE_INIT DeviceInit
+ )
+
+/*++
+
+Routine Description:
+
+ EvtDriverDeviceAdd is called by the framework in response to AddDevice
+ call from the PnP manager. A WDF device object is created and initialized to
+ represent a new instance of the battery device.
+
+Arguments:
+
+ Driver - Supplies a handle to the WDF Driver object.
+
+ DeviceInit - Supplies a pointer to a framework-allocated WDFDEVICE_INIT
+ structure.
+
+Return Value:
+
+ NTSTATUS
+
+--*/
+
+{
+
+ PFDO_DATA DevExt;
+ WDF_OBJECT_ATTRIBUTES DeviceAttributes;
+ WDFDEVICE DeviceHandle;
+ WDF_QUERY_INTERFACE_CONFIG QueryInterfaceConfig;
+ NTSTATUS Status;
+ THERMAL_DEVICE_INTERFACE ThermalDeviceInterface;
+
+ UNREFERENCED_PARAMETER(Driver);
+
+ DebugEnter();
+ PAGED_CODE();
+
+ //
+ // Initialize attributes and a context area for the device object.
+ //
+
+ WDF_OBJECT_ATTRIBUTES_INIT(&DeviceAttributes);
+ WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&DeviceAttributes, FDO_DATA);
+
+ //
+ // Create a framework device object. This call will in turn create
+ // a WDM device object, attach to the lower stack, and set the
+ // appropriate flags and attributes.
+ //
+
+ Status = WdfDeviceCreate(&DeviceInit, &DeviceAttributes, &DeviceHandle);
+ if (!NT_SUCCESS(Status)) {
+ DebugPrint(SIMTC_ERROR, "WdfDeviceCreate() Failed. 0x%x\n", Status);
+ goto DriverDeviceAddEnd;
+ }
+
+ //
+ // Create a driver interface for this device to advertise the thermal
+ // cooling interface.
+ //
+
+ RtlZeroMemory(&ThermalDeviceInterface, sizeof(ThermalDeviceInterface));
+
+ ThermalDeviceInterface.Size =
+ sizeof(ThermalDeviceInterface);
+
+ ThermalDeviceInterface.Version = 1;
+
+ ThermalDeviceInterface.Context = DeviceHandle;
+ ThermalDeviceInterface.InterfaceReference =
+ WdfDeviceInterfaceReferenceNoOp;
+
+ ThermalDeviceInterface.InterfaceDereference =
+ WdfDeviceInterfaceDereferenceNoOp;
+
+ ThermalDeviceInterface.Flags = ThermalDeviceFlagPassiveCooling
+ | ThermalDeviceFlagActiveCooling;
+
+ ThermalDeviceInterface.ActiveCooling = SimTcEngageActiveCooling;
+ ThermalDeviceInterface.PassiveCooling = SimTcEngagePassiveCooling;
+
+ WDF_QUERY_INTERFACE_CONFIG_INIT(&QueryInterfaceConfig,
+ (PINTERFACE) &ThermalDeviceInterface,
+ &GUID_THERMAL_COOLING_INTERFACE,
+ NULL);
+
+ Status = WdfDeviceAddQueryInterface(DeviceHandle, &QueryInterfaceConfig);
+ if (!NT_SUCCESS(Status)) {
+ DebugPrint(SIMTC_ERROR,
+ "WdfDeviceAddQueryInterface() Failed. 0x%x\n",
+ Status);
+
+ goto DriverDeviceAddEnd;
+ }
+
+ Status = WdfDeviceCreateDeviceInterface(DeviceHandle,
+ &GUID_DEVINTERFACE_THERMAL_COOLING,
+ NULL);
+
+ if (!NT_SUCCESS(Status)) {
+ DebugPrint(SIMTC_ERROR,
+ "WdfDeviceCreateDeviceInterface() Failed. 0x%x\n",
+ Status);
+
+ goto DriverDeviceAddEnd;
+ }
+
+ //
+ // Finish initializing the device context area.
+ //
+
+ DevExt = GetDeviceExtension(DeviceHandle);
+ DevExt->ThermalLevel = 100UL;
+ DevExt->ActiveCoolingEngaged = FALSE;
+
+DriverDeviceAddEnd:
+ DebugExitStatus(Status);
+ return Status;
+}
+
+VOID
+SimTcEngageActiveCooling(
+ _Inout_opt_ PVOID Context,
+ _In_ BOOLEAN Engaged
+ )
+
+/*++
+
+Routine Description:
+
+ SimTcEngageActiveCooling is called by the device's clients to set the
+ device's active cooling state.
+
+Arguments:
+
+ Context - Supplies a handle to the target device.
+
+ Engaged - Supplies the new cooling state.
+
+Return Value:
+
+ None
+
+--*/
+
+{
+ PFDO_DATA DevExt;
+ BOOLEAN PreviousActiveCoolingState;
+
+ DebugEnter();
+ PAGED_CODE();
+
+ _Analysis_assume_(Context != NULL);
+ NT_ASSERT(Context != NULL);
+ DevExt = GetDeviceExtension((WDFDEVICE)Context);
+
+ PreviousActiveCoolingState = DevExt->ActiveCoolingEngaged;
+ DevExt->ActiveCoolingEngaged = Engaged;
+
+ DebugPrint(SIMTC_TRACE,
+ "Active cooling state was %s, now %s.\n",
+ (PreviousActiveCoolingState != FALSE) ? "on" : "off",
+ (Engaged != FALSE) ? "on" : "off");
+
+ DebugExit();
+}
+
+VOID
+SimTcEngagePassiveCooling (
+ _Inout_opt_ PVOID Context,
+ _In_ ULONG Percentage
+ )
+
+/*++
+
+Routine Description:
+
+ SimTcEngagePassiveCooling is called by the device's clients to set the
+ device's passive cooling state.
+
+Arguments:
+
+ Context - Supplies a handle to the target device.
+
+ Percentage - Supplies the new thermal level in percent.
+
+Return Value:
+
+ None
+
+--*/
+
+{
+ PFDO_DATA DevExt;
+ ULONG PreviousThermalLevel;
+
+ DebugEnter();
+ PAGED_CODE();
+
+ _Analysis_assume_(Context != NULL);
+ NT_ASSERT(Context != NULL);
+ DevExt = GetDeviceExtension((WDFDEVICE)Context);
+
+ PreviousThermalLevel = DevExt->ThermalLevel;
+ DevExt->ThermalLevel = Percentage;
+
+ DebugPrint(SIMTC_TRACE,
+ "Thermal level was %lu, now %lu.\n",
+ PreviousThermalLevel,
+ Percentage);
+
+ DebugExit();
+}