162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/* Copyright (c) 2023 Hisilicon Limited. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __KUNPENG_HCCS_H__
562306a36Sopenharmony_ci#define __KUNPENG_HCCS_H__
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci * |---------------  Chip0  ---------------|----------------  ChipN  -------------|
962306a36Sopenharmony_ci * |--------Die0-------|--------DieN-------|--------Die0-------|-------DieN-------|
1062306a36Sopenharmony_ci * | P0 | P1 | P2 | P3 | P0 | P1 | P2 | P3 | P0 | P1 | P2 | P3 |P0 | P1 | P2 | P3 |
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci * This value cannot be 255, otherwise the loop of the multi-BD communication
1562306a36Sopenharmony_ci * case cannot end.
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci#define HCCS_DIE_MAX_PORT_ID	254
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct hccs_port_info {
2062306a36Sopenharmony_ci	u8 port_id;
2162306a36Sopenharmony_ci	u8 port_type;
2262306a36Sopenharmony_ci	u8 lane_mode;
2362306a36Sopenharmony_ci	bool enable; /* if the port is enabled */
2462306a36Sopenharmony_ci	struct kobject kobj;
2562306a36Sopenharmony_ci	bool dir_created;
2662306a36Sopenharmony_ci	struct hccs_die_info *die; /* point to the die the port is located */
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct hccs_die_info {
3062306a36Sopenharmony_ci	u8 die_id;
3162306a36Sopenharmony_ci	u8 port_num;
3262306a36Sopenharmony_ci	u8 min_port_id;
3362306a36Sopenharmony_ci	u8 max_port_id;
3462306a36Sopenharmony_ci	struct hccs_port_info *ports;
3562306a36Sopenharmony_ci	struct kobject kobj;
3662306a36Sopenharmony_ci	bool dir_created;
3762306a36Sopenharmony_ci	struct hccs_chip_info *chip; /* point to the chip the die is located */
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct hccs_chip_info {
4162306a36Sopenharmony_ci	u8 chip_id;
4262306a36Sopenharmony_ci	u8 die_num;
4362306a36Sopenharmony_ci	struct hccs_die_info *dies;
4462306a36Sopenharmony_ci	struct kobject kobj;
4562306a36Sopenharmony_ci	struct hccs_dev *hdev;
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct hccs_mbox_client_info {
4962306a36Sopenharmony_ci	struct mbox_client client;
5062306a36Sopenharmony_ci	struct mbox_chan *mbox_chan;
5162306a36Sopenharmony_ci	struct pcc_mbox_chan *pcc_chan;
5262306a36Sopenharmony_ci	u64 deadline_us;
5362306a36Sopenharmony_ci	void __iomem *pcc_comm_addr;
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistruct hccs_dev {
5762306a36Sopenharmony_ci	struct device *dev;
5862306a36Sopenharmony_ci	struct acpi_device *acpi_dev;
5962306a36Sopenharmony_ci	u64 caps;
6062306a36Sopenharmony_ci	u8 chip_num;
6162306a36Sopenharmony_ci	struct hccs_chip_info *chips;
6262306a36Sopenharmony_ci	u8 chan_id;
6362306a36Sopenharmony_ci	struct mutex lock;
6462306a36Sopenharmony_ci	struct hccs_mbox_client_info cl_info;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define HCCS_SERDES_MODULE_CODE 0x32
6862306a36Sopenharmony_cienum hccs_subcmd_type {
6962306a36Sopenharmony_ci	HCCS_GET_CHIP_NUM = 0x1,
7062306a36Sopenharmony_ci	HCCS_GET_DIE_NUM,
7162306a36Sopenharmony_ci	HCCS_GET_DIE_INFO,
7262306a36Sopenharmony_ci	HCCS_GET_DIE_PORT_INFO,
7362306a36Sopenharmony_ci	HCCS_GET_DEV_CAP,
7462306a36Sopenharmony_ci	HCCS_GET_PORT_LINK_STATUS,
7562306a36Sopenharmony_ci	HCCS_GET_PORT_CRC_ERR_CNT,
7662306a36Sopenharmony_ci	HCCS_GET_DIE_PORTS_LANE_STA,
7762306a36Sopenharmony_ci	HCCS_GET_DIE_PORTS_LINK_STA,
7862306a36Sopenharmony_ci	HCCS_GET_DIE_PORTS_CRC_ERR_CNT,
7962306a36Sopenharmony_ci	HCCS_SUB_CMD_MAX = 255,
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistruct hccs_die_num_req_param {
8362306a36Sopenharmony_ci	u8 chip_id;
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistruct hccs_die_info_req_param {
8762306a36Sopenharmony_ci	u8 chip_id;
8862306a36Sopenharmony_ci	u8 die_idx;
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistruct hccs_die_info_rsp_data {
9262306a36Sopenharmony_ci	u8 die_id;
9362306a36Sopenharmony_ci	u8 port_num;
9462306a36Sopenharmony_ci	u8 min_port_id;
9562306a36Sopenharmony_ci	u8 max_port_id;
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistruct hccs_port_attr {
9962306a36Sopenharmony_ci	u8 port_id;
10062306a36Sopenharmony_ci	u8 port_type;
10162306a36Sopenharmony_ci	u8 lane_mode;
10262306a36Sopenharmony_ci	u8 enable : 1; /* if the port is enabled */
10362306a36Sopenharmony_ci	u16 rsv[2];
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/*
10762306a36Sopenharmony_ci * The common command request for getting the information of all HCCS port on
10862306a36Sopenharmony_ci * specified DIE.
10962306a36Sopenharmony_ci */
11062306a36Sopenharmony_cistruct hccs_die_comm_req_param {
11162306a36Sopenharmony_ci	u8 chip_id;
11262306a36Sopenharmony_ci	u8 die_id; /* id in hardware */
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* The common command request for getting the information of a specific port */
11662306a36Sopenharmony_cistruct hccs_port_comm_req_param {
11762306a36Sopenharmony_ci	u8 chip_id;
11862306a36Sopenharmony_ci	u8 die_id;
11962306a36Sopenharmony_ci	u8 port_id;
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#define HCCS_PORT_RESET         1
12362306a36Sopenharmony_ci#define HCCS_PORT_SETUP         2
12462306a36Sopenharmony_ci#define HCCS_PORT_CONFIG        3
12562306a36Sopenharmony_ci#define HCCS_PORT_READY         4
12662306a36Sopenharmony_cistruct hccs_link_status {
12762306a36Sopenharmony_ci	u8 lane_mask; /* indicate which lanes are used. */
12862306a36Sopenharmony_ci	u8 link_fsm : 3; /* link fsm, 1: reset 2: setup 3: config 4: link-up */
12962306a36Sopenharmony_ci	u8 lane_num : 5; /* current lane number */
13062306a36Sopenharmony_ci};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistruct hccs_req_head {
13362306a36Sopenharmony_ci	u8 module_code; /* set to 0x32 for serdes */
13462306a36Sopenharmony_ci	u8 start_id;
13562306a36Sopenharmony_ci	u8 rsv[2];
13662306a36Sopenharmony_ci};
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cistruct hccs_rsp_head {
13962306a36Sopenharmony_ci	u8 data_len;
14062306a36Sopenharmony_ci	u8 next_id;
14162306a36Sopenharmony_ci	u8 rsv[2];
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cistruct hccs_fw_inner_head {
14562306a36Sopenharmony_ci	u8 retStatus; /* 0: success, other: failure */
14662306a36Sopenharmony_ci	u8 rsv[7];
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci#define HCCS_PCC_SHARE_MEM_BYTES	64
15062306a36Sopenharmony_ci#define HCCS_FW_INNER_HEAD_BYTES	8
15162306a36Sopenharmony_ci#define HCCS_RSP_HEAD_BYTES		4
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define HCCS_MAX_RSP_DATA_BYTES		(HCCS_PCC_SHARE_MEM_BYTES - \
15462306a36Sopenharmony_ci					 HCCS_FW_INNER_HEAD_BYTES - \
15562306a36Sopenharmony_ci					 HCCS_RSP_HEAD_BYTES)
15662306a36Sopenharmony_ci#define HCCS_MAX_RSP_DATA_SIZE_MAX	(HCCS_MAX_RSP_DATA_BYTES / 4)
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/*
15962306a36Sopenharmony_ci * Note: Actual available size of data field also depands on the PCC header
16062306a36Sopenharmony_ci * bytes of the specific type. Driver needs to copy the response data in the
16162306a36Sopenharmony_ci * communication space based on the real length.
16262306a36Sopenharmony_ci */
16362306a36Sopenharmony_cistruct hccs_rsp_desc {
16462306a36Sopenharmony_ci	struct hccs_fw_inner_head fw_inner_head; /* 8 Bytes */
16562306a36Sopenharmony_ci	struct hccs_rsp_head rsp_head; /* 4 Bytes */
16662306a36Sopenharmony_ci	u32 data[HCCS_MAX_RSP_DATA_SIZE_MAX];
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#define HCCS_REQ_HEAD_BYTES		4
17062306a36Sopenharmony_ci#define HCCS_MAX_REQ_DATA_BYTES		(HCCS_PCC_SHARE_MEM_BYTES - \
17162306a36Sopenharmony_ci					 HCCS_REQ_HEAD_BYTES)
17262306a36Sopenharmony_ci#define HCCS_MAX_REQ_DATA_SIZE_MAX	(HCCS_MAX_REQ_DATA_BYTES / 4)
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci/*
17562306a36Sopenharmony_ci * Note: Actual available size of data field also depands on the PCC header
17662306a36Sopenharmony_ci * bytes of the specific type. Driver needs to copy the request data to the
17762306a36Sopenharmony_ci * communication space based on the real length.
17862306a36Sopenharmony_ci */
17962306a36Sopenharmony_cistruct hccs_req_desc {
18062306a36Sopenharmony_ci	struct hccs_req_head req_head; /* 4 Bytes */
18162306a36Sopenharmony_ci	u32 data[HCCS_MAX_REQ_DATA_SIZE_MAX];
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cistruct hccs_desc {
18562306a36Sopenharmony_ci	union {
18662306a36Sopenharmony_ci		struct hccs_req_desc req;
18762306a36Sopenharmony_ci		struct hccs_rsp_desc rsp;
18862306a36Sopenharmony_ci	};
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci#endif /* __KUNPENG_HCCS_H__ */
192