Merge tag 'drm-msm-fixes-2023-01-12' of https://gitlab.freedesktop.org/drm/msm into...
[linux-2.6-microblaze.git] / drivers / net / wwan / iosm / iosm_ipc_protocol.h
1 /* SPDX-License-Identifier: GPL-2.0-only
2  *
3  * Copyright (C) 2020-21 Intel Corporation.
4  */
5
6 #ifndef IOSM_IPC_PROTOCOL_H
7 #define IOSM_IPC_PROTOCOL_H
8
9 #include "iosm_ipc_imem.h"
10 #include "iosm_ipc_pm.h"
11 #include "iosm_ipc_protocol_ops.h"
12
13 /* Trigger the doorbell interrupt on CP. */
14 #define IPC_DOORBELL_IRQ_HPDA 0
15 #define IPC_DOORBELL_IRQ_IPC 1
16 #define IPC_DOORBELL_IRQ_SLEEP 2
17
18 /* IRQ vector number. */
19 #define IPC_DEVICE_IRQ_VECTOR 0
20 #define IPC_MSG_IRQ_VECTOR 0
21 #define IPC_UL_PIPE_IRQ_VECTOR 0
22 #define IPC_DL_PIPE_IRQ_VECTOR 0
23
24 #define IPC_MEM_MSG_ENTRIES 128
25
26 /* Default time out for sending IPC messages like open pipe, close pipe etc.
27  * during run mode.
28  *
29  * If the message interface lock to CP times out, the link to CP is broken.
30  * mode : run mode (IPC_MEM_EXEC_STAGE_RUN)
31  * unit : milliseconds
32  */
33 #define IPC_MSG_COMPLETE_RUN_DEFAULT_TIMEOUT 500 /* 0.5 seconds */
34
35 /* Default time out for sending IPC messages like open pipe, close pipe etc.
36  * during boot mode.
37  *
38  * If the message interface lock to CP times out, the link to CP is broken.
39  * mode : boot mode
40  * (IPC_MEM_EXEC_STAGE_BOOT | IPC_MEM_EXEC_STAGE_PSI | IPC_MEM_EXEC_STAGE_EBL)
41  * unit : milliseconds
42  */
43 #define IPC_MSG_COMPLETE_BOOT_DEFAULT_TIMEOUT 500 /* 0.5 seconds */
44
45 /**
46  * struct ipc_protocol_context_info - Structure of the context info
47  * @device_info_addr:           64 bit address to device info
48  * @head_array:                 64 bit address to head pointer arr for the pipes
49  * @tail_array:                 64 bit address to tail pointer arr for the pipes
50  * @msg_head:                   64 bit address to message head pointer
51  * @msg_tail:                   64 bit address to message tail pointer
52  * @msg_ring_addr:              64 bit pointer to the message ring buffer
53  * @msg_ring_entries:           This field provides the number of entries which
54  *                              the MR can hold
55  * @msg_irq_vector:             This field provides the IRQ which shall be
56  *                              generated by the EP device when generating
57  *                              completion for Messages.
58  * @device_info_irq_vector:     This field provides the IRQ which shall be
59  *                              generated by the EP dev after updating Dev. Info
60  */
61 struct ipc_protocol_context_info {
62         phys_addr_t device_info_addr;
63         phys_addr_t head_array;
64         phys_addr_t tail_array;
65         phys_addr_t msg_head;
66         phys_addr_t msg_tail;
67         phys_addr_t msg_ring_addr;
68         __le16 msg_ring_entries;
69         u8 msg_irq_vector;
70         u8 device_info_irq_vector;
71 };
72
73 /**
74  * struct ipc_protocol_device_info - Structure for the device information
75  * @execution_stage:            CP execution stage
76  * @ipc_status:                 IPC states
77  * @device_sleep_notification:  Requested device pm states
78  */
79 struct ipc_protocol_device_info {
80         __le32 execution_stage;
81         __le32 ipc_status;
82         __le32 device_sleep_notification;
83 };
84
85 /**
86  * struct ipc_protocol_ap_shm - Protocol Shared Memory Structure
87  * @ci:                 Context information struct
88  * @device_info:        Device information struct
89  * @msg_head:           Point to msg head
90  * @head_array:         Array of head pointer
91  * @msg_tail:           Point to msg tail
92  * @tail_array:         Array of tail pointer
93  * @msg_ring:           Circular buffers for the read/tail and write/head
94  *                      indeces.
95  */
96 struct ipc_protocol_ap_shm {
97         struct ipc_protocol_context_info ci;
98         struct ipc_protocol_device_info device_info;
99         __le32 msg_head;
100         __le32 head_array[IPC_MEM_MAX_PIPES];
101         __le32 msg_tail;
102         __le32 tail_array[IPC_MEM_MAX_PIPES];
103         union ipc_mem_msg_entry msg_ring[IPC_MEM_MSG_ENTRIES];
104 };
105
106 /**
107  * struct iosm_protocol - Structure for IPC protocol.
108  * @p_ap_shm:           Pointer to Protocol Shared Memory Structure
109  * @pm:                 Instance to struct iosm_pm
110  * @pcie:               Pointer to struct iosm_pcie
111  * @imem:               Pointer to struct iosm_imem
112  * @rsp_ring:           Array of OS completion objects to be triggered once CP
113  *                      acknowledges a request in the message ring
114  * @dev:                Pointer to device structure
115  * @phy_ap_shm:         Physical/Mapped representation of the shared memory info
116  * @old_msg_tail:       Old msg tail ptr, until AP has handled ACK's from CP
117  */
118 struct iosm_protocol {
119         struct ipc_protocol_ap_shm *p_ap_shm;
120         struct iosm_pm pm;
121         struct iosm_pcie *pcie;
122         struct iosm_imem *imem;
123         struct ipc_rsp *rsp_ring[IPC_MEM_MSG_ENTRIES];
124         struct device *dev;
125         dma_addr_t phy_ap_shm;
126         u32 old_msg_tail;
127 };
128
129 /**
130  * struct ipc_call_msg_send_args - Structure for message argument for
131  *                                 tasklet function.
132  * @prep_args:          Arguments for message preparation function
133  * @response:           Can be NULL if result can be ignored
134  * @msg_type:           Message Type
135  */
136 struct ipc_call_msg_send_args {
137         union ipc_msg_prep_args *prep_args;
138         struct ipc_rsp *response;
139         enum ipc_msg_prep_type msg_type;
140 };
141
142 /**
143  * ipc_protocol_tq_msg_send - prepare the msg and send to CP
144  * @ipc_protocol:       Pointer to ipc_protocol instance
145  * @msg_type:           Message type
146  * @prep_args:          Message arguments
147  * @response:           Pointer to a response object which has a
148  *                      completion object and return code.
149  *
150  * Returns: 0 on success and failure value on error
151  */
152 int ipc_protocol_tq_msg_send(struct iosm_protocol *ipc_protocol,
153                              enum ipc_msg_prep_type msg_type,
154                              union ipc_msg_prep_args *prep_args,
155                              struct ipc_rsp *response);
156
157 /**
158  * ipc_protocol_msg_send - Send ipc control message to CP and wait for response
159  * @ipc_protocol:       Pointer to ipc_protocol instance
160  * @prep:               Message type
161  * @prep_args:          Message arguments
162  *
163  * Returns: 0 on success and failure value on error
164  */
165 int ipc_protocol_msg_send(struct iosm_protocol *ipc_protocol,
166                           enum ipc_msg_prep_type prep,
167                           union ipc_msg_prep_args *prep_args);
168
169 /**
170  * ipc_protocol_suspend - Signal to CP that host wants to go to sleep (suspend).
171  * @ipc_protocol:       Pointer to ipc_protocol instance
172  *
173  * Returns: true if host can suspend, false if suspend must be aborted.
174  */
175 bool ipc_protocol_suspend(struct iosm_protocol *ipc_protocol);
176
177 /**
178  * ipc_protocol_s2idle_sleep - Call PM function to set PM variables in s2idle
179  *                             sleep/active case
180  * @ipc_protocol:       Pointer to ipc_protocol instance
181  * @sleep:              True for sleep/False for active
182  */
183 void ipc_protocol_s2idle_sleep(struct iosm_protocol *ipc_protocol, bool sleep);
184
185 /**
186  * ipc_protocol_resume - Signal to CP that host wants to resume operation.
187  * @ipc_protocol:       Pointer to ipc_protocol instance
188  *
189  * Returns: true if host can resume, false if there is a problem.
190  */
191 bool ipc_protocol_resume(struct iosm_protocol *ipc_protocol);
192
193 /**
194  * ipc_protocol_pm_dev_sleep_handle - Handles the Device Sleep state change
195  *                                    notification.
196  * @ipc_protocol:       Pointer to ipc_protocol instance.
197  *
198  * Returns: true if sleep notification handled, false otherwise.
199  */
200 bool ipc_protocol_pm_dev_sleep_handle(struct iosm_protocol *ipc_protocol);
201
202 /**
203  * ipc_protocol_doorbell_trigger - Wrapper for PM function which wake up the
204  *                                 device if it is in low power mode
205  *                                 and trigger a head pointer update interrupt.
206  * @ipc_protocol:       Pointer to ipc_protocol instance.
207  * @identifier:         Specifies what component triggered hpda
208  *                      update irq
209  */
210 void ipc_protocol_doorbell_trigger(struct iosm_protocol *ipc_protocol,
211                                    u32 identifier);
212
213 /**
214  * ipc_protocol_sleep_notification_string - Returns last Sleep Notification as
215  *                                          string.
216  * @ipc_protocol:       Instance pointer of Protocol module.
217  *
218  * Returns: Pointer to string.
219  */
220 const char *
221 ipc_protocol_sleep_notification_string(struct iosm_protocol *ipc_protocol);
222
223 /**
224  * ipc_protocol_init - Allocates IPC protocol instance
225  * @ipc_imem:           Pointer to iosm_imem structure
226  *
227  * Returns: Address of IPC  protocol instance on success & NULL on failure.
228  */
229 struct iosm_protocol *ipc_protocol_init(struct iosm_imem *ipc_imem);
230
231 /**
232  * ipc_protocol_deinit - Deallocates IPC protocol instance
233  * @ipc_protocol:       pointer to the IPC protocol instance
234  */
235 void ipc_protocol_deinit(struct iosm_protocol *ipc_protocol);
236
237 #endif