[guest] Remove the remaining MDI support from the zircon guest
Use the new bootdata for configuring the kernel drivers instead.
Change-Id: I712a3f6ddbc5e9eaf3143c8caded2d42781fdbd1
diff --git a/bin/guest/BUILD.gn b/bin/guest/BUILD.gn
index 20608c8..6af3b92 100644
--- a/bin/guest/BUILD.gn
+++ b/bin/guest/BUILD.gn
@@ -27,7 +27,6 @@
"//garnet/public/lib/ui/view_framework:view_provider",
"//third_party/rapidjson",
"//zircon/public/lib/fbl",
- "//zircon/public/lib/mdi",
]
defines = [ "_ALL_SOURCE=1" ]
diff --git a/bin/guest/zircon-guest/BUILD.gn b/bin/guest/zircon-guest/BUILD.gn
index 3f324bb..b074513 100644
--- a/bin/guest/zircon-guest/BUILD.gn
+++ b/bin/guest/zircon-guest/BUILD.gn
@@ -23,36 +23,11 @@
]
}
-bootdata_mdi("guest-mdi") {
- visibility = [ ":*" ]
-
- # NOTE(abdulla): Order here matters, board.mdi relies on variables from
- # zircon.mdi, therefore it must be listed first.
- sources = [
- "//zircon/system/public/zircon/mdi/zircon.mdi",
- ]
-
- sources += [ "//garnet/lib/machina/arch/arm64/mdi/board.mdi" ]
-}
-
-bootdata_platform("guest-platform-id") {
- visibility = [ ":*" ]
- vid = 3
- pid = 2
- board = "machina"
-}
-
bootdata("guest-bootdata") {
visibility = [ ":*" ]
boot = true
inputs = zircon_boot_manifests
deps = []
- if (target_cpu == "arm64") {
- deps += [
- ":guest-mdi",
- ":guest-platform-id",
- ]
- }
foreach(label, deps) {
inputs += get_target_outputs(label)
}
diff --git a/bin/guest/zircon.cc b/bin/guest/zircon.cc
index 7ef5873..8608615 100644
--- a/bin/guest/zircon.cc
+++ b/bin/guest/zircon.cc
@@ -13,6 +13,7 @@
#include <fbl/unique_fd.h>
#include <zircon/assert.h>
#include <zircon/boot/bootdata.h>
+#include <zircon/boot/kernel-drivers.h>
#include "garnet/bin/guest/kernel.h"
#include "garnet/lib/machina/guest.h"
@@ -32,10 +33,12 @@
header->magic == BOOTITEM_MAGIC;
}
-static void set_bootdata(bootdata_t* header, uint32_t type, uint32_t len) {
+static void set_bootdata(bootdata_t* header, uint32_t type, uint32_t extra,
+ uint32_t len) {
// Guest memory is initially zeroed, so we skip fields that must be zero.
header->type = type;
header->length = len;
+ header->extra = extra;
header->flags = BOOTDATA_FLAG_V2;
header->magic = BOOTITEM_MAGIC;
header->crc32 = BOOTITEM_NO_CRC32;
@@ -55,7 +58,7 @@
}
auto cmdline_hdr = phys_mem.as<bootdata_t>(data_off);
- set_bootdata(cmdline_hdr, BOOTDATA_CMDLINE,
+ set_bootdata(cmdline_hdr, BOOTDATA_CMDLINE, 0,
static_cast<uint32_t>(cmdline_len));
memcpy(cmdline_hdr + 1, cmdline.c_str(), cmdline_len);
@@ -135,6 +138,46 @@
.length = 0x1000000, // 16MB
},
};
+
+static const bootdata_platform_id_t platform_id = {
+ .vid = 3, // PDEV_VID_GOOGLE
+ .pid = 2, // PDEV_PID_MACHINA
+ .board_name = "machina",
+};
+
+static const bootdata_kernel_driver_t uart_driver = {
+ .mmio_phys = 0xfff32000,
+ .irq = 111,
+};
+
+static const bootdata_arm_gicv2_driver_t gicv2_driver = {
+ .mmio_phys = 0x001b0000,
+ .msi_frame_phys = 0xe82b0000,
+ .gicd_offset = 0x1000,
+ .gicc_offset = 0x2000,
+ .gich_offset = 0x4000,
+ .gicv_offset = 0x6000,
+ .ipi_base = 13,
+ .optional = true,
+};
+
+static const bootdata_arm_gicv3_driver_t gicv3_driver = {
+ .mmio_phys = 0xe82b0000,
+ .gicd_offset = 0x00000,
+ .gicr_offset = 0xa0000,
+ .gicr_stride = 0x20000,
+ .ipi_base = 13,
+ .optional = true,
+};
+
+static const bootdata_arm_psci_driver_t psci_driver = {
+ .use_hvc = false,
+};
+
+static const bootdata_arm_generic_timer_driver_t timer_driver = {
+ .irq_virt = 27,
+};
+
#endif // __aarch64__
static zx_status_t create_bootdata(const machina::PhysMem& phys_mem,
@@ -146,11 +189,17 @@
#if __aarch64__
bootdata_cpu_config_t cpu_config;
cpu_config.cluster_count = 0;
- cpu_config.clusters[0].cpu_count = num_cpus;
+ cpu_config.clusters[0].cpu_count = num_cpus;
const size_t bootdata_len = sizeof(bootdata_t) +
BOOTDATA_ALIGN(sizeof(cpu_config)) + sizeof(bootdata_t) +
- BOOTDATA_ALIGN(sizeof(mem_config)) + sizeof(bootdata_t);
+ BOOTDATA_ALIGN(sizeof(mem_config)) + sizeof(bootdata_t) +
+ BOOTDATA_ALIGN(sizeof(platform_id)) + sizeof(bootdata_t) +
+ BOOTDATA_ALIGN(sizeof(uart_driver)) + sizeof(bootdata_t) +
+ BOOTDATA_ALIGN(sizeof(gicv2_driver)) + sizeof(bootdata_t) +
+ BOOTDATA_ALIGN(sizeof(gicv3_driver)) + sizeof(bootdata_t) +
+ BOOTDATA_ALIGN(sizeof(psci_driver)) + sizeof(bootdata_t) +
+ BOOTDATA_ALIGN(sizeof(timer_driver)) + sizeof(bootdata_t);
#elif __x86_64__
const size_t e820_size = machina::e820_size(phys_mem.size());
const size_t bootdata_len = sizeof(bootdata_t) +
@@ -163,15 +212,14 @@
// Bootdata container.
auto container_hdr = phys_mem.as<bootdata_t>(bootdata_off);
- set_bootdata(container_hdr, BOOTDATA_CONTAINER,
+ set_bootdata(container_hdr, BOOTDATA_CONTAINER, BOOTDATA_MAGIC,
static_cast<uint32_t>(bootdata_len));
- container_hdr->extra = BOOTDATA_MAGIC;
bootdata_off += sizeof(bootdata_t);
#if __aarch64__
// CPU config
auto bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
- set_bootdata(bootdata_header, BOOTDATA_CPU_CONFIG, sizeof(cpu_config));
+ set_bootdata(bootdata_header, BOOTDATA_CPU_CONFIG, 0, sizeof(cpu_config));
bootdata_off += sizeof(bootdata_t);
memcpy(phys_mem.as<void*>(bootdata_off), &cpu_config, sizeof(cpu_config));
bootdata_off += BOOTDATA_ALIGN(sizeof(cpu_config));
@@ -179,23 +227,70 @@
// memory config
mem_config[0].length = phys_mem.size();
bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
- set_bootdata(bootdata_header, BOOTDATA_MEM_CONFIG, sizeof(mem_config));
+ set_bootdata(bootdata_header, BOOTDATA_MEM_CONFIG, 0, sizeof(mem_config));
bootdata_off += sizeof(bootdata_t);
memcpy(phys_mem.as<void*>(bootdata_off), &mem_config, sizeof(mem_config));
bootdata_off += BOOTDATA_ALIGN(sizeof(mem_config));
+ // platform ID
+ bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
+ set_bootdata(bootdata_header, BOOTDATA_PLATFORM_ID, 0, sizeof(platform_id));
+ bootdata_off += sizeof(bootdata_t);
+ memcpy(phys_mem.as<void*>(bootdata_off), &platform_id, sizeof(platform_id));
+ bootdata_off += BOOTDATA_ALIGN(sizeof(platform_id));
+
+ // uart driver
+ bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
+ set_bootdata(bootdata_header, BOOTDATA_KERNEL_DRIVER, KDRV_PL011_UART,
+ sizeof(uart_driver));
+ bootdata_off += sizeof(bootdata_t);
+ memcpy(phys_mem.as<void*>(bootdata_off), &uart_driver, sizeof(uart_driver));
+ bootdata_off += BOOTDATA_ALIGN(sizeof(uart_driver));
+
+ // gicv2 driver
+ bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
+ set_bootdata(bootdata_header, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_GIC_V2,
+ sizeof(gicv2_driver));
+ bootdata_off += sizeof(bootdata_t);
+ memcpy(phys_mem.as<void*>(bootdata_off), &gicv2_driver, sizeof(gicv2_driver));
+ bootdata_off += BOOTDATA_ALIGN(sizeof(gicv2_driver));
+
+ // gicv3 driver
+ bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
+ set_bootdata(bootdata_header, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_GIC_V3,
+ sizeof(gicv3_driver));
+ bootdata_off += sizeof(bootdata_t);
+ memcpy(phys_mem.as<void*>(bootdata_off), &gicv3_driver, sizeof(gicv3_driver));
+ bootdata_off += BOOTDATA_ALIGN(sizeof(gicv3_driver));
+
+ // psci driver
+ bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
+ set_bootdata(bootdata_header, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_PSCI,
+ sizeof(psci_driver));
+ bootdata_off += sizeof(bootdata_t);
+ memcpy(phys_mem.as<void*>(bootdata_off), &psci_driver, sizeof(psci_driver));
+ bootdata_off += BOOTDATA_ALIGN(sizeof(psci_driver));
+
+ // timer driver
+ bootdata_header = phys_mem.as<bootdata_t>(bootdata_off);
+ set_bootdata(bootdata_header, BOOTDATA_KERNEL_DRIVER, KDRV_ARM_GENERIC_TIMER,
+ sizeof(timer_driver));
+ bootdata_off += sizeof(bootdata_t);
+ memcpy(phys_mem.as<void*>(bootdata_off), &timer_driver, sizeof(timer_driver));
+ bootdata_off += BOOTDATA_ALIGN(sizeof(timer_driver));
+
return ZX_OK;
#elif __x86_64__
// ACPI root table pointer.
auto acpi_rsdp_hdr = phys_mem.as<bootdata_t>(bootdata_off);
- set_bootdata(acpi_rsdp_hdr, BOOTDATA_ACPI_RSDP, sizeof(uint64_t));
+ set_bootdata(acpi_rsdp_hdr, BOOTDATA_ACPI_RSDP, 0, sizeof(uint64_t));
bootdata_off += sizeof(bootdata_t);
*phys_mem.as<uint64_t>(bootdata_off) = machina::kAcpiOffset;
// E820 memory map.
bootdata_off += BOOTDATA_ALIGN(sizeof(uint64_t));
auto e820_table_hdr = phys_mem.as<bootdata_t>(bootdata_off);
- set_bootdata(e820_table_hdr, BOOTDATA_E820_TABLE,
+ set_bootdata(e820_table_hdr, BOOTDATA_E820_TABLE, 0,
static_cast<uint32_t>(e820_size));
bootdata_off += sizeof(bootdata_t);
return machina::create_e820(phys_mem, bootdata_off);
diff --git a/lib/machina/arch/arm64/mdi/board.mdi b/lib/machina/arch/arm64/mdi/board.mdi
deleted file mode 100644
index 05ce7ba..0000000
--- a/lib/machina/arch/arm64/mdi/board.mdi
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-const PERIPH_VIRT = 0xffffffffc0000000
-
-kernel = {
- arm-pl011-uart = {
- base-phys = 0xfff32000
- base-virt = PERIPH_VIRT + 0x17e32000
- irq = 111
- }
- arm-gic-v2 = {
- base-phys = 0xe82b0000
- base-virt = PERIPH_VIRT + 0x001b0000
- gicd-offset = 0x1000
- gicc-offset = 0x2000
- gich-offset = 0x4000
- gicv-offset = 0x6000
- ipi-base = 13
- optional = true
- msi = true
- }
- arm-gic-v3 = {
- base-phys = 0xe82b0000
- base-virt = PERIPH_VIRT + 0x01b0000
- gicd-offset = 0x00000
- gicr-offset = 0xa0000
- gicr-stride = 0x20000
- optional = true
- ipi-base = 13
- }
- arm-psci = {
- use-smc = true
- }
- arm-timer = {
- irq-virt = 27
- }
-}