blob: 9fe2e3464d372da86d77fef072fb3b5a0d8007ee [file] [log] [blame]
/*
* include/linux/amlogic/dmc_monitor.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __DMC_MONITOR_H__
#define __DMC_MONITOR_H__
#define PROTECT_READ (1 << 0)
#define PROTECT_WRITE (1 << 1)
#define DMC_MON_RW 0x8200004A
#define DMC_READ 0
#define DMC_WRITE 1
#define DMC_WRITE_VIOLATION (1 << 1)
/*
* Address is aligned to 64 KB
*/
#define DMC_ADDR_SIZE (0x10000)
#define DMC_TAG "DMC VIOLATION"
struct dmc_monitor;
struct dmc_mon_ops {
void (*handle_irq)(struct dmc_monitor *mon);
int (*set_montor)(struct dmc_monitor *mon);
void (*disable)(struct dmc_monitor *mon);
size_t (*dump_reg)(char *buf);
};
struct dmc_monitor {
unsigned long io_base;
unsigned long addr_start;
unsigned long addr_end;
unsigned int device;
unsigned short port_num;
unsigned short chip;
unsigned long last_addr;
unsigned long same_page;
unsigned long last_status;
struct ddr_port_desc *port;
struct dmc_mon_ops *ops;
struct delayed_work work;
};
extern void dmc_monitor_disable(void);
/*
* start: physical start address, aligned to 64KB
* end: physical end address, aligned to 64KB
* dev_mask: device bit to set
* en: 0: close monitor, 1: enable monitor
*/
extern int dmc_set_monitor(unsigned long start, unsigned long end,
unsigned long dev_mask, int en);
/*
* start: physical start address, aligned to 64KB
* end: physical end address, aligned to 64KB
* port_name: name of port to set, see ddr_port_desc for each chip in
* drivers/amlogic/ddr_tool/ddr_port_desc.c
* en: 0: close monitor, 1: enable monitor
*/
extern int dmc_set_monitor_by_name(unsigned long start, unsigned long end,
const char *port_name, int en);
extern unsigned int get_all_dev_mask(void);
/*
* Following functions are internal used only
*/
extern unsigned long dmc_rw(unsigned long addr, unsigned long value, int rw);
extern char *to_ports(int id);
extern char *to_sub_ports(int mid, int sid, char *id_str);
extern struct dmc_mon_ops gx_dmc_mon_ops;
extern struct dmc_mon_ops g12_dmc_mon_ops;
#endif /* __DMC_MONITOR_H__ */