4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Functions in this library instance make use of MMIO functions in IoLib to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync access memory mapped PCI configuration space.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync All assertions for I/O operations are handled in MMIO functions in the IoLib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Library.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2010, 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <PiDxe.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/EventGroup.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PciExpressLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/IoLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PcdLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/MemoryAllocationLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiBootServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DxeServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiRuntimeLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Define table for mapping PCI Express MMIO physical addresses to virtual addresses at OS runtime
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PhysicalAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VirtualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} PCI_EXPRESS_RUNTIME_REGISTRATION_TABLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Set Virtual Address Map Event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_EVENT mDxeRuntimePciExpressLibVirtualNotifyEvent = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Module global that contains the base physical address of the PCI Express MMIO range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mDxeRuntimePciExpressLibPciExpressBaseAddress = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// The number of PCI devices that have been registered for runtime access.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mDxeRuntimePciExpressLibNumberOfRuntimeRanges = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// The table of PCI devices that have been registered for runtime access.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPCI_EXPRESS_RUNTIME_REGISTRATION_TABLE *mDxeRuntimePciExpressLibRegistrationTable = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// The table index of the most recent virtual address lookup.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mDxeRuntimePciExpressLibLastRuntimeRange = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the physical PCI Express MMIO addresses for all registered PCI devices
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to virtual addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event The event that is being processed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The Event Context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDxeRuntimePciExpressLibVirtualNotify (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there have been no runtime registrations, then just return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDxeRuntimePciExpressLibRegistrationTable == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert physical addresses associated with the set of registered PCI devices to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // virtual addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < mDxeRuntimePciExpressLibNumberOfRuntimeRanges; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiConvertPointer (0, (VOID **) &(mDxeRuntimePciExpressLibRegistrationTable[Index].VirtualAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert table pointer that is allocated from EfiRuntimeServicesData to a virtual address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiConvertPointer (0, (VOID **) &mDxeRuntimePciExpressLibRegistrationTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The constructor function caches the PCI Express Base Address and creates a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set Virtual Address Map event to convert physical address to virtual addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle The firmware allocated handle for the EFI image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable A pointer to the EFI System Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The constructor completed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other value The constructor did not complete successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDxeRuntimePciExpressLibConstructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Cache the physical address of the PCI Express MMIO range into a module global variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibPciExpressBaseAddress = (UINTN) PcdGet64 (PcdPciExpressBaseAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Register SetVirtualAddressMap () notify function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEventEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EVT_NOTIFY_SIGNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_NOTIFY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DxeRuntimePciExpressLibVirtualNotify,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiEventVirtualAddressChangeGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mDxeRuntimePciExpressLibVirtualNotifyEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The destructor function frees any allocated buffers and closes the Set Virtual
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address Map event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle The firmware allocated handle for the EFI image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable A pointer to the EFI System Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The destructor completed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other value The destructor did not complete successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDxeRuntimePciExpressLibDestructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If one or more PCI devices have been registered for runtime access, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // free the registration table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDxeRuntimePciExpressLibRegistrationTable != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (mDxeRuntimePciExpressLibRegistrationTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the Set Virtual Address Map event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CloseEvent (mDxeRuntimePciExpressLibVirtualNotifyEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Gets the base address of PCI Express.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This internal functions retrieves PCI Express Base Address via a PCD entry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdPciExpressBaseAddress.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The base address of PCI Express.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetPciExpressAddress (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure Address is valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((Address) & ~0xfffffff) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Address to a physical address in the MMIO PCI Express range
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address += mDxeRuntimePciExpressLibPciExpressBaseAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If SetVirtualAddressMap() has not been called, then just return the physical address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EfiGoneVirtual ()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if there is a physical address match at the exact same index as the last address match
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDxeRuntimePciExpressLibRegistrationTable[mDxeRuntimePciExpressLibLastRuntimeRange].PhysicalAddress == (Address & (~0x00000fff))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the physical address to a virtual address and return the virtual address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Address & 0x00000fff) + mDxeRuntimePciExpressLibRegistrationTable[mDxeRuntimePciExpressLibLastRuntimeRange].VirtualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search the entire table for a physical address match
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < mDxeRuntimePciExpressLibNumberOfRuntimeRanges; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDxeRuntimePciExpressLibRegistrationTable[Index].PhysicalAddress == (Address & (~0x00000fff))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Cache the matching index value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibLastRuntimeRange = Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the physical address to a virtual address and return the virtual address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Address & 0x00000fff) + mDxeRuntimePciExpressLibRegistrationTable[Index].VirtualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No match was found. This is a critical error at OS runtime, so ASSERT() and force a breakpoint.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CpuBreakpoint();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the physical address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers a PCI device so PCI configuration registers may be accessed after
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetVirtualAddressMap().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers the PCI device specified by Address so all the PCI configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync registers associated with that PCI device may be accessed after SetVirtualAddressMap()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is called.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS The PCI device was registered for runtime access.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_UNSUPPORTED An attempt was made to call this function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync after ExitBootServices().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_UNSUPPORTED The resources required to access the PCI device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync at runtime could not be mapped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync complete the registration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressRegisterForRuntimeAccess (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *NewTable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return an error if this function is called after ExitBootServices().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EfiAtRuntime ()) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure Address is valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((Address) & ~0xfffffff) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Address to a physical address in the MMIO PCI Express range
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // at the beginning of the PCI Configuration header for the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // PCI Bus/Dev/Func
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = GetPciExpressAddress (Address & 0x0ffff000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if Address has already been registerd for runtime access
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < mDxeRuntimePciExpressLibNumberOfRuntimeRanges; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mDxeRuntimePciExpressLibRegistrationTable[Index].PhysicalAddress == Address) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the GCD Memory Descriptor for the PCI Express Bus/Dev/Func specified by Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gDS->GetMemorySpaceDescriptor (Address, &Descriptor);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Mark the 4KB region for the PCI Express Bus/Dev/Func as EFI_RUNTIME_MEMORY so the OS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // will allocate a virtual address range for the 4KB PCI Configuration Header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gDS->SetMemorySpaceAttributes (Address, 0x1000, Descriptor.Attributes | EFI_MEMORY_RUNTIME);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Grow the size of the registration table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewTable = ReallocateRuntimePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (mDxeRuntimePciExpressLibNumberOfRuntimeRanges + 0) * sizeof (PCI_EXPRESS_RUNTIME_REGISTRATION_TABLE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (mDxeRuntimePciExpressLibNumberOfRuntimeRanges + 1) * sizeof (PCI_EXPRESS_RUNTIME_REGISTRATION_TABLE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibRegistrationTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewTable == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibRegistrationTable = NewTable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibRegistrationTable[mDxeRuntimePciExpressLibNumberOfRuntimeRanges].PhysicalAddress = Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibRegistrationTable[mDxeRuntimePciExpressLibNumberOfRuntimeRanges].VirtualAddress = Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mDxeRuntimePciExpressLibNumberOfRuntimeRanges++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The read value from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressRead8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioRead8 (GetPciExpressAddress (Address));
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioWrite8 (GetPciExpressAddress (Address), Value);
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioOr8 (GetPciExpressAddress (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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressAnd8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioAnd8 (GetPciExpressAddress (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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressAndThenOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioAndThenOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
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 Address > 0x0FFFFFFF, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldRead8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldRead8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
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 Address > 0x0FFFFFFF, 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 The 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 The new value of the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldWrite8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldAnd8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldAnd8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldAndThenOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldAndThenOr8 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The read value from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressRead16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioRead16 (GetPciExpressAddress (Address));
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioWrite16 (GetPciExpressAddress (Address), Value);
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioOr16 (GetPciExpressAddress (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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressAnd16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioAnd16 (GetPciExpressAddress (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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressAndThenOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioAndThenOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldRead16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldRead16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, 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 The 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 The new value of the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldWrite16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldAnd16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldAnd16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 16-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldAndThenOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldAndThenOr16 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The read value from the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressRead32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioRead32 (GetPciExpressAddress (Address));
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI Bus, Device, Function and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Value The value to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioWrite32 (GetPciExpressAddress (Address), Value);
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioOr32 (GetPciExpressAddress (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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressAnd32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioAnd32 (GetPciExpressAddress (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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Address The address that encodes the PCI 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressAndThenOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioAndThenOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldRead32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldRead32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, 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 The 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 The new value of the bit field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The value written back to the PCI configuration register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldWrite32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldAnd32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldAnd32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 Address > 0x0FFFFFFF, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Address is not aligned on a 32-bit boundary, 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 The 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressBitFieldAndThenOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 OrData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return MmioBitFieldAndThenOr32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetPciExpressAddress (Address),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndBit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AndData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 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 The starting address that encodes the PCI Bus, Device,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function and Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size The size in bytes of the transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The pointer to a buffer receiving the data read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Size read data from StartAddress.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressReadBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure Address is valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((StartAddress) & ~0xfffffff) == 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 = PciExpressRead8 (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 WriteUnaligned16 ((UINT16 *) Buffer, (UINT16) PciExpressRead16 (StartAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 WriteUnaligned32 ((UINT32 *) Buffer, (UINT32) PciExpressRead32 (StartAddress));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 WriteUnaligned16 ((UINT16 *) Buffer, (UINT16) PciExpressRead16 (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 = PciExpressRead8 (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 The starting address that encodes the PCI Bus, Device,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function and Register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size The size in bytes of the transfer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The pointer to a buffer containing the data to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Size written to StartAddress.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPciExpressWriteBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN StartAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure Address is valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (((StartAddress) & ~0xfffffff) == 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 PciExpressWrite8 (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 PciExpressWrite16 (StartAddress, ReadUnaligned16 ((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 PciExpressWrite32 (StartAddress, ReadUnaligned32 ((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 PciExpressWrite16 (StartAddress, ReadUnaligned16 ((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 PciExpressWrite8 (StartAddress, *(UINT8*)Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}