David Milosevic | ad83eb1 | 2023-11-16 05:11:18 +0100 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | |
| 3 | #define LINK_DEVICE(Uid, LinkName, Irq) \ |
| 4 | Device (LinkName) { \ |
| 5 | Name (_HID, EISAID("PNP0C0F")) \ |
| 6 | Name (_UID, Uid) \ |
| 7 | Name (_CRS, ResourceTemplate() { \ |
| 8 | Interrupt (ResourceProducer, Level, ActiveHigh, Exclusive) { Irq } \ |
| 9 | }) \ |
| 10 | } |
| 11 | |
| 12 | #define USB_PORT(PortName, Adr) \ |
| 13 | Device (PortName) { \ |
| 14 | Name (_ADR, Adr) \ |
| 15 | Name (_UPC, Package() { \ |
| 16 | 0xFF, \ |
| 17 | 0x00, \ |
| 18 | 0x00000000, \ |
| 19 | 0x00000000 \ |
| 20 | }) \ |
| 21 | Name (_PLD, Package() { \ |
| 22 | Buffer(0x10) { \ |
| 23 | 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ |
| 24 | 0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \ |
| 25 | } \ |
| 26 | }) \ |
| 27 | } |
| 28 | |
| 29 | #define PRT_ENTRY(Address, Pin, Link) \ |
| 30 | Package (4) { \ |
| 31 | Address, Pin, Link, Zero \ |
| 32 | } |
| 33 | |
| 34 | #define PRT_ENTRY_GROUP(Address, Link0, Link1, Link2, Link3) \ |
| 35 | PRT_ENTRY (Address, 0, Link0), \ |
| 36 | PRT_ENTRY (Address, 1, Link1), \ |
| 37 | PRT_ENTRY (Address, 2, Link2), \ |
| 38 | PRT_ENTRY (Address, 3, Link3) |
| 39 | |
| 40 | #include <acpi/acpi.h> |
| 41 | #include <mainboard/addressmap.h> |
| 42 | |
| 43 | DefinitionBlock( |
| 44 | "dsdt.aml", |
| 45 | "DSDT", |
| 46 | ACPI_DSDT_REV_2, |
| 47 | OEM_ID, |
| 48 | ACPI_TABLE_CREATOR, |
| 49 | 0x20230621 |
| 50 | ) |
| 51 | { |
| 52 | #include <acpi/dsdt_top.asl> |
| 53 | |
| 54 | Scope (_SB) { |
| 55 | // UART PL011 |
| 56 | Device (COM0) { |
| 57 | Name (_HID, "ARMH0011") |
| 58 | Name (_UID, Zero) |
| 59 | Name (_CRS, ResourceTemplate () { |
| 60 | Memory32Fixed (ReadWrite, SBSA_UART_BASE, 0x00001000) |
| 61 | Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 33 } |
| 62 | }) |
| 63 | } |
| 64 | |
| 65 | // AHCI Host Controller |
| 66 | Device (AHC0) { |
| 67 | Name (_HID, "LNRO001E") |
| 68 | Name (_CLS, Package (3) { |
| 69 | 0x01, |
| 70 | 0x06, |
| 71 | 0x01, |
| 72 | }) |
| 73 | Name (_CCA, 1) |
| 74 | Name (_CRS, ResourceTemplate() { |
| 75 | Memory32Fixed (ReadWrite, SBSA_AHCI_BASE, 0x00010000) |
| 76 | Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 42 } |
| 77 | }) |
| 78 | } |
| 79 | |
| 80 | // USB EHCI Host Controller |
| 81 | Device (USB0) { |
| 82 | Name (_HID, "LNRO0D20") |
| 83 | Name (_CID, "PNP0D20") |
| 84 | Method (_CRS, 0x0, Serialized) { |
| 85 | Name (RBUF, ResourceTemplate() { |
| 86 | Memory32Fixed (ReadWrite, SBSA_EHCI_BASE, 0x00010000) |
| 87 | Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 43 } |
| 88 | }) |
| 89 | Return (RBUF) |
| 90 | } |
| 91 | |
| 92 | // Root Hub |
| 93 | Device (RHUB) { |
| 94 | Name (_ADR, 0x00000000) // Address of Root Hub should be 0 as per ACPI 5.0 spec |
| 95 | |
| 96 | // Ports connected to Root Hub |
| 97 | Device (HUB1) { |
| 98 | Name (_ADR, 0x00000001) |
| 99 | Name (_UPC, Package() { |
| 100 | 0x00, // Port is NOT connectable |
| 101 | 0xFF, // Don't care |
| 102 | 0x00000000, // Reserved 0 must be zero |
| 103 | 0x00000000 // Reserved 1 must be zero |
| 104 | }) |
| 105 | USB_PORT (PRT1, 0x00000001) // USB0_RHUB_HUB1_PRT1 |
| 106 | USB_PORT (PRT2, 0x00000002) // USB0_RHUB_HUB1_PRT2 |
| 107 | USB_PORT (PRT3, 0x00000003) // USB0_RHUB_HUB1_PRT3 |
| 108 | USB_PORT (PRT4, 0x00000004) // USB0_RHUB_HUB1_PRT4 |
| 109 | } // USB0_RHUB_HUB1 |
| 110 | } // USB0_RHUB |
| 111 | } // USB0 |
| 112 | |
| 113 | Device (PCI0) |
| 114 | { |
| 115 | Name (_HID, EISAID ("PNP0A08")) // PCI Express Root Bridge |
| 116 | Name (_CID, EISAID ("PNP0A03")) // Compatible PCI Root Bridge |
| 117 | Name (_SEG, Zero) // PCI Segment Group number |
| 118 | Name (_BBN, Zero) // PCI Base Bus Number |
| 119 | Name (_UID, "PCI0") |
| 120 | Name (_CCA, One) // Initially mark the PCI coherent (for JunoR1) |
| 121 | |
| 122 | Method (_CBA, 0, NotSerialized) { |
| 123 | return (SBSA_PCIE_ECAM_BASE) |
| 124 | } |
| 125 | |
| 126 | LINK_DEVICE (0, GSI0, 0x23) |
| 127 | LINK_DEVICE (1, GSI1, 0x24) |
| 128 | LINK_DEVICE (2, GSI2, 0x25) |
| 129 | LINK_DEVICE (3, GSI3, 0x26) |
| 130 | |
| 131 | Name (_PRT, Package () { |
| 132 | |
| 133 | // _PRT: PCI Routing Table |
| 134 | PRT_ENTRY_GROUP (0x0000FFFF, GSI0, GSI1, GSI2, GSI3), |
| 135 | PRT_ENTRY_GROUP (0x0001FFFF, GSI1, GSI2, GSI3, GSI0), |
| 136 | PRT_ENTRY_GROUP (0x0002FFFF, GSI2, GSI3, GSI0, GSI1), |
| 137 | PRT_ENTRY_GROUP (0x0003FFFF, GSI3, GSI0, GSI1, GSI2), |
| 138 | PRT_ENTRY_GROUP (0x0004FFFF, GSI0, GSI1, GSI2, GSI3), |
| 139 | PRT_ENTRY_GROUP (0x0005FFFF, GSI1, GSI2, GSI3, GSI0), |
| 140 | PRT_ENTRY_GROUP (0x0006FFFF, GSI2, GSI3, GSI0, GSI1), |
| 141 | PRT_ENTRY_GROUP (0x0007FFFF, GSI3, GSI0, GSI1, GSI2), |
| 142 | PRT_ENTRY_GROUP (0x0008FFFF, GSI0, GSI1, GSI2, GSI3), |
| 143 | PRT_ENTRY_GROUP (0x0009FFFF, GSI1, GSI2, GSI3, GSI0), |
| 144 | PRT_ENTRY_GROUP (0x000AFFFF, GSI2, GSI3, GSI0, GSI1), |
| 145 | PRT_ENTRY_GROUP (0x000BFFFF, GSI3, GSI0, GSI1, GSI2), |
| 146 | PRT_ENTRY_GROUP (0x000CFFFF, GSI0, GSI1, GSI2, GSI3), |
| 147 | PRT_ENTRY_GROUP (0x000DFFFF, GSI1, GSI2, GSI3, GSI0), |
| 148 | PRT_ENTRY_GROUP (0x000EFFFF, GSI2, GSI3, GSI0, GSI1), |
| 149 | PRT_ENTRY_GROUP (0x000FFFFF, GSI3, GSI0, GSI1, GSI2), |
| 150 | PRT_ENTRY_GROUP (0x0010FFFF, GSI0, GSI1, GSI2, GSI3), |
| 151 | PRT_ENTRY_GROUP (0x0011FFFF, GSI1, GSI2, GSI3, GSI0), |
| 152 | PRT_ENTRY_GROUP (0x0012FFFF, GSI2, GSI3, GSI0, GSI1), |
| 153 | PRT_ENTRY_GROUP (0x0013FFFF, GSI3, GSI0, GSI1, GSI2), |
| 154 | PRT_ENTRY_GROUP (0x0014FFFF, GSI0, GSI1, GSI2, GSI3), |
| 155 | PRT_ENTRY_GROUP (0x0015FFFF, GSI1, GSI2, GSI3, GSI0), |
| 156 | PRT_ENTRY_GROUP (0x0016FFFF, GSI2, GSI3, GSI0, GSI1), |
| 157 | PRT_ENTRY_GROUP (0x0017FFFF, GSI3, GSI0, GSI1, GSI2), |
| 158 | PRT_ENTRY_GROUP (0x0018FFFF, GSI0, GSI1, GSI2, GSI3), |
| 159 | PRT_ENTRY_GROUP (0x0019FFFF, GSI1, GSI2, GSI3, GSI0), |
| 160 | PRT_ENTRY_GROUP (0x001AFFFF, GSI2, GSI3, GSI0, GSI1), |
| 161 | PRT_ENTRY_GROUP (0x001BFFFF, GSI3, GSI0, GSI1, GSI2), |
| 162 | PRT_ENTRY_GROUP (0x001CFFFF, GSI0, GSI1, GSI2, GSI3), |
| 163 | PRT_ENTRY_GROUP (0x001DFFFF, GSI1, GSI2, GSI3, GSI0), |
| 164 | PRT_ENTRY_GROUP (0x001EFFFF, GSI2, GSI3, GSI0, GSI1), |
| 165 | PRT_ENTRY_GROUP (0x001FFFFF, GSI3, GSI0, GSI1, GSI2), |
| 166 | }) |
| 167 | |
| 168 | // Root complex resources |
| 169 | Method (_CRS, 0, Serialized) { |
| 170 | Name (RBUF, ResourceTemplate () { |
| 171 | WordBusNumber ( // Bus numbers assigned to this root |
| 172 | ResourceProducer, |
| 173 | MinFixed, MaxFixed, PosDecode, |
| 174 | 0, // AddressGranularity |
| 175 | 0, // AddressMinimum - Minimum Bus Number |
| 176 | 255, // AddressMaximum - Maximum Bus Number |
| 177 | 0, // AddressTranslation - Set to 0 |
| 178 | 256 // RangeLength - Number of Busses |
| 179 | ) |
| 180 | |
| 181 | DWordMemory ( // 32-bit BAR Windows |
| 182 | ResourceProducer, PosDecode, |
| 183 | MinFixed, MaxFixed, |
| 184 | Cacheable, ReadWrite, |
| 185 | 0x00000000, // Granularity |
| 186 | SBSA_PCIE_MMIO_BASE, // Min Base Address |
| 187 | SBSA_PCIE_MMIO_LIMIT, // Max Base Address |
| 188 | 0, // Translate |
| 189 | SBSA_PCIE_MMIO_SIZE // Length |
| 190 | ) |
| 191 | |
| 192 | QWordMemory ( // 64-bit BAR Windows |
| 193 | ResourceProducer, PosDecode, |
| 194 | MinFixed, MaxFixed, |
| 195 | Cacheable, ReadWrite, |
| 196 | 0x00000000, // Granularity |
| 197 | SBSA_PCIE_MMIO_HIGH_BASE, // Min Base Address |
| 198 | SBSA_PCIE_MMIO_HIGH_LIMIT, // Max Base Address |
| 199 | 0, // Translate |
| 200 | SBSA_PCIE_MMIO_HIGH_SIZE // Length |
| 201 | ) |
| 202 | |
| 203 | DWordIo ( // IO window |
| 204 | ResourceProducer, |
| 205 | MinFixed, |
| 206 | MaxFixed, |
| 207 | PosDecode, |
| 208 | EntireRange, |
| 209 | 0x00000000, // Granularity |
| 210 | 0, // Min Base Address |
| 211 | 0xffff, // Max Base Address |
| 212 | SBSA_PCIE_PIO_BASE, // Translate |
| 213 | 0x10000, // Length |
| 214 | ,,,TypeTranslation |
| 215 | ) |
| 216 | }) // Name(RBUF) |
| 217 | |
| 218 | Return (RBUF) |
| 219 | } // Method(_CRS) |
| 220 | |
| 221 | // OS Control Handoff |
| 222 | Name (SUPP, Zero) // PCI _OSC Support Field value |
| 223 | Name (CTRL, Zero) // PCI _OSC Control Field value |
| 224 | |
| 225 | /* |
| 226 | * See [1] 6.2.10, [2] 4.5 |
| 227 | */ |
| 228 | Method (_OSC,4) { |
| 229 | // Check for proper UUID |
| 230 | If (Arg0 == ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")) { |
| 231 | // Create DWord-adressable fields from the Capabilities Buffer |
| 232 | CreateDWordField (Arg3,0,CDW1) |
| 233 | CreateDWordField (Arg3,4,CDW2) |
| 234 | CreateDWordField (Arg3,8,CDW3) |
| 235 | |
| 236 | // Save Capabilities DWord2 & 3 |
| 237 | SUPP = CDW2 |
| 238 | CTRL = CDW3 |
| 239 | |
| 240 | // Only allow native hot plug control if OS supports: |
| 241 | // * ASPM |
| 242 | // * Clock PM |
| 243 | // * MSI/MSI-X |
| 244 | If ((SUPP & 0x16) != 0x16) { |
| 245 | CTRL &= 0x1E // Mask bit 0 (and undefined bits) |
| 246 | } |
| 247 | |
| 248 | // Always allow native PME, AER (no dependencies) |
| 249 | |
| 250 | // Never allow SHPC (no SHPC controller in this system) |
| 251 | CTRL &= 0x1D |
| 252 | |
| 253 | If (Arg1 != One) { // Unknown revision |
| 254 | CDW1 |= 0x08 |
| 255 | } |
| 256 | |
| 257 | If (CDW3 != CTRL) { // Capabilities bits were masked |
| 258 | CDW1 |= 0x10 |
| 259 | } |
| 260 | |
| 261 | // Update DWORD3 in the buffer |
| 262 | CDW3 = CTRL |
| 263 | Return (Arg3) |
| 264 | } Else { |
| 265 | CDW1 |= 4 // Unrecognized UUID |
| 266 | Return (Arg3) |
| 267 | } |
| 268 | } // End _OSC |
| 269 | } |
| 270 | } // Scope (_SB) |
| 271 | } |