133 lines
5.5 KiB
Diff
133 lines
5.5 KiB
Diff
From bc7aa4bcc37cfd5244697e81af7555fa781249bb Mon Sep 17 00:00:00 2001
|
|
From: Jiajie Li <lijiajie11@huawei.com>
|
|
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 <lijiajie11@huawei.com>
|
|
---
|
|
.../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<u8>) -> 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<u8>) -> 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<u8>) -> UtilResult<()> {
|
|
+impl fdt::CompileFDT for InterruptController {
|
|
+ fn generate_fdt_node(&self, fdt: &mut FdtBuilder) -> UtilResult<()> {
|
|
self.gic.generate_fdt(fdt)?;
|
|
Ok(())
|
|
}
|
|
--
|
|
2.31.1
|
|
|