1*4b8b8d74SJaiprakash Singh /***********************license start*********************************** 2*4b8b8d74SJaiprakash Singh * Copyright (C) 2021-2026 Marvell. 3*4b8b8d74SJaiprakash Singh * SPDX-License-Identifier: BSD-3-Clause 4*4b8b8d74SJaiprakash Singh * https://spdx.org/licenses 5*4b8b8d74SJaiprakash Singh ***********************license end**************************************/ 6*4b8b8d74SJaiprakash Singh 7*4b8b8d74SJaiprakash Singh /** 8*4b8b8d74SJaiprakash Singh * @file 9*4b8b8d74SJaiprakash Singh * 10*4b8b8d74SJaiprakash Singh * Functions for reporting errors and warnings. 11*4b8b8d74SJaiprakash Singh * 12*4b8b8d74SJaiprakash Singh * <hr>$Revision: 49448 $<hr> 13*4b8b8d74SJaiprakash Singh * 14*4b8b8d74SJaiprakash Singh * @defgroup stdio Standard IO related functions 15*4b8b8d74SJaiprakash Singh * @{ 16*4b8b8d74SJaiprakash Singh */ 17*4b8b8d74SJaiprakash Singh 18*4b8b8d74SJaiprakash Singh extern void __ody_die(void) __attribute__ ((noreturn)); 19*4b8b8d74SJaiprakash Singh extern void ody_fatal(const char *format, ...) __attribute__ ((noreturn, format(printf, 1, 2))); 20*4b8b8d74SJaiprakash Singh extern void ody_error(const char *format, ...) __attribute__ ((format(printf, 1, 2))); 21*4b8b8d74SJaiprakash Singh extern void ody_warn(const char *format, ...) __attribute__ ((format(printf, 1, 2))); 22*4b8b8d74SJaiprakash Singh extern void __ody_trace_printf(const char *format, ...) __attribute__ ((format(printf, 1, 2))); 23*4b8b8d74SJaiprakash Singh #define ody_warn_if(expression, format, ...) do { if (ody_unlikely(expression)) ody_warn (format, ##__VA_ARGS__); } while (0) 24*4b8b8d74SJaiprakash Singh 25*4b8b8d74SJaiprakash Singh /* The following defines control detailed tracing of various parts of the 26*4b8b8d74SJaiprakash Singh ODY. Each one can be enabled(1) or disabled(0) independently. These 27*4b8b8d74SJaiprakash Singh should be disabled unless you are trying to debug something specific */ 28*4b8b8d74SJaiprakash Singh 29*4b8b8d74SJaiprakash Singh typedef enum { 30*4b8b8d74SJaiprakash Singh TRACE_ENABLE_DRAM, /* DRAM initialization */ 31*4b8b8d74SJaiprakash Singh TRACE_ENABLE_DRAM_TEST, /* DRAM test code */ 32*4b8b8d74SJaiprakash Singh TRACE_ENABLE_INIT, /* Early initialization, before main() */ 33*4b8b8d74SJaiprakash Singh TRACE_ENABLE_ECAM, /* ECAM initialization */ 34*4b8b8d74SJaiprakash Singh TRACE_ENABLE_QLM, /* QLM related debug */ 35*4b8b8d74SJaiprakash Singh TRACE_ENABLE_EMMC, /* eMMC related debug */ 36*4b8b8d74SJaiprakash Singh TRACE_ENABLE_PCIE, /* PCIe link init */ 37*4b8b8d74SJaiprakash Singh TRACE_ENABLE_PCIE_CONFIG, /* PCIe config space reads / writes */ 38*4b8b8d74SJaiprakash Singh TRACE_ENABLE_SPI, /* SPI related debug */ 39*4b8b8d74SJaiprakash Singh TRACE_ENABLE_ENV, /* Environment variables related debug */ 40*4b8b8d74SJaiprakash Singh TRACE_ENABLE_DEVICE, /* ECAM based device framework */ 41*4b8b8d74SJaiprakash Singh TRACE_ENABLE_DEVICE_SCAN, /* ECAM based device scanning detail */ 42*4b8b8d74SJaiprakash Singh TRACE_ENABLE_FDT_OS, /* Device tree passed to OS */ 43*4b8b8d74SJaiprakash Singh TRACE_ENABLE_USB_XHCI, /* USB XHCI block */ 44*4b8b8d74SJaiprakash Singh __TRACE_ENABLE_LAST, /* Must always be last value */ 45*4b8b8d74SJaiprakash Singh } ody_trace_enable_t; 46*4b8b8d74SJaiprakash Singh 47*4b8b8d74SJaiprakash Singh /* See ody-config.c to change the trace level for before config files are loaded */ 48*4b8b8d74SJaiprakash Singh extern uint64_t ody_trace_enables; 49*4b8b8d74SJaiprakash Singh 50*4b8b8d74SJaiprakash Singh /** 51*4b8b8d74SJaiprakash Singh * Macro for low level tracing of ODY functions. When enabled, 52*4b8b8d74SJaiprakash Singh * these translate to printf() calls. The "area" is a string 53*4b8b8d74SJaiprakash Singh * that is appended to "TRACE_ENABLE_" to figure out which 54*4b8b8d74SJaiprakash Singh * enable macro to use. The macro expects a ';' after it. 55*4b8b8d74SJaiprakash Singh */ 56*4b8b8d74SJaiprakash Singh #define TRACE(area, format, ...) do { \ 57*4b8b8d74SJaiprakash Singh if (ody_trace_enables & (1ull << TRACE_ENABLE_##area)) \ 58*4b8b8d74SJaiprakash Singh __ody_trace_printf(#area ": " format, ##__VA_ARGS__); \ 59*4b8b8d74SJaiprakash Singh } while (0) 60*4b8b8d74SJaiprakash Singh 61*4b8b8d74SJaiprakash Singh /* The following defines control detailed tracing of various parts of the 62*4b8b8d74SJaiprakash Singh ATF. Each one can be enabled(1) or disabled(0) independently. These 63*4b8b8d74SJaiprakash Singh should be disabled unless you are trying to debug something specific. 64*4b8b8d74SJaiprakash Singh 65*4b8b8d74SJaiprakash Singh Implementation note: this order must match ATF 'mrvl_tf_log_module_e'. 66*4b8b8d74SJaiprakash Singh */ 67*4b8b8d74SJaiprakash Singh typedef enum { 68*4b8b8d74SJaiprakash Singh /* gap (matches ATF mrvl_tf_log_module_e) */ 69*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_RVU = 9, /* ATF RVU driver messages */ 70*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_PARSE, /* ATF platform parsing messages */ 71*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_PLAT_ECAM,/* ATF plat-specific ecam driver messages */ 72*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_GEN_ECAM, /* ATF generic ecam driver messages */ 73*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_UPDATE, /* ATF update driver */ 74*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_ETH_CMD, /* ATF network driver messages */ 75*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_ETH_LINK, /* ATF network driver link message */ 76*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_ETH_LINK_MGMT, /* ATF ECP link interface */ 77*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_GSERM, /* ATF GSERM driver messages */ 78*4b8b8d74SJaiprakash Singh ATF_TRACE_MODULE_ETH_SFP_MGMT, /* ATF SFP mgmt driver messages */ 79*4b8b8d74SJaiprakash Singh __ATF_TRACE_MODULE_LAST, /* Must always be last value */ 80*4b8b8d74SJaiprakash Singh } atf_trace_module_t; 81*4b8b8d74SJaiprakash Singh 82*4b8b8d74SJaiprakash Singh /** @} */ 83