riscv64: integrate minimal flattened devicetree reader and switch timer to time CSR
Punch list §25 item 0.3 NOT complete. - Added `starkernel/fdt.h` and `fdt.c` for minimal read-only devicetree parsing: sufficient for boot-time lookups such as `timebase-frequency`. - Bootloader now captures the devicetree blob (DTB) from `EFI_DTB_TABLE_GUID` into `BootInfo::dtb`. - RISC-V timer subsystem now uses the `time` CSR as the primary timestamp source, abandoning the hardcoded `cycle` frequency assumption. - Timer rate is read from `timebase-frequency` in the DTB when accessible; otherwise, a fallback value is used with a RELATIVE trust level. - Integrated the SBI TIME extension for one-shot timer deadlines, ensuring re-arming occurs after each tick to avoid missing heartbeats. Verified: riscv64 builds clean, boots to the ok> prompt with no regression; `riscv64/timer.c` reports accurate frequencies on QEMU's default firmware. Signed-off-by: Robert Allan James <robert.allan.james@gmail.com>
This commit is contained in:
@@ -773,6 +773,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable
|
||||
/* Fill BootInfo fields that do NOT require EBS first */
|
||||
g_boot_info.runtime_services = SystemTable->RuntimeServices;
|
||||
g_boot_info.acpi_table = NULL;
|
||||
g_boot_info.dtb = NULL;
|
||||
g_boot_info.framebuffer.base = NULL;
|
||||
g_boot_info.framebuffer.size = 0;
|
||||
g_boot_info.framebuffer.width = 0;
|
||||
@@ -805,6 +806,19 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable
|
||||
if (!g_boot_info.acpi_table) {
|
||||
g_boot_info.acpi_table = acpi10_table;
|
||||
}
|
||||
|
||||
/* Devicetree blob, separate pass because the ACPI loop above breaks
|
||||
* early on a 2.0 hit. Absent on ACPI-only platforms; consumers must
|
||||
* handle NULL. riscv64 needs it for timebase-frequency (item 0.3) and
|
||||
* aarch64 for the GIC bases and timer PPI (item 0.6). */
|
||||
for (UINTN i = 0; i < SystemTable->NumberOfTableEntries; ++i)
|
||||
{
|
||||
if (guid_equals(&config_tables[i].VendorGuid, &EFI_DTB_TABLE_GUID))
|
||||
{
|
||||
g_boot_info.dtb = config_tables[i].VendorTable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
debug_checkpoint(SystemTable, 6, L"Boot info collected (ACPI table located)");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user