4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DXE PCI Segment Library instance layered on top of ESAL services.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <PiDxe.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/ExtendedSalServiceClasses.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PciSegmentLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/ExtendedSalLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Assert the validity of a PCI Segment address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync A valid PCI Segment address should not contain 1's in bits 31:28
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param A The address to validate.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param M Additional bits to assert to be zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ASSERT_INVALID_PCI_SEGMENT_ADDRESS(A,M) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((A) & (0xf0000000 | (M))) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a PCI Library Address to a ESAL PCI Service Address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Based on SAL Spec 3.2, there are two SAL PCI Address:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If address type = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 0..7 - Register address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 8..10 - Function number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 11..15 - Device number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 16..23 - Bus number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 24..31 - PCI segment group
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 32..63 - Reserved (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If address type = 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 0..7 - Register address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 8..11 - Extended Register address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 12..14 - Function number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 15..19 - Device number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 20..27 - Bus number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 28..43 - PCI segment group
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bits 44..63 - Reserved (0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param A The PCI Library Address to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CONVERT_PCI_SEGMENT_LIB_ADDRESS_TO_PCI_ESAL_ADDRESS0(Address) (((Address >> 8) & 0xff000000) | (((Address) >> 4) & 0x00ffff00) | ((Address) & 0xff))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define CONVERT_PCI_SEGMENT_LIB_ADDRESS_TO_PCI_ESAL_ADDRESS1(Address) (((Address >> 4) & 0xffff0000000) | ((Address) & 0xfffffff))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check a PCI Library Address is a PCI Compatible Address or not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define IS_PCI_COMPATIBLE_ADDRESS(Address) (((Address) & 0xf00) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal worker function to read a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function wraps EsalPciConfigRead function of Extended SAL PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Services Class.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It reads and returns the PCI configuration register specified by Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the width of data is specified by Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of data to read
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDxePciSegmentLibEsalReadWorker (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SAL_RETURN_REGS Return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IS_PCI_COMPATIBLE_ADDRESS(Address)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return = EsalCall (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_LO,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_HI,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SalPciConfigReadFunctionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONVERT_PCI_SEGMENT_LIB_ADDRESS_TO_PCI_ESAL_ADDRESS0 (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SAL_PCI_COMPATIBLE_ADDRESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return = EsalCall (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_LO,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_HI,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SalPciConfigReadFunctionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONVERT_PCI_SEGMENT_LIB_ADDRESS_TO_PCI_ESAL_ADDRESS1 (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SAL_PCI_EXTENDED_REGISTER_ADDRESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT32) Return.r9;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal worker function to writes a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function wraps EsalPciConfigWrite function of Extended SAL PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Services Class.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It writes the PCI configuration register specified by Address with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value specified by Data. The width of data is specifed by Width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Width Width of data to write
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDxePciSegmentLibEsalWriteWorker (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IS_PCI_COMPATIBLE_ADDRESS(Address)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EsalCall (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_LO,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_HI,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SalPciConfigWriteFunctionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONVERT_PCI_SEGMENT_LIB_ADDRESS_TO_PCI_ESAL_ADDRESS0 (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SAL_PCI_COMPATIBLE_ADDRESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EsalCall (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_LO,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EXTENDED_SAL_PCI_SERVICES_PROTOCOL_GUID_HI,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SalPciConfigWriteFunctionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONVERT_PCI_SEGMENT_LIB_ADDRESS_TO_PCI_ESAL_ADDRESS1 (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SAL_PCI_EXTENDED_REGISTER_ADDRESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads an 8-bit PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads and returns the 8-bit PCI configuration register specified by Address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentRead8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT8) DxePciSegmentLibEsalReadWorker (Address, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes an 8-bit PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes the 8-bit PCI configuration register specified by Address with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value specified by Value. Value is returned. This function must guarantee
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that all PCI read and write operations are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT8) DxePciSegmentLibEsalWriteWorker (Address, 1, Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise OR of an 8-bit PCI configuration register with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an 8-bit value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 8-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR between the read result and the value specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData, and writes the result to the 8-bit PCI configuration register
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Address. The value written to the PCI configuration register is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. This function must guarantee that all PCI read and write operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (Address, (UINT8) (PciSegmentRead8 (Address) | OrData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 8-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result to the 8-bit PCI configuration register specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address. The value written to the PCI configuration register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentAnd8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (Address, (UINT8) (PciSegmentRead8 (Address) & AndData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value, followed a bitwise OR with another 8-bit value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 8-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync performs a bitwise OR between the result of the AND operation and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the value specified by OrData, and writes the result to the 8-bit PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register specified by Address. The value written to the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register is returned. This function must guarantee that all PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync read and write operations are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the result of the AND operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentAndThenOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (Address, (UINT8) ((PciSegmentRead8 (Address) & AndData) | OrData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field of a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the bit field in an 8-bit PCI configuration register. The bit field is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by the StartBit and the EndBit. The value of the bit field is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value of the bit field read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldRead8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BitFieldRead8 (PciSegmentRead8 (Address), StartBit, EndBit);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes a bit field to a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes Value to the bit field of the PCI configuration register. The bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync field is specified by the StartBit and the EndBit. All other bits in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destination PCI configuration register are preserved. The new value of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 8-bit register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value New value of the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldWrite8 (PciSegmentRead8 (Address), StartBit, EndBit, Value)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in an 8-bit PCI configuration, performs a bitwise OR, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result back to the bit field in the 8-bit port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 8-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR between the read result and the value specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData, and writes the result to the 8-bit PCI configuration register
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Address. The value written to the PCI configuration register is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. This function must guarantee that all PCI read and write operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are serialized. Extra left bits in OrData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldOr8 (PciSegmentRead8 (Address), StartBit, EndBit, OrData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in an 8-bit PCI configuration register, performs a bitwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AND, and writes the result back to the bit field in the 8-bit register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 8-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result to the 8-bit PCI configuration register specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address. The value written to the PCI configuration register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized. Extra left bits in AndData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldAnd8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldAnd8 (PciSegmentRead8 (Address), StartBit, EndBit, AndData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR, and writes the result back to the bit field in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 8-bit port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 8-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND followed by a bitwise OR between the read result and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the value specified by AndData, and writes the result to the 8-bit PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register specified by Address. The value written to the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register is returned. This function must guarantee that all PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync read and write operations are serialized. Extra left bits in both AndData and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 7, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..7.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the result of the AND operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldAndThenOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldAndThenOr8 (PciSegmentRead8 (Address), StartBit, EndBit, AndData, OrData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a 16-bit PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads and returns the 16-bit PCI configuration register specified by Address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentRead16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT16) DxePciSegmentLibEsalReadWorker (Address, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes a 16-bit PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes the 16-bit PCI configuration register specified by Address with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value specified by Value. Value is returned. This function must guarantee
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that all PCI read and write operations are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT16) DxePciSegmentLibEsalWriteWorker (Address, 2, Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise OR of a 16-bit PCI configuration register with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a 16-bit value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 16-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR between the read result and the value specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData, and writes the result to the 16-bit PCI configuration register
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Address. The value written to the PCI configuration register is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. This function must guarantee that all PCI read and write operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (Address, (UINT16) (PciSegmentRead16 (Address) | OrData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 16-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result to the 16-bit PCI configuration register specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address. The value written to the PCI configuration register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentAnd16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (Address, (UINT16) (PciSegmentRead16 (Address) & AndData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value, followed a bitwise OR with another 16-bit value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 16-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync performs a bitwise OR between the result of the AND operation and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the value specified by OrData, and writes the result to the 16-bit PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register specified by Address. The value written to the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register is returned. This function must guarantee that all PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync read and write operations are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the result of the AND operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentAndThenOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (Address, (UINT16) ((PciSegmentRead16 (Address) & AndData) | OrData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field of a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the bit field in a 16-bit PCI configuration register. The bit field is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by the StartBit and the EndBit. The value of the bit field is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value of the bit field read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldRead16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BitFieldRead16 (PciSegmentRead16 (Address), StartBit, EndBit);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes a bit field to a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes Value to the bit field of the PCI configuration register. The bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync field is specified by the StartBit and the EndBit. All other bits in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destination PCI configuration register are preserved. The new value of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 16-bit register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value New value of the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldWrite16 (PciSegmentRead16 (Address), StartBit, EndBit, Value)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result back to the bit field in the 16-bit port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 16-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR between the read result and the value specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData, and writes the result to the 16-bit PCI configuration register
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Address. The value written to the PCI configuration register is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. This function must guarantee that all PCI read and write operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are serialized. Extra left bits in OrData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldOr16 (PciSegmentRead16 (Address), StartBit, EndBit, OrData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in a 16-bit PCI configuration register, performs a bitwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AND, and writes the result back to the bit field in the 16-bit register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 16-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result to the 16-bit PCI configuration register specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address. The value written to the PCI configuration register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized. Extra left bits in AndData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldAnd16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldAnd16 (PciSegmentRead16 (Address), StartBit, EndBit, AndData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR, and writes the result back to the bit field in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 16-bit port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 16-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND followed by a bitwise OR between the read result and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the value specified by AndData, and writes the result to the 16-bit PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register specified by Address. The value written to the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register is returned. This function must guarantee that all PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync read and write operations are serialized. Extra left bits in both AndData and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 15, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..15.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the result of the AND operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldAndThenOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldAndThenOr16 (PciSegmentRead16 (Address), StartBit, EndBit, AndData, OrData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a 32-bit PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads and returns the 32-bit PCI configuration register specified by Address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentRead32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DxePciSegmentLibEsalReadWorker (Address, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes a 32-bit PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes the 32-bit PCI configuration register specified by Address with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value specified by Value. Value is returned. This function must guarantee
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that all PCI read and write operations are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Data The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (Address, 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DxePciSegmentLibEsalWriteWorker (Address, 4, Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise OR of a 32-bit PCI configuration register with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a 32-bit value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 32-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR between the read result and the value specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData, and writes the result to the 32-bit PCI configuration register
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Address. The value written to the PCI configuration register is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. This function must guarantee that all PCI read and write operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (Address, PciSegmentRead32 (Address) | OrData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 32-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result to the 32-bit PCI configuration register specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address. The value written to the PCI configuration register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentAnd32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (Address, PciSegmentRead32 (Address) & AndData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value, followed a bitwise OR with another 32-bit value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 32-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync performs a bitwise OR between the result of the AND operation and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the value specified by OrData, and writes the result to the 32-bit PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register specified by Address. The value written to the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register is returned. This function must guarantee that all PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync read and write operations are serialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address Address that encodes the PCI Segment, Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the result of the AND operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentAndThenOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (Address, (PciSegmentRead32 (Address) & AndData) | OrData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field of a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the bit field in a 32-bit PCI configuration register. The bit field is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by the StartBit and the EndBit. The value of the bit field is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value of the bit field read from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldRead32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BitFieldRead32 (PciSegmentRead32 (Address), StartBit, EndBit);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes a bit field to a PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes Value to the bit field of the PCI configuration register. The bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync field is specified by the StartBit and the EndBit. All other bits in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destination PCI configuration register are preserved. The new value of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 32-bit register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value New value of the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldWrite32 (PciSegmentRead32 (Address), StartBit, EndBit, Value)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in a 32-bit PCI configuration, performs a bitwise OR, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result back to the bit field in the 32-bit port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 32-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR between the read result and the value specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData, and writes the result to the 32-bit PCI configuration register
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Address. The value written to the PCI configuration register is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. This function must guarantee that all PCI read and write operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are serialized. Extra left bits in OrData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldOr32 (PciSegmentRead32 (Address), StartBit, EndBit, OrData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in a 32-bit PCI configuration register, performs a bitwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AND, and writes the result back to the bit field in the 32-bit register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 32-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND between the read result and the value specified by AndData, and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync writes the result to the 32-bit PCI configuration register specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address. The value written to the PCI configuration register is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function must guarantee that all PCI read and write operations are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync serialized. Extra left bits in AndData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldAnd32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldAnd32 (PciSegmentRead32 (Address), StartBit, EndBit, AndData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise OR, and writes the result back to the bit field in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 32-bit port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the 32-bit PCI configuration register specified by Address, performs a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bitwise AND followed by a bitwise OR between the read result and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the value specified by AndData, and writes the result to the 32-bit PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register specified by Address. The value written to the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration register is returned. This function must guarantee that all PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync read and write operations are serialized. Extra left bits in both AndData and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData are stripped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits in Address are set, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is greater than 31, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If EndBit is less than StartBit, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address PCI configuration register to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartBit The ordinal of the least significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EndBit The ordinal of the most significant bit in the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Range 0..31.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AndData The value to AND with the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OrData The value to OR with the result of the AND operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentBitFieldAndThenOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return PciSegmentWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BitFieldAndThenOr32 (PciSegmentRead32 (Address), StartBit, EndBit, AndData, OrData)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads a range of PCI configuration registers into a caller supplied buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reads the range of PCI configuration registers specified by StartAddress and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size into the buffer specified by Buffer. This function only allows the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration registers from a single PCI function to be read. Size is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. When possible 32-bit PCI configuration read cycles are used to read
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from StartAdress to StartAddress + Size. Due to alignment restrictions, 8-bit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and 16-bit PCI configuration read cycles may be used at the beginning and the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync end of the range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartAddress > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Size > 0 and Buffer is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartAddress Starting Address that encodes the PCI Segment, Bus, Device,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function and Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size Size in bytes of the transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to a buffer receiving the data read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentReadBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 StartAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (StartAddress, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save Size for return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReturnValue = Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((StartAddress & 1) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read a byte if StartAddress is byte aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(volatile UINT8 *)Buffer = PciSegmentRead8 (StartAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT8*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read a word if StartAddress is word aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(volatile UINT16 *)Buffer = PciSegmentRead16 (StartAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT16*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Size >= sizeof (UINT32)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read as many double words as possible
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(volatile UINT32 *)Buffer = PciSegmentRead32 (StartAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT32*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size >= sizeof (UINT16)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read the last remaining word if exist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(volatile UINT16 *)Buffer = PciSegmentRead16 (StartAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT16*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size >= sizeof (UINT8)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read the last remaining byte if exist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(volatile UINT8 *)Buffer = PciSegmentRead8 (StartAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copies the data in a caller supplied buffer to a specified range of PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes the range of PCI configuration registers specified by StartAddress and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size from the buffer specified by Buffer. This function only allows the PCI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration registers from a single PCI function to be written. Size is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. When possible 32-bit PCI configuration write cycles are used to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync write from StartAdress to StartAddress + Size. Due to alignment restrictions,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 8-bit and 16-bit PCI configuration write cycles may be used at the beginning
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and the end of the range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartAddress > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Size > 0 and Buffer is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartAddress Starting Address that encodes the PCI Segment, Bus, Device,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function and Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size Size in bytes of the transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Pointer to a buffer containing the data to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciSegmentWriteBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 StartAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_INVALID_PCI_SEGMENT_ADDRESS (StartAddress, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((StartAddress & 0xFFF) + Size) <= 0x1000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save Size for return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReturnValue = Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((StartAddress & 1) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Write a byte if StartAddress is byte aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciSegmentWrite8 (StartAddress, *(UINT8*)Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT8*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size >= sizeof (UINT16) && (StartAddress & 2) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Write a word if StartAddress is word aligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciSegmentWrite16 (StartAddress, *(UINT16*)Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT16*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Size >= sizeof (UINT32)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Write as many double words as possible
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciSegmentWrite32 (StartAddress, *(UINT32*)Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT32*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size >= sizeof (UINT16)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Write the last remaining word if exist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciSegmentWrite16 (StartAddress, *(UINT16*)Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartAddress += sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size -= sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (UINT16*)Buffer + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size >= sizeof (UINT8)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Write the last remaining byte if exist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PciSegmentWrite8 (StartAddress, *(UINT8*)Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}