xref: /OK3568_Linux_fs/kernel/drivers/scsi/hisi_sas/hisi_sas.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2015 Linaro Ltd.
4*4882a593Smuzhiyun  * Copyright (c) 2015 Hisilicon Limited.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _HISI_SAS_H_
8*4882a593Smuzhiyun #define _HISI_SAS_H_
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/acpi.h>
11*4882a593Smuzhiyun #include <linux/blk-mq.h>
12*4882a593Smuzhiyun #include <linux/blk-mq-pci.h>
13*4882a593Smuzhiyun #include <linux/clk.h>
14*4882a593Smuzhiyun #include <linux/debugfs.h>
15*4882a593Smuzhiyun #include <linux/dmapool.h>
16*4882a593Smuzhiyun #include <linux/iopoll.h>
17*4882a593Smuzhiyun #include <linux/lcm.h>
18*4882a593Smuzhiyun #include <linux/libata.h>
19*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
20*4882a593Smuzhiyun #include <linux/module.h>
21*4882a593Smuzhiyun #include <linux/of_address.h>
22*4882a593Smuzhiyun #include <linux/pci.h>
23*4882a593Smuzhiyun #include <linux/platform_device.h>
24*4882a593Smuzhiyun #include <linux/pm_runtime.h>
25*4882a593Smuzhiyun #include <linux/property.h>
26*4882a593Smuzhiyun #include <linux/regmap.h>
27*4882a593Smuzhiyun #include <linux/timer.h>
28*4882a593Smuzhiyun #include <scsi/sas_ata.h>
29*4882a593Smuzhiyun #include <scsi/libsas.h>
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define HISI_SAS_MAX_PHYS	9
32*4882a593Smuzhiyun #define HISI_SAS_MAX_QUEUES	32
33*4882a593Smuzhiyun #define HISI_SAS_QUEUE_SLOTS	4096
34*4882a593Smuzhiyun #define HISI_SAS_MAX_ITCT_ENTRIES 1024
35*4882a593Smuzhiyun #define HISI_SAS_MAX_DEVICES HISI_SAS_MAX_ITCT_ENTRIES
36*4882a593Smuzhiyun #define HISI_SAS_RESET_BIT	0
37*4882a593Smuzhiyun #define HISI_SAS_REJECT_CMD_BIT	1
38*4882a593Smuzhiyun #define HISI_SAS_PM_BIT		2
39*4882a593Smuzhiyun #define HISI_SAS_MAX_COMMANDS (HISI_SAS_QUEUE_SLOTS)
40*4882a593Smuzhiyun #define HISI_SAS_RESERVED_IPTT  96
41*4882a593Smuzhiyun #define HISI_SAS_UNRESERVED_IPTT \
42*4882a593Smuzhiyun 	(HISI_SAS_MAX_COMMANDS - HISI_SAS_RESERVED_IPTT)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define HISI_SAS_IOST_ITCT_CACHE_NUM 64
45*4882a593Smuzhiyun #define HISI_SAS_IOST_ITCT_CACHE_DW_SZ 10
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define HISI_SAS_STATUS_BUF_SZ (sizeof(struct hisi_sas_status_buffer))
48*4882a593Smuzhiyun #define HISI_SAS_COMMAND_TABLE_SZ (sizeof(union hisi_sas_command_table))
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define hisi_sas_status_buf_addr(buf) \
51*4882a593Smuzhiyun 	((buf) + offsetof(struct hisi_sas_slot_buf_table, status_buffer))
52*4882a593Smuzhiyun #define hisi_sas_status_buf_addr_mem(slot) hisi_sas_status_buf_addr((slot)->buf)
53*4882a593Smuzhiyun #define hisi_sas_status_buf_addr_dma(slot) \
54*4882a593Smuzhiyun 	hisi_sas_status_buf_addr((slot)->buf_dma)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define hisi_sas_cmd_hdr_addr(buf) \
57*4882a593Smuzhiyun 	((buf) + offsetof(struct hisi_sas_slot_buf_table, command_header))
58*4882a593Smuzhiyun #define hisi_sas_cmd_hdr_addr_mem(slot) hisi_sas_cmd_hdr_addr((slot)->buf)
59*4882a593Smuzhiyun #define hisi_sas_cmd_hdr_addr_dma(slot) hisi_sas_cmd_hdr_addr((slot)->buf_dma)
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define hisi_sas_sge_addr(buf) \
62*4882a593Smuzhiyun 	((buf) + offsetof(struct hisi_sas_slot_buf_table, sge_page))
63*4882a593Smuzhiyun #define hisi_sas_sge_addr_mem(slot) hisi_sas_sge_addr((slot)->buf)
64*4882a593Smuzhiyun #define hisi_sas_sge_addr_dma(slot) hisi_sas_sge_addr((slot)->buf_dma)
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define hisi_sas_sge_dif_addr(buf) \
67*4882a593Smuzhiyun 	((buf) + offsetof(struct hisi_sas_slot_dif_buf_table, sge_dif_page))
68*4882a593Smuzhiyun #define hisi_sas_sge_dif_addr_mem(slot) hisi_sas_sge_dif_addr((slot)->buf)
69*4882a593Smuzhiyun #define hisi_sas_sge_dif_addr_dma(slot) hisi_sas_sge_dif_addr((slot)->buf_dma)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define HISI_SAS_MAX_SSP_RESP_SZ (sizeof(struct ssp_frame_hdr) + 1024)
72*4882a593Smuzhiyun #define HISI_SAS_MAX_SMP_RESP_SZ 1028
73*4882a593Smuzhiyun #define HISI_SAS_MAX_STP_RESP_SZ 28
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define HISI_SAS_SATA_PROTOCOL_NONDATA		0x1
76*4882a593Smuzhiyun #define HISI_SAS_SATA_PROTOCOL_PIO			0x2
77*4882a593Smuzhiyun #define HISI_SAS_SATA_PROTOCOL_DMA			0x4
78*4882a593Smuzhiyun #define HISI_SAS_SATA_PROTOCOL_FPDMA		0x8
79*4882a593Smuzhiyun #define HISI_SAS_SATA_PROTOCOL_ATAPI		0x10
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define HISI_SAS_DIF_PROT_MASK (SHOST_DIF_TYPE1_PROTECTION | \
82*4882a593Smuzhiyun 				SHOST_DIF_TYPE2_PROTECTION | \
83*4882a593Smuzhiyun 				SHOST_DIF_TYPE3_PROTECTION)
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define HISI_SAS_DIX_PROT_MASK (SHOST_DIX_TYPE1_PROTECTION | \
86*4882a593Smuzhiyun 				SHOST_DIX_TYPE2_PROTECTION | \
87*4882a593Smuzhiyun 				SHOST_DIX_TYPE3_PROTECTION)
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #define HISI_SAS_PROT_MASK (HISI_SAS_DIF_PROT_MASK | HISI_SAS_DIX_PROT_MASK)
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define HISI_SAS_WAIT_PHYUP_TIMEOUT 20
92*4882a593Smuzhiyun #define CLEAR_ITCT_TIMEOUT	20
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun struct hisi_hba;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun enum {
97*4882a593Smuzhiyun 	PORT_TYPE_SAS = (1U << 1),
98*4882a593Smuzhiyun 	PORT_TYPE_SATA = (1U << 0),
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun enum dev_status {
102*4882a593Smuzhiyun 	HISI_SAS_DEV_INIT,
103*4882a593Smuzhiyun 	HISI_SAS_DEV_NORMAL,
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun enum {
107*4882a593Smuzhiyun 	HISI_SAS_INT_ABT_CMD = 0,
108*4882a593Smuzhiyun 	HISI_SAS_INT_ABT_DEV = 1,
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun enum hisi_sas_dev_type {
112*4882a593Smuzhiyun 	HISI_SAS_DEV_TYPE_STP = 0,
113*4882a593Smuzhiyun 	HISI_SAS_DEV_TYPE_SSP,
114*4882a593Smuzhiyun 	HISI_SAS_DEV_TYPE_SATA,
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct hisi_sas_hw_error {
118*4882a593Smuzhiyun 	u32 irq_msk;
119*4882a593Smuzhiyun 	u32 msk;
120*4882a593Smuzhiyun 	int shift;
121*4882a593Smuzhiyun 	const char *msg;
122*4882a593Smuzhiyun 	int reg;
123*4882a593Smuzhiyun 	const struct hisi_sas_hw_error *sub;
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct hisi_sas_rst {
127*4882a593Smuzhiyun 	struct hisi_hba *hisi_hba;
128*4882a593Smuzhiyun 	struct completion *completion;
129*4882a593Smuzhiyun 	struct work_struct work;
130*4882a593Smuzhiyun 	bool done;
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define HISI_SAS_RST_WORK_INIT(r, c) \
134*4882a593Smuzhiyun 	{	.hisi_hba = hisi_hba, \
135*4882a593Smuzhiyun 		.completion = &c, \
136*4882a593Smuzhiyun 		.work = __WORK_INITIALIZER(r.work, \
137*4882a593Smuzhiyun 				hisi_sas_sync_rst_work_handler), \
138*4882a593Smuzhiyun 		.done = false, \
139*4882a593Smuzhiyun 		}
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define HISI_SAS_DECLARE_RST_WORK_ON_STACK(r) \
142*4882a593Smuzhiyun 	DECLARE_COMPLETION_ONSTACK(c); \
143*4882a593Smuzhiyun 	struct hisi_sas_rst r = HISI_SAS_RST_WORK_INIT(r, c)
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun enum hisi_sas_bit_err_type {
146*4882a593Smuzhiyun 	HISI_SAS_ERR_SINGLE_BIT_ECC = 0x0,
147*4882a593Smuzhiyun 	HISI_SAS_ERR_MULTI_BIT_ECC = 0x1,
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun enum hisi_sas_phy_event {
151*4882a593Smuzhiyun 	HISI_PHYE_PHY_UP   = 0U,
152*4882a593Smuzhiyun 	HISI_PHYE_LINK_RESET,
153*4882a593Smuzhiyun 	HISI_PHYES_NUM,
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun struct hisi_sas_phy {
157*4882a593Smuzhiyun 	struct work_struct	works[HISI_PHYES_NUM];
158*4882a593Smuzhiyun 	struct hisi_hba	*hisi_hba;
159*4882a593Smuzhiyun 	struct hisi_sas_port	*port;
160*4882a593Smuzhiyun 	struct asd_sas_phy	sas_phy;
161*4882a593Smuzhiyun 	struct sas_identify	identify;
162*4882a593Smuzhiyun 	struct completion *reset_completion;
163*4882a593Smuzhiyun 	struct timer_list timer;
164*4882a593Smuzhiyun 	spinlock_t lock;
165*4882a593Smuzhiyun 	u64		port_id; /* from hw */
166*4882a593Smuzhiyun 	u64		frame_rcvd_size;
167*4882a593Smuzhiyun 	u8		frame_rcvd[32];
168*4882a593Smuzhiyun 	u8		phy_attached;
169*4882a593Smuzhiyun 	u8		in_reset;
170*4882a593Smuzhiyun 	u8		reserved[2];
171*4882a593Smuzhiyun 	u32		phy_type;
172*4882a593Smuzhiyun 	u32		code_violation_err_count;
173*4882a593Smuzhiyun 	enum sas_linkrate	minimum_linkrate;
174*4882a593Smuzhiyun 	enum sas_linkrate	maximum_linkrate;
175*4882a593Smuzhiyun 	int enable;
176*4882a593Smuzhiyun 	atomic_t down_cnt;
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun struct hisi_sas_port {
180*4882a593Smuzhiyun 	struct asd_sas_port	sas_port;
181*4882a593Smuzhiyun 	u8	port_attached;
182*4882a593Smuzhiyun 	u8	id; /* from hw */
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun struct hisi_sas_cq {
186*4882a593Smuzhiyun 	struct hisi_hba *hisi_hba;
187*4882a593Smuzhiyun 	const struct cpumask *irq_mask;
188*4882a593Smuzhiyun 	int	rd_point;
189*4882a593Smuzhiyun 	int	id;
190*4882a593Smuzhiyun 	int	irq_no;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun struct hisi_sas_dq {
194*4882a593Smuzhiyun 	struct hisi_hba *hisi_hba;
195*4882a593Smuzhiyun 	struct list_head list;
196*4882a593Smuzhiyun 	spinlock_t lock;
197*4882a593Smuzhiyun 	int	wr_point;
198*4882a593Smuzhiyun 	int	id;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun struct hisi_sas_device {
202*4882a593Smuzhiyun 	struct hisi_hba		*hisi_hba;
203*4882a593Smuzhiyun 	struct domain_device	*sas_device;
204*4882a593Smuzhiyun 	struct completion *completion;
205*4882a593Smuzhiyun 	struct hisi_sas_dq	*dq;
206*4882a593Smuzhiyun 	struct list_head	list;
207*4882a593Smuzhiyun 	enum sas_device_type	dev_type;
208*4882a593Smuzhiyun 	enum dev_status dev_status;
209*4882a593Smuzhiyun 	int device_id;
210*4882a593Smuzhiyun 	int sata_idx;
211*4882a593Smuzhiyun 	spinlock_t lock; /* For protecting slots */
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun struct hisi_sas_tmf_task {
215*4882a593Smuzhiyun 	int force_phy;
216*4882a593Smuzhiyun 	int phy_id;
217*4882a593Smuzhiyun 	u8 tmf;
218*4882a593Smuzhiyun 	u16 tag_of_task_to_be_managed;
219*4882a593Smuzhiyun };
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun struct hisi_sas_slot {
222*4882a593Smuzhiyun 	struct list_head entry;
223*4882a593Smuzhiyun 	struct list_head delivery;
224*4882a593Smuzhiyun 	struct sas_task *task;
225*4882a593Smuzhiyun 	struct hisi_sas_port	*port;
226*4882a593Smuzhiyun 	u64	n_elem;
227*4882a593Smuzhiyun 	u64	n_elem_dif;
228*4882a593Smuzhiyun 	int	dlvry_queue;
229*4882a593Smuzhiyun 	int	dlvry_queue_slot;
230*4882a593Smuzhiyun 	int	cmplt_queue;
231*4882a593Smuzhiyun 	int	cmplt_queue_slot;
232*4882a593Smuzhiyun 	int	abort;
233*4882a593Smuzhiyun 	int	ready;
234*4882a593Smuzhiyun 	int	device_id;
235*4882a593Smuzhiyun 	void	*cmd_hdr;
236*4882a593Smuzhiyun 	dma_addr_t cmd_hdr_dma;
237*4882a593Smuzhiyun 	struct timer_list internal_abort_timer;
238*4882a593Smuzhiyun 	bool is_internal;
239*4882a593Smuzhiyun 	struct hisi_sas_tmf_task *tmf;
240*4882a593Smuzhiyun 	/* Do not reorder/change members after here */
241*4882a593Smuzhiyun 	void	*buf;
242*4882a593Smuzhiyun 	dma_addr_t buf_dma;
243*4882a593Smuzhiyun 	u16	idx;
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #define HISI_SAS_DEBUGFS_REG(x) {#x, x}
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun struct hisi_sas_debugfs_reg_lu {
249*4882a593Smuzhiyun 	char *name;
250*4882a593Smuzhiyun 	int off;
251*4882a593Smuzhiyun };
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun struct hisi_sas_debugfs_reg {
254*4882a593Smuzhiyun 	const struct hisi_sas_debugfs_reg_lu *lu;
255*4882a593Smuzhiyun 	int count;
256*4882a593Smuzhiyun 	int base_off;
257*4882a593Smuzhiyun 	union {
258*4882a593Smuzhiyun 		u32 (*read_global_reg)(struct hisi_hba *hisi_hba, u32 off);
259*4882a593Smuzhiyun 		u32 (*read_port_reg)(struct hisi_hba *hisi_hba, int port,
260*4882a593Smuzhiyun 				     u32 off);
261*4882a593Smuzhiyun 	};
262*4882a593Smuzhiyun };
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun struct hisi_sas_iost_itct_cache {
265*4882a593Smuzhiyun 	u32 data[HISI_SAS_IOST_ITCT_CACHE_DW_SZ];
266*4882a593Smuzhiyun };
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun enum hisi_sas_debugfs_reg_array_member {
269*4882a593Smuzhiyun 	DEBUGFS_GLOBAL = 0,
270*4882a593Smuzhiyun 	DEBUGFS_AXI,
271*4882a593Smuzhiyun 	DEBUGFS_RAS,
272*4882a593Smuzhiyun 	DEBUGFS_REGS_NUM
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun enum hisi_sas_debugfs_cache_type {
276*4882a593Smuzhiyun 	HISI_SAS_ITCT_CACHE,
277*4882a593Smuzhiyun 	HISI_SAS_IOST_CACHE,
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun enum hisi_sas_debugfs_bist_ffe_cfg {
281*4882a593Smuzhiyun 	FFE_SAS_1_5_GBPS,
282*4882a593Smuzhiyun 	FFE_SAS_3_0_GBPS,
283*4882a593Smuzhiyun 	FFE_SAS_6_0_GBPS,
284*4882a593Smuzhiyun 	FFE_SAS_12_0_GBPS,
285*4882a593Smuzhiyun 	FFE_RESV,
286*4882a593Smuzhiyun 	FFE_SATA_1_5_GBPS,
287*4882a593Smuzhiyun 	FFE_SATA_3_0_GBPS,
288*4882a593Smuzhiyun 	FFE_SATA_6_0_GBPS,
289*4882a593Smuzhiyun 	FFE_CFG_MAX
290*4882a593Smuzhiyun };
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun enum hisi_sas_debugfs_bist_fixed_code {
293*4882a593Smuzhiyun 	FIXED_CODE,
294*4882a593Smuzhiyun 	FIXED_CODE_1,
295*4882a593Smuzhiyun 	FIXED_CODE_MAX
296*4882a593Smuzhiyun };
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun enum {
299*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_PRBS7,
300*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_PRBS23,
301*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_PRBS31,
302*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_JTPAT,
303*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_CJTPAT,
304*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_SCRAMBED_0,
305*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_TRAIN,
306*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_TRAIN_DONE,
307*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_HFTP,
308*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_MFTP,
309*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_LFTP,
310*4882a593Smuzhiyun 	HISI_SAS_BIST_CODE_MODE_FIXED_DATA,
311*4882a593Smuzhiyun };
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun struct hisi_sas_hw {
314*4882a593Smuzhiyun 	int (*hw_init)(struct hisi_hba *hisi_hba);
315*4882a593Smuzhiyun 	void (*setup_itct)(struct hisi_hba *hisi_hba,
316*4882a593Smuzhiyun 			   struct hisi_sas_device *device);
317*4882a593Smuzhiyun 	int (*slot_index_alloc)(struct hisi_hba *hisi_hba,
318*4882a593Smuzhiyun 				struct domain_device *device);
319*4882a593Smuzhiyun 	struct hisi_sas_device *(*alloc_dev)(struct domain_device *device);
320*4882a593Smuzhiyun 	void (*sl_notify_ssp)(struct hisi_hba *hisi_hba, int phy_no);
321*4882a593Smuzhiyun 	void (*start_delivery)(struct hisi_sas_dq *dq);
322*4882a593Smuzhiyun 	void (*prep_ssp)(struct hisi_hba *hisi_hba,
323*4882a593Smuzhiyun 			struct hisi_sas_slot *slot);
324*4882a593Smuzhiyun 	void (*prep_smp)(struct hisi_hba *hisi_hba,
325*4882a593Smuzhiyun 			struct hisi_sas_slot *slot);
326*4882a593Smuzhiyun 	void (*prep_stp)(struct hisi_hba *hisi_hba,
327*4882a593Smuzhiyun 			struct hisi_sas_slot *slot);
328*4882a593Smuzhiyun 	void (*prep_abort)(struct hisi_hba *hisi_hba,
329*4882a593Smuzhiyun 			  struct hisi_sas_slot *slot,
330*4882a593Smuzhiyun 			  int device_id, int abort_flag, int tag_to_abort);
331*4882a593Smuzhiyun 	void (*phys_init)(struct hisi_hba *hisi_hba);
332*4882a593Smuzhiyun 	void (*phy_start)(struct hisi_hba *hisi_hba, int phy_no);
333*4882a593Smuzhiyun 	void (*phy_disable)(struct hisi_hba *hisi_hba, int phy_no);
334*4882a593Smuzhiyun 	void (*phy_hard_reset)(struct hisi_hba *hisi_hba, int phy_no);
335*4882a593Smuzhiyun 	void (*get_events)(struct hisi_hba *hisi_hba, int phy_no);
336*4882a593Smuzhiyun 	void (*phy_set_linkrate)(struct hisi_hba *hisi_hba, int phy_no,
337*4882a593Smuzhiyun 			struct sas_phy_linkrates *linkrates);
338*4882a593Smuzhiyun 	enum sas_linkrate (*phy_get_max_linkrate)(void);
339*4882a593Smuzhiyun 	int (*clear_itct)(struct hisi_hba *hisi_hba,
340*4882a593Smuzhiyun 			  struct hisi_sas_device *dev);
341*4882a593Smuzhiyun 	void (*free_device)(struct hisi_sas_device *sas_dev);
342*4882a593Smuzhiyun 	int (*get_wideport_bitmap)(struct hisi_hba *hisi_hba, int port_id);
343*4882a593Smuzhiyun 	void (*dereg_device)(struct hisi_hba *hisi_hba,
344*4882a593Smuzhiyun 				struct domain_device *device);
345*4882a593Smuzhiyun 	int (*soft_reset)(struct hisi_hba *hisi_hba);
346*4882a593Smuzhiyun 	u32 (*get_phys_state)(struct hisi_hba *hisi_hba);
347*4882a593Smuzhiyun 	int (*write_gpio)(struct hisi_hba *hisi_hba, u8 reg_type,
348*4882a593Smuzhiyun 				u8 reg_index, u8 reg_count, u8 *write_data);
349*4882a593Smuzhiyun 	void (*wait_cmds_complete_timeout)(struct hisi_hba *hisi_hba,
350*4882a593Smuzhiyun 					   int delay_ms, int timeout_ms);
351*4882a593Smuzhiyun 	void (*snapshot_prepare)(struct hisi_hba *hisi_hba);
352*4882a593Smuzhiyun 	void (*snapshot_restore)(struct hisi_hba *hisi_hba);
353*4882a593Smuzhiyun 	int (*set_bist)(struct hisi_hba *hisi_hba, bool enable);
354*4882a593Smuzhiyun 	void (*read_iost_itct_cache)(struct hisi_hba *hisi_hba,
355*4882a593Smuzhiyun 				     enum hisi_sas_debugfs_cache_type type,
356*4882a593Smuzhiyun 				     u32 *cache);
357*4882a593Smuzhiyun 	int complete_hdr_size;
358*4882a593Smuzhiyun 	struct scsi_host_template *sht;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	const struct hisi_sas_debugfs_reg *debugfs_reg_array[DEBUGFS_REGS_NUM];
361*4882a593Smuzhiyun 	const struct hisi_sas_debugfs_reg *debugfs_reg_port;
362*4882a593Smuzhiyun };
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun #define HISI_SAS_MAX_DEBUGFS_DUMP (50)
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun struct hisi_sas_debugfs_cq {
367*4882a593Smuzhiyun 	struct hisi_sas_cq *cq;
368*4882a593Smuzhiyun 	void *complete_hdr;
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun struct hisi_sas_debugfs_dq {
372*4882a593Smuzhiyun 	struct hisi_sas_dq *dq;
373*4882a593Smuzhiyun 	struct hisi_sas_cmd_hdr *hdr;
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun struct hisi_sas_debugfs_regs {
377*4882a593Smuzhiyun 	struct hisi_hba *hisi_hba;
378*4882a593Smuzhiyun 	u32 *data;
379*4882a593Smuzhiyun };
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun struct hisi_sas_debugfs_port {
382*4882a593Smuzhiyun 	struct hisi_sas_phy *phy;
383*4882a593Smuzhiyun 	u32 *data;
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun struct hisi_sas_debugfs_iost {
387*4882a593Smuzhiyun 	struct hisi_sas_iost *iost;
388*4882a593Smuzhiyun };
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun struct hisi_sas_debugfs_itct {
391*4882a593Smuzhiyun 	struct hisi_sas_itct *itct;
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun struct hisi_sas_debugfs_iost_cache {
395*4882a593Smuzhiyun 	struct hisi_sas_iost_itct_cache *cache;
396*4882a593Smuzhiyun };
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun struct hisi_sas_debugfs_itct_cache {
399*4882a593Smuzhiyun 	struct hisi_sas_iost_itct_cache *cache;
400*4882a593Smuzhiyun };
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun struct hisi_hba {
403*4882a593Smuzhiyun 	/* This must be the first element, used by SHOST_TO_SAS_HA */
404*4882a593Smuzhiyun 	struct sas_ha_struct *p;
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	struct platform_device *platform_dev;
407*4882a593Smuzhiyun 	struct pci_dev *pci_dev;
408*4882a593Smuzhiyun 	struct device *dev;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	int prot_mask;
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	void __iomem *regs;
413*4882a593Smuzhiyun 	void __iomem *sgpio_regs;
414*4882a593Smuzhiyun 	struct regmap *ctrl;
415*4882a593Smuzhiyun 	u32 ctrl_reset_reg;
416*4882a593Smuzhiyun 	u32 ctrl_reset_sts_reg;
417*4882a593Smuzhiyun 	u32 ctrl_clock_ena_reg;
418*4882a593Smuzhiyun 	u32 refclk_frequency_mhz;
419*4882a593Smuzhiyun 	u8 sas_addr[SAS_ADDR_SIZE];
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun 	int n_phy;
422*4882a593Smuzhiyun 	spinlock_t lock;
423*4882a593Smuzhiyun 	struct semaphore sem;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	struct timer_list timer;
426*4882a593Smuzhiyun 	struct workqueue_struct *wq;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	int slot_index_count;
429*4882a593Smuzhiyun 	int last_slot_index;
430*4882a593Smuzhiyun 	int last_dev_id;
431*4882a593Smuzhiyun 	unsigned long *slot_index_tags;
432*4882a593Smuzhiyun 	unsigned long reject_stp_links_msk;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	/* SCSI/SAS glue */
435*4882a593Smuzhiyun 	struct sas_ha_struct sha;
436*4882a593Smuzhiyun 	struct Scsi_Host *shost;
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	struct hisi_sas_cq cq[HISI_SAS_MAX_QUEUES];
439*4882a593Smuzhiyun 	struct hisi_sas_dq dq[HISI_SAS_MAX_QUEUES];
440*4882a593Smuzhiyun 	struct hisi_sas_phy phy[HISI_SAS_MAX_PHYS];
441*4882a593Smuzhiyun 	struct hisi_sas_port port[HISI_SAS_MAX_PHYS];
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	int	queue_count;
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	struct hisi_sas_device	devices[HISI_SAS_MAX_DEVICES];
446*4882a593Smuzhiyun 	struct hisi_sas_cmd_hdr	*cmd_hdr[HISI_SAS_MAX_QUEUES];
447*4882a593Smuzhiyun 	dma_addr_t cmd_hdr_dma[HISI_SAS_MAX_QUEUES];
448*4882a593Smuzhiyun 	void *complete_hdr[HISI_SAS_MAX_QUEUES];
449*4882a593Smuzhiyun 	dma_addr_t complete_hdr_dma[HISI_SAS_MAX_QUEUES];
450*4882a593Smuzhiyun 	struct hisi_sas_initial_fis *initial_fis;
451*4882a593Smuzhiyun 	dma_addr_t initial_fis_dma;
452*4882a593Smuzhiyun 	struct hisi_sas_itct *itct;
453*4882a593Smuzhiyun 	dma_addr_t itct_dma;
454*4882a593Smuzhiyun 	struct hisi_sas_iost *iost;
455*4882a593Smuzhiyun 	dma_addr_t iost_dma;
456*4882a593Smuzhiyun 	struct hisi_sas_breakpoint *breakpoint;
457*4882a593Smuzhiyun 	dma_addr_t breakpoint_dma;
458*4882a593Smuzhiyun 	struct hisi_sas_breakpoint *sata_breakpoint;
459*4882a593Smuzhiyun 	dma_addr_t sata_breakpoint_dma;
460*4882a593Smuzhiyun 	struct hisi_sas_slot	*slot_info;
461*4882a593Smuzhiyun 	unsigned long flags;
462*4882a593Smuzhiyun 	const struct hisi_sas_hw *hw;	/* Low level hw interface */
463*4882a593Smuzhiyun 	unsigned long sata_dev_bitmap[BITS_TO_LONGS(HISI_SAS_MAX_DEVICES)];
464*4882a593Smuzhiyun 	struct work_struct rst_work;
465*4882a593Smuzhiyun 	struct work_struct debugfs_work;
466*4882a593Smuzhiyun 	u32 phy_state;
467*4882a593Smuzhiyun 	u32 intr_coal_ticks;	/* Time of interrupt coalesce in us */
468*4882a593Smuzhiyun 	u32 intr_coal_count;	/* Interrupt count to coalesce */
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	int cq_nvecs;
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	/* bist */
473*4882a593Smuzhiyun 	enum sas_linkrate debugfs_bist_linkrate;
474*4882a593Smuzhiyun 	int debugfs_bist_code_mode;
475*4882a593Smuzhiyun 	int debugfs_bist_phy_no;
476*4882a593Smuzhiyun 	int debugfs_bist_mode;
477*4882a593Smuzhiyun 	u32 debugfs_bist_cnt;
478*4882a593Smuzhiyun 	int debugfs_bist_enable;
479*4882a593Smuzhiyun 	u32 debugfs_bist_ffe[HISI_SAS_MAX_PHYS][FFE_CFG_MAX];
480*4882a593Smuzhiyun 	u32 debugfs_bist_fixed_code[FIXED_CODE_MAX];
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	/* debugfs memories */
483*4882a593Smuzhiyun 	/* Put Global AXI and RAS Register into register array */
484*4882a593Smuzhiyun 	struct hisi_sas_debugfs_regs debugfs_regs[HISI_SAS_MAX_DEBUGFS_DUMP][DEBUGFS_REGS_NUM];
485*4882a593Smuzhiyun 	struct hisi_sas_debugfs_port debugfs_port_reg[HISI_SAS_MAX_DEBUGFS_DUMP][HISI_SAS_MAX_PHYS];
486*4882a593Smuzhiyun 	struct hisi_sas_debugfs_cq debugfs_cq[HISI_SAS_MAX_DEBUGFS_DUMP][HISI_SAS_MAX_QUEUES];
487*4882a593Smuzhiyun 	struct hisi_sas_debugfs_dq debugfs_dq[HISI_SAS_MAX_DEBUGFS_DUMP][HISI_SAS_MAX_QUEUES];
488*4882a593Smuzhiyun 	struct hisi_sas_debugfs_iost debugfs_iost[HISI_SAS_MAX_DEBUGFS_DUMP];
489*4882a593Smuzhiyun 	struct hisi_sas_debugfs_itct debugfs_itct[HISI_SAS_MAX_DEBUGFS_DUMP];
490*4882a593Smuzhiyun 	struct hisi_sas_debugfs_iost_cache debugfs_iost_cache[HISI_SAS_MAX_DEBUGFS_DUMP];
491*4882a593Smuzhiyun 	struct hisi_sas_debugfs_itct_cache debugfs_itct_cache[HISI_SAS_MAX_DEBUGFS_DUMP];
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	u64 debugfs_timestamp[HISI_SAS_MAX_DEBUGFS_DUMP];
494*4882a593Smuzhiyun 	int debugfs_dump_index;
495*4882a593Smuzhiyun 	struct dentry *debugfs_dir;
496*4882a593Smuzhiyun 	struct dentry *debugfs_dump_dentry;
497*4882a593Smuzhiyun 	struct dentry *debugfs_bist_dentry;
498*4882a593Smuzhiyun };
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun /* Generic HW DMA host memory structures */
501*4882a593Smuzhiyun /* Delivery queue header */
502*4882a593Smuzhiyun struct hisi_sas_cmd_hdr {
503*4882a593Smuzhiyun 	/* dw0 */
504*4882a593Smuzhiyun 	__le32 dw0;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	/* dw1 */
507*4882a593Smuzhiyun 	__le32 dw1;
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	/* dw2 */
510*4882a593Smuzhiyun 	__le32 dw2;
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	/* dw3 */
513*4882a593Smuzhiyun 	__le32 transfer_tags;
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	/* dw4 */
516*4882a593Smuzhiyun 	__le32 data_transfer_len;
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 	/* dw5 */
519*4882a593Smuzhiyun 	__le32 first_burst_num;
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun 	/* dw6 */
522*4882a593Smuzhiyun 	__le32 sg_len;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	/* dw7 */
525*4882a593Smuzhiyun 	__le32 dw7;
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	/* dw8-9 */
528*4882a593Smuzhiyun 	__le64 cmd_table_addr;
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun 	/* dw10-11 */
531*4882a593Smuzhiyun 	__le64 sts_buffer_addr;
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun 	/* dw12-13 */
534*4882a593Smuzhiyun 	__le64 prd_table_addr;
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	/* dw14-15 */
537*4882a593Smuzhiyun 	__le64 dif_prd_table_addr;
538*4882a593Smuzhiyun };
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun struct hisi_sas_itct {
541*4882a593Smuzhiyun 	__le64 qw0;
542*4882a593Smuzhiyun 	__le64 sas_addr;
543*4882a593Smuzhiyun 	__le64 qw2;
544*4882a593Smuzhiyun 	__le64 qw3;
545*4882a593Smuzhiyun 	__le64 qw4_15[12];
546*4882a593Smuzhiyun };
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun struct hisi_sas_iost {
549*4882a593Smuzhiyun 	__le64 qw0;
550*4882a593Smuzhiyun 	__le64 qw1;
551*4882a593Smuzhiyun 	__le64 qw2;
552*4882a593Smuzhiyun 	__le64 qw3;
553*4882a593Smuzhiyun };
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun struct hisi_sas_err_record {
556*4882a593Smuzhiyun 	u32	data[4];
557*4882a593Smuzhiyun };
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun struct hisi_sas_initial_fis {
560*4882a593Smuzhiyun 	struct hisi_sas_err_record err_record;
561*4882a593Smuzhiyun 	struct dev_to_host_fis fis;
562*4882a593Smuzhiyun 	u32 rsvd[3];
563*4882a593Smuzhiyun };
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun struct hisi_sas_breakpoint {
566*4882a593Smuzhiyun 	u8	data[128];
567*4882a593Smuzhiyun };
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun struct hisi_sas_sata_breakpoint {
570*4882a593Smuzhiyun 	struct hisi_sas_breakpoint tag[32];
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun struct hisi_sas_sge {
574*4882a593Smuzhiyun 	__le64 addr;
575*4882a593Smuzhiyun 	__le32 page_ctrl_0;
576*4882a593Smuzhiyun 	__le32 page_ctrl_1;
577*4882a593Smuzhiyun 	__le32 data_len;
578*4882a593Smuzhiyun 	__le32 data_off;
579*4882a593Smuzhiyun };
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun struct hisi_sas_command_table_smp {
582*4882a593Smuzhiyun 	u8 bytes[44];
583*4882a593Smuzhiyun };
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun struct hisi_sas_command_table_stp {
586*4882a593Smuzhiyun 	struct	host_to_dev_fis command_fis;
587*4882a593Smuzhiyun 	u8	dummy[12];
588*4882a593Smuzhiyun 	u8	atapi_cdb[ATAPI_CDB_LEN];
589*4882a593Smuzhiyun };
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun #define HISI_SAS_SGE_PAGE_CNT (124)
592*4882a593Smuzhiyun struct hisi_sas_sge_page {
593*4882a593Smuzhiyun 	struct hisi_sas_sge sge[HISI_SAS_SGE_PAGE_CNT];
594*4882a593Smuzhiyun }  __aligned(16);
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun #define HISI_SAS_SGE_DIF_PAGE_CNT   HISI_SAS_SGE_PAGE_CNT
597*4882a593Smuzhiyun struct hisi_sas_sge_dif_page {
598*4882a593Smuzhiyun 	struct hisi_sas_sge sge[HISI_SAS_SGE_DIF_PAGE_CNT];
599*4882a593Smuzhiyun }  __aligned(16);
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun struct hisi_sas_command_table_ssp {
602*4882a593Smuzhiyun 	struct ssp_frame_hdr hdr;
603*4882a593Smuzhiyun 	union {
604*4882a593Smuzhiyun 		struct {
605*4882a593Smuzhiyun 			struct ssp_command_iu task;
606*4882a593Smuzhiyun 			u32 prot[7];
607*4882a593Smuzhiyun 		};
608*4882a593Smuzhiyun 		struct ssp_tmf_iu ssp_task;
609*4882a593Smuzhiyun 		struct xfer_rdy_iu xfer_rdy;
610*4882a593Smuzhiyun 		struct ssp_response_iu ssp_res;
611*4882a593Smuzhiyun 	} u;
612*4882a593Smuzhiyun };
613*4882a593Smuzhiyun 
614*4882a593Smuzhiyun union hisi_sas_command_table {
615*4882a593Smuzhiyun 	struct hisi_sas_command_table_ssp ssp;
616*4882a593Smuzhiyun 	struct hisi_sas_command_table_smp smp;
617*4882a593Smuzhiyun 	struct hisi_sas_command_table_stp stp;
618*4882a593Smuzhiyun }  __aligned(16);
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun struct hisi_sas_status_buffer {
621*4882a593Smuzhiyun 	struct hisi_sas_err_record err;
622*4882a593Smuzhiyun 	u8	iu[1024];
623*4882a593Smuzhiyun }  __aligned(16);
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun struct hisi_sas_slot_buf_table {
626*4882a593Smuzhiyun 	struct hisi_sas_status_buffer status_buffer;
627*4882a593Smuzhiyun 	union hisi_sas_command_table command_header;
628*4882a593Smuzhiyun 	struct hisi_sas_sge_page sge_page;
629*4882a593Smuzhiyun };
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun struct hisi_sas_slot_dif_buf_table {
632*4882a593Smuzhiyun 	struct hisi_sas_slot_buf_table slot_buf;
633*4882a593Smuzhiyun 	struct hisi_sas_sge_dif_page sge_dif_page;
634*4882a593Smuzhiyun };
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun extern struct scsi_transport_template *hisi_sas_stt;
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun extern bool hisi_sas_debugfs_enable;
639*4882a593Smuzhiyun extern u32 hisi_sas_debugfs_dump_count;
640*4882a593Smuzhiyun extern struct dentry *hisi_sas_debugfs_dir;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun extern void hisi_sas_stop_phys(struct hisi_hba *hisi_hba);
643*4882a593Smuzhiyun extern int hisi_sas_alloc(struct hisi_hba *hisi_hba);
644*4882a593Smuzhiyun extern void hisi_sas_free(struct hisi_hba *hisi_hba);
645*4882a593Smuzhiyun extern u8 hisi_sas_get_ata_protocol(struct host_to_dev_fis *fis,
646*4882a593Smuzhiyun 				int direction);
647*4882a593Smuzhiyun extern struct hisi_sas_port *to_hisi_sas_port(struct asd_sas_port *sas_port);
648*4882a593Smuzhiyun extern void hisi_sas_sata_done(struct sas_task *task,
649*4882a593Smuzhiyun 			    struct hisi_sas_slot *slot);
650*4882a593Smuzhiyun extern int hisi_sas_get_fw_info(struct hisi_hba *hisi_hba);
651*4882a593Smuzhiyun extern int hisi_sas_probe(struct platform_device *pdev,
652*4882a593Smuzhiyun 			  const struct hisi_sas_hw *ops);
653*4882a593Smuzhiyun extern int hisi_sas_remove(struct platform_device *pdev);
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun extern int hisi_sas_slave_configure(struct scsi_device *sdev);
656*4882a593Smuzhiyun extern int hisi_sas_scan_finished(struct Scsi_Host *shost, unsigned long time);
657*4882a593Smuzhiyun extern void hisi_sas_scan_start(struct Scsi_Host *shost);
658*4882a593Smuzhiyun extern int hisi_sas_host_reset(struct Scsi_Host *shost, int reset_type);
659*4882a593Smuzhiyun extern void hisi_sas_phy_enable(struct hisi_hba *hisi_hba, int phy_no,
660*4882a593Smuzhiyun 				int enable);
661*4882a593Smuzhiyun extern void hisi_sas_phy_down(struct hisi_hba *hisi_hba, int phy_no, int rdy);
662*4882a593Smuzhiyun extern void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba,
663*4882a593Smuzhiyun 				    struct sas_task *task,
664*4882a593Smuzhiyun 				    struct hisi_sas_slot *slot);
665*4882a593Smuzhiyun extern void hisi_sas_init_mem(struct hisi_hba *hisi_hba);
666*4882a593Smuzhiyun extern void hisi_sas_rst_work_handler(struct work_struct *work);
667*4882a593Smuzhiyun extern void hisi_sas_sync_rst_work_handler(struct work_struct *work);
668*4882a593Smuzhiyun extern void hisi_sas_sync_irqs(struct hisi_hba *hisi_hba);
669*4882a593Smuzhiyun extern void hisi_sas_phy_oob_ready(struct hisi_hba *hisi_hba, int phy_no);
670*4882a593Smuzhiyun extern bool hisi_sas_notify_phy_event(struct hisi_sas_phy *phy,
671*4882a593Smuzhiyun 				enum hisi_sas_phy_event event);
672*4882a593Smuzhiyun extern void hisi_sas_release_tasks(struct hisi_hba *hisi_hba);
673*4882a593Smuzhiyun extern u8 hisi_sas_get_prog_phy_linkrate_mask(enum sas_linkrate max);
674*4882a593Smuzhiyun extern void hisi_sas_controller_reset_prepare(struct hisi_hba *hisi_hba);
675*4882a593Smuzhiyun extern void hisi_sas_controller_reset_done(struct hisi_hba *hisi_hba);
676*4882a593Smuzhiyun extern void hisi_sas_debugfs_init(struct hisi_hba *hisi_hba);
677*4882a593Smuzhiyun extern void hisi_sas_debugfs_exit(struct hisi_hba *hisi_hba);
678*4882a593Smuzhiyun extern void hisi_sas_debugfs_work_handler(struct work_struct *work);
679*4882a593Smuzhiyun #endif
680