Merge tag 'thermal-6.6-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / drivers / soc / hisilicon / kunpeng_hccs.h
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 };
55
56 struct hccs_dev {
57         struct device *dev;
58         struct acpi_device *acpi_dev;
59         u64 caps;
60         u8 chip_num;
61         struct hccs_chip_info *chips;
62         u8 chan_id;
63         struct mutex lock;
64         struct hccs_mbox_client_info cl_info;
65 };
66
67 #define HCCS_SERDES_MODULE_CODE 0x32
68 enum hccs_subcmd_type {
69         HCCS_GET_CHIP_NUM = 0x1,
70         HCCS_GET_DIE_NUM,
71         HCCS_GET_DIE_INFO,
72         HCCS_GET_DIE_PORT_INFO,
73         HCCS_GET_DEV_CAP,
74         HCCS_GET_PORT_LINK_STATUS,
75         HCCS_GET_PORT_CRC_ERR_CNT,
76         HCCS_GET_DIE_PORTS_LANE_STA,
77         HCCS_GET_DIE_PORTS_LINK_STA,
78         HCCS_GET_DIE_PORTS_CRC_ERR_CNT,
79         HCCS_SUB_CMD_MAX = 255,
80 };
81
82 struct hccs_die_num_req_param {
83         u8 chip_id;
84 };
85
86 struct hccs_die_info_req_param {
87         u8 chip_id;
88         u8 die_idx;
89 };
90
91 struct hccs_die_info_rsp_data {
92         u8 die_id;
93         u8 port_num;
94         u8 min_port_id;
95         u8 max_port_id;
96 };
97
98 struct hccs_port_attr {
99         u8 port_id;
100         u8 port_type;
101         u8 lane_mode;
102         u8 enable : 1; /* if the port is enabled */
103         u16 rsv[2];
104 };
105
106 /*
107  * The common command request for getting the information of all HCCS port on
108  * specified DIE.
109  */
110 struct hccs_die_comm_req_param {
111         u8 chip_id;
112         u8 die_id; /* id in hardware */
113 };
114
115 /* The common command request for getting the information of a specific port */
116 struct hccs_port_comm_req_param {
117         u8 chip_id;
118         u8 die_id;
119         u8 port_id;
120 };
121
122 #define HCCS_PORT_RESET         1
123 #define HCCS_PORT_SETUP         2
124 #define HCCS_PORT_CONFIG        3
125 #define HCCS_PORT_READY         4
126 struct hccs_link_status {
127         u8 lane_mask; /* indicate which lanes are used. */
128         u8 link_fsm : 3; /* link fsm, 1: reset 2: setup 3: config 4: link-up */
129         u8 lane_num : 5; /* current lane number */
130 };
131
132 struct hccs_req_head {
133         u8 module_code; /* set to 0x32 for serdes */
134         u8 start_id;
135         u8 rsv[2];
136 };
137
138 struct hccs_rsp_head {
139         u8 data_len;
140         u8 next_id;
141         u8 rsv[2];
142 };
143
144 struct hccs_fw_inner_head {
145         u8 retStatus; /* 0: success, other: failure */
146         u8 rsv[7];
147 };
148
149 #define HCCS_PCC_SHARE_MEM_BYTES        64
150 #define HCCS_FW_INNER_HEAD_BYTES        8
151 #define HCCS_RSP_HEAD_BYTES             4
152
153 #define HCCS_MAX_RSP_DATA_BYTES         (HCCS_PCC_SHARE_MEM_BYTES - \
154                                          HCCS_FW_INNER_HEAD_BYTES - \
155                                          HCCS_RSP_HEAD_BYTES)
156 #define HCCS_MAX_RSP_DATA_SIZE_MAX      (HCCS_MAX_RSP_DATA_BYTES / 4)
157
158 /*
159  * Note: Actual available size of data field also depands on the PCC header
160  * bytes of the specific type. Driver needs to copy the response data in the
161  * communication space based on the real length.
162  */
163 struct hccs_rsp_desc {
164         struct hccs_fw_inner_head fw_inner_head; /* 8 Bytes */
165         struct hccs_rsp_head rsp_head; /* 4 Bytes */
166         u32 data[HCCS_MAX_RSP_DATA_SIZE_MAX];
167 };
168
169 #define HCCS_REQ_HEAD_BYTES             4
170 #define HCCS_MAX_REQ_DATA_BYTES         (HCCS_PCC_SHARE_MEM_BYTES - \
171                                          HCCS_REQ_HEAD_BYTES)
172 #define HCCS_MAX_REQ_DATA_SIZE_MAX      (HCCS_MAX_REQ_DATA_BYTES / 4)
173
174 /*
175  * Note: Actual available size of data field also depands on the PCC header
176  * bytes of the specific type. Driver needs to copy the request data to the
177  * communication space based on the real length.
178  */
179 struct hccs_req_desc {
180         struct hccs_req_head req_head; /* 4 Bytes */
181         u32 data[HCCS_MAX_REQ_DATA_SIZE_MAX];
182 };
183
184 struct hccs_desc {
185         union {
186                 struct hccs_req_desc req;
187                 struct hccs_rsp_desc rsp;
188         };
189 };
190
191 #endif /* __KUNPENG_HCCS_H__ */