2025-04-27 07:49:33 -04:00

532 lines
13 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
dbcacpi.h
Abstract:
Environment:
Kernel & user mode
Revision History:
5-4-98 : created
--*/
#include "dbc100.h"
// "dbc" class global registry Keys
// these are found in HKLM\CCS\Services\Class\DBC
#define DEBUG_LEVEL_KEY L"debuglevel"
#define DEBUG_WIN9X_KEY L"debugWin9x"
#define POLL_MODE_KEY L"pollacpidbc"
// SW branch keys
#define RELEASE_ON_SHUTDOWN L"releaseshutdown"
// HW branch keys
#define ACPI_HUB_KEY L"acpiHubParentPort"
#define DBCACPI_EXT_SIG 0x41434244 //"DBCA"
/* definitions from DBC core spec */
typedef union _DBCCR_REGISTER {
ULONG ul;
struct {
unsigned BayCount:4; /* 0 ..3 */
unsigned HasSecurityLock:1; /* 4 */
unsigned Reserved:27; /* 5..31 */
};
} DBCCR_REGISTER, *PDBCCR_REGISTER;
typedef union _BSTR_REGISTER {
ULONG ul;
struct {
unsigned DeviceUsbIsPresent:1; /* 0 */
unsigned Device1394IsPresent:1; /* 1 */
unsigned DeviceStateChange:1; /* 2 */
unsigned RemovalRequested:1; /* 3 */
unsigned CurrentBayState:3; /* 4..6 */
unsigned SecurityLockEngaged:1; /* 7 */
unsigned BayFormFactor:3; /* 8..10 */
unsigned Reserved:21; /* 11..31 */
};
} BSTR_REGISTER, *PBSTR_REGISTER;
typedef union _BCER_REGISTER {
ULONG ul;
struct {
unsigned EnableVid:1; /* 0 */
unsigned RemovalEventEnable:1; /* 1 */
unsigned DeviceStatusChangeEnable:1; /* 2 */
unsigned RemovalRequestEnable:1; /* 3 */
unsigned BayStateRequested:3; /* 4..6 */
unsigned LockEngage:1; /* 7 */
unsigned Reserved:24; /* 8..31 */
};
} BCER_REGISTER, *PBCER_REGISTER;
typedef struct _DBCACPI_WORKITEM {
ULONG Sig;
WORK_QUEUE_ITEM WorkQueueItem;
} DBCACPI_WORKITEM, *PDBCACPI_WORKITEM;
typedef struct _DEVICE_EXTENSION {
ULONG Sig;
// Device object we call when submitting requests
PDEVICE_OBJECT TopOfStackDeviceObject;
// Our Pdo
PDEVICE_OBJECT PhysicalDeviceObject;
DEVICE_POWER_STATE CurrentDevicePowerState;
PIRP PowerIrp;
PIRP ChangeRequestIrp;
ULONG Flags;
// cached DBC Registers (read once at init)
USHORT VendorId;
UCHAR RevisionId;
UCHAR BayCount;
DBCCR_REGISTER DbControlCapabilities; //DBCCR
PIRP WakeIrp;
KEVENT RemoveEvent;
ULONG PendingIoCount;
DBCACPI_WORKITEM WorkItem;
// array we use to tack bay status changes
// zero index not used
UCHAR BayState[MAX_BAY_NUMBER+1]; //32 bays
BOOLEAN AcceptingRequests;
UCHAR Pad2[3];
KSPIN_LOCK ChangeRequestSpin;
KSPIN_LOCK FlagsSpin;
KDPC PollDpc;
KTIMER PollTimer;
DEVICE_CAPABILITIES DeviceCapabilities;
// subsystem descriptor to use
// note that this may have some values set by the registry
DBC_SUBSYSTEM_DESCRIPTOR SubsystemDescriptor;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// define standard register offsets
#define ACPI_DBC_VENDOR_ID 0x00000000
#define ACPI_DBC_REVISION_ID 0x00000004
#define ACPI_DBC_SUBSYSTEM_VENDOR_ID 0x00000008
#define ACPI_DBC_SUBSYSTEM_ID 0x0000000A
#define ACPI_DBC_DBCCR 0x0000000C
#define ACPI_DBC_BSTR0 0x00000010
#define ACPI_DBC_BCER0 0x00000014
// define acpi methods
#define DBACPI_DBCC_METHOD (ULONG) ('CCBD')
#define DBACPI_GUID_METHOD (ULONG) ('DIUG')
#define DBACPI_BPM3_METHOD (ULONG) ('3MPB')
#define DBACPI_BPMU_METHOD (ULONG) ('UMPB')
#define DBACPI_BCTR_METHOD (ULONG) ('RTCB')
#define DBACPI_BREL_METHOD (ULONG) ('LERB')
// DBCACPI Flags
#define DBCACPI_FLAG_STOPPED 0x00000001
#define DBCACPI_FLAG_ACPIREG 0x00000002
#define DBCACPI_FLAG_ENABLED_FOR_WAKEUP 0x00000004
#define DBCACPI_FLAG_WORKITEM_PENDING 0x00000008
#define DBCACPI_FLAG_STARTED 0x00000010
#define DBC_WORKITEM_SIG 0x54496B77 //"wkIT"
#define DBCACPI_READ_REG_UCHAR(devobj, offset, reg) \
DBCACPI_ReadWriteDBCRegister((devobj),\
(offset),\
(reg),\
sizeof(UCHAR),\
TRUE)
#define DBCACPI_READ_REG_USHORT(devobj, offset, reg) \
DBCACPI_ReadWriteDBCRegister((devobj),\
(offset),\
(reg),\
sizeof(USHORT),\
TRUE)
#define DBCACPI_READ_REG_ULONG(devobj, offset, reg) \
DBCACPI_ReadWriteDBCRegister((devobj),\
(offset),\
(reg),\
sizeof(ULONG),\
TRUE)
#define DBCACPI_WRITE_REG_UCHAR(devobj, offset, reg) \
DBCACPI_ReadWriteDBCRegister((devobj),\
(offset),\
(reg),\
sizeof(UCHAR),\
FALSE)
#define DBCACPI_WRITE_REG_USHORT(devobj, offset, reg) \
DBCACPI_ReadWriteDBCRegister((devobj),\
(offset),\
(reg),\
sizeof(USHORT),\
FALSE)
#define DBCACPI_WRITE_REG_ULONG(devobj, offset, reg) \
DBCACPI_ReadWriteDBCRegister((devobj),\
(offset),\
(reg),\
sizeof(ULONG),\
FALSE)
/*
Debug Macros
*/
#if DBG
#define DEBUG_LOG
#define LOG_MISC 0x00000001 //debug log entries
VOID
DBCACPI_LogInit(
);
VOID
DBCACPI_Assert(
IN PVOID FailedAssertion,
IN PVOID FileName,
IN ULONG LineNumber,
IN PCHAR Message
);
VOID
DBCACPI_Debug_LogEntry(
IN ULONG Mask,
IN CHAR *Name,
IN ULONG Info1,
IN ULONG Info2,
IN ULONG Info3
);
#define LOGENTRY(mask, sig, info1, info2, info3)
// DBCACPI_Debug_LogEntry(mask, sig, (ULONG)info1, (ULONG)info2, (ULONG)info3)
#define DBCACPI_ASSERT(exp) \
if (!(exp)) { \
DBCACPI_Assert( #exp, __FILE__, __LINE__, NULL );\
}
#define DBCACPI_ASSERT_EXT(de) DBCACPI_ASSERT((de)->Sig == DBCACPI_EXT_SIG)
ULONG
_cdecl
DBCACPI_KdPrintX(
ULONG l,
PCH Format,
...
);
#define DBCACPI_KdPrint(_x_) DBCACPI_KdPrintX _x_
#define TEST_TRAP() { DbgPrint( "DBCACPI: Code coverage trap %s line: %d\n", __FILE__, __LINE__);\
TRAP();}
#ifdef MAX_DEBUG
#define MD_TEST_TRAP() { DbgPrint( "DBCACPI: Code test trap %s line: %d\n", __FILE__, __LINE__);\
TRAP();}
#else
#define MD_TEST_TRAP()
#endif
#ifdef NTKERN
#define TRAP() _asm {int 3}
#else
#define TRAP() DbgBreakPoint()
#endif
#else
#define LOGENTRY(mask, sig, info1, info2, info3)
#define DBCACPI_ASSERT(exp)
#define DBCACPI_KdPrint(_x_)
#define DBCACPI_ASSERT_EXT(de)
#define DBCACPI_LogInit()
#define TRAP()
#define TEST_TRAP()
#define MD_TEST_TRAP()
#endif
VOID
DBCACPI_Unload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
DBCACPI_StartDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_StopDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_RemoveDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_AddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS
DBCACPI_CreateDeviceObject(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT *DeviceObject
);
NTSTATUS
DBCACPI_ProcessIOCTL(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
DBCACPI_IncrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
LONG
DBCACPI_DecrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_Power(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBCACPI_Pnp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBCACPI_Power(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBCACPI_WaitWakeIrpCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE DeviceState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
DBCACPI_QueryCapabilities(
IN PDEVICE_OBJECT PdoDeviceObject,
IN PDEVICE_CAPABILITIES DeviceCapabilities
);
NTSTATUS
DBCACPI_SystemControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBCACPI_Ioctl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBCACPI_ReadWriteDBCRegister(
PDEVICE_OBJECT DeviceObject,
ULONG RegisterOffset,
PVOID RegisterData,
USHORT RegisterDataLength,
BOOLEAN ReadRegister
);
NTSTATUS
DBCACPI_SyncAcpiCall(
IN PDEVICE_OBJECT Pdo,
IN ULONG Ioctl,
IN PVOID InputBuffer,
IN ULONG InputSize,
IN PVOID OutputBuffer,
IN ULONG OutputSize
);
NTSTATUS
DBCACPI_ProcessDrb(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBCACPI_SetFeature(
IN PDEVICE_OBJECT DeviceObject,
IN USHORT BayNumber,
IN USHORT FeatureSelector
);
NTSTATUS
DBCACPI_DeferIrpCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
DBCACPI_RegisterWithACPI(
IN PDEVICE_OBJECT FdoDeviceObject,
IN BOOLEAN Register
);
NTSTATUS
DBCACPI_GetAcpiInterfaces(
IN PDEVICE_OBJECT Pdo
);
NTSTATUS
DBCACPI_ClearFeature(
IN PDEVICE_OBJECT DeviceObject,
IN USHORT BayNumber,
IN USHORT FeatureSelector
);
NTSTATUS
DBCACPI_CheckForStatusChange(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_GetBayRegistryParameters(
PDEVICE_OBJECT DeviceObject,
USHORT BayNumber,
PULONG PortUSBMap,
PULONG Port1394Map
);
NTSTATUS
DBCACPI_GetRegistryParameters(
PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_ReadBayMapRegister(
PDEVICE_OBJECT DeviceObject,
BOOLEAN Usb,
PVOID BayData,
USHORT BayDataLength,
ULONG BayNumber
);
NTSTATUS
DBCACPI_ReadBayReleaseRegister(
PDEVICE_OBJECT DeviceObject,
PULONG ReleaseOnShutdown
);
NTSTATUS
DBCACPI_GetClassGlobalDebugRegistryParameters(
);
NTSTATUS
DBCACPI_GetClassGlobalRegistryParameters(
);
NTSTATUS
DBCACPI_ReadGuidRegister(
PDEVICE_OBJECT DeviceObject,
PVOID GuidData,
USHORT GuidDataLength,
ULONG Arg0
);
VOID
DBCACPI_NotifyWorker(
IN PVOID Context
);
NTSTATUS
DBCACPI_BIOSControl(
PDEVICE_OBJECT DeviceObject,
BOOLEAN Enable
);
NTSTATUS
DBCACPI_StartPolling(
PDEVICE_OBJECT DeviceObject
);
NTSTATUS
DBCACPI_GetConfigValue(
IN PWSTR ValueName,
IN ULONG ValueType,
IN PVOID ValueData,
IN ULONG ValueLength,
IN PVOID Context,
IN PVOID EntryContext
);
NTSTATUS
DBCACPI_SetRegistryKeyValueForPdo(
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN BOOLEAN SoftwareBranch,
IN ULONG Type,
IN PWCHAR KeyNameString,
IN ULONG KeyNameStringLength,
IN PVOID Data,
IN ULONG DataLength
);
#if DBG
#define DEBUG_HEAP
extern ULONG TotalHeapSace;
#define DBCACPI_HEAP_SIG 0x12344321
#define DBCACPI_FREE_TAG 0x11111111
#define DbcExAllocatePool(p, l) DBCLASS_GetHeap((p), (l), DBCLASS_HEAP_SIG, &TotalHeapSace)
#define DbcExFreePool(l) DBCLASS_RetHeap((l), DBCLASS_HEAP_SIG, &TotalHeapSace)
#else
#define DbcExAllocatePool(p, l) ExAllocatePool((p), (l))
#define DbcExFreePool(l) ExFreePool((l))
#endif