Platform/RaspberryPi/Acpitables: Add eMMC2 device and tweak Arasan

The primary problem with the RPi's Arasan controller is
the lack of a meaningful capabilities register. With just
a sdhci-caps _DSD entry we can provide that information. It
can then be bound to the Linux sdhci_iproc driver which
already hardcodes the remaining controller bugs.

Further we have gotten BRCME88C approved as the HID
for the newer eMMC2 controller. So lets define an
ACPI object to describe it.

Of course both devices are sharing an interrupt so
we should also indicate that in the table as well.

Signed-off-by: Jeremy Linton <jeremy.linton@arm.com>
Reviewed-by: Pete Batard <pete@akeo.ie>
Reviewed-by: Andrei Warkentin <awarkentin@vmware.com>
This commit is contained in:
Jeremy Linton
2021-02-18 19:37:55 +01:00
committed by Ard Biesheuvel
parent ac87b52041
commit 311ed3c790
4 changed files with 151 additions and 3 deletions

View File

@@ -25,6 +25,7 @@
[Sources]
AcpiTables.h
Emmc.asl
Madt.aslc
Fadt.aslc
Dbg2.aslc

View File

@@ -0,0 +1,129 @@
/** @file
*
* Copyright (c) 2021 Arm. All rights reserved.
*
* SPDX-License-Identifier: BSD-2-Clause-Patent
*
**/
#include <IndustryStandard/Bcm2836SdHost.h>
#include <IndustryStandard/Bcm2836Sdio.h>
#include "AcpiTables.h"
DefinitionBlock (__FILE__, "SSDT", 5, "RPIFDN", "RPI4EMMC", 2)
{
Scope (\_SB_)
{
#if (RPI_MODEL == 4)
Device (GDV1) {
Name (_HID, "ACPI0004")
Name (_UID, 0x0)
Name (_CCA, 0x0)
Name (RBUF, ResourceTemplate ()
{
MEMORY32FIXED (ReadWrite, 0, MMCHS2_LENGTH, RMEM)
})
Method (_CRS, 0x0, Serialized)
{
MEMORY32SETBASE (RBUF, RMEM, RBAS, MMCHS2_OFFSET)
Return (^RBUF)
}
Name (_DMA, ResourceTemplate() {
QWordMemory (ResourceConsumer,
,
MinFixed,
MaxFixed,
NonCacheable,
ReadWrite,
0x0,
0x00000000C0000000, // MIN
0x00000000FFFFFFFF, // MAX
0xFFFFFFFF40000000, // TRA
0x0000000040000000, // LEN
,
,
)
})
// emmc2 Host Controller. (brcm,bcm2711-emmc2)
Device (SDC3)
{
Name (_HID, "BRCME88C")
Name (_UID, 0x1)
Name (_CCA, 0x0)
Name (_S1D, 0x1)
Name (_S2D, 0x1)
Name (_S3D, 0x1)
Name (_S4D, 0x1)
Name (SDMA, 0x2)
Method (_STA)
{
Return(0xf)
}
Name (RBUF, ResourceTemplate ()
{
MEMORY32FIXED (ReadWrite, 0, MMCHS2_LENGTH, RMEM)
Interrupt (ResourceConsumer, Level, ActiveHigh, Shared) { BCM2836_MMCHS1_INTERRUPT }
})
Method (_CRS, 0x0, Serialized)
{
MEMORY32SETBASE (RBUF, RMEM, RBAS, MMCHS2_OFFSET)
Return (^RBUF)
}
// Unfortunately this controller doesn't honor the
// standard SDHCI voltage control registers
// (or at least Linux's standard code can't
// lower the voltage) So, UHS mode is disabled with caps
Name (DSD1, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "sdhci-caps-mask", 0x0000000500080000 },
}
})
// Along with disabling UHS, here both SDMA and ADMA2
// are also disabled until the linux _DMA() mask/translate
// works properly.
Name (DSD2, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "sdhci-caps-mask", 0x0000000504480000 },
}
})
Method (_DSD, 0x0, Serialized)
{
// Select one of the sdhci-caps-mask definitions
// depending on whether we also want to disable DMA
if (SDMA == 0)
{
return (^DSD2)
}
else
{
return (^DSD1)
}
}
//
// A child device that represents the
// sd card, which is marked as non-removable.
//
Device (SDMM)
{
Method (_ADR)
{
Return (0)
}
Method (_RMV) // Is removable
{
Return (0) // 0 - fixed
}
}
} //SDC3
} //GDV1
#endif
} //\SB
}

View File

@@ -19,7 +19,7 @@
// Note: UEFI can use either SDHost or Arasan. We expose both to the OS.
//
// ArasanSD 3.0 SD Host Controller.
// ArasanSD 3.0 SD Host Controller. (brcm,bcm2835-sdhci)
Device (SDC1)
{
Name (_HID, "BCM2847")
@@ -37,7 +37,7 @@ Device (SDC1)
Name (RBUF, ResourceTemplate ()
{
MEMORY32FIXED (ReadWrite, 0, MMCHS1_LENGTH, RMEM)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { BCM2836_MMCHS1_INTERRUPT }
Interrupt (ResourceConsumer, Level, ActiveHigh, Shared) { BCM2836_MMCHS1_INTERRUPT }
})
Method (_CRS, 0x0, Serialized)
{
@@ -45,6 +45,17 @@ Device (SDC1)
Return (^RBUF)
}
// The standard CAPs registers on this controller
// appear to be 0, lets set some minimal defaults
// Since this cap doesn't indicate DMA capability
// we don't need a _DMA()
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "sdhci-caps", 0x0100fa81 },
}
})
//
// A child device that represents the
// sd card, which is marked as non-removable.
@@ -62,7 +73,7 @@ Device (SDC1)
}
}
#if (RPI_MODEL < 4)
// Broadcom SDHost 2.0 SD Host Controller
Device (SDC2)
{
@@ -105,3 +116,4 @@ Device (SDC2)
}
}
}
#endif // !RPI4

View File

@@ -727,6 +727,12 @@ STATIC CONST NAMESPACE_TABLES SdtTables[] = {
0,
SsdtNameOpReplace
},
{
SIGNATURE_64 ('R', 'P', 'I', '4', 'E', 'M', 'M', 'C'),
0,
PcdToken(PcdSdIsArasan),
NULL
},
{
SIGNATURE_64 ('R', 'P', 'I', 0, 0, 0, 0, 0),
0,