ArmVirtPkg/FdtClientDxe: take DT node 'status' properties into account

DT has a [pseudo-]standardized 'status' property that can be set on
any node, and which signifies that a node should be treated as
absent unless it is set to 'ok' or 'okay'. So take this into account
when iterating over nodes.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
Ard Biesheuvel 2018-11-21 12:58:26 +01:00
parent 8b9025345e
commit 32f5975770
1 changed files with 33 additions and 5 deletions

View File

@ -78,6 +78,33 @@ SetNodeProperty (
return EFI_SUCCESS;
}
STATIC
BOOLEAN
IsNodeEnabled (
INT32 Node
)
{
CONST CHAR8 *NodeStatus;
INT32 Len;
//
// A missing status property implies 'ok' so ignore any errors that
// may occur here. If the status property is present, check whether
// it is set to 'ok' or 'okay', anything else is treated as 'disabled'.
//
NodeStatus = fdt_getprop (mDeviceTreeBase, Node, "status", &Len);
if (NodeStatus == NULL) {
return TRUE;
}
if (Len >= 5 && AsciiStrCmp (NodeStatus, "okay") == 0) {
return TRUE;
}
if (Len >= 3 && AsciiStrCmp (NodeStatus, "ok") == 0) {
return TRUE;
}
return FALSE;
}
STATIC
EFI_STATUS
EFIAPI
@ -101,6 +128,10 @@ FindNextCompatibleNode (
break;
}
if (!IsNodeEnabled (Next)) {
continue;
}
Type = fdt_getprop (mDeviceTreeBase, Next, "compatible", &Len);
if (Type == NULL) {
continue;
@ -210,7 +241,6 @@ FindNextMemoryNodeReg (
{
INT32 Prev, Next;
CONST CHAR8 *DeviceType;
CONST CHAR8 *NodeStatus;
INT32 Len;
EFI_STATUS Status;
@ -223,10 +253,8 @@ FindNextMemoryNodeReg (
break;
}
NodeStatus = fdt_getprop (mDeviceTreeBase, Next, "status", &Len);
if (NodeStatus != NULL && AsciiStrCmp (NodeStatus, "okay") != 0) {
DEBUG ((DEBUG_WARN, "%a: ignoring memory node with status \"%a\"\n",
__FUNCTION__, NodeStatus));
if (!IsNodeEnabled (Next)) {
DEBUG ((DEBUG_WARN, "%a: ignoring disabled memory node\n", __FUNCTION__));
continue;
}