5 & 6:
Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>

On Mon, Oct 27, 2014 at 9:09 PM, Gabriel L. Somlo <gso...@gmail.com> wrote:
> Merge PciInitialization() and AcpiInitialization() into a single
> function, PciAcpiInitialization(), and use a PCD set during PEI to
> detect the underlying platform type (PIIX4 or Q35/MCH) and therefore
> the addresses of the registers to be initialized.
>
> Add LNK[A-H] routing target initialization for the Q35 platform.
>
> Additionally, initialize PCI_INTERRUPT_LINE registers for the typical
> set of PCI devices included by QEMU with the Q35 machine type. The
> corresponding PIIX4 initialization of PCI_INTERRUPT_LINE registers is
> cleaned up and the list of PIIX4 PCI devices updated to the list
> typically included with QEMU.
>
> NOTE: The initialization of PCI_INTERRUPT_LINE registers *should*
> be accomplished programmatically by enumerating all PCI devices
> present in the system and computing PCI_INTERRUPT_LINE from
> PCI_INTERRUPT_PIN, the slot/position of the device, and the available
> host IRQs (for an example, see SeaBIOS pci_bios_init_devices() in
> src/fw/pciinit.c). At the time of this patch, the relevant bits of
> OVMF PCI initialization are shown in the following call tree:
>
>   PlatformBdsPolicyBehavior ()
>   {
>     ...
>     ConnectRootBridge ()
>     {
>       ...
>       gBS->ConnectController()  // PCI bus is enumerated from this call
>       ...
>     }
>     ...
>     PlatformBdsConnectSequence ()
>     {
>       ...
>       PciAcpiInitialization()   // PCI initialization affected by this patch
>       ...
>     }
>     ...
>   }
>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Gabriel Somlo <so...@cmu.edu>
> ---
>  OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c      | 111 
> +++++++++++++---------
>  OvmfPkg/Library/PlatformBdsLib/BdsPlatform.h      |   2 +
>  OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf |   1 +
>  3 files changed, 67 insertions(+), 47 deletions(-)
>
> diff --git a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c 
> b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
> index 2a1ca88..02439a3 100644
> --- a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
> +++ b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
> @@ -717,63 +717,81 @@ Returns:
>
>
>  VOID
> -PciInitialization (
> +PciAcpiInitialization (
>    )
>  {
> -  //
> -  // Bus 0, Device 0, Function 0 - Host to PCI Bridge
> -  //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 0, 0, 0x3c), 0x00);
> -
> -  //
> -  // Bus 0, Device 1, Function 0 - PCI to ISA Bridge
> -  //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x3c), 0x00);
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x60), 0x0b); // LNKA routing target
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x61), 0x0b); // LNKB routing target
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x62), 0x0a); // LNKC routing target
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x63), 0x0a); // LNKD routing target
> -
> -  //
> -  // Bus 0, Device 1, Function 1 - IDE Controller
> -  //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 1, 0x3c), 0x00);
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 1, 0x0d), 0x40);
> +  UINT16 HostBridgeDevId;
> +  UINTN  PMBA;
>
>    //
> -  // Bus 0, Device 1, Function 3 - Power Managment Controller
> +  // Query Host Bridge DID to determine platform type
>    //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 3, 0x3c), 0x09);
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 1, 3, 0x3d), 0x01); // INTA
> -
> -  //
> -  // Bus 0, Device 2, Function 0 - Video Controller
> -  //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 2, 0, 0x3c), 0x00);
> +  HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);
> +  switch (HostBridgeDevId) {
> +    case INTEL_82441_DEVICE_ID:
> +      PMBA = POWER_MGMT_REGISTER_PIIX4 (0x40);
> +      //
> +      // 00:01.0 ISA Bridge (PIIX4) LNK routing targets
> +      //
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x60), 0x0b); // A
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x61), 0x0b); // B
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x62), 0x0a); // C
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 1, 0, 0x63), 0x0a); // D
> +      break;
> +    case INTEL_Q35_MCH_DEVICE_ID:
> +      PMBA = POWER_MGMT_REGISTER_Q35 (0x40);
> +      //
> +      // 00:1f.0 LPC Bridge (Q35) LNK routing targets
> +      //
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x60), 0x0a); // A
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x61), 0x0a); // B
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x62), 0x0b); // C
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x63), 0x0b); // D
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x68), 0x0a); // E
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x69), 0x0a); // F
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x6a), 0x0b); // G
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x6b), 0x0b); // H
> +      break;
> +    default:
> +      DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n",
> +        __FUNCTION__, HostBridgeDevId));
> +      ASSERT (FALSE);
> +  }
>
>    //
> -  // Bus 0, Device 3, Function 0 - Network Controller
> +  // Set ACPI SCI_EN bit in PMCNTRL
>    //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 3, 0, 0x3c), 0x0a);
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 3, 0, 0x3d), 0x01); // INTA (-> LNKC)
> +  IoOr16 ((PciRead32 (PMBA) & ~BIT0) + 4, BIT0);
>
>    //
> -  // Bus 0, Device 5, Function 0 - RAM Memory
> +  // Initialize PCI_INTERRUPT_LINE for most commonly encountered devices
>    //
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 5, 0, 0x3c), 0x0b);
> -  PciWrite8 (PCI_LIB_ADDRESS (0, 5, 0, 0x3d), 0x01); // INTA (-> LNKA)
> -}
> -
> -
> -VOID
> -AcpiInitialization (
> -  VOID
> -  )
> -{
> -  //
> -  // Set ACPI SCI_EN bit in PMCNTRL
> +  // FIXME: This should be accomplished programmatically by enumerating
> +  //        all PCI devices present in the system and computing
> +  //        PCI_INTERRUPT_LINE from PCI_INTERRUPT_PIN, the slot/position
> +  //        of the device, and the available host IRQs (for an example,
> +  //        see SeaBIOS pci_bios_init_devices() in src/fw/pciinit.c)
>    //
> -  IoOr16 ((PciRead32 (PCI_LIB_ADDRESS (0, 1, 3, 0x40)) & ~BIT0) + 4, BIT0);
> +  switch (HostBridgeDevId) {
> +    case INTEL_82441_DEVICE_ID:
> +      PciWrite8 (PCI_LIB_ADDRESS (0,    1, 2, 0x3c), 0x0b);
> +      PciWrite8 (PCI_LIB_ADDRESS (0,    1, 3, 0x3c), 0x0a);
> +      PciWrite8 (PCI_LIB_ADDRESS (0,    3, 0, 0x3c), 0x0b);
> +      PciWrite8 (PCI_LIB_ADDRESS (0,    4, 0, 0x3c), 0x0b);
> +      PciWrite8 (PCI_LIB_ADDRESS (0,    5, 0, 0x3c), 0x0a);
> +      break;
> +    case INTEL_Q35_MCH_DEVICE_ID:
> +      PciWrite8 (PCI_LIB_ADDRESS (0,    2, 0, 0x3c), 0x0b);
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1d, 0, 0x3c), 0x0a);
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1d, 1, 0x3c), 0x0a);
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1d, 2, 0x3c), 0x0b);
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1d, 7, 0x3c), 0x0b);
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 2, 0x3c), 0x0a);
> +      PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 3, 0x3c), 0x0a);
> +      break;
> +    default:
> +      ASSERT (FALSE); // should never be reached
> +  }
>  }
>
>
> @@ -938,8 +956,7 @@ Returns:
>    //
>    BdsLibConnectAll ();
>
> -  PciInitialization ();
> -  AcpiInitialization ();
> +  PciAcpiInitialization ();
>
>    //
>    // Clear the logo after all devices are connected.
> diff --git a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.h 
> b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.h
> index 72b0e14..7006fb3 100644
> --- a/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.h
> +++ b/OvmfPkg/Library/PlatformBdsLib/BdsPlatform.h
> @@ -59,6 +59,8 @@ Abstract:
>  #include <Guid/HobList.h>
>  #include <Guid/GlobalVariable.h>
>
> +#include <OvmfPlatforms.h>
> +
>  extern BDS_CONSOLE_CONNECT_ENTRY  gPlatformConsole[];
>  extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformConnectSequence[];
>  extern EFI_DEVICE_PATH_PROTOCOL   *gPlatformDriverOption[];
> diff --git a/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf 
> b/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
> index a2b72ba..03f5b22 100644
> --- a/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
> +++ b/OvmfPkg/Library/PlatformBdsLib/PlatformBdsLib.inf
> @@ -58,6 +58,7 @@
>    gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile
>    gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable
> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
>
>  [Pcd.IA32, Pcd.X64]
>    gEfiMdePkgTokenSpaceGuid.PcdFSBClock
> --
> 1.9.3
>

------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to