2014-09-18 20:11:24 +02:00
|
|
|
#
|
2015-05-29 15:50:43 +02:00
|
|
|
# Copyright (c) 2011-2015, ARM Limited. All rights reserved.
|
2014-09-18 20:11:24 +02:00
|
|
|
# Copyright (c) 2014, Linaro Limited. All rights reserved.
|
2015-07-01 05:10:27 +02:00
|
|
|
# Copyright (c) 2015, Intel Corporation. All rights reserved.
|
2014-09-18 20:11:24 +02:00
|
|
|
#
|
|
|
|
# This program and the accompanying materials
|
|
|
|
# are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
# which accompanies this distribution. The full text of the license may be found at
|
|
|
|
# http://opensource.org/licenses/bsd-license.php
|
|
|
|
#
|
|
|
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
#
|
|
|
|
# Defines Section - statements that will be processed to create a Makefile.
|
|
|
|
#
|
|
|
|
################################################################################
|
|
|
|
[Defines]
|
2015-05-29 15:50:43 +02:00
|
|
|
PLATFORM_NAME = ArmVirtQemu
|
2014-09-18 20:11:24 +02:00
|
|
|
PLATFORM_GUID = 37d7e986-f7e9-45c2-8067-e371421a626c
|
|
|
|
PLATFORM_VERSION = 0.1
|
|
|
|
DSC_SPECIFICATION = 0x00010005
|
2015-05-29 15:50:43 +02:00
|
|
|
OUTPUT_DIRECTORY = Build/ArmVirtQemu-$(ARCH)
|
2014-09-18 20:11:24 +02:00
|
|
|
SUPPORTED_ARCHITECTURES = AARCH64|ARM
|
|
|
|
BUILD_TARGETS = DEBUG|RELEASE
|
|
|
|
SKUID_IDENTIFIER = DEFAULT
|
2015-05-29 15:50:43 +02:00
|
|
|
FLASH_DEFINITION = ArmVirtPkg/ArmVirtQemu.fdf
|
2014-09-18 20:11:24 +02:00
|
|
|
|
2015-05-07 17:22:31 +02:00
|
|
|
#
|
|
|
|
# Defines for default states. These can be changed on the command line.
|
|
|
|
# -D FLAG=VALUE
|
|
|
|
#
|
|
|
|
DEFINE SECURE_BOOT_ENABLE = FALSE
|
|
|
|
|
2015-05-29 15:50:43 +02:00
|
|
|
!include ArmVirtPkg/ArmVirt.dsc.inc
|
2014-09-18 20:11:24 +02:00
|
|
|
|
|
|
|
[LibraryClasses.AARCH64]
|
|
|
|
ArmLib|ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf
|
|
|
|
ArmCpuLib|ArmPkg/Drivers/ArmCpuLib/ArmCortexAEMv8Lib/ArmCortexAEMv8Lib.inf
|
|
|
|
|
|
|
|
[LibraryClasses.ARM]
|
|
|
|
ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf
|
|
|
|
ArmCpuLib|ArmPkg/Drivers/ArmCpuLib/ArmCortexA15Lib/ArmCortexA15Lib.inf
|
|
|
|
|
|
|
|
[LibraryClasses.common]
|
|
|
|
# Virtio Support
|
|
|
|
VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf
|
|
|
|
VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf
|
2015-05-29 15:50:43 +02:00
|
|
|
QemuFwCfgLib|ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf
|
2014-09-18 20:11:24 +02:00
|
|
|
|
2015-05-29 15:50:43 +02:00
|
|
|
ArmPlatformLib|ArmVirtPkg/Library/ArmVirtPlatformLib/ArmVirtPlatformLib.inf
|
2014-09-18 20:11:24 +02:00
|
|
|
ArmPlatformSysConfigLib|ArmPlatformPkg/Library/ArmPlatformSysConfigLibNull/ArmPlatformSysConfigLibNull.inf
|
|
|
|
|
|
|
|
TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
|
2015-05-29 15:50:43 +02:00
|
|
|
NorFlashPlatformLib|ArmVirtPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf
|
2014-09-18 20:11:24 +02:00
|
|
|
|
2015-07-09 08:24:29 +02:00
|
|
|
!if $(INTEL_BDS) == TRUE
|
2014-10-13 12:55:38 +02:00
|
|
|
CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
|
|
|
|
GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
|
2015-05-29 15:50:43 +02:00
|
|
|
PlatformBdsLib|ArmVirtPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
|
2014-10-13 12:55:38 +02:00
|
|
|
CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
|
2015-01-02 13:08:24 +01:00
|
|
|
QemuBootOrderLib|OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf
|
2014-10-13 12:55:38 +02:00
|
|
|
!endif
|
|
|
|
|
2014-09-18 20:11:24 +02:00
|
|
|
[LibraryClasses.common.UEFI_DRIVER]
|
|
|
|
UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
|
|
|
|
|
|
|
|
[LibraryClasses.AARCH64.SEC]
|
|
|
|
ArmLib|ArmPkg/Library/ArmLib/AArch64/AArch64LibSec.inf
|
|
|
|
|
|
|
|
[LibraryClasses.ARM.SEC]
|
|
|
|
ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf
|
|
|
|
|
|
|
|
[BuildOptions]
|
2015-05-29 15:50:43 +02:00
|
|
|
RVCT:*_*_ARM_PLATFORM_FLAGS == --cpu Cortex-A15 -I$(WORKSPACE)/ArmVirtPkg/Include
|
|
|
|
GCC:*_*_ARM_PLATFORM_FLAGS == -mcpu=cortex-a15 -I$(WORKSPACE)/ArmVirtPkg/Include
|
|
|
|
*_*_AARCH64_PLATFORM_FLAGS == -I$(WORKSPACE)/ArmVirtPkg/Include
|
2014-09-18 20:11:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
#
|
|
|
|
# Pcd Section - list of all EDK II PCD Entries defined by this Platform
|
|
|
|
#
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
[PcdsFeatureFlag.common]
|
2015-02-23 17:04:11 +01:00
|
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderPciTranslation|TRUE
|
2015-01-02 13:08:24 +01:00
|
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderMmioTranslation|TRUE
|
|
|
|
|
2014-09-18 20:11:24 +02:00
|
|
|
## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
|
|
|
|
# It could be set FALSE to save size.
|
2015-02-23 17:04:25 +01:00
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|FALSE
|
2014-09-18 20:11:24 +02:00
|
|
|
|
2015-02-23 17:03:42 +01:00
|
|
|
# Activate KVM workaround for now.
|
2015-05-29 15:50:43 +02:00
|
|
|
gArmVirtTokenSpaceGuid.PcdKludgeMapPciMmioAsCached|TRUE
|
2015-02-23 17:03:42 +01:00
|
|
|
|
2014-09-18 20:11:24 +02:00
|
|
|
[PcdsFixedAtBuild.common]
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdFirmwareVendor|"QEMU"
|
|
|
|
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdCoreCount|1
|
|
|
|
!if $(ARCH) == AARCH64
|
|
|
|
gArmTokenSpaceGuid.PcdVFPEnabled|1
|
|
|
|
!endif
|
|
|
|
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase|0x4007c000
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize|0x4000
|
|
|
|
|
|
|
|
# Size of the region used by UEFI in permanent memory (Reserved 64MB)
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x04000000
|
|
|
|
|
|
|
|
#
|
|
|
|
# ARM Pcds
|
|
|
|
#
|
|
|
|
gArmTokenSpaceGuid.PcdArmUncachedMemoryMask|0x0000000040000000
|
|
|
|
|
|
|
|
## Trustzone enable (to make the transition from EL3 to EL2 in ArmPlatformPkg/Sec)
|
|
|
|
gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE
|
|
|
|
|
|
|
|
#
|
|
|
|
# ARM PrimeCell
|
|
|
|
#
|
|
|
|
|
|
|
|
## PL011 - Serial Terminal
|
|
|
|
gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|38400
|
|
|
|
|
|
|
|
#
|
|
|
|
# ARM OS Loader
|
|
|
|
#
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultBootDescription|L"Linux (EFI stub) on virtio31:hd0:part0"
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultBootDevicePath|L"VenHw(837DCA9E-E874-4D82-B29A-23FE0E23D1E2,003E000A00000000)/HD(1,MBR,0x00000000,0x3F,0x19FC0)/Image"
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultBootArgument|"root=/dev/vda2 console=ttyAMA0 earlycon uefi_debug"
|
|
|
|
|
2015-02-23 17:04:25 +01:00
|
|
|
#
|
2015-02-25 18:53:55 +01:00
|
|
|
# Settings for ARM BDS -- use the serial console (ConIn & ConOut).
|
2015-02-23 17:04:25 +01:00
|
|
|
#
|
2015-07-09 08:24:29 +02:00
|
|
|
!if $(TTY_TERMINAL) == TRUE
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(38400,8,N,1)/VenMsg(7D916D80-5BB1-458C-A48F-E25FDD51EF94)"
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(38400,8,N,1)/VenMsg(7D916D80-5BB1-458C-A48F-E25FDD51EF94)"
|
2015-07-16 10:50:24 +02:00
|
|
|
## Terminal Type - TTYTERM, consistent with ConOut/ConIn Device Path.
|
|
|
|
## 0-PCANSI, 1-VT100, 2-VT00+, 3-UTF8, 4-TTYTERM
|
|
|
|
gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|4
|
2015-07-09 08:24:29 +02:00
|
|
|
!else
|
2015-02-25 18:53:55 +01:00
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultConOutPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(38400,8,N,1)/VenVt100()"
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths|L"VenHw(D3987D4B-971A-435F-8CAF-4967EB627241)/Uart(38400,8,N,1)/VenVt100()"
|
2015-07-16 10:50:24 +02:00
|
|
|
## Terminal Type - VT100, consistent with ConOut/ConIn Device Path.
|
|
|
|
## When Intel BDS is enabled, the above ConOut/ConIn device path is useless,
|
|
|
|
## but we still use VT100 terminal type when TTY_TERMINAL is not TRUE.
|
|
|
|
## 0-PCANSI, 1-VT100, 2-VT00+, 3-UTF8, 4-TTYTERM
|
|
|
|
gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|1
|
2015-07-09 08:24:29 +02:00
|
|
|
!endif
|
2015-05-13 20:25:47 +02:00
|
|
|
gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|3
|
2014-09-18 20:11:24 +02:00
|
|
|
|
|
|
|
#
|
ArmVirtualizationQemu: ask the hardware for the timer frequency
Roughly, there are two ways to "measure ticks" in UEFI:
- the SetTimer() boot service, which sets up a one-shot or periodic event
callback, and takes the interval length in units of 100ns,
- the Stall() boot service, which stalls the caller (but does not yield
the CPU) for the interval specified. The interval is taken as a number
of microseconds.
If the platform in question also follows the PI (Platform Init)
specification, then it is recommended to implement the above UEFI services
on top of the following DXE Architectural Protocols (described in PI
Volume 2):
- Timer Architectural Protocol:
"Used to set up a periodic timer interrupt using a platform specific
timer, and a processor-specific interrupt vector. This protocol enables
the use of the SetTimer() Boot Service. [...]"
- Metronome Architectural Protocol:
"Used to wait for ticks from a known time source in a platform. This
protocol may be used to implement a simple version of the Stall() Boot
Service. [...]"
Edk2 in general, and ArmVirtualizationQemu in particular, follow the above
pattern.
SetTimer() works correctly. The underlying Timer Architectural Protocol is
provided by "ArmPkg/Drivers/TimerDxe", and that driver calls the internal
function ArmGenericTimerGetTimerFreq() to retrieve the timer frequency.
Ultimately it boils down to reading the CNTFRQ_EL0 register.
The correct behavior of SetTimer() can be observed for example:
- in the grub-efi countdown ("grub-core/kern/arm/efi/init.c"),
- in the Intel BDS front page countdown
("IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c").
However, Stall() doesn't work correctly. The underlying Metronome
Architectural Protocol is provided by "EmbeddedPkg/MetronomeDxe", which
further delegates the job to the TimerLib library class. That in turn is
resolved to the "ArmPkg/Library/ArmArchTimerLib" instance, which
(finally!) takes the timer frequency from "PcdArmArchTimerFreqInHz".
In ArmVirtualizationQemu we currently specify 100MHz for this PCD. Alas,
that's incorect for:
- both QEMU/TCG (which emulates 62.5MHz, see GTIMER_SCALE in
"target-arm/internals.h"),
- and KVM (where the host's virtualized timer can tick at 50 MHz, for
example).
Set the PCD to 0, asking ArmArchTimerLib to interrogate CNTFRQ_EL0 as
well.
The change can be tested with eg. the following callers of Stall():
- the UEFI Shell's countdown -- before it runs "startup.nsh" -- relies on
Stall(),
- the UEFI shell command "stall" also uses Stall(). (Time it with a
stopwatch.)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Olivier Martin <Olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16692 6f19259b-4bc3-4df7-8a09-765794883524
2015-02-02 13:01:58 +01:00
|
|
|
# ARM Virtual Architectural Timer -- fetch frequency from QEMU (TCG) or KVM
|
2014-09-18 20:11:24 +02:00
|
|
|
#
|
ArmVirtualizationQemu: ask the hardware for the timer frequency
Roughly, there are two ways to "measure ticks" in UEFI:
- the SetTimer() boot service, which sets up a one-shot or periodic event
callback, and takes the interval length in units of 100ns,
- the Stall() boot service, which stalls the caller (but does not yield
the CPU) for the interval specified. The interval is taken as a number
of microseconds.
If the platform in question also follows the PI (Platform Init)
specification, then it is recommended to implement the above UEFI services
on top of the following DXE Architectural Protocols (described in PI
Volume 2):
- Timer Architectural Protocol:
"Used to set up a periodic timer interrupt using a platform specific
timer, and a processor-specific interrupt vector. This protocol enables
the use of the SetTimer() Boot Service. [...]"
- Metronome Architectural Protocol:
"Used to wait for ticks from a known time source in a platform. This
protocol may be used to implement a simple version of the Stall() Boot
Service. [...]"
Edk2 in general, and ArmVirtualizationQemu in particular, follow the above
pattern.
SetTimer() works correctly. The underlying Timer Architectural Protocol is
provided by "ArmPkg/Drivers/TimerDxe", and that driver calls the internal
function ArmGenericTimerGetTimerFreq() to retrieve the timer frequency.
Ultimately it boils down to reading the CNTFRQ_EL0 register.
The correct behavior of SetTimer() can be observed for example:
- in the grub-efi countdown ("grub-core/kern/arm/efi/init.c"),
- in the Intel BDS front page countdown
("IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c").
However, Stall() doesn't work correctly. The underlying Metronome
Architectural Protocol is provided by "EmbeddedPkg/MetronomeDxe", which
further delegates the job to the TimerLib library class. That in turn is
resolved to the "ArmPkg/Library/ArmArchTimerLib" instance, which
(finally!) takes the timer frequency from "PcdArmArchTimerFreqInHz".
In ArmVirtualizationQemu we currently specify 100MHz for this PCD. Alas,
that's incorect for:
- both QEMU/TCG (which emulates 62.5MHz, see GTIMER_SCALE in
"target-arm/internals.h"),
- and KVM (where the host's virtualized timer can tick at 50 MHz, for
example).
Set the PCD to 0, asking ArmArchTimerLib to interrogate CNTFRQ_EL0 as
well.
The change can be tested with eg. the following callers of Stall():
- the UEFI Shell's countdown -- before it runs "startup.nsh" -- relies on
Stall(),
- the UEFI shell command "stall" also uses Stall(). (Time it with a
stopwatch.)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Olivier Martin <Olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16692 6f19259b-4bc3-4df7-8a09-765794883524
2015-02-02 13:01:58 +01:00
|
|
|
gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0
|
2014-09-18 20:11:24 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# NV Storage PCDs. Use base of 0x04000000 for NOR1
|
|
|
|
#
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x04000000
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00040000
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0x04040000
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00040000
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0x04080000
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00040000
|
|
|
|
|
|
|
|
# System Memory Base -- fixed at 0x4000_0000
|
|
|
|
gArmTokenSpaceGuid.PcdSystemMemoryBase|0x40000000
|
|
|
|
|
|
|
|
# initial location of the device tree blob passed by QEMU -- base of DRAM
|
2015-05-29 15:50:43 +02:00
|
|
|
gArmVirtTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress|0x40000000
|
2014-09-18 20:11:24 +02:00
|
|
|
|
2015-07-09 08:24:29 +02:00
|
|
|
!if $(INTEL_BDS) == TRUE
|
2014-10-13 12:55:38 +02:00
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE
|
2015-01-02 13:08:28 +01:00
|
|
|
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }
|
2014-10-13 12:55:38 +02:00
|
|
|
!endif
|
|
|
|
|
2015-02-23 17:03:32 +01:00
|
|
|
#
|
|
|
|
# The maximum physical I/O addressability of the processor, set with
|
|
|
|
# BuildCpuHob().
|
|
|
|
#
|
|
|
|
gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|16
|
|
|
|
|
ArmVirtualizationPkg/VirtFdtDxe: parse "pci-host-ecam-generic" properties
In the Linux kernel tree,
"Documentation/devicetree/bindings/pci/host-generic-pci.txt" describes the
device tree bindings of a Generic PCI host controller.
Recent QEMU patches from Alexander Graf implement such a controller on the
"virt" machine type of qemu-system-(aarch64|arm):
pcie@10000000 {
//
// (devfn<<8, 0, 0) PCI irq
// ---------------- -------
interrupt-map-mask = <0x1800 0x0 0x0 0x7>;
// gic irq
// (devfn<<8, 0, 0) pin+1 phandle (type, nr, level)
// ---------------- ----- -------- -----------------
interrupt-map = < 0x0 0x0 0x0 0x1 0x8001 0x0 0x3 0x4
0x0 0x0 0x0 0x2 0x8001 0x0 0x4 0x4
0x0 0x0 0x0 0x3 0x8001 0x0 0x5 0x4
0x0 0x0 0x0 0x4 0x8001 0x0 0x6 0x4
0x800 0x0 0x0 0x1 0x8001 0x0 0x4 0x4
0x800 0x0 0x0 0x2 0x8001 0x0 0x5 0x4
0x800 0x0 0x0 0x3 0x8001 0x0 0x6 0x4
0x800 0x0 0x0 0x4 0x8001 0x0 0x3 0x4
0x1000 0x0 0x0 0x1 0x8001 0x0 0x5 0x4
0x1000 0x0 0x0 0x2 0x8001 0x0 0x6 0x4
0x1000 0x0 0x0 0x3 0x8001 0x0 0x3 0x4
0x1000 0x0 0x0 0x4 0x8001 0x0 0x4 0x4
0x1800 0x0 0x0 0x1 0x8001 0x0 0x6 0x4
0x1800 0x0 0x0 0x2 0x8001 0x0 0x3 0x4
0x1800 0x0 0x0 0x3 0x8001 0x0 0x4 0x4
0x1800 0x0 0x0 0x4 0x8001 0x0 0x5 0x4>;
#interrupt-cells = <0x1>;
//
// child base cpu base
// type address address size
// --------- -------------- -------------- --------------
ranges = <0x1000000 0x0 0x0 0x0 0x3eff0000 0x0 0x10000
0x2000000 0x0 0x10000000 0x0 0x10000000 0x0 0x2eff0000>;
//
// PCIe config PCIe config
// space base space size
// -------------- -------------
reg = <0x0 0x3f000000 0x0 0x1000000>;
//
// allowed bus numbers; inclusive range
//
bus-range = <0x0 0xf>;
#size-cells = <0x2>;
#address-cells = <0x3>;
device_type = "pci";
compatible = "pci-host-ecam-generic";
};
Parse those properties of the compatible="pci-host-ecam-generic" node into
PCDs that are relevant for PCI enumeration in edk2:
- gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress controls
MdePkg/Library/BasePciExpressLib,
- gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration controls
OvmfPkg/AcpiPlatformDxe at this point,
- the rest have been introduced earlier in this patchset, and will control
PCI range checks and translation.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16894 6f19259b-4bc3-4df7-8a09-765794883524
2015-02-23 17:02:50 +01:00
|
|
|
[PcdsDynamicDefault.common]
|
2015-02-20 00:46:13 +01:00
|
|
|
## If TRUE, OvmfPkg/AcpiPlatformDxe will not wait for PCI
|
|
|
|
# enumeration to complete before installing ACPI tables.
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|TRUE
|
|
|
|
|
2014-09-18 20:11:24 +02:00
|
|
|
# System Memory Size -- 1 MB initially, actual size will be fetched from DT
|
|
|
|
gArmTokenSpaceGuid.PcdSystemMemorySize|0x00100000
|
|
|
|
|
|
|
|
gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum|0x0
|
|
|
|
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0
|
|
|
|
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0
|
|
|
|
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0
|
|
|
|
|
|
|
|
#
|
|
|
|
# ARM General Interrupt Controller
|
|
|
|
#
|
|
|
|
gArmTokenSpaceGuid.PcdGicDistributorBase|0x0
|
2015-02-28 21:25:26 +01:00
|
|
|
gArmTokenSpaceGuid.PcdGicRedistributorsBase|0x0
|
2014-09-18 20:11:24 +02:00
|
|
|
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x0
|
|
|
|
|
|
|
|
## PL031 RealTimeClock
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPL031RtcBase|0x0
|
|
|
|
|
ArmVirtualizationPkg/VirtFdtDxe: parse "pci-host-ecam-generic" properties
In the Linux kernel tree,
"Documentation/devicetree/bindings/pci/host-generic-pci.txt" describes the
device tree bindings of a Generic PCI host controller.
Recent QEMU patches from Alexander Graf implement such a controller on the
"virt" machine type of qemu-system-(aarch64|arm):
pcie@10000000 {
//
// (devfn<<8, 0, 0) PCI irq
// ---------------- -------
interrupt-map-mask = <0x1800 0x0 0x0 0x7>;
// gic irq
// (devfn<<8, 0, 0) pin+1 phandle (type, nr, level)
// ---------------- ----- -------- -----------------
interrupt-map = < 0x0 0x0 0x0 0x1 0x8001 0x0 0x3 0x4
0x0 0x0 0x0 0x2 0x8001 0x0 0x4 0x4
0x0 0x0 0x0 0x3 0x8001 0x0 0x5 0x4
0x0 0x0 0x0 0x4 0x8001 0x0 0x6 0x4
0x800 0x0 0x0 0x1 0x8001 0x0 0x4 0x4
0x800 0x0 0x0 0x2 0x8001 0x0 0x5 0x4
0x800 0x0 0x0 0x3 0x8001 0x0 0x6 0x4
0x800 0x0 0x0 0x4 0x8001 0x0 0x3 0x4
0x1000 0x0 0x0 0x1 0x8001 0x0 0x5 0x4
0x1000 0x0 0x0 0x2 0x8001 0x0 0x6 0x4
0x1000 0x0 0x0 0x3 0x8001 0x0 0x3 0x4
0x1000 0x0 0x0 0x4 0x8001 0x0 0x4 0x4
0x1800 0x0 0x0 0x1 0x8001 0x0 0x6 0x4
0x1800 0x0 0x0 0x2 0x8001 0x0 0x3 0x4
0x1800 0x0 0x0 0x3 0x8001 0x0 0x4 0x4
0x1800 0x0 0x0 0x4 0x8001 0x0 0x5 0x4>;
#interrupt-cells = <0x1>;
//
// child base cpu base
// type address address size
// --------- -------------- -------------- --------------
ranges = <0x1000000 0x0 0x0 0x0 0x3eff0000 0x0 0x10000
0x2000000 0x0 0x10000000 0x0 0x10000000 0x0 0x2eff0000>;
//
// PCIe config PCIe config
// space base space size
// -------------- -------------
reg = <0x0 0x3f000000 0x0 0x1000000>;
//
// allowed bus numbers; inclusive range
//
bus-range = <0x0 0xf>;
#size-cells = <0x2>;
#address-cells = <0x3>;
device_type = "pci";
compatible = "pci-host-ecam-generic";
};
Parse those properties of the compatible="pci-host-ecam-generic" node into
PCDs that are relevant for PCI enumeration in edk2:
- gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress controls
MdePkg/Library/BasePciExpressLib,
- gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration controls
OvmfPkg/AcpiPlatformDxe at this point,
- the rest have been introduced earlier in this patchset, and will control
PCI range checks and translation.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16894 6f19259b-4bc3-4df7-8a09-765794883524
2015-02-23 17:02:50 +01:00
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciBusMin|0x0
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciBusMax|0x0
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciIoBase|0x0
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciIoSize|0x0
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciIoTranslation|0x0
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciMmio32Base|0x0
|
|
|
|
gArmPlatformTokenSpaceGuid.PcdPciMmio32Size|0x0
|
|
|
|
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0x0
|
|
|
|
|
2015-05-29 15:50:43 +02:00
|
|
|
gArmVirtTokenSpaceGuid.PcdArmPsciMethod|0
|
2014-09-18 20:11:24 +02:00
|
|
|
|
2015-05-29 15:50:43 +02:00
|
|
|
gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0
|
|
|
|
gArmVirtTokenSpaceGuid.PcdFwCfgDataAddress|0x0
|
2015-01-02 13:04:05 +01:00
|
|
|
|
2015-02-23 17:04:25 +01:00
|
|
|
#
|
|
|
|
# Set video resolution for boot options and for text setup.
|
|
|
|
# PlatformDxe can set the former at runtime.
|
|
|
|
#
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|800
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|600
|
2015-05-06 06:44:43 +02:00
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution|640
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution|480
|
2015-02-23 17:04:25 +01:00
|
|
|
|
2015-07-26 10:02:55 +02:00
|
|
|
#
|
|
|
|
# SMBIOS entry point version
|
|
|
|
#
|
|
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosVersion|0x0300
|
|
|
|
|
2014-09-18 20:11:24 +02:00
|
|
|
################################################################################
|
|
|
|
#
|
|
|
|
# Components Section - list of all EDK II Modules needed by this Platform
|
|
|
|
#
|
|
|
|
################################################################################
|
|
|
|
[Components.common]
|
|
|
|
#
|
|
|
|
# PEI Phase modules
|
|
|
|
#
|
|
|
|
ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf {
|
|
|
|
<LibraryClasses>
|
|
|
|
ArmPlatformGlobalVariableLib|ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/Pei/PeiArmPlatformGlobalVariableLib.inf
|
|
|
|
}
|
|
|
|
MdeModulePkg/Core/Pei/PeiMain.inf
|
|
|
|
MdeModulePkg/Universal/PCD/Pei/Pcd.inf
|
|
|
|
ArmPlatformPkg/PlatformPei/PlatformPeim.inf
|
|
|
|
ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.inf
|
|
|
|
ArmPkg/Drivers/CpuPei/CpuPei.inf
|
|
|
|
|
|
|
|
MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
|
2015-05-07 17:22:31 +02:00
|
|
|
|
2014-09-18 20:11:24 +02:00
|
|
|
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
|
|
|
|
<LibraryClasses>
|
2015-04-08 21:58:50 +02:00
|
|
|
NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
|
2014-09-18 20:11:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# DXE
|
|
|
|
#
|
|
|
|
MdeModulePkg/Core/Dxe/DxeMain.inf {
|
|
|
|
<LibraryClasses>
|
|
|
|
NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
|
|
|
|
}
|
|
|
|
MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
|
|
|
|
|
|
|
|
#
|
|
|
|
# Architectural Protocols
|
|
|
|
#
|
|
|
|
ArmPkg/Drivers/CpuDxe/CpuDxe.inf
|
|
|
|
MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
|
2015-07-01 05:11:05 +02:00
|
|
|
MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
|
2015-05-07 17:22:31 +02:00
|
|
|
!if $(SECURE_BOOT_ENABLE) == TRUE
|
|
|
|
MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf {
|
|
|
|
<LibraryClasses>
|
|
|
|
NULL|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
|
|
|
|
}
|
|
|
|
SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
|
|
|
|
!else
|
2014-09-18 20:11:24 +02:00
|
|
|
MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
|
2015-05-07 17:22:31 +02:00
|
|
|
!endif
|
|
|
|
MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
|
2014-09-18 20:11:24 +02:00
|
|
|
MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
|
|
|
|
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
|
|
|
|
EmbeddedPkg/ResetRuntimeDxe/ResetRuntimeDxe.inf
|
|
|
|
EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
|
|
|
|
EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
|
|
|
|
|
|
|
|
MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
|
|
|
|
MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
|
|
|
|
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
|
|
|
|
MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
|
|
|
|
EmbeddedPkg/SerialDxe/SerialDxe.inf
|
|
|
|
|
|
|
|
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
|
|
|
|
|
|
|
|
ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
|
|
|
|
ArmPkg/Drivers/TimerDxe/TimerDxe.inf
|
2015-05-07 17:22:31 +02:00
|
|
|
!if $(SECURE_BOOT_ENABLE) == TRUE
|
|
|
|
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashAuthenticatedDxe.inf
|
|
|
|
!else
|
|
|
|
ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
|
|
|
|
!endif
|
2014-09-18 20:11:24 +02:00
|
|
|
MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
|
|
|
|
|
|
|
|
#
|
|
|
|
# Platform Driver
|
|
|
|
#
|
2015-05-29 15:50:43 +02:00
|
|
|
ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf
|
ArmVirtPkg: add QemuFwCfgToPcdDxe
Many universal DXE drivers in edk2 can be controlled by setting dynamic
PCDs. Such a PCD must be set before the consumer DXE driver is dispatched.
(In general we assume that the DXE driver will consume the PCD in its
entry point, or in the constructor of a library instance it links against.
In special cases this requirement can be relaxed a bit, if we know that
the DXE driver accesses the PCD only in a protocol member function that it
exports.)
On the QEMU platform, the PCD values to be set for the universal drivers
are frequently derived from fw_cfg files that QEMU exports.
In OvmfPkg we tend to handle this in the following way:
- For IA32 and X64, OvmfPkg provides a QemuFwCfgLib instance that is
usable in PEI.
- In PlatformPei, fw_cfg files can be loaded and transformed to PCD
values.
- Any DXE driver is bound to be dispatched after the PEI phase is done.
(In specific cases other ordering solutions might be possible, via Depex
or protocol notify, etc.)
In ArmVirtPkg/ArmVirtQemu, things differ a bit:
- We don't have an ArmVirtPkg-specific ("Platform") PEIM. This is actually
a good thing for now, so let's not introduce one just for this purpose.
- Even if we had such a PEIM, it could not easily access fw_cfg: the MMIO
addresses of the fw_cfg device are available only in the DTB that QEMU
exports.
(Accordingly, our QemuFwCfgLib instance is restricted to DXE_DRIVER
modules: VirtFdtDxe parses the DTB, stores the fw_cfg addresses in PCDs,
and then QemuFwCfgLib's constructor fetches those PCDs.)
There are some examples in ArmVirtPkg where early code is forced to
parse the DTB manually, but those examples are all painful, and our goal
here (controlling universal DXE drivers) doesn't justify more of that
pain.
Therefore, introduce a separate, minimal DXE driver that is dispatched
strictly after VirtFdtDxe (so that it can use QemuFwCfgLib), and strictly
before other DXE drivers (so that it can set dynamic PCDs for them).
Because VirtFdtDxe is already ordered with the APRIORI DXE file, it is
simplest to do the same for the new driver.
Actual fw_cfg files and PCDs shall be accessed in future patches.
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18042 6f19259b-4bc3-4df7-8a09-765794883524
2015-07-26 10:02:50 +02:00
|
|
|
ArmVirtPkg/QemuFwCfgToPcdDxe/QemuFwCfgToPcd.inf
|
2014-09-18 20:11:24 +02:00
|
|
|
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
|
|
|
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
|
|
|
OvmfPkg/VirtioNetDxe/VirtioNet.inf
|
|
|
|
|
|
|
|
#
|
|
|
|
# FAT filesystem + GPT/MBR partitioning
|
|
|
|
#
|
|
|
|
MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
|
|
|
|
MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
|
|
|
|
MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
|
|
|
|
|
|
|
|
#
|
|
|
|
# Bds
|
|
|
|
#
|
|
|
|
MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
|
2015-07-09 08:24:29 +02:00
|
|
|
!if $(INTEL_BDS) == TRUE
|
2014-10-13 12:55:38 +02:00
|
|
|
MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
|
|
|
|
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
|
|
|
|
IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
|
|
|
|
!else
|
2014-09-18 20:11:24 +02:00
|
|
|
ArmPlatformPkg/Bds/Bds.inf
|
2014-10-13 12:55:38 +02:00
|
|
|
!endif
|
2014-09-18 20:11:24 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# SCSI Bus and Disk Driver
|
|
|
|
#
|
|
|
|
MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf
|
|
|
|
MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
|
2015-02-02 20:09:07 +01:00
|
|
|
|
|
|
|
#
|
|
|
|
# ACPI Support
|
|
|
|
#
|
|
|
|
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
|
|
|
|
OvmfPkg/AcpiPlatformDxe/QemuFwCfgAcpiPlatformDxe.inf
|
2015-02-23 17:04:11 +01:00
|
|
|
|
|
|
|
#
|
|
|
|
# PCI support
|
|
|
|
#
|
2015-05-29 15:50:43 +02:00
|
|
|
ArmVirtPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
|
2015-02-23 17:04:11 +01:00
|
|
|
MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
|
|
|
|
OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf
|
2015-02-23 17:04:25 +01:00
|
|
|
|
|
|
|
#
|
|
|
|
# Video support
|
|
|
|
#
|
|
|
|
OvmfPkg/QemuVideoDxe/QemuVideoDxe.inf {
|
|
|
|
<LibraryClasses>
|
|
|
|
BltLib|OptionRomPkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf
|
|
|
|
}
|
|
|
|
OvmfPkg/PlatformDxe/Platform.inf
|
2015-02-23 17:04:30 +01:00
|
|
|
|
|
|
|
#
|
|
|
|
# USB Support
|
|
|
|
#
|
|
|
|
MdeModulePkg/Bus/Pci/UhciDxe/UhciDxe.inf
|
|
|
|
MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
|
2015-03-16 20:57:06 +01:00
|
|
|
MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf
|
2015-02-23 17:04:30 +01:00
|
|
|
MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
|
|
|
|
MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf
|