linux/drivers/mcst/mmr/mmr.h

264 lines
12 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*
* Ported in Linux by Alexey V. Sitnikov, alexmipt@mcst.ru, MCST, 2004
*
*/
#ifndef _LINUX_MMR_H__
#define _LINUX_MMR_H__
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/time.h>
#include <linux/slab.h>
#include <linux/mcst/linux_mmr_io.h>
#ifndef cv_destroy
#define cv_destroy(arg)
#endif
//void debug_mmr(const char *fmt,...){}
//#define debug_mmr delay_printk
#ifndef MMR_OLD_VERSION
/* Версия драйвера ВК */
#define VER_DRV_VK_MMR 0x17040504
#define work_var_drv_vk 16
#define MMR_MAX_SIZE_BUFFER_DMA 0x40000 /* Макс. размер буфера ППД */
#endif /* MMR_OLD_VERSION */
/* Список причин прерываний */
typedef enum intr_rsn
{
undefined_intr_reason = 0, /* неопределенная причина прерывания */
reject_intr_reason = 1, /* прерывание отклоняется */
get_intr_reason_mmr = 2, /* получено прерывание от ММР */
board_error_intr_reason = 3 /* внутренняя ошибка платы */
} intr_reason_t;
/* Управляющая информация буферов данных */
typedef struct buf_datas_args {
u_int USK_TRANS; /* УСК передатчика */
u_int AC0_TRANS; /* АС0 передатчика */
u_int SKB_TRANS; /* СКБ передатчика */
u_int AC1_TRANS; /* АС1 передатчика */
u_int USK_RECIV; /* УСК приемника */
u_int AC0_RECIV; /* АС0 приемника */
u_int SKB_RECIV; /* СКБ приемника */
u_int AC1_RECIV; /* АС1 приемника */
} buf_datas_args_t;
/* Управляющая информация буферов данных */
typedef union ctrl_buf_datas {
buf_datas_args_t
init_buf_data[MMR_BUF_ADAPTER_NUM];
/* максимальная область памяти */
u_int args_area[MMR_BUF_ADAPTER_NUM*8];
} ctrl_buf_datas_t;
/* Управляющая информация буфера команд */
typedef struct buf_comm_args {
u_int USK; /* УСК */
u_int AC0; /* АС0 */
u_int SKB; /* СКБ */
u_int AC1; /* АС1 */
} buf_comm_args_t;
/* Буфера команд адаптера */
typedef struct buffer_data {
u_int area_subbuf0[8];
u_int area_subbuf1[8];
} buffer_data_t;
/* Управляющая информация буфера команд */
typedef union ctrl_buf_comm {
buf_comm_args_t
init_buf_comm;
/* максимальная область памяти управляющей информации буфера команд */
u_int args_area[4];
} ctrl_buf_comm_t;
/* Связь драйвера ВК и платы ММР */
typedef struct drv_comm_memory {
ctrl_buf_datas_t ctrl_buf_datas; /* Управляющая информация буферов данных */
buffer_data_t buffer_command; /* Информация буфера команд адаптера */
ctrl_buf_comm_t ctrl_buf_comm; /* Управляющая информация буфера команд */
} drv_comm_memory_t;
#define MMR_DRV_COMM_FREE_TIMEOUT_DEF_VALUE (1000000) /* 1 seconds */
/* Локальные определения */
#define MMR_DEVN(d) (getminor(d)) /* dev_t -> minor (dev_num) */
#define MMR_inst(m) (m >> 4) /* minor -> instance */
#define MMR_chan(m) (m & 0xf) /* minor -> channel */
#define MMR_MINOR(i,c) ((i << 4) | (c)) /* instance+channel -> minor */
#define MMR_INST(d) MMR_inst(MMR_DEVN(d)) /* dev_t -> instance */
#define MMR_CHAN(d) MMR_chan(MMR_DEVN(d)) /* dev_t -> channel */
#define CHNL_NUM_TO_MASK(chnl) (1 << chnl)
/* Разрядные поля для attach_flags: */
#define SOFT_STATE_ALLOCATED 0x0001
#define INTERRUPT_ADDED 0x0002
#define MUTEX_ADDED 0x0004
#define CHANNEL_CV_ADDED 0x0008
#define REGS_MAPPED 0x0010
#define MINOR_NODE_CREATED 0x0020
#define IOPB_ALLOCED 0x0040
#define ERRORS_SIGN 0x0080
#define IBLOCK_COOKIE_ADDED 0x0200
#define INTR_IBLOCK_COOKIE_ADDED 0x0400
#define INTR_MUTEX_ADDED 0x0800
#define TRANS_HALTED_CV_ADDED 0x1000
#define CNCT_POLLING_CV_ADDED 0x2000
#define TRANS_STATE_CV_ADDED 0x4000
#ifndef MMR_OLD_VERSION
/* Имена реквизитов устройства */
#define SBUS_INTR_L_NAME_OF_PROP "interrupts"
#endif /* MMR_OLD_VERSION */
/* Обобщенные структуры пересылок и результатов */
typedef struct dma_struct {
caddr_t prim_buf_addr;
size_t real_size;
dma_addr_t busa; /* Address in the SBus space,*/
/* Адрес области dma со стороны устройства */
unsigned long *mem; /* Address in the processor space,*/
/* Адрес области dma со стороны процессора */
int size;
} dma_struct_t;
/* Структура буфера пересылки */
typedef struct trbuf_desc {
caddr_t buf_address; /* виртуальный адрес буфера пересылки */
size_t buf_size; /* байтовый размер буфера пересылки */
/* ddi_acc_handle_t acc_handle;*/ /* буфер обработки доступа */
/* ddi_dma_handle_t dma_handle;*/ /* буфер обработки DMA */
/* ddi_dma_cookie_t cookie; */ /* буфер DMA маркеров */
/* uint_t ccount; */ /* число буферов DMA маркеров */
dma_struct_t dma; /* Буфер, описывающий DMA */
} trbuf_desc_t;
/* Структура буфера пересылки.
Буфер содержит буфера пользователей */
typedef struct trbuf_state {
char valid_flag; /* допустимый буфер пересылки */
trbuf_desc_t trans_buf_desc; /* дескриптор буфера пересылки */
caddr_t user_buf_address; /* виртуальный адрес начального */
/* буфера пользователя */
size_t user_buf_size; /* байтовый размер буфера пользователя */
int max_user_buf_num; /* макс. число буферов пользователя */
/* в буфере драйвера */
caddr_t user_trans_bufs[MMR_BUF_USER_NUM]; /* список указателей буферов пересылки */
/* пользователя */
dma_addr_t dma_trans_bufs[MMR_BUF_USER_NUM]; /* список dma указателей буферов пересылки */
/* пользователя */
} trbuf_state_t;
/* Внутреннее состояние канала */
typedef struct mmr_chnl_state {
trbuf_state_t trans_buf_state; /* состояние буфера пересылки */
char trans_state_is_init; /* установка состояния пересылки */
char state_init_in_progress; /* выполняется инициализация */
char trans_state_is_halt; /* состояние пересылки - останов */
char all_trans_finish; /* все пересылки завершены */
char init_as_trans_map; /* канал инициализирован в режиме */
/* карты обмена*/
mmr_init_iomap_t init_iomap_state_spec; /* состояние инициализации карты */
size_t full_data_buf_size; /* полный размер буфера данных */
size_t subdev_buf_trans_size; /* размер передающего буфера, */
/* включая заголовок */
size_t subdev_buf_reciv_size; /* размер приемного буфера, */
/* включая заголовок */
int dma_intr_handled; /* прерывание обработано верно */
u_short trans_num; /* номер пакетной пересылки */
} mmr_chnl_state_t;
/* Внутреннее состояние драйвера */
typedef struct mmr_state {
struct of_device *op;
dev_t dev;
int dev_type;
int inst; /* номер экземпляра */
int major; /* мажор экземпляра */
int irq; /* номер прерывания */
int flag_board; /* тип устройства: К или ОУ */
int opened; /* открытое состояние */
int open_flags; /* открытое состояние с флажком */
u_int open_channel_map; /* маска открытых каналов */
/***********************************************/
raw_spinlock_t lock;
kcondvar_t channel_cv; /* переменная условий */
/* (режима, состояний) канала */
kcondvar_t drv_comm_cv; /* область связи драйвера: занятая или */
/* свободная, переменная условия */
kcondvar_t trans_state_cv; /* состояние канала пересылки, */
/* изменение переменной условия */
kcondvar_t intr_cv; /* переменная условий для прерывания */
/***********************************************/
/* ddi_iblock_cookie_t iblock_cookie; */ /* для mutexes. */
/* struct pollhead pollhead; */ /* глухая структура для опроса */
int drv_comm_busy; /* признак занятости области */
/* связи драйвера */
#ifdef MMR_OLD_VERSION
int drv_general_modes; /* общие признаки режимов драйвера */
#endif /* MMR_OLD_VERSION */
e90_unit_t type_unit; /* тип платы */
char intr_seted; /* прерывание установлено */
char intr_number; /* число прерываний */
ulong_t io_flags_intr; /* признак прерывания ПрП */
ulong_t flags_intr_rerr; /* признак прерывания по РОШ */
#ifdef MMR_OLD_VERSION
ulong pointer_reciv_comm; /* указатель на записанную команду */
/* в буфере команд ФП */
#else
u_int num_reciv_comm; /* кол-во записанных команд в буфер */
/* команд ФП по инф. адаптера */
#endif /* MMR_OLD_VERSION */
u_int cur_num_comm; /* кол-во записанных команд */
#ifndef MMR_OLD_VERSION
u_int intr_dev; /* РОБ при получении прерывания от адаптера */
hrtime_t time_get_intr_dev; /* Т получения прерывания от адаптера */
#endif /* MMR_OLD_VERSION */
mmr_reg_cntrl_t mmr_reg_cntrl_dev; /* структура регистра управления ММР */
int system_burst; /* DMA размеры пачки, позволенные SBUS */
volatile caddr_t MMR_BMEM; /* base memory */
mmr_chnl_state_t channel_state[1]; /*состояние канала платы */
/* ddi_acc_handle_t acc_regs; */ /* указатель на дескриптор доступа к регистрам */
caddr_t regs_base; /* базовый адрес регистров */
off_t reg_array_size; /* размер выделенной области */
/* регистров */
#ifndef MMR_OLD_VERSION
u_short number_intr_rosh; /* кол-во прерываний по РОШ */
#endif /* MMR_OLD_VERSION */
} mmr_state_t;
/* Макрокоманды для обращения к регистрам */
/* Виртуальный адрес регистра */
#define MMR_REGISTER_ADDR(state, reg) ((ulong_t *)(state->regs_base + reg))
/* Чтения содержимого регистра */
#define READ_MMR_REGISTER(state, reg) ddi_getl(state->dev_type, MMR_REGISTER_ADDR(state, reg))
/* Запись в регистр */
#define WRITE_MMR_REGISTER(state, reg, v) ddi_putl(state->dev_type, MMR_REGISTER_ADDR(state, reg), v)
static long
mmr_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
static int mmr_open(struct inode *inode, struct file *file);
static int mmr_mmap(struct file *file, struct vm_area_struct *vma);
static int mmr_close(struct inode *inode, struct file *file);
#endif /* _LINUX_MMR_H__ */