1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2020, Arm Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu #include <common/fdt_wrappers.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <libfdt.h> 11*91f16700Schasinglulu #include <fconf_nt_config_getter.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <plat/common/platform.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu struct event_log_config_t event_log_config; 16*91f16700Schasinglulu 17*91f16700Schasinglulu int fconf_populate_event_log_config(uintptr_t config) 18*91f16700Schasinglulu { 19*91f16700Schasinglulu int err; 20*91f16700Schasinglulu int node; 21*91f16700Schasinglulu 22*91f16700Schasinglulu /* Necessary to work with libfdt APIs */ 23*91f16700Schasinglulu const void *dtb = (const void *)config; 24*91f16700Schasinglulu 25*91f16700Schasinglulu /* 26*91f16700Schasinglulu * Find the offset of the node containing "arm,tpm_event_log" 27*91f16700Schasinglulu * compatible property 28*91f16700Schasinglulu */ 29*91f16700Schasinglulu const char *compatible_str = "arm,tpm_event_log"; 30*91f16700Schasinglulu 31*91f16700Schasinglulu node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 32*91f16700Schasinglulu if (node < 0) { 33*91f16700Schasinglulu ERROR("FCONF: Can't find '%s' compatible in dtb\n", 34*91f16700Schasinglulu compatible_str); 35*91f16700Schasinglulu return node; 36*91f16700Schasinglulu } 37*91f16700Schasinglulu 38*91f16700Schasinglulu /* Retrieve Event Log details from the DTB */ 39*91f16700Schasinglulu #ifdef SPD_opteed 40*91f16700Schasinglulu err = fdtw_read_cells(dtb, node, "tpm_event_log_sm_addr", 2, 41*91f16700Schasinglulu &event_log_config.tpm_event_log_sm_addr); 42*91f16700Schasinglulu if (err < 0) { 43*91f16700Schasinglulu ERROR("FCONF: Read cell failed for 'tpm_event_log_sm_addr'\n"); 44*91f16700Schasinglulu return err; 45*91f16700Schasinglulu } 46*91f16700Schasinglulu #endif 47*91f16700Schasinglulu err = fdtw_read_cells(dtb, node, 48*91f16700Schasinglulu "tpm_event_log_addr", 2, &event_log_config.tpm_event_log_addr); 49*91f16700Schasinglulu if (err < 0) { 50*91f16700Schasinglulu ERROR("FCONF: Read cell failed for 'tpm_event_log_addr'\n"); 51*91f16700Schasinglulu return err; 52*91f16700Schasinglulu } 53*91f16700Schasinglulu 54*91f16700Schasinglulu err = fdtw_read_cells(dtb, node, 55*91f16700Schasinglulu "tpm_event_log_size", 1, &event_log_config.tpm_event_log_size); 56*91f16700Schasinglulu if (err < 0) { 57*91f16700Schasinglulu ERROR("FCONF: Read cell failed for 'tpm_event_log_size'\n"); 58*91f16700Schasinglulu } 59*91f16700Schasinglulu 60*91f16700Schasinglulu return err; 61*91f16700Schasinglulu } 62*91f16700Schasinglulu 63*91f16700Schasinglulu FCONF_REGISTER_POPULATOR(NT_CONFIG, event_log_config, 64*91f16700Schasinglulu fconf_populate_event_log_config); 65