1 /* SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2020-21 Intel Corporation.
6 #ifndef IOSM_IPC_IMEM_H
7 #define IOSM_IPC_IMEM_H
9 #include <linux/skbuff.h>
11 #include "iosm_ipc_mmio.h"
12 #include "iosm_ipc_pcie.h"
13 #include "iosm_ipc_uevent.h"
14 #include "iosm_ipc_wwan.h"
15 #include "iosm_ipc_task_queue.h"
19 /* IRQ moderation in usec */
21 #define IRQ_MOD_NET 1000
22 #define IRQ_MOD_TRC 4000
24 /* Either the PSI image is accepted by CP or the suspended flash tool is waken,
25 * informed that the CP ROM driver is not ready to process the PSI image.
28 #define IPC_PSI_TRANSFER_TIMEOUT 3000
30 /* Timeout in 20 msec to wait for the modem to boot up to
31 * IPC_MEM_DEVICE_IPC_INIT state.
32 * unit : milliseconds (500 * ipc_util_msleep(20))
34 #define IPC_MODEM_BOOT_TIMEOUT 500
36 /* Wait timeout for ipc status reflects IPC_MEM_DEVICE_IPC_UNINIT
39 #define IPC_MODEM_UNINIT_TIMEOUT_MS 30
41 /* Pending time for processing data.
44 #define IPC_PEND_DATA_TIMEOUT 500
46 /* The timeout in milliseconds for application to wait for remote time. */
47 #define IPC_REMOTE_TS_TIMEOUT_MS 10
49 /* Timeout for TD allocation retry.
52 #define IPC_TD_ALLOC_TIMER_PERIOD_MS 100
54 /* Host sleep target is host */
55 #define IPC_HOST_SLEEP_HOST 0
57 /* Host sleep target is device */
58 #define IPC_HOST_SLEEP_DEVICE 1
60 /* Sleep message, target host: AP enters sleep / target device: CP is
61 * allowed to enter sleep and shall use the host sleep protocol
63 #define IPC_HOST_SLEEP_ENTER_SLEEP 0
65 /* Sleep_message, target host: AP exits sleep / target device: CP is
66 * NOT allowed to enter sleep
68 #define IPC_HOST_SLEEP_EXIT_SLEEP 1
70 #define IMEM_IRQ_DONT_CARE (-1)
72 #define IPC_MEM_MAX_CHANNELS 8
74 #define IPC_MEM_MUX_IP_SESSION_ENTRIES 8
76 #define IPC_MEM_MUX_IP_CH_IF_ID 0
78 #define TD_UPDATE_DEFAULT_TIMEOUT_USEC 1900
80 #define FORCE_UPDATE_DEFAULT_TIMEOUT_USEC 500
82 /* Sleep_message, target host: not applicable / target device: CP is
83 * allowed to enter sleep and shall NOT use the device sleep protocol
85 #define IPC_HOST_SLEEP_ENTER_SLEEP_NO_PROTOCOL 2
87 /* in_band_crash_signal IPC_MEM_INBAND_CRASH_SIG
88 * Modem crash notification configuration. If this value is non-zero then
89 * FEATURE_SET message will be sent to the Modem as a result the Modem will
90 * signal Crash via Execution Stage register. If this value is zero then Modem
91 * will use out-of-band method to notify about it's Crash.
93 #define IPC_MEM_INBAND_CRASH_SIG 1
95 /* Extra headroom to be allocated for DL SKBs to allow addition of Ethernet
98 #define IPC_MEM_DL_ETH_OFFSET 16
100 #define IPC_CB(skb) ((struct ipc_skb_cb *)((skb)->cb))
101 #define IOSM_CHIP_INFO_SIZE_MAX 100
103 #define FULLY_FUNCTIONAL 0
104 #define IOSM_DEVLINK_INIT 1
106 #define IPC_MEM_AUTO_SUSPEND_DELAY_MS 5000
108 /* List of the supported UL/DL pipes. */
137 /* Enum defining channel states. */
138 enum ipc_channel_state {
140 IMEM_CHANNEL_RESERVED,
142 IMEM_CHANNEL_CLOSING,
146 * enum ipc_ctype - Enum defining supported channel type needed for control
148 * @IPC_CTYPE_WWAN: Used for IP traffic
149 * @IPC_CTYPE_CTRL: Used for Control Communication
156 /* Pipe direction. */
157 enum ipc_mem_pipe_dir {
162 /* HP update identifier. To be used as data for ipc_cp_irq_hpda_update() */
163 enum ipc_hp_identifier {
166 IPC_HP_WAKEUP_SPEC_TMR,
167 IPC_HP_TD_UPD_TMR_START,
169 IPC_HP_FAST_TD_UPD_TMR,
172 IPC_HP_NET_CHANNEL_INIT,
177 * struct ipc_pipe - Structure for Pipe.
178 * @tdr_start: Ipc private protocol Transfer Descriptor Ring
179 * @channel: Id of the sio device, set by imem_sio_open,
180 * needed to pass DL char to the user terminal
181 * @skbr_start: Circular buffer for skbuf and the buffer
182 * reference in a tdr_start entry.
183 * @phy_tdr_start: Transfer descriptor start address
184 * @old_head: last head pointer reported to CP.
185 * @old_tail: AP read position before CP moves the read
186 * position to write/head. If CP has consumed the
187 * buffers, AP has to freed the skbuf starting at
188 * tdr_start[old_tail].
189 * @nr_of_entries: Number of elements of skb_start and tdr_start.
190 * @max_nr_of_queued_entries: Maximum number of queued entries in TDR
191 * @accumulation_backoff: Accumulation in usec for accumulation
192 * backoff (0 = no acc backoff)
193 * @irq_moderation: timer in usec for irq_moderation
194 * (0=no irq moderation)
195 * @pipe_nr: Pipe identification number
196 * @irq: Interrupt vector
197 * @dir: Direction of data stream in pipe
198 * @buf_size: Buffer size (in bytes) for preallocated
199 * buffers (for DL pipes)
200 * @nr_of_queued_entries: Aueued number of entries
201 * @is_open: Check for open pipe status
204 struct ipc_protocol_td *tdr_start;
205 struct ipc_mem_channel *channel;
206 struct sk_buff **skbr_start;
207 dma_addr_t phy_tdr_start;
211 u32 max_nr_of_queued_entries;
212 u32 accumulation_backoff;
216 enum ipc_mem_pipe_dir dir;
218 u16 nr_of_queued_entries;
223 * struct ipc_mem_channel - Structure for Channel.
224 * @channel_id: Instance of the channel list and is return to the user
225 * at the end of the open operation.
226 * @ctype: Control or netif channel.
227 * @index: unique index per ctype
228 * @ul_pipe: pipe objects
229 * @dl_pipe: pipe objects
230 * @if_id: Interface ID
231 * @net_err_count: Number of downlink errors returned by ipc_wwan_receive
232 * interface at the entry point of the IP stack.
233 * @state: Free, reserved or busy (in use).
234 * @ul_sem: Needed for the blocking write or uplink transfer.
235 * @ul_list: Uplink accumulator which is filled by the uplink
236 * char app or IP stack. The socket buffer pointer are
237 * added to the descriptor list in the kthread context.
239 struct ipc_mem_channel {
241 enum ipc_ctype ctype;
243 struct ipc_pipe ul_pipe;
244 struct ipc_pipe dl_pipe;
247 enum ipc_channel_state state;
248 struct completion ul_sem;
249 struct sk_buff_head ul_list;
253 * enum ipc_phase - Different AP and CP phases.
254 * The enums defined after "IPC_P_ROM" and before
255 * "IPC_P_RUN" indicates the operating state where CP can
256 * respond to any requests. So while introducing new phase
257 * this shall be taken into consideration.
258 * @IPC_P_OFF: On host PC, the PCIe device link settings are known
259 * about the combined power on. PC is running, the driver
260 * is loaded and CP is in power off mode. The PCIe bus
261 * driver call the device power mode D3hot. In this phase
262 * the driver the polls the device, until the device is in
263 * the power on state and signals the power mode D0.
264 * @IPC_P_OFF_REQ: The intermediate phase between cleanup activity starts
266 * @IPC_P_CRASH: The phase indicating CP crash
267 * @IPC_P_CD_READY: The phase indicating CP core dump is ready
268 * @IPC_P_ROM: After power on, CP starts in ROM mode and the IPC ROM
269 * driver is waiting 150 ms for the AP active notification
270 * saved in the PCI link status register.
271 * @IPC_P_PSI: Primary signed image download phase
272 * @IPC_P_EBL: Extended bootloader pahse
273 * @IPC_P_RUN: The phase after flashing to RAM is the RUNTIME phase.
287 * struct iosm_imem - Current state of the IPC shared memory.
288 * @mmio: mmio instance to access CP MMIO area /
289 * doorbell scratchpad.
290 * @ipc_protocol: IPC Protocol instance
291 * @ipc_task: Task for entry into ipc task queue
292 * @wwan: WWAN device pointer
293 * @mux: IP Data multiplexing state.
294 * @sio: IPC SIO data structure pointer
295 * @ipc_port: IPC PORT data structure pointer
297 * @trace: IPC trace data structure pointer
298 * @dev: Pointer to device structure
299 * @ipc_requested_state: Expected IPC state on CP.
300 * @channels: Channel list with UL/DL pipe pairs.
301 * @ipc_devlink: IPC Devlink data structure pointer
302 * @ipc_status: local ipc_status
303 * @nr_of_channels: number of configured channels
304 * @startup_timer: startup timer for NAND support.
305 * @hrtimer_period: Hr timer period
306 * @tdupdate_timer: Delay the TD update doorbell.
307 * @fast_update_timer: forced head pointer update delay timer.
308 * @td_alloc_timer: Timer for DL pipe TD allocation retry
309 * @adb_timer: Timer for finishing the ADB.
310 * @rom_exit_code: Mapped boot rom exit code.
311 * @enter_runtime: 1 means the transition to runtime phase was
313 * @ul_pend_sem: Semaphore to wait/complete of UL TDs
314 * before closing pipe.
315 * @app_notify_ul_pend: Signal app if UL TD is pending
316 * @dl_pend_sem: Semaphore to wait/complete of DL TDs
317 * before closing pipe.
318 * @app_notify_dl_pend: Signal app if DL TD is pending
319 * @phase: Operating phase like runtime.
320 * @pci_device_id: Device ID
321 * @cp_version: CP version
322 * @device_sleep: Device sleep state
323 * @run_state_worker: Pointer to worker component for device
324 * setup operations to be called when modem
326 * @ev_irq_pending: 0 means inform the IPC tasklet to
327 * process the irq actions.
328 * @flag: Flag to monitor the state of driver
329 * @td_update_timer_suspended: if true then td update timer suspend
330 * @ev_mux_net_transmit_pending:0 means inform the IPC tasklet to pass
331 * @reset_det_n: Reset detect flag
332 * @pcie_wake_n: Pcie wake flag
333 * @debugfs_wwan_dir: WWAN Debug FS directory entry
334 * @debugfs_dir: Debug FS directory for driver-specific entries
337 struct iosm_mmio *mmio;
338 struct iosm_protocol *ipc_protocol;
339 struct ipc_task *ipc_task;
340 struct iosm_wwan *wwan;
341 struct iosm_mux *mux;
342 struct iosm_cdev *ipc_port[IPC_MEM_MAX_CHANNELS];
343 struct iosm_pcie *pcie;
344 #ifdef CONFIG_WWAN_DEBUGFS
345 struct iosm_trace *trace;
348 enum ipc_mem_device_ipc_state ipc_requested_state;
349 struct ipc_mem_channel channels[IPC_MEM_MAX_CHANNELS];
350 struct iosm_devlink *ipc_devlink;
353 struct hrtimer startup_timer;
354 ktime_t hrtimer_period;
355 struct hrtimer tdupdate_timer;
356 struct hrtimer fast_update_timer;
357 struct hrtimer td_alloc_timer;
358 struct hrtimer adb_timer;
359 enum rom_exit_code rom_exit_code;
361 struct completion ul_pend_sem;
362 u32 app_notify_ul_pend;
363 struct completion dl_pend_sem;
364 u32 app_notify_dl_pend;
365 enum ipc_phase phase;
369 struct work_struct run_state_worker;
370 u8 ev_irq_pending[IPC_IRQ_VECTORS];
372 u8 td_update_timer_suspended:1,
373 ev_mux_net_transmit_pending:1,
376 #ifdef CONFIG_WWAN_DEBUGFS
377 struct dentry *debugfs_wwan_dir;
378 struct dentry *debugfs_dir;
383 * ipc_imem_init - Initialize the shared memory region
384 * @pcie: Pointer to core driver data-struct
385 * @device_id: PCI device ID
386 * @mmio: Pointer to the mmio area
387 * @dev: Pointer to device structure
389 * Returns: Initialized imem pointer on success else NULL
391 struct iosm_imem *ipc_imem_init(struct iosm_pcie *pcie, unsigned int device_id,
392 void __iomem *mmio, struct device *dev);
395 * ipc_imem_pm_s2idle_sleep - Set PM variables to sleep/active for
396 * s2idle sleep/active
397 * @ipc_imem: Pointer to imem data-struct
398 * @sleep: Set PM Variable to sleep/active
400 void ipc_imem_pm_s2idle_sleep(struct iosm_imem *ipc_imem, bool sleep);
403 * ipc_imem_pm_suspend - The HAL shall ask the shared memory layer
404 * whether D3 is allowed.
405 * @ipc_imem: Pointer to imem data-struct
407 void ipc_imem_pm_suspend(struct iosm_imem *ipc_imem);
410 * ipc_imem_pm_resume - The HAL shall inform the shared memory layer
411 * that the device is active.
412 * @ipc_imem: Pointer to imem data-struct
414 void ipc_imem_pm_resume(struct iosm_imem *ipc_imem);
417 * ipc_imem_cleanup - Inform CP and free the shared memory resources.
418 * @ipc_imem: Pointer to imem data-struct
420 void ipc_imem_cleanup(struct iosm_imem *ipc_imem);
423 * ipc_imem_irq_process - Shift the IRQ actions to the IPC thread.
424 * @ipc_imem: Pointer to imem data-struct
427 void ipc_imem_irq_process(struct iosm_imem *ipc_imem, int irq);
430 * imem_get_device_sleep_state - Get the device sleep state value.
431 * @ipc_imem: Pointer to imem instance
433 * Returns: device sleep state
435 int imem_get_device_sleep_state(struct iosm_imem *ipc_imem);
438 * ipc_imem_td_update_timer_suspend - Updates the TD Update Timer suspend flag.
439 * @ipc_imem: Pointer to imem data-struct
440 * @suspend: Flag to update. If TRUE then HP update doorbell is triggered to
441 * device without any wait. If FALSE then HP update doorbell is
442 * delayed until timeout.
444 void ipc_imem_td_update_timer_suspend(struct iosm_imem *ipc_imem, bool suspend);
447 * ipc_imem_channel_close - Release the channel resources.
448 * @ipc_imem: Pointer to imem data-struct
449 * @channel_id: Channel ID to be cleaned up.
451 void ipc_imem_channel_close(struct iosm_imem *ipc_imem, int channel_id);
454 * ipc_imem_channel_alloc - Reserves a channel
455 * @ipc_imem: Pointer to imem data-struct
456 * @index: ID to lookup from the preallocated list.
457 * @ctype: Channel type.
459 * Returns: Index on success and failure value on error
461 int ipc_imem_channel_alloc(struct iosm_imem *ipc_imem, int index,
462 enum ipc_ctype ctype);
465 * ipc_imem_channel_open - Establish the pipes.
466 * @ipc_imem: Pointer to imem data-struct
467 * @channel_id: Channel ID returned during alloc.
468 * @db_id: Doorbell ID for trigger identifier.
470 * Returns: Pointer of ipc_mem_channel on success and NULL on failure.
472 struct ipc_mem_channel *ipc_imem_channel_open(struct iosm_imem *ipc_imem,
473 int channel_id, u32 db_id);
476 * ipc_imem_td_update_timer_start - Starts the TD Update Timer if not running.
477 * @ipc_imem: Pointer to imem data-struct
479 void ipc_imem_td_update_timer_start(struct iosm_imem *ipc_imem);
482 * ipc_imem_ul_write_td - Pass the channel UL list to protocol layer for TD
483 * preparation and sending them to the device.
484 * @ipc_imem: Pointer to imem data-struct
486 * Returns: TRUE of HP Doorbell trigger is pending. FALSE otherwise.
488 bool ipc_imem_ul_write_td(struct iosm_imem *ipc_imem);
491 * ipc_imem_ul_send - Dequeue SKB from channel list and start with
492 * the uplink transfer.If HP Doorbell is pending to be
493 * triggered then starts the TD Update Timer.
494 * @ipc_imem: Pointer to imem data-struct
496 void ipc_imem_ul_send(struct iosm_imem *ipc_imem);
499 * ipc_imem_channel_update - Set or modify pipe config of an existing channel
500 * @ipc_imem: Pointer to imem data-struct
501 * @id: Channel config index
502 * @chnl_cfg: Channel config struct
503 * @irq_moderation: Timer in usec for irq_moderation
505 void ipc_imem_channel_update(struct iosm_imem *ipc_imem, int id,
506 struct ipc_chnl_cfg chnl_cfg, u32 irq_moderation);
509 * ipc_imem_channel_free -Free an IPC channel.
510 * @channel: Channel to be freed
512 void ipc_imem_channel_free(struct ipc_mem_channel *channel);
515 * ipc_imem_hrtimer_stop - Stop the hrtimer
516 * @hr_timer: Pointer to hrtimer instance
518 void ipc_imem_hrtimer_stop(struct hrtimer *hr_timer);
521 * ipc_imem_pipe_cleanup - Reset volatile pipe content for all channels
522 * @ipc_imem: Pointer to imem data-struct
523 * @pipe: Pipe to cleaned up
525 void ipc_imem_pipe_cleanup(struct iosm_imem *ipc_imem, struct ipc_pipe *pipe);
528 * ipc_imem_pipe_close - Send msg to device to close pipe
529 * @ipc_imem: Pointer to imem data-struct
530 * @pipe: Pipe to be closed
532 void ipc_imem_pipe_close(struct iosm_imem *ipc_imem, struct ipc_pipe *pipe);
535 * ipc_imem_phase_update - Get the CP execution state
536 * and map it to the AP phase.
537 * @ipc_imem: Pointer to imem data-struct
539 * Returns: Current ap updated phase
541 enum ipc_phase ipc_imem_phase_update(struct iosm_imem *ipc_imem);
544 * ipc_imem_phase_get_string - Return the current operation
548 * Returns: AP phase string
550 const char *ipc_imem_phase_get_string(enum ipc_phase phase);
553 * ipc_imem_msg_send_feature_set - Send feature set message to modem
554 * @ipc_imem: Pointer to imem data-struct
555 * @reset_enable: 0 = out-of-band, 1 = in-band-crash notification
556 * @atomic_ctx: if disabled call in tasklet context
559 void ipc_imem_msg_send_feature_set(struct iosm_imem *ipc_imem,
560 unsigned int reset_enable, bool atomic_ctx);
563 * ipc_imem_ipc_init_check - Send the init event to CP, wait a certain time and
564 * set CP to runtime with the context information
565 * @ipc_imem: Pointer to imem data-struct
567 void ipc_imem_ipc_init_check(struct iosm_imem *ipc_imem);
570 * ipc_imem_channel_init - Initialize the channel list with UL/DL pipe pairs.
571 * @ipc_imem: Pointer to imem data-struct
572 * @ctype: Channel type
573 * @chnl_cfg: Channel configuration struct
574 * @irq_moderation: Timer in usec for irq_moderation
576 void ipc_imem_channel_init(struct iosm_imem *ipc_imem, enum ipc_ctype ctype,
577 struct ipc_chnl_cfg chnl_cfg, u32 irq_moderation);
580 * ipc_imem_devlink_trigger_chip_info - Inform devlink that the chip
581 * information are available if the
582 * flashing to RAM interworking shall be
584 * @ipc_imem: Pointer to imem structure
586 * Returns: 0 on success, -1 on failure
588 int ipc_imem_devlink_trigger_chip_info(struct iosm_imem *ipc_imem);
590 void ipc_imem_adb_timer_start(struct iosm_imem *ipc_imem);