| 1249 | } |
| 1250 | |
| 1251 | static int ena_com_create_io_sq(struct ena_com_dev *ena_dev, |
| 1252 | struct ena_com_io_sq *io_sq, u16 cq_idx) |
| 1253 | { |
| 1254 | struct ena_com_admin_queue *admin_queue = &ena_dev->admin_queue; |
| 1255 | struct ena_admin_aq_create_sq_cmd create_cmd; |
| 1256 | struct ena_admin_acq_create_sq_resp_desc cmd_completion; |
| 1257 | u8 direction; |
| 1258 | int ret; |
| 1259 | |
| 1260 | memset(&create_cmd, 0x0, sizeof(create_cmd)); |
| 1261 | |
| 1262 | create_cmd.aq_common_descriptor.opcode = ENA_ADMIN_CREATE_SQ; |
| 1263 | |
| 1264 | if (io_sq->direction == ENA_COM_IO_QUEUE_DIRECTION_TX) |
| 1265 | direction = ENA_ADMIN_SQ_DIRECTION_TX; |
| 1266 | else |
| 1267 | direction = ENA_ADMIN_SQ_DIRECTION_RX; |
| 1268 | |
| 1269 | create_cmd.sq_identity |= (direction << |
| 1270 | ENA_ADMIN_AQ_CREATE_SQ_CMD_SQ_DIRECTION_SHIFT) & |
| 1271 | ENA_ADMIN_AQ_CREATE_SQ_CMD_SQ_DIRECTION_MASK; |
| 1272 | |
| 1273 | create_cmd.sq_caps_2 |= io_sq->mem_queue_type & |
| 1274 | ENA_ADMIN_AQ_CREATE_SQ_CMD_PLACEMENT_POLICY_MASK; |
| 1275 | |
| 1276 | create_cmd.sq_caps_2 |= (ENA_ADMIN_COMPLETION_POLICY_DESC << |
| 1277 | ENA_ADMIN_AQ_CREATE_SQ_CMD_COMPLETION_POLICY_SHIFT) & |
| 1278 | ENA_ADMIN_AQ_CREATE_SQ_CMD_COMPLETION_POLICY_MASK; |
| 1279 | |
| 1280 | create_cmd.sq_caps_3 |= |
| 1281 | ENA_ADMIN_AQ_CREATE_SQ_CMD_IS_PHYSICALLY_CONTIGUOUS_MASK; |
| 1282 | |
| 1283 | create_cmd.cq_idx = cq_idx; |
| 1284 | create_cmd.sq_depth = io_sq->q_depth; |
| 1285 | |
| 1286 | if (io_sq->mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_HOST) { |
| 1287 | ret = ena_com_mem_addr_set(ena_dev, |
| 1288 | &create_cmd.sq_ba, |
| 1289 | io_sq->desc_addr.phys_addr); |
| 1290 | if (unlikely(ret)) { |
| 1291 | ena_trc_err(ena_dev, "Memory address set failed\n"); |
| 1292 | return ret; |
| 1293 | } |
| 1294 | } |
| 1295 | |
| 1296 | ret = ena_com_execute_admin_command(admin_queue, |
| 1297 | (struct ena_admin_aq_entry *)&create_cmd, |
| 1298 | sizeof(create_cmd), |
| 1299 | (struct ena_admin_acq_entry *)&cmd_completion, |
| 1300 | sizeof(cmd_completion)); |
| 1301 | if (unlikely(ret)) { |
| 1302 | ena_trc_err(ena_dev, "Failed to create IO SQ. error: %d\n", ret); |
| 1303 | return ret; |
| 1304 | } |
| 1305 | |
| 1306 | io_sq->idx = cmd_completion.sq_idx; |
| 1307 | |
| 1308 | io_sq->db_addr = (u32 __iomem *)((uintptr_t)ena_dev->reg_bar + |
no test coverage detected