xref: /dpdk/drivers/baseband/la12xx/bbdev_la12xx_ipc.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
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