Lines Matching full:ring

52 adf_reserve_ring(struct adf_etr_bank_data *bank, u32 ring)  in adf_reserve_ring()  argument
55 if (bank->ring_mask & (1 << ring)) { in adf_reserve_ring()
59 bank->ring_mask |= (1 << ring); in adf_reserve_ring()
65 adf_unreserve_ring(struct adf_etr_bank_data *bank, u32 ring) in adf_unreserve_ring() argument
68 bank->ring_mask &= ~(1 << ring); in adf_unreserve_ring()
73 adf_enable_ring_irq(struct adf_etr_bank_data *bank, u32 ring) in adf_enable_ring_irq() argument
82 bank->irq_mask |= (1 << ring); in adf_enable_ring_irq()
94 adf_disable_ring_irq(struct adf_etr_bank_data *bank, u32 ring) in adf_disable_ring_irq() argument
99 bank->irq_mask &= ~(1 << ring); in adf_disable_ring_irq()
107 adf_send_message(struct adf_etr_ring_data *ring, u32 *msg) in adf_send_message() argument
109 struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(ring->bank->accel_dev); in adf_send_message()
112 if (atomic_add_return(1, ring->inflights) > ring->max_inflights) { in adf_send_message()
113 atomic_dec(ring->inflights); in adf_send_message()
117 msg_size = ADF_MSG_SIZE_TO_BYTES(ring->msg_size); in adf_send_message()
118 mtx_lock(&ring->lock); in adf_send_message()
119 memcpy((void *)((uintptr_t)ring->base_addr + ring->tail), in adf_send_message()
123 ring->tail = adf_modulo(ring->tail + msg_size, in adf_send_message()
124 ADF_RING_SIZE_MODULO(ring->ring_size)); in adf_send_message()
126 csr_ops->write_csr_ring_tail(ring->bank->csr_addr, in adf_send_message()
127 ring->bank->bank_number, in adf_send_message()
128 ring->ring_number, in adf_send_message()
129 ring->tail); in adf_send_message()
130 ring->csr_tail_offset = ring->tail; in adf_send_message()
131 mtx_unlock(&ring->lock); in adf_send_message()
136 adf_handle_response(struct adf_etr_ring_data *ring, u32 quota) in adf_handle_response() argument
138 struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(ring->bank->accel_dev); in adf_handle_response()
140 u32 *msg = (u32 *)((uintptr_t)ring->base_addr + ring->head); in adf_handle_response()
146 ring->callback((u32 *)msg); in adf_handle_response()
147 atomic_dec(ring->inflights); in adf_handle_response()
149 ring->head = in adf_handle_response()
150 adf_modulo(ring->head + in adf_handle_response()
151 ADF_MSG_SIZE_TO_BYTES(ring->msg_size), in adf_handle_response()
152 ADF_RING_SIZE_MODULO(ring->ring_size)); in adf_handle_response()
154 msg = (u32 *)((uintptr_t)ring->base_addr + ring->head); in adf_handle_response()
157 csr_ops->write_csr_ring_head(ring->bank->csr_addr, in adf_handle_response()
158 ring->bank->bank_number, in adf_handle_response()
159 ring->ring_number, in adf_handle_response()
160 ring->head); in adf_handle_response()
171 struct adf_etr_ring_data *ring; in adf_poll_bank() local
192 /* Read the ring status CSR to determine which rings are empty. */ in adf_poll_bank()
208 * The ring structure is global to all in adf_poll_bank()
210 * bank we use ring_number to get the global ring. in adf_poll_bank()
214 ring = &bank->rings[ring_num]; in adf_poll_bank()
216 /* And with polling ring mask. in adf_poll_bank()
217 * If the there is no data on this ring in adf_poll_bank()
220 if (!(rings_not_empty & (1 << ring->ring_number))) in adf_poll_bank()
223 /* Poll the ring. */ in adf_poll_bank()
224 num_resp = adf_handle_response(ring, quota); in adf_poll_bank()
284 adf_configure_tx_ring(struct adf_etr_ring_data *ring) in adf_configure_tx_ring() argument
286 struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(ring->bank->accel_dev); in adf_configure_tx_ring()
287 u32 ring_config = BUILD_RING_CONFIG(ring->ring_size); in adf_configure_tx_ring()
289 csr_ops->write_csr_ring_config(ring->bank->csr_addr, in adf_configure_tx_ring()
290 ring->bank->bank_number, in adf_configure_tx_ring()
291 ring->ring_number, in adf_configure_tx_ring()
296 adf_configure_rx_ring(struct adf_etr_ring_data *ring) in adf_configure_rx_ring() argument
298 struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(ring->bank->accel_dev); in adf_configure_rx_ring()
299 u32 ring_config = BUILD_RESP_RING_CONFIG(ring->ring_size, in adf_configure_rx_ring()
303 csr_ops->write_csr_ring_config(ring->bank->csr_addr, in adf_configure_rx_ring()
304 ring->bank->bank_number, in adf_configure_rx_ring()
305 ring->ring_number, in adf_configure_rx_ring()
310 adf_init_ring(struct adf_etr_ring_data *ring) in adf_init_ring() argument
312 struct adf_etr_bank_data *bank = ring->bank; in adf_init_ring()
317 u32 ring_size_bytes = ADF_SIZE_TO_RING_SIZE_IN_BYTES(ring->ring_size); in adf_init_ring()
322 ret = bus_dma_mem_create(&ring->dma_mem, in adf_init_ring()
330 ring->base_addr = ring->dma_mem.dma_vaddr; in adf_init_ring()
331 ring->dma_addr = ring->dma_mem.dma_baddr; in adf_init_ring()
333 memset(ring->base_addr, 0x7F, ring_size_bytes); in adf_init_ring()
335 if (adf_check_ring_alignment(ring->dma_addr, ring_size_bytes)) { in adf_init_ring()
336 device_printf(GET_DEV(accel_dev), "Ring address not aligned\n"); in adf_init_ring()
337 bus_dma_mem_free(&ring->dma_mem); in adf_init_ring()
338 ring->base_addr = NULL; in adf_init_ring()
342 if (hw_data->tx_rings_mask & (1 << ring->ring_number)) in adf_init_ring()
343 adf_configure_tx_ring(ring); in adf_init_ring()
345 adf_configure_rx_ring(ring); in adf_init_ring()
348 csr_ops->build_csr_ring_base_addr(ring->dma_addr, ring->ring_size); in adf_init_ring()
349 csr_ops->write_csr_ring_base(ring->bank->csr_addr, in adf_init_ring()
350 ring->bank->bank_number, in adf_init_ring()
351 ring->ring_number, in adf_init_ring()
353 mtx_init(&ring->lock, "adf bank", NULL, MTX_DEF); in adf_init_ring()
358 adf_cleanup_ring(struct adf_etr_ring_data *ring) in adf_cleanup_ring() argument
360 u32 ring_size_bytes = ADF_SIZE_TO_RING_SIZE_IN_BYTES(ring->ring_size); in adf_cleanup_ring()
363 if (ring->base_addr) { in adf_cleanup_ring()
364 explicit_bzero(ring->base_addr, ring_size_bytes); in adf_cleanup_ring()
365 bus_dma_mem_free(&ring->dma_mem); in adf_cleanup_ring()
367 mtx_destroy(&ring->lock); in adf_cleanup_ring()
383 struct adf_etr_ring_data *ring; in adf_create_ring() local
400 "Invalid ring size for given msg size\n"); in adf_create_ring()
411 device_printf(GET_DEV(accel_dev), "Can't get ring number\n"); in adf_create_ring()
415 device_printf(GET_DEV(accel_dev), "Invalid ring number\n"); in adf_create_ring()
422 "Ring %d, %s already exists.\n", in adf_create_ring()
427 ring = &bank->rings[ring_num]; in adf_create_ring()
428 ring->ring_number = ring_num; in adf_create_ring()
429 ring->bank = bank; in adf_create_ring()
430 ring->callback = callback; in adf_create_ring()
431 ring->msg_size = ADF_BYTES_TO_MSG_SIZE(msg_size); in adf_create_ring()
432 ring->ring_size = adf_verify_ring_size(msg_size, num_msgs); in adf_create_ring()
433 ring->max_inflights = in adf_create_ring()
434 ADF_MAX_INFLIGHTS(ring->ring_size, ring->msg_size); in adf_create_ring()
435 ring->head = 0; in adf_create_ring()
436 ring->tail = 0; in adf_create_ring()
437 ring->csr_tail_offset = 0; in adf_create_ring()
438 ret = adf_init_ring(ring); in adf_create_ring()
442 /* Enable HW arbitration for the given ring */ in adf_create_ring()
443 adf_update_ring_arb(ring); in adf_create_ring()
445 if (adf_ring_debugfs_add(ring, ring_name)) { in adf_create_ring()
447 "Couldn't add ring debugfs entry\n"); in adf_create_ring()
454 adf_enable_ring_irq(bank, ring->ring_number); in adf_create_ring()
455 *ring_ptr = ring; in adf_create_ring()
458 adf_cleanup_ring(ring); in adf_create_ring()
460 adf_update_ring_arb(ring); in adf_create_ring()
465 adf_remove_ring(struct adf_etr_ring_data *ring) in adf_remove_ring() argument
467 struct adf_etr_bank_data *bank = ring->bank; in adf_remove_ring()
470 /* Disable interrupts for the given ring */ in adf_remove_ring()
471 adf_disable_ring_irq(bank, ring->ring_number); in adf_remove_ring()
476 ring->ring_number, in adf_remove_ring()
480 ring->ring_number, in adf_remove_ring()
482 adf_ring_debugfs_rm(ring); in adf_remove_ring()
483 adf_unreserve_ring(bank, ring->ring_number); in adf_remove_ring()
484 /* Disable HW arbitration for the given ring */ in adf_remove_ring()
485 adf_update_ring_arb(ring); in adf_remove_ring()
486 adf_cleanup_ring(ring); in adf_remove_ring()
578 struct adf_etr_ring_data *ring; in adf_init_bank() local
613 ring = &bank->rings[i]; in adf_init_bank()
615 ring->inflights = in adf_init_bank()
626 ring->inflights = tx_ring->inflights; in adf_init_bank()
641 ring = &bank->rings[i]; in adf_init_bank()
643 kfree(ring->inflights); in adf_init_bank()
644 ring->inflights = NULL; in adf_init_bank()
728 struct adf_etr_ring_data *ring = &bank->rings[i]; in cleanup_bank() local
731 adf_cleanup_ring(ring); in cleanup_bank()
734 kfree(ring->inflights); in cleanup_bank()
735 ring->inflights = NULL; in cleanup_bank()