1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2018 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker
5*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
6*bb4ee6a4SAndroid Build Coastguard Worker use std::collections::BTreeMap;
7*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::File;
8*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::OpenOptions;
9*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Write;
10*bb4ee6a4SAndroid Build Coastguard Worker use std::path::PathBuf;
11*bb4ee6a4SAndroid Build Coastguard Worker
12*bb4ee6a4SAndroid Build Coastguard Worker use arch::android::create_android_fdt;
13*bb4ee6a4SAndroid Build Coastguard Worker use arch::apply_device_tree_overlays;
14*bb4ee6a4SAndroid Build Coastguard Worker use arch::DtbOverlay;
15*bb4ee6a4SAndroid Build Coastguard Worker use base::open_file_or_duplicate;
16*bb4ee6a4SAndroid Build Coastguard Worker use cros_fdt::Error;
17*bb4ee6a4SAndroid Build Coastguard Worker use cros_fdt::Fdt;
18*bb4ee6a4SAndroid Build Coastguard Worker
19*bb4ee6a4SAndroid Build Coastguard Worker /// Creates a flattened device tree containing all of the parameters for the
20*bb4ee6a4SAndroid Build Coastguard Worker /// kernel and returns it as DTB.
21*bb4ee6a4SAndroid Build Coastguard Worker ///
22*bb4ee6a4SAndroid Build Coastguard Worker /// # Arguments
23*bb4ee6a4SAndroid Build Coastguard Worker ///
24*bb4ee6a4SAndroid Build Coastguard Worker /// * `android_fstab` - the File object for the android fstab
create_fdt( android_fstab: Option<File>, dump_device_tree_blob: Option<PathBuf>, device_tree_overlays: Vec<DtbOverlay>, ) -> Result<Vec<u8>, Error>25*bb4ee6a4SAndroid Build Coastguard Worker pub fn create_fdt(
26*bb4ee6a4SAndroid Build Coastguard Worker android_fstab: Option<File>,
27*bb4ee6a4SAndroid Build Coastguard Worker dump_device_tree_blob: Option<PathBuf>,
28*bb4ee6a4SAndroid Build Coastguard Worker device_tree_overlays: Vec<DtbOverlay>,
29*bb4ee6a4SAndroid Build Coastguard Worker ) -> Result<Vec<u8>, Error> {
30*bb4ee6a4SAndroid Build Coastguard Worker let mut fdt = Fdt::new(&[]);
31*bb4ee6a4SAndroid Build Coastguard Worker // The whole thing is put into one giant node with some top level properties
32*bb4ee6a4SAndroid Build Coastguard Worker if let Some(android_fstab) = android_fstab {
33*bb4ee6a4SAndroid Build Coastguard Worker create_android_fdt(&mut fdt, android_fstab)?;
34*bb4ee6a4SAndroid Build Coastguard Worker }
35*bb4ee6a4SAndroid Build Coastguard Worker
36*bb4ee6a4SAndroid Build Coastguard Worker // Done writing base FDT, now apply DT overlays
37*bb4ee6a4SAndroid Build Coastguard Worker apply_device_tree_overlays(
38*bb4ee6a4SAndroid Build Coastguard Worker &mut fdt,
39*bb4ee6a4SAndroid Build Coastguard Worker device_tree_overlays,
40*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
41*bb4ee6a4SAndroid Build Coastguard Worker vec![],
42*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
43*bb4ee6a4SAndroid Build Coastguard Worker &BTreeMap::new(),
44*bb4ee6a4SAndroid Build Coastguard Worker )?;
45*bb4ee6a4SAndroid Build Coastguard Worker
46*bb4ee6a4SAndroid Build Coastguard Worker let fdt_final = fdt.finish()?;
47*bb4ee6a4SAndroid Build Coastguard Worker
48*bb4ee6a4SAndroid Build Coastguard Worker if let Some(file_path) = dump_device_tree_blob {
49*bb4ee6a4SAndroid Build Coastguard Worker let mut fd = open_file_or_duplicate(
50*bb4ee6a4SAndroid Build Coastguard Worker &file_path,
51*bb4ee6a4SAndroid Build Coastguard Worker OpenOptions::new()
52*bb4ee6a4SAndroid Build Coastguard Worker .read(true)
53*bb4ee6a4SAndroid Build Coastguard Worker .create(true)
54*bb4ee6a4SAndroid Build Coastguard Worker .truncate(true)
55*bb4ee6a4SAndroid Build Coastguard Worker .write(true),
56*bb4ee6a4SAndroid Build Coastguard Worker )
57*bb4ee6a4SAndroid Build Coastguard Worker .map_err(|e| Error::FdtIoError(e.into()))?;
58*bb4ee6a4SAndroid Build Coastguard Worker fd.write_all(&fdt_final)
59*bb4ee6a4SAndroid Build Coastguard Worker .map_err(|e| Error::FdtDumpIoError(e, file_path.clone()))?;
60*bb4ee6a4SAndroid Build Coastguard Worker }
61*bb4ee6a4SAndroid Build Coastguard Worker
62*bb4ee6a4SAndroid Build Coastguard Worker Ok(fdt_final)
63*bb4ee6a4SAndroid Build Coastguard Worker }
64