xref: /linux/drivers/soc/hisilicon/kunpeng_hccs.h (revision 06d07429858317ded2db7986113a9e0129cd599b)
1886bdf9cSHuisong Li /* SPDX-License-Identifier: GPL-2.0+ */
2886bdf9cSHuisong Li /* Copyright (c) 2023 Hisilicon Limited. */
3886bdf9cSHuisong Li 
4886bdf9cSHuisong Li #ifndef __KUNPENG_HCCS_H__
5886bdf9cSHuisong Li #define __KUNPENG_HCCS_H__
6886bdf9cSHuisong Li 
7886bdf9cSHuisong Li /*
8886bdf9cSHuisong Li  * |---------------  Chip0  ---------------|----------------  ChipN  -------------|
9886bdf9cSHuisong Li  * |--------Die0-------|--------DieN-------|--------Die0-------|-------DieN-------|
10886bdf9cSHuisong Li  * | P0 | P1 | P2 | P3 | P0 | P1 | P2 | P3 | P0 | P1 | P2 | P3 |P0 | P1 | P2 | P3 |
11886bdf9cSHuisong Li  */
12886bdf9cSHuisong Li 
13886bdf9cSHuisong Li /*
14886bdf9cSHuisong Li  * This value cannot be 255, otherwise the loop of the multi-BD communication
15886bdf9cSHuisong Li  * case cannot end.
16886bdf9cSHuisong Li  */
17886bdf9cSHuisong Li #define HCCS_DIE_MAX_PORT_ID	254
18886bdf9cSHuisong Li 
19886bdf9cSHuisong Li struct hccs_port_info {
20886bdf9cSHuisong Li 	u8 port_id;
21886bdf9cSHuisong Li 	u8 port_type;
22886bdf9cSHuisong Li 	u8 lane_mode;
23886bdf9cSHuisong Li 	bool enable; /* if the port is enabled */
2447f7a255SHuisong Li 	struct kobject kobj;
2547f7a255SHuisong Li 	bool dir_created;
26886bdf9cSHuisong Li 	struct hccs_die_info *die; /* point to the die the port is located */
27886bdf9cSHuisong Li };
28886bdf9cSHuisong Li 
29886bdf9cSHuisong Li struct hccs_die_info {
30886bdf9cSHuisong Li 	u8 die_id;
31886bdf9cSHuisong Li 	u8 port_num;
32886bdf9cSHuisong Li 	u8 min_port_id;
33886bdf9cSHuisong Li 	u8 max_port_id;
34886bdf9cSHuisong Li 	struct hccs_port_info *ports;
3547f7a255SHuisong Li 	struct kobject kobj;
3647f7a255SHuisong Li 	bool dir_created;
37886bdf9cSHuisong Li 	struct hccs_chip_info *chip; /* point to the chip the die is located */
38886bdf9cSHuisong Li };
39886bdf9cSHuisong Li 
40886bdf9cSHuisong Li struct hccs_chip_info {
41886bdf9cSHuisong Li 	u8 chip_id;
42886bdf9cSHuisong Li 	u8 die_num;
43886bdf9cSHuisong Li 	struct hccs_die_info *dies;
4447f7a255SHuisong Li 	struct kobject kobj;
45886bdf9cSHuisong Li 	struct hccs_dev *hdev;
46886bdf9cSHuisong Li };
47886bdf9cSHuisong Li 
48886bdf9cSHuisong Li struct hccs_mbox_client_info {
49886bdf9cSHuisong Li 	struct mbox_client client;
50886bdf9cSHuisong Li 	struct mbox_chan *mbox_chan;
51886bdf9cSHuisong Li 	struct pcc_mbox_chan *pcc_chan;
52886bdf9cSHuisong Li 	u64 deadline_us;
537d661283SHuisong Li 	void __iomem *pcc_comm_addr;
54*be2f78a8SHuisong Li 	struct completion done;
55*be2f78a8SHuisong Li };
56*be2f78a8SHuisong Li 
57*be2f78a8SHuisong Li struct hccs_desc;
58*be2f78a8SHuisong Li 
59*be2f78a8SHuisong Li struct hccs_verspecific_data {
60*be2f78a8SHuisong Li 	void (*rx_callback)(struct mbox_client *cl, void *mssg);
61*be2f78a8SHuisong Li 	int (*wait_cmd_complete)(struct hccs_dev *hdev);
62*be2f78a8SHuisong Li 	void (*fill_pcc_shared_mem)(struct hccs_dev *hdev,
63*be2f78a8SHuisong Li 				    u8 cmd, struct hccs_desc *desc,
64*be2f78a8SHuisong Li 				    void __iomem *comm_space,
65*be2f78a8SHuisong Li 				    u16 space_size);
66*be2f78a8SHuisong Li 	u16 shared_mem_size;
67*be2f78a8SHuisong Li 	bool has_txdone_irq;
68886bdf9cSHuisong Li };
69886bdf9cSHuisong Li 
70886bdf9cSHuisong Li struct hccs_dev {
71886bdf9cSHuisong Li 	struct device *dev;
72886bdf9cSHuisong Li 	struct acpi_device *acpi_dev;
73*be2f78a8SHuisong Li 	const struct hccs_verspecific_data *verspec_data;
74886bdf9cSHuisong Li 	u64 caps;
75886bdf9cSHuisong Li 	u8 chip_num;
76886bdf9cSHuisong Li 	struct hccs_chip_info *chips;
77886bdf9cSHuisong Li 	u8 chan_id;
78886bdf9cSHuisong Li 	struct mutex lock;
79886bdf9cSHuisong Li 	struct hccs_mbox_client_info cl_info;
80886bdf9cSHuisong Li };
81886bdf9cSHuisong Li 
82886bdf9cSHuisong Li #define HCCS_SERDES_MODULE_CODE 0x32
83886bdf9cSHuisong Li enum hccs_subcmd_type {
84886bdf9cSHuisong Li 	HCCS_GET_CHIP_NUM = 0x1,
85886bdf9cSHuisong Li 	HCCS_GET_DIE_NUM,
86886bdf9cSHuisong Li 	HCCS_GET_DIE_INFO,
87886bdf9cSHuisong Li 	HCCS_GET_DIE_PORT_INFO,
88886bdf9cSHuisong Li 	HCCS_GET_DEV_CAP,
89886bdf9cSHuisong Li 	HCCS_GET_PORT_LINK_STATUS,
90886bdf9cSHuisong Li 	HCCS_GET_PORT_CRC_ERR_CNT,
91886bdf9cSHuisong Li 	HCCS_GET_DIE_PORTS_LANE_STA,
92886bdf9cSHuisong Li 	HCCS_GET_DIE_PORTS_LINK_STA,
93886bdf9cSHuisong Li 	HCCS_GET_DIE_PORTS_CRC_ERR_CNT,
94886bdf9cSHuisong Li 	HCCS_SUB_CMD_MAX = 255,
95886bdf9cSHuisong Li };
96886bdf9cSHuisong Li 
97886bdf9cSHuisong Li struct hccs_die_num_req_param {
98886bdf9cSHuisong Li 	u8 chip_id;
99886bdf9cSHuisong Li };
100886bdf9cSHuisong Li 
101886bdf9cSHuisong Li struct hccs_die_info_req_param {
102886bdf9cSHuisong Li 	u8 chip_id;
103886bdf9cSHuisong Li 	u8 die_idx;
104886bdf9cSHuisong Li };
105886bdf9cSHuisong Li 
106886bdf9cSHuisong Li struct hccs_die_info_rsp_data {
107886bdf9cSHuisong Li 	u8 die_id;
108886bdf9cSHuisong Li 	u8 port_num;
109886bdf9cSHuisong Li 	u8 min_port_id;
110886bdf9cSHuisong Li 	u8 max_port_id;
111886bdf9cSHuisong Li };
112886bdf9cSHuisong Li 
113886bdf9cSHuisong Li struct hccs_port_attr {
114886bdf9cSHuisong Li 	u8 port_id;
115886bdf9cSHuisong Li 	u8 port_type;
116886bdf9cSHuisong Li 	u8 lane_mode;
117886bdf9cSHuisong Li 	u8 enable : 1; /* if the port is enabled */
118886bdf9cSHuisong Li 	u16 rsv[2];
119886bdf9cSHuisong Li };
120886bdf9cSHuisong Li 
121886bdf9cSHuisong Li /*
122886bdf9cSHuisong Li  * The common command request for getting the information of all HCCS port on
123886bdf9cSHuisong Li  * specified DIE.
124886bdf9cSHuisong Li  */
125886bdf9cSHuisong Li struct hccs_die_comm_req_param {
126886bdf9cSHuisong Li 	u8 chip_id;
127886bdf9cSHuisong Li 	u8 die_id; /* id in hardware */
128886bdf9cSHuisong Li };
129886bdf9cSHuisong Li 
13047f7a255SHuisong Li /* The common command request for getting the information of a specific port */
13147f7a255SHuisong Li struct hccs_port_comm_req_param {
13247f7a255SHuisong Li 	u8 chip_id;
13347f7a255SHuisong Li 	u8 die_id;
13447f7a255SHuisong Li 	u8 port_id;
13547f7a255SHuisong Li };
13647f7a255SHuisong Li 
13747f7a255SHuisong Li #define HCCS_PORT_RESET         1
13847f7a255SHuisong Li #define HCCS_PORT_SETUP         2
13947f7a255SHuisong Li #define HCCS_PORT_CONFIG        3
14047f7a255SHuisong Li #define HCCS_PORT_READY         4
14147f7a255SHuisong Li struct hccs_link_status {
14247f7a255SHuisong Li 	u8 lane_mask; /* indicate which lanes are used. */
14347f7a255SHuisong Li 	u8 link_fsm : 3; /* link fsm, 1: reset 2: setup 3: config 4: link-up */
14447f7a255SHuisong Li 	u8 lane_num : 5; /* current lane number */
14547f7a255SHuisong Li };
14647f7a255SHuisong Li 
147886bdf9cSHuisong Li struct hccs_req_head {
148886bdf9cSHuisong Li 	u8 module_code; /* set to 0x32 for serdes */
149886bdf9cSHuisong Li 	u8 start_id;
150886bdf9cSHuisong Li 	u8 rsv[2];
151886bdf9cSHuisong Li };
152886bdf9cSHuisong Li 
153886bdf9cSHuisong Li struct hccs_rsp_head {
154886bdf9cSHuisong Li 	u8 data_len;
155886bdf9cSHuisong Li 	u8 next_id;
156886bdf9cSHuisong Li 	u8 rsv[2];
157886bdf9cSHuisong Li };
158886bdf9cSHuisong Li 
159886bdf9cSHuisong Li struct hccs_fw_inner_head {
160886bdf9cSHuisong Li 	u8 retStatus; /* 0: success, other: failure */
161886bdf9cSHuisong Li 	u8 rsv[7];
162886bdf9cSHuisong Li };
163886bdf9cSHuisong Li 
164886bdf9cSHuisong Li #define HCCS_PCC_SHARE_MEM_BYTES	64
165886bdf9cSHuisong Li #define HCCS_FW_INNER_HEAD_BYTES	8
166886bdf9cSHuisong Li #define HCCS_RSP_HEAD_BYTES		4
167886bdf9cSHuisong Li 
168886bdf9cSHuisong Li #define HCCS_MAX_RSP_DATA_BYTES		(HCCS_PCC_SHARE_MEM_BYTES - \
169886bdf9cSHuisong Li 					 HCCS_FW_INNER_HEAD_BYTES - \
170886bdf9cSHuisong Li 					 HCCS_RSP_HEAD_BYTES)
171886bdf9cSHuisong Li #define HCCS_MAX_RSP_DATA_SIZE_MAX	(HCCS_MAX_RSP_DATA_BYTES / 4)
172886bdf9cSHuisong Li 
173886bdf9cSHuisong Li /*
174886bdf9cSHuisong Li  * Note: Actual available size of data field also depands on the PCC header
175886bdf9cSHuisong Li  * bytes of the specific type. Driver needs to copy the response data in the
176886bdf9cSHuisong Li  * communication space based on the real length.
177886bdf9cSHuisong Li  */
178886bdf9cSHuisong Li struct hccs_rsp_desc {
179886bdf9cSHuisong Li 	struct hccs_fw_inner_head fw_inner_head; /* 8 Bytes */
180886bdf9cSHuisong Li 	struct hccs_rsp_head rsp_head; /* 4 Bytes */
181886bdf9cSHuisong Li 	u32 data[HCCS_MAX_RSP_DATA_SIZE_MAX];
182886bdf9cSHuisong Li };
183886bdf9cSHuisong Li 
184886bdf9cSHuisong Li #define HCCS_REQ_HEAD_BYTES		4
185886bdf9cSHuisong Li #define HCCS_MAX_REQ_DATA_BYTES		(HCCS_PCC_SHARE_MEM_BYTES - \
186886bdf9cSHuisong Li 					 HCCS_REQ_HEAD_BYTES)
187886bdf9cSHuisong Li #define HCCS_MAX_REQ_DATA_SIZE_MAX	(HCCS_MAX_REQ_DATA_BYTES / 4)
188886bdf9cSHuisong Li 
189886bdf9cSHuisong Li /*
190886bdf9cSHuisong Li  * Note: Actual available size of data field also depands on the PCC header
191886bdf9cSHuisong Li  * bytes of the specific type. Driver needs to copy the request data to the
192886bdf9cSHuisong Li  * communication space based on the real length.
193886bdf9cSHuisong Li  */
194886bdf9cSHuisong Li struct hccs_req_desc {
195886bdf9cSHuisong Li 	struct hccs_req_head req_head; /* 4 Bytes */
196886bdf9cSHuisong Li 	u32 data[HCCS_MAX_REQ_DATA_SIZE_MAX];
197886bdf9cSHuisong Li };
198886bdf9cSHuisong Li 
199886bdf9cSHuisong Li struct hccs_desc {
200886bdf9cSHuisong Li 	union {
201886bdf9cSHuisong Li 		struct hccs_req_desc req;
202886bdf9cSHuisong Li 		struct hccs_rsp_desc rsp;
203886bdf9cSHuisong Li 	};
204886bdf9cSHuisong Li };
205886bdf9cSHuisong Li 
206886bdf9cSHuisong Li #endif /* __KUNPENG_HCCS_H__ */
207