Emmc.asl 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /** @file
  2. *
  3. * Copyright (c) 2021, ARM Limited. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause-Patent
  6. *
  7. **/
  8. #include <IndustryStandard/Bcm2836SdHost.h>
  9. #include <IndustryStandard/Bcm2836Sdio.h>
  10. #include <IndustryStandard/Bcm2711.h>
  11. #include "AcpiTables.h"
  12. DefinitionBlock (__FILE__, "SSDT", 2, "RPIFDN", "RPI4EMMC", 2)
  13. {
  14. Scope (\_SB_)
  15. {
  16. #if (RPI_MODEL == 4)
  17. Device (GDV1) {
  18. Name (_HID, "ACPI0004")
  19. Name (_UID, 0x2)
  20. Name (_CCA, 0x0)
  21. Name (RBUF, ResourceTemplate ()
  22. {
  23. MEMORY32FIXED (ReadWrite, 0, MMCHS2_LENGTH, RMEM)
  24. })
  25. Method (_CRS, 0x0, Serialized)
  26. {
  27. MEMORY32SETBASE (RBUF, RMEM, RBAS, MMCHS2_OFFSET)
  28. Return (^RBUF)
  29. }
  30. // Translated DMA region for BCM2711 silicon revisions older than C0
  31. Name (DMTR, ResourceTemplate() {
  32. QWordMemory (ResourceProducer,
  33. ,
  34. MinFixed,
  35. MaxFixed,
  36. NonCacheable,
  37. ReadWrite,
  38. 0x0,
  39. 0x00000000C0000000, // MIN
  40. 0x00000000FFFFFFFF, // MAX
  41. 0xFFFFFFFF40000000, // TRA
  42. 0x0000000040000000, // LEN
  43. ,
  44. ,
  45. )
  46. })
  47. // Non translated DMA region for BCM2711 revisions C0 and newer
  48. Name (DMNT, ResourceTemplate() {
  49. QWordMemory (ResourceProducer,
  50. ,
  51. MinFixed,
  52. MaxFixed,
  53. NonCacheable,
  54. ReadWrite,
  55. 0x0,
  56. 0x0000000000000000, // MIN
  57. 0x000000FFFFFFFFFF, // MAX
  58. 0x0000000000000000, // TRA
  59. 0x0000010000000000, // LEN
  60. ,
  61. ,
  62. )
  63. })
  64. Method (_DMA, 0x0, Serialized)
  65. {
  66. OperationRegion (CHPR, SystemMemory, ID_CHIPREV, 0x4)
  67. Field (CHPR, DWordAcc, NoLock, Preserve) {
  68. SOCI, 32
  69. }
  70. if ((SOCI & 0xFF) >= 0x20)
  71. {
  72. return (^DMNT);
  73. }
  74. else
  75. {
  76. return (^DMTR);
  77. }
  78. }
  79. // emmc2 Host Controller. (brcm,bcm2711-emmc2)
  80. Device (SDC3)
  81. {
  82. Name (_HID, "BRCME88C")
  83. Name (_UID, 0x1)
  84. Name (_CCA, 0x0)
  85. Name (_S1D, 0x1)
  86. Name (_S2D, 0x1)
  87. Name (_S3D, 0x1)
  88. Name (_S4D, 0x1)
  89. Name (SDMA, 0x2)
  90. Method (_STA)
  91. {
  92. Return(0xf)
  93. }
  94. Name (RBUF, ResourceTemplate ()
  95. {
  96. MEMORY32FIXED (ReadWrite, 0, MMCHS2_LENGTH, RMEM)
  97. Interrupt (ResourceConsumer, Level, ActiveHigh, Shared) { BCM2836_MMCHS1_INTERRUPT }
  98. })
  99. Method (_CRS, 0x0, Serialized)
  100. {
  101. MEMORY32SETBASE (RBUF, RMEM, RBAS, MMCHS2_OFFSET)
  102. Return (^RBUF)
  103. }
  104. // Unfortunately this controller doesn't honor the
  105. // standard SDHCI voltage control registers
  106. // (or at least Linux's standard code can't
  107. // lower the voltage) So, UHS mode is disabled with caps
  108. Name (DSD1, Package () {
  109. ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
  110. Package () {
  111. Package () { "sdhci-caps-mask", 0x0000000500080000 },
  112. }
  113. })
  114. // Along with disabling UHS, here both SDMA and ADMA2
  115. // are also disabled until the linux _DMA() mask/translate
  116. // works properly.
  117. Name (DSD2, Package () {
  118. ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
  119. Package () {
  120. Package () { "sdhci-caps-mask", 0x0000000504480000 },
  121. }
  122. })
  123. Method (_DSD, 0x0, Serialized)
  124. {
  125. // Select one of the sdhci-caps-mask definitions
  126. // depending on whether we also want to disable DMA
  127. if (SDMA == 0)
  128. {
  129. return (^DSD2)
  130. }
  131. else
  132. {
  133. return (^DSD1)
  134. }
  135. }
  136. //
  137. // A child device that represents the
  138. // sd card, which is marked as non-removable.
  139. //
  140. Device (SDMM)
  141. {
  142. Method (_ADR)
  143. {
  144. Return (0)
  145. }
  146. Method (_RMV) // Is removable
  147. {
  148. Return (0) // 0 - fixed
  149. }
  150. }
  151. } //SDC3
  152. } //GDV1
  153. #endif
  154. } //\SB
  155. }