/* SPDX-License-Identifier: GPL-2.0 *//* Copyright (c) 2018, The Linux Foundation. All rights reserved. * Copyright (C) 2018-2024 Linaro Ltd. */#ifndef _IPA_QMI_MSG_H_#define _IPA_QMI_MSG_H_/* === Only "ipa_qmi" and "ipa_qmi_msg.c" should include this file === */#include <linux/types.h>#include <linux/soc/qcom/qmi.h>/* Request/response/indication QMI message ids used for IPA. Receiving * end issues a response for requests; indications require no response. */#define IPA_QMI_INDICATION_REGISTER 0x20 /* modem -> AP request */#define IPA_QMI_INIT_DRIVER 0x21 /* AP -> modem request */#define IPA_QMI_INIT_COMPLETE 0x22 /* AP -> modem indication */#define IPA_QMI_DRIVER_INIT_COMPLETE 0x35 /* modem -> AP request *//* The maximum size required for message types. These sizes include * the message data, along with type (1 byte) and length (2 byte) * information for each field. The qmi_send_*() interfaces require * the message size to be provided. */#define IPA_QMI_INDICATION_REGISTER_REQ_SZ 20 /* -> server handle */#define IPA_QMI_INDICATION_REGISTER_RSP_SZ 7 /* <- server handle */#define IPA_QMI_INIT_DRIVER_REQ_SZ 162 /* client handle -> */#define IPA_QMI_INIT_DRIVER_RSP_SZ 25 /* client handle <- */#define IPA_QMI_INIT_COMPLETE_IND_SZ 7 /* <- server handle */#define IPA_QMI_DRIVER_INIT_COMPLETE_REQ_SZ 4 /* -> server handle */#define IPA_QMI_DRIVER_INIT_COMPLETE_RSP_SZ 7 /* <- server handle *//* Maximum size of messages we expect the AP to receive (max of above) */#define IPA_QMI_SERVER_MAX_RCV_SZ 8#define IPA_QMI_CLIENT_MAX_RCV_SZ 25/* Request message for the IPA_QMI_INDICATION_REGISTER request */struct ipa_indication_register_req { u8 master_driver_init_complete_valid; u8 master_driver_init_complete; u8 data_usage_quota_reached_valid; u8 data_usage_quota_reached; u8 ipa_mhi_ready_ind_valid; u8 ipa_mhi_ready_ind; u8 endpoint_desc_ind_valid; u8 endpoint_desc_ind; u8 bw_change_ind_valid; u8 bw_change_ind;};/* The response to a IPA_QMI_INDICATION_REGISTER request consists only of * a standard QMI response. */struct ipa_indication_register_rsp { struct qmi_response_type_v01 rsp;};/* Request message for the IPA_QMI_DRIVER_INIT_COMPLETE request */struct ipa_driver_init_complete_req { u8 status;};/* The response to a IPA_QMI_DRIVER_INIT_COMPLETE request consists only * of a standard QMI response. */struct ipa_driver_init_complete_rsp { struct qmi_response_type_v01 rsp;};/* The message for the IPA_QMI_INIT_COMPLETE_IND indication consists * only of a standard QMI response. */struct ipa_init_complete_ind { struct qmi_response_type_v01 status;};/* The AP tells the modem its platform type. We assume Android. */enum ipa_platform_type { IPA_QMI_PLATFORM_TYPE_INVALID = 0x0, /* Invalid */ IPA_QMI_PLATFORM_TYPE_TN = 0x1, /* Data card */ IPA_QMI_PLATFORM_TYPE_LE = 0x2, /* Data router */ IPA_QMI_PLATFORM_TYPE_MSM_ANDROID = 0x3, /* Android MSM */ IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS = 0x4, /* Windows MSM */ IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01 = 0x5, /* QNX MSM */};/* This defines the start and end offset of a range of memory. The start * value is a byte offset relative to the start of IPA shared memory. The * end value is the last addressable unit *within* the range. Typically * the end value is in units of bytes, however it can also be a maximum * array index value. */struct ipa_mem_bounds { u32 start; u32 end;};/* This defines the location and size of an array. The start value * is an offset relative to the start of IPA shared memory. The * size of the array is implied by the number of entries (the entry * size is assumed to be known). */struct ipa_mem_array { u32 start; u32 count;};/* This defines the location and size of a range of memory. The * start is an offset relative to the start of IPA shared memory. * This differs from the ipa_mem_bounds structure in that the size * (in bytes) of the memory region is specified rather than the * offset of its last byte. */struct ipa_mem_range { u32 start; u32 size;};/* The message for the IPA_QMI_INIT_DRIVER request contains information * from the AP that affects modem initialization. */struct ipa_init_modem_driver_req { u8 platform_type_valid; u32 platform_type; /* enum ipa_platform_type */ /* Modem header table information. This defines the IPA shared * memory in which the modem may insert header table entries. */ u8 hdr_tbl_info_valid; struct ipa_mem_bounds hdr_tbl_info; /* Routing table information. These define the location and maximum * *index* (not byte) for the modem portion of non-hashable IPv4 and * IPv6 routing tables. The start values are byte offsets relative * to the start of IPA shared memory. */ u8 v4_route_tbl_info_valid; struct ipa_mem_bounds v4_route_tbl_info; u8 v6_route_tbl_info_valid; struct ipa_mem_bounds v6_route_tbl_info; /* Filter table information. These define the location of the * non-hashable IPv4 and IPv6 filter tables. The start values are * byte offsets relative to the start of IPA shared memory. */ u8 v4_filter_tbl_start_valid; u32 v4_filter_tbl_start; u8 v6_filter_tbl_start_valid; u32 v6_filter_tbl_start; /* Modem memory information. This defines the location and * size of memory available for the modem to use. */ u8 modem_mem_info_valid; struct ipa_mem_range modem_mem_info; /* This defines the destination endpoint on the AP to which * the modem driver can send control commands. Must be less * than ipa_endpoint_max(). */ u8 ctrl_comm_dest_end_pt_valid; u32 ctrl_comm_dest_end_pt; /* This defines whether the modem should load the microcontroller * or not. It is unnecessary to reload it if the modem is being * restarted. * * NOTE: this field is named "is_ssr_bootup" elsewhere. */ u8 skip_uc_load_valid; u8 skip_uc_load; /* Processing context memory information. This defines the memory in * which the modem may insert header processing context table entries. */ u8 hdr_proc_ctx_tbl_info_valid; struct ipa_mem_bounds hdr_proc_ctx_tbl_info; /* Compression command memory information. This defines the memory * in which the modem may insert compression/decompression commands. */ u8 zip_tbl_info_valid; struct ipa_mem_bounds zip_tbl_info; /* Routing table information. These define the location and maximum * *index* (not byte) for the modem portion of hashable IPv4 and IPv6 * routing tables (if supported by hardware). The start values are * byte offsets relative to the start of IPA shared memory. */ u8 v4_hash_route_tbl_info_valid; struct ipa_mem_bounds v4_hash_route_tbl_info; u8 v6_hash_route_tbl_info_valid; struct ipa_mem_bounds v6_hash_route_tbl_info; /* Filter table information. These define the location and size * of hashable IPv4 and IPv6 filter tables (if supported by hardware). * The start values are byte offsets relative to the start of IPA * shared memory. */ u8 v4_hash_filter_tbl_start_valid; u32 v4_hash_filter_tbl_start; u8 v6_hash_filter_tbl_start_valid; u32 v6_hash_filter_tbl_start; /* Statistics information. These define the locations of the * first and last statistics sub-regions. (IPA v4.0 and above) */ u8 hw_stats_quota_base_addr_valid; u32 hw_stats_quota_base_addr; u8 hw_stats_quota_size_valid; u32 hw_stats_quota_size; u8 hw_stats_drop_base_addr_valid; u32 hw_stats_drop_base_addr; u8 hw_stats_drop_size_valid; u32 hw_stats_drop_size;};/* The response to a IPA_QMI_INIT_DRIVER request begins with a standard * QMI response, but contains other information as well. Currently we * simply wait for the INIT_DRIVER transaction to complete and * ignore any other data that might be returned. */struct ipa_init_modem_driver_rsp { struct qmi_response_type_v01 rsp; /* This defines the destination endpoint on the modem to which * the AP driver can send control commands. Must be less than * ipa_endpoint_max(). */ u8 ctrl_comm_dest_end_pt_valid; u32 ctrl_comm_dest_end_pt; /* This defines the default endpoint. The AP driver is not * required to configure the hardware with this value. Must * be less than ipa_endpoint_max(). */ u8 default_end_pt_valid; u32 default_end_pt; /* This defines whether a second handshake is required to complete * initialization. */ u8 modem_driver_init_pending_valid; u8 modem_driver_init_pending;};/* Message structure definitions defined in "ipa_qmi_msg.c" */extern const struct qmi_elem_info ipa_indication_register_req_ei[];extern const struct qmi_elem_info ipa_indication_register_rsp_ei[];extern const struct qmi_elem_info ipa_driver_init_complete_req_ei[];extern const struct qmi_elem_info ipa_driver_init_complete_rsp_ei[];extern const struct qmi_elem_info ipa_init_complete_ind_ei[];extern const struct qmi_elem_info ipa_mem_bounds_ei[];extern const struct qmi_elem_info ipa_mem_array_ei[];extern const struct qmi_elem_info ipa_mem_range_ei[];extern const struct qmi_elem_info ipa_init_modem_driver_req_ei[];extern const struct qmi_elem_info ipa_init_modem_driver_rsp_ei[];#endif /* !_IPA_QMI_MSG_H_ */
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
* Copyright (C) 2018-2024 Linaro Ltd.
*/
#ifndef _IPA_QMI_MSG_H_
#define _IPA_QMI_MSG_H_
/* === Only "ipa_qmi" and "ipa_qmi_msg.c" should include this file === */
#include <linux/types.h>
#include <linux/soc/qcom/qmi.h>
/* Request/response/indication QMI message ids used for IPA. Receiving
* end issues a response for requests; indications require no response.
*/
#define IPA_QMI_INDICATION_REGISTER 0x20 /* modem -> AP request */
#define IPA_QMI_INIT_DRIVER 0x21 /* AP -> modem request */
#define IPA_QMI_INIT_COMPLETE 0x22 /* AP -> modem indication */
#define IPA_QMI_DRIVER_INIT_COMPLETE 0x35 /* modem -> AP request */
/* The maximum size required for message types. These sizes include
* the message data, along with type (1 byte) and length (2 byte)
* information for each field. The qmi_send_*() interfaces require
* the message size to be provided.
*/
#define IPA_QMI_INDICATION_REGISTER_REQ_SZ 20 /* -> server handle */
#define IPA_QMI_INDICATION_REGISTER_RSP_SZ 7 /* <- server handle */
#define IPA_QMI_INIT_DRIVER_REQ_SZ 162 /* client handle -> */
#define IPA_QMI_INIT_DRIVER_RSP_SZ 25 /* client handle <- */
#define IPA_QMI_INIT_COMPLETE_IND_SZ 7 /* <- server handle */
#define IPA_QMI_DRIVER_INIT_COMPLETE_REQ_SZ 4 /* -> server handle */
#define IPA_QMI_DRIVER_INIT_COMPLETE_RSP_SZ 7 /* <- server handle */
/* Maximum size of messages we expect the AP to receive (max of above) */
#define IPA_QMI_SERVER_MAX_RCV_SZ 8
#define IPA_QMI_CLIENT_MAX_RCV_SZ 25
/* Request message for the IPA_QMI_INDICATION_REGISTER request */
struct ipa_indication_register_req {
u8 master_driver_init_complete_valid;
u8 master_driver_init_complete;
u8 data_usage_quota_reached_valid;
u8 data_usage_quota_reached;
u8 ipa_mhi_ready_ind_valid;
u8 ipa_mhi_ready_ind;
u8 endpoint_desc_ind_valid;
u8 endpoint_desc_ind;
u8 bw_change_ind_valid;
u8 bw_change_ind;
};
/* The response to a IPA_QMI_INDICATION_REGISTER request consists only of
* a standard QMI response.
*/
struct ipa_indication_register_rsp {
struct qmi_response_type_v01 rsp;
};
/* Request message for the IPA_QMI_DRIVER_INIT_COMPLETE request */
struct ipa_driver_init_complete_req {
u8 status;
};
/* The response to a IPA_QMI_DRIVER_INIT_COMPLETE request consists only
* of a standard QMI response.
*/
struct ipa_driver_init_complete_rsp {
struct qmi_response_type_v01 rsp;
};
/* The message for the IPA_QMI_INIT_COMPLETE_IND indication consists
* only of a standard QMI response.
*/
struct ipa_init_complete_ind {
struct qmi_response_type_v01 status;
};
/* The AP tells the modem its platform type. We assume Android. */
enum ipa_platform_type {
IPA_QMI_PLATFORM_TYPE_INVALID = 0x0, /* Invalid */
IPA_QMI_PLATFORM_TYPE_TN = 0x1, /* Data card */
IPA_QMI_PLATFORM_TYPE_LE = 0x2, /* Data router */
IPA_QMI_PLATFORM_TYPE_MSM_ANDROID = 0x3, /* Android MSM */
IPA_QMI_PLATFORM_TYPE_MSM_WINDOWS = 0x4, /* Windows MSM */
IPA_QMI_PLATFORM_TYPE_MSM_QNX_V01 = 0x5, /* QNX MSM */
};
/* This defines the start and end offset of a range of memory. The start
* value is a byte offset relative to the start of IPA shared memory. The
* end value is the last addressable unit *within* the range. Typically
* the end value is in units of bytes, however it can also be a maximum
* array index value.
*/
struct ipa_mem_bounds {
u32 start;
u32 end;
};
/* This defines the location and size of an array. The start value
* is an offset relative to the start of IPA shared memory. The
* size of the array is implied by the number of entries (the entry
* size is assumed to be known).
*/
struct ipa_mem_array {
u32 start;
u32 count;
};
/* This defines the location and size of a range of memory. The
* start is an offset relative to the start of IPA shared memory.
* This differs from the ipa_mem_bounds structure in that the size
* (in bytes) of the memory region is specified rather than the
* offset of its last byte.
*/
struct ipa_mem_range {
u32 start;
u32 size;
};
/* The message for the IPA_QMI_INIT_DRIVER request contains information
* from the AP that affects modem initialization.
*/
struct ipa_init_modem_driver_req {
u8 platform_type_valid;
u32 platform_type; /* enum ipa_platform_type */
/* Modem header table information. This defines the IPA shared
* memory in which the modem may insert header table entries.
*/
u8 hdr_tbl_info_valid;
struct ipa_mem_bounds hdr_tbl_info;
/* Routing table information. These define the location and maximum
* *index* (not byte) for the modem portion of non-hashable IPv4 and
* IPv6 routing tables. The start values are byte offsets relative
* to the start of IPA shared memory.
*/
u8 v4_route_tbl_info_valid;
struct ipa_mem_bounds v4_route_tbl_info;
u8 v6_route_tbl_info_valid;
struct ipa_mem_bounds v6_route_tbl_info;
/* Filter table information. These define the location of the
* non-hashable IPv4 and IPv6 filter tables. The start values are
* byte offsets relative to the start of IPA shared memory.
*/
u8 v4_filter_tbl_start_valid;
u32 v4_filter_tbl_start;
u8 v6_filter_tbl_start_valid;
u32 v6_filter_tbl_start;
/* Modem memory information. This defines the location and
* size of memory available for the modem to use.
*/
u8 modem_mem_info_valid;
struct ipa_mem_range modem_mem_info;
/* This defines the destination endpoint on the AP to which
* the modem driver can send control commands. Must be less
* than ipa_endpoint_max().
*/
u8 ctrl_comm_dest_end_pt_valid;
u32 ctrl_comm_dest_end_pt;
/* This defines whether the modem should load the microcontroller
* or not. It is unnecessary to reload it if the modem is being
* restarted.
*
* NOTE: this field is named "is_ssr_bootup" elsewhere.
*/
u8 skip_uc_load_valid;
u8 skip_uc_load;
/* Processing context memory information. This defines the memory in
* which the modem may insert header processing context table entries.
*/
u8 hdr_proc_ctx_tbl_info_valid;
struct ipa_mem_bounds hdr_proc_ctx_tbl_info;
/* Compression command memory information. This defines the memory
* in which the modem may insert compression/decompression commands.
*/
u8 zip_tbl_info_valid;
struct ipa_mem_bounds zip_tbl_info;
/* Routing table information. These define the location and maximum
* *index* (not byte) for the modem portion of hashable IPv4 and IPv6
* routing tables (if supported by hardware). The start values are
* byte offsets relative to the start of IPA shared memory.
*/
u8 v4_hash_route_tbl_info_valid;
struct ipa_mem_bounds v4_hash_route_tbl_info;
u8 v6_hash_route_tbl_info_valid;
struct ipa_mem_bounds v6_hash_route_tbl_info;
/* Filter table information. These define the location and size
* of hashable IPv4 and IPv6 filter tables (if supported by hardware).
* The start values are byte offsets relative to the start of IPA
* shared memory.
*/
u8 v4_hash_filter_tbl_start_valid;
u32 v4_hash_filter_tbl_start;
u8 v6_hash_filter_tbl_start_valid;
u32 v6_hash_filter_tbl_start;
/* Statistics information. These define the locations of the
* first and last statistics sub-regions. (IPA v4.0 and above)
*/
u8 hw_stats_quota_base_addr_valid;
u32 hw_stats_quota_base_addr;
u8 hw_stats_quota_size_valid;
u32 hw_stats_quota_size;
u8 hw_stats_drop_base_addr_valid;
u32 hw_stats_drop_base_addr;
u8 hw_stats_drop_size_valid;
u32 hw_stats_drop_size;
};
/* The response to a IPA_QMI_INIT_DRIVER request begins with a standard
* QMI response, but contains other information as well. Currently we
* simply wait for the INIT_DRIVER transaction to complete and
* ignore any other data that might be returned.
*/
struct ipa_init_modem_driver_rsp {
struct qmi_response_type_v01 rsp;
/* This defines the destination endpoint on the modem to which
* the AP driver can send control commands. Must be less than
* ipa_endpoint_max().
*/
u8 ctrl_comm_dest_end_pt_valid;
u32 ctrl_comm_dest_end_pt;
/* This defines the default endpoint. The AP driver is not
* required to configure the hardware with this value. Must
* be less than ipa_endpoint_max().
*/
u8 default_end_pt_valid;
u32 default_end_pt;
/* This defines whether a second handshake is required to complete
* initialization.
*/
u8 modem_driver_init_pending_valid;
u8 modem_driver_init_pending;
};
/* Message structure definitions defined in "ipa_qmi_msg.c" */
extern const struct qmi_elem_info ipa_indication_register_req_ei[];
extern const struct qmi_elem_info ipa_indication_register_rsp_ei[];
extern const struct qmi_elem_info ipa_driver_init_complete_req_ei[];
extern const struct qmi_elem_info ipa_driver_init_complete_rsp_ei[];
extern const struct qmi_elem_info ipa_init_complete_ind_ei[];
extern const struct qmi_elem_info ipa_mem_bounds_ei[];
extern const struct qmi_elem_info ipa_mem_array_ei[];
extern const struct qmi_elem_info ipa_mem_range_ei[];
extern const struct qmi_elem_info ipa_init_modem_driver_req_ei[];
extern const struct qmi_elem_info ipa_init_modem_driver_rsp_ei[];
#endif /* !_IPA_QMI_MSG_H_ */