xref: /rk3399_ARM-atf/plat/rpi/rpi3/rpi3_bl2_mboot.c (revision 4f9894db3572b6e375c7369bc2619cc690169604)
1c4c9e2bcSAbhi Singh /*
2c4c9e2bcSAbhi Singh  * Copyright (c) 2025, Arm Limited. All rights reserved.
3c4c9e2bcSAbhi Singh  *
4c4c9e2bcSAbhi Singh  * SPDX-License-Identifier: BSD-3-Clause
5c4c9e2bcSAbhi Singh  */
6c4c9e2bcSAbhi Singh 
7c4c9e2bcSAbhi Singh #include <assert.h>
8c4c9e2bcSAbhi Singh #include <stdarg.h>
9c4c9e2bcSAbhi Singh #include <stdint.h>
10c4c9e2bcSAbhi Singh 
11c4c9e2bcSAbhi Singh #include "./include/rpi3_measured_boot.h"
12c4c9e2bcSAbhi Singh 
13c4c9e2bcSAbhi Singh #include <drivers/auth/crypto_mod.h>
14*4f9894dbSAbhi Singh #include <drivers/gpio_spi.h>
15c4c9e2bcSAbhi Singh #include <drivers/measured_boot/event_log/event_log.h>
16c4c9e2bcSAbhi Singh #include <drivers/measured_boot/metadata.h>
17*4f9894dbSAbhi Singh #include <drivers/tpm/tpm2.h>
18*4f9894dbSAbhi Singh #include <drivers/tpm/tpm2_chip.h>
19*4f9894dbSAbhi Singh #include <drivers/tpm/tpm2_slb9670/slb9670_gpio.h>
20c4c9e2bcSAbhi Singh #include <plat/common/common_def.h>
21c4c9e2bcSAbhi Singh #include <plat/common/platform.h>
22c4c9e2bcSAbhi Singh #include <platform_def.h>
23c4c9e2bcSAbhi Singh #include <tools_share/tbbr_oid.h>
24c4c9e2bcSAbhi Singh 
25c4c9e2bcSAbhi Singh /* RPI3 table with platform specific image IDs, names and PCRs */
26c4c9e2bcSAbhi Singh const event_log_metadata_t rpi3_event_log_metadata[] = {
27c4c9e2bcSAbhi Singh 	{ BL31_IMAGE_ID, MBOOT_BL31_IMAGE_STRING, PCR_0 },
28c4c9e2bcSAbhi Singh 	{ BL33_IMAGE_ID, MBOOT_BL33_IMAGE_STRING, PCR_0 },
29c4c9e2bcSAbhi Singh 	{ NT_FW_CONFIG_ID, MBOOT_NT_FW_CONFIG_STRING, PCR_0 },
30c4c9e2bcSAbhi Singh 
31c4c9e2bcSAbhi Singh 	{ EVLOG_INVALID_ID, NULL, (unsigned int)(-1) }	/* Terminator */
32c4c9e2bcSAbhi Singh };
33c4c9e2bcSAbhi Singh 
34*4f9894dbSAbhi Singh #if DISCRETE_TPM
35*4f9894dbSAbhi Singh extern struct tpm_chip_data tpm_chip_data;
36*4f9894dbSAbhi Singh #if (TPM_INTERFACE == FIFO_SPI)
37*4f9894dbSAbhi Singh extern struct gpio_spi_data tpm_rpi3_gpio_data;
38*4f9894dbSAbhi Singh struct spi_plat *spidev;
39*4f9894dbSAbhi Singh #endif
40*4f9894dbSAbhi Singh 
41*4f9894dbSAbhi Singh static void rpi3_bl2_tpm_early_interface_setup(void)
42*4f9894dbSAbhi Singh {
43*4f9894dbSAbhi Singh #if (TPM_INTERFACE == FIFO_SPI)
44*4f9894dbSAbhi Singh 	tpm2_slb9670_gpio_init(&tpm_rpi3_gpio_data);
45*4f9894dbSAbhi Singh 
46*4f9894dbSAbhi Singh 	spidev = gpio_spi_init(&tpm_rpi3_gpio_data);
47*4f9894dbSAbhi Singh #endif
48*4f9894dbSAbhi Singh }
49*4f9894dbSAbhi Singh #endif
50*4f9894dbSAbhi Singh 
51c4c9e2bcSAbhi Singh static uint8_t *event_log_start;
52c4c9e2bcSAbhi Singh static size_t event_log_size;
53c4c9e2bcSAbhi Singh 
54c4c9e2bcSAbhi Singh void bl2_plat_mboot_init(void)
55c4c9e2bcSAbhi Singh {
56c4c9e2bcSAbhi Singh 	uint8_t *bl2_event_log_start;
57c4c9e2bcSAbhi Singh 	uint8_t *bl2_event_log_finish;
58c4c9e2bcSAbhi Singh 
59*4f9894dbSAbhi Singh #if DISCRETE_TPM
60*4f9894dbSAbhi Singh 	int rc;
61*4f9894dbSAbhi Singh 
62*4f9894dbSAbhi Singh 	rpi3_bl2_tpm_early_interface_setup();
63*4f9894dbSAbhi Singh 	rc = tpm_interface_init(&tpm_chip_data, 0);
64*4f9894dbSAbhi Singh 	if (rc != 0) {
65*4f9894dbSAbhi Singh 		ERROR("BL2: TPM interface init failed\n");
66*4f9894dbSAbhi Singh 		panic();
67*4f9894dbSAbhi Singh 	}
68*4f9894dbSAbhi Singh #endif
69*4f9894dbSAbhi Singh 
70c4c9e2bcSAbhi Singh 	rpi3_mboot_fetch_eventlog_info(&event_log_start, &event_log_size);
71c4c9e2bcSAbhi Singh 	bl2_event_log_start = event_log_start + event_log_size;
72c4c9e2bcSAbhi Singh 	bl2_event_log_finish = event_log_start + PLAT_ARM_EVENT_LOG_MAX_SIZE;
73c4c9e2bcSAbhi Singh 	event_log_init(bl2_event_log_start, bl2_event_log_finish);
74c4c9e2bcSAbhi Singh }
75c4c9e2bcSAbhi Singh 
76c4c9e2bcSAbhi Singh void bl2_plat_mboot_finish(void)
77c4c9e2bcSAbhi Singh {
786dfcf4e1SAbhi Singh 	int rc;
796dfcf4e1SAbhi Singh 
806dfcf4e1SAbhi Singh 	/* Event Log address in Non-Secure memory */
816dfcf4e1SAbhi Singh 	uintptr_t ns_log_addr;
826dfcf4e1SAbhi Singh 
83c4c9e2bcSAbhi Singh 	/* Event Log filled size */
84c4c9e2bcSAbhi Singh 	size_t event_log_cur_size;
85c4c9e2bcSAbhi Singh 
86c4c9e2bcSAbhi Singh 	event_log_cur_size = event_log_get_cur_size((uint8_t *)event_log_start);
87c4c9e2bcSAbhi Singh 
886dfcf4e1SAbhi Singh 	/* write the eventlog addr and size to NT_FW_CONFIG TPM entry */
896dfcf4e1SAbhi Singh 	rc = rpi3_set_nt_fw_info(event_log_cur_size, &ns_log_addr);
906dfcf4e1SAbhi Singh 	if (rc != 0) {
916dfcf4e1SAbhi Singh 		ERROR("%s(): Unable to update %s_FW_CONFIG\n",
926dfcf4e1SAbhi Singh 			__func__, "NT");
936dfcf4e1SAbhi Singh 		/*
946dfcf4e1SAbhi Singh 		 * fatal error due to Bl33 maintaining the assumption
956dfcf4e1SAbhi Singh 		 * that the eventlog is successfully passed via
966dfcf4e1SAbhi Singh 		 * NT_FW_CONFIG.
976dfcf4e1SAbhi Singh 		 */
986dfcf4e1SAbhi Singh 		panic();
996dfcf4e1SAbhi Singh 	}
1006dfcf4e1SAbhi Singh 
1016dfcf4e1SAbhi Singh 	/* Copy Event Log to Non-secure memory */
1026dfcf4e1SAbhi Singh 	(void)memcpy((void *)ns_log_addr, (const void *)event_log_start,
1036dfcf4e1SAbhi Singh 		     event_log_cur_size);
1046dfcf4e1SAbhi Singh 
1056dfcf4e1SAbhi Singh 	/* Ensure that the Event Log is visible in Non-secure memory */
1066dfcf4e1SAbhi Singh 	flush_dcache_range(ns_log_addr, event_log_cur_size);
1076dfcf4e1SAbhi Singh 
108c4c9e2bcSAbhi Singh 	/* Dump Event Log for user view */
109c4c9e2bcSAbhi Singh 	dump_event_log((uint8_t *)event_log_start, event_log_cur_size);
110*4f9894dbSAbhi Singh 
111*4f9894dbSAbhi Singh #if DISCRETE_TPM
112*4f9894dbSAbhi Singh 	/* relinquish control of TPM locality 0 and close interface */
113*4f9894dbSAbhi Singh 	rc = tpm_interface_close(&tpm_chip_data, 0);
114*4f9894dbSAbhi Singh 	if (rc != 0) {
115*4f9894dbSAbhi Singh 		ERROR("BL2: TPM interface close failed\n");
116*4f9894dbSAbhi Singh 		panic();
117*4f9894dbSAbhi Singh 	}
118*4f9894dbSAbhi Singh #endif
119c4c9e2bcSAbhi Singh }
120c4c9e2bcSAbhi Singh 
121c4c9e2bcSAbhi Singh int plat_mboot_measure_image(unsigned int image_id, image_info_t *image_data)
122c4c9e2bcSAbhi Singh {
123c4c9e2bcSAbhi Singh 	int rc = 0;
124c4c9e2bcSAbhi Singh 
125c4c9e2bcSAbhi Singh 	unsigned char hash_data[CRYPTO_MD_MAX_SIZE];
126c4c9e2bcSAbhi Singh 	const event_log_metadata_t *metadata_ptr = rpi3_event_log_metadata;
127c4c9e2bcSAbhi Singh 
128c4c9e2bcSAbhi Singh 	/* Measure the payload with algorithm selected by EventLog driver */
129c4c9e2bcSAbhi Singh 	rc = event_log_measure(image_data->image_base, image_data->image_size, hash_data);
130c4c9e2bcSAbhi Singh 	if (rc != 0) {
131c4c9e2bcSAbhi Singh 		return rc;
132c4c9e2bcSAbhi Singh 	}
133c4c9e2bcSAbhi Singh 
134*4f9894dbSAbhi Singh #if DISCRETE_TPM
135*4f9894dbSAbhi Singh 	rc = tpm_pcr_extend(&tpm_chip_data, 0, TPM_ALG_ID, hash_data, TCG_DIGEST_SIZE);
136*4f9894dbSAbhi Singh 	if (rc != 0) {
137*4f9894dbSAbhi Singh 		ERROR("BL2: TPM PCR-0 extend failed\n");
138*4f9894dbSAbhi Singh 		panic();
139*4f9894dbSAbhi Singh 	}
140*4f9894dbSAbhi Singh #endif
141*4f9894dbSAbhi Singh 
142c4c9e2bcSAbhi Singh 	while ((metadata_ptr->id != EVLOG_INVALID_ID) &&
143c4c9e2bcSAbhi Singh 		(metadata_ptr->id != image_id)) {
144c4c9e2bcSAbhi Singh 		metadata_ptr++;
145c4c9e2bcSAbhi Singh 	}
146c4c9e2bcSAbhi Singh 	assert(metadata_ptr->id != EVLOG_INVALID_ID);
147c4c9e2bcSAbhi Singh 
148c4c9e2bcSAbhi Singh 	event_log_record(hash_data, EV_POST_CODE, metadata_ptr);
149c4c9e2bcSAbhi Singh 
150c4c9e2bcSAbhi Singh 	return rc;
151c4c9e2bcSAbhi Singh }
152