xref: /aosp_15_r20/external/coreboot/src/lib/decompressor.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bootblock_common.h>
4 #include <commonlib/bsd/compression.h>
5 #include <delay.h>
6 #include <metadata_hash.h>
7 #include <program_loading.h>
8 #include <symbols.h>
9 #include <timestamp.h>
10 
11 extern u8 compressed_bootblock[];
12 asm (
13 	".pushsection .data.compressed_bootblock,\"a\",@progbits\n\t"
14 	".type compressed_bootblock, %object\n\t"
15 	".balign 8\n"
16 	"compressed_bootblock:\n\t"
17 	".incbin \"" __BUILD_DIR__ "/cbfs/" CONFIG_CBFS_PREFIX "/bootblock.lz4\"\n\t"
18 	".size compressed_bootblock, . - compressed_bootblock\n\t"
19 	".popsection\n\t"
20 );
21 
22 struct bootblock_arg arg = {
23 	.base_timestamp = 0,
24 	.num_timestamps = 2,
25 	.timestamps = {
26 		{ .entry_id = TS_ULZ4F_START },
27 		{ .entry_id = TS_ULZ4F_END },
28 	},
29 };
30 
31 struct prog prog_bootblock = {
32 	.type = PROG_BOOTBLOCK,
33 	.entry = (void *)_bootblock,
34 	.arg = &arg,
35 };
36 
decompressor_soc_init(void)37 __weak void decompressor_soc_init(void) { /* no-op */ }
38 
main(void)39 void main(void)
40 {
41 	init_timer();
42 
43 	if (CONFIG(COLLECT_TIMESTAMPS))
44 		arg.base_timestamp = timestamp_get();
45 
46 	if (CONFIG(CBFS_VERIFICATION))
47 		arg.metadata_hash_anchor = metadata_hash_export_anchor();
48 
49 	decompressor_soc_init();
50 
51 	if (CONFIG(COLLECT_TIMESTAMPS))
52 		arg.timestamps[0].entry_stamp = timestamp_get();
53 
54 	size_t out_size = ulz4f(compressed_bootblock, _bootblock);
55 	prog_segment_loaded((uintptr_t)_bootblock, out_size, SEG_FINAL);
56 
57 	if (CONFIG(COLLECT_TIMESTAMPS))
58 		arg.timestamps[1].entry_stamp = timestamp_get();
59 
60 	prog_run(&prog_bootblock);
61 }
62