1 /** @file 2 Runtime Lib function for QNC internal network access. 3 4 Copyright (c) 2013-2015 Intel Corporation. 5 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 17 #include <PiDxe.h> 18 19 #include <Guid/EventGroup.h> 20 21 #include <Library/BaseLib.h> 22 #include <Library/DebugLib.h> 23 #include <Library/UefiBootServicesTableLib.h> 24 #include <Library/UefiRuntimeLib.h> 25 #include <Library/QNCAccessLib.h> 26 27 /// 28 /// Set Virtual Address Map Event 29 /// 30 EFI_EVENT mDxeRuntimeQncAccessLibVirtualNotifyEvent = NULL; 31 32 /// 33 /// Module global that contains the base physical address of the PCI Express MMIO range. 34 /// 35 UINTN mDxeRuntimeQncAccessLibPciExpressBaseAddress = 0; 36 37 /** 38 Convert the physical PCI Express MMIO address to a virtual address. 39 40 @param[in] Event The event that is being processed. 41 @param[in] Context The Event Context. 42 **/ 43 VOID 44 EFIAPI 45 DxeRuntimeQncAccessLibVirtualNotify ( 46 IN EFI_EVENT Event, 47 IN VOID *Context 48 ) 49 { 50 EFI_STATUS Status; 51 52 // 53 // Convert the physical PCI Express MMIO address to a virtual address. 54 // 55 Status = EfiConvertPointer (0, (VOID **) &mDxeRuntimeQncAccessLibPciExpressBaseAddress); 56 57 ASSERT_EFI_ERROR (Status); 58 } 59 60 /** 61 The constructor function to setup globals and goto virtual mode notify. 62 63 @param ImageHandle The firmware allocated handle for the EFI image. 64 @param SystemTable A pointer to the EFI System Table. 65 66 @retval EFI_SUCCESS The constructor completed successfully. 67 @retval Other value The constructor did not complete successfully. 68 69 **/ 70 EFI_STATUS 71 EFIAPI 72 DxeRuntimeQncAccessLibConstructor ( 73 IN EFI_HANDLE ImageHandle, 74 IN EFI_SYSTEM_TABLE *SystemTable 75 ) 76 { 77 EFI_STATUS Status; 78 79 // 80 // Cache the physical address of the PCI Express MMIO range into a module global variable 81 // 82 mDxeRuntimeQncAccessLibPciExpressBaseAddress = (UINTN) PcdGet64(PcdPciExpressBaseAddress); 83 84 // 85 // Register SetVirtualAddressMap () notify function 86 // 87 Status = gBS->CreateEventEx ( 88 EVT_NOTIFY_SIGNAL, 89 TPL_NOTIFY, 90 DxeRuntimeQncAccessLibVirtualNotify, 91 NULL, 92 &gEfiEventVirtualAddressChangeGuid, 93 &mDxeRuntimeQncAccessLibVirtualNotifyEvent 94 ); 95 ASSERT_EFI_ERROR (Status); 96 97 return Status; 98 } 99 100 /** 101 The destructor function frees any allocated buffers and closes the Set Virtual 102 Address Map event. 103 104 @param ImageHandle The firmware allocated handle for the EFI image. 105 @param SystemTable A pointer to the EFI System Table. 106 107 @retval EFI_SUCCESS The destructor completed successfully. 108 @retval Other value The destructor did not complete successfully. 109 110 **/ 111 EFI_STATUS 112 EFIAPI 113 DxeRuntimeQncAccessLibDestructor ( 114 IN EFI_HANDLE ImageHandle, 115 IN EFI_SYSTEM_TABLE *SystemTable 116 ) 117 { 118 EFI_STATUS Status; 119 120 // 121 // Close the Set Virtual Address Map event 122 // 123 Status = gBS->CloseEvent (mDxeRuntimeQncAccessLibVirtualNotifyEvent); 124 ASSERT_EFI_ERROR (Status); 125 126 return Status; 127 } 128 129 /** 130 Gets the base address of PCI Express for Quark North Cluster. 131 132 @return The base address of PCI Express for Quark North Cluster. 133 134 **/ 135 UINTN 136 EFIAPI 137 QncGetPciExpressBaseAddress ( 138 VOID 139 ) 140 { 141 // 142 // If system goes to virtual mode then virtual notify callback will update 143 // mDxeRuntimeQncAccessLibPciExpressBaseAddress with virtual address of 144 // PCIe memory base. 145 // 146 return mDxeRuntimeQncAccessLibPciExpressBaseAddress; 147 } 148 149