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
19struct 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
29struct 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
40struct 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
48struct 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
56struct 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
68enum 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
82struct hccs_die_num_req_param {
83	u8 chip_id;
84};
85
86struct hccs_die_info_req_param {
87	u8 chip_id;
88	u8 die_idx;
89};
90
91struct 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
98struct 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 */
110struct 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 */
116struct 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
126struct 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
132struct hccs_req_head {
133	u8 module_code; /* set to 0x32 for serdes */
134	u8 start_id;
135	u8 rsv[2];
136};
137
138struct hccs_rsp_head {
139	u8 data_len;
140	u8 next_id;
141	u8 rsv[2];
142};
143
144struct 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 */
163struct 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 */
179struct hccs_req_desc {
180	struct hccs_req_head req_head; /* 4 Bytes */
181	u32 data[HCCS_MAX_REQ_DATA_SIZE_MAX];
182};
183
184struct hccs_desc {
185	union {
186		struct hccs_req_desc req;
187		struct hccs_rsp_desc rsp;
188	};
189};
190
191#endif /* __KUNPENG_HCCS_H__ */
192