2 * PROJECT: ReactOS i8042 (ps/2 keyboard-mouse controller) driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/input/i8042prt/hwhacks.c
5 * PURPOSE: Mouse specific functions
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
7 * REFERENCES: - http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
20 const GUID MSSmBios_RawSMBiosTables_GUID
= SMBIOS_DATA_GUID
;
21 PVOID i8042SMBiosTables
;
44 typedef struct _MATCHENTRY
50 #define MAX_MATCH_ENTRIES 3
51 typedef struct _HARDWARE_TABLE
53 MATCHENTRY MatchEntries
[MAX_MATCH_ENTRIES
];
57 const HARDWARE_TABLE i8042HardwareTable
[] =
59 // { {{BOARD_VENDOR, "RIOWORKS"}, {BOARD_NAME, "HDAMB"}, {BOARD_VERSION, "Rev E"}}, FL_NOLOOP },
60 // { {{BOARD_VENDOR, "ASUSTeK Computer Inc."}, {BOARD_NAME, "G1S"}, {BOARD_VERSION, "1.0"}}, FL_NOLOOP },
62 { {{SYS_VENDOR
, "Microsoft Corporation"}, {SYS_PRODUCT
, "Virtual Machine"}}, FL_INITHACK
},
63 { {{SYS_VENDOR
, "Dell Inc."}, {SYS_PRODUCT
, "Latitude D530 "}}, FL_INITHACK
},
64 { {{SYS_VENDOR
, "Dell Inc."}, {SYS_PRODUCT
, "Latitude D531 "}}, FL_INITHACK
},
65 { {{SYS_VENDOR
, "Dell Inc."}, {SYS_PRODUCT
, "Latitude D600 "}}, FL_INITHACK
},
66 { {{SYS_VENDOR
, "Dell Inc."}, {SYS_PRODUCT
, "Latitude D630 "}}, FL_INITHACK
},
75 _In_ PDMI_HEADER Header
,
76 _In_ ULONG FieldOffset
)
81 StringIndex
= ((PUCHAR
)Header
)[FieldOffset
];
87 String
= (PCHAR
)Header
+ Header
->Length
;
89 while (--StringIndex
!= 0)
103 i8042ParseSMBiosTables(
104 _In_reads_bytes_(TableSize
) PVOID SMBiosTables
,
105 _In_ ULONG TableSize
)
107 PMSSmBios_RawSMBiosTables BiosTablesHeader
= SMBiosTables
;
109 ULONG Remaining
, i
, j
;
111 PCHAR Strings
[ID_STRINGS_MAX
] = { 0 };
113 Header
= (PDMI_HEADER
)(&BiosTablesHeader
->SMBiosData
);
114 Remaining
= BiosTablesHeader
->Size
;
116 while (Remaining
>= sizeof(*Header
))
119 if (Header
->Type
== DMI_ENTRY_END_OF_TABLE
)
122 switch (Header
->Type
)
125 if (Remaining
< DMI_BIOS_SIZE
)
127 Strings
[BIOS_VENDOR
] = GetDmiString(Header
, DMI_BIOS_VENDOR
);
128 Strings
[BIOS_VERSION
] = GetDmiString(Header
, DMI_BIOS_VERSION
);
129 Strings
[BIOS_DATE
] = GetDmiString(Header
, DMI_BIOS_DATE
);
132 case DMI_ENTRY_SYSTEM
:
133 if (Remaining
< DMI_SYS_SIZE
)
135 Strings
[SYS_VENDOR
] = GetDmiString(Header
, DMI_SYS_VENDOR
);
136 Strings
[SYS_PRODUCT
] = GetDmiString(Header
, DMI_SYS_PRODUCT
);
137 Strings
[SYS_VERSION
] = GetDmiString(Header
, DMI_SYS_VERSION
);
138 Strings
[SYS_SERIAL
] = GetDmiString(Header
, DMI_SYS_SERIAL
);
141 case DMI_ENTRY_BASEBOARD
:
142 if (Remaining
< DMI_BOARD_SIZE
)
144 Strings
[BOARD_VENDOR
] = GetDmiString(Header
, DMI_BOARD_VENDOR
);
145 Strings
[BOARD_NAME
] = GetDmiString(Header
, DMI_BOARD_NAME
);
146 Strings
[BOARD_VERSION
] = GetDmiString(Header
, DMI_BOARD_VERSION
);
147 Strings
[BOARD_SERIAL
] = GetDmiString(Header
, DMI_BOARD_SERIAL
);
148 Strings
[BOARD_ASSET_TAG
] = GetDmiString(Header
, DMI_BOARD_ASSET_TAG
);
151 case DMI_ENTRY_CHASSIS
:
152 case DMI_ENTRY_ONBOARD_DEVICE
:
153 case DMI_ENTRY_OEMSTRINGS
:
154 // DMI_ENTRY_IPMI_DEV?
155 // DMI_ENTRY_ONBOARD_DEV_EXT?
159 Remaining
-= Header
->Length
;
160 Data
= (PCHAR
)Header
+ Header
->Length
;
162 /* Now loop until we find 2 zeroes */
163 while ((Remaining
>= 2) && ((Data
[0] != 0) || (Data
[1] != 0)))
172 /* Go to the next header */
174 Header
= (PDMI_HEADER
)((PUCHAR
)Data
+ 2);
178 DbgPrint("i8042prt: Dumping DMI data:\n");
179 DbgPrint("BIOS_VENDOR: %s\n", Strings
[BIOS_VENDOR
]);
180 DbgPrint("BIOS_VERSION: %s\n", Strings
[BIOS_VERSION
]);
181 DbgPrint("BIOS_DATE: %s\n", Strings
[BIOS_DATE
]);
182 DbgPrint("SYS_VENDOR: %s\n", Strings
[SYS_VENDOR
]);
183 DbgPrint("SYS_PRODUCT: %s\n", Strings
[SYS_PRODUCT
]);
184 DbgPrint("SYS_VERSION: %s\n", Strings
[SYS_VERSION
]);
185 DbgPrint("SYS_SERIAL: %s\n", Strings
[SYS_SERIAL
]);
186 DbgPrint("BOARD_VENDOR: %s\n", Strings
[BOARD_VENDOR
]);
187 DbgPrint("BOARD_NAME: %s\n", Strings
[BOARD_NAME
]);
188 DbgPrint("BOARD_VERSION: %s\n", Strings
[BOARD_VERSION
]);
189 DbgPrint("BOARD_SERIAL: %s\n", Strings
[BOARD_SERIAL
]);
190 DbgPrint("BOARD_ASSET_TAG: %s\n", Strings
[BOARD_ASSET_TAG
]);
193 /* Now loop the hardware table to find a match */
194 for (i
= 0; i
< ARRAYSIZE(i8042HardwareTable
); i
++)
196 for (j
= 0; j
< MAX_MATCH_ENTRIES
; j
++)
198 ULONG Type
= i8042HardwareTable
[i
].MatchEntries
[j
].Type
;
202 /* Check for a match */
203 if ((Strings
[Type
] == NULL
) ||
204 strcmp(i8042HardwareTable
[i
].MatchEntries
[j
].String
,
205 Strings
[i8042HardwareTable
[i
].MatchEntries
[j
].Type
]))
207 /* Does not match, try next entry */
213 if (j
== MAX_MATCH_ENTRIES
)
215 /* All items matched! */
216 i8042HwFlags
= i8042HardwareTable
[i
].Flags
;
217 DPRINT("Found match for hw table index %u\n", i
);
225 i8042InitializeHwHacks(
229 PVOID DataBlockObject
;
230 PWNODE_ALL_DATA AllData
;
233 /* Open the data block object for the SMBIOS table */
234 Status
= IoWMIOpenBlock(&MSSmBios_RawSMBiosTables_GUID
,
237 if (!NT_SUCCESS(Status
))
239 DPRINT1("IoWMIOpenBlock failed: 0x%08lx\n", Status
);
243 /* Query the required buffer size */
245 Status
= IoWMIQueryAllData(DataBlockObject
, &BufferSize
, NULL
);
246 if (!NT_SUCCESS(Status
))
248 DPRINT1("IoWMIOpenBlock failed: 0x%08lx\n", Status
);
252 AllData
= ExAllocatePoolWithTag(PagedPool
, BufferSize
, 'BTMS');
255 DPRINT1("Failed to allocate %lu bytes for SMBIOS tables\n", BufferSize
);
259 /* Query the buffer data */
260 Status
= IoWMIQueryAllData(DataBlockObject
, &BufferSize
, AllData
);
261 if (!NT_SUCCESS(Status
))
263 DPRINT1("IoWMIOpenBlock failed: 0x%08lx\n", Status
);
264 ExFreePoolWithTag(AllData
, 'BTMS');
268 /* Parse the table */
269 i8042ParseSMBiosTables(AllData
+ 1,
270 AllData
->WnodeHeader
.BufferSize
);
272 /* Free the buffer */
273 ExFreePoolWithTag(AllData
, 'BTMS');