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