1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2019-2022, Arm Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef FCONF_H 8*91f16700Schasinglulu #define FCONF_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stddef.h> 11*91f16700Schasinglulu #include <stdint.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu /* Public API */ 14*91f16700Schasinglulu #define FCONF_GET_PROPERTY(a, b, c) a##__##b##_getter(c) 15*91f16700Schasinglulu 16*91f16700Schasinglulu /* 17*91f16700Schasinglulu * This macro takes three arguments: 18*91f16700Schasinglulu * config: Configuration identifier 19*91f16700Schasinglulu * name: property namespace 20*91f16700Schasinglulu * callback: populate() function 21*91f16700Schasinglulu */ 22*91f16700Schasinglulu #define FCONF_REGISTER_POPULATOR(config, name, callback) \ 23*91f16700Schasinglulu __attribute__((used, section(".fconf_populator"))) \ 24*91f16700Schasinglulu static const struct fconf_populator (name##__populator) = { \ 25*91f16700Schasinglulu .config_type = (#config), \ 26*91f16700Schasinglulu .info = (#name), \ 27*91f16700Schasinglulu .populate = (callback) \ 28*91f16700Schasinglulu }; 29*91f16700Schasinglulu 30*91f16700Schasinglulu /* 31*91f16700Schasinglulu * Populator callback 32*91f16700Schasinglulu * 33*91f16700Schasinglulu * This structure are used by the fconf_populate function and should only be 34*91f16700Schasinglulu * defined by the FCONF_REGISTER_POPULATOR macro. 35*91f16700Schasinglulu */ 36*91f16700Schasinglulu struct fconf_populator { 37*91f16700Schasinglulu /* Description of the data loaded by the callback */ 38*91f16700Schasinglulu const char *config_type; 39*91f16700Schasinglulu const char *info; 40*91f16700Schasinglulu 41*91f16700Schasinglulu /* Callback used by fconf_populate function with a provided config dtb. 42*91f16700Schasinglulu * Return 0 on success, err_code < 0 otherwise. 43*91f16700Schasinglulu */ 44*91f16700Schasinglulu int (*populate)(uintptr_t config); 45*91f16700Schasinglulu }; 46*91f16700Schasinglulu 47*91f16700Schasinglulu /* This function supports to load tb_fw_config and fw_config dtb */ 48*91f16700Schasinglulu int fconf_load_config(unsigned int image_id); 49*91f16700Schasinglulu 50*91f16700Schasinglulu /* Top level populate function 51*91f16700Schasinglulu * 52*91f16700Schasinglulu * This function takes a configuration dtb and calls all the registered 53*91f16700Schasinglulu * populator callback with it. 54*91f16700Schasinglulu * 55*91f16700Schasinglulu * Panic on error. 56*91f16700Schasinglulu */ 57*91f16700Schasinglulu void fconf_populate(const char *config_type, uintptr_t config); 58*91f16700Schasinglulu 59*91f16700Schasinglulu /* FCONF specific getter */ 60*91f16700Schasinglulu #define fconf__dtb_getter(prop) fconf_dtb_info.prop 61*91f16700Schasinglulu 62*91f16700Schasinglulu /* Structure used to locally keep a reference to the config dtb. */ 63*91f16700Schasinglulu struct fconf_dtb_info_t { 64*91f16700Schasinglulu uintptr_t base_addr; 65*91f16700Schasinglulu size_t size; 66*91f16700Schasinglulu }; 67*91f16700Schasinglulu 68*91f16700Schasinglulu extern struct fconf_dtb_info_t fconf_dtb_info; 69*91f16700Schasinglulu 70*91f16700Schasinglulu #endif /* FCONF_H */ 71