summaryrefslogtreecommitdiffstats
path: root/ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
diff options
context:
space:
mode:
authorGirish Pathak <girish.pathak@arm.com>2018-06-19 14:53:52 +0100
committerArd Biesheuvel <ard.biesheuvel@linaro.org>2018-06-22 08:21:30 +0200
commit889cf68c3cd67617e274526822e553bfb07cd231 (patch)
tree77c841d775bf227763ea1e5fc245bae8556b68da /ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
parent09ef8e92580caddc24f8f1db6ea0e8223890085f (diff)
downloadedk2-889cf68c3cd67617e274526822e553bfb07cd231.tar.gz
edk2-889cf68c3cd67617e274526822e553bfb07cd231.tar.bz2
edk2-889cf68c3cd67617e274526822e553bfb07cd231.zip
ArmPkg/ArmScmiDxe: Fix ASSERT error in SCMI DXE
This change fixes a bug in the SCMI DXE which is observed with the upcoming release of the SCP firmware. The PROTOCOL_ID_MASK (0xF) which is used to generate an index in the ProtocolInitFxns is wrong because protocol ids can be anywhere in 0x10 - 15 or 0x80 - FF range. This mask generates the same index for two different protocols e.g. for protocol ids 0x10 and 0x90, which causes duplicate initialization of a protocol resulting in a failure. This change removes the use of PROTOCOL_ID_MASK and instead uses a list of protocol ids and their initialization functions to identify a supported protocol and initialize it. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Girish Pathak <girish.pathak@arm.com> Tested-by: Sudeep Holla <sudeep.holla@arm.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Diffstat (limited to 'ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c')
-rw-r--r--ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c b/ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
index 2920c6f6f3..a56c7b21d5 100644
--- a/ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
+++ b/ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
@@ -29,13 +29,10 @@
#include "ScmiDxe.h"
#include "ScmiPrivate.h"
-STATIC CONST SCMI_PROTOCOL_INIT_TABLE ProtocolInitFxns[MAX_PROTOCOLS] = {
- { ScmiBaseProtocolInit },
- { NULL },
- { NULL },
- { ScmiPerformanceProtocolInit },
- { ScmiClockProtocolInit },
- { NULL }
+STATIC CONST SCMI_PROTOCOL_ENTRY Protocols[] = {
+ { SCMI_PROTOCOL_ID_BASE, ScmiBaseProtocolInit },
+ { SCMI_PROTOCOL_ID_PERFORMANCE, ScmiPerformanceProtocolInit },
+ { SCMI_PROTOCOL_ID_CLOCK, ScmiClockProtocolInit }
};
/** ARM SCMI driver entry point function.
@@ -65,14 +62,14 @@ ArmScmiDxeEntryPoint (
UINT32 Version;
UINT32 Index;
UINT32 NumProtocols;
- UINT32 ProtocolNo;
+ UINT32 ProtocolIndex;
UINT8 SupportedList[MAX_PROTOCOLS];
UINT32 SupportedListSize = sizeof (SupportedList);
- ProtocolNo = SCMI_PROTOCOL_ID_BASE & PROTOCOL_ID_MASK;
-
// Every SCMI implementation must implement the base protocol.
- Status = ProtocolInitFxns[ProtocolNo].Init (&ImageHandle);
+ ASSERT (Protocols[0].Id == SCMI_PROTOCOL_ID_BASE);
+
+ Status = ScmiBaseProtocolInit (&ImageHandle);
if (EFI_ERROR (Status)) {
ASSERT (FALSE);
return Status;
@@ -123,13 +120,16 @@ ArmScmiDxeEntryPoint (
}
// Install supported protocol on ImageHandle.
- for (Index = 0; Index < NumProtocols; Index++) {
- ProtocolNo = SupportedList[Index] & PROTOCOL_ID_MASK;
- if (ProtocolInitFxns[ProtocolNo].Init != NULL) {
- Status = ProtocolInitFxns[ProtocolNo].Init (&ImageHandle);
- if (EFI_ERROR (Status)) {
- ASSERT (FALSE);
- return Status;
+ for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
+ ProtocolIndex++) {
+ for (Index = 0; Index < NumProtocols; Index++) {
+ if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
+ Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+ break;
}
}
}