summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared/include/grtc.h
blob: 932f970c2e3598fc13a6870fae75dd35be3ad39e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* GRTC Telecommand (TC) decoder driver interface
 *
 * COPYRIGHT (c) 2007.
 * Cobham Gaisler AB.
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.com/license/LICENSE.
 */

#ifndef __GRTC_H__
#define __GRTC_H__

#ifdef __cplusplus
extern "C" {
#endif

#define GRTC_IOC_UNUSED			0

/* Driver operation controlling commands */
#define GRTC_IOC_START			1
#define GRTC_IOC_STOP			2
#define GRTC_IOC_ISSTARTED		3
#define GRTC_IOC_SET_BLOCKING_MODE	4	/* Raw mode only */
#define GRTC_IOC_SET_TIMEOUT		5	/* Raw mode only */

#define GRTC_IOC_ADD_BUFF		16	/* Frame mode only */
#define GRTC_IOC_RECV			17	/* Frame mode only */

/* Available only in STOPPED mode */
#define GRTC_IOC_SET_MODE		32	/* Set frame mode (ioctl) or raw mode (read) */
#define GRTC_IOC_SET_BUF_PARAM		33
#define GRTC_IOC_SET_CONFIG		34
#define GRTC_IOC_POOLS_SETUP		35	/* Frame mode only */

/* Available in both running and stopped mode */
#define GRTC_IOC_GET_CONFIG		64
#define GRTC_IOC_GET_BUF_PARAM		65
#define GRTC_IOC_GET_HW_STATUS		66
#define GRTC_IOC_ASSIGN_FRM_POOL	67
#define GRTC_IOC_GET_CLCW_ADR		68	/* Get address of CLCWRx1 */
#define GRTC_IOC_GET_STATS		69	/* Get statistics, note that most of the stats are only avilable in FRAME mode */
#define GRTC_IOC_CLR_STATS		70	/* Clear statistics */

/* Available only in RUNNING mode */

/* Args to GRTC_IOC_GET_BUF_PARAMS */
#define GRTC_BUF_MAXLEN (0x100*1024)
#define GRTC_BUF_MASK 0xfffffc00
struct grtc_ioc_buf_params {
	unsigned int	length;		/* Length of new buffer in multiples of 1kbyte blocks */
	void		*custom_buffer;	/* If set zero driver will allocate with malloc, set LSB to 1 to indicate remote address */
};

/* Args to GRTC_IOC_SET_BLOCKING_MODE */
enum {
	GRTC_BLKMODE_POLL	= 0,	/* Never block (polling mode) */
	GRTC_BLKMODE_BLK	= 1,	/* Block until at least 1 byte can be read */
	GRTC_BLKMODE_COMPLETE	= 2	/* Block until all data requested has be read */
};

/* Argument of GRTC_IOC_SET_CONFIG and GRTC_IOC_GET_CONFIG 
 * Pointer to:
 */
struct grtc_ioc_config {
	int		psr_enable;
	int		nrzm_enable;
	int		pss_enable;
	int		crc_calc;	/* Enable Software CRC calculation (only Frame mode) */
};

/* Argument of GRTC_IOC_GET_HW_STATUS:
 * Pointer to a grtc_ioc_hw_status structure that will be filled
 * in by driver.
 */
struct grtc_ioc_hw_status {
	unsigned int	sir;
	unsigned int	far;
	unsigned int	clcw1;
	unsigned int	clcw2;
	unsigned int	phir;
	unsigned int	str;
};

struct grtc_hdr {
	unsigned short	flags_scid;
	unsigned short	vc_len;
	unsigned char	seqnum;
} __attribute__((packed));

/* Frame pool, all frames in pool have the same buffer length (frame mode only) */
struct grtc_frame {
	struct grtc_frame	*next;		/* Next frame in list */
	unsigned short		len;		/* Length of frame extracted */
	unsigned short		reserved;	/* Reserved */
	struct grtc_frame_pool	*pool;		/* The frame pool this frame belongs to */
	
	/* The Frame content */
	struct grtc_hdr		hdr;		/* Primary Header */
	unsigned char		data[3];	/* Frame payload */
} __attribute__((packed));

/* GRTC_IOC_RECV argument, single linked list of received frames */
struct grtc_list {
	struct grtc_frame	*head;		/* First frame in list */
	struct grtc_frame	*tail;		/* Last frame in list */
	int			cnt;		/* Number of frames in list */
};

struct grtc_ioc_pools_setup {
	unsigned int	pool_cnt;		/* Number of pools */
	unsigned int	pool_frame_len[1];	/* Array of 'pool_cnt' length: Frame length of frames in a pool 
						 * Lengths must be sorted, starting with the smallest frame pool.
						 */
};

struct grtc_ioc_assign_frm_pool {
	unsigned int		frame_len;	/* The length of the pool to insert the frame into */
	struct grtc_frame	*frames;	/* Frames to assign to a pool */
};

enum {
	GRTC_MODE_RAW   = 0,
	GRTC_MODE_FRAME = 1
};

/* TC driver stats collected during receiving. The statistics is only available 
 * in FRAME mode. In RAW mode the user interprets the incoming frames and is 
 * therefore responsible for generating the staticstics.
 */
struct grtc_ioc_stats {
	unsigned long long	frames_recv;		/* Total number of non-erroneous frames received */
	/* Errors related to incoming data */
	unsigned int		err;			/* total number of errors */
	unsigned int		err_hdr;		/* number of errors in Header */
	unsigned int		err_payload;		/* Number of errors in payload */
	unsigned int		err_ending;		/* Number of errors in end (Filler, end marker) */
	unsigned int		err_abandoned;		/* Number of abandoned frames, NOT IMPLEMENTED */
	/* Errors related to the handling of incoming frames */
	unsigned int		dropped;		/* Number of dropped frames TC driver */
	unsigned int		dropped_no_buf;		/* Number of dropped frame caused by no buffers were available */
	unsigned int		dropped_too_long;	/* Number of dropped frames that was larger than any buffer available for driver */
};

/* Register GRTC driver at driver manager */
void grtc_register_drv(void);

/* Register GRTC RMAP driver at driver manager */
void grtc_rmap_register_drv (void);

#ifdef __cplusplus
}
#endif

#endif /* __GRTC_H__ */