From bc7aa4bcc37cfd5244697e81af7555fa781249bb Mon Sep 17 00:00:00 2001 From: Jiajie Li Date: Wed, 23 Jun 2021 15:06:21 +0800 Subject: [PATCH 2/5] devices/gicv3: use mod fdt instead of device_tree Use fdt API provided by mod fdt, instead of mod device_tree which is a wrapper around libfdt. Signed-off-by: Jiajie Li --- .../src/interrupt_controller/aarch64/gicv3.rs | 50 +++++++++---------- .../src/interrupt_controller/aarch64/mod.rs | 11 ++-- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/devices/src/interrupt_controller/aarch64/gicv3.rs b/devices/src/interrupt_controller/aarch64/gicv3.rs index 235bf37..a39a3d5 100644 --- a/devices/src/interrupt_controller/aarch64/gicv3.rs +++ b/devices/src/interrupt_controller/aarch64/gicv3.rs @@ -14,7 +14,7 @@ use std::sync::{Arc, Mutex}; use kvm_ioctls::{DeviceFd, VmFd}; use machine_manager::machine::{KvmVmState, MachineLifecycle}; -use util::device_tree; +use util::fdt::{self, FdtBuilder}; use super::{GICConfig, GICDevice, UtilResult}; use crate::errors::{ErrorKind, Result, ResultExt}; @@ -379,7 +379,7 @@ impl GICDevice for GICv3 { Ok(()) } - fn generate_fdt(&self, fdt: &mut Vec) -> UtilResult<()> { + fn generate_fdt(&self, fdt: &mut FdtBuilder) -> UtilResult<()> { let redist_count = self.redist_regions.len() as u32; let mut gic_reg = vec![self.dist_base, self.dist_size]; @@ -388,34 +388,32 @@ impl GICDevice for GICv3 { gic_reg.push(redist.size); } - let node = "/intc"; - device_tree::add_sub_node(fdt, node)?; - device_tree::set_property_string(fdt, node, "compatible", "arm,gic-v3")?; - device_tree::set_property(fdt, node, "interrupt-controller", None)?; - device_tree::set_property_u32(fdt, node, "#interrupt-cells", 0x3)?; - device_tree::set_property_u32(fdt, node, "phandle", device_tree::GIC_PHANDLE)?; - device_tree::set_property_u32(fdt, node, "#address-cells", 0x2)?; - device_tree::set_property_u32(fdt, node, "#size-cells", 0x2)?; - device_tree::set_property_u32(fdt, node, "#redistributor-regions", redist_count)?; - device_tree::set_property_array_u64(fdt, node, "reg", &gic_reg)?; - - let gic_intr = [ - device_tree::GIC_FDT_IRQ_TYPE_PPI, - 0x9, - device_tree::IRQ_TYPE_LEVEL_HIGH, - ]; - device_tree::set_property_array_u32(fdt, node, "interrupts", &gic_intr)?; + let node = "intc"; + let intc_node_dep = fdt.begin_node(node)?; + fdt.set_property_string("compatible", "arm,gic-v3")?; + fdt.set_property("interrupt-controller", &Vec::new())?; + fdt.set_property_u32("#interrupt-cells", 0x3)?; + fdt.set_property_u32("phandle", fdt::GIC_PHANDLE)?; + fdt.set_property_u32("#address-cells", 0x2)?; + fdt.set_property_u32("#size-cells", 0x2)?; + fdt.set_property_u32("#redistributor-regions", redist_count)?; + fdt.set_property_array_u64("reg", &gic_reg)?; + + let gic_intr = [fdt::GIC_FDT_IRQ_TYPE_PPI, 0x9, fdt::IRQ_TYPE_LEVEL_HIGH]; + fdt.set_property_array_u32("interrupts", &gic_intr)?; if let Some(its) = &self.its_dev { - device_tree::set_property(fdt, node, "ranges", None)?; + fdt.set_property("ranges", &Vec::new())?; let its_reg = [its.msi_base, its.msi_size]; - let node = "/intc/its"; - device_tree::add_sub_node(fdt, node)?; - device_tree::set_property_string(fdt, node, "compatible", "arm,gic-v3-its")?; - device_tree::set_property(fdt, node, "msi-controller", None)?; - device_tree::set_property_u32(fdt, node, "phandle", device_tree::GIC_ITS_PHANDLE)?; - device_tree::set_property_array_u64(fdt, node, "reg", &its_reg)?; + let node = "its"; + let its_node_dep = fdt.begin_node(node)?; + fdt.set_property_string("compatible", "arm,gic-v3-its")?; + fdt.set_property("msi-controller", &Vec::new())?; + fdt.set_property_u32("phandle", fdt::GIC_ITS_PHANDLE)?; + fdt.set_property_array_u64("reg", &its_reg)?; + fdt.end_node(its_node_dep)?; } + fdt.end_node(intc_node_dep)?; Ok(()) } diff --git a/devices/src/interrupt_controller/aarch64/mod.rs b/devices/src/interrupt_controller/aarch64/mod.rs index d2a1b50..f1b40cf 100644 --- a/devices/src/interrupt_controller/aarch64/mod.rs +++ b/devices/src/interrupt_controller/aarch64/mod.rs @@ -18,7 +18,10 @@ use std::sync::Arc; use kvm_ioctls::VmFd; use machine_manager::machine::{KvmVmState, MachineLifecycle}; -use util::{device_tree, errors::Result as UtilResult}; +use util::{ + errors::Result as UtilResult, + fdt::{self, FdtBuilder}, +}; use crate::errors::{ErrorKind, Result, ResultExt}; @@ -88,7 +91,7 @@ pub trait GICDevice: MachineLifecycle { /// # Arguments /// /// * `fdt` - Device tree presented by bytes. - fn generate_fdt(&self, fdt: &mut Vec) -> UtilResult<()>; + fn generate_fdt(&self, fdt: &mut FdtBuilder) -> UtilResult<()>; } /// A wrapper around creating and using a kvm-based interrupt controller. @@ -121,8 +124,8 @@ impl InterruptController { } } -impl device_tree::CompileFDT for InterruptController { - fn generate_fdt_node(&self, fdt: &mut Vec) -> UtilResult<()> { +impl fdt::CompileFDT for InterruptController { + fn generate_fdt_node(&self, fdt: &mut FdtBuilder) -> UtilResult<()> { self.gic.generate_fdt(fdt)?; Ok(()) } -- 2.31.1