xref: /aosp_15_r20/bootable/libbootloader/gbl/libgbl/src/constants.rs (revision 5225e6b173e52d2efc6bcf950c27374fd72adabc)
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