From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (NAM12-DM6-obe.outbound.protection.outlook.com [40.107.243.58]) by mx.groups.io with SMTP id smtpd.web11.467.1612805147261327085 for ; Mon, 08 Feb 2021 09:25:47 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@vmware.com header.s=selector2 header.b=BMe/3wIS; spf=pass (domain: vmware.com, ip: 40.107.243.58, mailfrom: awarkentin@vmware.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IHpj6Ywp6Dj+Sfbt2+H1amAenkBo64+hs402RtqDbxmn0gytkPibdmoLS5SGqGcEdJcceEzBI9Fb0xsmm0OgmhF1bu7V/iDJ66M33m67/7PG9ard68aTRPSvPX4yrP6zZ8ApyLZQCd17tsG8d/M07E7QIYOssbrHJdgqtx2Wo6xIlCfIQTnEBXXru3wR1Hn8flEo8HqpoN7JbAR4GhH7HAQgOufI5JvyBGplLKsjy5sPoe6CjE9Jkq69CzyWSgwR+uU946kLlxTmA6qhbUICDkeh7vCN2LsT+YWIK0KAI8wospMlEEsq/Uyg0HX/QFY5hITCbZEArQqnXqAsUy+rpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zonRo7A5AYgPfw/gPPqsv26K3Jz/mAiTAFbY6woSO9k=; b=lZj5k+n7lX7firHYfKg0On8CU99/9280TG7QxESUjTuA0PIRaBddyBzfWGz+6o2z53r+JBR89hxsVonzxM9U8qS1q52CmTEJM9eJOT0OLo+0ARObmX+QKYBzRQ/n0Nos/a3PBk6+NCPR5qneUcGLRJiCTFxeHxIm35ppAs52Yg9wMIZmHhWhDjdaZOF84nZzeklCMtsGnrpBRLVb8Tv6waSg83gjMlSCGOil/BunhtSyO/YP81rLibyY/6+FBblVc3jppxHAbPGDP+oYjjmdeK5vcPNXOwK/8i6Nse2AMalAknlp8tTYfsWzsvH2X4r9wSTFZfhbPYFAOtE5fq8Ltg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=vmware.com; dmarc=pass action=none header.from=vmware.com; dkim=pass header.d=vmware.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vmware.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zonRo7A5AYgPfw/gPPqsv26K3Jz/mAiTAFbY6woSO9k=; b=BMe/3wISNTHv3dU8ASa8fkKkFOYFjAEH+u9cXDaNZO1pL/dXHOWOt0Cy85aa+RkEsna/m2jDHlPk2hX+MJKC6+GZlFuoQkO52RZrs4ongxHFnELpbYujbjHa8biPPyxB8C7zvRfD3ORbaSntq96yWWxKYqm53kopgLpHcNgFkIA= Received: from (2603:10b6:806:f7::16) by SN2PR05MB2752.namprd05.prod.outlook.com (2603:10b6:804:10::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3846.10; Mon, 8 Feb 2021 17:25:44 +0000 Received: from SN7PR05MB7582.namprd05.prod.outlook.com ([fe80::d1f7:9f0e:9655:eadb]) by SN7PR05MB7582.namprd05.prod.outlook.com ([fe80::d1f7:9f0e:9655:eadb%4]) with mapi id 15.20.3846.025; Mon, 8 Feb 2021 17:25:44 +0000 From: "Andrei Warkentin" To: Jeremy Linton , "devel@edk2.groups.io" CC: "pete@akeo.ie" , "samer.el-haj-mahmoud@arm.com" , "leif@nuviainc.com" , "ardb+tianocore@kernel.org" Subject: Re: [PATCH] Platform/RaspberryPi/Acpitables: Add eMMC2 device and tweak Arasan Thread-Topic: [PATCH] Platform/RaspberryPi/Acpitables: Add eMMC2 device and tweak Arasan Thread-Index: AQHW+O0c2Mtgw5XdIEahDQnjni1LBqpOjLZ9 Date: Mon, 8 Feb 2021 17:25:44 +0000 Message-ID: References: <20210201225343.2001835-1-jeremy.linton@arm.com>,<20210201225343.2001835-3-jeremy.linton@arm.com> In-Reply-To: <20210201225343.2001835-3-jeremy.linton@arm.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=vmware.com; x-originating-ip: [69.174.145.79] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: cf16a83c-c240-49cc-21bc-08d8cc5690da x-ms-traffictypediagnostic: SN2PR05MB2752: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:6790; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: cuMu7YPQIqJOnEPNxWKKYNDV5mexwTdTKV7xIlcK1/Dh90bACcaprvX/QUpUhoJ7pKL1OATnbk/ns7w45MQfIrVql7xlzIik+nW3ujzT+FNqijf+uwdbuHKaNudcVP3CxwaJBtEU0iRNMD8dKwB7Q6LQcwDKJJeVcVJ6aQTAYOctKlKgsdcqFitMvniFPufTAO1EhY6kq9/DdEIA8Lz+BGQttVXzWALNoqB3TtDB1nmE2DCZ0zXTe237/UMGOR5pxPMPl+fUgEcFVscujm7Tv0ergb6htVPJ40WcjgrbwINj7uXghNqrtS2o0rJl06723kkmKliDN9i5RGjKeo9Q3PGWz8h4wkf3CMnZ5rR40sSYFKYSXlkLiZMb76mvndUh2GGCh8wL/d8hDNMqo0tCExB/DrsacVixwnZYLuj1eK4kOzX7gxokeyitPbEe5YTWGF6s6KI9WhIQDzWnO222BoeNzrJamjVc8wLhDRzBVjJOh1ITbrQJp50tJBjhsiAQfMSH/uaQrYqDmJPR8gYaoA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR05MB7582.namprd05.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(376002)(346002)(136003)(366004)(396003)(39860400002)(52536014)(5660300002)(66946007)(83380400001)(8676002)(66446008)(64756008)(71200400001)(478600001)(66556008)(86362001)(26005)(66476007)(19627405001)(186003)(4326008)(54906003)(110136005)(7696005)(76116006)(55016002)(316002)(2906002)(8936002)(9686003)(33656002)(53546011)(6506007);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: =?us-ascii?Q?h/gX5B2GaE+hAphkMKmlV9covFeSqlVt411ly3PLl7TmlFiq88ajw4k5bJiD?= =?us-ascii?Q?QDTkyUfdjaD1mv/aFhP/PzmzdU9+NrOJIMaWiieXUhWmBOybIbUNvLEZKt32?= =?us-ascii?Q?4B8G2a4sLeY2JgfvoAXV9/00aNyjks8ywlByzjQsK9LEcW2/2TtWoQncnd3b?= =?us-ascii?Q?DWFWzCCdyxjE03KL4hNl2ow9MVWLwEq+H/64bYOSkOVhHo2+mfuZ4beA5+yW?= =?us-ascii?Q?kgC93upLe16hPY7U1jilQ1HWypxmRpR5HcY53s4UVqloaGM5Yoq+IxRxaygC?= =?us-ascii?Q?YmaFXgb+VZTUmMX9WqfCG5YFwx84e8jSNeG6VePDKTIljCAzHBxgmKUljKhs?= =?us-ascii?Q?WCGULuHJTwZpDzGEByntdfI90JeWAdNigWglJK6NdeiyrTm8UohBkW1cVkIc?= =?us-ascii?Q?RD1X6K4eZ75L3GVlQivqGsy66yGZWWRy8Uoq2OGJptDTvAS2na/MzN8IiuAt?= =?us-ascii?Q?hdKhG9pyS6V1zBMYt5+RZnVVRexqAvWOJ+BzBk/QMGNvYEWVQ3wq4iFP3wGv?= =?us-ascii?Q?GVw8E3FoGOnMEaUvOgVR9ssfK/F4Y5T5mkIPCKZojHE6TQl4/GQo4hnjSjii?= =?us-ascii?Q?j/a6NF+II+nqKzqEztVKvlkXhUmgkR8MSw4s9Ctl/vAjg44EkcO5rtjvIAXe?= =?us-ascii?Q?a3XMAQ1ozLMqEkm/hQ1k0Sl19YLCXca7Y3q5nFCiFLVJswQLwUCHhIJ220sF?= =?us-ascii?Q?K7iZ3CLqryTSH0/ifEtr9zQa7mcQv5RqkFEXgfdGVRvP6sXtgDkRCA/DlY2U?= =?us-ascii?Q?en4uiqf9YIdZ5YZmSvJeBL7c/Yb9OkhF4d1oSaUTBTHzmgBx5hsfPmyRqslj?= =?us-ascii?Q?IauRac5pGuynLntJ2l1YOral38A+lvaxy9WIsO5DvwssUZiY+zxSHdhmUtH3?= =?us-ascii?Q?miOCEE5F/KUTUCseOxv0tRIcUcFtmDBsWBpq+t2WIXdm5LgRUjbvRqcw8KUI?= =?us-ascii?Q?zaMYYHnKz0JREexBZ5ZFRl900YXJNpoi1HIfu7go5ZDFhc0qhlZPLg6JbjKg?= =?us-ascii?Q?PVPGoMZ8Nwfu/fSzCxdq+SEXM8yjt2uHkTZBw0+shCQgJt/w8om6jCRl03NI?= =?us-ascii?Q?HB2wW4LeqI8niVdEI7t3UccgQc3HhJ5WuHepviiP6LGM+U6s3Or8186VeOvf?= =?us-ascii?Q?Ge766QYKXsjCizqS59lAjdk2bnCP6aWTyXZJdjhBAyrnjvzLpL6rG6ltEeGI?= =?us-ascii?Q?SLhIpqISQxmyv9jLIFgqTFiL2zPGx1tU3wkjkIaWaDfg/hLQVBGcY3rYvpxQ?= =?us-ascii?Q?9KqK5YAOlPamAkVNuIi99IwvfDHLde+o60PGjsOGwZbPpVdyNPID67ysc3TH?= =?us-ascii?Q?r1I=3D?= x-ms-exchange-transport-forked: True MIME-Version: 1.0 X-OriginatorOrg: vmware.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN7PR05MB7582.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cf16a83c-c240-49cc-21bc-08d8cc5690da X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Feb 2021 17:25:44.1268 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: b39138ca-3cee-4b4a-a4d6-cd83d9dd62f0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 5sAz8xT4sMhphin1vQzL14HzZ7xmjKljdjJYIkP4a3IkATbYsLR5azBGX9qZFafyqVfs5SRBX4wn6lBiRM8Cxg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN2PR05MB2752 Content-Language: en-US Content-Type: multipart/alternative; boundary="_000_SN7PR05MB75826F97806CBF62D034E7F7B98F9SN7PR05MB7582namp_" --_000_SN7PR05MB75826F97806CBF62D034E7F7B98F9SN7PR05MB7582namp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable [with all of Pete's comments] Reviewed-by: Andrei Warkentin ________________________________ From: Jeremy Linton Sent: Monday, February 1, 2021 4:53 PM To: devel@edk2.groups.io Cc: pete@akeo.ie ; Andrei Warkentin ; = samer.el-haj-mahmoud@arm.com ; leif@nuviainc.= com ; ardb+tianocore@kernel.org ; Jeremy Linton Subject: [PATCH] Platform/RaspberryPi/Acpitables: Add eMMC2 device and twea= k Arasan The primarly problem with the rpi Arasan controller working with a default SDHCI driver is the lack of a meaningful capabilities register. As such if we add a _DSD entry to provide that information, we can then bind it 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 --- Platform/RaspberryPi/AcpiTables/AcpiTables.inf | 1 + Platform/RaspberryPi/AcpiTables/Emmc.asl | 131 +++++++++++++++++= ++++ Platform/RaspberryPi/AcpiTables/Sdhc.asl | 18 ++- Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c | 6 + 4 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 Platform/RaspberryPi/AcpiTables/Emmc.asl diff --git a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf b/Platform/Rasp= berryPi/AcpiTables/AcpiTables.inf index d2cce074e5..743261afcf 100644 --- a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf +++ b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf @@ -35,6 +35,7 @@ Spcr.aslc Pptt.aslc SsdtThermal.asl + Emmc.asl [Packages] ArmPkg/ArmPkg.dec diff --git a/Platform/RaspberryPi/AcpiTables/Emmc.asl b/Platform/RaspberryP= i/AcpiTables/Emmc.asl new file mode 100644 index 0000000000..f089068556 --- /dev/null +++ b/Platform/RaspberryPi/AcpiTables/Emmc.asl @@ -0,0 +1,131 @@ +/** @file + * + * Copyright (c) 2021 Arm. All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#include +#include + +#include "AcpiTables.h" + +DefinitionBlock (__FILE__, "SSDT", 5, "RPIFDN", "RPI4EMMC", 2) +{ + Scope (\_SB_) + { +#if (RPI_MODEL =3D=3D 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() { + /* + * XHC0 is limited to DMA to first 3GB. Note this + * only applies to PCIe, not GENET or other devices + * next to the A72. + */ + 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) + } + + // Unfortunatly 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 }, + } + }) + // We also disable both SDMA and ADMA2 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) + { + if (SDMA =3D=3D 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 +} diff --git a/Platform/RaspberryPi/AcpiTables/Sdhc.asl b/Platform/RaspberryP= i/AcpiTables/Sdhc.asl index 0ab1ba27f2..0430ab7d2d 100644 --- a/Platform/RaspberryPi/AcpiTables/Sdhc.asl +++ b/Platform/RaspberryPi/AcpiTables/Sdhc.asl @@ -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_M= MCHS1_INTERRUPT } + Interrupt (ResourceConsumer, Level, ActiveHigh, Shared) { BCM2836_MMCH= S1_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 diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/= RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c index ca7533cbee..7f26f7b4be 100644 --- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c @@ -738,6 +738,12 @@ STATIC CONST NAMESPACE_TABLES SdtTables[] =3D { 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, 0, -- 2.13.7 --_000_SN7PR05MB75826F97806CBF62D034E7F7B98F9SN7PR05MB7582namp_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable
[with all of Pete's comments]

Reviewed-by: Andrei Warkentin <awarkentin@vmware.com>

From: Jeremy Linton <jer= emy.linton@arm.com>
Sent: Monday, February 1, 2021 4:53 PM
To: devel@edk2.groups.io <devel@edk2.groups.io>
Cc: pete@akeo.ie <pete@akeo.ie>; Andrei Warkentin <awarkent= in@vmware.com>; samer.el-haj-mahmoud@arm.com <samer.el-haj-mahmoud@ar= m.com>; leif@nuviainc.com <leif@nuviainc.com>; ardb+tianocore@kern= el.org <ardb+tianocore@kernel.org>; Jeremy Linton <jeremy.linton@a= rm.com>
Subject: [PATCH] Platform/RaspberryPi/Acpitables: Add eMMC2 device a= nd tweak Arasan
 
The primarly problem with the rpi Arasan controlle= r working
with a default SDHCI driver is the lack of a meaningful
capabilities register. As such if we add a _DSD entry
to provide that information, we can then bind it 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>
---
 Platform/RaspberryPi/AcpiTables/AcpiTables.inf    = ; |   1 +
 Platform/RaspberryPi/AcpiTables/Emmc.asl     = ;      | 131 +++++++++++++++++++++
 Platform/RaspberryPi/AcpiTables/Sdhc.asl     = ;      |  18 ++-
 Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c |   6 +<= br>  4 files changed, 153 insertions(+), 3 deletions(-)
 create mode 100644 Platform/RaspberryPi/AcpiTables/Emmc.asl

diff --git a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf b/Platform/Rasp= berryPi/AcpiTables/AcpiTables.inf
index d2cce074e5..743261afcf 100644
--- a/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
+++ b/Platform/RaspberryPi/AcpiTables/AcpiTables.inf
@@ -35,6 +35,7 @@
   Spcr.aslc

   Pptt.aslc

   SsdtThermal.asl

+  Emmc.asl

 

 [Packages]

   ArmPkg/ArmPkg.dec

diff --git a/Platform/RaspberryPi/AcpiTables/Emmc.asl b/Platform/RaspberryP= i/AcpiTables/Emmc.asl
new file mode 100644
index 0000000000..f089068556
--- /dev/null
+++ b/Platform/RaspberryPi/AcpiTables/Emmc.asl
@@ -0,0 +1,131 @@
+/** @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 =3D=3D 4)
+    Device (GDV1) {
+      Name (_HID, "ACPI0004")
+      Name (_UID, 0x0)
+      Name (_CCA, 0x0)
+
+      Name (RBUF, ResourceTemplate ()
+      {
+          MEMORY32FIXED (Read= Write, 0, MMCHS2_LENGTH, RMEM)
+      })
+      Method (_CRS, 0x0, Serialized)
+      {
+        MEMORY32SETBASE (RBUF, RMEM, RB= AS, MMCHS2_OFFSET)
+        Return (^RBUF)
+      }
+
+      Name (_DMA, ResourceTemplate() {
+        /*
+         * XHC0 is limited to DMA = to first 3GB. Note this
+         * only applies to PCIe, n= ot GENET or other devices
+         * next to the A72.
+         */
+        QWordMemory (ResourceConsumer,<= br> +            ,
+            MinFixe= d,
+            MaxFixe= d,
+            NonCach= eable,
+            ReadWri= te,
+            0x0, +            0x00000= 000C0000000, // MIN
+            0x00000= 000FFFFFFFF, // MAX
+            0xFFFFF= FFF40000000, // TRA
+            0x00000= 00040000000, // LEN
+            ,
+            ,
+            )
+      })
+     
+      // emmc2 Host Controller. (brcm,bcm2711-emm= c2)
+      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 (ResourceConsum= er, Level, ActiveHigh, Shared) { BCM2836_MMCHS1_INTERRUPT }
+       })
+       Method (_CRS, 0x0, Serialized)
+       {
+         MEMORY32SETBASE (RBUF, RM= EM, RBAS, MMCHS2_OFFSET)
+         Return (^RBUF)
+       }
+
+        // Unfortunatly this controller= doesn't honor the
+        // standard sdhci voltage contr= ol registers
+        // (or at least linux's standar= d code can't
+        // lower the voltage) So, UHS m= ode is disabled with caps
+        Name (DSD1, Package () {
+            ToUUID(= "daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+            Package= () {
+            &n= bsp;  Package () { "sdhci-caps-mask", 0x0000000500080000 },<= br> +           }
+        })
+       // We also disable both SDMA and ADMA= 2 until the linux
+       // _DMA() mask/translate works proper= ly
+        Name (DSD2, Package () {
+            ToUUID(= "daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+            Package= () {
+            &n= bsp;  Package () { "sdhci-caps-mask", 0x0000000504480000 },<= br> +           }
+        })
+       Method (_DSD, 0x0, Serialized)
+        {
+          if (SDMA =3D=3D 0) =
+          {
+            return = (^DSD2)
+          }
+          else
+          {
+            return = (^DSD1)
+          }
+        }
+
+        //
+        // A child device that represen= ts 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
+}
diff --git a/Platform/RaspberryPi/AcpiTables/Sdhc.asl b/Platform/RaspberryP= i/AcpiTables/Sdhc.asl
index 0ab1ba27f2..0430ab7d2d 100644
--- a/Platform/RaspberryPi/AcpiTables/Sdhc.asl
+++ b/Platform/RaspberryPi/AcpiTables/Sdhc.asl
@@ -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)<= br>
-    Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusi= ve) { 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", 0x0100= fa81 },

+    }

+  })

+

   //

   // 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

diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/= RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
index ca7533cbee..7f26f7b4be 100644
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
@@ -738,6 +738,12 @@ STATIC CONST NAMESPACE_TABLES SdtTables[] =3D {
     SsdtNameOpReplace

   },

   {

+    SIGNATURE_64 ('R', 'P', 'I', '4', 'E', 'M', 'M', 'C'),<= br>
+    0,

+    PcdToken(PcdSdIsArasan),

+    NULL

+  },

+  {

     SIGNATURE_64 ('R', 'P', 'I', 0, 0, 0, 0, 0),

     0,

     0,

--
2.13.7

--_000_SN7PR05MB75826F97806CBF62D034E7F7B98F9SN7PR05MB7582namp_--