blob: d489faad6271e8f5b3a27e0bcfbecb9c3a760484 [file] [log] [blame]
David Brazdil0dbb41f2019-09-09 18:03:35 +01001/*
2 * Copyright 2019 The Hafnium Authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "hf/boot_flow.h"
18#include "hf/dlog.h"
19#include "hf/fdt_handler.h"
20#include "hf/plat/boot_flow.h"
21
22/**
Andrew Scullc3771072019-09-19 13:30:42 +010023 * Extract the boot parameters from the FDT and the boot-flow driver.
24 */
25static bool boot_params_init(struct boot_params *p,
26 const struct fdt_node *fdt_root)
27{
28 p->mem_ranges_count = 0;
29 p->kernel_arg = plat_boot_flow_get_kernel_arg();
30
31 return plat_boot_flow_get_initrd_range(fdt_root, &p->initrd_begin,
32 &p->initrd_end) &&
33 fdt_find_cpus(fdt_root, p->cpu_ids, &p->cpu_count) &&
34 fdt_find_memory_ranges(fdt_root, p);
35}
36
37/**
David Brazdil0dbb41f2019-09-09 18:03:35 +010038 * Parses information from FDT needed to initialize Hafnium.
39 * FDT is mapped at the beginning and unmapped before exiting the function.
40 */
41bool boot_flow_init(struct mm_stage1_locked stage1_locked,
42 struct manifest *manifest, struct boot_params *boot_params,
43 struct mpool *ppool)
44{
45 bool ret = false;
46 struct fdt_header *fdt;
47 struct fdt_node fdt_root;
48 enum manifest_return_code manifest_ret;
49
50 /* Get the memory map from the FDT. */
Andrew Scullc3771072019-09-19 13:30:42 +010051 fdt = fdt_map(stage1_locked, plat_boot_flow_get_fdt_addr(), &fdt_root,
52 ppool);
David Brazdil0dbb41f2019-09-09 18:03:35 +010053 if (fdt == NULL) {
54 dlog("Unable to map FDT.\n");
55 return false;
56 }
57
58 if (!fdt_find_child(&fdt_root, "")) {
59 dlog("Unable to find FDT root node.\n");
60 goto out_unmap_fdt;
61 }
62
63 manifest_ret = manifest_init(manifest, &fdt_root);
64 if (manifest_ret != MANIFEST_SUCCESS) {
65 dlog("Could not parse manifest: %s.\n",
66 manifest_strerror(manifest_ret));
67 goto out_unmap_fdt;
68 }
69
70 if (!boot_params_init(boot_params, &fdt_root)) {
71 dlog("Could not parse boot params.\n");
72 goto out_unmap_fdt;
73 }
74
75 ret = true;
76
77out_unmap_fdt:
78 if (!fdt_unmap(stage1_locked, fdt, ppool)) {
79 dlog("Unable to unmap FDT.\n");
80 ret = false;
81 }
82
83 return ret;
84}
Andrew Scullc3771072019-09-19 13:30:42 +010085
86/**
87 * Takes action on any updates that were generated.
88 */
89bool boot_flow_update(struct mm_stage1_locked stage1_locked,
90 struct boot_params_update *p, struct mpool *ppool)
91{
92 return plat_boot_flow_update(stage1_locked, p, ppool);
93}