1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3// Intel Serial IO Devices in ACPI Mode 4 5// Serial IO Device BAR0 and BAR1 is 4KB 6#define SIO_BAR_LEN 0x1000 7 8// This is defined in SSDT2 which is generated at boot based 9// on whether or not the device is enabled in ACPI mode. 10External (\S0EN) 11External (\S1EN) 12External (\S2EN) 13External (\S3EN) 14External (\S4EN) 15External (\S5EN) 16External (\S6EN) 17External (\S7EN) 18 19// Serial IO Resource Consumption for BAR1 20Device (SIOR) 21{ 22 Name (_HID, EISAID ("PNP0C02")) 23 Name (_UID, 4) 24 25 Name (RBUF, ResourceTemplate () 26 { 27 // Serial IO BAR1 (PCI config space) resources 28 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D0) // SDMA 29 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D1) // I2C0 30 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D2) // I2C1 31 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D3) // SPI0 32 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D4) // SPI1 33 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D5) // UART0 34 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D6) // UART1 35 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, B1D7) // SDIO 36 }) 37 38 // Update BAR1 address and length if set in NVS 39 Method (_CRS, 0, NotSerialized) 40 { 41 // SDMA 42 If (\S0B1 != 0) { 43 CreateDwordField (^RBUF, ^B1D0._BAS, B0AD) 44 CreateDwordField (^RBUF, ^B1D0._LEN, B0LN) 45 B0AD = \S0B1 46 B0LN = SIO_BAR_LEN 47 } 48 49 // I2C0 50 If (\S1B1 != 0) { 51 CreateDwordField (^RBUF, ^B1D1._BAS, B1AD) 52 CreateDwordField (^RBUF, ^B1D1._LEN, B1LN) 53 B1AD = \S1B1 54 B1LN = SIO_BAR_LEN 55 } 56 57 // I2C1 58 If (\S2B1 != 0) { 59 CreateDwordField (^RBUF, ^B1D2._BAS, B2AD) 60 CreateDwordField (^RBUF, ^B1D2._LEN, B2LN) 61 B2AD = \S2B1 62 B2LN = SIO_BAR_LEN 63 } 64 65 // SPI0 66 If (\S3B1 != 0) { 67 CreateDwordField (^RBUF, ^B1D3._BAS, B3AD) 68 CreateDwordField (^RBUF, ^B1D3._LEN, B3LN) 69 B3AD = \S3B1 70 B3LN = SIO_BAR_LEN 71 } 72 73 // SPI1 74 If (\S4B1 != 0) { 75 CreateDwordField (^RBUF, ^B1D4._BAS, B4AD) 76 CreateDwordField (^RBUF, ^B1D4._LEN, B4LN) 77 B4AD = \S4B1 78 B4LN = SIO_BAR_LEN 79 } 80 81 // UART0 82 If (\S5B1 != 0) { 83 CreateDwordField (^RBUF, ^B1D5._BAS, B5AD) 84 CreateDwordField (^RBUF, ^B1D5._LEN, B5LN) 85 B5AD = \S5B1 86 B5LN = SIO_BAR_LEN 87 } 88 89 // UART1 90 If (\S6B1 != 0) { 91 CreateDwordField (^RBUF, ^B1D6._BAS, B6AD) 92 CreateDwordField (^RBUF, ^B1D6._LEN, B6LN) 93 B6AD = \S6B1 94 B6LN = SIO_BAR_LEN 95 } 96 97 // SDIO 98 If (\S7B1 != 0) { 99 CreateDwordField (^RBUF, ^B1D7._BAS, B7AD) 100 CreateDwordField (^RBUF, ^B1D7._LEN, B7LN) 101 B7AD = \S7B1 102 B7LN = SIO_BAR_LEN 103 } 104 105 Return (RBUF) 106 } 107} 108 109Device (SDMA) 110{ 111 // Serial IO DMA Controller 112 Name (_HID, "INTL9C60") 113 Name (_UID, 1) 114 115 // BAR0 is assigned during PCI enumeration and saved into NVS 116 Name (RBUF, ResourceTemplate () 117 { 118 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 119 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {7} 120 }) 121 122 Method (_CRS, 0, NotSerialized) 123 { 124 // Update BAR0 address and length if set in NVS 125 If (\S0B0 != 0) { 126 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 127 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 128 B0AD = \S0B0 129 B0LN = SIO_BAR_LEN 130 } 131 132 Return (RBUF) 133 } 134 135 Method (_STA, 0, NotSerialized) 136 { 137 If (\S0EN == 0) { 138 Return (0x0) 139 } Else { 140 Return (0xF) 141 } 142 } 143} 144 145Device (I2C0) 146{ 147 // Serial IO I2C0 Controller 148 Name (_HID, "INT33C2") 149 Name (_CID, "INT33C2") 150 Name (_UID, 1) 151 152 Name (SSCN, Package () { 432, 507, 30 }) 153 Name (FMCN, Package () { 72, 160, 30 }) 154 155 // BAR0 is assigned during PCI enumeration and saved into NVS 156 Name (RBUF, ResourceTemplate () 157 { 158 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 159 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {7} 160 }) 161 162 // DMA channels are only used if Serial IO DMA controller is enabled 163 Name (DBUF, ResourceTemplate () 164 { 165 FixedDMA (0x18, 4, Width32Bit, DMA1) // Tx 166 FixedDMA (0x19, 5, Width32Bit, DMA2) // Rx 167 }) 168 169 Method (_CRS, 0, NotSerialized) 170 { 171 // Update BAR0 address and length if set in NVS 172 If (\S1B0 != 0) { 173 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 174 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 175 B0AD = \S1B0 176 B0LN = SIO_BAR_LEN 177 } 178 179 // Check if Serial IO DMA Controller is enabled 180 If (\_SB.PCI0.SDMA._STA != 0) { 181 Return (ConcatenateResTemplate (RBUF, DBUF)) 182 } Else { 183 Return (RBUF) 184 } 185 } 186 187 Method (_STA, 0, NotSerialized) 188 { 189 If (\S1EN == 0) { 190 Return (0x0) 191 } Else { 192 Return (0xF) 193 } 194 } 195 196 // Access to PCI Config in ACPI mode 197 OperationRegion (KEYS, SystemMemory, \S1B1, 0x100) 198 Field (KEYS, DWordAcc, NoLock, Preserve) 199 { 200 Offset (0x84), 201 PSAT, 32, 202 } 203 204 // Put controller in D0 state 205 Method (_PS0, 0, Serialized) 206 { 207 ^PSAT &= 0xfffffffc 208 Local0 = ^PSAT // Read back after writing 209 210 // Use Local0 to avoid iasl warning: Method Local is set but never used 211 Local0 &= Ones 212 } 213 214 // Put controller in D3Hot state 215 Method (_PS3, 0, Serialized) 216 { 217 ^PSAT |= 0x00000003 218 Local0 = ^PSAT // Read back after writing 219 220 // Use Local0 to avoid iasl warning: Method Local is set but never used 221 Local0 &= Ones 222 } 223} 224 225Device (I2C1) 226{ 227 // Serial IO I2C1 Controller 228 Name (_HID, "INT33C3") 229 Name (_CID, "INT33C3") 230 Name (_UID, 1) 231 232 Name (SSCN, Package () { 432, 507, 30 }) 233 Name (FMCN, Package () { 72, 160, 30 }) 234 235 // BAR0 is assigned during PCI enumeration and saved into NVS 236 Name (RBUF, ResourceTemplate () 237 { 238 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 239 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {7} 240 }) 241 242 // DMA channels are only used if Serial IO DMA controller is enabled 243 Name (DBUF, ResourceTemplate () 244 { 245 FixedDMA (0x1A, 6, Width32Bit, DMA1) // Tx 246 FixedDMA (0x1B, 7, Width32Bit, DMA2) // Rx 247 }) 248 249 Method (_CRS, 0, NotSerialized) 250 { 251 // Update BAR0 address and length if set in NVS 252 If (\S2B0 != 0) { 253 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 254 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 255 B0AD = \S2B0 256 B0LN = SIO_BAR_LEN 257 } 258 259 // Check if Serial IO DMA Controller is enabled 260 If (\_SB.PCI0.SDMA._STA != 0) { 261 Return (ConcatenateResTemplate (RBUF, DBUF)) 262 } Else { 263 Return (RBUF) 264 } 265 } 266 267 Method (_STA, 0, NotSerialized) 268 { 269 If (\S2EN == 0) { 270 Return (0x0) 271 } Else { 272 Return (0xF) 273 } 274 } 275 276 // Access to PCI Config in ACPI mode 277 OperationRegion (KEYS, SystemMemory, \S2B1, 0x100) 278 Field (KEYS, DWordAcc, NoLock, Preserve) 279 { 280 Offset (0x84), 281 PSAT, 32, 282 } 283 284 // Put controller in D0 state 285 Method (_PS0, 0, Serialized) 286 { 287 ^PSAT &= 0xfffffffc 288 Local0 = ^PSAT // Read back after writing 289 290 // Use Local0 to avoid iasl warning: Method Local is set but never used 291 Local0 &= Ones 292 } 293 294 // Put controller in D3Hot state 295 Method (_PS3, 0, Serialized) 296 { 297 ^PSAT |= 0x00000003 298 Local0 = ^PSAT // Read back after writing 299 300 // Use Local0 to avoid iasl warning: Method Local is set but never used 301 Local0 &= Ones 302 } 303} 304 305Device (SPI0) 306{ 307 // Serial IO SPI0 Controller 308 Name (_HID, "INT33C0") 309 Name (_CID, "INT33C0") 310 Name (_UID, 1) 311 312 // BAR0 is assigned during PCI enumeration and saved into NVS 313 Name (RBUF, ResourceTemplate () 314 { 315 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 316 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {7} 317 }) 318 319 Method (_CRS, 0, NotSerialized) 320 { 321 // Update BAR0 address and length if set in NVS 322 If (\S3B0 != 0) { 323 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 324 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 325 B0AD = \S3B0 326 B0LN = SIO_BAR_LEN 327 } 328 329 Return (RBUF) 330 } 331 332 Method (_STA, 0, NotSerialized) 333 { 334 If (\S3EN == 0) { 335 Return (0x0) 336 } Else { 337 Return (0xF) 338 } 339 } 340} 341 342Device (SPI1) 343{ 344 // Serial IO SPI1 Controller 345 Name (_HID, "INT33C1") 346 Name (_CID, "INT33C1") 347 Name (_UID, 1) 348 349 // BAR0 is assigned during PCI enumeration and saved into NVS 350 Name (RBUF, ResourceTemplate () 351 { 352 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 353 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {7} 354 }) 355 356 // DMA channels are only used if Serial IO DMA controller is enabled 357 Name (DBUF, ResourceTemplate () 358 { 359 FixedDMA (0x10, 0, Width32Bit, DMA1) // Tx 360 FixedDMA (0x11, 1, Width32Bit, DMA2) // Rx 361 }) 362 363 Method (_CRS, 0, NotSerialized) 364 { 365 // Update BAR0 address and length if set in NVS 366 If (\S4B0 != 0) { 367 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 368 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 369 B0AD = \S4B0 370 B0LN = SIO_BAR_LEN 371 } 372 373 // Check if Serial IO DMA Controller is enabled 374 If (\_SB.PCI0.SDMA._STA != 0) { 375 Return (ConcatenateResTemplate (RBUF, DBUF)) 376 } Else { 377 Return (RBUF) 378 } 379 } 380 381 Method (_STA, 0, NotSerialized) 382 { 383 If (\S4EN == 0) { 384 Return (0x0) 385 } Else { 386 Return (0xF) 387 } 388 } 389} 390 391Device (UAR0) 392{ 393 // Serial IO UART0 Controller 394 Name (_HID, "INT33C4") 395 Name (_CID, "INT33C4") 396 Name (_UID, 1) 397 398 // BAR0 is assigned during PCI enumeration and saved into NVS 399 Name (RBUF, ResourceTemplate () 400 { 401 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 402 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {13} 403 }) 404 405 // DMA channels are only used if Serial IO DMA controller is enabled 406 Name (DBUF, ResourceTemplate () 407 { 408 FixedDMA (0x16, 2, Width32Bit, DMA1) // Tx 409 FixedDMA (0x17, 3, Width32Bit, DMA2) // Rx 410 }) 411 412 Method (_CRS, 0, NotSerialized) 413 { 414 // Update BAR0 address and length if set in NVS 415 If (\S5B0 != 0) { 416 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 417 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 418 B0AD = \S5B0 419 B0LN = SIO_BAR_LEN 420 } 421 422 // Check if Serial IO DMA Controller is enabled 423 If (\_SB.PCI0.SDMA._STA != 0) { 424 Return (ConcatenateResTemplate (RBUF, DBUF)) 425 } Else { 426 Return (RBUF) 427 } 428 } 429 430 Method (_STA, 0, NotSerialized) 431 { 432 If (\S5EN == 0) { 433 Return (0x0) 434 } Else { 435 Return (0xF) 436 } 437 } 438} 439 440Device (UAR1) 441{ 442 // Serial IO UART1 Controller 443 Name (_HID, "INT33C5") 444 Name (_CID, "INT33C5") 445 Name (_UID, 1) 446 447 // BAR0 is assigned during PCI enumeration and saved into NVS 448 Name (RBUF, ResourceTemplate () 449 { 450 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 451 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {13} 452 }) 453 454 Method (_CRS, 0, NotSerialized) 455 { 456 // Update BAR0 address and length if set in NVS 457 If (\S6B0 != 0) { 458 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 459 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 460 B0AD = \S6B0 461 B0LN = SIO_BAR_LEN 462 } 463 464 Return (RBUF) 465 } 466 467 Method (_STA, 0, NotSerialized) 468 { 469 If (\S6EN == 0) { 470 Return (0x0) 471 } Else { 472 Return (0xF) 473 } 474 } 475} 476 477Device (SDIO) 478{ 479 // Serial IO SDIO Controller 480 Name (_HID, "INT33C6") 481 Name (_CID, "PNP0D40") 482 Name (_UID, 1) 483 484 // BAR0 is assigned during PCI enumeration and saved into NVS 485 Name (RBUF, ResourceTemplate () 486 { 487 Memory32Fixed (ReadWrite, 0x00000000, 0x00000000, BAR0) 488 Interrupt (ResourceConsumer, Level, ActiveLow, Shared, , , ) {5} 489 }) 490 491 Method (_CRS, 0, NotSerialized) 492 { 493 // Update BAR0 address and length if set in NVS 494 If (\S7B0 != 0) { 495 CreateDwordField (^RBUF, ^BAR0._BAS, B0AD) 496 CreateDwordField (^RBUF, ^BAR0._LEN, B0LN) 497 B0AD = \S7B0 498 B0LN = SIO_BAR_LEN 499 } 500 501 Return (RBUF) 502 } 503 504 Method (_STA, 0, NotSerialized) 505 { 506 If (\S7EN == 0) { 507 Return (0x0) 508 } Else { 509 Return (0xF) 510 } 511 } 512} 513