On Wed, Oct 25, 2017 at 06:59:44PM +0100, Ard Biesheuvel wrote:
> The ACPI hack to support the broken Synopsys IP only works for endpoints,
> not for non-trivial topologies involving switches. Given that the Linaro
> developer board has a switch soldered on, there is really no way to do
> anything useful with it when booting via ACPI. On top of that, the ITS
> can only be enabled for a single RC.
> 
> So let's hide PCIe domain #0 entirely from the OS. We may be able to
> expose the USB and SATA ports at some point using another ungodly hack,
> but for now, this allows us to boot the board with unmodified installers
> and install onto NVME.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>

Sounds plausible, but ... Graeme?

/
    Leif

> ---
>  Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl | 264 
> ++++++++++----------
>  Silicon/Socionext/SynQuacer/AcpiTables/Iort.aslc           |  44 ++--
>  Silicon/Socionext/SynQuacer/AcpiTables/Mcfg.aslc           |  14 +-
>  3 files changed, 161 insertions(+), 161 deletions(-)
> 
> diff --git a/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl 
> b/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl
> index fb845d2c107e..3e231e10f7dd 100644
> --- a/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl
> +++ b/Silicon/Socionext/SynQuacer/AcpiTables/AcpiSsdtRootPci.asl
> @@ -25,138 +25,138 @@ DefinitionBlock("SsdtPci.aml", "SSDT", 1, "SNI", 
> "SYNQUACR", EFI_ACPI_OEM_REVISI
>      //
>      // PCI Root Complex
>      //
> -    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(_CCA, 1)                   // Cache Coherency Attribute
> -
> -        // PCI Routing Table
> -        Name(_PRT, Package() {
> -            Package () { 0xFFFF, 0, Zero, 222 },   // INTA
> -            Package () { 0xFFFF, 1, Zero, 222 },   // INTB
> -            Package () { 0xFFFF, 2, Zero, 222 },   // INTC
> -            Package () { 0xFFFF, 3, Zero, 222 },   // INTD
> -        })
> -        // Root complex resources
> -        Method (_CRS, 0, Serialized) {
> -            Name (RBUF, ResourceTemplate () {
> -                WordBusNumber ( // Bus numbers assigned to this root
> -                    ResourceProducer,
> -                    MinFixed, MaxFixed, PosDecode,
> -                    0,                              // AddressGranularity
> -                    SYNQUACER_PCI_SEG0_BUSNUM_MIN,  // AddressMinimum - 
> Minimum Bus Number
> -                    SYNQUACER_PCI_SEG0_BUSNUM_MIN,  // AddressMaximum - 
> Maximum Bus Number
> -                    0,                              // AddressTranslation - 
> Set to 0
> -                    1                               // RangeLength - Number 
> of Busses
> -                )
> -
> -                DWordMemory ( // 32-bit BAR Windows
> -                    ResourceProducer, PosDecode,
> -                    MinFixed, MaxFixed,
> -                    Cacheable, ReadWrite,
> -                    0x00000000,                         // Granularity
> -                    SYNQUACER_PCI_SEG0_MMIO32_MIN,      // Min Base Address
> -                    SYNQUACER_PCI_SEG0_MMIO32_MAX,      // Max Base Address
> -                    0x00000000,                         // Translate
> -                    SYNQUACER_PCI_SEG0_MMIO32_SIZE      // Length
> -                )
> -
> -                QWordMemory ( // 64-bit BAR Windows
> -                    ResourceProducer, PosDecode,
> -                    MinFixed, MaxFixed,
> -                    Cacheable, ReadWrite,
> -                    0x00000000,                         // Granularity
> -                    SYNQUACER_PCI_SEG0_MMIO64_MIN,      // Min Base Address
> -                    SYNQUACER_PCI_SEG0_MMIO64_MAX,      // Max Base Address
> -                    0x00000000,                         // Translate
> -                    SYNQUACER_PCI_SEG0_MMIO64_SIZE      // Length
> -                )
> -
> -                DWordIo ( // IO window
> -                    ResourceProducer,
> -                    MinFixed,
> -                    MaxFixed,
> -                    PosDecode,
> -                    EntireRange,
> -                    0x00000000,                         // Granularity
> -                    SYNQUACER_PCI_SEG0_PORTIO_MIN,      // Min Base Address
> -                    SYNQUACER_PCI_SEG0_PORTIO_MAX,      // Max Base Address
> -                    SYNQUACER_PCI_SEG0_PORTIO_MEMBASE,  // Translate
> -                    SYNQUACER_PCI_SEG0_PORTIO_SIZE,     // Length
> -                    ,
> -                    ,
> -                    ,
> -                    TypeTranslation
> -                )
> -            }) // Name(RBUF)
> -
> -            Return (RBUF)
> -        } // Method(_CRS)
> -
> -        Device (RES0)
> -        {
> -            Name (_HID, "PNP0C02")
> -            Name (_CRS, ResourceTemplate ()
> -            {
> -                Memory32Fixed (ReadWrite,
> -                               SYNQUACER_PCI_SEG0_CONFIG_BASE,
> -                               SYNQUACER_PCI_SEG0_CONFIG_SIZE)
> -            })
> -        }
> -
> -        //
> -        // 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
> -    } // PCI0
> +//    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(_CCA, 1)                   // Cache Coherency Attribute
> +//
> +//        // PCI Routing Table
> +//        Name(_PRT, Package() {
> +//            Package () { 0xFFFF, 0, Zero, 222 },   // INTA
> +//            Package () { 0xFFFF, 1, Zero, 222 },   // INTB
> +//            Package () { 0xFFFF, 2, Zero, 222 },   // INTC
> +//            Package () { 0xFFFF, 3, Zero, 222 },   // INTD
> +//        })
> +//        // Root complex resources
> +//        Method (_CRS, 0, Serialized) {
> +//            Name (RBUF, ResourceTemplate () {
> +//                WordBusNumber ( // Bus numbers assigned to this root
> +//                    ResourceProducer,
> +//                    MinFixed, MaxFixed, PosDecode,
> +//                    0,                              // AddressGranularity
> +//                    SYNQUACER_PCI_SEG0_BUSNUM_MIN,  // AddressMinimum - 
> Minimum Bus Number
> +//                    SYNQUACER_PCI_SEG0_BUSNUM_MIN,  // AddressMaximum - 
> Maximum Bus Number
> +//                    0,                              // AddressTranslation 
> - Set to 0
> +//                    1                               // RangeLength - 
> Number of Busses
> +//                )
> +//
> +//                DWordMemory ( // 32-bit BAR Windows
> +//                    ResourceProducer, PosDecode,
> +//                    MinFixed, MaxFixed,
> +//                    Cacheable, ReadWrite,
> +//                    0x00000000,                         // Granularity
> +//                    SYNQUACER_PCI_SEG0_MMIO32_MIN,      // Min Base Address
> +//                    SYNQUACER_PCI_SEG0_MMIO32_MAX,      // Max Base Address
> +//                    0x00000000,                         // Translate
> +//                    SYNQUACER_PCI_SEG0_MMIO32_SIZE      // Length
> +//                )
> +//
> +//                QWordMemory ( // 64-bit BAR Windows
> +//                    ResourceProducer, PosDecode,
> +//                    MinFixed, MaxFixed,
> +//                    Cacheable, ReadWrite,
> +//                    0x00000000,                         // Granularity
> +//                    SYNQUACER_PCI_SEG0_MMIO64_MIN,      // Min Base Address
> +//                    SYNQUACER_PCI_SEG0_MMIO64_MAX,      // Max Base Address
> +//                    0x00000000,                         // Translate
> +//                    SYNQUACER_PCI_SEG0_MMIO64_SIZE      // Length
> +//                )
> +//
> +//                DWordIo ( // IO window
> +//                    ResourceProducer,
> +//                    MinFixed,
> +//                    MaxFixed,
> +//                    PosDecode,
> +//                    EntireRange,
> +//                    0x00000000,                         // Granularity
> +//                    SYNQUACER_PCI_SEG0_PORTIO_MIN,      // Min Base Address
> +//                    SYNQUACER_PCI_SEG0_PORTIO_MAX,      // Max Base Address
> +//                    SYNQUACER_PCI_SEG0_PORTIO_MEMBASE,  // Translate
> +//                    SYNQUACER_PCI_SEG0_PORTIO_SIZE,     // Length
> +//                    ,
> +//                    ,
> +//                    ,
> +//                    TypeTranslation
> +//                )
> +//            }) // Name(RBUF)
> +//
> +//            Return (RBUF)
> +//        } // Method(_CRS)
> +//
> +//        Device (RES0)
> +//        {
> +//            Name (_HID, "PNP0C02")
> +//            Name (_CRS, ResourceTemplate ()
> +//            {
> +//                Memory32Fixed (ReadWrite,
> +//                               SYNQUACER_PCI_SEG0_CONFIG_BASE,
> +//                               SYNQUACER_PCI_SEG0_CONFIG_SIZE)
> +//            })
> +//        }
> +//
> +//        //
> +//        // 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
> +//    } // PCI0
>  
>      Device(PCI1)
>      {
> diff --git a/Silicon/Socionext/SynQuacer/AcpiTables/Iort.aslc 
> b/Silicon/Socionext/SynQuacer/AcpiTables/Iort.aslc
> index bbb425f1f808..307c93c197ac 100644
> --- a/Silicon/Socionext/SynQuacer/AcpiTables/Iort.aslc
> +++ b/Silicon/Socionext/SynQuacer/AcpiTables/Iort.aslc
> @@ -39,7 +39,7 @@ typedef struct {
>    EFI_ACPI_6_0_IO_REMAPPING_TABLE           Iort;
>    SYNQUACER_ITS_NODE                        ItsNode;
>    //SYNQUACER_SMMU_NODE                       Smmu;
> -  SYNQUACER_RC_NODE                         RcNode[2];
> +  SYNQUACER_RC_NODE                         RcNode[1];
>  } SYNQUACER_IO_REMAPPING_STRUCTURE;
>  
>  #define __SYNQUACER_SMMU_NODE(Base, Size, Irq, NumIds)      \
> @@ -91,7 +91,7 @@ STATIC SYNQUACER_IO_REMAPPING_STRUCTURE Iort = {
>      __ACPI_HEADER(EFI_ACPI_6_0_IO_REMAPPING_TABLE_SIGNATURE,
>                    SYNQUACER_IO_REMAPPING_STRUCTURE,
>                    EFI_ACPI_IO_REMAPPING_TABLE_REVISION),
> -    3,                                              // NumNodes
> +    2,                                              // NumNodes
>      sizeof(EFI_ACPI_6_0_IO_REMAPPING_TABLE),        // NodeOffset
>      0                                               // Reserved
>    }, {
> @@ -115,26 +115,26 @@ STATIC SYNQUACER_IO_REMAPPING_STRUCTURE Iort = {
>  //  }, {
>      // PciRcNode
>      {
> -      {
> -        {
> -          EFI_ACPI_IORT_TYPE_ROOT_COMPLEX,                    // Type
> -          sizeof(SYNQUACER_RC_NODE),                          // Length
> -          0x0,                                                // Revision
> -          0x0,                                                // Reserved
> -          0x1,                                                // 
> NumIdMappings
> -          FIELD_OFFSET(SYNQUACER_RC_NODE, RcIdMapping),       // IdReference
> -        },
> -        EFI_ACPI_IORT_MEM_ACCESS_PROP_CCA,                    // 
> CacheCoherent
> -        0x0,                                                  // 
> AllocationHints
> -        0x0,                                                  // Reserved
> -        EFI_ACPI_IORT_MEM_ACCESS_FLAGS_CPM |
> -        EFI_ACPI_IORT_MEM_ACCESS_FLAGS_DACS,                  // 
> MemoryAccessFlags
> -        EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED,           // AtsAttribute
> -        0x0,                                                  // 
> PciSegmentNumber
> -      }, {
> -        __SYNQUACER_ID_MAPPING(0x0, 0x0, 0x0, ItsNode, 
> EFI_ACPI_IORT_ID_MAPPING_FLAGS_SINGLE),
> -      },
> -    }, {
> +//      {
> +//        {
> +//          EFI_ACPI_IORT_TYPE_ROOT_COMPLEX,                    // Type
> +//          sizeof(SYNQUACER_RC_NODE),                          // Length
> +//          0x0,                                                // Revision
> +//          0x0,                                                // Reserved
> +//          0x1,                                                // 
> NumIdMappings
> +//          FIELD_OFFSET(SYNQUACER_RC_NODE, RcIdMapping),       // 
> IdReference
> +//        },
> +//        EFI_ACPI_IORT_MEM_ACCESS_PROP_CCA,                    // 
> CacheCoherent
> +//        0x0,                                                  // 
> AllocationHints
> +//        0x0,                                                  // Reserved
> +//        EFI_ACPI_IORT_MEM_ACCESS_FLAGS_CPM |
> +//        EFI_ACPI_IORT_MEM_ACCESS_FLAGS_DACS,                  // 
> MemoryAccessFlags
> +//        EFI_ACPI_IORT_ROOT_COMPLEX_ATS_UNSUPPORTED,           // 
> AtsAttribute
> +//        0x0,                                                  // 
> PciSegmentNumber
> +//      }, {
> +//        __SYNQUACER_ID_MAPPING(0x0, 0x0, 0x0, ItsNode, 
> EFI_ACPI_IORT_ID_MAPPING_FLAGS_SINGLE),
> +//      },
> +//    }, {
>        // PciRcNode
>        {
>          {
> diff --git a/Silicon/Socionext/SynQuacer/AcpiTables/Mcfg.aslc 
> b/Silicon/Socionext/SynQuacer/AcpiTables/Mcfg.aslc
> index 00df5f181de3..5e18548892ae 100644
> --- a/Silicon/Socionext/SynQuacer/AcpiTables/Mcfg.aslc
> +++ b/Silicon/Socionext/SynQuacer/AcpiTables/Mcfg.aslc
> @@ -27,7 +27,7 @@
>  
>  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_ENHANCED_CONFIGURATION_SPACE_BASE_ADDRESS_ALLOCATION_STRUCTURE
>  Structure[1];
>  } EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_DESCRIPTION_TABLE;
>  
>  EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_DESCRIPTION_TABLE Mcfg = {
> @@ -39,12 +39,12 @@ 
> EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_DESCRIPTION_TABLE Mcfg = {
>    },
>    {
>      {
> -      SYNQUACER_PCI_SEG0_CONFIG_BASE | 0x8000,
> -      0,
> -      SYNQUACER_PCI_SEG0_BUSNUM_MIN,
> -      SYNQUACER_PCI_SEG0_BUSNUM_MIN,
> -      EFI_ACPI_RESERVED_DWORD
> -    }, {
> +//      SYNQUACER_PCI_SEG0_CONFIG_BASE | 0x8000,
> +//      0,
> +//      SYNQUACER_PCI_SEG0_BUSNUM_MIN,
> +//      SYNQUACER_PCI_SEG0_BUSNUM_MIN,
> +//      EFI_ACPI_RESERVED_DWORD
> +//    }, {
>        SYNQUACER_PCI_SEG1_CONFIG_BASE | 0x8000,
>        1,
>        SYNQUACER_PCI_SEG1_BUSNUM_MIN,
> -- 
> 2.11.0
> 
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to