1*5c1def83SBjoern A. Zeeb /* SPDX-License-Identifier: BSD-3-Clause-Clear */ 2*5c1def83SBjoern A. Zeeb /* 3*5c1def83SBjoern A. Zeeb * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. 4*5c1def83SBjoern A. Zeeb * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 5*5c1def83SBjoern A. Zeeb */ 6*5c1def83SBjoern A. Zeeb 7*5c1def83SBjoern A. Zeeb #ifndef ATH12K_DBRING_H 8*5c1def83SBjoern A. Zeeb #define ATH12K_DBRING_H 9*5c1def83SBjoern A. Zeeb 10*5c1def83SBjoern A. Zeeb #include <linux/types.h> 11*5c1def83SBjoern A. Zeeb #include <linux/idr.h> 12*5c1def83SBjoern A. Zeeb #include <linux/spinlock.h> 13*5c1def83SBjoern A. Zeeb #include "dp.h" 14*5c1def83SBjoern A. Zeeb 15*5c1def83SBjoern A. Zeeb struct ath12k_dbring_element { 16*5c1def83SBjoern A. Zeeb dma_addr_t paddr; 17*5c1def83SBjoern A. Zeeb u8 payload[]; 18*5c1def83SBjoern A. Zeeb }; 19*5c1def83SBjoern A. Zeeb 20*5c1def83SBjoern A. Zeeb struct ath12k_dbring_data { 21*5c1def83SBjoern A. Zeeb void *data; 22*5c1def83SBjoern A. Zeeb u32 data_sz; 23*5c1def83SBjoern A. Zeeb struct ath12k_wmi_dma_buf_release_meta_data_params meta; 24*5c1def83SBjoern A. Zeeb }; 25*5c1def83SBjoern A. Zeeb 26*5c1def83SBjoern A. Zeeb struct ath12k_dbring_buf_release_event { 27*5c1def83SBjoern A. Zeeb struct ath12k_wmi_dma_buf_release_fixed_params fixed; 28*5c1def83SBjoern A. Zeeb const struct ath12k_wmi_dma_buf_release_entry_params *buf_entry; 29*5c1def83SBjoern A. Zeeb const struct ath12k_wmi_dma_buf_release_meta_data_params *meta_data; 30*5c1def83SBjoern A. Zeeb u32 num_buf_entry; 31*5c1def83SBjoern A. Zeeb u32 num_meta; 32*5c1def83SBjoern A. Zeeb }; 33*5c1def83SBjoern A. Zeeb 34*5c1def83SBjoern A. Zeeb struct ath12k_dbring_cap { 35*5c1def83SBjoern A. Zeeb u32 pdev_id; 36*5c1def83SBjoern A. Zeeb enum wmi_direct_buffer_module id; 37*5c1def83SBjoern A. Zeeb u32 min_elem; 38*5c1def83SBjoern A. Zeeb u32 min_buf_sz; 39*5c1def83SBjoern A. Zeeb u32 min_buf_align; 40*5c1def83SBjoern A. Zeeb }; 41*5c1def83SBjoern A. Zeeb 42*5c1def83SBjoern A. Zeeb struct ath12k_dbring { 43*5c1def83SBjoern A. Zeeb struct dp_srng refill_srng; 44*5c1def83SBjoern A. Zeeb struct idr bufs_idr; 45*5c1def83SBjoern A. Zeeb /* Protects bufs_idr */ 46*5c1def83SBjoern A. Zeeb spinlock_t idr_lock; 47*5c1def83SBjoern A. Zeeb dma_addr_t tp_addr; 48*5c1def83SBjoern A. Zeeb dma_addr_t hp_addr; 49*5c1def83SBjoern A. Zeeb int bufs_max; 50*5c1def83SBjoern A. Zeeb u32 pdev_id; 51*5c1def83SBjoern A. Zeeb u32 buf_sz; 52*5c1def83SBjoern A. Zeeb u32 buf_align; 53*5c1def83SBjoern A. Zeeb u32 num_resp_per_event; 54*5c1def83SBjoern A. Zeeb u32 event_timeout_ms; 55*5c1def83SBjoern A. Zeeb int (*handler)(struct ath12k *ar, struct ath12k_dbring_data *data); 56*5c1def83SBjoern A. Zeeb }; 57*5c1def83SBjoern A. Zeeb 58*5c1def83SBjoern A. Zeeb int ath12k_dbring_set_cfg(struct ath12k *ar, 59*5c1def83SBjoern A. Zeeb struct ath12k_dbring *ring, 60*5c1def83SBjoern A. Zeeb u32 num_resp_per_event, 61*5c1def83SBjoern A. Zeeb u32 event_timeout_ms, 62*5c1def83SBjoern A. Zeeb int (*handler)(struct ath12k *, 63*5c1def83SBjoern A. Zeeb struct ath12k_dbring_data *)); 64*5c1def83SBjoern A. Zeeb int ath12k_dbring_wmi_cfg_setup(struct ath12k *ar, 65*5c1def83SBjoern A. Zeeb struct ath12k_dbring *ring, 66*5c1def83SBjoern A. Zeeb enum wmi_direct_buffer_module id); 67*5c1def83SBjoern A. Zeeb int ath12k_dbring_buf_setup(struct ath12k *ar, 68*5c1def83SBjoern A. Zeeb struct ath12k_dbring *ring, 69*5c1def83SBjoern A. Zeeb struct ath12k_dbring_cap *db_cap); 70*5c1def83SBjoern A. Zeeb int ath12k_dbring_srng_setup(struct ath12k *ar, struct ath12k_dbring *ring, 71*5c1def83SBjoern A. Zeeb int ring_num, int num_entries); 72*5c1def83SBjoern A. Zeeb int ath12k_dbring_buffer_release_event(struct ath12k_base *ab, 73*5c1def83SBjoern A. Zeeb struct ath12k_dbring_buf_release_event *ev); 74*5c1def83SBjoern A. Zeeb int ath12k_dbring_get_cap(struct ath12k_base *ab, 75*5c1def83SBjoern A. Zeeb u8 pdev_idx, 76*5c1def83SBjoern A. Zeeb enum wmi_direct_buffer_module id, 77*5c1def83SBjoern A. Zeeb struct ath12k_dbring_cap *db_cap); 78*5c1def83SBjoern A. Zeeb void ath12k_dbring_srng_cleanup(struct ath12k *ar, struct ath12k_dbring *ring); 79*5c1def83SBjoern A. Zeeb void ath12k_dbring_buf_cleanup(struct ath12k *ar, struct ath12k_dbring *ring); 80*5c1def83SBjoern A. Zeeb #endif /* ATH12K_DBRING_H */ 81