#include <linux/bitfield.h>
#include <linux/edac.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/sizes.h>
#include <linux/firmware/xlnx-zynqmp.h>
#include <linux/firmware/xlnx-event-manager.h>
#include "edac_module.h"
#define XDDR_EDAC_ERR_GRAIN …
#define XDDR_EDAC_MSG_SIZE …
#define EVENT …
#define XDDR_PCSR_OFFSET …
#define XDDR_ISR_OFFSET …
#define XDDR_IRQ_EN_OFFSET …
#define XDDR_IRQ1_EN_OFFSET …
#define XDDR_IRQ_DIS_OFFSET …
#define XDDR_IRQ_CE_MASK …
#define XDDR_IRQ_UE_MASK …
#define XDDR_REG_CONFIG0_OFFSET …
#define XDDR_REG_CONFIG0_BUS_WIDTH_MASK …
#define XDDR_REG_CONFIG0_NUM_CHANS_MASK …
#define XDDR_REG_CONFIG0_NUM_RANKS_MASK …
#define XDDR_REG_CONFIG0_SIZE_MASK …
#define XDDR_REG_PINOUT_OFFSET …
#define XDDR_REG_PINOUT_ECC_EN_MASK …
#define ECCW0_FLIP_CTRL …
#define ECCW0_FLIP0_OFFSET …
#define ECCW0_FLIP0_BITS …
#define ECCW0_FLIP1_OFFSET …
#define ECCW1_FLIP_CTRL …
#define ECCW1_FLIP0_OFFSET …
#define ECCW1_FLIP1_OFFSET …
#define ECCR0_CERR_STAT_OFFSET …
#define ECCR0_CE_ADDR_LO_OFFSET …
#define ECCR0_CE_ADDR_HI_OFFSET …
#define ECCR0_CE_DATA_LO_OFFSET …
#define ECCR0_CE_DATA_HI_OFFSET …
#define ECCR0_CE_DATA_PAR_OFFSET …
#define ECCR0_UERR_STAT_OFFSET …
#define ECCR0_UE_ADDR_LO_OFFSET …
#define ECCR0_UE_ADDR_HI_OFFSET …
#define ECCR0_UE_DATA_LO_OFFSET …
#define ECCR0_UE_DATA_HI_OFFSET …
#define ECCR0_UE_DATA_PAR_OFFSET …
#define ECCR1_CERR_STAT_OFFSET …
#define ECCR1_CE_ADDR_LO_OFFSET …
#define ECCR1_CE_ADDR_HI_OFFSET …
#define ECCR1_CE_DATA_LO_OFFSET …
#define ECCR1_CE_DATA_HI_OFFSET …
#define ECCR1_CE_DATA_PAR_OFFSET …
#define ECCR1_UERR_STAT_OFFSET …
#define ECCR1_UE_ADDR_LO_OFFSET …
#define ECCR1_UE_ADDR_HI_OFFSET …
#define ECCR1_UE_DATA_LO_OFFSET …
#define ECCR1_UE_DATA_HI_OFFSET …
#define ECCR1_UE_DATA_PAR_OFFSET …
#define XDDR_NOC_REG_ADEC4_OFFSET …
#define RANK_1_MASK …
#define LRANK_0_MASK …
#define LRANK_1_MASK …
#define MASK_24 …
#define XDDR_NOC_REG_ADEC5_OFFSET …
#define XDDR_NOC_REG_ADEC6_OFFSET …
#define XDDR_NOC_REG_ADEC7_OFFSET …
#define XDDR_NOC_REG_ADEC8_OFFSET …
#define XDDR_NOC_REG_ADEC9_OFFSET …
#define XDDR_NOC_REG_ADEC10_OFFSET …
#define XDDR_NOC_REG_ADEC11_OFFSET …
#define MASK_0 …
#define GRP_0_MASK …
#define GRP_1_MASK …
#define CH_0_MASK …
#define XDDR_NOC_REG_ADEC12_OFFSET …
#define XDDR_NOC_REG_ADEC13_OFFSET …
#define XDDR_NOC_REG_ADEC14_OFFSET …
#define XDDR_NOC_ROW_MATCH_MASK …
#define XDDR_NOC_COL_MATCH_MASK …
#define XDDR_NOC_BANK_MATCH_MASK …
#define XDDR_NOC_GRP_MATCH_MASK …
#define XDDR_NOC_REG_ADEC15_OFFSET …
#define XDDR_NOC_RANK_MATCH_MASK …
#define XDDR_NOC_LRANK_MATCH_MASK …
#define XDDR_NOC_CH_MATCH_MASK …
#define XDDR_NOC_MOD_SEL_MASK …
#define XDDR_NOC_MATCH_EN_MASK …
#define ECCR_UE_CE_ADDR_HI_ROW_MASK …
#define XDDR_EDAC_NR_CSROWS …
#define XDDR_EDAC_NR_CHANS …
#define XDDR_BUS_WIDTH_64 …
#define XDDR_BUS_WIDTH_32 …
#define XDDR_BUS_WIDTH_16 …
#define XDDR_MAX_ROW_CNT …
#define XDDR_MAX_COL_CNT …
#define XDDR_MAX_RANK_CNT …
#define XDDR_MAX_LRANK_CNT …
#define XDDR_MAX_BANK_CNT …
#define XDDR_MAX_GRP_CNT …
#define PCSR_UNLOCK_VAL …
#define PCSR_LOCK_VAL …
#define XDDR_ERR_TYPE_CE …
#define XDDR_ERR_TYPE_UE …
#define XILINX_DRAM_SIZE_4G …
#define XILINX_DRAM_SIZE_6G …
#define XILINX_DRAM_SIZE_8G …
#define XILINX_DRAM_SIZE_12G …
#define XILINX_DRAM_SIZE_16G …
#define XILINX_DRAM_SIZE_32G …
#define NUM_UE_BITPOS …
ecc_error_info __packed;
edac_info __packed;
struct ecc_status { … };
struct edac_priv { … };
static void get_ce_error_info(struct edac_priv *priv)
{ … }
static void get_ue_error_info(struct edac_priv *priv)
{ … }
static bool get_error_info(struct edac_priv *priv)
{ … }
static unsigned long convert_to_physical(struct edac_priv *priv, union ecc_error_info pinf)
{ … }
static void handle_error(struct mem_ctl_info *mci, struct ecc_status *stat)
{ … }
static void err_callback(const u32 *payload, void *data)
{ … }
static enum dev_type get_dwidth(const void __iomem *base)
{ … }
static bool get_ecc_state(void __iomem *base)
{ … }
static u64 get_memsize(struct edac_priv *priv)
{ … }
static void init_csrows(struct mem_ctl_info *mci)
{ … }
static void mc_init(struct mem_ctl_info *mci, struct platform_device *pdev)
{ … }
static void enable_intr(struct edac_priv *priv)
{ … }
static void disable_intr(struct edac_priv *priv)
{ … }
#define to_mci(k) …
#ifdef CONFIG_EDAC_DEBUG
static void poison_setup(struct edac_priv *priv)
{ … }
static void xddr_inject_data_ce_store(struct mem_ctl_info *mci, u8 ce_bitpos)
{ … }
static ssize_t inject_data_ce_store(struct file *file, const char __user *data,
size_t count, loff_t *ppos)
{ … }
static const struct file_operations xddr_inject_ce_fops = …;
static void xddr_inject_data_ue_store(struct mem_ctl_info *mci, u32 val0, u32 val1)
{ … }
static ssize_t inject_data_ue_store(struct file *file, const char __user *data,
size_t count, loff_t *ppos)
{ … }
static const struct file_operations xddr_inject_ue_fops = …;
static void create_debugfs_attributes(struct mem_ctl_info *mci)
{ … }
static inline void process_bit(struct edac_priv *priv, unsigned int start, u32 regval)
{ … }
static void setup_row_address_map(struct edac_priv *priv)
{ … }
static void setup_column_address_map(struct edac_priv *priv)
{ … }
static void setup_bank_grp_ch_address_map(struct edac_priv *priv)
{ … }
static void setup_rank_lrank_address_map(struct edac_priv *priv)
{ … }
static void setup_address_map(struct edac_priv *priv)
{ … }
#endif
static const struct of_device_id xlnx_edac_match[] = …;
MODULE_DEVICE_TABLE(of, xlnx_edac_match);
static u32 emif_get_id(struct device_node *node)
{ … }
static int mc_probe(struct platform_device *pdev)
{ … }
static void mc_remove(struct platform_device *pdev)
{ … }
static struct platform_driver xilinx_ddr_edac_mc_driver = …;
module_platform_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;