1 /* SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2020-21 Intel Corporation.
6 #ifndef IOSM_IPC_MMIO_H
7 #define IOSM_IPC_MMIO_H
9 /* Minimal IOSM CP VERSION which has valid CP_CAPABILITIES field */
10 #define IOSM_CP_VERSION 0x0100UL
12 /* DL dir Aggregation support mask */
13 #define DL_AGGR BIT(9)
15 /* UL dir Aggregation support mask */
16 #define UL_AGGR BIT(8)
18 /* UL flow credit support mask */
19 #define UL_FLOW_CREDIT BIT(21)
21 /* Possible states of the IPC finite state machine. */
22 enum ipc_mem_device_ipc_state {
23 IPC_MEM_DEVICE_IPC_UNINIT,
24 IPC_MEM_DEVICE_IPC_INIT,
25 IPC_MEM_DEVICE_IPC_RUNNING,
26 IPC_MEM_DEVICE_IPC_RECOVERY,
27 IPC_MEM_DEVICE_IPC_ERROR,
28 IPC_MEM_DEVICE_IPC_DONT_CARE,
29 IPC_MEM_DEVICE_IPC_INVALID = -1
32 /* Boot ROM exit status. */
34 IMEM_ROM_EXIT_OPEN_EXT = 0x01,
35 IMEM_ROM_EXIT_OPEN_MEM = 0x02,
36 IMEM_ROM_EXIT_CERT_EXT = 0x10,
37 IMEM_ROM_EXIT_CERT_MEM = 0x20,
38 IMEM_ROM_EXIT_FAIL = 0xFF
42 enum ipc_mem_exec_stage {
43 IPC_MEM_EXEC_STAGE_RUN = 0x600DF00D,
44 IPC_MEM_EXEC_STAGE_CRASH = 0x8BADF00D,
45 IPC_MEM_EXEC_STAGE_CD_READY = 0xBADC0DED,
46 IPC_MEM_EXEC_STAGE_BOOT = 0xFEEDB007,
47 IPC_MEM_EXEC_STAGE_PSI = 0xFEEDBEEF,
48 IPC_MEM_EXEC_STAGE_EBL = 0xFEEDCAFE,
49 IPC_MEM_EXEC_STAGE_INVALID = 0xFFFFFFFF
52 /* mmio scratchpad info */
68 * struct iosm_mmio - MMIO region mapped to the doorbell scratchpad.
69 * @base: Base address of MMIO region
70 * @dev: Pointer to device structure
71 * @offset: Start offset
72 * @context_info_addr: Physical base address of context info structure
73 * @chip_info_version: Version of chip info structure
74 * @chip_info_size: Size of chip info structure
75 * @has_mux_lite: It doesn't support mux aggergation
76 * @has_ul_flow_credit: Ul flow credit support
77 * @has_slp_no_prot: Device sleep no protocol support
78 * @has_mcr_support: Usage of mcr support
81 unsigned char __iomem *base;
83 struct mmio_offset offset;
84 phys_addr_t context_info_addr;
85 unsigned int chip_info_version;
86 unsigned int chip_info_size;
94 * ipc_mmio_init - Allocate mmio instance data
95 * @mmio_addr: Mapped AP base address of the MMIO area.
96 * @dev: Pointer to device structure
98 * Returns: address of mmio instance data or NULL if fails.
100 struct iosm_mmio *ipc_mmio_init(void __iomem *mmio_addr, struct device *dev);
103 * ipc_mmio_set_psi_addr_and_size - Set start address and size of the
104 * primary system image (PSI) for the
106 * @ipc_mmio: Pointer to mmio instance
108 * @size: PSI immage size
110 void ipc_mmio_set_psi_addr_and_size(struct iosm_mmio *ipc_mmio, dma_addr_t addr,
114 * ipc_mmio_set_contex_info_addr - Stores the Context Info Address in
115 * MMIO instance to share it with CP during
117 * @ipc_mmio: Pointer to mmio instance
118 * @addr: 64-bit address of AP context information.
120 void ipc_mmio_set_contex_info_addr(struct iosm_mmio *ipc_mmio,
124 * ipc_mmio_get_cp_version - Get the CP IPC version
125 * @ipc_mmio: Pointer to mmio instance
127 * Returns: version number on success and failure value on error.
129 int ipc_mmio_get_cp_version(struct iosm_mmio *ipc_mmio);
132 * ipc_mmio_get_rom_exit_code - Get exit code from CP boot rom download app
133 * @ipc_mmio: Pointer to mmio instance
135 * Returns: exit code from CP boot rom download APP
137 enum rom_exit_code ipc_mmio_get_rom_exit_code(struct iosm_mmio *ipc_mmio);
140 * ipc_mmio_get_exec_stage - Query CP execution stage
141 * @ipc_mmio: Pointer to mmio instance
143 * Returns: CP execution stage
145 enum ipc_mem_exec_stage ipc_mmio_get_exec_stage(struct iosm_mmio *ipc_mmio);
148 * ipc_mmio_get_ipc_state - Query CP IPC state
149 * @ipc_mmio: Pointer to mmio instance
151 * Returns: CP IPC state
153 enum ipc_mem_device_ipc_state
154 ipc_mmio_get_ipc_state(struct iosm_mmio *ipc_mmio);
157 * ipc_mmio_copy_chip_info - Copy size bytes of CP chip info structure
158 * into caller provided buffer
159 * @ipc_mmio: Pointer to mmio instance
160 * @dest: Pointer to caller provided buff
161 * @size: Number of bytes to copy
163 void ipc_mmio_copy_chip_info(struct iosm_mmio *ipc_mmio, void *dest,
167 * ipc_mmio_config - Write context info and AP memory range addresses.
168 * This needs to be called when CP is in
169 * IPC_MEM_DEVICE_IPC_INIT state
171 * @ipc_mmio: Pointer to mmio instance
173 void ipc_mmio_config(struct iosm_mmio *ipc_mmio);
176 * ipc_mmio_update_cp_capability - Read and update modem capability, from mmio
179 * @ipc_mmio: Pointer to mmio instance
181 void ipc_mmio_update_cp_capability(struct iosm_mmio *ipc_mmio);