blob: fe30b1e33a2e325e93f83338ec8d98902349ca0d [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef __AML_IOTRACE_H
#define __AML_IOTRACE_H
extern int ramoops_io_skip;
extern int ramoops_io_en;
extern int ramoops_trace_mask;
extern int meson_clk_debug;
extern int meson_pd_debug;
void notrace __nocfi pstore_io_save(unsigned long reg, unsigned long val, unsigned int flag,
unsigned long *irq_flags);
#define PSTORE_FLAG_IO_R 0x0
#define PSTORE_FLAG_IO_W 0x1
#define PSTORE_FLAG_IO_R_END 0x2
#define PSTORE_FLAG_IO_W_END 0x3
#if (IS_ENABLED(CONFIG_AMLOGIC_DEBUG_IOTRACE)) && (!defined SKIP_IO_TRACE)
#define pstore_ftrace_io_wr(reg, val) \
unsigned long irqflg; \
pstore_io_save(reg, val, PSTORE_FLAG_IO_W, &irqflg)
#define pstore_ftrace_io_wr_end(reg, val) \
pstore_io_save(reg, val, PSTORE_FLAG_IO_W_END, &irqflg)
#define pstore_ftrace_io_rd(reg) \
unsigned long irqflg; \
pstore_io_save(reg, 0, PSTORE_FLAG_IO_R, &irqflg)
#define pstore_ftrace_io_rd_end(reg) \
pstore_io_save(reg, 0, PSTORE_FLAG_IO_R_END, &irqflg)
#else
#define pstore_ftrace_io_wr(reg, val) do { } while (0)
#define pstore_ftrace_io_rd(reg) do { } while (0)
#define pstore_ftrace_io_wr_end(reg, val) do { } while (0)
#define pstore_ftrace_io_rd_end(reg) do { } while (0)
#define pstore_ftrace_io_tag(reg, val) do { } while (0)
#endif /*CONFIG_AMLOGIC_DEBUG_IOTRACE && !SKIP_IO_TRACE */
enum aml_pstore_type_id {
AML_PSTORE_TYPE_IO = 0,
AML_PSTORE_TYPE_SCHED = 1,
AML_PSTORE_TYPE_IRQ = 2,
AML_PSTORE_TYPE_SMC = 3,
AML_PSTORE_TYPE_MISC = 4,
AML_PSTORE_TYPE_MAX
};
struct io_trace_data {
unsigned int reg;
unsigned int val;
union {
struct {
unsigned long flag:2;
unsigned long :0;
};
unsigned long ip;
};
unsigned long parent_ip;
};
void aml_pstore_write(enum aml_pstore_type_id type, char *buf, unsigned long size);
int ftrace_ramoops_init(void);
#endif