1915cdc07SHemant Agrawal /* SPDX-License-Identifier: BSD-3-Clause 2915cdc07SHemant Agrawal * Copyright 2020-2021 NXP 3915cdc07SHemant Agrawal */ 4915cdc07SHemant Agrawal #ifndef __BBDEV_LA12XX_IPC_H__ 5915cdc07SHemant Agrawal #define __BBDEV_LA12XX_IPC_H__ 6915cdc07SHemant Agrawal 724d0ba22SHemant Agrawal #define LA12XX_MAX_QUEUES 20 824d0ba22SHemant Agrawal #define HOST_RX_QUEUEID_OFFSET LA12XX_MAX_QUEUES 924d0ba22SHemant Agrawal 1024d0ba22SHemant Agrawal /** No. of max channel per instance */ 1124d0ba22SHemant Agrawal #define IPC_MAX_CHANNEL_COUNT (64) 1224d0ba22SHemant Agrawal 13915cdc07SHemant Agrawal /** No. of max channel per instance */ 14915cdc07SHemant Agrawal #define IPC_MAX_DEPTH (16) 15915cdc07SHemant Agrawal 1624d0ba22SHemant Agrawal /** No. of max IPC instance per modem */ 1724d0ba22SHemant Agrawal #define IPC_MAX_INSTANCE_COUNT (1) 1824d0ba22SHemant Agrawal 1924d0ba22SHemant Agrawal /** Error codes */ 2024d0ba22SHemant Agrawal #define IPC_SUCCESS (0) /** IPC operation success */ 2124d0ba22SHemant Agrawal #define IPC_INPUT_INVALID (-1) /** Invalid input to API */ 2224d0ba22SHemant Agrawal #define IPC_CH_INVALID (-2) /** Channel no is invalid */ 2324d0ba22SHemant Agrawal #define IPC_INSTANCE_INVALID (-3) /** Instance no is invalid */ 2424d0ba22SHemant Agrawal #define IPC_MEM_INVALID (-4) /** Insufficient memory */ 2524d0ba22SHemant Agrawal #define IPC_CH_FULL (-5) /** Channel is full */ 2624d0ba22SHemant Agrawal #define IPC_CH_EMPTY (-6) /** Channel is empty */ 2724d0ba22SHemant Agrawal #define IPC_BL_EMPTY (-7) /** Free buffer list is empty */ 2824d0ba22SHemant Agrawal #define IPC_BL_FULL (-8) /** Free buffer list is full */ 2924d0ba22SHemant Agrawal #define IPC_HOST_BUF_ALLOC_FAIL (-9) /** DPDK malloc fail */ 3024d0ba22SHemant Agrawal #define IPC_MD_SZ_MISS_MATCH (-10) /** META DATA size in mhif miss matched*/ 3124d0ba22SHemant Agrawal #define IPC_MALLOC_FAIL (-11) /** system malloc fail */ 3224d0ba22SHemant Agrawal #define IPC_IOCTL_FAIL (-12) /** IOCTL call failed */ 3324d0ba22SHemant Agrawal #define IPC_MMAP_FAIL (-14) /** MMAP fail */ 3424d0ba22SHemant Agrawal #define IPC_OPEN_FAIL (-15) /** OPEN fail */ 3524d0ba22SHemant Agrawal #define IPC_EVENTFD_FAIL (-16) /** eventfd initialization failed */ 3624d0ba22SHemant Agrawal #define IPC_NOT_IMPLEMENTED (-17) /** IPC feature is not implemented yet*/ 3724d0ba22SHemant Agrawal 3824d0ba22SHemant Agrawal #define SET_HIF_HOST_RDY(hif, RDY_MASK) (hif->host_ready |= RDY_MASK) 3924d0ba22SHemant Agrawal #define CHK_HIF_MOD_RDY(hif, RDY_MASK) (hif->mod_ready & RDY_MASK) 4024d0ba22SHemant Agrawal 4124d0ba22SHemant Agrawal /* Host Ready bits */ 4224d0ba22SHemant Agrawal #define HIF_HOST_READY_HOST_REGIONS (1 << 0) 4324d0ba22SHemant Agrawal #define HIF_HOST_READY_IPC_LIB (1 << 12) 4424d0ba22SHemant Agrawal #define HIF_HOST_READY_IPC_APP (1 << 13) 4524d0ba22SHemant Agrawal #define HIF_HOST_READY_FECA (1 << 14) 4624d0ba22SHemant Agrawal 4724d0ba22SHemant Agrawal /* Modem Ready bits */ 4824d0ba22SHemant Agrawal #define HIF_MOD_READY_IPC_LIB (1 << 5) 4924d0ba22SHemant Agrawal #define HIF_MOD_READY_IPC_APP (1 << 6) 5024d0ba22SHemant Agrawal #define HIF_MOD_READY_FECA (1 << 7) 5124d0ba22SHemant Agrawal 5224d0ba22SHemant Agrawal typedef void *ipc_t; 5324d0ba22SHemant Agrawal 5424d0ba22SHemant Agrawal struct ipc_msg { 5524d0ba22SHemant Agrawal int chid; 5624d0ba22SHemant Agrawal void *addr; 5724d0ba22SHemant Agrawal uint32_t len; 5824d0ba22SHemant Agrawal uint8_t flags; 5924d0ba22SHemant Agrawal }; 6024d0ba22SHemant Agrawal 6124d0ba22SHemant Agrawal typedef struct { 6224d0ba22SHemant Agrawal uint64_t host_phys; 6324d0ba22SHemant Agrawal uint32_t modem_phys; 6424d0ba22SHemant Agrawal void *host_vaddr; 6524d0ba22SHemant Agrawal uint32_t size; 6624d0ba22SHemant Agrawal } mem_range_t; 6724d0ba22SHemant Agrawal 6824d0ba22SHemant Agrawal #define GUL_IPC_MAGIC 'R' 6924d0ba22SHemant Agrawal 7024d0ba22SHemant Agrawal #define IOCTL_GUL_IPC_GET_SYS_MAP _IOW(GUL_IPC_MAGIC, 1, struct ipc_msg *) 7124d0ba22SHemant Agrawal #define IOCTL_GUL_IPC_CHANNEL_REGISTER _IOWR(GUL_IPC_MAGIC, 4, struct ipc_msg *) 7224d0ba22SHemant Agrawal #define IOCTL_GUL_IPC_CHANNEL_DEREGISTER \ 7324d0ba22SHemant Agrawal _IOWR(GUL_IPC_MAGIC, 5, struct ipc_msg *) 7424d0ba22SHemant Agrawal #define IOCTL_GUL_IPC_CHANNEL_RAISE_INTERRUPT _IOW(GUL_IPC_MAGIC, 6, int *) 7524d0ba22SHemant Agrawal 76b73d2f34SHemant Agrawal #define GUL_USER_HUGE_PAGE_OFFSET (0) 77b73d2f34SHemant Agrawal #define GUL_PCI1_ADDR_BASE (0x00000000ULL) 78b73d2f34SHemant Agrawal 79b73d2f34SHemant Agrawal #define GUL_USER_HUGE_PAGE_ADDR (GUL_PCI1_ADDR_BASE + GUL_USER_HUGE_PAGE_OFFSET) 80b73d2f34SHemant Agrawal 81b73d2f34SHemant Agrawal /* IPC PI/CI index & flag manipulation helpers */ 82b73d2f34SHemant Agrawal #define IPC_PI_CI_FLAG_MASK 0x80000000 /* (1<<31) */ 83b73d2f34SHemant Agrawal #define IPC_PI_CI_INDEX_MASK 0x7FFFFFFF /* ~(1<<31) */ 84b73d2f34SHemant Agrawal 85b73d2f34SHemant Agrawal #define IPC_SET_PI_FLAG(x) (x |= IPC_PI_CI_FLAG_MASK) 86b73d2f34SHemant Agrawal #define IPC_RESET_PI_FLAG(x) (x &= IPC_PI_CI_INDEX_MASK) 87b73d2f34SHemant Agrawal #define IPC_GET_PI_FLAG(x) (x >> 31) 88b73d2f34SHemant Agrawal #define IPC_GET_PI_INDEX(x) (x & IPC_PI_CI_INDEX_MASK) 89b73d2f34SHemant Agrawal 90b73d2f34SHemant Agrawal #define IPC_SET_CI_FLAG(x) (x |= IPC_PI_CI_FLAG_MASK) 91b73d2f34SHemant Agrawal #define IPC_RESET_CI_FLAG(x) (x &= IPC_PI_CI_INDEX_MASK) 92b73d2f34SHemant Agrawal #define IPC_GET_CI_FLAG(x) (x >> 31) 93b73d2f34SHemant Agrawal #define IPC_GET_CI_INDEX(x) (x & IPC_PI_CI_INDEX_MASK) 94b73d2f34SHemant Agrawal 9524d0ba22SHemant Agrawal /** buffer ring common metadata */ 96*e7750639SAndre Muezerie typedef struct __rte_packed_begin ipc_bd_ring_md { 9724d0ba22SHemant Agrawal volatile uint32_t pi; /**< Producer index and flag (MSB) 9824d0ba22SHemant Agrawal * which flip for each Ring wrapping 9924d0ba22SHemant Agrawal */ 10024d0ba22SHemant Agrawal volatile uint32_t ci; /**< Consumer index and flag (MSB) 10124d0ba22SHemant Agrawal * which flip for each Ring wrapping 10224d0ba22SHemant Agrawal */ 10324d0ba22SHemant Agrawal uint32_t ring_size; /**< depth (Used to roll-over pi/ci) */ 10424d0ba22SHemant Agrawal uint32_t msg_size; /**< Size of the each buffer */ 105*e7750639SAndre Muezerie } __rte_packed_end ipc_br_md_t; 10624d0ba22SHemant Agrawal 10724d0ba22SHemant Agrawal /** IPC buffer descriptor */ 108*e7750639SAndre Muezerie typedef struct __rte_packed_begin ipc_buffer_desc { 10924d0ba22SHemant Agrawal union { 11024d0ba22SHemant Agrawal uint64_t host_virt; /**< msg's host virtual address */ 11124d0ba22SHemant Agrawal struct { 11224d0ba22SHemant Agrawal uint32_t host_virt_l; 11324d0ba22SHemant Agrawal uint32_t host_virt_h; 11424d0ba22SHemant Agrawal }; 11524d0ba22SHemant Agrawal }; 11624d0ba22SHemant Agrawal uint32_t modem_ptr; /**< msg's modem physical address */ 11724d0ba22SHemant Agrawal uint32_t len; /**< msg len */ 118*e7750639SAndre Muezerie } __rte_packed_end ipc_bd_t; 11924d0ba22SHemant Agrawal 120*e7750639SAndre Muezerie typedef struct __rte_packed_begin ipc_channel { 12124d0ba22SHemant Agrawal uint32_t ch_id; /**< Channel id */ 12224d0ba22SHemant Agrawal ipc_br_md_t md; /**< Metadata for BD ring */ 12324d0ba22SHemant Agrawal ipc_bd_t bd_h[IPC_MAX_DEPTH]; /**< Buffer Descriptor on Host */ 12424d0ba22SHemant Agrawal ipc_bd_t bd_m[IPC_MAX_DEPTH]; /**< Buffer Descriptor on Modem */ 12524d0ba22SHemant Agrawal uint32_t op_type; /**< Type of the BBDEV operation 12624d0ba22SHemant Agrawal * supported on this channel 12724d0ba22SHemant Agrawal */ 12824d0ba22SHemant Agrawal uint32_t depth; /**< Channel depth */ 12924d0ba22SHemant Agrawal uint32_t feca_blk_id; /**< FECA Transport Block ID for processing */ 13024d0ba22SHemant Agrawal uint32_t la12xx_core_id;/**< LA12xx core ID on which this will be 13124d0ba22SHemant Agrawal * scheduled 13224d0ba22SHemant Agrawal */ 13324d0ba22SHemant Agrawal uint32_t feca_input_circ_size; /**< FECA transport block input 13424d0ba22SHemant Agrawal * circular buffer size 13524d0ba22SHemant Agrawal */ 13624d0ba22SHemant Agrawal uint32_t host_ipc_params; /**< Address for host IPC parameters */ 137*e7750639SAndre Muezerie } __rte_packed_end ipc_ch_t; 13824d0ba22SHemant Agrawal 139*e7750639SAndre Muezerie typedef struct __rte_packed_begin ipc_instance { 14024d0ba22SHemant Agrawal uint32_t instance_id; /**< instance id, use to init this 14124d0ba22SHemant Agrawal * instance by ipc_init API 14224d0ba22SHemant Agrawal */ 14324d0ba22SHemant Agrawal uint32_t initialized; /**< Set in ipc_init */ 14424d0ba22SHemant Agrawal ipc_ch_t ch_list[IPC_MAX_CHANNEL_COUNT]; 14524d0ba22SHemant Agrawal /**< Channel descriptors in this instance */ 146*e7750639SAndre Muezerie } __rte_packed_end ipc_instance_t; 14724d0ba22SHemant Agrawal 148*e7750639SAndre Muezerie typedef struct __rte_packed_begin ipc_metadata { 14924d0ba22SHemant Agrawal uint32_t ipc_host_signature; /**< IPC host signature, Set by host/L2 */ 15024d0ba22SHemant Agrawal uint32_t ipc_geul_signature; /**< IPC geul signature, Set by modem */ 15124d0ba22SHemant Agrawal ipc_instance_t instance_list[IPC_MAX_INSTANCE_COUNT]; 152*e7750639SAndre Muezerie } __rte_packed_end ipc_metadata_t; 15324d0ba22SHemant Agrawal 15424d0ba22SHemant Agrawal typedef struct ipc_channel_us_priv { 15524d0ba22SHemant Agrawal int32_t eventfd; 15624d0ba22SHemant Agrawal uint32_t channel_id; 15724d0ba22SHemant Agrawal /* In flight packets status for buffer list. */ 15824d0ba22SHemant Agrawal uint8_t bufs_inflight[IPC_MAX_DEPTH]; 15924d0ba22SHemant Agrawal } ipc_channel_us_t; 16024d0ba22SHemant Agrawal 16124d0ba22SHemant Agrawal typedef struct { 16224d0ba22SHemant Agrawal uint64_t host_phys; 16324d0ba22SHemant Agrawal uint32_t modem_phys; 16424d0ba22SHemant Agrawal uint32_t size; 16524d0ba22SHemant Agrawal } mem_strt_addr_t; 16624d0ba22SHemant Agrawal 16724d0ba22SHemant Agrawal typedef struct { 16824d0ba22SHemant Agrawal mem_strt_addr_t modem_ccsrbar; 16924d0ba22SHemant Agrawal mem_strt_addr_t peb_start; /* PEB meta data */ 17024d0ba22SHemant Agrawal mem_strt_addr_t mhif_start; /* MHIF meta daat */ 17124d0ba22SHemant Agrawal mem_strt_addr_t hugepg_start; /* Modem to access hugepage */ 17224d0ba22SHemant Agrawal } sys_map_t; 17324d0ba22SHemant Agrawal 17424d0ba22SHemant Agrawal typedef struct ipc_priv_t { 17524d0ba22SHemant Agrawal int instance_id; 17624d0ba22SHemant Agrawal int dev_ipc; 17724d0ba22SHemant Agrawal int dev_mem; 17824d0ba22SHemant Agrawal sys_map_t sys_map; 17924d0ba22SHemant Agrawal mem_range_t modem_ccsrbar; 18024d0ba22SHemant Agrawal mem_range_t peb_start; 18124d0ba22SHemant Agrawal mem_range_t mhif_start; 18224d0ba22SHemant Agrawal mem_range_t hugepg_start; 18324d0ba22SHemant Agrawal ipc_channel_us_t *channels[IPC_MAX_CHANNEL_COUNT]; 18424d0ba22SHemant Agrawal ipc_instance_t *instance; 18524d0ba22SHemant Agrawal ipc_instance_t *instance_bk; 18624d0ba22SHemant Agrawal } ipc_userspace_t; 18724d0ba22SHemant Agrawal 18824d0ba22SHemant Agrawal /** Structure specifying enqueue operation (enqueue at LA1224) */ 18924d0ba22SHemant Agrawal struct bbdev_ipc_enqueue_op { 19024d0ba22SHemant Agrawal /** Status of operation that was performed */ 19124d0ba22SHemant Agrawal int32_t status; 19224d0ba22SHemant Agrawal /** CRC Status of SD operation that was performed */ 19324d0ba22SHemant Agrawal int32_t crc_stat_addr; 19424d0ba22SHemant Agrawal /** HARQ Output buffer memory length for Shared Decode. 19524d0ba22SHemant Agrawal * Filled by LA12xx. 19624d0ba22SHemant Agrawal */ 19724d0ba22SHemant Agrawal uint32_t out_len; 19824d0ba22SHemant Agrawal /** Reserved (for 8 byte alignment) */ 19924d0ba22SHemant Agrawal uint32_t rsvd; 20024d0ba22SHemant Agrawal }; 20124d0ba22SHemant Agrawal 202b73d2f34SHemant Agrawal /** Structure specifying dequeue operation (dequeue at LA1224) */ 203b73d2f34SHemant Agrawal struct bbdev_ipc_dequeue_op { 204b73d2f34SHemant Agrawal /** Input buffer memory address */ 205b73d2f34SHemant Agrawal uint32_t in_addr; 206b73d2f34SHemant Agrawal /** Input buffer memory length */ 207b73d2f34SHemant Agrawal uint32_t in_len; 208b73d2f34SHemant Agrawal /** Output buffer memory address */ 209b73d2f34SHemant Agrawal uint32_t out_addr; 210b73d2f34SHemant Agrawal /** Output buffer memory length */ 211b73d2f34SHemant Agrawal uint32_t out_len; 212b73d2f34SHemant Agrawal /* Number of code blocks. Only set when HARQ is used */ 213b73d2f34SHemant Agrawal uint32_t num_code_blocks; 214b73d2f34SHemant Agrawal /** Dequeue Operation flags */ 215b73d2f34SHemant Agrawal uint32_t op_flags; 216b73d2f34SHemant Agrawal /** Shared metadata between L1 and L2 */ 217b73d2f34SHemant Agrawal uint32_t shared_metadata; 218b73d2f34SHemant Agrawal }; 219b73d2f34SHemant Agrawal 220915cdc07SHemant Agrawal /* This shared memory would be on the host side which have copy of some 221915cdc07SHemant Agrawal * of the parameters which are also part of Shared BD ring. Read access 222915cdc07SHemant Agrawal * of these parameters from the host side would not be over PCI. 223915cdc07SHemant Agrawal */ 224*e7750639SAndre Muezerie typedef struct __rte_packed_begin host_ipc_params { 225915cdc07SHemant Agrawal volatile uint32_t pi; 226915cdc07SHemant Agrawal volatile uint32_t ci; 22724d0ba22SHemant Agrawal volatile uint32_t bd_m_modem_ptr[IPC_MAX_DEPTH]; 228*e7750639SAndre Muezerie } __rte_packed_end host_ipc_params_t; 229915cdc07SHemant Agrawal 230*e7750639SAndre Muezerie struct __rte_packed_begin hif_ipc_regs { 23124d0ba22SHemant Agrawal uint32_t ipc_mdata_offset; 23224d0ba22SHemant Agrawal uint32_t ipc_mdata_size; 233*e7750639SAndre Muezerie } __rte_packed_end; 23424d0ba22SHemant Agrawal 235*e7750639SAndre Muezerie struct __rte_packed_begin gul_hif { 23624d0ba22SHemant Agrawal uint32_t ver; 23724d0ba22SHemant Agrawal uint32_t hif_ver; 23824d0ba22SHemant Agrawal uint32_t status; 23924d0ba22SHemant Agrawal volatile uint32_t host_ready; 24024d0ba22SHemant Agrawal volatile uint32_t mod_ready; 24124d0ba22SHemant Agrawal struct hif_ipc_regs ipc_regs; 242*e7750639SAndre Muezerie } __rte_packed_end; 24324d0ba22SHemant Agrawal 244915cdc07SHemant Agrawal #endif 245