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