1*5225e6b1SAndroid Build Coastguard Worker // Copyright 2024, The Android Open Source Project 2*5225e6b1SAndroid Build Coastguard Worker // 3*5225e6b1SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*5225e6b1SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*5225e6b1SAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*5225e6b1SAndroid Build Coastguard Worker // 7*5225e6b1SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 8*5225e6b1SAndroid Build Coastguard Worker // 9*5225e6b1SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*5225e6b1SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*5225e6b1SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*5225e6b1SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*5225e6b1SAndroid Build Coastguard Worker // limitations under the License. 14*5225e6b1SAndroid Build Coastguard Worker 15*5225e6b1SAndroid Build Coastguard Worker //! This file provides common constants that are used in GBL 16*5225e6b1SAndroid Build Coastguard Worker 17*5225e6b1SAndroid Build Coastguard Worker // TODO(b/380392958) Cleanup other used of the constants. Move them here as well. 18*5225e6b1SAndroid Build Coastguard Worker 19*5225e6b1SAndroid Build Coastguard Worker use core::fmt::{Debug, Display, Formatter}; 20*5225e6b1SAndroid Build Coastguard Worker use liberror::Error; 21*5225e6b1SAndroid Build Coastguard Worker use static_assertions::const_assert_eq; 22*5225e6b1SAndroid Build Coastguard Worker 23*5225e6b1SAndroid Build Coastguard Worker macro_rules! KiB ( 24*5225e6b1SAndroid Build Coastguard Worker ($x:expr) => { 25*5225e6b1SAndroid Build Coastguard Worker $x*1024 26*5225e6b1SAndroid Build Coastguard Worker } 27*5225e6b1SAndroid Build Coastguard Worker ); 28*5225e6b1SAndroid Build Coastguard Worker const_assert_eq!(KiB!(1), 1024); 29*5225e6b1SAndroid Build Coastguard Worker const_assert_eq!(KiB!(5), 5 * 1024); 30*5225e6b1SAndroid Build Coastguard Worker 31*5225e6b1SAndroid Build Coastguard Worker macro_rules! MiB ( 32*5225e6b1SAndroid Build Coastguard Worker ($x:expr) => { 33*5225e6b1SAndroid Build Coastguard Worker $x*KiB!(1024) 34*5225e6b1SAndroid Build Coastguard Worker } 35*5225e6b1SAndroid Build Coastguard Worker ); 36*5225e6b1SAndroid Build Coastguard Worker const_assert_eq!(MiB!(1), 1024 * 1024); 37*5225e6b1SAndroid Build Coastguard Worker const_assert_eq!(MiB!(5), 5 * 1024 * 1024); 38*5225e6b1SAndroid Build Coastguard Worker 39*5225e6b1SAndroid Build Coastguard Worker /// Kernel image alignment requirement. 40*5225e6b1SAndroid Build Coastguard Worker pub const KERNEL_ALIGNMENT: usize = MiB!(2); 41*5225e6b1SAndroid Build Coastguard Worker 42*5225e6b1SAndroid Build Coastguard Worker /// Zircon Kernel image alignment requirement. 43*5225e6b1SAndroid Build Coastguard Worker pub const ZIRCON_KERNEL_ALIGNMENT: usize = KiB!(64); 44*5225e6b1SAndroid Build Coastguard Worker 45*5225e6b1SAndroid Build Coastguard Worker /// FDT image alignment requirement. 46*5225e6b1SAndroid Build Coastguard Worker pub const FDT_ALIGNMENT: usize = 8; 47*5225e6b1SAndroid Build Coastguard Worker 48*5225e6b1SAndroid Build Coastguard Worker /// Expected max size for BootCmd zbi item. 49*5225e6b1SAndroid Build Coastguard Worker pub const BOOTCMD_SIZE: usize = KiB!(16); 50*5225e6b1SAndroid Build Coastguard Worker 51*5225e6b1SAndroid Build Coastguard Worker /// Page size 52*5225e6b1SAndroid Build Coastguard Worker pub const PAGE_SIZE: usize = KiB!(4); 53*5225e6b1SAndroid Build Coastguard Worker 54*5225e6b1SAndroid Build Coastguard Worker /// Image names list. 55*5225e6b1SAndroid Build Coastguard Worker /// Used for identifying what buffer size/alignment is necessary. 56*5225e6b1SAndroid Build Coastguard Worker #[derive(Debug, PartialEq, Clone)] 57*5225e6b1SAndroid Build Coastguard Worker pub enum ImageName { 58*5225e6b1SAndroid Build Coastguard Worker /// ZBI for Zircon kernel 59*5225e6b1SAndroid Build Coastguard Worker ZbiZircon, 60*5225e6b1SAndroid Build Coastguard Worker /// ZBI items 61*5225e6b1SAndroid Build Coastguard Worker ZbiItems, 62*5225e6b1SAndroid Build Coastguard Worker /// Boot 63*5225e6b1SAndroid Build Coastguard Worker Boot, 64*5225e6b1SAndroid Build Coastguard Worker /// FDT 65*5225e6b1SAndroid Build Coastguard Worker Fdt, 66*5225e6b1SAndroid Build Coastguard Worker } 67*5225e6b1SAndroid Build Coastguard Worker 68*5225e6b1SAndroid Build Coastguard Worker impl ImageName { 69*5225e6b1SAndroid Build Coastguard Worker /// Get alignment required for the [ImageName] alignment(&self) -> usize70*5225e6b1SAndroid Build Coastguard Worker pub fn alignment(&self) -> usize { 71*5225e6b1SAndroid Build Coastguard Worker match self { 72*5225e6b1SAndroid Build Coastguard Worker Self::ZbiZircon => ZIRCON_KERNEL_ALIGNMENT, 73*5225e6b1SAndroid Build Coastguard Worker Self::ZbiItems => PAGE_SIZE, 74*5225e6b1SAndroid Build Coastguard Worker Self::Boot => KERNEL_ALIGNMENT, 75*5225e6b1SAndroid Build Coastguard Worker Self::Fdt => FDT_ALIGNMENT, 76*5225e6b1SAndroid Build Coastguard Worker } 77*5225e6b1SAndroid Build Coastguard Worker } 78*5225e6b1SAndroid Build Coastguard Worker } 79*5225e6b1SAndroid Build Coastguard Worker 80*5225e6b1SAndroid Build Coastguard Worker impl Display for ImageName { fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result81*5225e6b1SAndroid Build Coastguard Worker fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { 82*5225e6b1SAndroid Build Coastguard Worker let str = match self { 83*5225e6b1SAndroid Build Coastguard Worker ImageName::ZbiZircon => "zbi_zircon", 84*5225e6b1SAndroid Build Coastguard Worker ImageName::ZbiItems => "zbi_items", 85*5225e6b1SAndroid Build Coastguard Worker ImageName::Boot => "boot", 86*5225e6b1SAndroid Build Coastguard Worker ImageName::Fdt => "fdt", 87*5225e6b1SAndroid Build Coastguard Worker }; 88*5225e6b1SAndroid Build Coastguard Worker write!(f, "{str}") 89*5225e6b1SAndroid Build Coastguard Worker } 90*5225e6b1SAndroid Build Coastguard Worker } 91*5225e6b1SAndroid Build Coastguard Worker 92*5225e6b1SAndroid Build Coastguard Worker impl TryFrom<&str> for ImageName { 93*5225e6b1SAndroid Build Coastguard Worker type Error = Error; 94*5225e6b1SAndroid Build Coastguard Worker try_from(value: &str) -> Result<Self, Self::Error>95*5225e6b1SAndroid Build Coastguard Worker fn try_from(value: &str) -> Result<Self, Self::Error> { 96*5225e6b1SAndroid Build Coastguard Worker Ok(match value { 97*5225e6b1SAndroid Build Coastguard Worker "zbi_zircon" => ImageName::ZbiZircon, 98*5225e6b1SAndroid Build Coastguard Worker "zbi_items" => ImageName::ZbiItems, 99*5225e6b1SAndroid Build Coastguard Worker "boot" => ImageName::Boot, 100*5225e6b1SAndroid Build Coastguard Worker "fdt" => ImageName::Fdt, 101*5225e6b1SAndroid Build Coastguard Worker _ => return Err(Error::InvalidInput), 102*5225e6b1SAndroid Build Coastguard Worker }) 103*5225e6b1SAndroid Build Coastguard Worker } 104*5225e6b1SAndroid Build Coastguard Worker } 105