linux/drivers/net/wwan/iosm/iosm_ipc_pcie.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only
   2 *
   3 * Copyright (C) 2020-21 Intel Corporation.
   4 */
   5
   6#ifndef IOSM_IPC_PCIE_H
   7#define IOSM_IPC_PCIE_H
   8
   9#include <linux/device.h>
  10#include <linux/pci.h>
  11#include <linux/skbuff.h>
  12
  13#include "iosm_ipc_irq.h"
  14
  15/* Device ID */
  16#define INTEL_CP_DEVICE_7560_ID 0x7560
  17#define INTEL_CP_DEVICE_7360_ID 0x7360
  18
  19/* Define for BAR area usage */
  20#define IPC_DOORBELL_BAR0 0
  21#define IPC_SCRATCHPAD_BAR2 2
  22
  23/* Defines for DOORBELL registers information */
  24#define IPC_DOORBELL_CH_OFFSET BIT(5)
  25#define IPC_WRITE_PTR_REG_0 BIT(4)
  26#define IPC_CAPTURE_PTR_REG_0 BIT(3)
  27
  28/* Number of MSI used for IPC */
  29#define IPC_MSI_VECTORS 1
  30
  31/* Total number of Maximum IPC IRQ vectors used for IPC */
  32#define IPC_IRQ_VECTORS IPC_MSI_VECTORS
  33
  34/**
  35 * enum ipc_pcie_sleep_state - Enum type to different sleep state transitions
  36 * @IPC_PCIE_D0L12:     Put the sleep state in D0L12
  37 * @IPC_PCIE_D3L2:      Put the sleep state in D3L2
  38 */
  39enum ipc_pcie_sleep_state {
  40        IPC_PCIE_D0L12,
  41        IPC_PCIE_D3L2,
  42};
  43
  44/**
  45 * struct iosm_pcie - IPC_PCIE struct.
  46 * @pci:                        Address of the device description
  47 * @dev:                        Pointer to generic device structure
  48 * @ipc_regs:                   Remapped CP doorbell address of the irq register
  49 *                              set, to fire the doorbell irq.
  50 * @scratchpad:                 Remapped CP scratchpad address, to send the
  51 *                              configuration. tuple and the IPC descriptors
  52 *                              to CP in the ROM phase. The config tuple
  53 *                              information are saved on the MSI scratchpad.
  54 * @imem:                       Pointer to imem data struct
  55 * @ipc_regs_bar_nr:            BAR number to be used for IPC doorbell
  56 * @scratchpad_bar_nr:          BAR number to be used for Scratchpad
  57 * @nvec:                       number of requested irq vectors
  58 * @doorbell_reg_offset:        doorbell_reg_offset
  59 * @doorbell_write:             doorbell write register
  60 * @doorbell_capture:           doorbell capture resgister
  61 * @suspend:                    S2IDLE sleep/active
  62 * @d3l2_support:               Read WWAN RTD3 BIOS setting for D3L2 support
  63 */
  64struct iosm_pcie {
  65        struct pci_dev *pci;
  66        struct device *dev;
  67        void __iomem *ipc_regs;
  68        void __iomem *scratchpad;
  69        struct iosm_imem *imem;
  70        int ipc_regs_bar_nr;
  71        int scratchpad_bar_nr;
  72        int nvec;
  73        u32 doorbell_reg_offset;
  74        u32 doorbell_write;
  75        u32 doorbell_capture;
  76        unsigned long suspend;
  77        enum ipc_pcie_sleep_state d3l2_support;
  78};
  79
  80/**
  81 * struct ipc_skb_cb - Struct definition of the socket buffer which is mapped to
  82 *                     the cb field of sbk
  83 * @mapping:    Store physical or IOVA mapped address of skb virtual add.
  84 * @direction:  DMA direction
  85 * @len:        Length of the DMA mapped region
  86 * @op_type:    Expected values are defined about enum ipc_ul_usr_op.
  87 */
  88struct ipc_skb_cb {
  89        dma_addr_t mapping;
  90        int direction;
  91        int len;
  92        u8 op_type;
  93};
  94
  95/**
  96 * enum ipc_ul_usr_op - Control operation to execute the right action on
  97 *                      the user interface.
  98 * @UL_USR_OP_BLOCKED:  The uplink app was blocked until CP confirms that the
  99 *                      uplink buffer was consumed triggered by the IRQ.
 100 * @UL_MUX_OP_ADB:      In MUX mode the UL ADB shall be addedd to the free list.
 101 * @UL_DEFAULT:         SKB in non muxing mode
 102 */
 103enum ipc_ul_usr_op {
 104        UL_USR_OP_BLOCKED,
 105        UL_MUX_OP_ADB,
 106        UL_DEFAULT,
 107};
 108
 109/**
 110 * ipc_pcie_addr_map - Maps the kernel's virtual address to either IOVA
 111 *                     address space or Physical address space, the mapping is
 112 *                     stored in the skb's cb.
 113 * @ipc_pcie:   Pointer to struct iosm_pcie
 114 * @data:       Skb mem containing data
 115 * @size:       Data size
 116 * @mapping:    Dma mapping address
 117 * @direction:  Data direction
 118 *
 119 * Returns: 0 on success and failure value on error
 120 */
 121int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data,
 122                      size_t size, dma_addr_t *mapping, int direction);
 123
 124/**
 125 * ipc_pcie_addr_unmap - Unmaps the skb memory region from IOVA address space
 126 * @ipc_pcie:   Pointer to struct iosm_pcie
 127 * @size:       Data size
 128 * @mapping:    Dma mapping address
 129 * @direction:  Data direction
 130 */
 131void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size,
 132                         dma_addr_t mapping, int direction);
 133
 134/**
 135 * ipc_pcie_alloc_skb - Allocate an uplink SKB for the given size.
 136 * @ipc_pcie:   Pointer to struct iosm_pcie
 137 * @size:       Size of the SKB required.
 138 * @flags:      Allocation flags
 139 * @mapping:    Copies either mapped IOVA add. or converted Phy address
 140 * @direction:  DMA data direction
 141 * @headroom:   Header data offset
 142 *
 143 * Returns: Pointer to ipc_skb on Success, NULL on failure.
 144 */
 145struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size,
 146                                   gfp_t flags, dma_addr_t *mapping,
 147                                   int direction, size_t headroom);
 148
 149/**
 150 * ipc_pcie_alloc_local_skb - Allocate a local SKB for the given size.
 151 * @ipc_pcie:   Pointer to struct iosm_pcie
 152 * @flags:      Allocation flags
 153 * @size:       Size of the SKB required.
 154 *
 155 * Returns: Pointer to ipc_skb on Success, NULL on failure.
 156 */
 157struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie,
 158                                         gfp_t flags, size_t size);
 159
 160/**
 161 * ipc_pcie_kfree_skb - Free skb allocated by ipc_pcie_alloc_*_skb().
 162 * @ipc_pcie:   Pointer to struct iosm_pcie
 163 * @skb:        Pointer to the skb
 164 */
 165void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb);
 166
 167/**
 168 * ipc_pcie_check_data_link_active - Check Data Link Layer Active
 169 * @ipc_pcie:   Pointer to struct iosm_pcie
 170 *
 171 * Returns: true if active, otherwise false
 172 */
 173bool ipc_pcie_check_data_link_active(struct iosm_pcie *ipc_pcie);
 174
 175/**
 176 * ipc_pcie_suspend - Callback invoked by pm_runtime_suspend. It decrements
 177 *                   the device's usage count then, carry out a suspend,
 178 *                   either synchronous or asynchronous.
 179 * @ipc_pcie:   Pointer to struct iosm_pcie
 180 *
 181 * Returns: 0 on success and failure value on error
 182 */
 183int ipc_pcie_suspend(struct iosm_pcie *ipc_pcie);
 184
 185/**
 186 * ipc_pcie_resume - Callback invoked by pm_runtime_resume. It increments
 187 *                  the device's usage count then, carry out a resume,
 188 *                  either synchronous or asynchronous.
 189 * @ipc_pcie:   Pointer to struct iosm_pcie
 190 *
 191 * Returns: 0 on success and failure value on error
 192 */
 193int ipc_pcie_resume(struct iosm_pcie *ipc_pcie);
 194
 195/**
 196 * ipc_pcie_check_aspm_enabled - Check if ASPM L1 is already enabled
 197 * @ipc_pcie:                    Pointer to struct iosm_pcie
 198 * @parent:                      True if checking ASPM L1 for parent else false
 199 *
 200 * Returns: true if ASPM is already enabled else false
 201 */
 202bool ipc_pcie_check_aspm_enabled(struct iosm_pcie *ipc_pcie,
 203                                 bool parent);
 204/**
 205 * ipc_pcie_config_aspm - Configure ASPM L1
 206 * @ipc_pcie:   Pointer to struct iosm_pcie
 207 */
 208void ipc_pcie_config_aspm(struct iosm_pcie *ipc_pcie);
 209
 210#endif
 211