xref: /linux/drivers/soc/hisilicon/kunpeng_hccs.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /* Copyright (c) 2023 Hisilicon Limited. */
3 
4 #ifndef __KUNPENG_HCCS_H__
5 #define __KUNPENG_HCCS_H__
6 
7 /*
8  * |---------------  Chip0  ---------------|----------------  ChipN  -------------|
9  * |--------Die0-------|--------DieN-------|--------Die0-------|-------DieN-------|
10  * | P0 | P1 | P2 | P3 | P0 | P1 | P2 | P3 | P0 | P1 | P2 | P3 |P0 | P1 | P2 | P3 |
11  */
12 
13 /*
14  * This value cannot be 255, otherwise the loop of the multi-BD communication
15  * case cannot end.
16  */
17 #define HCCS_DIE_MAX_PORT_ID	254
18 
19 struct hccs_port_info {
20 	u8 port_id;
21 	u8 port_type;
22 	u8 lane_mode;
23 	bool enable; /* if the port is enabled */
24 	struct kobject kobj;
25 	bool dir_created;
26 	struct hccs_die_info *die; /* point to the die the port is located */
27 };
28 
29 struct hccs_die_info {
30 	u8 die_id;
31 	u8 port_num;
32 	u8 min_port_id;
33 	u8 max_port_id;
34 	struct hccs_port_info *ports;
35 	struct kobject kobj;
36 	bool dir_created;
37 	struct hccs_chip_info *chip; /* point to the chip the die is located */
38 };
39 
40 struct hccs_chip_info {
41 	u8 chip_id;
42 	u8 die_num;
43 	struct hccs_die_info *dies;
44 	struct kobject kobj;
45 	struct hccs_dev *hdev;
46 };
47 
48 struct hccs_mbox_client_info {
49 	struct mbox_client client;
50 	struct mbox_chan *mbox_chan;
51 	struct pcc_mbox_chan *pcc_chan;
52 	u64 deadline_us;
53 	void __iomem *pcc_comm_addr;
54 	struct completion done;
55 };
56 
57 struct hccs_desc;
58 
59 struct hccs_verspecific_data {
60 	void (*rx_callback)(struct mbox_client *cl, void *mssg);
61 	int (*wait_cmd_complete)(struct hccs_dev *hdev);
62 	void (*fill_pcc_shared_mem)(struct hccs_dev *hdev,
63 				    u8 cmd, struct hccs_desc *desc,
64 				    void __iomem *comm_space,
65 				    u16 space_size);
66 	u16 shared_mem_size;
67 	bool has_txdone_irq;
68 };
69 
70 struct hccs_dev {
71 	struct device *dev;
72 	struct acpi_device *acpi_dev;
73 	const struct hccs_verspecific_data *verspec_data;
74 	u64 caps;
75 	u8 chip_num;
76 	struct hccs_chip_info *chips;
77 	u8 chan_id;
78 	struct mutex lock;
79 	struct hccs_mbox_client_info cl_info;
80 };
81 
82 #define HCCS_SERDES_MODULE_CODE 0x32
83 enum hccs_subcmd_type {
84 	HCCS_GET_CHIP_NUM = 0x1,
85 	HCCS_GET_DIE_NUM,
86 	HCCS_GET_DIE_INFO,
87 	HCCS_GET_DIE_PORT_INFO,
88 	HCCS_GET_DEV_CAP,
89 	HCCS_GET_PORT_LINK_STATUS,
90 	HCCS_GET_PORT_CRC_ERR_CNT,
91 	HCCS_GET_DIE_PORTS_LANE_STA,
92 	HCCS_GET_DIE_PORTS_LINK_STA,
93 	HCCS_GET_DIE_PORTS_CRC_ERR_CNT,
94 	HCCS_SUB_CMD_MAX = 255,
95 };
96 
97 struct hccs_die_num_req_param {
98 	u8 chip_id;
99 };
100 
101 struct hccs_die_info_req_param {
102 	u8 chip_id;
103 	u8 die_idx;
104 };
105 
106 struct hccs_die_info_rsp_data {
107 	u8 die_id;
108 	u8 port_num;
109 	u8 min_port_id;
110 	u8 max_port_id;
111 };
112 
113 struct hccs_port_attr {
114 	u8 port_id;
115 	u8 port_type;
116 	u8 lane_mode;
117 	u8 enable : 1; /* if the port is enabled */
118 	u16 rsv[2];
119 };
120 
121 /*
122  * The common command request for getting the information of all HCCS port on
123  * specified DIE.
124  */
125 struct hccs_die_comm_req_param {
126 	u8 chip_id;
127 	u8 die_id; /* id in hardware */
128 };
129 
130 /* The common command request for getting the information of a specific port */
131 struct hccs_port_comm_req_param {
132 	u8 chip_id;
133 	u8 die_id;
134 	u8 port_id;
135 };
136 
137 #define HCCS_PORT_RESET         1
138 #define HCCS_PORT_SETUP         2
139 #define HCCS_PORT_CONFIG        3
140 #define HCCS_PORT_READY         4
141 struct hccs_link_status {
142 	u8 lane_mask; /* indicate which lanes are used. */
143 	u8 link_fsm : 3; /* link fsm, 1: reset 2: setup 3: config 4: link-up */
144 	u8 lane_num : 5; /* current lane number */
145 };
146 
147 struct hccs_req_head {
148 	u8 module_code; /* set to 0x32 for serdes */
149 	u8 start_id;
150 	u8 rsv[2];
151 };
152 
153 struct hccs_rsp_head {
154 	u8 data_len;
155 	u8 next_id;
156 	u8 rsv[2];
157 };
158 
159 struct hccs_fw_inner_head {
160 	u8 retStatus; /* 0: success, other: failure */
161 	u8 rsv[7];
162 };
163 
164 #define HCCS_PCC_SHARE_MEM_BYTES	64
165 #define HCCS_FW_INNER_HEAD_BYTES	8
166 #define HCCS_RSP_HEAD_BYTES		4
167 
168 #define HCCS_MAX_RSP_DATA_BYTES		(HCCS_PCC_SHARE_MEM_BYTES - \
169 					 HCCS_FW_INNER_HEAD_BYTES - \
170 					 HCCS_RSP_HEAD_BYTES)
171 #define HCCS_MAX_RSP_DATA_SIZE_MAX	(HCCS_MAX_RSP_DATA_BYTES / 4)
172 
173 /*
174  * Note: Actual available size of data field also depands on the PCC header
175  * bytes of the specific type. Driver needs to copy the response data in the
176  * communication space based on the real length.
177  */
178 struct hccs_rsp_desc {
179 	struct hccs_fw_inner_head fw_inner_head; /* 8 Bytes */
180 	struct hccs_rsp_head rsp_head; /* 4 Bytes */
181 	u32 data[HCCS_MAX_RSP_DATA_SIZE_MAX];
182 };
183 
184 #define HCCS_REQ_HEAD_BYTES		4
185 #define HCCS_MAX_REQ_DATA_BYTES		(HCCS_PCC_SHARE_MEM_BYTES - \
186 					 HCCS_REQ_HEAD_BYTES)
187 #define HCCS_MAX_REQ_DATA_SIZE_MAX	(HCCS_MAX_REQ_DATA_BYTES / 4)
188 
189 /*
190  * Note: Actual available size of data field also depands on the PCC header
191  * bytes of the specific type. Driver needs to copy the request data to the
192  * communication space based on the real length.
193  */
194 struct hccs_req_desc {
195 	struct hccs_req_head req_head; /* 4 Bytes */
196 	u32 data[HCCS_MAX_REQ_DATA_SIZE_MAX];
197 };
198 
199 struct hccs_desc {
200 	union {
201 		struct hccs_req_desc req;
202 		struct hccs_rsp_desc rsp;
203 	};
204 };
205 
206 #endif /* __KUNPENG_HCCS_H__ */
207