blob: 32d99d98d80396e160a6c4d74503642c726b4202 [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include "lib/boot-shim/devicetree.h"
namespace boot_shim {
devicetree::ScanState ArmDevicetreeQcomRngItem::OnNode(const devicetree::NodePath& path,
const devicetree::PropertyDecoder& decoder) {
auto compatibles =
decoder.FindAndDecodeProperty<&devicetree::PropertyValue::AsStringList>("compatible");
if (!compatibles) {
return devicetree::ScanState::kActive;
}
if (std::find(compatibles->begin(), compatibles->end(), kCompatible) == compatibles->end()) {
return devicetree::ScanState::kActive;
}
auto [reg_property, req_config] = decoder.FindProperties("reg", "qcom,no-qrng-config");
if (!reg_property) {
return devicetree::ScanState::kDone;
}
auto reg = reg_property->AsReg(decoder);
if (!reg) {
return devicetree::ScanState::kDone;
}
std::optional<uint64_t> base_address = (*reg)[0].address();
std::optional<uint64_t> size = (*reg)[0].size();
if (!base_address || !size) {
return devicetree::ScanState::kDone;
}
std::optional<uint64_t> translated_base_address = decoder.TranslateAddress(*base_address);
if (!translated_base_address) {
return devicetree::ScanState::kDone;
}
// When this property is present, the hw has been configured already, and is ready to be used.
uint32_t flags = req_config.has_value() ? ZBI_QCOM_RNG_FLAGS_ENABLED : 0;
set_payload({.mmio_phys = *translated_base_address, .flags = flags});
(*mmio_observer_)(MmioRange{.address = *translated_base_address, .size = *size});
return devicetree::ScanState::kDone;
}
} // namespace boot_shim