72 pmc_ipc_discovery_buf_t discov_buf;
73 memset(&discov_buf, 0,
sizeof(pmc_ipc_discovery_buf_t));
79 pmc_crashlog_desc_table_t desc_tab;
80 memset(&desc_tab, 0,
sizeof(pmc_crashlog_desc_table_t));
86 cpu_crashlog_discovery_table_t cpu_disc_tab;
87 memset(&cpu_disc_tab, 0,
sizeof(cpu_crashlog_discovery_table_t));
93 cpu_crashlog_mailbox_t cl_mailbox_interface;
97 cl_mailbox_interface.data =
read32((
u32 *)cl_mailbox_addr);
100 }
while ((cl_mailbox_interface.fields.busy == 1)
103 if ((cl_mailbox_interface.fields.busy == 1)
114 cpu_crashlog_mailbox_t cl_mailbox_intf;
117 memset(&cl_mailbox_intf, 0,
sizeof(cpu_crashlog_mailbox_t));
121 cl_mailbox_intf.fields.command = cmd;
122 cl_mailbox_intf.fields.param = param;
123 cl_mailbox_intf.fields.busy = 1;
126 cl_mailbox_intf.data);
141 int total_data_size = 0;
143 printk(
BIOS_DEBUG,
"CL PMC desc table: numb of regions is 0x%x at addr 0x%x\n",
146 desc_table_addr += 4;
149 printk(
BIOS_DEBUG,
"CL PMC desc table: region 0x%x has size 0x%x at offset 0x%x\n",
153 printk(
BIOS_ERR,
"More than 255 regions in PMC crashLog descriptor table");
157 return total_data_size;
241 bool cpu_cl_discovered =
false, pmc_cl_discovered =
false;
251 return (cpu_cl_discovered || pmc_cl_discovered);
263 src_bar,
offset, __func__);
271 if (pmc_sram && !(data && !(data &
BIT(31)))) {
273 " of PMC SRAM.\n", data,
offset, src_bar);
277 if (!pmc_sram && !data && (buffer_index == 0)) {
279 " of telemetry SRAM.\n", data,
offset, src_bar);
284 while (copied < size) {
307 goto pmc_send_re_arm_after_reset;
314 goto pmc_send_re_arm_after_reset;
330 unsigned long pmc_cl_cbmem_addr;
334 if (!pmc_cl_cbmem_addr) {
335 printk(
BIOS_ERR,
"Unable to allocate CBMEM PMC crashLog entry.\n");
339 memset((
void *)pmc_cl_cbmem_addr, 0, pmc_crashLog_size);
341 bool pmc_sram =
true;
351 dest = (
u32 *)((
u32)dest +
358 " to: 0x%x\n", pmc_crashLog_size);
376 pmc_send_re_arm_after_reset:
388 u32 tmp_bar_addr = 0;
402 unsigned long cpu_crashlog_cbmem_addr;
405 if (!cpu_crashlog_cbmem_addr) {
406 printk(
BIOS_ERR,
"Failed to add CPU main crashLog entries to CBMEM.\n");
413 bool pmc_sram =
false;
414 cpu_crashlog_buffer_info_t buff_info;
425 dest = (
u32 *)((
u32)dest +
449 if (
CONFIG(SOC_INTEL_CRASHLOG_ON_RESET)) {
455 printk(
BIOS_DEBUG,
"Skipping PMC crashLog collection. Data not present.\n");
465 printk(
BIOS_DEBUG,
"Skipping CPU crashLog collection. Data not present.\n");
471 void *cl_src_addr =
NULL;
489 void *cl_src_addr =
NULL;
bool cl_pmc_sram_has_mmio_access(void)
bool cl_pmc_data_present(void)
int cl_get_total_data_size(void)
int cl_get_pmc_record_size(void)
cpu_crashlog_discovery_table_t cl_get_cpu_discovery_table(void)
static u32 m_cpu_crashLog_size
static pmc_crashlog_desc_table_t descriptor_table
pmc_ipc_discovery_buf_t cl_get_pmc_discovery_buf(void)
int cl_get_cpu_record_size(void)
bool cl_cpu_data_present(void)
static u32 m_pmc_crashLog_size
static pmc_ipc_discovery_buf_t discovery_buf
bool pmc_crashlog_support(void)
void update_new_pmc_crashlog_size(u32 *pmc_crash_size)
u32 cl_get_cpu_bar_addr(void)
void update_new_cpu_crashlog_size(u32 *cpu_crash_size)
pmc_crashlog_desc_table_t cl_get_pmc_descriptor_table(void)
bool cpu_crashlog_support(void)
bool cpu_cl_discovery(void)
u32 cl_get_cpu_tmp_bar(void)
static cpu_crashlog_discovery_table_t cpu_cl_disc_tab
bool pmc_cl_discovery(void)
u32 __weak cl_get_cpu_mb_int_addr(void)
void reset_discovery_buffers(void)
static void write32(void *addr, uint32_t val)
static uint32_t read32(const void *addr)
void * memcpy(void *dest, const void *src, size_t n)
void * memset(void *dstpp, int c, size_t len)
void * cbmem_add(u32 id, u64 size)
void * cbmem_find(u32 id)
#define CBMEM_ID_CPU_CRASHLOG
#define CBMEM_ID_PMC_CRASHLOG
bool cl_fill_pmc_records(void *cl_record)
void collect_pmc_and_cpu_crashlog_from_srams(void)
bool discover_crashlog(void)
int cpu_cl_clear_data(void)
int cl_pmc_re_arm_after_reset(void)
bool cl_copy_data_from_sram(u32 src_bar, u32 offset, u32 size, u32 *dest_addr, u32 buffer_index, bool pmc_sram)
int pmc_cl_gen_descriptor_table(u32 desc_table_addr, pmc_crashlog_desc_table_t *descriptor_table)
void cl_get_cpu_sram_data(void)
int cpu_cl_mailbox_cmd(u8 cmd, u8 param)
bool cl_fill_cpu_records(void *cl_record)
int cpu_cl_poll_mailbox_ready(u32 cl_mailbox_addr)
int cl_pmc_en_gen_on_all_reboot(void)
void cl_get_pmc_sram_data(void)
#define PMC_IPC_CMD_CRASHLOG
#define CPU_CRASHLOG_MAILBOX_WAIT_TIMEOUT
#define PMC_IPC_CMD_ID_CRASHLOG_ERASE
#define PMC_IPC_CMD_ID_CRASHLOG_ON_RESET
#define PMC_IPC_CMD_ID_CRASHLOG_RE_ARM_ON_RESET
#define CPU_CRASHLOG_CMD_CLEAR
#define CPU_CRASHLOG_MAILBOX_WAIT_STALL
#define printk(level,...)
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
enum cb_err pmc_send_ipc_cmd(uint32_t cmd, const struct pmc_ipc_buffer *wbuf, struct pmc_ipc_buffer *rbuf)
#define PMC_IPC_CMD_SIZE_SHIFT
static uint32_t pmc_make_ipc_cmd(uint32_t cmd, uint32_t subcmd, uint32_t size)
const struct smm_save_state_ops *legacy_ops __weak