Dsdt.asl 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. /** @file
  2. * Differentiated System Description Table Fields (DSDT).
  3. *
  4. * Copyright (c) 2020, Linaro Ltd. All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause-Patent
  7. **/
  8. #include <IndustryStandard/Acpi60.h>
  9. #include <IndustryStandard/SbsaQemuAcpi.h>
  10. #define LINK_DEVICE(Uid, LinkName, Irq) \
  11. Device (LinkName) { \
  12. Name (_HID, EISAID("PNP0C0F")) \
  13. Name (_UID, Uid) \
  14. Name (_PRS, ResourceTemplate() { \
  15. Interrupt (ResourceProducer, Level, ActiveHigh, Exclusive) { Irq } \
  16. }) \
  17. Method (_STA) { \
  18. Return (0xF) \
  19. } \
  20. Method (_CRS, 0) { Return (_PRS) } \
  21. Method (_SRS, 1) { } \
  22. Method (_DIS) { } \
  23. }
  24. #define PRT_ENTRY(Address, Pin, Link) \
  25. Package (4) { \
  26. Address, Pin, Link, Zero \
  27. }
  28. DefinitionBlock ("DsdtTable.aml", "DSDT",
  29. EFI_ACPI_6_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_REVISION,
  30. "LINARO", "SBSAQEMU", FixedPcdGet32 (PcdAcpiDefaultOemRevision)) {
  31. Scope (_SB) {
  32. // UART PL011
  33. Device (COM0) {
  34. Name (_HID, "ARMH0011")
  35. Name (_UID, Zero)
  36. Name (_CRS, ResourceTemplate () {
  37. Memory32Fixed (ReadWrite,
  38. FixedPcdGet32 (PcdSerialRegisterBase),
  39. 0x00001000)
  40. Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 33 }
  41. })
  42. Method (_STA) {
  43. Return (0xF)
  44. }
  45. }
  46. // AHCI Host Controller
  47. Device (AHC0) {
  48. Name (_HID, "LNRO001E")
  49. Name (_CLS, Package (3) {
  50. 0x01,
  51. 0x06,
  52. 0x01,
  53. })
  54. Name (_CCA, 1)
  55. Name (_CRS, ResourceTemplate() {
  56. Memory32Fixed (ReadWrite,
  57. FixedPcdGet32 (PcdPlatformAhciBase),
  58. FixedPcdGet32 (PcdPlatformAhciSize))
  59. Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 42 }
  60. })
  61. Method (_STA) {
  62. Return (0xF)
  63. }
  64. }
  65. // USB EHCI Host Controller
  66. Device (USB0) {
  67. Name (_HID, "LNRO0D20")
  68. Name (_CID, "PNP0D20")
  69. Method (_STA) {
  70. Return (0xF)
  71. }
  72. Method (_CRS, 0x0, Serialized) {
  73. Name (RBUF, ResourceTemplate() {
  74. Memory32Fixed (ReadWrite,
  75. FixedPcdGet32 (PcdPlatformEhciBase),
  76. FixedPcdGet32 (PcdPlatformEhciSize))
  77. Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { 43 }
  78. })
  79. Return (RBUF)
  80. }
  81. // Root Hub
  82. Device (RHUB) {
  83. Name (_ADR, 0x00000000) // Address of Root Hub should be 0 as per ACPI 5.0 spec
  84. Method (_STA) {
  85. Return (0xF)
  86. }
  87. // Ports connected to Root Hub
  88. Device (HUB1) {
  89. Name (_ADR, 0x00000001)
  90. Name (_UPC, Package() {
  91. 0x00, // Port is NOT connectable
  92. 0xFF, // Don't care
  93. 0x00000000, // Reserved 0 must be zero
  94. 0x00000000 // Reserved 1 must be zero
  95. })
  96. Method (_STA) {
  97. Return (0xF)
  98. }
  99. Device (PRT1) {
  100. Name (_ADR, 0x00000001)
  101. Name (_UPC, Package() {
  102. 0xFF, // Port is connectable
  103. 0x00, // Port connector is A
  104. 0x00000000,
  105. 0x00000000
  106. })
  107. Name (_PLD, Package() {
  108. Buffer(0x10) {
  109. 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  110. 0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  111. }
  112. })
  113. Method (_STA) {
  114. Return (0xF)
  115. }
  116. } // USB0_RHUB_HUB1_PRT1
  117. Device (PRT2) {
  118. Name (_ADR, 0x00000002)
  119. Name (_UPC, Package() {
  120. 0xFF, // Port is connectable
  121. 0x00, // Port connector is A
  122. 0x00000000,
  123. 0x00000000
  124. })
  125. Name (_PLD, Package() {
  126. Buffer(0x10) {
  127. 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  128. 0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  129. }
  130. })
  131. Method (_STA) {
  132. Return (0xF)
  133. }
  134. } // USB0_RHUB_HUB1_PRT2
  135. Device (PRT3) {
  136. Name (_ADR, 0x00000003)
  137. Name (_UPC, Package() {
  138. 0xFF, // Port is connectable
  139. 0x00, // Port connector is A
  140. 0x00000000,
  141. 0x00000000
  142. })
  143. Name (_PLD, Package() {
  144. Buffer (0x10) {
  145. 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  146. 0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  147. }
  148. })
  149. Method (_STA) {
  150. Return (0xF)
  151. }
  152. } // USB0_RHUB_HUB1_PRT3
  153. Device (PRT4) {
  154. Name (_ADR, 0x00000004)
  155. Name (_UPC, Package() {
  156. 0xFF, // Port is connectable
  157. 0x00, // Port connector is A
  158. 0x00000000,
  159. 0x00000000
  160. })
  161. Name (_PLD, Package() {
  162. Buffer (0x10){
  163. 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  164. 0x31, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  165. }
  166. })
  167. Method (_STA) {
  168. Return (0xF)
  169. }
  170. } // USB0_RHUB_HUB1_PRT4
  171. } // USB0_RHUB_HUB1
  172. } // USB0_RHUB
  173. } // USB0
  174. Device (PCI0)
  175. {
  176. Name (_HID, EISAID ("PNP0A08")) // PCI Express Root Bridge
  177. Name (_CID, EISAID ("PNP0A03")) // Compatible PCI Root Bridge
  178. Name (_SEG, Zero) // PCI Segment Group number
  179. Name (_BBN, Zero) // PCI Base Bus Number
  180. Name (_ADR, Zero)
  181. Name (_UID, "PCI0")
  182. Name (_CCA, One) // Initially mark the PCI coherent (for JunoR1)
  183. Method (_STA) {
  184. Return (0xF)
  185. }
  186. Method (_CBA, 0, NotSerialized) {
  187. return (FixedPcdGet32 (PcdPciExpressBaseAddress))
  188. }
  189. LINK_DEVICE(0, GSI0, 0x23)
  190. LINK_DEVICE(1, GSI1, 0x24)
  191. LINK_DEVICE(2, GSI2, 0x25)
  192. LINK_DEVICE(3, GSI3, 0x26)
  193. Name (_PRT, Package () // _PRT: PCI Routing Table
  194. {
  195. PRT_ENTRY(0x0000FFFF, 0, GSI0),
  196. PRT_ENTRY(0x0000FFFF, 0, GSI1),
  197. PRT_ENTRY(0x0000FFFF, 0, GSI2),
  198. PRT_ENTRY(0x0000FFFF, 0, GSI3),
  199. PRT_ENTRY(0x0001FFFF, 0, GSI1),
  200. PRT_ENTRY(0x0001FFFF, 1, GSI2),
  201. PRT_ENTRY(0x0001FFFF, 2, GSI3),
  202. PRT_ENTRY(0x0001FFFF, 3, GSI0),
  203. PRT_ENTRY(0x0002FFFF, 0, GSI2),
  204. PRT_ENTRY(0x0002FFFF, 1, GSI3),
  205. PRT_ENTRY(0x0002FFFF, 2, GSI0),
  206. PRT_ENTRY(0x0002FFFF, 3, GSI1),
  207. PRT_ENTRY(0x0003FFFF, 0, GSI3),
  208. PRT_ENTRY(0x0003FFFF, 1, GSI0),
  209. PRT_ENTRY(0x0003FFFF, 2, GSI1),
  210. PRT_ENTRY(0x0003FFFF, 3, GSI2),
  211. PRT_ENTRY(0x0004FFFF, 0, GSI0),
  212. PRT_ENTRY(0x0004FFFF, 1, GSI1),
  213. PRT_ENTRY(0x0004FFFF, 2, GSI2),
  214. PRT_ENTRY(0x0004FFFF, 3, GSI3),
  215. PRT_ENTRY(0x0005FFFF, 0, GSI1),
  216. PRT_ENTRY(0x0005FFFF, 1, GSI2),
  217. PRT_ENTRY(0x0005FFFF, 2, GSI3),
  218. PRT_ENTRY(0x0005FFFF, 3, GSI0),
  219. PRT_ENTRY(0x0006FFFF, 0, GSI2),
  220. PRT_ENTRY(0x0006FFFF, 1, GSI3),
  221. PRT_ENTRY(0x0006FFFF, 2, GSI0),
  222. PRT_ENTRY(0x0006FFFF, 3, GSI1),
  223. PRT_ENTRY(0x0007FFFF, 0, GSI3),
  224. PRT_ENTRY(0x0007FFFF, 1, GSI0),
  225. PRT_ENTRY(0x0007FFFF, 2, GSI1),
  226. PRT_ENTRY(0x0007FFFF, 3, GSI2),
  227. PRT_ENTRY(0x0008FFFF, 0, GSI0),
  228. PRT_ENTRY(0x0008FFFF, 1, GSI1),
  229. PRT_ENTRY(0x0008FFFF, 2, GSI2),
  230. PRT_ENTRY(0x0008FFFF, 3, GSI3),
  231. PRT_ENTRY(0x0009FFFF, 0, GSI1),
  232. PRT_ENTRY(0x0009FFFF, 1, GSI2),
  233. PRT_ENTRY(0x0009FFFF, 2, GSI3),
  234. PRT_ENTRY(0x0009FFFF, 3, GSI0),
  235. PRT_ENTRY(0x000AFFFF, 0, GSI2),
  236. PRT_ENTRY(0x000AFFFF, 1, GSI3),
  237. PRT_ENTRY(0x000AFFFF, 2, GSI0),
  238. PRT_ENTRY(0x000AFFFF, 3, GSI1),
  239. PRT_ENTRY(0x000BFFFF, 0, GSI3),
  240. PRT_ENTRY(0x000BFFFF, 1, GSI0),
  241. PRT_ENTRY(0x000BFFFF, 2, GSI1),
  242. PRT_ENTRY(0x000BFFFF, 3, GSI2),
  243. PRT_ENTRY(0x000CFFFF, 0, GSI0),
  244. PRT_ENTRY(0x000CFFFF, 1, GSI1),
  245. PRT_ENTRY(0x000CFFFF, 2, GSI2),
  246. PRT_ENTRY(0x000CFFFF, 3, GSI3),
  247. PRT_ENTRY(0x000DFFFF, 0, GSI1),
  248. PRT_ENTRY(0x000DFFFF, 1, GSI2),
  249. PRT_ENTRY(0x000DFFFF, 2, GSI3),
  250. PRT_ENTRY(0x000DFFFF, 3, GSI0),
  251. PRT_ENTRY(0x000EFFFF, 0, GSI2),
  252. PRT_ENTRY(0x000EFFFF, 1, GSI3),
  253. PRT_ENTRY(0x000EFFFF, 2, GSI0),
  254. PRT_ENTRY(0x000EFFFF, 3, GSI1),
  255. PRT_ENTRY(0x000FFFFF, 0, GSI3),
  256. PRT_ENTRY(0x000FFFFF, 1, GSI0),
  257. PRT_ENTRY(0x000FFFFF, 2, GSI1),
  258. PRT_ENTRY(0x000FFFFF, 3, GSI2),
  259. PRT_ENTRY(0x0010FFFF, 0, GSI0),
  260. PRT_ENTRY(0x0010FFFF, 1, GSI1),
  261. PRT_ENTRY(0x0010FFFF, 2, GSI2),
  262. PRT_ENTRY(0x0010FFFF, 3, GSI3),
  263. PRT_ENTRY(0x0011FFFF, 0, GSI1),
  264. PRT_ENTRY(0x0011FFFF, 1, GSI2),
  265. PRT_ENTRY(0x0011FFFF, 2, GSI3),
  266. PRT_ENTRY(0x0011FFFF, 3, GSI0),
  267. PRT_ENTRY(0x0012FFFF, 0, GSI2),
  268. PRT_ENTRY(0x0012FFFF, 1, GSI3),
  269. PRT_ENTRY(0x0012FFFF, 2, GSI0),
  270. PRT_ENTRY(0x0012FFFF, 3, GSI1),
  271. PRT_ENTRY(0x0013FFFF, 0, GSI3),
  272. PRT_ENTRY(0x0013FFFF, 1, GSI0),
  273. PRT_ENTRY(0x0013FFFF, 2, GSI1),
  274. PRT_ENTRY(0x0013FFFF, 3, GSI2),
  275. PRT_ENTRY(0x0014FFFF, 0, GSI0),
  276. PRT_ENTRY(0x0014FFFF, 1, GSI1),
  277. PRT_ENTRY(0x0014FFFF, 2, GSI2),
  278. PRT_ENTRY(0x0014FFFF, 3, GSI3),
  279. PRT_ENTRY(0x0015FFFF, 0, GSI1),
  280. PRT_ENTRY(0x0015FFFF, 1, GSI2),
  281. PRT_ENTRY(0x0015FFFF, 2, GSI3),
  282. PRT_ENTRY(0x0015FFFF, 3, GSI0),
  283. PRT_ENTRY(0x0016FFFF, 0, GSI2),
  284. PRT_ENTRY(0x0016FFFF, 1, GSI3),
  285. PRT_ENTRY(0x0016FFFF, 2, GSI0),
  286. PRT_ENTRY(0x0016FFFF, 3, GSI1),
  287. PRT_ENTRY(0x0017FFFF, 0, GSI3),
  288. PRT_ENTRY(0x0017FFFF, 1, GSI0),
  289. PRT_ENTRY(0x0017FFFF, 2, GSI1),
  290. PRT_ENTRY(0x0017FFFF, 3, GSI2),
  291. PRT_ENTRY(0x0018FFFF, 0, GSI0),
  292. PRT_ENTRY(0x0018FFFF, 1, GSI1),
  293. PRT_ENTRY(0x0018FFFF, 2, GSI2),
  294. PRT_ENTRY(0x0018FFFF, 3, GSI3),
  295. PRT_ENTRY(0x0019FFFF, 0, GSI1),
  296. PRT_ENTRY(0x0019FFFF, 1, GSI2),
  297. PRT_ENTRY(0x0019FFFF, 2, GSI3),
  298. PRT_ENTRY(0x0019FFFF, 3, GSI0),
  299. PRT_ENTRY(0x001AFFFF, 0, GSI2),
  300. PRT_ENTRY(0x001AFFFF, 1, GSI3),
  301. PRT_ENTRY(0x001AFFFF, 2, GSI0),
  302. PRT_ENTRY(0x001AFFFF, 3, GSI1),
  303. PRT_ENTRY(0x001BFFFF, 0, GSI3),
  304. PRT_ENTRY(0x001BFFFF, 1, GSI0),
  305. PRT_ENTRY(0x001BFFFF, 2, GSI1),
  306. PRT_ENTRY(0x001BFFFF, 3, GSI2),
  307. PRT_ENTRY(0x001CFFFF, 0, GSI0),
  308. PRT_ENTRY(0x001CFFFF, 1, GSI1),
  309. PRT_ENTRY(0x001CFFFF, 2, GSI2),
  310. PRT_ENTRY(0x001CFFFF, 3, GSI3),
  311. PRT_ENTRY(0x001DFFFF, 0, GSI1),
  312. PRT_ENTRY(0x001DFFFF, 1, GSI2),
  313. PRT_ENTRY(0x001DFFFF, 2, GSI3),
  314. PRT_ENTRY(0x001DFFFF, 3, GSI0),
  315. PRT_ENTRY(0x001EFFFF, 0, GSI2),
  316. PRT_ENTRY(0x001EFFFF, 1, GSI3),
  317. PRT_ENTRY(0x001EFFFF, 2, GSI0),
  318. PRT_ENTRY(0x001EFFFF, 3, GSI1),
  319. PRT_ENTRY(0x001FFFFF, 0, GSI3),
  320. PRT_ENTRY(0x001FFFFF, 1, GSI0),
  321. PRT_ENTRY(0x001FFFFF, 2, GSI1),
  322. PRT_ENTRY(0x001FFFFF, 3, GSI2),
  323. })
  324. // Root complex resources
  325. Method (_CRS, 0, Serialized) {
  326. Name (RBUF, ResourceTemplate () {
  327. WordBusNumber ( // Bus numbers assigned to this root
  328. ResourceProducer,
  329. MinFixed, MaxFixed, PosDecode,
  330. 0, // AddressGranularity
  331. FixedPcdGet32 (PcdPciBusMin), // AddressMinimum - Minimum Bus Number
  332. FixedPcdGet32 (PcdPciBusMax), // AddressMaximum - Maximum Bus Number
  333. 0, // AddressTranslation - Set to 0
  334. 256 // RangeLength - Number of Busses
  335. )
  336. DWordMemory ( // 32-bit BAR Windows
  337. ResourceProducer, PosDecode,
  338. MinFixed, MaxFixed,
  339. Cacheable, ReadWrite,
  340. 0x00000000, // Granularity
  341. FixedPcdGet32 (PcdPciMmio32Base), // Min Base Address
  342. FixedPcdGet32 (PcdPciMmio32Limit), // Max Base Address
  343. FixedPcdGet32 (PcdPciMmio32Translation), // Translate
  344. FixedPcdGet32 (PcdPciMmio32Size) // Length
  345. )
  346. QWordMemory ( // 64-bit BAR Windows
  347. ResourceProducer, PosDecode,
  348. MinFixed, MaxFixed,
  349. Cacheable, ReadWrite,
  350. 0x00000000, // Granularity
  351. FixedPcdGet64 (PcdPciMmio64Base), // Min Base Address
  352. FixedPcdGet64 (PcdPciMmio64Limit), // Max Base Address
  353. FixedPcdGet64 (PcdPciMmio64Translation), // Translate
  354. FixedPcdGet64 (PcdPciMmio64Size) // Length
  355. )
  356. DWordIo ( // IO window
  357. ResourceProducer,
  358. MinFixed,
  359. MaxFixed,
  360. PosDecode,
  361. EntireRange,
  362. 0x00000000, // Granularity
  363. FixedPcdGet32 (PcdPciIoBase), // Min Base Address
  364. FixedPcdGet32 (PcdPciIoLimit), // Max Base Address
  365. FixedPcdGet32 (PcdPciIoTranslation), // Translate
  366. FixedPcdGet32 (PcdPciIoSize), // Length
  367. ,,,TypeTranslation
  368. )
  369. }) // Name(RBUF)
  370. Return (RBUF)
  371. } // Method(_CRS)
  372. Device (RES0)
  373. {
  374. Name (_HID, "PNP0C02" /* PNP Motherboard Resources */) // _HID: Hardware ID
  375. Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
  376. {
  377. QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
  378. 0x0000000000000000, // Granularity
  379. FixedPcdGet64 (PcdPciExpressBaseAddress), // Range Minimum
  380. FixedPcdGet64 (PcdPciExpressBarLimit), // Range Maximum
  381. 0x0000000000000000, // Translation Offset
  382. FixedPcdGet64 (PcdPciExpressBarSize), // Length
  383. ,, , AddressRangeMemory, TypeStatic)
  384. })
  385. Method (_STA) {
  386. Return (0xF)
  387. }
  388. }
  389. // OS Control Handoff
  390. Name (SUPP, Zero) // PCI _OSC Support Field value
  391. Name (CTRL, Zero) // PCI _OSC Control Field value
  392. /*
  393. * See [1] 6.2.10, [2] 4.5
  394. */
  395. Method (_OSC,4) {
  396. // Check for proper UUID
  397. If (Arg0 == ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")) {
  398. // Create DWord-adressable fields from the Capabilities Buffer
  399. CreateDWordField (Arg3,0,CDW1)
  400. CreateDWordField (Arg3,4,CDW2)
  401. CreateDWordField (Arg3,8,CDW3)
  402. // Save Capabilities DWord2 & 3
  403. Store (CDW2,SUPP)
  404. Store (CDW3,CTRL)
  405. // Only allow native hot plug control if OS supports:
  406. // * ASPM
  407. // * Clock PM
  408. // * MSI/MSI-X
  409. If ((SUPP & 0x16) != 0x16) {
  410. CTRL &= 0x1E // Mask bit 0 (and undefined bits)
  411. }
  412. // Always allow native PME, AER (no dependencies)
  413. // Never allow SHPC (no SHPC controller in this system)
  414. CTRL &= 0x1D
  415. If (Arg1 != One) { // Unknown revision
  416. CDW1 |= 0x08
  417. }
  418. If (CDW3 != CTRL) { // Capabilities bits were masked
  419. CDW1 |= 0x10
  420. }
  421. // Update DWORD3 in the buffer
  422. Store (CTRL,CDW3)
  423. Return (Arg3)
  424. } Else {
  425. CDW1 |= 4 // Unrecognized UUID
  426. Return (Arg3)
  427. }
  428. } // End _OSC
  429. }
  430. } // Scope (_SB)
  431. }