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 19 struct 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 29 struct 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 40 struct 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 48 struct 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 struct completion done; 55 }; 56 57 struct hccs_desc; 58 59 struct hccs_verspecific_data { 60 void (*rx_callback)(struct mbox_client *cl, void *mssg); 61 int (*wait_cmd_complete)(struct hccs_dev *hdev); 62 void (*fill_pcc_shared_mem)(struct hccs_dev *hdev, 63 u8 cmd, struct hccs_desc *desc, 64 void __iomem *comm_space, 65 u16 space_size); 66 u16 shared_mem_size; 67 bool has_txdone_irq; 68 }; 69 70 struct hccs_dev { 71 struct device *dev; 72 struct acpi_device *acpi_dev; 73 const struct hccs_verspecific_data *verspec_data; 74 u64 caps; 75 u8 chip_num; 76 struct hccs_chip_info *chips; 77 u8 chan_id; 78 struct mutex lock; 79 struct hccs_mbox_client_info cl_info; 80 }; 81 82 #define HCCS_SERDES_MODULE_CODE 0x32 83 enum hccs_subcmd_type { 84 HCCS_GET_CHIP_NUM = 0x1, 85 HCCS_GET_DIE_NUM, 86 HCCS_GET_DIE_INFO, 87 HCCS_GET_DIE_PORT_INFO, 88 HCCS_GET_DEV_CAP, 89 HCCS_GET_PORT_LINK_STATUS, 90 HCCS_GET_PORT_CRC_ERR_CNT, 91 HCCS_GET_DIE_PORTS_LANE_STA, 92 HCCS_GET_DIE_PORTS_LINK_STA, 93 HCCS_GET_DIE_PORTS_CRC_ERR_CNT, 94 HCCS_SUB_CMD_MAX = 255, 95 }; 96 97 struct hccs_die_num_req_param { 98 u8 chip_id; 99 }; 100 101 struct hccs_die_info_req_param { 102 u8 chip_id; 103 u8 die_idx; 104 }; 105 106 struct hccs_die_info_rsp_data { 107 u8 die_id; 108 u8 port_num; 109 u8 min_port_id; 110 u8 max_port_id; 111 }; 112 113 struct hccs_port_attr { 114 u8 port_id; 115 u8 port_type; 116 u8 lane_mode; 117 u8 enable : 1; /* if the port is enabled */ 118 u16 rsv[2]; 119 }; 120 121 /* 122 * The common command request for getting the information of all HCCS port on 123 * specified DIE. 124 */ 125 struct hccs_die_comm_req_param { 126 u8 chip_id; 127 u8 die_id; /* id in hardware */ 128 }; 129 130 /* The common command request for getting the information of a specific port */ 131 struct hccs_port_comm_req_param { 132 u8 chip_id; 133 u8 die_id; 134 u8 port_id; 135 }; 136 137 #define HCCS_PORT_RESET 1 138 #define HCCS_PORT_SETUP 2 139 #define HCCS_PORT_CONFIG 3 140 #define HCCS_PORT_READY 4 141 struct hccs_link_status { 142 u8 lane_mask; /* indicate which lanes are used. */ 143 u8 link_fsm : 3; /* link fsm, 1: reset 2: setup 3: config 4: link-up */ 144 u8 lane_num : 5; /* current lane number */ 145 }; 146 147 struct hccs_req_head { 148 u8 module_code; /* set to 0x32 for serdes */ 149 u8 start_id; 150 u8 rsv[2]; 151 }; 152 153 struct hccs_rsp_head { 154 u8 data_len; 155 u8 next_id; 156 u8 rsv[2]; 157 }; 158 159 struct hccs_fw_inner_head { 160 u8 retStatus; /* 0: success, other: failure */ 161 u8 rsv[7]; 162 }; 163 164 #define HCCS_PCC_SHARE_MEM_BYTES 64 165 #define HCCS_FW_INNER_HEAD_BYTES 8 166 #define HCCS_RSP_HEAD_BYTES 4 167 168 #define HCCS_MAX_RSP_DATA_BYTES (HCCS_PCC_SHARE_MEM_BYTES - \ 169 HCCS_FW_INNER_HEAD_BYTES - \ 170 HCCS_RSP_HEAD_BYTES) 171 #define HCCS_MAX_RSP_DATA_SIZE_MAX (HCCS_MAX_RSP_DATA_BYTES / 4) 172 173 /* 174 * Note: Actual available size of data field also depands on the PCC header 175 * bytes of the specific type. Driver needs to copy the response data in the 176 * communication space based on the real length. 177 */ 178 struct hccs_rsp_desc { 179 struct hccs_fw_inner_head fw_inner_head; /* 8 Bytes */ 180 struct hccs_rsp_head rsp_head; /* 4 Bytes */ 181 u32 data[HCCS_MAX_RSP_DATA_SIZE_MAX]; 182 }; 183 184 #define HCCS_REQ_HEAD_BYTES 4 185 #define HCCS_MAX_REQ_DATA_BYTES (HCCS_PCC_SHARE_MEM_BYTES - \ 186 HCCS_REQ_HEAD_BYTES) 187 #define HCCS_MAX_REQ_DATA_SIZE_MAX (HCCS_MAX_REQ_DATA_BYTES / 4) 188 189 /* 190 * Note: Actual available size of data field also depands on the PCC header 191 * bytes of the specific type. Driver needs to copy the request data to the 192 * communication space based on the real length. 193 */ 194 struct hccs_req_desc { 195 struct hccs_req_head req_head; /* 4 Bytes */ 196 u32 data[HCCS_MAX_REQ_DATA_SIZE_MAX]; 197 }; 198 199 struct hccs_desc { 200 union { 201 struct hccs_req_desc req; 202 struct hccs_rsp_desc rsp; 203 }; 204 }; 205 206 #endif /* __KUNPENG_HCCS_H__ */ 207