@@ -189,7 +189,7 @@ static void UpdateAcpiGnvs(EFI_ACPI_DESCRIPTION_HEADER *newDsdt,
189
189
190
190
static EFI_ACPI_DESCRIPTION_HEADER *
191
191
FindAcpiTableBySignature (EFI_ACPI_DESCRIPTION_HEADER * Xsdt , UINT32 Signature ,
192
- UINT32 * EntryIndex )
192
+ UINT32 * EntryIndex , UINT64 OemTableId , UINT32 OemRevision )
193
193
{
194
194
EFI_ACPI_DESCRIPTION_HEADER * CurrHdr ;
195
195
UINT64 * XsdtEntry ;
@@ -204,7 +204,9 @@ FindAcpiTableBySignature(EFI_ACPI_DESCRIPTION_HEADER *Xsdt, UINT32 Signature,
204
204
for (Index = 0 ; Index < EntryNum ; Index ++ ) {
205
205
CurrHdr = (EFI_ACPI_DESCRIPTION_HEADER * )XsdtEntry [Index ];
206
206
207
- if ((CurrHdr != NULL ) && (CurrHdr -> Signature == Signature )) {
207
+ if ((CurrHdr != NULL ) && (CurrHdr -> Signature == Signature ) &&
208
+ ((OemTableId == 0 ) || ((OemTableId == CurrHdr -> OemTableId ) &&
209
+ (CurrHdr -> OemRevision <= OemRevision )))) {
208
210
if (EntryIndex != NULL )
209
211
* EntryIndex = Index ;
210
212
@@ -216,7 +218,7 @@ FindAcpiTableBySignature(EFI_ACPI_DESCRIPTION_HEADER *Xsdt, UINT32 Signature,
216
218
}
217
219
218
220
static EFIAPI EFI_STATUS InstallAcpiTable (__attribute__((__unused__ ))
219
- EFI_ACPI_TABLE_PROTOCOL * This ,
221
+ EFI_ACPI_TABLE_PROTOCOL * This ,
220
222
VOID * AcpiTableBuffer ,
221
223
UINTN AcpiTableBufferSize ,
222
224
__attribute__((__unused__ ))
@@ -232,6 +234,8 @@ static EFIAPI EFI_STATUS InstallAcpiTable(__attribute__((__unused__))
232
234
UINT32 Size ;
233
235
UINT32 EntryNum ;
234
236
EFI_STATUS Status ;
237
+ UINT64 OemTableId ;
238
+ UINT32 OemRevision ;
235
239
236
240
if (Rsdp == NULL )
237
241
return EFI_NOT_READY ;
@@ -279,14 +283,22 @@ static EFIAPI EFI_STATUS InstallAcpiTable(__attribute__((__unused__))
279
283
// Update the ACPI header to pointer to the new copy
280
284
// And then update the table if required
281
285
AcpiHdr = (EFI_ACPI_DESCRIPTION_HEADER * )NewTable ;
282
-
286
+ if (AcpiHdr -> Signature ==
287
+ EFI_ACPI_5_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE ) {
288
+ //need to check OEM table ID and revision for SSDT
289
+ OemTableId = AcpiHdr -> OemTableId ;
290
+ OemRevision = AcpiHdr -> OemRevision ;
291
+ } else {
292
+ OemTableId = 0 ;
293
+ OemRevision = 0 ;
294
+ }
283
295
if (AcpiHdr -> Signature ==
284
296
EFI_ACPI_5_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE ) {
285
297
Facp = (EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE * )
286
298
FindAcpiTableBySignature (
287
299
Xsdt ,
288
300
EFI_ACPI_5_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE ,
289
- & EntryIndex );
301
+ & EntryIndex , OemTableId , OemRevision );
290
302
291
303
if (Facp != NULL ) { // DSDT override
292
304
EFI_ACPI_DESCRIPTION_HEADER * oldDsdt ;
@@ -312,10 +324,8 @@ static EFIAPI EFI_STATUS InstallAcpiTable(__attribute__((__unused__))
312
324
}
313
325
} else {
314
326
// Try to find the table to replace
315
- if ((FindAcpiTableBySignature (Xsdt , AcpiHdr -> Signature ,
316
- & EntryIndex ) != NULL ) &&
317
- (AcpiHdr -> Signature !=
318
- EFI_ACPI_5_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE )) {
327
+ if (FindAcpiTableBySignature (Xsdt , AcpiHdr -> Signature ,
328
+ & EntryIndex , OemTableId , OemRevision ) != NULL ) {
319
329
XsdtEntry [EntryIndex ] = (UINT32 )(UINTN )AcpiHdr ;
320
330
} else { // new table, to add
321
331
if (EntryNum >= MAX_XSDT_HEADER_ENTRIES ) {
@@ -341,7 +351,7 @@ static EFIAPI EFI_STATUS InstallAcpiTable(__attribute__((__unused__))
341
351
}
342
352
343
353
static EFIAPI EFI_STATUS UninstallAcpiTable (__attribute__((__unused__ ))
344
- EFI_ACPI_TABLE_PROTOCOL * This ,
354
+ EFI_ACPI_TABLE_PROTOCOL * This ,
345
355
__attribute__((__unused__ ))
346
356
UINTN TableKey )
347
357
{
0 commit comments