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 | |