summaryrefslogtreecommitdiff
path: root/EdkModulePkg/Library
diff options
context:
space:
mode:
Diffstat (limited to 'EdkModulePkg/Library')
-rw-r--r--EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.c388
-rw-r--r--EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.msa44
-rw-r--r--EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h209
3 files changed, 641 insertions, 0 deletions
diff --git a/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.c b/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.c
new file mode 100644
index 0000000000..f6638c1607
--- /dev/null
+++ b/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.c
@@ -0,0 +1,388 @@
+/** @file
+ The implementation of PCI incompatible device support libary.
+
+Copyright (c) 2007 Intel Corporation. All rights reserved. <BR>
+This software and associated documentation (if any) is furnished
+under a license and may only be used or copied in accordance
+with the terms of the license. Except as permitted by such
+license, no part of this software or documentation may be
+reproduced, stored in a retrieval system, or transmitted in any
+form or by any means without the express written consent of
+Intel Corporation.
+
+**/
+
+#include "IncompatiblePciDeviceList.h"
+
+/**
+ Check whether two PCI devices matched
+
+ @param PciDeviceInfo A pointer to EFI_PCI_DEVICE_INFO.
+ @param Header A pointer to EFI_PCI_DEVICE_INFO.
+
+ @retval returns EFI_SUCCESS if two PCI device matched.
+**/
+STATIC
+EFI_STATUS
+DeviceCheck (
+ IN EFI_PCI_DEVICE_INFO *PciDeviceInfo,
+ IN EFI_PCI_DEVICE_INFO *Header
+ )
+{
+ //
+ // See if the Header matches the parameters passed in
+ //
+ if (Header->VendorID != DEVICE_ID_NOCARE) {
+ if (PciDeviceInfo->VendorID != Header->VendorID) {
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ if (Header->DeviceID != DEVICE_ID_NOCARE) {
+ if (PciDeviceInfo->DeviceID != Header->DeviceID) {
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ if (Header->RevisionID != DEVICE_ID_NOCARE) {
+ if (PciDeviceInfo->RevisionID != Header->RevisionID) {
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ if (Header->SubsystemVendorID != DEVICE_ID_NOCARE) {
+ if (PciDeviceInfo->SubsystemVendorID != Header->SubsystemVendorID) {
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ if (Header->SubsystemID != DEVICE_ID_NOCARE) {
+ if (PciDeviceInfo->SubsystemID != Header->SubsystemID) {
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Check the incompatible device list for ACPI resource update and return
+ the configuration
+
+ This function searches the incompatible device list according to request
+ information. If the PCI device belongs to the devices list, corresponding
+ configuration informtion will be returned, in the meantime return EFI_SUCCESS.
+
+ @param PciDeviceInfo A pointer to PCI device information.
+ @param Configuration Returned information.
+
+ @retval returns EFI_SUCCESS if check incompatible device ok.
+ Otherwise return EFI_UNSUPPORTED.
+**/
+RETURN_STATUS
+EFIAPI
+PciResourceUpdateCheck (
+ IN EFI_PCI_DEVICE_INFO *PciDeviceInfo,
+ OUT VOID *Configuration
+ )
+{
+ UINT64 Tag;
+ UINT64 *ListPtr;
+ UINT64 *TempListPtr;
+ EFI_PCI_DEVICE_INFO *Header;
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AcpiPtr;
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *OldAcpiPtr;
+ EFI_PCI_RESOUCE_DESCRIPTOR *Dsc;
+ EFI_ACPI_END_TAG_DESCRIPTOR *PtrEnd;
+ UINTN Index;
+
+ ASSERT (PciDeviceInfo != NULL);
+
+ //
+ // Initialize the return value to NULL
+ //
+ * (VOID **) Configuration = NULL;
+
+ ListPtr = IncompatiblePciDeviceListForResource;
+ while (*ListPtr != LIST_END_TAG) {
+
+ Tag = *ListPtr;
+
+ switch (Tag) {
+ case DEVICE_INF_TAG:
+ Header = (EFI_PCI_DEVICE_INFO *) (ListPtr + 1);
+ ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_INFO) / sizeof (UINT64);
+
+ if (DeviceCheck (PciDeviceInfo, Header) != EFI_SUCCESS) {
+ continue;
+ }
+
+ //
+ // Matched an item, so construct the ACPI descriptor for the resource.
+ //
+ //
+ // Count the resource items so that to allocate space
+ //
+ for (Index = 0, TempListPtr = ListPtr; *TempListPtr == DEVICE_RES_TAG; Index++) {
+ TempListPtr = TempListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
+ }
+ //
+ // If there is at least one type of resource request,
+ // allocate a acpi resource node
+ //
+ if (Index == 0) {
+ return EFI_ABORTED;
+ }
+
+ AcpiPtr = AllocateZeroPool (
+ sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * Index + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR)
+ );
+
+ OldAcpiPtr = AcpiPtr;
+
+ //
+ // Fill the EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR structure
+ // according to the EFI_PCI_RESOUCE_DESCRIPTOR structure
+ //
+ for (; *ListPtr == DEVICE_RES_TAG;) {
+
+ Dsc = (EFI_PCI_RESOUCE_DESCRIPTOR *) (ListPtr + 1);
+
+ AcpiPtr->Desc = ACPI_ADDRESS_SPACE_DESCRIPTOR;
+ AcpiPtr->Len = sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR);
+ AcpiPtr->ResType = (UINT8) Dsc->ResType;
+ AcpiPtr->GenFlag = (UINT8) Dsc->GenFlag;
+ AcpiPtr->SpecificFlag = (UINT8) Dsc->SpecificFlag;
+ AcpiPtr->AddrSpaceGranularity = Dsc->AddrSpaceGranularity;;
+ AcpiPtr->AddrRangeMin = Dsc->AddrRangeMin;
+ AcpiPtr->AddrRangeMax = Dsc->AddrRangeMax;
+ AcpiPtr->AddrTranslationOffset = Dsc->AddrTranslationOffset;
+ AcpiPtr->AddrLen = Dsc->AddrLen;
+
+ ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
+ AcpiPtr++;
+ }
+ //
+ // put the checksum
+ //
+ PtrEnd = (EFI_ACPI_END_TAG_DESCRIPTOR *) (AcpiPtr);
+ PtrEnd->Desc = ACPI_END_TAG_DESCRIPTOR;
+ PtrEnd->Checksum = 0;
+
+ *(VOID **) Configuration = OldAcpiPtr;
+
+ return EFI_SUCCESS;
+
+ case DEVICE_RES_TAG:
+ //
+ // Adjust the pointer to the next PCI resource descriptor item
+ //
+ ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
+ break;
+
+ default:
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ return EFI_UNSUPPORTED;
+
+}
+
+/**
+ Check the incompatible device list and return configuraton register mask values.
+
+ This function searches the incompatible device list according to request
+ information. If the PCI device belongs to the devices list, corresponding
+ configuration informtion will be returned, in the meantime return EFI_SUCCESS.
+
+ @param PciDeviceInfo A pointer to EFI_PCI_DEVICE_INFO.
+ @param AccessType Access Type, READ or WRITE.
+ @param Offset The address within the PCI configuration space.
+ @param Configuration Returned information.
+
+ @retval returns EFI_SUCCESS if check incompatible device ok.
+ Otherwise return EFI_UNSUPPORTED.
+**/
+RETURN_STATUS
+EFIAPI
+PciRegisterUpdateCheck (
+ IN EFI_PCI_DEVICE_INFO *PciDeviceInfo,
+ IN UINT64 AccessType,
+ IN UINT64 Offset,
+ OUT VOID *Configuration
+ )
+{
+ EFI_PCI_DEVICE_INFO *Header;
+ UINT64 Tag;
+ UINT64 *ListPtr;
+ EFI_PCI_REGISTER_VALUE_DATA *RegisterPtr;
+ EFI_PCI_REGISTER_VALUE_DATA *Dsc;
+
+ ASSERT (PciDeviceInfo != NULL);
+
+ ListPtr = IncompatiblePciDeviceListForRegister;
+
+ //
+ // Initialize the return value to NULL
+ //
+ * (VOID **) Configuration = NULL;
+
+ while (*ListPtr != LIST_END_TAG) {
+
+ Tag = *ListPtr;
+
+ switch (Tag) {
+ case DEVICE_INF_TAG:
+ Header = (EFI_PCI_DEVICE_INFO *) (ListPtr + 1);
+ ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_INFO) / sizeof (UINT64);
+
+ //
+ // Check whether the PCI device matches the device in the incompatible devices list?
+ // If not, ship next
+ //
+ if (DeviceCheck (PciDeviceInfo, Header) != EFI_SUCCESS) {
+ continue;
+ }
+
+ //
+ // Matched an item, check whether access matches?
+ //
+ for (; *ListPtr == DEVICE_RES_TAG;) {
+ ListPtr ++;
+ if (((EFI_PCI_REGISTER_VALUE_DESCRIPTOR *)ListPtr)->Offset == (Offset & 0xfc)) {
+ if (((EFI_PCI_REGISTER_VALUE_DESCRIPTOR *)ListPtr)->AccessType == AccessType) {
+
+ Dsc = (EFI_PCI_REGISTER_VALUE_DATA *) (ListPtr + 2);
+ RegisterPtr = AllocateZeroPool (sizeof (EFI_PCI_REGISTER_VALUE_DATA));
+
+ RegisterPtr->AndValue = Dsc->AndValue;
+ RegisterPtr->OrValue = Dsc->OrValue;
+
+ *(VOID **) Configuration = RegisterPtr;
+
+ return EFI_SUCCESS;
+ }
+ }
+ ListPtr += sizeof (EFI_PCI_REGISTER_VALUE_DESCRIPTOR) / (sizeof (UINT64));
+ }
+ return EFI_UNSUPPORTED;
+
+ case DEVICE_RES_TAG:
+ //
+ // Adjust the pointer to the next item
+ //
+ ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_REGISTER_VALUE_DESCRIPTOR)) / sizeof (UINT64));
+ break;
+
+ default:
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ return EFI_UNSUPPORTED;
+}
+
+/**
+ Check the incompatible device list for access width incompatibility and
+ return the configuration
+
+ This function searches the incompatible device list for access width
+ incompatibility according to request information. If the PCI device
+ belongs to the devices list, corresponding configuration informtion
+ will be returned, in the meantime return EFI_SUCCESS.
+
+ @param PciDeviceInfo A pointer to PCI device information.
+ @param AccessType Access type, READ or WRITE.
+ @param Offset The address within the PCI configuration space.
+ @param AccessWidth Access width needs to check incompatibility.
+ @param Configuration Returned information.
+
+ @retval returns EFI_SUCCESS if check incompatible device ok.
+ Otherwise return EFI_UNSUPPORTED.
+**/
+RETURN_STATUS
+EFIAPI
+PciRegisterAccessCheck (
+ IN EFI_PCI_DEVICE_INFO *PciDeviceInfo,
+ IN UINT64 AccessType,
+ IN UINT64 Offset,
+ IN UINT64 AccessWidth,
+ OUT VOID *Configuration
+ )
+{
+ EFI_PCI_DEVICE_INFO *Header;
+ UINT64 Tag;
+ UINT64 *ListPtr;
+ EFI_PCI_REGISTER_ACCESS_DATA *RegisterPtr;
+ EFI_PCI_REGISTER_ACCESS_DATA *Dsc;
+
+ ASSERT (PciDeviceInfo != NULL);
+
+ ListPtr = DeviceListForAccessWidth;
+
+ //
+ // Initialize the return value to NULL
+ //
+ * (VOID **) Configuration = NULL;
+
+ while (*ListPtr != LIST_END_TAG) {
+
+ Tag = *ListPtr;
+
+ switch (Tag) {
+ case DEVICE_INF_TAG:
+ Header = (EFI_PCI_DEVICE_INFO *) (ListPtr + 1);
+ ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_INFO) / sizeof (UINT64);
+
+ //
+ // Check whether the PCI device matches the device in the incompatible devices list?
+ // If not, ship next
+ //
+ if (DeviceCheck (PciDeviceInfo, Header) != EFI_SUCCESS) {
+ continue;
+ }
+
+ //
+ // Matched an item, check whether access matches?
+ //
+ for (; *ListPtr == DEVICE_RES_TAG;) {
+ ListPtr ++;
+ if (((EFI_PCI_REGISTER_ACCESS_DESCRIPTOR *) ListPtr)->AccessType == AccessType &&
+ ((EFI_PCI_REGISTER_ACCESS_DESCRIPTOR *) ListPtr)->AccessWidth == AccessWidth ) {
+
+ Dsc = (EFI_PCI_REGISTER_ACCESS_DATA *) (ListPtr + 2);
+
+ if((Dsc->StartOffset <= Offset) && (Dsc->EndOffset > Offset)) {
+
+ RegisterPtr = AllocateZeroPool (sizeof (EFI_PCI_REGISTER_ACCESS_DATA));
+
+ RegisterPtr->StartOffset = Dsc->StartOffset;
+ RegisterPtr->EndOffset = Dsc->EndOffset;
+ RegisterPtr->Width = Dsc->Width;
+
+ *(VOID **) Configuration = RegisterPtr;
+
+ return EFI_SUCCESS;
+ }
+ }
+ ListPtr += sizeof (EFI_PCI_REGISTER_ACCESS_DESCRIPTOR) / (sizeof (UINT64));
+ }
+ return EFI_UNSUPPORTED;
+
+ case DEVICE_RES_TAG:
+ //
+ // Adjust the pointer to the next item
+ //
+ ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_REGISTER_ACCESS_DESCRIPTOR)) / sizeof (UINT64));
+ break;
+
+ default:
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ return EFI_UNSUPPORTED;
+}
+
diff --git a/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.msa b/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.msa
new file mode 100644
index 0000000000..e7b8529ebd
--- /dev/null
+++ b/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/EdkPciIncompatibleDeviceSupportLib.msa
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <MsaHeader>
+ <ModuleName>EdkPciIncompatibleDeviceSuppportLib</ModuleName>
+ <ModuleType>DXE_DRIVER</ModuleType>
+ <GuidValue>1ca1c1f9-5baf-4204-b6e5-5e24109a4e4e</GuidValue>
+ <Version>1.0</Version>
+ <Abstract>PCI Incompatible device support Library</Abstract>
+ <Description>Check PCI incompatible devices and set necessary configuration</Description>
+ <Copyright>Copyright (c) 2007, Intel Corporation.</Copyright>
+ <License>All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
+ <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
+ </MsaHeader>
+ <ModuleDefinitions>
+ <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>
+ <BinaryModule>false</BinaryModule>
+ <OutputFileBasename>EdkPciIncompatibleDeviceSupportLib</OutputFileBasename>
+ </ModuleDefinitions>
+ <LibraryClassDefinitions>
+ <LibraryClass Usage="ALWAYS_PRODUCED">
+ <Keyword>PciIncompatibleDeviceSupportLib</Keyword>
+ </LibraryClass>
+ <LibraryClass Usage="ALWAYS_CONSUMED">
+ <Keyword>MemoryAllocationLib</Keyword>
+ </LibraryClass>
+ </LibraryClassDefinitions>
+ <SourceFiles>
+ <Filename>EdkPciIncompatibleDeviceSupportLib.c</Filename>
+ <Filename>IncompatiblePciDeviceList.h</Filename>
+ </SourceFiles>
+ <PackageDependencies>
+ <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+ <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>
+ </PackageDependencies>
+ <Externs>
+ <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
+ <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
+ </Externs>
+</ModuleSurfaceArea> \ No newline at end of file
diff --git a/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h b/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h
new file mode 100644
index 0000000000..a00c614c75
--- /dev/null
+++ b/EdkModulePkg/Library/EdkPciIncompatibleDeviceSupportLib/IncompatiblePciDeviceList.h
@@ -0,0 +1,209 @@
+/** @file
+ The incompatible PCI device list
+
+Copyright (c) 2007 Intel Corporation. All rights reserved. <BR>
+This software and associated documentation (if any) is furnished
+under a license and may only be used or copied in accordance
+with the terms of the license. Except as permitted by such
+license, no part of this software or documentation may be
+reproduced, stored in a retrieval system, or transmitted in any
+form or by any means without the express written consent of
+Intel Corporation.
+
+**/
+
+#ifndef _EFI_INCOMPATIBLE_PCI_DEVICE_LIST_H
+#define _EFI_INCOMPATIBLE_PCI_DEVICE_LIST_H
+
+#include <IndustryStandard/pci22.h>
+#include <IndustryStandard/Acpi.h>
+
+
+#define PCI_DEVICE_ID(VendorId, DeviceId, Revision, SubVendorId, SubDeviceId) \
+ VendorId, DeviceId, Revision, SubVendorId, SubDeviceId
+
+#define PCI_BAR_TYPE_IO ACPI_ADDRESS_SPACE_TYPE_IO
+#define PCI_BAR_TYPE_MEM ACPI_ADDRESS_SPACE_TYPE_MEM
+
+#define DEVICE_INF_TAG 0xFFF2
+#define DEVICE_RES_TAG 0xFFF1
+#define LIST_END_TAG 0x0000
+
+//
+// descriptor for access width of incompatible PCI device
+//
+typedef struct {
+ UINT64 AccessType;
+ UINT64 AccessWidth;
+ EFI_PCI_REGISTER_ACCESS_DATA PciRegisterAccessData;
+} EFI_PCI_REGISTER_ACCESS_DESCRIPTOR;
+
+//
+// descriptor for register value of incompatible PCI device
+//
+typedef struct {
+ UINT64 AccessType;
+ UINT64 Offset;
+ EFI_PCI_REGISTER_VALUE_DATA PciRegisterValueData;
+} EFI_PCI_REGISTER_VALUE_DESCRIPTOR;
+
+
+//
+// the incompatible PCI devices list for ACPI resource
+//
+GLOBAL_REMOVE_IF_UNREFERENCED UINT64 IncompatiblePciDeviceListForResource[] = {
+ //
+ // DEVICE_INF_TAG,
+ // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId),
+ // DEVICE_RES_TAG,
+ // ResType, GFlag , SFlag, Granularity, RangeMin,
+ // RangeMax, Offset, AddrLen
+ //
+ //
+ // Device Adaptec 9004
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x9004, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_BAR_TYPE_IO,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_BAR_EVEN_ALIGN,
+ PCI_BAR_ALL,
+ PCI_BAR_NOCHANGE,
+ //
+ // Device Adaptec 9005
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x9005, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_BAR_TYPE_IO,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_BAR_EVEN_ALIGN,
+ PCI_BAR_ALL,
+ PCI_BAR_NOCHANGE,
+ //
+ // Device QLogic 1007
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x1077, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_BAR_TYPE_IO,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_BAR_EVEN_ALIGN,
+ PCI_BAR_ALL,
+ PCI_BAR_NOCHANGE,
+ //
+ // Device Agilent 103C
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x103C, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_BAR_TYPE_IO,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_BAR_EVEN_ALIGN,
+ PCI_BAR_ALL,
+ PCI_BAR_NOCHANGE,
+ //
+ // Device Agilent 15BC
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x15BC, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_BAR_TYPE_IO,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_ACPI_UNUSED,
+ PCI_BAR_EVEN_ALIGN,
+ PCI_BAR_ALL,
+ PCI_BAR_NOCHANGE,
+ //
+ // The end of the list
+ //
+ LIST_END_TAG
+};
+
+//
+// the incompatible PCI devices list for the values of configuration registers
+//
+GLOBAL_REMOVE_IF_UNREFERENCED UINT64 IncompatiblePciDeviceListForRegister[] = {
+ //
+ // DEVICE_INF_TAG,
+ // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId),
+ // PCI_RES_TAG,
+ // PCI_ACCESS_TYPE, PCI_CONFIG_ADDRESS,
+ // AND_VALUE, OR_VALUE
+
+ //
+ // Device Lava 0x1407, DeviceId 0x0110
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x1407, 0x0110, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_REGISTER_READ,
+ PCI_CAPBILITY_POINTER_OFFSET,
+ 0xffffff00,
+ VALUE_NOCARE,
+
+ //
+ // Device Lava 0x1407, DeviceId 0x0111
+ //
+ DEVICE_INF_TAG,
+ PCI_DEVICE_ID(0x1407, 0x0111, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ DEVICE_RES_TAG,
+ PCI_REGISTER_READ,
+ PCI_CAPBILITY_POINTER_OFFSET,
+ 0xffffff00,
+ VALUE_NOCARE,
+
+ //
+ // The end of the list
+ //
+ LIST_END_TAG
+};
+
+//
+// the incompatible PCI devices list for the access width of configuration registers
+//
+GLOBAL_REMOVE_IF_UNREFERENCED UINT64 DeviceListForAccessWidth[] = {
+ //
+ // DEVICE_INF_TAG,
+ // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId),
+ // DEVICE_RES_TAG,
+ // PCI_ACCESS_TYPE, PCI_ACCESS_WIDTH,
+ // START_ADDRESS, END_ADDRESS,
+ // ACTUAL_PCI_ACCESS_WIDTH,
+ //
+
+ //
+ // Sample Device
+ //
+ //DEVICE_INF_TAG,
+ //PCI_DEVICE_ID(0xXXXX, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE, DEVICE_ID_NOCARE),
+ //DEVICE_RES_TAG,
+ //PCI_REGISTER_READ,
+ //EfiPciWidthUint8,
+ //0,
+ //0xFF,
+ //EfiPciWidthUint32,
+ //
+
+ //
+ // The end of the list
+ //
+ LIST_END_TAG
+};
+
+#endif