xref: /OK3568_Linux_fs/kernel/include/linux/switchtec.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Microsemi Switchtec PCIe Driver
4*4882a593Smuzhiyun  * Copyright (c) 2017, Microsemi Corporation
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _SWITCHTEC_H
8*4882a593Smuzhiyun #define _SWITCHTEC_H
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/pci.h>
11*4882a593Smuzhiyun #include <linux/cdev.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define SWITCHTEC_MRPC_PAYLOAD_SIZE 1024
14*4882a593Smuzhiyun #define SWITCHTEC_MAX_PFF_CSR 255
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define SWITCHTEC_EVENT_OCCURRED BIT(0)
17*4882a593Smuzhiyun #define SWITCHTEC_EVENT_CLEAR    BIT(0)
18*4882a593Smuzhiyun #define SWITCHTEC_EVENT_EN_LOG   BIT(1)
19*4882a593Smuzhiyun #define SWITCHTEC_EVENT_EN_CLI   BIT(2)
20*4882a593Smuzhiyun #define SWITCHTEC_EVENT_EN_IRQ   BIT(3)
21*4882a593Smuzhiyun #define SWITCHTEC_EVENT_FATAL    BIT(4)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define SWITCHTEC_DMA_MRPC_EN	BIT(0)
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define MRPC_GAS_READ		0x29
26*4882a593Smuzhiyun #define MRPC_GAS_WRITE		0x87
27*4882a593Smuzhiyun #define MRPC_CMD_ID(x)		((x) & 0xffff)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun enum {
30*4882a593Smuzhiyun 	SWITCHTEC_GAS_MRPC_OFFSET       = 0x0000,
31*4882a593Smuzhiyun 	SWITCHTEC_GAS_TOP_CFG_OFFSET    = 0x1000,
32*4882a593Smuzhiyun 	SWITCHTEC_GAS_SW_EVENT_OFFSET   = 0x1800,
33*4882a593Smuzhiyun 	SWITCHTEC_GAS_SYS_INFO_OFFSET   = 0x2000,
34*4882a593Smuzhiyun 	SWITCHTEC_GAS_FLASH_INFO_OFFSET = 0x2200,
35*4882a593Smuzhiyun 	SWITCHTEC_GAS_PART_CFG_OFFSET   = 0x4000,
36*4882a593Smuzhiyun 	SWITCHTEC_GAS_NTB_OFFSET        = 0x10000,
37*4882a593Smuzhiyun 	SWITCHTEC_GAS_PFF_CSR_OFFSET    = 0x134000,
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun enum switchtec_gen {
41*4882a593Smuzhiyun 	SWITCHTEC_GEN3,
42*4882a593Smuzhiyun 	SWITCHTEC_GEN4,
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun struct mrpc_regs {
46*4882a593Smuzhiyun 	u8 input_data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
47*4882a593Smuzhiyun 	u8 output_data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
48*4882a593Smuzhiyun 	u32 cmd;
49*4882a593Smuzhiyun 	u32 status;
50*4882a593Smuzhiyun 	u32 ret_value;
51*4882a593Smuzhiyun 	u32 dma_en;
52*4882a593Smuzhiyun 	u64 dma_addr;
53*4882a593Smuzhiyun 	u32 dma_vector;
54*4882a593Smuzhiyun 	u32 dma_ver;
55*4882a593Smuzhiyun } __packed;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun enum mrpc_status {
58*4882a593Smuzhiyun 	SWITCHTEC_MRPC_STATUS_INPROGRESS = 1,
59*4882a593Smuzhiyun 	SWITCHTEC_MRPC_STATUS_DONE = 2,
60*4882a593Smuzhiyun 	SWITCHTEC_MRPC_STATUS_ERROR = 0xFF,
61*4882a593Smuzhiyun 	SWITCHTEC_MRPC_STATUS_INTERRUPTED = 0x100,
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun struct sw_event_regs {
65*4882a593Smuzhiyun 	u64 event_report_ctrl;
66*4882a593Smuzhiyun 	u64 reserved1;
67*4882a593Smuzhiyun 	u64 part_event_bitmap;
68*4882a593Smuzhiyun 	u64 reserved2;
69*4882a593Smuzhiyun 	u32 global_summary;
70*4882a593Smuzhiyun 	u32 reserved3[3];
71*4882a593Smuzhiyun 	u32 stack_error_event_hdr;
72*4882a593Smuzhiyun 	u32 stack_error_event_data;
73*4882a593Smuzhiyun 	u32 reserved4[4];
74*4882a593Smuzhiyun 	u32 ppu_error_event_hdr;
75*4882a593Smuzhiyun 	u32 ppu_error_event_data;
76*4882a593Smuzhiyun 	u32 reserved5[4];
77*4882a593Smuzhiyun 	u32 isp_error_event_hdr;
78*4882a593Smuzhiyun 	u32 isp_error_event_data;
79*4882a593Smuzhiyun 	u32 reserved6[4];
80*4882a593Smuzhiyun 	u32 sys_reset_event_hdr;
81*4882a593Smuzhiyun 	u32 reserved7[5];
82*4882a593Smuzhiyun 	u32 fw_exception_hdr;
83*4882a593Smuzhiyun 	u32 reserved8[5];
84*4882a593Smuzhiyun 	u32 fw_nmi_hdr;
85*4882a593Smuzhiyun 	u32 reserved9[5];
86*4882a593Smuzhiyun 	u32 fw_non_fatal_hdr;
87*4882a593Smuzhiyun 	u32 reserved10[5];
88*4882a593Smuzhiyun 	u32 fw_fatal_hdr;
89*4882a593Smuzhiyun 	u32 reserved11[5];
90*4882a593Smuzhiyun 	u32 twi_mrpc_comp_hdr;
91*4882a593Smuzhiyun 	u32 twi_mrpc_comp_data;
92*4882a593Smuzhiyun 	u32 reserved12[4];
93*4882a593Smuzhiyun 	u32 twi_mrpc_comp_async_hdr;
94*4882a593Smuzhiyun 	u32 twi_mrpc_comp_async_data;
95*4882a593Smuzhiyun 	u32 reserved13[4];
96*4882a593Smuzhiyun 	u32 cli_mrpc_comp_hdr;
97*4882a593Smuzhiyun 	u32 cli_mrpc_comp_data;
98*4882a593Smuzhiyun 	u32 reserved14[4];
99*4882a593Smuzhiyun 	u32 cli_mrpc_comp_async_hdr;
100*4882a593Smuzhiyun 	u32 cli_mrpc_comp_async_data;
101*4882a593Smuzhiyun 	u32 reserved15[4];
102*4882a593Smuzhiyun 	u32 gpio_interrupt_hdr;
103*4882a593Smuzhiyun 	u32 gpio_interrupt_data;
104*4882a593Smuzhiyun 	u32 reserved16[4];
105*4882a593Smuzhiyun 	u32 gfms_event_hdr;
106*4882a593Smuzhiyun 	u32 gfms_event_data;
107*4882a593Smuzhiyun 	u32 reserved17[4];
108*4882a593Smuzhiyun } __packed;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun enum {
111*4882a593Smuzhiyun 	SWITCHTEC_GEN3_CFG0_RUNNING = 0x04,
112*4882a593Smuzhiyun 	SWITCHTEC_GEN3_CFG1_RUNNING = 0x05,
113*4882a593Smuzhiyun 	SWITCHTEC_GEN3_IMG0_RUNNING = 0x03,
114*4882a593Smuzhiyun 	SWITCHTEC_GEN3_IMG1_RUNNING = 0x07,
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun enum {
118*4882a593Smuzhiyun 	SWITCHTEC_GEN4_MAP0_RUNNING = 0x00,
119*4882a593Smuzhiyun 	SWITCHTEC_GEN4_MAP1_RUNNING = 0x01,
120*4882a593Smuzhiyun 	SWITCHTEC_GEN4_KEY0_RUNNING = 0x02,
121*4882a593Smuzhiyun 	SWITCHTEC_GEN4_KEY1_RUNNING = 0x03,
122*4882a593Smuzhiyun 	SWITCHTEC_GEN4_BL2_0_RUNNING = 0x04,
123*4882a593Smuzhiyun 	SWITCHTEC_GEN4_BL2_1_RUNNING = 0x05,
124*4882a593Smuzhiyun 	SWITCHTEC_GEN4_CFG0_RUNNING = 0x06,
125*4882a593Smuzhiyun 	SWITCHTEC_GEN4_CFG1_RUNNING = 0x07,
126*4882a593Smuzhiyun 	SWITCHTEC_GEN4_IMG0_RUNNING = 0x08,
127*4882a593Smuzhiyun 	SWITCHTEC_GEN4_IMG1_RUNNING = 0x09,
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun enum {
131*4882a593Smuzhiyun 	SWITCHTEC_GEN4_KEY0_ACTIVE = 0,
132*4882a593Smuzhiyun 	SWITCHTEC_GEN4_KEY1_ACTIVE = 1,
133*4882a593Smuzhiyun 	SWITCHTEC_GEN4_BL2_0_ACTIVE = 0,
134*4882a593Smuzhiyun 	SWITCHTEC_GEN4_BL2_1_ACTIVE = 1,
135*4882a593Smuzhiyun 	SWITCHTEC_GEN4_CFG0_ACTIVE = 0,
136*4882a593Smuzhiyun 	SWITCHTEC_GEN4_CFG1_ACTIVE = 1,
137*4882a593Smuzhiyun 	SWITCHTEC_GEN4_IMG0_ACTIVE = 0,
138*4882a593Smuzhiyun 	SWITCHTEC_GEN4_IMG1_ACTIVE = 1,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun struct sys_info_regs_gen3 {
142*4882a593Smuzhiyun 	u32 reserved1;
143*4882a593Smuzhiyun 	u32 vendor_table_revision;
144*4882a593Smuzhiyun 	u32 table_format_version;
145*4882a593Smuzhiyun 	u32 partition_id;
146*4882a593Smuzhiyun 	u32 cfg_file_fmt_version;
147*4882a593Smuzhiyun 	u16 cfg_running;
148*4882a593Smuzhiyun 	u16 img_running;
149*4882a593Smuzhiyun 	u32 reserved2[57];
150*4882a593Smuzhiyun 	char vendor_id[8];
151*4882a593Smuzhiyun 	char product_id[16];
152*4882a593Smuzhiyun 	char product_revision[4];
153*4882a593Smuzhiyun 	char component_vendor[8];
154*4882a593Smuzhiyun 	u16 component_id;
155*4882a593Smuzhiyun 	u8 component_revision;
156*4882a593Smuzhiyun } __packed;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun struct sys_info_regs_gen4 {
159*4882a593Smuzhiyun 	u16 gas_layout_ver;
160*4882a593Smuzhiyun 	u8 evlist_ver;
161*4882a593Smuzhiyun 	u8 reserved1;
162*4882a593Smuzhiyun 	u16 mgmt_cmd_set_ver;
163*4882a593Smuzhiyun 	u16 fabric_cmd_set_ver;
164*4882a593Smuzhiyun 	u32 reserved2[2];
165*4882a593Smuzhiyun 	u8 mrpc_uart_ver;
166*4882a593Smuzhiyun 	u8 mrpc_twi_ver;
167*4882a593Smuzhiyun 	u8 mrpc_eth_ver;
168*4882a593Smuzhiyun 	u8 mrpc_inband_ver;
169*4882a593Smuzhiyun 	u32 reserved3[7];
170*4882a593Smuzhiyun 	u32 fw_update_tmo;
171*4882a593Smuzhiyun 	u32 xml_version_cfg;
172*4882a593Smuzhiyun 	u32 xml_version_img;
173*4882a593Smuzhiyun 	u32 partition_id;
174*4882a593Smuzhiyun 	u16 bl2_running;
175*4882a593Smuzhiyun 	u16 cfg_running;
176*4882a593Smuzhiyun 	u16 img_running;
177*4882a593Smuzhiyun 	u16 key_running;
178*4882a593Smuzhiyun 	u32 reserved4[43];
179*4882a593Smuzhiyun 	u32 vendor_seeprom_twi;
180*4882a593Smuzhiyun 	u32 vendor_table_revision;
181*4882a593Smuzhiyun 	u32 vendor_specific_info[2];
182*4882a593Smuzhiyun 	u16 p2p_vendor_id;
183*4882a593Smuzhiyun 	u16 p2p_device_id;
184*4882a593Smuzhiyun 	u8 p2p_revision_id;
185*4882a593Smuzhiyun 	u8 reserved5[3];
186*4882a593Smuzhiyun 	u32 p2p_class_id;
187*4882a593Smuzhiyun 	u16 subsystem_vendor_id;
188*4882a593Smuzhiyun 	u16 subsystem_id;
189*4882a593Smuzhiyun 	u32 p2p_serial_number[2];
190*4882a593Smuzhiyun 	u8 mac_addr[6];
191*4882a593Smuzhiyun 	u8 reserved6[2];
192*4882a593Smuzhiyun 	u32 reserved7[3];
193*4882a593Smuzhiyun 	char vendor_id[8];
194*4882a593Smuzhiyun 	char product_id[24];
195*4882a593Smuzhiyun 	char  product_revision[2];
196*4882a593Smuzhiyun 	u16 reserved8;
197*4882a593Smuzhiyun } __packed;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun struct sys_info_regs {
200*4882a593Smuzhiyun 	u32 device_id;
201*4882a593Smuzhiyun 	u32 device_version;
202*4882a593Smuzhiyun 	u32 firmware_version;
203*4882a593Smuzhiyun 	union {
204*4882a593Smuzhiyun 		struct sys_info_regs_gen3 gen3;
205*4882a593Smuzhiyun 		struct sys_info_regs_gen4 gen4;
206*4882a593Smuzhiyun 	};
207*4882a593Smuzhiyun } __packed;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun struct partition_info {
210*4882a593Smuzhiyun 	u32 address;
211*4882a593Smuzhiyun 	u32 length;
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun struct flash_info_regs_gen3 {
215*4882a593Smuzhiyun 	u32 flash_part_map_upd_idx;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	struct active_partition_info_gen3 {
218*4882a593Smuzhiyun 		u32 address;
219*4882a593Smuzhiyun 		u32 build_version;
220*4882a593Smuzhiyun 		u32 build_string;
221*4882a593Smuzhiyun 	} active_img;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	struct active_partition_info_gen3 active_cfg;
224*4882a593Smuzhiyun 	struct active_partition_info_gen3 inactive_img;
225*4882a593Smuzhiyun 	struct active_partition_info_gen3 inactive_cfg;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	u32 flash_length;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 	struct partition_info cfg0;
230*4882a593Smuzhiyun 	struct partition_info cfg1;
231*4882a593Smuzhiyun 	struct partition_info img0;
232*4882a593Smuzhiyun 	struct partition_info img1;
233*4882a593Smuzhiyun 	struct partition_info nvlog;
234*4882a593Smuzhiyun 	struct partition_info vendor[8];
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun struct flash_info_regs_gen4 {
238*4882a593Smuzhiyun 	u32 flash_address;
239*4882a593Smuzhiyun 	u32 flash_length;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	struct active_partition_info_gen4 {
242*4882a593Smuzhiyun 		unsigned char bl2;
243*4882a593Smuzhiyun 		unsigned char cfg;
244*4882a593Smuzhiyun 		unsigned char img;
245*4882a593Smuzhiyun 		unsigned char key;
246*4882a593Smuzhiyun 	} active_flag;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	u32 reserved[3];
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	struct partition_info map0;
251*4882a593Smuzhiyun 	struct partition_info map1;
252*4882a593Smuzhiyun 	struct partition_info key0;
253*4882a593Smuzhiyun 	struct partition_info key1;
254*4882a593Smuzhiyun 	struct partition_info bl2_0;
255*4882a593Smuzhiyun 	struct partition_info bl2_1;
256*4882a593Smuzhiyun 	struct partition_info cfg0;
257*4882a593Smuzhiyun 	struct partition_info cfg1;
258*4882a593Smuzhiyun 	struct partition_info img0;
259*4882a593Smuzhiyun 	struct partition_info img1;
260*4882a593Smuzhiyun 	struct partition_info nvlog;
261*4882a593Smuzhiyun 	struct partition_info vendor[8];
262*4882a593Smuzhiyun };
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun struct flash_info_regs {
265*4882a593Smuzhiyun 	union {
266*4882a593Smuzhiyun 		struct flash_info_regs_gen3 gen3;
267*4882a593Smuzhiyun 		struct flash_info_regs_gen4 gen4;
268*4882a593Smuzhiyun 	};
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun enum {
272*4882a593Smuzhiyun 	SWITCHTEC_NTB_REG_INFO_OFFSET   = 0x0000,
273*4882a593Smuzhiyun 	SWITCHTEC_NTB_REG_CTRL_OFFSET   = 0x4000,
274*4882a593Smuzhiyun 	SWITCHTEC_NTB_REG_DBMSG_OFFSET  = 0x64000,
275*4882a593Smuzhiyun };
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun struct ntb_info_regs {
278*4882a593Smuzhiyun 	u8  partition_count;
279*4882a593Smuzhiyun 	u8  partition_id;
280*4882a593Smuzhiyun 	u16 reserved1;
281*4882a593Smuzhiyun 	u64 ep_map;
282*4882a593Smuzhiyun 	u16 requester_id;
283*4882a593Smuzhiyun 	u16 reserved2;
284*4882a593Smuzhiyun 	u32 reserved3[4];
285*4882a593Smuzhiyun 	struct nt_partition_info {
286*4882a593Smuzhiyun 		u32 xlink_enabled;
287*4882a593Smuzhiyun 		u32 target_part_low;
288*4882a593Smuzhiyun 		u32 target_part_high;
289*4882a593Smuzhiyun 		u32 reserved;
290*4882a593Smuzhiyun 	} ntp_info[48];
291*4882a593Smuzhiyun } __packed;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun struct part_cfg_regs {
294*4882a593Smuzhiyun 	u32 status;
295*4882a593Smuzhiyun 	u32 state;
296*4882a593Smuzhiyun 	u32 port_cnt;
297*4882a593Smuzhiyun 	u32 usp_port_mode;
298*4882a593Smuzhiyun 	u32 usp_pff_inst_id;
299*4882a593Smuzhiyun 	u32 vep_pff_inst_id;
300*4882a593Smuzhiyun 	u32 dsp_pff_inst_id[47];
301*4882a593Smuzhiyun 	u32 reserved1[11];
302*4882a593Smuzhiyun 	u16 vep_vector_number;
303*4882a593Smuzhiyun 	u16 usp_vector_number;
304*4882a593Smuzhiyun 	u32 port_event_bitmap;
305*4882a593Smuzhiyun 	u32 reserved2[3];
306*4882a593Smuzhiyun 	u32 part_event_summary;
307*4882a593Smuzhiyun 	u32 reserved3[3];
308*4882a593Smuzhiyun 	u32 part_reset_hdr;
309*4882a593Smuzhiyun 	u32 part_reset_data[5];
310*4882a593Smuzhiyun 	u32 mrpc_comp_hdr;
311*4882a593Smuzhiyun 	u32 mrpc_comp_data[5];
312*4882a593Smuzhiyun 	u32 mrpc_comp_async_hdr;
313*4882a593Smuzhiyun 	u32 mrpc_comp_async_data[5];
314*4882a593Smuzhiyun 	u32 dyn_binding_hdr;
315*4882a593Smuzhiyun 	u32 dyn_binding_data[5];
316*4882a593Smuzhiyun 	u32 intercomm_notify_hdr;
317*4882a593Smuzhiyun 	u32 intercomm_notify_data[5];
318*4882a593Smuzhiyun 	u32 reserved4[153];
319*4882a593Smuzhiyun } __packed;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun enum {
322*4882a593Smuzhiyun 	NTB_CTRL_PART_OP_LOCK = 0x1,
323*4882a593Smuzhiyun 	NTB_CTRL_PART_OP_CFG = 0x2,
324*4882a593Smuzhiyun 	NTB_CTRL_PART_OP_RESET = 0x3,
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun 	NTB_CTRL_PART_STATUS_NORMAL = 0x1,
327*4882a593Smuzhiyun 	NTB_CTRL_PART_STATUS_LOCKED = 0x2,
328*4882a593Smuzhiyun 	NTB_CTRL_PART_STATUS_LOCKING = 0x3,
329*4882a593Smuzhiyun 	NTB_CTRL_PART_STATUS_CONFIGURING = 0x4,
330*4882a593Smuzhiyun 	NTB_CTRL_PART_STATUS_RESETTING = 0x5,
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	NTB_CTRL_BAR_VALID = 1 << 0,
333*4882a593Smuzhiyun 	NTB_CTRL_BAR_DIR_WIN_EN = 1 << 4,
334*4882a593Smuzhiyun 	NTB_CTRL_BAR_LUT_WIN_EN = 1 << 5,
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	NTB_CTRL_REQ_ID_EN = 1 << 0,
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	NTB_CTRL_LUT_EN = 1 << 0,
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	NTB_PART_CTRL_ID_PROT_DIS = 1 << 0,
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun struct ntb_ctrl_regs {
344*4882a593Smuzhiyun 	u32 partition_status;
345*4882a593Smuzhiyun 	u32 partition_op;
346*4882a593Smuzhiyun 	u32 partition_ctrl;
347*4882a593Smuzhiyun 	u32 bar_setup;
348*4882a593Smuzhiyun 	u32 bar_error;
349*4882a593Smuzhiyun 	u16 lut_table_entries;
350*4882a593Smuzhiyun 	u16 lut_table_offset;
351*4882a593Smuzhiyun 	u32 lut_error;
352*4882a593Smuzhiyun 	u16 req_id_table_size;
353*4882a593Smuzhiyun 	u16 req_id_table_offset;
354*4882a593Smuzhiyun 	u32 req_id_error;
355*4882a593Smuzhiyun 	u32 reserved1[7];
356*4882a593Smuzhiyun 	struct {
357*4882a593Smuzhiyun 		u32 ctl;
358*4882a593Smuzhiyun 		u32 win_size;
359*4882a593Smuzhiyun 		u64 xlate_addr;
360*4882a593Smuzhiyun 	} bar_entry[6];
361*4882a593Smuzhiyun 	struct {
362*4882a593Smuzhiyun 		u32 win_size;
363*4882a593Smuzhiyun 		u32 reserved[3];
364*4882a593Smuzhiyun 	} bar_ext_entry[6];
365*4882a593Smuzhiyun 	u32 reserved2[192];
366*4882a593Smuzhiyun 	u32 req_id_table[512];
367*4882a593Smuzhiyun 	u32 reserved3[256];
368*4882a593Smuzhiyun 	u64 lut_entry[512];
369*4882a593Smuzhiyun } __packed;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #define NTB_DBMSG_IMSG_STATUS BIT_ULL(32)
372*4882a593Smuzhiyun #define NTB_DBMSG_IMSG_MASK   BIT_ULL(40)
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun struct ntb_dbmsg_regs {
375*4882a593Smuzhiyun 	u32 reserved1[1024];
376*4882a593Smuzhiyun 	u64 odb;
377*4882a593Smuzhiyun 	u64 odb_mask;
378*4882a593Smuzhiyun 	u64 idb;
379*4882a593Smuzhiyun 	u64 idb_mask;
380*4882a593Smuzhiyun 	u8  idb_vec_map[64];
381*4882a593Smuzhiyun 	u32 msg_map;
382*4882a593Smuzhiyun 	u32 reserved2;
383*4882a593Smuzhiyun 	struct {
384*4882a593Smuzhiyun 		u32 msg;
385*4882a593Smuzhiyun 		u32 status;
386*4882a593Smuzhiyun 	} omsg[4];
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	struct {
389*4882a593Smuzhiyun 		u32 msg;
390*4882a593Smuzhiyun 		u8  status;
391*4882a593Smuzhiyun 		u8  mask;
392*4882a593Smuzhiyun 		u8  src;
393*4882a593Smuzhiyun 		u8  reserved;
394*4882a593Smuzhiyun 	} imsg[4];
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	u8 reserved3[3928];
397*4882a593Smuzhiyun 	u8 msix_table[1024];
398*4882a593Smuzhiyun 	u8 reserved4[3072];
399*4882a593Smuzhiyun 	u8 pba[24];
400*4882a593Smuzhiyun 	u8 reserved5[4072];
401*4882a593Smuzhiyun } __packed;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun enum {
404*4882a593Smuzhiyun 	SWITCHTEC_PART_CFG_EVENT_RESET = 1 << 0,
405*4882a593Smuzhiyun 	SWITCHTEC_PART_CFG_EVENT_MRPC_CMP = 1 << 1,
406*4882a593Smuzhiyun 	SWITCHTEC_PART_CFG_EVENT_MRPC_ASYNC_CMP = 1 << 2,
407*4882a593Smuzhiyun 	SWITCHTEC_PART_CFG_EVENT_DYN_PART_CMP = 1 << 3,
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun struct pff_csr_regs {
411*4882a593Smuzhiyun 	u16 vendor_id;
412*4882a593Smuzhiyun 	u16 device_id;
413*4882a593Smuzhiyun 	u16 pcicmd;
414*4882a593Smuzhiyun 	u16 pcists;
415*4882a593Smuzhiyun 	u32 pci_class;
416*4882a593Smuzhiyun 	u32 pci_opts;
417*4882a593Smuzhiyun 	union {
418*4882a593Smuzhiyun 		u32 pci_bar[6];
419*4882a593Smuzhiyun 		u64 pci_bar64[3];
420*4882a593Smuzhiyun 	};
421*4882a593Smuzhiyun 	u32 pci_cardbus;
422*4882a593Smuzhiyun 	u32 pci_subsystem_id;
423*4882a593Smuzhiyun 	u32 pci_expansion_rom;
424*4882a593Smuzhiyun 	u32 pci_cap_ptr;
425*4882a593Smuzhiyun 	u32 reserved1;
426*4882a593Smuzhiyun 	u32 pci_irq;
427*4882a593Smuzhiyun 	u32 pci_cap_region[48];
428*4882a593Smuzhiyun 	u32 pcie_cap_region[448];
429*4882a593Smuzhiyun 	u32 indirect_gas_window[128];
430*4882a593Smuzhiyun 	u32 indirect_gas_window_off;
431*4882a593Smuzhiyun 	u32 reserved[127];
432*4882a593Smuzhiyun 	u32 pff_event_summary;
433*4882a593Smuzhiyun 	u32 reserved2[3];
434*4882a593Smuzhiyun 	u32 aer_in_p2p_hdr;
435*4882a593Smuzhiyun 	u32 aer_in_p2p_data[5];
436*4882a593Smuzhiyun 	u32 aer_in_vep_hdr;
437*4882a593Smuzhiyun 	u32 aer_in_vep_data[5];
438*4882a593Smuzhiyun 	u32 dpc_hdr;
439*4882a593Smuzhiyun 	u32 dpc_data[5];
440*4882a593Smuzhiyun 	u32 cts_hdr;
441*4882a593Smuzhiyun 	u32 cts_data[5];
442*4882a593Smuzhiyun 	u32 uec_hdr;
443*4882a593Smuzhiyun 	u32 uec_data[5];
444*4882a593Smuzhiyun 	u32 hotplug_hdr;
445*4882a593Smuzhiyun 	u32 hotplug_data[5];
446*4882a593Smuzhiyun 	u32 ier_hdr;
447*4882a593Smuzhiyun 	u32 ier_data[5];
448*4882a593Smuzhiyun 	u32 threshold_hdr;
449*4882a593Smuzhiyun 	u32 threshold_data[5];
450*4882a593Smuzhiyun 	u32 power_mgmt_hdr;
451*4882a593Smuzhiyun 	u32 power_mgmt_data[5];
452*4882a593Smuzhiyun 	u32 tlp_throttling_hdr;
453*4882a593Smuzhiyun 	u32 tlp_throttling_data[5];
454*4882a593Smuzhiyun 	u32 force_speed_hdr;
455*4882a593Smuzhiyun 	u32 force_speed_data[5];
456*4882a593Smuzhiyun 	u32 credit_timeout_hdr;
457*4882a593Smuzhiyun 	u32 credit_timeout_data[5];
458*4882a593Smuzhiyun 	u32 link_state_hdr;
459*4882a593Smuzhiyun 	u32 link_state_data[5];
460*4882a593Smuzhiyun 	u32 reserved4[174];
461*4882a593Smuzhiyun } __packed;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun struct switchtec_ntb;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun struct dma_mrpc_output {
466*4882a593Smuzhiyun 	u32 status;
467*4882a593Smuzhiyun 	u32 cmd_id;
468*4882a593Smuzhiyun 	u32 rtn_code;
469*4882a593Smuzhiyun 	u32 output_size;
470*4882a593Smuzhiyun 	u8 data[SWITCHTEC_MRPC_PAYLOAD_SIZE];
471*4882a593Smuzhiyun };
472*4882a593Smuzhiyun 
473*4882a593Smuzhiyun struct switchtec_dev {
474*4882a593Smuzhiyun 	struct pci_dev *pdev;
475*4882a593Smuzhiyun 	struct device dev;
476*4882a593Smuzhiyun 	struct cdev cdev;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	enum switchtec_gen gen;
479*4882a593Smuzhiyun 
480*4882a593Smuzhiyun 	int partition;
481*4882a593Smuzhiyun 	int partition_count;
482*4882a593Smuzhiyun 	int pff_csr_count;
483*4882a593Smuzhiyun 	char pff_local[SWITCHTEC_MAX_PFF_CSR];
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	void __iomem *mmio;
486*4882a593Smuzhiyun 	struct mrpc_regs __iomem *mmio_mrpc;
487*4882a593Smuzhiyun 	struct sw_event_regs __iomem *mmio_sw_event;
488*4882a593Smuzhiyun 	struct sys_info_regs __iomem *mmio_sys_info;
489*4882a593Smuzhiyun 	struct flash_info_regs __iomem *mmio_flash_info;
490*4882a593Smuzhiyun 	struct ntb_info_regs __iomem *mmio_ntb;
491*4882a593Smuzhiyun 	struct part_cfg_regs __iomem *mmio_part_cfg;
492*4882a593Smuzhiyun 	struct part_cfg_regs __iomem *mmio_part_cfg_all;
493*4882a593Smuzhiyun 	struct pff_csr_regs __iomem *mmio_pff_csr;
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	/*
496*4882a593Smuzhiyun 	 * The mrpc mutex must be held when accessing the other
497*4882a593Smuzhiyun 	 * mrpc_ fields, alive flag and stuser->state field
498*4882a593Smuzhiyun 	 */
499*4882a593Smuzhiyun 	struct mutex mrpc_mutex;
500*4882a593Smuzhiyun 	struct list_head mrpc_queue;
501*4882a593Smuzhiyun 	int mrpc_busy;
502*4882a593Smuzhiyun 	struct work_struct mrpc_work;
503*4882a593Smuzhiyun 	struct delayed_work mrpc_timeout;
504*4882a593Smuzhiyun 	bool alive;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	wait_queue_head_t event_wq;
507*4882a593Smuzhiyun 	atomic_t event_cnt;
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	struct work_struct link_event_work;
510*4882a593Smuzhiyun 	void (*link_notifier)(struct switchtec_dev *stdev);
511*4882a593Smuzhiyun 	u8 link_event_count[SWITCHTEC_MAX_PFF_CSR];
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	struct switchtec_ntb *sndev;
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	struct dma_mrpc_output *dma_mrpc;
516*4882a593Smuzhiyun 	dma_addr_t dma_mrpc_dma_addr;
517*4882a593Smuzhiyun };
518*4882a593Smuzhiyun 
to_stdev(struct device * dev)519*4882a593Smuzhiyun static inline struct switchtec_dev *to_stdev(struct device *dev)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun 	return container_of(dev, struct switchtec_dev, dev);
522*4882a593Smuzhiyun }
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun extern struct class *switchtec_class;
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun #endif
527