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