diff --git a/include/uapi/linux/msm_rmnet.h b/include/uapi/linux/msm_rmnet.h new file mode 100644 index 000000000000..3f7f57c73563 --- /dev/null +++ b/include/uapi/linux/msm_rmnet.h @@ -0,0 +1,365 @@ +/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ +/* + * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ + + +#ifndef _UAPI_MSM_RMNET_H_ +#define _UAPI_MSM_RMNET_H_ + +#include + +/* Bitmap macros for RmNET driver operation mode. */ +#define RMNET_MODE_NONE (0x00) +#define RMNET_MODE_LLP_ETH (0x01) +#define RMNET_MODE_LLP_IP (0x02) +#define RMNET_MODE_QOS (0x04) +#define RMNET_MODE_MASK (RMNET_MODE_LLP_ETH | \ + RMNET_MODE_LLP_IP | \ + RMNET_MODE_QOS) + +#define RMNET_IS_MODE_QOS(mode) \ + ((mode & RMNET_MODE_QOS) == RMNET_MODE_QOS) +#define RMNET_IS_MODE_IP(mode) \ + ((mode & RMNET_MODE_LLP_IP) == RMNET_MODE_LLP_IP) + +/** + * IOCTL commands + * Values chosen to not conflict with other drivers in the ecosystem + */ + +#define RMNET_IOCTL_SET_LLP_ETHERNET 0x000089F1 /* Set Ethernet protocol */ +#define RMNET_IOCTL_SET_LLP_IP 0x000089F2 /* Set RAWIP protocol */ +#define RMNET_IOCTL_GET_LLP 0x000089F3 /* Get link protocol */ +#define RMNET_IOCTL_SET_QOS_ENABLE 0x000089F4 /* Set QoS header enabled */ +#define RMNET_IOCTL_SET_QOS_DISABLE 0x000089F5 /* Set QoS header disabled*/ +#define RMNET_IOCTL_GET_QOS 0x000089F6 /* Get QoS header state */ +#define RMNET_IOCTL_GET_OPMODE 0x000089F7 /* Get operation mode */ +#define RMNET_IOCTL_OPEN 0x000089F8 /* Open transport port */ +#define RMNET_IOCTL_CLOSE 0x000089F9 /* Close transport port */ +#define RMNET_IOCTL_FLOW_ENABLE 0x000089FA /* Flow enable */ +#define RMNET_IOCTL_FLOW_DISABLE 0x000089FB /* Flow disable */ +#define RMNET_IOCTL_FLOW_SET_HNDL 0x000089FC /* Set flow handle */ +#define RMNET_IOCTL_EXTENDED 0x000089FD /* Extended IOCTLs */ +#define RMNET_IOCTL_EXTENDED_V2 0x000089FE /* Extended V2 IOCTLs */ + +/* RmNet Data Required IOCTLs */ +#define RMNET_IOCTL_GET_SUPPORTED_FEATURES 0x0000 /* Get features */ +#define RMNET_IOCTL_SET_MRU 0x0001 /* Set MRU */ +#define RMNET_IOCTL_GET_MRU 0x0002 /* Get MRU */ +#define RMNET_IOCTL_GET_EPID 0x0003 /* Get endpoint ID */ +#define RMNET_IOCTL_GET_DRIVER_NAME 0x0004 /* Get driver name */ +#define RMNET_IOCTL_ADD_MUX_CHANNEL 0x0005 /* Add MUX ID */ +#define RMNET_IOCTL_SET_EGRESS_DATA_FORMAT 0x0006 /* Set EDF */ +#define RMNET_IOCTL_SET_INGRESS_DATA_FORMAT 0x0007 /* Set IDF */ +#define RMNET_IOCTL_SET_AGGREGATION_COUNT 0x0008 /* Set agg count */ +#define RMNET_IOCTL_GET_AGGREGATION_COUNT 0x0009 /* Get agg count */ +#define RMNET_IOCTL_SET_AGGREGATION_SIZE 0x000A /* Set agg size */ +#define RMNET_IOCTL_GET_AGGREGATION_SIZE 0x000B /* Get agg size */ +#define RMNET_IOCTL_FLOW_CONTROL 0x000C /* Do flow control */ +#define RMNET_IOCTL_GET_DFLT_CONTROL_CHANNEL 0x000D /* For legacy use */ +#define RMNET_IOCTL_GET_HWSW_MAP 0x000E /* Get HW/SW map */ +#define RMNET_IOCTL_SET_RX_HEADROOM 0x000F /* RX Headroom */ +#define RMNET_IOCTL_GET_EP_PAIR 0x0010 /* Endpoint pair */ +#define RMNET_IOCTL_SET_QOS_VERSION 0x0011 /* 8/6 byte QoS hdr*/ +#define RMNET_IOCTL_GET_QOS_VERSION 0x0012 /* 8/6 byte QoS hdr*/ +#define RMNET_IOCTL_GET_SUPPORTED_QOS_MODES 0x0013 /* Get QoS modes */ +#define RMNET_IOCTL_SET_SLEEP_STATE 0x0014 /* Set sleep state */ +#define RMNET_IOCTL_SET_XLAT_DEV_INFO 0x0015 /* xlat dev name */ +#define RMNET_IOCTL_DEREGISTER_DEV 0x0016 /* Dereg a net dev */ +#define RMNET_IOCTL_GET_SG_SUPPORT 0x0017 /* Query sg support*/ +#define RMNET_IOCTL_SET_OFFLOAD 0x0018 /* Set IPA offload */ +#define RMNET_IOCTL_GET_MTU 0x0019 /* Get v4/v6 MTU */ +#define RMNET_IOCTL_SET_MTU 0x0020 /* Set v4/v6 MTU */ +#define RMNET_IOCTL_GET_EPID_LL 0x0021 /* Get LL ep ID */ +#define RMNET_IOCTL_GET_EP_PAIR_LL 0x0022 /* LL ep pair */ + +/** + * RMNET_IOCTL_EXTENDED_V2 ioctl types. + * Should be sent through "extended_ioctl_type" variable. + * Any number of new IOCTL type can be added. + */ +/** + * Set EDF with config values + * Includes all the egress pipe's config in one single ioctl + */ +#define RMNET_IOCTL_SET_EGRESS_DATA_FORMAT_V2 0x0000 +/** + * Set IDF with config values + * Includes all the ingress pipe's config in one single ioctl + */ +#define RMNET_IOCTL_SET_INGRESS_DATA_FORMAT_V2 0x0001 + +/* Return values for the RMNET_IOCTL_GET_SUPPORTED_FEATURES IOCTL */ +#define RMNET_IOCTL_FEAT_NOTIFY_MUX_CHANNEL (1<<0) +#define RMNET_IOCTL_FEAT_SET_EGRESS_DATA_FORMAT (1<<1) +#define RMNET_IOCTL_FEAT_SET_INGRESS_DATA_FORMAT (1<<2) +#define RMNET_IOCTL_FEAT_SET_AGGREGATION_COUNT (1<<3) +#define RMNET_IOCTL_FEAT_GET_AGGREGATION_COUNT (1<<4) +#define RMNET_IOCTL_FEAT_SET_AGGREGATION_SIZE (1<<5) +#define RMNET_IOCTL_FEAT_GET_AGGREGATION_SIZE (1<<6) +#define RMNET_IOCTL_FEAT_FLOW_CONTROL (1<<7) +#define RMNET_IOCTL_FEAT_GET_DFLT_CONTROL_CHANNEL (1<<8) +#define RMNET_IOCTL_FEAT_GET_HWSW_MAP (1<<9) + +/* Input values for the RMNET_IOCTL_SET_EGRESS_DATA_FORMAT IOCTL */ +#define RMNET_IOCTL_EGRESS_FORMAT_MAP (1<<1) +#define RMNET_IOCTL_EGRESS_FORMAT_AGGREGATION (1<<2) +#define RMNET_IOCTL_EGRESS_FORMAT_MUXING (1<<3) +#define RMNET_IOCTL_EGRESS_FORMAT_CHECKSUM (1<<4) + +/* Input values for the RMNET_IOCTL_SET_INGRESS_DATA_FORMAT IOCTL */ +#define RMNET_IOCTL_INGRESS_FORMAT_MAP (1<<1) +#define RMNET_IOCTL_INGRESS_FORMAT_DEAGGREGATION (1<<2) +#define RMNET_IOCTL_INGRESS_FORMAT_DEMUXING (1<<3) +#define RMNET_IOCTL_INGRESS_FORMAT_CHECKSUM (1<<4) +#define RMNET_IOCTL_INGRESS_FORMAT_AGG_DATA (1<<5) + +/* Input values for the RMNET_IOCTL_SET_OFFLOAD */ +#define RMNET_IOCTL_OFFLOAD_FORMAT_NONE (0) +#define RMNET_IOCTL_COALESCING_FORMAT_TCP (1<<0) +#define RMNET_IOCTL_COALESCING_FORMAT_UDP (1<<1) + +/* User space may not have this defined. */ +#ifndef IFNAMSIZ +#define IFNAMSIZ 16 +#endif + +/** + * enum rmnet_egress_ep_type - To specify pipe type for egress + * @RMNET_EGRESS_DEFAULT: WAN Producer pipe + * @RMNET_EGRESS_LOW_LAT_CTRL: Low latency ctrl producer pipe + * @RMNET_EGRESS_LOW_LAT_DATA: Low latency data producer pipe + * Add any number of pipes before max + */ +enum rmnet_egress_ep_type { + RMNET_EGRESS_DEFAULT = 0x0000, + RMNET_EGRESS_LOW_LAT_CTRL = 0x0001, + RMNET_EGRESS_LOW_LAT_DATA = 0x0002, + RMNET_EGRESS_MAX = 0x0003, +}; + + +/** + * enum rmnet_ingress_ep_type - To specify pipe type for ingress + * @RMNET_INGRESS_COALS: Coalescing Consumer pipe + * @RMNET_INGRESS_DEFAULT: WAN Consumer pipe + * @RMNET_INGRESS_LOW_LAT_CTRL: Low latency ctrl consumer pipe + * @RMNET_INGRESS_LOW_LAT_DATA: Low latency data consumer pipe + * Add any number of pipes before max + */ +enum rmnet_ingress_ep_type { + RMNET_INGRESS_COALS = 0x0000, + RMNET_INGRESS_DEFAULT = 0x0001, + RMNET_INGRESS_LOW_LAT_CTRL = 0x0002, + RMNET_INGRESS_LOW_LAT_DATA = 0x0003, + RMNET_INGRESS_MAX = 0x0004, +}; + +/** + * enum rmnet_egress_ingress_pipe_setup_status - To give + * back the pipe setup status info to netmngr + * @IPA_PIPE_SETUP_SUCCESS: pipe setup successful + * @IPA_PIPE_SETUP_FAILURE: pipe setup failure + * @IPA_PIPE_SETUP_EXISTS: pipe already exists + */ +enum rmnet_egress_ingress_pipe_setup_status { + IPA_PIPE_SETUP_SUCCESS = 0x0000, + IPA_PIPE_SETUP_FAILURE = 0x0001, + IPA_PIPE_SETUP_EXISTS = 0x0002, +}; + +/** + * struct rmnet_egress_param - Include all the egress params that + * needs to be configured. Structure should have even + * __u32 variables or add padding. + * @egress_ep_type: Should be from rmnet_egress_ep_type + * @pipe_setup_status: Out parameter. + * Need to place below enum + * rmnet_egress_ingress_pipe_setup_status + * @cs_offload_en: Checksum offload (1 - Enable) + * @aggr_en: Aggregation Enable (1 - Enable) + * @ulso_en: (1 - Enable) + * @ipid_min_max_idx(for ULSO): A value from the range [0, 2] determines + * the registers pair from which to read the minimum and maximum of + * IPv4 packets ID. + * @int_modt: GSI event ring interrupt moderation time + * cycles base interrupt moderation (32KHz clock) + * @int_modc: GSI event ring interrupt moderation packet counter + */ +struct rmnet_egress_param { + __u32 egress_ep_type; + __u32 pipe_setup_status; + __u32 cs_offload_en; + __u32 aggr_en; + __u32 ulso_en; + __u32 ipid_min_max_idx; + __u32 int_modt; + __u32 int_modc; +}; + +/** + * struct rmnet_ingress_param - Include all the ingress params that + * needs to be configured. Structure should have even + * __u32 variables or add padding. + * @ingress_ep_type: Should be from rmnet_ingress_ep_type + * @pipe_setup_status: Out parameter. + * Need to place below enum + * rmnet_egress_ingress_pipe_setup_status + * @cs_offload_en: Checksum offload (1 - Enable) + * @buff_size: Actual buff size of rx_pkt + * @agg_byte_limit: Aggregation byte limit + * @agg_time_limit: Aggregation time limit + * @agg_pkt_limit: Aggregation packet limit + * @int_modt: GSI event ring interrupt moderation time + * cycles base interrupt moderation (32KHz clock) + * @int_modc: GSI event ring interrupt moderation packet counter + * @padding: To make it 64 bit packed structure + */ +struct rmnet_ingress_param { + __u32 ingress_ep_type; + __u32 pipe_setup_status; + __u32 cs_offload_en; + __u32 buff_size; + __u32 agg_byte_limit; + __u32 agg_time_limit; + __u32 agg_pkt_limit; + __u32 int_modt; + __u32 int_modc; + __u32 padding; +}; + +/** + * Following uapi coding convention here + * struct mystruct { + * __u64 pointer; + * }; + * + * In userspace code: + * mystruct.pointer = (__u64)(uintptr_t) &pointer; + * In kernelspace code: + * copy_from_user(&struct, u64_to_user_ptr(mystruct.pointer), size); + */ + +/** + * struct ingress_format_v2 - To include all the ingress params that + * needs to be configured. Structure should have even + * __u32 variables or add padding. + * @ingress_param_ptr: Should be rmnet_ingress_param pointer. + * Array of ingress params for all the pipes. + * @ingress_param_size: = sizeof(rmnet_ingress_param); + * @number_of_eps: Number of ep_types, should be = RMNET_INGRESS_MAX + */ +struct ingress_format_v2 { + __u64 ingress_param_ptr; + __u32 ingress_param_size; + __u32 number_of_eps; +}; + +/** + * struct egress_format_v2 - To include all the egress params that + * needs to be configured. Structure should have even + * __u32 variables or add padding. + * @egress_param_ptr: Should be rmnet_egress_param pointer. + * Array of egress params for all the pipes. + * @egress_param_size: = sizeof(rmnet_egress_param); + * @number_of_eps: Number of ep_types, should be = RMNET_EGRESS_MAX. + */ +struct egress_format_v2 { + __u64 egress_param_ptr; + __u32 egress_param_size; + __u32 number_of_eps; +}; + +/** + * struct rmnet_ioctl_extended_s_v2: New structure to include any number of + * ioctl of any size. Structure should have even + * __u32 variables or add padding. + * @ioctl_data_size: Eg: For egress ioctl + * = sizeof(egress_format_v2) + * @ioctl_ptr: Has to be typecasted to (__u64)(uintptr_t). + * @extended_v2_ioctl_type: Should be hash defined above similar + * to RMNET_IOCTL_SET_EGRESS_DATA_FORMAT_V2. + */ +struct rmnet_ioctl_extended_s_v2 { + __u64 ioctl_ptr; + __u32 ioctl_data_size; + __u32 extended_v2_ioctl_type; +}; + +struct rmnet_ioctl_extended_s { + __u32 extended_ioctl; + union { + __u32 data; /* Generic data field for most extended IOCTLs */ + + /* Return values for + * RMNET_IOCTL_GET_DRIVER_NAME + * RMNET_IOCTL_GET_DFLT_CONTROL_CHANNEL + */ + __s8 if_name[IFNAMSIZ]; + + /* Input values for the RMNET_IOCTL_ADD_MUX_CHANNEL IOCTL */ + struct { + __u32 mux_id; + __s8 vchannel_name[IFNAMSIZ]; + } rmnet_mux_val; + + /* Input values for the RMNET_IOCTL_FLOW_CONTROL IOCTL */ + struct { + __u8 flow_mode; + __u8 mux_id; + } flow_control_prop; + + /* Return values for RMNET_IOCTL_GET_EP_PAIR */ + struct { + __u32 consumer_pipe_num; + __u32 producer_pipe_num; + } ipa_ep_pair; + + struct { + __u32 __data; /* Placeholder for legacy data*/ + __u32 agg_size; + __u32 agg_count; + } ingress_format; + + /* Input values for the RMNET_IOCTL_SET_OFFLOAD */ + struct { + __u32 flags; + __u8 mux_id; + } offload_params; + + /* Input values for the RMNET_IOCTL_SET_MTU */ + struct { + __s8 if_name[IFNAMSIZ]; + /* if given non-zero value, mtu has changed */ + __u16 mtu_v4; + __u16 mtu_v6; + } mtu_params; + } u; +}; + +struct rmnet_ioctl_data_s { + union { + __u32 operation_mode; + __u32 tcm_handle; + } u; +}; + +#define RMNET_IOCTL_QOS_MODE_6 (1<<0) +#define RMNET_IOCTL_QOS_MODE_8 (1<<1) + +/* QMI QoS header definition */ +struct QMI_QOS_HDR_S { + unsigned char version; + unsigned char flags; + __u32 flow_id; +} __attribute((__packed__)); + +/* QMI QoS 8-byte header. */ +struct qmi_qos_hdr8_s { + struct QMI_QOS_HDR_S hdr; + __u8 reserved[2]; +} __attribute((__packed__)); + +#endif /* _UAPI_MSM_RMNET_H_ */