1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /**
19  *  DOC: mlo_global_h_shmem_arena.h
20  *  This file contains APIs and data structures that are used to parse the MLO
21  *  global shared memory arena.
22  */
23 
24 #ifndef _MLO_GLOBAL_H_SHMEM_ARENA_H_
25 #define _MLO_GLOBAL_H_SHMEM_ARENA_H_
26 
27 #include <qdf_types.h>
28 #include <target_if.h>
29 #include "wmi.h"
30 #include <osdep.h>
31 
32 #define MGMT_RX_REO_INVALID_SNAPSHOT_VERSION      (-1)
33 
34 /**
35  * struct wlan_host_mlo_glb_h_shmem_params - MLO global shared memory parameters
36  * @major_version: Major version
37  * @minor_version: Minor version
38  */
39 struct wlan_host_mlo_glb_h_shmem_params {
40 	uint16_t major_version;
41 	uint16_t minor_version;
42 };
43 
44 /**
45  * struct wlan_host_mlo_glb_rx_reo_per_link_info - MGMT Rx REO
46  * information of a link in MLO global shared memory
47  * @link_id: Hardware link ID
48  * @fw_consumed: Address of FW consumed snapshot
49  * @fw_forwarded: Address of FW forwarded snapshot
50  * @hw_forwarded: Address of HW forwarded snapshot
51  */
52 struct wlan_host_mlo_glb_rx_reo_per_link_info {
53 	uint8_t link_id;
54 	void *fw_consumed;
55 	void *fw_forwarded;
56 	void *hw_forwarded;
57 };
58 
59 /**
60  * struct wlan_host_mlo_glb_rx_reo_snapshot_info - MGMT Rx REO
61  * information in MLO global shared memory
62  * @num_links: Number of valid links
63  * @valid_link_bmap: Valid link bitmap
64  * @link_info: pointer to an array of Rx REO per-link information
65  * @hw_forwarded_snapshot_ver: HW forwarded snapshot version
66  * @fw_forwarded_snapshot_ver: FW forwarded snapshot version
67  * @fw_consumed_snapshot_ver: FW consumed snapshot version
68  */
69 struct wlan_host_mlo_glb_rx_reo_snapshot_info {
70 	uint8_t num_links;
71 	uint16_t valid_link_bmap;
72 	struct wlan_host_mlo_glb_rx_reo_per_link_info *link_info;
73 	uint8_t hw_forwarded_snapshot_ver;
74 	uint8_t fw_forwarded_snapshot_ver;
75 	uint8_t fw_consumed_snapshot_ver;
76 };
77 
78 /**
79  * struct wlan_host_mlo_glb_per_chip_crash_info - per chip crash
80  * information in MLO global shared memory
81  * @chip_id: MLO Chip ID
82  * @crash_reason: Address of the crash_reason corresponding to chip_id
83  * @recovery_mode: Address of the recovery mode corresponding to chip_id
84  */
85 struct wlan_host_mlo_glb_per_chip_crash_info {
86 	uint8_t chip_id;
87 	void *crash_reason;
88 	void *recovery_mode;
89 };
90 
91 /**
92  * struct wlan_host_mlo_glb_chip_crash_info - chip crash information in MLO
93  *                                            global shared memory
94  * @no_of_chips: No of partner chip to which crash information is shared
95  * @valid_chip_bmap: Bitmap to indicate the chip to which the crash information
96  * is shared
97  * @per_chip_crash_info: pointer to an array of crash information associated
98  * with each chip
99  */
100 struct wlan_host_mlo_glb_chip_crash_info {
101 	uint8_t no_of_chips;
102 	qdf_bitmap(valid_chip_bmap, QDF_CHAR_BIT);
103 	struct wlan_host_mlo_glb_per_chip_crash_info *per_chip_crash_info;
104 };
105 
106 /**
107  * struct wlan_host_mlo_glb_h_shmem_arena_ctx - MLO Global shared
108  *                                              memory arena context
109  * @shmem_params: shared memory parameters
110  * @rx_reo_snapshot_info: MGMT Rx REO snapshot information
111  * @chip_crash_info: chip crash information
112  * @init_count: Number of init calls
113  */
114 struct wlan_host_mlo_glb_h_shmem_arena_ctx {
115 	struct wlan_host_mlo_glb_h_shmem_params shmem_params;
116 	struct wlan_host_mlo_glb_rx_reo_snapshot_info rx_reo_snapshot_info;
117 	struct wlan_host_mlo_glb_chip_crash_info chip_crash_info;
118 	qdf_atomic_t init_count;
119 };
120 
121 #ifdef WLAN_MLO_GLOBAL_SHMEM_SUPPORT
122 /**
123  * mlo_glb_h_shmem_arena_ctx_init() - Initialize MLO Global shared memory arena
124  * context on Host
125  * @arena_vaddr: Virtual address of the MLO Global shared memory arena
126  * @arena_len: Length (in bytes) of the MLO Global shared memory arena
127  * @grp_id: Id of the required MLO Group
128  *
129  * Return: QDF_STATUS of operation
130  */
131 QDF_STATUS mlo_glb_h_shmem_arena_ctx_init(void *arena_vaddr,
132 					  size_t arena_len,
133 					  uint8_t grp_id);
134 
135 /**
136  * mlo_glb_h_shmem_arena_ctx_deinit() - De-initialize MLO Global shared memory
137  * arena context on Host
138  * @grp_id: Id of the required MLO Group
139  *
140  * Return: QDF_STATUS of operation
141  */
142 QDF_STATUS mlo_glb_h_shmem_arena_ctx_deinit(uint8_t grp_id);
143 #endif
144 
145 #ifdef WLAN_MLO_GLOBAL_SHMEM_SUPPORT
146 /**
147  * mlo_glb_h_shmem_arena_get_crash_reason_address(): get the address of crash
148  * reason associated with chip_id
149  * @grp_id: Id of the required MLO Group
150  * @chip_id: Id of the MLO chip
151  *
152  * Return: Address of crash_reason field from global shmem arena in case of
153  * success, else returns NULL
154  */
155 void *mlo_glb_h_shmem_arena_get_crash_reason_address(uint8_t grp_id,
156 						     uint8_t chip_id);
157 
158 /**
159  * mlo_glb_h_shmem_arena_get_recovery_mode_address() - get the address of
160  * recovery mode associated with chip_id
161  * @grp_id: Id of the required MLO Group
162  * @chip_id: MLO Chip Id
163  *
164  * Return: Address of recovery mode field from global shmem arena in case of
165  * success, else returns NULL
166  */
167 void *mlo_glb_h_shmem_arena_get_recovery_mode_address(uint8_t grp_id,
168 						      uint8_t chip_id);
169 
170 /**
171  * mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info() - Get number of chips
172  * from crash info
173  * @grp_id: Id of the required MLO Group
174  *
175  * Return: number of chips participating in MLO from crash info shared by target
176  * in case of sccess, else returns 0
177  */
178 uint8_t mlo_glb_h_shmem_arena_get_no_of_chips_from_crash_info(uint8_t grp_id);
179 #endif
180 
181 #ifdef WLAN_MGMT_RX_REO_SUPPORT
182 /**
183  * mgmt_rx_reo_get_valid_link_bitmap() - Get valid link bitmap
184  * @grp_id: Id of the required MLO Group
185  *
186  * Return: valid link bitmap
187  */
188 uint16_t mgmt_rx_reo_get_valid_link_bitmap(uint8_t grp_id);
189 
190 /**
191  * mgmt_rx_reo_get_num_links() - Get number of links to be used by MGMT Rx REO
192  * @grp_id: Id of the required MLO Group
193  *
194  * Return: number of links in case of success, else -1
195  */
196 int mgmt_rx_reo_get_num_links(uint8_t grp_id);
197 
198 /**
199  * mgmt_rx_reo_get_snapshot_address() - Get the address of MGMT Rx REO snapshot
200  * @grp_id: Id of the required MLO Group
201  * @link_id: Link ID of the radio to which this snapshot belongs
202  * @snapshot_id: ID of the snapshot
203  *
204  * Return: virtual address of the snapshot on success, else NULL
205  */
206 void *mgmt_rx_reo_get_snapshot_address(
207 		uint8_t grp_id,
208 		uint8_t link_id,
209 		enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
210 
211 /**
212  * mgmt_rx_reo_get_snapshot_version() - Get the version of MGMT Rx REO snapshot
213  * @grp_id: Id of the required MLO Group
214  * @snapshot_id: ID of the snapshot
215  *
216  * Return: Snapshot version
217  */
218 int8_t mgmt_rx_reo_get_snapshot_version
219 			(uint8_t grp_id,
220 			 enum mgmt_rx_reo_shared_snapshot_id snapshot_id);
221 #endif /* WLAN_MGMT_RX_REO_SUPPORT */
222 #endif
223