summaryrefslogtreecommitdiff
path: root/arch/mips/mach-octeon/include/mach/cvmx-ilk.h
blob: 727298352c2830a87c963115321dd77b5f4fa41d (plain)
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
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2020 Marvell International Ltd.
 *
 * This file contains defines for the ILK interface
 */

#ifndef __CVMX_ILK_H__
#define __CVMX_ILK_H__

/* CSR typedefs have been moved to cvmx-ilk-defs.h */

/*
 * Note: this macro must match the first ilk port in the ipd_port_map_68xx[]
 * and ipd_port_map_78xx[] arrays.
 */
static inline int CVMX_ILK_GBL_BASE(void)
{
	if (OCTEON_IS_MODEL(OCTEON_CN68XX))
		return 5;
	if (OCTEON_IS_MODEL(OCTEON_CN78XX))
		return 6;
	return -1;
}

static inline int CVMX_ILK_QLM_BASE(void)
{
	if (OCTEON_IS_MODEL(OCTEON_CN68XX))
		return 1;
	if (OCTEON_IS_MODEL(OCTEON_CN78XX))
		return 4;
	return -1;
}

typedef struct {
	int intf_en : 1;
	int la_mode : 1;
	int reserved : 14; /* unused */
	int lane_speed : 16;
	/* add more here */
} cvmx_ilk_intf_t;

#define CVMX_NUM_ILK_INTF 2
static inline int CVMX_ILK_MAX_LANES(void)
{
	if (OCTEON_IS_MODEL(OCTEON_CN68XX))
		return 8;
	if (OCTEON_IS_MODEL(OCTEON_CN78XX))
		return 16;
	return -1;
}

extern unsigned short cvmx_ilk_lane_mask[CVMX_MAX_NODES][CVMX_NUM_ILK_INTF];

typedef struct {
	unsigned int pipe;
	unsigned int chan;
} cvmx_ilk_pipe_chan_t;

#define CVMX_ILK_MAX_PIPES 45
/* Max number of channels allowed */
#define CVMX_ILK_MAX_CHANS 256

extern int cvmx_ilk_chans[CVMX_MAX_NODES][CVMX_NUM_ILK_INTF];

typedef struct {
	unsigned int chan;
	unsigned int pknd;
} cvmx_ilk_chan_pknd_t;

#define CVMX_ILK_MAX_PKNDS 16 /* must be <45 */

typedef struct {
	int *chan_list; /* for discrete channels. or, must be null */
	unsigned int num_chans;

	unsigned int chan_start; /* for continuous channels */
	unsigned int chan_end;
	unsigned int chan_step;

	unsigned int clr_on_rd;
} cvmx_ilk_stats_ctrl_t;

#define CVMX_ILK_MAX_CAL      288
#define CVMX_ILK_MAX_CAL_IDX  (CVMX_ILK_MAX_CAL / 8)
#define CVMX_ILK_TX_MIN_CAL   1
#define CVMX_ILK_RX_MIN_CAL   1
#define CVMX_ILK_CAL_GRP_SZ   8
#define CVMX_ILK_PIPE_BPID_SZ 7
#define CVMX_ILK_ENT_CTRL_SZ  2
#define CVMX_ILK_RX_FIFO_WM   0x200

typedef enum { PIPE_BPID = 0, LINK, XOFF, XON } cvmx_ilk_cal_ent_ctrl_t;

typedef struct {
	unsigned char pipe_bpid;
	cvmx_ilk_cal_ent_ctrl_t ent_ctrl;
} cvmx_ilk_cal_entry_t;

typedef enum { CVMX_ILK_LPBK_DISA = 0, CVMX_ILK_LPBK_ENA } cvmx_ilk_lpbk_ena_t;

typedef enum { CVMX_ILK_LPBK_INT = 0, CVMX_ILK_LPBK_EXT } cvmx_ilk_lpbk_mode_t;

/**
 * This header is placed in front of all received ILK look-aside mode packets
 */
typedef union {
	u64 u64;

	struct {
		u32 reserved_63_57 : 7;	  /* bits 63...57 */
		u32 nsp_cmd : 5;	  /* bits 56...52 */
		u32 nsp_flags : 4;	  /* bits 51...48 */
		u32 nsp_grp_id_upper : 6; /* bits 47...42 */
		u32 reserved_41_40 : 2;	  /* bits 41...40 */
		/* Protocol type, 1 for LA mode packet */
		u32 la_mode : 1;	  /* bit  39      */
		u32 nsp_grp_id_lower : 2; /* bits 38...37 */
		u32 nsp_xid_upper : 4;	  /* bits 36...33 */
		/* ILK channel number, 0 or 1 */
		u32 ilk_channel : 1;   /* bit  32      */
		u32 nsp_xid_lower : 8; /* bits 31...24 */
		/* Unpredictable, may be any value */
		u32 reserved_23_0 : 24; /* bits 23...0  */
	} s;
} cvmx_ilk_la_nsp_compact_hdr_t;

typedef struct cvmx_ilk_LA_mode_struct {
	int ilk_LA_mode;
	int ilk_LA_mode_cal_ena;
} cvmx_ilk_LA_mode_t;

extern cvmx_ilk_LA_mode_t cvmx_ilk_LA_mode[CVMX_NUM_ILK_INTF];

int cvmx_ilk_use_la_mode(int interface, int channel);
int cvmx_ilk_start_interface(int interface, unsigned short num_lanes);
int cvmx_ilk_start_interface_la(int interface, unsigned char num_lanes);
int cvmx_ilk_set_pipe(int interface, int pipe_base, unsigned int pipe_len);
int cvmx_ilk_tx_set_channel(int interface, cvmx_ilk_pipe_chan_t *pch, unsigned int num_chs);
int cvmx_ilk_rx_set_pknd(int interface, cvmx_ilk_chan_pknd_t *chpknd, unsigned int num_pknd);
int cvmx_ilk_enable(int interface);
int cvmx_ilk_disable(int interface);
int cvmx_ilk_get_intf_ena(int interface);
int cvmx_ilk_get_chan_info(int interface, unsigned char **chans, unsigned char *num_chan);
cvmx_ilk_la_nsp_compact_hdr_t cvmx_ilk_enable_la_header(int ipd_port, int mode);
void cvmx_ilk_show_stats(int interface, cvmx_ilk_stats_ctrl_t *pstats);
int cvmx_ilk_cal_setup_rx(int interface, int cal_depth, cvmx_ilk_cal_entry_t *pent, int hi_wm,
			  unsigned char cal_ena);
int cvmx_ilk_cal_setup_tx(int interface, int cal_depth, cvmx_ilk_cal_entry_t *pent,
			  unsigned char cal_ena);
int cvmx_ilk_lpbk(int interface, cvmx_ilk_lpbk_ena_t enable, cvmx_ilk_lpbk_mode_t mode);
int cvmx_ilk_la_mode_enable_rx_calendar(int interface);

#endif /* __CVMX_ILK_H__ */