| 310 | } |
| 311 | |
| 312 | int |
| 313 | rte_bbdev_setup_queues(uint16_t dev_id, uint16_t num_queues, int socket_id) |
| 314 | { |
| 315 | unsigned int i; |
| 316 | int ret; |
| 317 | struct rte_bbdev_driver_info dev_info; |
| 318 | struct rte_bbdev *dev = get_dev(dev_id); |
| 319 | VALID_DEV_OR_RET_ERR(dev, dev_id); |
| 320 | |
| 321 | VALID_DEV_OPS_OR_RET_ERR(dev, dev_id); |
| 322 | |
| 323 | if (dev->data->started) { |
| 324 | rte_bbdev_log(ERR, |
| 325 | "Device %u cannot be configured when started", |
| 326 | dev_id); |
| 327 | return -EBUSY; |
| 328 | } |
| 329 | |
| 330 | /* Get device driver information to get max number of queues */ |
| 331 | VALID_FUNC_OR_RET_ERR(dev->dev_ops->info_get, dev_id); |
| 332 | memset(&dev_info, 0, sizeof(dev_info)); |
| 333 | dev->dev_ops->info_get(dev, &dev_info); |
| 334 | |
| 335 | if ((num_queues == 0) || (num_queues > dev_info.max_num_queues)) { |
| 336 | rte_bbdev_log(ERR, |
| 337 | "Device %u supports 0 < N <= %u queues, not %u", |
| 338 | dev_id, dev_info.max_num_queues, num_queues); |
| 339 | return -EINVAL; |
| 340 | } |
| 341 | |
| 342 | /* If re-configuration, get driver to free existing internal memory */ |
| 343 | if (dev->data->queues != NULL) { |
| 344 | VALID_FUNC_OR_RET_ERR(dev->dev_ops->queue_release, dev_id); |
| 345 | for (i = 0; i < dev->data->num_queues; i++) { |
| 346 | int ret = dev->dev_ops->queue_release(dev, i); |
| 347 | if (ret < 0) { |
| 348 | rte_bbdev_log(ERR, |
| 349 | "Device %u queue %u release failed", |
| 350 | dev_id, i); |
| 351 | return ret; |
| 352 | } |
| 353 | } |
| 354 | /* Call optional device close */ |
| 355 | if (dev->dev_ops->close) { |
| 356 | ret = dev->dev_ops->close(dev); |
| 357 | if (ret < 0) { |
| 358 | rte_bbdev_log(ERR, |
| 359 | "Device %u couldn't be closed", |
| 360 | dev_id); |
| 361 | return ret; |
| 362 | } |
| 363 | } |
| 364 | rte_free(dev->data->queues); |
| 365 | } |
| 366 | |
| 367 | /* Allocate queue pointers */ |
| 368 | dev->data->queues = rte_calloc_socket(DEV_NAME, num_queues, |
| 369 | sizeof(dev->data->queues[0]), RTE_CACHE_LINE_SIZE, |