1530f9216SAlex Elder /* SPDX-License-Identifier: GPL-2.0 */ 2530f9216SAlex Elder 3530f9216SAlex Elder /* Copyright (c) 2018, The Linux Foundation. All rights reserved. 4a4388da5SAlex Elder * Copyright (C) 2018-2022 Linaro Ltd. 5530f9216SAlex Elder */ 6530f9216SAlex Elder #ifndef _IPA_QMI_MSG_H_ 7530f9216SAlex Elder #define _IPA_QMI_MSG_H_ 8530f9216SAlex Elder 9530f9216SAlex Elder /* === Only "ipa_qmi" and "ipa_qmi_msg.c" should include this file === */ 10530f9216SAlex Elder 11530f9216SAlex Elder #include <linux/types.h> 12530f9216SAlex Elder #include <linux/soc/qcom/qmi.h> 13530f9216SAlex Elder 14530f9216SAlex Elder /* Request/response/indication QMI message ids used for IPA. Receiving 15530f9216SAlex Elder * end issues a response for requests; indications require no response. 16530f9216SAlex Elder */ 17530f9216SAlex Elder #define IPA_QMI_INDICATION_REGISTER 0x20 /* modem -> AP request */ 18530f9216SAlex Elder #define IPA_QMI_INIT_DRIVER 0x21 /* AP -> modem request */ 19530f9216SAlex Elder #define IPA_QMI_INIT_COMPLETE 0x22 /* AP -> modem indication */ 20530f9216SAlex Elder #define IPA_QMI_DRIVER_INIT_COMPLETE 0x35 /* modem -> AP request */ 21530f9216SAlex Elder 22530f9216SAlex Elder /* The maximum size required for message types. These sizes include 23530f9216SAlex Elder * the message data, along with type (1 byte) and length (2 byte) 24530f9216SAlex Elder * information for each field. The qmi_send_*() interfaces require 25530f9216SAlex Elder * the message size to be provided. 26530f9216SAlex Elder */ 276ec7a9c2SAlex Elder #define IPA_QMI_INDICATION_REGISTER_REQ_SZ 20 /* -> server handle */ 28530f9216SAlex Elder #define IPA_QMI_INDICATION_REGISTER_RSP_SZ 7 /* <- server handle */ 29530f9216SAlex Elder #define IPA_QMI_INIT_DRIVER_REQ_SZ 162 /* client handle -> */ 30530f9216SAlex Elder #define IPA_QMI_INIT_DRIVER_RSP_SZ 25 /* client handle <- */ 31530f9216SAlex Elder #define IPA_QMI_INIT_COMPLETE_IND_SZ 7 /* <- server handle */ 32530f9216SAlex Elder #define IPA_QMI_DRIVER_INIT_COMPLETE_REQ_SZ 4 /* -> server handle */ 33530f9216SAlex Elder #define IPA_QMI_DRIVER_INIT_COMPLETE_RSP_SZ 7 /* <- server handle */ 34530f9216SAlex Elder 35530f9216SAlex Elder /* Maximum size of messages we expect the AP to receive (max of above) */ 36530f9216SAlex Elder #define IPA_QMI_SERVER_MAX_RCV_SZ 8 37530f9216SAlex Elder #define IPA_QMI_CLIENT_MAX_RCV_SZ 25 38530f9216SAlex Elder 39530f9216SAlex Elder /* Request message for the IPA_QMI_INDICATION_REGISTER request */ 40530f9216SAlex Elder struct ipa_indication_register_req { 41530f9216SAlex Elder u8 master_driver_init_complete_valid; 42530f9216SAlex Elder u8 master_driver_init_complete; 43530f9216SAlex Elder u8 data_usage_quota_reached_valid; 44530f9216SAlex Elder u8 data_usage_quota_reached; 45530f9216SAlex Elder u8 ipa_mhi_ready_ind_valid; 46530f9216SAlex Elder u8 ipa_mhi_ready_ind; 476ec7a9c2SAlex Elder u8 endpoint_desc_ind_valid; 486ec7a9c2SAlex Elder u8 endpoint_desc_ind; 496ec7a9c2SAlex Elder u8 bw_change_ind_valid; 506ec7a9c2SAlex Elder u8 bw_change_ind; 51530f9216SAlex Elder }; 52530f9216SAlex Elder 53530f9216SAlex Elder /* The response to a IPA_QMI_INDICATION_REGISTER request consists only of 54530f9216SAlex Elder * a standard QMI response. 55530f9216SAlex Elder */ 56530f9216SAlex Elder struct ipa_indication_register_rsp { 57530f9216SAlex Elder struct qmi_response_type_v01 rsp; 58530f9216SAlex Elder }; 59530f9216SAlex Elder 60530f9216SAlex Elder /* Request message for the IPA_QMI_DRIVER_INIT_COMPLETE request */ 61530f9216SAlex Elder struct ipa_driver_init_complete_req { 62530f9216SAlex Elder u8 status; 63530f9216SAlex Elder }; 64530f9216SAlex Elder 65530f9216SAlex Elder /* The response to a IPA_QMI_DRIVER_INIT_COMPLETE request consists only 66530f9216SAlex Elder * of a standard QMI response. 67530f9216SAlex Elder */ 68530f9216SAlex Elder struct ipa_driver_init_complete_rsp { 69530f9216SAlex Elder struct qmi_response_type_v01 rsp; 70530f9216SAlex Elder }; 71530f9216SAlex Elder 72530f9216SAlex Elder /* The message for the IPA_QMI_INIT_COMPLETE_IND indication consists 73530f9216SAlex Elder * only of a standard QMI response. 74530f9216SAlex Elder */ 75530f9216SAlex Elder struct ipa_init_complete_ind { 76530f9216SAlex Elder struct qmi_response_type_v01 status; 77530f9216SAlex Elder }; 78530f9216SAlex Elder 79530f9216SAlex Elder /* The AP tells the modem its platform type. We assume Android. */ 80530f9216SAlex Elder enum ipa_platform_type { 818701cb00SAlex Elder IPA_QMI_PLATFORM_TYPE_INVALID = 0x0, /* Invalid */ 828701cb00SAlex Elder IPA_QMI_PLATFORM_TYPE_TN = 0x1, /* Data card */ 838701cb00SAlex Elder IPA_QMI_PLATFORM_TYPE_LE = 0x2, /* Data router */ 848701cb00SAlex Elder IPA_QMI_PLATFORM_TYPE_MSM_ANDROID = 0x3, /* Android MSM */ 858701cb00SAlex Elder IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS = 0x4, /* Windows MSM */ 868701cb00SAlex Elder IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01 = 0x5, /* QNX MSM */ 87530f9216SAlex Elder }; 88530f9216SAlex Elder 89cf412ec3SAlex Elder /* This defines the start and end offset of a range of memory. The start 90cf412ec3SAlex Elder * value is a byte offset relative to the start of IPA shared memory. The 91cf412ec3SAlex Elder * end value is the last addressable unit *within* the range. Typically 92cf412ec3SAlex Elder * the end value is in units of bytes, however it can also be a maximum 93cf412ec3SAlex Elder * array index value. 94530f9216SAlex Elder */ 95530f9216SAlex Elder struct ipa_mem_bounds { 96530f9216SAlex Elder u32 start; 97530f9216SAlex Elder u32 end; 98530f9216SAlex Elder }; 99530f9216SAlex Elder 100530f9216SAlex Elder /* This defines the location and size of an array. The start value 101530f9216SAlex Elder * is an offset relative to the start of IPA shared memory. The 102530f9216SAlex Elder * size of the array is implied by the number of entries (the entry 103530f9216SAlex Elder * size is assumed to be known). 104530f9216SAlex Elder */ 105530f9216SAlex Elder struct ipa_mem_array { 106530f9216SAlex Elder u32 start; 107530f9216SAlex Elder u32 count; 108530f9216SAlex Elder }; 109530f9216SAlex Elder 110530f9216SAlex Elder /* This defines the location and size of a range of memory. The 111530f9216SAlex Elder * start is an offset relative to the start of IPA shared memory. 112530f9216SAlex Elder * This differs from the ipa_mem_bounds structure in that the size 113530f9216SAlex Elder * (in bytes) of the memory region is specified rather than the 114530f9216SAlex Elder * offset of its last byte. 115530f9216SAlex Elder */ 116530f9216SAlex Elder struct ipa_mem_range { 117530f9216SAlex Elder u32 start; 118530f9216SAlex Elder u32 size; 119530f9216SAlex Elder }; 120530f9216SAlex Elder 121530f9216SAlex Elder /* The message for the IPA_QMI_INIT_DRIVER request contains information 122530f9216SAlex Elder * from the AP that affects modem initialization. 123530f9216SAlex Elder */ 124530f9216SAlex Elder struct ipa_init_modem_driver_req { 125530f9216SAlex Elder u8 platform_type_valid; 126530f9216SAlex Elder u32 platform_type; /* enum ipa_platform_type */ 127530f9216SAlex Elder 128530f9216SAlex Elder /* Modem header table information. This defines the IPA shared 129530f9216SAlex Elder * memory in which the modem may insert header table entries. 130530f9216SAlex Elder */ 131530f9216SAlex Elder u8 hdr_tbl_info_valid; 132530f9216SAlex Elder struct ipa_mem_bounds hdr_tbl_info; 133530f9216SAlex Elder 134cf412ec3SAlex Elder /* Routing table information. These define the location and maximum 135cf412ec3SAlex Elder * *index* (not byte) for the modem portion of non-hashable IPv4 and 136cf412ec3SAlex Elder * IPv6 routing tables. The start values are byte offsets relative 137cf412ec3SAlex Elder * to the start of IPA shared memory. 138530f9216SAlex Elder */ 139530f9216SAlex Elder u8 v4_route_tbl_info_valid; 140cf412ec3SAlex Elder struct ipa_mem_bounds v4_route_tbl_info; 141530f9216SAlex Elder u8 v6_route_tbl_info_valid; 142cf412ec3SAlex Elder struct ipa_mem_bounds v6_route_tbl_info; 143530f9216SAlex Elder 144530f9216SAlex Elder /* Filter table information. These define the location of the 145530f9216SAlex Elder * non-hashable IPv4 and IPv6 filter tables. The start values are 146cf412ec3SAlex Elder * byte offsets relative to the start of IPA shared memory. 147530f9216SAlex Elder */ 148530f9216SAlex Elder u8 v4_filter_tbl_start_valid; 149530f9216SAlex Elder u32 v4_filter_tbl_start; 150530f9216SAlex Elder u8 v6_filter_tbl_start_valid; 151530f9216SAlex Elder u32 v6_filter_tbl_start; 152530f9216SAlex Elder 153530f9216SAlex Elder /* Modem memory information. This defines the location and 154530f9216SAlex Elder * size of memory available for the modem to use. 155530f9216SAlex Elder */ 156530f9216SAlex Elder u8 modem_mem_info_valid; 157530f9216SAlex Elder struct ipa_mem_range modem_mem_info; 158530f9216SAlex Elder 159530f9216SAlex Elder /* This defines the destination endpoint on the AP to which 160530f9216SAlex Elder * the modem driver can send control commands. Must be less 161530f9216SAlex Elder * than ipa_endpoint_max(). 162530f9216SAlex Elder */ 163530f9216SAlex Elder u8 ctrl_comm_dest_end_pt_valid; 164530f9216SAlex Elder u32 ctrl_comm_dest_end_pt; 165530f9216SAlex Elder 166530f9216SAlex Elder /* This defines whether the modem should load the microcontroller 167530f9216SAlex Elder * or not. It is unnecessary to reload it if the modem is being 168530f9216SAlex Elder * restarted. 169530f9216SAlex Elder * 170530f9216SAlex Elder * NOTE: this field is named "is_ssr_bootup" elsewhere. 171530f9216SAlex Elder */ 172530f9216SAlex Elder u8 skip_uc_load_valid; 173530f9216SAlex Elder u8 skip_uc_load; 174530f9216SAlex Elder 175530f9216SAlex Elder /* Processing context memory information. This defines the memory in 176530f9216SAlex Elder * which the modem may insert header processing context table entries. 177530f9216SAlex Elder */ 178530f9216SAlex Elder u8 hdr_proc_ctx_tbl_info_valid; 179530f9216SAlex Elder struct ipa_mem_bounds hdr_proc_ctx_tbl_info; 180530f9216SAlex Elder 181530f9216SAlex Elder /* Compression command memory information. This defines the memory 182530f9216SAlex Elder * in which the modem may insert compression/decompression commands. 183530f9216SAlex Elder */ 184530f9216SAlex Elder u8 zip_tbl_info_valid; 185530f9216SAlex Elder struct ipa_mem_bounds zip_tbl_info; 186530f9216SAlex Elder 187cf412ec3SAlex Elder /* Routing table information. These define the location and maximum 188cf412ec3SAlex Elder * *index* (not byte) for the modem portion of hashable IPv4 and IPv6 189cf412ec3SAlex Elder * routing tables (if supported by hardware). The start values are 190cf412ec3SAlex Elder * byte offsets relative to the start of IPA shared memory. 191530f9216SAlex Elder */ 192530f9216SAlex Elder u8 v4_hash_route_tbl_info_valid; 193cf412ec3SAlex Elder struct ipa_mem_bounds v4_hash_route_tbl_info; 194530f9216SAlex Elder u8 v6_hash_route_tbl_info_valid; 195cf412ec3SAlex Elder struct ipa_mem_bounds v6_hash_route_tbl_info; 196530f9216SAlex Elder 197530f9216SAlex Elder /* Filter table information. These define the location and size 198cf412ec3SAlex Elder * of hashable IPv4 and IPv6 filter tables (if supported by hardware). 199cf412ec3SAlex Elder * The start values are byte offsets relative to the start of IPA 200cf412ec3SAlex Elder * shared memory. 201530f9216SAlex Elder */ 202530f9216SAlex Elder u8 v4_hash_filter_tbl_start_valid; 203530f9216SAlex Elder u32 v4_hash_filter_tbl_start; 204530f9216SAlex Elder u8 v6_hash_filter_tbl_start_valid; 205530f9216SAlex Elder u32 v6_hash_filter_tbl_start; 206530f9216SAlex Elder 207530f9216SAlex Elder /* Statistics information. These define the locations of the 208530f9216SAlex Elder * first and last statistics sub-regions. (IPA v4.0 and above) 209530f9216SAlex Elder */ 210530f9216SAlex Elder u8 hw_stats_quota_base_addr_valid; 211530f9216SAlex Elder u32 hw_stats_quota_base_addr; 212530f9216SAlex Elder u8 hw_stats_quota_size_valid; 213530f9216SAlex Elder u32 hw_stats_quota_size; 214530f9216SAlex Elder u8 hw_stats_drop_base_addr_valid; 215530f9216SAlex Elder u32 hw_stats_drop_base_addr; 216530f9216SAlex Elder u8 hw_stats_drop_size_valid; 217530f9216SAlex Elder u32 hw_stats_drop_size; 218530f9216SAlex Elder }; 219530f9216SAlex Elder 220530f9216SAlex Elder /* The response to a IPA_QMI_INIT_DRIVER request begins with a standard 221530f9216SAlex Elder * QMI response, but contains other information as well. Currently we 2222540d3c9SSlark Xiao * simply wait for the INIT_DRIVER transaction to complete and 223530f9216SAlex Elder * ignore any other data that might be returned. 224530f9216SAlex Elder */ 225530f9216SAlex Elder struct ipa_init_modem_driver_rsp { 226530f9216SAlex Elder struct qmi_response_type_v01 rsp; 227530f9216SAlex Elder 228530f9216SAlex Elder /* This defines the destination endpoint on the modem to which 229530f9216SAlex Elder * the AP driver can send control commands. Must be less than 230530f9216SAlex Elder * ipa_endpoint_max(). 231530f9216SAlex Elder */ 232530f9216SAlex Elder u8 ctrl_comm_dest_end_pt_valid; 233530f9216SAlex Elder u32 ctrl_comm_dest_end_pt; 234530f9216SAlex Elder 235530f9216SAlex Elder /* This defines the default endpoint. The AP driver is not 236530f9216SAlex Elder * required to configure the hardware with this value. Must 237530f9216SAlex Elder * be less than ipa_endpoint_max(). 238530f9216SAlex Elder */ 239530f9216SAlex Elder u8 default_end_pt_valid; 240530f9216SAlex Elder u32 default_end_pt; 241530f9216SAlex Elder 242530f9216SAlex Elder /* This defines whether a second handshake is required to complete 243530f9216SAlex Elder * initialization. 244530f9216SAlex Elder */ 245530f9216SAlex Elder u8 modem_driver_init_pending_valid; 246530f9216SAlex Elder u8 modem_driver_init_pending; 247530f9216SAlex Elder }; 248530f9216SAlex Elder 249530f9216SAlex Elder /* Message structure definitions defined in "ipa_qmi_msg.c" */ 250*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_indication_register_req_ei[]; 251*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_indication_register_rsp_ei[]; 252*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_driver_init_complete_req_ei[]; 253*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_driver_init_complete_rsp_ei[]; 254*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_init_complete_ind_ei[]; 255*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_mem_bounds_ei[]; 256*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_mem_array_ei[]; 257*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_mem_range_ei[]; 258*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_init_modem_driver_req_ei[]; 259*c0facc04SJeff Johnson extern const struct qmi_elem_info ipa_init_modem_driver_rsp_ei[]; 260530f9216SAlex Elder 261530f9216SAlex Elder #endif /* !_IPA_QMI_MSG_H_ */ 262