1*dd4f32aeSBjoern A. Zeeb /* SPDX-License-Identifier: BSD-3-Clause-Clear */ 2*dd4f32aeSBjoern A. Zeeb /* 3*dd4f32aeSBjoern A. Zeeb * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. 4*dd4f32aeSBjoern A. Zeeb */ 5*dd4f32aeSBjoern A. Zeeb 6*dd4f32aeSBjoern A. Zeeb #ifndef ATH11K_DBRING_H 7*dd4f32aeSBjoern A. Zeeb #define ATH11K_DBRING_H 8*dd4f32aeSBjoern A. Zeeb 9*dd4f32aeSBjoern A. Zeeb #include <linux/types.h> 10*dd4f32aeSBjoern A. Zeeb #include <linux/idr.h> 11*dd4f32aeSBjoern A. Zeeb #include <linux/spinlock.h> 12*dd4f32aeSBjoern A. Zeeb #include "dp.h" 13*dd4f32aeSBjoern A. Zeeb 14*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_element { 15*dd4f32aeSBjoern A. Zeeb dma_addr_t paddr; 16*dd4f32aeSBjoern A. Zeeb u8 *payload; 17*dd4f32aeSBjoern A. Zeeb }; 18*dd4f32aeSBjoern A. Zeeb 19*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_data { 20*dd4f32aeSBjoern A. Zeeb void *data; 21*dd4f32aeSBjoern A. Zeeb u32 data_sz; 22*dd4f32aeSBjoern A. Zeeb struct wmi_dma_buf_release_meta_data meta; 23*dd4f32aeSBjoern A. Zeeb }; 24*dd4f32aeSBjoern A. Zeeb 25*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_buf_release_event { 26*dd4f32aeSBjoern A. Zeeb struct ath11k_wmi_dma_buf_release_fixed_param fixed; 27*dd4f32aeSBjoern A. Zeeb #if defined(__linux__) 28*dd4f32aeSBjoern A. Zeeb struct wmi_dma_buf_release_entry *buf_entry; 29*dd4f32aeSBjoern A. Zeeb struct wmi_dma_buf_release_meta_data *meta_data; 30*dd4f32aeSBjoern A. Zeeb #elif defined(__FreeBSD__) 31*dd4f32aeSBjoern A. Zeeb const struct wmi_dma_buf_release_entry *buf_entry; 32*dd4f32aeSBjoern A. Zeeb const struct wmi_dma_buf_release_meta_data *meta_data; 33*dd4f32aeSBjoern A. Zeeb #endif 34*dd4f32aeSBjoern A. Zeeb u32 num_buf_entry; 35*dd4f32aeSBjoern A. Zeeb u32 num_meta; 36*dd4f32aeSBjoern A. Zeeb }; 37*dd4f32aeSBjoern A. Zeeb 38*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_cap { 39*dd4f32aeSBjoern A. Zeeb u32 pdev_id; 40*dd4f32aeSBjoern A. Zeeb enum wmi_direct_buffer_module id; 41*dd4f32aeSBjoern A. Zeeb u32 min_elem; 42*dd4f32aeSBjoern A. Zeeb u32 min_buf_sz; 43*dd4f32aeSBjoern A. Zeeb u32 min_buf_align; 44*dd4f32aeSBjoern A. Zeeb }; 45*dd4f32aeSBjoern A. Zeeb 46*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring { 47*dd4f32aeSBjoern A. Zeeb struct dp_srng refill_srng; 48*dd4f32aeSBjoern A. Zeeb struct idr bufs_idr; 49*dd4f32aeSBjoern A. Zeeb /* Protects bufs_idr */ 50*dd4f32aeSBjoern A. Zeeb spinlock_t idr_lock; 51*dd4f32aeSBjoern A. Zeeb dma_addr_t tp_addr; 52*dd4f32aeSBjoern A. Zeeb dma_addr_t hp_addr; 53*dd4f32aeSBjoern A. Zeeb int bufs_max; 54*dd4f32aeSBjoern A. Zeeb u32 pdev_id; 55*dd4f32aeSBjoern A. Zeeb u32 buf_sz; 56*dd4f32aeSBjoern A. Zeeb u32 buf_align; 57*dd4f32aeSBjoern A. Zeeb u32 num_resp_per_event; 58*dd4f32aeSBjoern A. Zeeb u32 event_timeout_ms; 59*dd4f32aeSBjoern A. Zeeb int (*handler)(struct ath11k *, struct ath11k_dbring_data *); 60*dd4f32aeSBjoern A. Zeeb }; 61*dd4f32aeSBjoern A. Zeeb 62*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_set_cfg(struct ath11k *ar, 63*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring *ring, 64*dd4f32aeSBjoern A. Zeeb u32 num_resp_per_event, 65*dd4f32aeSBjoern A. Zeeb u32 event_timeout_ms, 66*dd4f32aeSBjoern A. Zeeb int (*handler)(struct ath11k *, 67*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_data *)); 68*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_wmi_cfg_setup(struct ath11k *ar, 69*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring *ring, 70*dd4f32aeSBjoern A. Zeeb enum wmi_direct_buffer_module id); 71*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_buf_setup(struct ath11k *ar, 72*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring *ring, 73*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_cap *db_cap); 74*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_srng_setup(struct ath11k *ar, struct ath11k_dbring *ring, 75*dd4f32aeSBjoern A. Zeeb int ring_num, int num_entries); 76*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_buffer_release_event(struct ath11k_base *ab, 77*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_buf_release_event *ev); 78*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_get_cap(struct ath11k_base *ab, 79*dd4f32aeSBjoern A. Zeeb u8 pdev_idx, 80*dd4f32aeSBjoern A. Zeeb enum wmi_direct_buffer_module id, 81*dd4f32aeSBjoern A. Zeeb struct ath11k_dbring_cap *db_cap); 82*dd4f32aeSBjoern A. Zeeb void ath11k_dbring_srng_cleanup(struct ath11k *ar, struct ath11k_dbring *ring); 83*dd4f32aeSBjoern A. Zeeb void ath11k_dbring_buf_cleanup(struct ath11k *ar, struct ath11k_dbring *ring); 84*dd4f32aeSBjoern A. Zeeb int ath11k_dbring_validate_buffer(struct ath11k *ar, void *data, u32 size); 85*dd4f32aeSBjoern A. Zeeb 86*dd4f32aeSBjoern A. Zeeb #endif /* ATH11K_DBRING_H */ 87