linux/drivers/net/wwan/iosm/iosm_ipc_protocol.h
<<
>>
Prefs
   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 */
  61struct 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 */
  79struct 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 */
  96struct 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 */
 118struct 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        phys_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 */
 136struct 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 */
 152int 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 */
 165int 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 */
 175bool 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 */
 183void 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 */
 191bool 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 */
 200bool 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 */
 210void 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 */
 220const char *
 221ipc_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 */
 229struct 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 */
 235void ipc_protocol_deinit(struct iosm_protocol *ipc_protocol);
 236
 237#endif
 238