1 /* SPDX-License-Identifier: GPL-2.0-only 2 * 3 * Copyright (C) 2020-21 Intel Corporation. 4 */ 5 6 #ifndef IOSM_IPC_MMIO_H 7 #define IOSM_IPC_MMIO_H 8 9 /* Minimal IOSM CP VERSION which has valid CP_CAPABILITIES field */ 10 #define IOSM_CP_VERSION 0x0100UL 11 12 /* DL dir Aggregation support mask */ 13 #define DL_AGGR BIT(9) 14 15 /* UL dir Aggregation support mask */ 16 #define UL_AGGR BIT(8) 17 18 /* UL flow credit support mask */ 19 #define UL_FLOW_CREDIT BIT(21) 20 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 30 }; 31 32 /* Boot ROM exit status. */ 33 enum rom_exit_code { 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 39 }; 40 41 /* Boot stages */ 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 50 }; 51 52 /* mmio scratchpad info */ 53 struct mmio_offset { 54 int exec_stage; 55 int chip_info; 56 int rom_exit_code; 57 int psi_address; 58 int psi_size; 59 int ipc_status; 60 int context_info; 61 int ap_win_base; 62 int ap_win_end; 63 int cp_version; 64 int cp_capability; 65 }; 66 67 /** 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 79 */ 80 struct iosm_mmio { 81 unsigned char __iomem *base; 82 struct device *dev; 83 struct mmio_offset offset; 84 phys_addr_t context_info_addr; 85 unsigned int chip_info_version; 86 unsigned int chip_info_size; 87 u8 has_mux_lite:1, 88 has_ul_flow_credit:1, 89 has_slp_no_prot:1, 90 has_mcr_support:1; 91 }; 92 93 /** 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 97 * 98 * Returns: address of mmio instance data or NULL if fails. 99 */ 100 struct iosm_mmio *ipc_mmio_init(void __iomem *mmio_addr, struct device *dev); 101 102 /** 103 * ipc_mmio_set_psi_addr_and_size - Set start address and size of the 104 * primary system image (PSI) for the 105 * FW dowload. 106 * @ipc_mmio: Pointer to mmio instance 107 * @addr: PSI address 108 * @size: PSI immage size 109 */ 110 void ipc_mmio_set_psi_addr_and_size(struct iosm_mmio *ipc_mmio, dma_addr_t addr, 111 u32 size); 112 113 /** 114 * ipc_mmio_set_contex_info_addr - Stores the Context Info Address in 115 * MMIO instance to share it with CP during 116 * mmio_init. 117 * @ipc_mmio: Pointer to mmio instance 118 * @addr: 64-bit address of AP context information. 119 */ 120 void ipc_mmio_set_contex_info_addr(struct iosm_mmio *ipc_mmio, 121 phys_addr_t addr); 122 123 /** 124 * ipc_mmio_get_cp_version - Get the CP IPC version 125 * @ipc_mmio: Pointer to mmio instance 126 * 127 * Returns: version number on success and failure value on error. 128 */ 129 int ipc_mmio_get_cp_version(struct iosm_mmio *ipc_mmio); 130 131 /** 132 * ipc_mmio_get_rom_exit_code - Get exit code from CP boot rom download app 133 * @ipc_mmio: Pointer to mmio instance 134 * 135 * Returns: exit code from CP boot rom download APP 136 */ 137 enum rom_exit_code ipc_mmio_get_rom_exit_code(struct iosm_mmio *ipc_mmio); 138 139 /** 140 * ipc_mmio_get_exec_stage - Query CP execution stage 141 * @ipc_mmio: Pointer to mmio instance 142 * 143 * Returns: CP execution stage 144 */ 145 enum ipc_mem_exec_stage ipc_mmio_get_exec_stage(struct iosm_mmio *ipc_mmio); 146 147 /** 148 * ipc_mmio_get_ipc_state - Query CP IPC state 149 * @ipc_mmio: Pointer to mmio instance 150 * 151 * Returns: CP IPC state 152 */ 153 enum ipc_mem_device_ipc_state 154 ipc_mmio_get_ipc_state(struct iosm_mmio *ipc_mmio); 155 156 /** 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 162 */ 163 void ipc_mmio_copy_chip_info(struct iosm_mmio *ipc_mmio, void *dest, 164 size_t size); 165 166 /** 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 170 * 171 * @ipc_mmio: Pointer to mmio instance 172 */ 173 void ipc_mmio_config(struct iosm_mmio *ipc_mmio); 174 175 /** 176 * ipc_mmio_update_cp_capability - Read and update modem capability, from mmio 177 * capability offset 178 * 179 * @ipc_mmio: Pointer to mmio instance 180 */ 181 void ipc_mmio_update_cp_capability(struct iosm_mmio *ipc_mmio); 182 183 #endif 184