dsdt.asl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. /*
  2. * QEMU ACPI DSDT ASL definition
  3. *
  4. * Copyright (c) 2006 Fabrice Bellard
  5. *
  6. * Copyright (c) 2010 Isaku Yamahata
  7. * yamahata at valinux co jp
  8. * Based on acpi-dsdt.dsl, but heavily modified for q35 chipset.
  9. */
  10. DefinitionBlock (
  11. "dsdt.aml", /* Output Filename */
  12. "DSDT", /* Signature */
  13. 0x01, /* DSDT Compliance Revision */
  14. "UBOO", /* OEMID */
  15. "UBOOT ", /* TABLE ID */
  16. 0x2 /* OEM Revision */
  17. )
  18. {
  19. #include "acpi/dbug.asl"
  20. Scope(\_SB) {
  21. OperationRegion(PCST, SystemIO, 0xae00, 0x0c)
  22. OperationRegion(PCSB, SystemIO, 0xae0c, 0x01)
  23. Field(PCSB, AnyAcc, NoLock, WriteAsZeros) {
  24. PCIB, 8,
  25. }
  26. }
  27. /* PCI Bus definition */
  28. Scope(\_SB) {
  29. Device(PCI0) {
  30. Name(_HID, EisaId("PNP0A08"))
  31. Name(_CID, EisaId("PNP0A03"))
  32. Name(_ADR, 0x00)
  33. Name(_UID, 1)
  34. /* _OSC: based on sample of ACPI3.0b spec */
  35. Name(SUPP, 0) /* PCI _OSC Support Field value */
  36. Name(CTRL, 0) /* PCI _OSC Control Field value */
  37. Method(_OSC, 4) {
  38. /* Create DWORD-addressable fields from Capabilities Buffer */
  39. CreateDWordField(Arg3, 0, CDW1)
  40. /* Check for proper UUID */
  41. If (LEqual(Arg0, ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766")))
  42. {
  43. /* Create DWORD-addressable fields from Capabilities Buffer */
  44. CreateDWordField(Arg3, 4, CDW2)
  45. CreateDWordField(Arg3, 8, CDW3)
  46. /* Save Capabilities DWORD2 & 3 */
  47. Store(CDW2, SUPP)
  48. Store(CDW3, CTRL)
  49. /*
  50. * Always allow native PME, AER (no dependencies)
  51. * Never allow SHPC (no SHPC controller in this system)
  52. */
  53. And(CTRL, 0x1d, CTRL)
  54. If (LNotEqual(Arg1, One)) {
  55. /* Unknown revision */
  56. Or(CDW1, 0x08, CDW1)
  57. }
  58. If (LNotEqual(CDW3, CTRL)) {
  59. /* Capabilities bits were masked */
  60. Or(CDW1, 0x10, CDW1)
  61. }
  62. /* Update DWORD3 in the buffer */
  63. Store(CTRL, CDW3)
  64. } Else {
  65. Or(CDW1, 4, CDW1) /* Unrecognized UUID */
  66. }
  67. Return (Arg3)
  68. }
  69. }
  70. }
  71. #include "acpi/pci-crs.asl"
  72. #include "acpi/hpet.asl"
  73. /* VGA */
  74. Scope(\_SB.PCI0) {
  75. Device(VGA) {
  76. Name(_ADR, 0x00010000)
  77. Method(_S1D, 0, NotSerialized) {
  78. Return (0x00)
  79. }
  80. Method(_S2D, 0, NotSerialized) {
  81. Return (0x00)
  82. }
  83. Method(_S3D, 0, NotSerialized) {
  84. Return (0x00)
  85. }
  86. }
  87. }
  88. /* LPC ISA bridge */
  89. Scope(\_SB.PCI0) {
  90. /* PCI D31:f0 LPC ISA bridge */
  91. Device(ISA) {
  92. /* PCI D31:f0 */
  93. Name(_ADR, 0x001f0000)
  94. /* ICH9 PCI to ISA irq remapping */
  95. OperationRegion(PIRQ, PCI_Config, 0x60, 0x0c)
  96. OperationRegion(LPCD, PCI_Config, 0x80, 0x2)
  97. Field(LPCD, AnyAcc, NoLock, Preserve) {
  98. COMA, 3,
  99. , 1,
  100. COMB, 3,
  101. Offset(0x01),
  102. LPTD, 2,
  103. , 2,
  104. FDCD, 2
  105. }
  106. OperationRegion(LPCE, PCI_Config, 0x82, 0x2)
  107. Field(LPCE, AnyAcc, NoLock, Preserve) {
  108. CAEN, 1,
  109. CBEN, 1,
  110. LPEN, 1,
  111. FDEN, 1
  112. }
  113. }
  114. }
  115. #include "acpi/isa.asl"
  116. /* PCI IRQs */
  117. /* Zero => PIC mode, One => APIC Mode */
  118. Name(\PICF, Zero)
  119. Method(\_PIC, 1, NotSerialized) {
  120. Store(Arg0, \PICF)
  121. }
  122. Scope(\_SB) {
  123. Scope(PCI0) {
  124. #define prt_slot_lnk(nr, lnk0, lnk1, lnk2, lnk3) \
  125. Package() { nr##ffff, 0, lnk0, 0 }, \
  126. Package() { nr##ffff, 1, lnk1, 0 }, \
  127. Package() { nr##ffff, 2, lnk2, 0 }, \
  128. Package() { nr##ffff, 3, lnk3, 0 }
  129. #define prt_slot_lnkA(nr) prt_slot_lnk(nr, LNKA, LNKB, LNKC, LNKD)
  130. #define prt_slot_lnkB(nr) prt_slot_lnk(nr, LNKB, LNKC, LNKD, LNKA)
  131. #define prt_slot_lnkC(nr) prt_slot_lnk(nr, LNKC, LNKD, LNKA, LNKB)
  132. #define prt_slot_lnkD(nr) prt_slot_lnk(nr, LNKD, LNKA, LNKB, LNKC)
  133. #define prt_slot_lnkE(nr) prt_slot_lnk(nr, LNKE, LNKF, LNKG, LNKH)
  134. #define prt_slot_lnkF(nr) prt_slot_lnk(nr, LNKF, LNKG, LNKH, LNKE)
  135. #define prt_slot_lnkG(nr) prt_slot_lnk(nr, LNKG, LNKH, LNKE, LNKF)
  136. #define prt_slot_lnkH(nr) prt_slot_lnk(nr, LNKH, LNKE, LNKF, LNKG)
  137. Name(PRTP, Package() {
  138. prt_slot_lnkE(0x0000),
  139. prt_slot_lnkF(0x0001),
  140. prt_slot_lnkG(0x0002),
  141. prt_slot_lnkH(0x0003),
  142. prt_slot_lnkE(0x0004),
  143. prt_slot_lnkF(0x0005),
  144. prt_slot_lnkG(0x0006),
  145. prt_slot_lnkH(0x0007),
  146. prt_slot_lnkE(0x0008),
  147. prt_slot_lnkF(0x0009),
  148. prt_slot_lnkG(0x000a),
  149. prt_slot_lnkH(0x000b),
  150. prt_slot_lnkE(0x000c),
  151. prt_slot_lnkF(0x000d),
  152. prt_slot_lnkG(0x000e),
  153. prt_slot_lnkH(0x000f),
  154. prt_slot_lnkE(0x0010),
  155. prt_slot_lnkF(0x0011),
  156. prt_slot_lnkG(0x0012),
  157. prt_slot_lnkH(0x0013),
  158. prt_slot_lnkE(0x0014),
  159. prt_slot_lnkF(0x0015),
  160. prt_slot_lnkG(0x0016),
  161. prt_slot_lnkH(0x0017),
  162. prt_slot_lnkE(0x0018),
  163. /* INTA -> PIRQA for slot 25 - 31
  164. see the default value of D<N>IR */
  165. prt_slot_lnkA(0x0019),
  166. prt_slot_lnkA(0x001a),
  167. prt_slot_lnkA(0x001b),
  168. prt_slot_lnkA(0x001c),
  169. prt_slot_lnkA(0x001d),
  170. /* PCIe->PCI bridge. use PIRQ[E-H] */
  171. prt_slot_lnkE(0x001e),
  172. prt_slot_lnkA(0x001f)
  173. })
  174. #define prt_slot_gsi(nr, gsi0, gsi1, gsi2, gsi3) \
  175. Package() { nr##ffff, 0, gsi0, 0 }, \
  176. Package() { nr##ffff, 1, gsi1, 0 }, \
  177. Package() { nr##ffff, 2, gsi2, 0 }, \
  178. Package() { nr##ffff, 3, gsi3, 0 }
  179. #define prt_slot_gsiA(nr) prt_slot_gsi(nr, GSIA, GSIB, GSIC, GSID)
  180. #define prt_slot_gsiB(nr) prt_slot_gsi(nr, GSIB, GSIC, GSID, GSIA)
  181. #define prt_slot_gsiC(nr) prt_slot_gsi(nr, GSIC, GSID, GSIA, GSIB)
  182. #define prt_slot_gsiD(nr) prt_slot_gsi(nr, GSID, GSIA, GSIB, GSIC)
  183. #define prt_slot_gsiE(nr) prt_slot_gsi(nr, GSIE, GSIF, GSIG, GSIH)
  184. #define prt_slot_gsiF(nr) prt_slot_gsi(nr, GSIF, GSIG, GSIH, GSIE)
  185. #define prt_slot_gsiG(nr) prt_slot_gsi(nr, GSIG, GSIH, GSIE, GSIF)
  186. #define prt_slot_gsiH(nr) prt_slot_gsi(nr, GSIH, GSIE, GSIF, GSIG)
  187. Name(PRTA, Package() {
  188. prt_slot_gsiE(0x0000),
  189. prt_slot_gsiF(0x0001),
  190. prt_slot_gsiG(0x0002),
  191. prt_slot_gsiH(0x0003),
  192. prt_slot_gsiE(0x0004),
  193. prt_slot_gsiF(0x0005),
  194. prt_slot_gsiG(0x0006),
  195. prt_slot_gsiH(0x0007),
  196. prt_slot_gsiE(0x0008),
  197. prt_slot_gsiF(0x0009),
  198. prt_slot_gsiG(0x000a),
  199. prt_slot_gsiH(0x000b),
  200. prt_slot_gsiE(0x000c),
  201. prt_slot_gsiF(0x000d),
  202. prt_slot_gsiG(0x000e),
  203. prt_slot_gsiH(0x000f),
  204. prt_slot_gsiE(0x0010),
  205. prt_slot_gsiF(0x0011),
  206. prt_slot_gsiG(0x0012),
  207. prt_slot_gsiH(0x0013),
  208. prt_slot_gsiE(0x0014),
  209. prt_slot_gsiF(0x0015),
  210. prt_slot_gsiG(0x0016),
  211. prt_slot_gsiH(0x0017),
  212. prt_slot_gsiE(0x0018),
  213. /*
  214. * INTA -> PIRQA for slot 25 - 31, but 30
  215. * see the default value of D<N>IR
  216. */
  217. prt_slot_gsiA(0x0019),
  218. prt_slot_gsiA(0x001a),
  219. prt_slot_gsiA(0x001b),
  220. prt_slot_gsiA(0x001c),
  221. prt_slot_gsiA(0x001d),
  222. /* PCIe->PCI bridge. use PIRQ[E-H] */
  223. prt_slot_gsiE(0x001e),
  224. prt_slot_gsiA(0x001f)
  225. })
  226. Method(_PRT, 0, NotSerialized) {
  227. /*
  228. * PCI IRQ routing table,
  229. * example from ACPI 2.0a
  230. * specification, section 6.2.8.1
  231. * Note: we provide the same info
  232. * as the PCI routing table
  233. * of the Bochs BIOS
  234. */
  235. If (LEqual(\PICF, Zero)) {
  236. Return (PRTP)
  237. } Else {
  238. Return (PRTA)
  239. }
  240. }
  241. }
  242. Field(PCI0.ISA.PIRQ, ByteAcc, NoLock, Preserve) {
  243. PRQA, 8,
  244. PRQB, 8,
  245. PRQC, 8,
  246. PRQD, 8,
  247. Offset(0x08),
  248. PRQE, 8,
  249. PRQF, 8,
  250. PRQG, 8,
  251. PRQH, 8
  252. }
  253. Method(IQST, 1, NotSerialized) {
  254. /* _STA method - get status */
  255. If (And(0x80, Arg0)) {
  256. Return (0x09)
  257. }
  258. Return (0x0b)
  259. }
  260. Method(IQCR, 1, NotSerialized) {
  261. /* _CRS method - get current settings */
  262. Name(PRR0, ResourceTemplate() {
  263. Interrupt(, Level, ActiveHigh, Shared) { 0 }
  264. })
  265. CreateDWordField(PRR0, 0x05, PRRI)
  266. Store(And(Arg0, 0x0f), PRRI)
  267. Return (PRR0)
  268. }
  269. #define define_link(link, uid, reg) \
  270. Device(link) { \
  271. Name(_HID, EISAID("PNP0C0F")) \
  272. Name(_UID, uid) \
  273. Name(_PRS, ResourceTemplate() { \
  274. Interrupt(, Level, ActiveHigh, Shared) { \
  275. 5, 10, 11 \
  276. } \
  277. }) \
  278. Method(_STA, 0, NotSerialized) { \
  279. Return (IQST(reg)) \
  280. } \
  281. Method(_DIS, 0, NotSerialized) { \
  282. Or(reg, 0x80, reg) \
  283. } \
  284. Method(_CRS, 0, NotSerialized) { \
  285. Return (IQCR(reg)) \
  286. } \
  287. Method(_SRS, 1, NotSerialized) { \
  288. CreateDWordField(Arg0, 0x05, PRRI) \
  289. Store(PRRI, reg) \
  290. } \
  291. }
  292. define_link(LNKA, 0, PRQA)
  293. define_link(LNKB, 1, PRQB)
  294. define_link(LNKC, 2, PRQC)
  295. define_link(LNKD, 3, PRQD)
  296. define_link(LNKE, 4, PRQE)
  297. define_link(LNKF, 5, PRQF)
  298. define_link(LNKG, 6, PRQG)
  299. define_link(LNKH, 7, PRQH)
  300. #define define_gsi_link(link, uid, gsi) \
  301. Device(link) { \
  302. Name(_HID, EISAID("PNP0C0F")) \
  303. Name(_UID, uid) \
  304. Name(_PRS, ResourceTemplate() { \
  305. Interrupt(, Level, ActiveHigh, Shared) { \
  306. gsi \
  307. } \
  308. }) \
  309. Name(_CRS, ResourceTemplate() { \
  310. Interrupt(, Level, ActiveHigh, Shared) { \
  311. gsi \
  312. } \
  313. }) \
  314. Method(_SRS, 1, NotSerialized) { \
  315. } \
  316. }
  317. define_gsi_link(GSIA, 0, 0x10)
  318. define_gsi_link(GSIB, 0, 0x11)
  319. define_gsi_link(GSIC, 0, 0x12)
  320. define_gsi_link(GSID, 0, 0x13)
  321. define_gsi_link(GSIE, 0, 0x14)
  322. define_gsi_link(GSIF, 0, 0x15)
  323. define_gsi_link(GSIG, 0, 0x16)
  324. define_gsi_link(GSIH, 0, 0x17)
  325. }
  326. /* General purpose events */
  327. Scope(\_GPE) {
  328. Name(_HID, "ACPI0006")
  329. Method(_L00) {
  330. }
  331. Method(_L01) {
  332. }
  333. Method(_L02) {
  334. }
  335. Method(_L03) {
  336. }
  337. Method(_L04) {
  338. }
  339. Method(_L05) {
  340. }
  341. Method(_L06) {
  342. }
  343. Method(_L07) {
  344. }
  345. Method(_L08) {
  346. }
  347. Method(_L09) {
  348. }
  349. Method(_L0A) {
  350. }
  351. Method(_L0B) {
  352. }
  353. Method(_L0C) {
  354. }
  355. Method(_L0D) {
  356. }
  357. Method(_L0E) {
  358. }
  359. Method(_L0F) {
  360. }
  361. }
  362. }