On Wed, Aug 19, 2020 at 20:00:00 +0530, Tanmay Jagdale wrote:
> Add PCI related entries to DSDT table along with the routing
> entries. Also add the MCFG table.
> 
> Co-authored-by: Graeme Gregory <graeme.greg...@linaro.org>
> Signed-off-by: Tanmay Jagdale <tanmay.jagd...@linaro.org>
> ---
>  .../Qemu/SbsaQemu/AcpiTables/AcpiTables.inf   |   1 +
>  Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl     | 316 ++++++++++++++++++
>  Silicon/Qemu/SbsaQemu/AcpiTables/Mcfg.aslc    |  43 +++
>  3 files changed, 360 insertions(+)
>  create mode 100644 Silicon/Qemu/SbsaQemu/AcpiTables/Mcfg.aslc
> 
> diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf 
> b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
> index ee524895524e..0b5017ce81c5 100644
> --- a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
> +++ b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf
> @@ -20,6 +20,7 @@ [Sources]
>    Fadt.aslc
>    Gtdt.aslc
>    Spcr.aslc
> +  Mcfg.aslc

Please insert alphabetically sorted.

>  
>  [Packages]
>    ArmPlatformPkg/ArmPlatformPkg.dec
> diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl 
> b/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl
> index 85339d4559d3..2d3d4a2ddedc 100644
> --- a/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl
> +++ b/Silicon/Qemu/SbsaQemu/AcpiTables/Dsdt.asl
> @@ -8,6 +8,23 @@
>  
>  #include <IndustryStandard/SbsaQemuAcpi.h>
>  
> +#define LINK_DEVICE(Uid, LinkName, Irq)                                      
>   \
> +        Device (LinkName) {                                                  
>   \
> +            Name (_HID, EISAID("PNP0C0F"))                                   
>   \
> +            Name (_UID, Uid)                                                 
>   \
> +            Name (_PRS, ResourceTemplate() {                                 
>   \
> +                Interrupt (ResourceProducer, Level, ActiveHigh, Exclusive) { 
> Irq } \
> +            })                                                               
>   \
> +            Method (_CRS, 0) { Return (_PRS) }                               
>   \
> +            Method (_SRS, 1) { }                                             
>   \
> +            Method (_DIS) { }                                                
>   \
> +        }
> +
> +#define PRT_ENTRY(Address, Pin, Link)                                        
>   \
> +        Package (4) {                                                        
>   \
> +            Address, Pin, Link, Zero                                         
>   \
> +          }
> +
>  DefinitionBlock ("DsdtTable.aml", "DSDT", 1, "LINARO", "SBSAQEMU",
>                   FixedPcdGet32 (PcdAcpiDefaultOemRevision)) {
>    Scope (_SB) {
> @@ -129,5 +146,304 @@ DefinitionBlock ("DsdtTable.aml", "DSDT", 1, "LINARO", 
> "SBSAQEMU",
>          } // USB0_RHUB
>      } // USB0
>  
> +    Device (PCI0)
> +    {
> +      Name (_HID, EISAID ("PNP0A08")) // PCI Express Root Bridge
> +      Name (_CID, EISAID ("PNP0A03")) // Compatible PCI Root Bridge
> +      Name (_SEG, Zero) // PCI Segment Group number
> +      Name (_BBN, Zero) // PCI Base Bus Number
> +      Name (_ADR, Zero)
> +      Name (_UID, "PCI0")
> +      Name (_CCA, One)    // Initially mark the PCI coherent (for JunoR1)
> +
> +      Method (_CBA, 0, NotSerialized) {
> +          return (0xf0000000)
> +      }
> +
> +      LINK_DEVICE(0, GSI0, 0x23)
> +      LINK_DEVICE(1, GSI1, 0x24)
> +      LINK_DEVICE(2, GSI2, 0x25)
> +      LINK_DEVICE(3, GSI3, 0x26)
> +
> +      Name (_PRT, Package ()  // _PRT: PCI Routing Table
> +      {
> +        PRT_ENTRY(0x0000FFFF, 0, GSI0),
> +        PRT_ENTRY(0x0000FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0000FFFF, 0, GSI2),
> +        PRT_ENTRY(0x0000FFFF, 0, GSI3),
> +
> +        PRT_ENTRY(0x0001FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0001FFFF, 1, GSI2),
> +        PRT_ENTRY(0x0001FFFF, 2, GSI3),
> +        PRT_ENTRY(0x0001FFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x0002FFFF, 0, GSI2),
> +        PRT_ENTRY(0x0002FFFF, 1, GSI3),
> +        PRT_ENTRY(0x0002FFFF, 2, GSI0),
> +        PRT_ENTRY(0x0002FFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x0003FFFF, 0, GSI3),
> +        PRT_ENTRY(0x0003FFFF, 1, GSI0),
> +        PRT_ENTRY(0x0003FFFF, 2, GSI1),
> +        PRT_ENTRY(0x0003FFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x0004FFFF, 0, GSI0),
> +        PRT_ENTRY(0x0004FFFF, 1, GSI1),
> +        PRT_ENTRY(0x0004FFFF, 2, GSI2),
> +        PRT_ENTRY(0x0004FFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x0005FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0005FFFF, 1, GSI2),
> +        PRT_ENTRY(0x0005FFFF, 2, GSI3),
> +        PRT_ENTRY(0x0005FFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x0006FFFF, 0, GSI2),
> +        PRT_ENTRY(0x0006FFFF, 1, GSI3),
> +        PRT_ENTRY(0x0006FFFF, 2, GSI0),
> +        PRT_ENTRY(0x0006FFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x0007FFFF, 0, GSI3),
> +        PRT_ENTRY(0x0007FFFF, 1, GSI0),
> +        PRT_ENTRY(0x0007FFFF, 2, GSI1),
> +        PRT_ENTRY(0x0007FFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x0008FFFF, 0, GSI0),
> +        PRT_ENTRY(0x0008FFFF, 1, GSI1),
> +        PRT_ENTRY(0x0008FFFF, 2, GSI2),
> +        PRT_ENTRY(0x0008FFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x0009FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0009FFFF, 1, GSI2),
> +        PRT_ENTRY(0x0009FFFF, 2, GSI3),
> +        PRT_ENTRY(0x0009FFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x000AFFFF, 0, GSI2),
> +        PRT_ENTRY(0x000AFFFF, 1, GSI3),
> +        PRT_ENTRY(0x000AFFFF, 2, GSI0),
> +        PRT_ENTRY(0x000AFFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x000BFFFF, 0, GSI3),
> +        PRT_ENTRY(0x000BFFFF, 1, GSI0),
> +        PRT_ENTRY(0x000BFFFF, 2, GSI1),
> +        PRT_ENTRY(0x000BFFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x000CFFFF, 0, GSI0),
> +        PRT_ENTRY(0x000CFFFF, 1, GSI1),
> +        PRT_ENTRY(0x000CFFFF, 2, GSI2),
> +        PRT_ENTRY(0x000CFFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x000DFFFF, 0, GSI1),
> +        PRT_ENTRY(0x000DFFFF, 1, GSI2),
> +        PRT_ENTRY(0x000DFFFF, 2, GSI3),
> +        PRT_ENTRY(0x000DFFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x000EFFFF, 0, GSI2),
> +        PRT_ENTRY(0x000EFFFF, 1, GSI3),
> +        PRT_ENTRY(0x000EFFFF, 2, GSI0),
> +        PRT_ENTRY(0x000EFFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x000FFFFF, 0, GSI3),
> +        PRT_ENTRY(0x000FFFFF, 1, GSI0),
> +        PRT_ENTRY(0x000FFFFF, 2, GSI1),
> +        PRT_ENTRY(0x000FFFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x0010FFFF, 0, GSI0),
> +        PRT_ENTRY(0x0010FFFF, 1, GSI1),
> +        PRT_ENTRY(0x0010FFFF, 2, GSI2),
> +        PRT_ENTRY(0x0010FFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x0011FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0011FFFF, 1, GSI2),
> +        PRT_ENTRY(0x0011FFFF, 2, GSI3),
> +        PRT_ENTRY(0x0011FFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x0012FFFF, 0, GSI2),
> +        PRT_ENTRY(0x0012FFFF, 1, GSI3),
> +        PRT_ENTRY(0x0012FFFF, 2, GSI0),
> +        PRT_ENTRY(0x0012FFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x0013FFFF, 0, GSI3),
> +        PRT_ENTRY(0x0013FFFF, 1, GSI0),
> +        PRT_ENTRY(0x0013FFFF, 2, GSI1),
> +        PRT_ENTRY(0x0013FFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x0014FFFF, 0, GSI0),
> +        PRT_ENTRY(0x0014FFFF, 1, GSI1),
> +        PRT_ENTRY(0x0014FFFF, 2, GSI2),
> +        PRT_ENTRY(0x0014FFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x0015FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0015FFFF, 1, GSI2),
> +        PRT_ENTRY(0x0015FFFF, 2, GSI3),
> +        PRT_ENTRY(0x0015FFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x0016FFFF, 0, GSI2),
> +        PRT_ENTRY(0x0016FFFF, 1, GSI3),
> +        PRT_ENTRY(0x0016FFFF, 2, GSI0),
> +        PRT_ENTRY(0x0016FFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x0017FFFF, 0, GSI3),
> +        PRT_ENTRY(0x0017FFFF, 1, GSI0),
> +        PRT_ENTRY(0x0017FFFF, 2, GSI1),
> +        PRT_ENTRY(0x0017FFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x0018FFFF, 0, GSI0),
> +        PRT_ENTRY(0x0018FFFF, 1, GSI1),
> +        PRT_ENTRY(0x0018FFFF, 2, GSI2),
> +        PRT_ENTRY(0x0018FFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x0019FFFF, 0, GSI1),
> +        PRT_ENTRY(0x0019FFFF, 1, GSI2),
> +        PRT_ENTRY(0x0019FFFF, 2, GSI3),
> +        PRT_ENTRY(0x0019FFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x001AFFFF, 0, GSI2),
> +        PRT_ENTRY(0x001AFFFF, 1, GSI3),
> +        PRT_ENTRY(0x001AFFFF, 2, GSI0),
> +        PRT_ENTRY(0x001AFFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x001BFFFF, 0, GSI3),
> +        PRT_ENTRY(0x001BFFFF, 1, GSI0),
> +        PRT_ENTRY(0x001BFFFF, 2, GSI1),
> +        PRT_ENTRY(0x001BFFFF, 3, GSI2),
> +
> +        PRT_ENTRY(0x001CFFFF, 0, GSI0),
> +        PRT_ENTRY(0x001CFFFF, 1, GSI1),
> +        PRT_ENTRY(0x001CFFFF, 2, GSI2),
> +        PRT_ENTRY(0x001CFFFF, 3, GSI3),
> +
> +        PRT_ENTRY(0x001DFFFF, 0, GSI1),
> +        PRT_ENTRY(0x001DFFFF, 1, GSI2),
> +        PRT_ENTRY(0x001DFFFF, 2, GSI3),
> +        PRT_ENTRY(0x001DFFFF, 3, GSI0),
> +
> +        PRT_ENTRY(0x001EFFFF, 0, GSI2),
> +        PRT_ENTRY(0x001EFFFF, 1, GSI3),
> +        PRT_ENTRY(0x001EFFFF, 2, GSI0),
> +        PRT_ENTRY(0x001EFFFF, 3, GSI1),
> +
> +        PRT_ENTRY(0x001FFFFF, 0, GSI3),
> +        PRT_ENTRY(0x001FFFFF, 1, GSI0),
> +        PRT_ENTRY(0x001FFFFF, 2, GSI1),
> +        PRT_ENTRY(0x001FFFFF, 3, GSI2),
> +      })
> +
> +      // Root complex resources
> +      Method (_CRS, 0, Serialized) {
> +      Name (RBUF, ResourceTemplate () {
> +        WordBusNumber ( // Bus numbers assigned to this root
> +        ResourceProducer,
> +        MinFixed, MaxFixed, PosDecode,
> +        0,   // AddressGranularity
> +        0,   // AddressMinimum - Minimum Bus Number
> +        255, // AddressMaximum - Maximum Bus Number
> +        0,   // AddressTranslation - Set to 0
> +        256  // RangeLength - Number of Busses
> +        )
> +
> +        DWordMemory ( // 32-bit BAR Windows
> +          ResourceProducer, PosDecode,
> +          MinFixed, MaxFixed,
> +          Cacheable, ReadWrite,
> +          0x00000000,                          // Granularity
> +          0x80000000,                          // Min Base Address
> +          0xEFFFFFFF,                          // Max Base Address
> +          0x00000000,                          // Translate
> +          0x70000000                           // Length
> +          )
> +
> +        QWordMemory ( // 64-bit BAR Windows
> +          ResourceProducer, PosDecode,
> +          MinFixed, MaxFixed,
> +          Cacheable, ReadWrite,
> +          0x00000000,                          // Granularity
> +          0x100000000,                        // Min Base Address
> +          0xFFFFFFFFFF,                        // Max Base Address
> +          0x00000000,                          // Translate
> +          0xFF00000000                          // Length

Plese clean up horizontal alignment of comments.

/
    Leif

> +          )
> +
> +        DWordIo ( // IO window
> +          ResourceProducer,
> +          MinFixed,
> +          MaxFixed,
> +          PosDecode,
> +          EntireRange,
> +          0x00000000,                          // Granularity
> +          0x00000000,                          // Min Base Address
> +          0x0000ffff,                          // Max Base Address
> +          0x7fff0000,                          // Translate
> +          0x00010000,                          // Length
> +          ,,,TypeTranslation
> +          )
> +        }) // Name(RBUF)
> +
> +        Return (RBUF)
> +      } // Method(_CRS)
> +
> +      Device (RES0)
> +      {
> +        Name (_HID, "PNP0C02" /* PNP Motherboard Resources */)  // _HID: 
> Hardware ID
> +        Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
> +        {
> +           QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, 
> NonCacheable, ReadWrite,
> +           0x0000000000000000, // Granularity
> +           0x00000000F0000000, // Range Minimum
> +           0x00000000FFFFFFFF, // Range Maximum
> +           0x0000000000000000, // Translation Offset
> +           0x0000000010000000, // Length
> +           ,, , AddressRangeMemory, TypeStatic)
> +        })
> +      }
> +
> +      // OS Control Handoff
> +      Name (SUPP, Zero) // PCI _OSC Support Field value
> +      Name (CTRL, Zero) // PCI _OSC Control Field value
> +
> +      /*
> +       * See [1] 6.2.10, [2] 4.5
> +       */
> +      Method (_OSC,4) {
> +        // Check for proper UUID
> +        If (LEqual(Arg0,ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {
> +          // Create DWord-adressable fields from the Capabilities Buffer
> +          CreateDWordField (Arg3,0,CDW1)
> +          CreateDWordField (Arg3,4,CDW2)
> +          CreateDWordField (Arg3,8,CDW3)
> +
> +          // Save Capabilities DWord2 & 3
> +          Store (CDW2,SUPP)
> +          Store (CDW3,CTRL)
> +
> +          // Only allow native hot plug control if OS supports:
> +          // * ASPM
> +          // * Clock PM
> +          // * MSI/MSI-X
> +          If (LNotEqual(And(SUPP, 0x16), 0x16)) {
> +            And (CTRL,0x1E,CTRL) // Mask bit 0 (and undefined bits)
> +          }
> +
> +          // Always allow native PME, AER (no dependencies)
> +
> +          // Never allow SHPC (no SHPC controller in this system)
> +          And (CTRL,0x1D,CTRL)
> +
> +          If (LNotEqual(Arg1,One)) {        // Unknown revision
> +            Or (CDW1,0x08,CDW1)
> +          }
> +
> +          If (LNotEqual(CDW3,CTRL)) {        // Capabilities bits were masked
> +            Or (CDW1,0x10,CDW1)
> +          }
> +
> +          // Update DWORD3 in the buffer
> +          Store (CTRL,CDW3)
> +          Return (Arg3)
> +        } Else {
> +          Or (CDW1,4,CDW1) // Unrecognized UUID
> +          Return (Arg3)
> +        }
> +      } // End _OSC
> +    }
>    } // Scope (_SB)
>  }
> diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Mcfg.aslc 
> b/Silicon/Qemu/SbsaQemu/AcpiTables/Mcfg.aslc
> new file mode 100644
> index 000000000000..e78061f9fe1c
> --- /dev/null
> +++ b/Silicon/Qemu/SbsaQemu/AcpiTables/Mcfg.aslc
> @@ -0,0 +1,43 @@
> +/** @file
> +*  ACPI Memory mapped configuration space base address Description Table 
> (MCFG).
> +*
> +*  Copyright (c) 2020, Linaro Limited. All rights reserved.
> +*
> +*  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <IndustryStandard/Acpi61.h>
> +#include <IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h>
> +#include <IndustryStandard/SbsaQemuAcpi.h>
> +
> +#pragma pack(push, 1)
> +
> +typedef struct {
> +  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_BASE_ADDRESS_TABLE_HEADER Header;
> +  
> EFI_ACPI_MEMORY_MAPPED_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE
>  Structure[2];
> +} EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_DESCRIPTION_TABLE;
> +
> +EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_DESCRIPTION_TABLE Mcfg = {
> +  {
> +    SBSAQEMU_ACPI_HEADER (
> +      
> EFI_ACPI_6_0_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,
> +      EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_DESCRIPTION_TABLE,
> +      EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION),
> +    EFI_ACPI_RESERVED_QWORD
> +  },
> +  {
> +    {
> +      SBSAQEMU_PCI_SEG0_CONFIG_BASE,
> +      0,
> +      SBSAQEMU_PCI_SEG0_BUSNUM_MIN,
> +      SBSAQEMU_PCI_SEG0_BUSNUM_MAX,
> +      EFI_ACPI_RESERVED_DWORD
> +    }
> +  }
> +};
> +
> +#pragma pack(pop)
> +
> +// Reference the table being generated to prevent the optimizer
> +// from removing the data structure from the executable
> +VOID* CONST ReferenceAcpiTable = &Mcfg;
> -- 
> 2.28.0
> 

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#64495): https://edk2.groups.io/g/devel/message/64495
Mute This Topic: https://groups.io/mt/76287446/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to