Rtwo/kernel/motorola/sm8550/include/linux/ipa_eth.h
2025-09-30 19:22:48 -05:00

283 lines
7.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef _IPA_ETH_H_
#define _IPA_ETH_H_
#include <linux/ipa.h>
#include <linux/msm_ipa.h>
#include <linux/msm_gsi.h>
#define IPA_ETH_API_VER 2
/* New architecture prototypes */
typedef void (*ipa_eth_ready_cb)(void *user_data);
typedef u32 ipa_eth_hdl_t;
/**
* struct ipa_eth_ready_cb - eth readiness parameters
*
* @notify: ipa_eth client ready callback notifier
* @userdata: userdata for ipa_eth ready cb
* @is_eth_ready: true if ipa_eth client is already ready
*/
struct ipa_eth_ready {
ipa_eth_ready_cb notify;
void *userdata;
/* out params */
bool is_eth_ready;
};
/**
* enum ipa_eth_client_type - names for the various IPA
* eth "clients".
*/
enum ipa_eth_client_type {
IPA_ETH_CLIENT_AQC107,
IPA_ETH_CLIENT_AQC113,
IPA_ETH_CLIENT_RTK8111K,
IPA_ETH_CLIENT_RTK8125B,
IPA_ETH_CLIENT_NTN,
IPA_ETH_CLIENT_EMAC,
IPA_ETH_CLIENT_NTN3,
IPA_ETH_CLIENT_IEMAC,
IPA_ETH_CLIENT_MAX,
};
/**
* enum ipa_eth_pipe_traffic_type - traffic type for the various IPA
* eth "pipes".
*/
enum ipa_eth_pipe_traffic_type {
IPA_ETH_PIPE_BEST_EFFORT,
IPA_ETH_PIPE_LOW_LATENCY,
IPA_ETH_PIPE_TRAFFIC_TYPE_MAX,
};
/**
* enum ipa_eth_pipe_direction - pipe direcitons for same
* ethernet client.
*/
enum ipa_eth_pipe_direction {
IPA_ETH_PIPE_DIR_TX,
IPA_ETH_PIPE_DIR_RX,
IPA_ETH_PIPE_DIR_MAX,
};
#define IPA_ETH_INST_ID_MAX (2)
/**
* struct ipa_eth_ntn_setup_info - parameters for ntn ethernet
* offloading
*
* @bar_addr: bar PA to access NTN register
* @tail_ptr_offs: tail ptr offset
* @ioc_mod_threshold: Descriptors # per interrupt request from
* NTN3 HW via descriptor bit as part of the protocol.
*/
struct ipa_eth_ntn_setup_info {
phys_addr_t bar_addr;
phys_addr_t tail_ptr_offs;
uint16_t ioc_mod_threshold;
};
/**
* struct ipa_eth_aqc_setup_info - parameters for aqc ethernet
* offloading
*
* @bar_addr: bar PA to access AQC register
* @head_ptr_offs: head ptr offset
* @aqc_ch: AQC ch number
* @dest_tail_ptr_offs: tail ptr offset
*/
struct ipa_eth_aqc_setup_info {
phys_addr_t bar_addr;
phys_addr_t head_ptr_offs;
u8 aqc_ch;
phys_addr_t dest_tail_ptr_offs;
};
/**
* struct ipa_eth_realtek_setup_info - parameters for realtek ethernet
* offloading
*
* @bar_addr: bar PA to access RTK register
* @bar_size: bar region size
* @queue_number: Which RTK queue to check the status on
* @dest_tail_ptr_offs: tail ptr offset
*/
struct ipa_eth_realtek_setup_info {
phys_addr_t bar_addr;
u32 bar_size;
u8 queue_number;
phys_addr_t dest_tail_ptr_offs;
};
/**
* struct ipa_eth_buff_smmu_map - IPA iova->pa SMMU mapping
* @iova: virtual address of the data buffer
* @pa: physical address of the data buffer
*/
struct ipa_eth_buff_smmu_map {
dma_addr_t iova;
phys_addr_t pa;
};
/**
* struct ipa_eth_pipe_setup_info - info needed for IPA setups
* @is_transfer_ring_valid: if transfer ring is needed
* @transfer_ring_base: the base of the transfer ring
* @transfer_ring_sgt: sgtable of transfer ring
* @transfer_ring_size: size of the transfer ring
* @is_buffer_pool_valid: if buffer pool is needed
* @buffer_pool_base_addr: base of buffer pool address
* @buffer_pool_base_sgt: sgtable of buffer pool
* @data_buff_list_size: number of buffers
* @data_buff_list: array of data buffer list
* @fix_buffer_size: buffer size
* @notify: callback for exception/embedded packets
* @priv: priv for exception callback
* @client_info: vendor specific pipe setup info
* @db_pa: doorbell physical address
* @db_val: doorbell value ethernet HW need to ring
*/
struct ipa_eth_pipe_setup_info {
/* transfer ring info */
bool is_transfer_ring_valid;
dma_addr_t transfer_ring_base;
struct sg_table *transfer_ring_sgt;
u32 transfer_ring_size;
/* buffer pool info */
bool is_buffer_pool_valid;
dma_addr_t buffer_pool_base_addr;
struct sg_table *buffer_pool_base_sgt;
/* buffer info */
u32 data_buff_list_size;
struct ipa_eth_buff_smmu_map *data_buff_list;
u32 fix_buffer_size;
/* client notify cb */
ipa_notify_cb notify;
void *priv;
/* vendor specific info */
union {
struct ipa_eth_aqc_setup_info aqc;
struct ipa_eth_realtek_setup_info rtk;
struct ipa_eth_ntn_setup_info ntn;
} client_info;
/* output params */
phys_addr_t db_pa;
u32 db_val;
};
/**
* struct ipa_eth_client_pipe_info - ETH pipe/gsi related configuration
* @link: link of ep for different client function on same ethernet HW
* @dir: TX or RX direction
* @info: tx/rx pipe setup info
* @client_info: client the pipe belongs to
* @pipe_hdl: output params, pipe handle
*/
struct ipa_eth_client_pipe_info {
struct list_head link;
enum ipa_eth_pipe_direction dir;
struct ipa_eth_pipe_setup_info info;
struct ipa_eth_client *client_info;
/* output params */
ipa_eth_hdl_t pipe_hdl;
};
/**
* struct ipa_eth_client - client info per traffic type
* provided by offload client
* @client_type: ethernet client type
* @inst_id: instance id for dual NIC support
* @net_dev: network device client belongs to
* @traffic_type: traffic type
* @pipe_list: list of pipes with same traffic type
* @priv: private data for client
* @test: is test client
*/
struct ipa_eth_client {
enum ipa_eth_client_type client_type;
u8 inst_id;
/* traffic type */
enum ipa_eth_pipe_traffic_type traffic_type;
struct list_head pipe_list;
/* client specific priv data*/
void *priv;
bool test;
/* vendor driver */
struct net_device *net_dev;
};
/**
* struct ipa_eth_perf_profile - To set BandWidth profile
*
* @max_supported_bw_mbps: maximum bandwidth needed (in Mbps)
*/
struct ipa_eth_perf_profile {
u32 max_supported_bw_mbps;
};
/**
* struct ipa_eth_hdr_info - Header to install on IPA HW
*
* @hdr: header to install on IPA HW
* @hdr_len: length of header
* @dst_mac_addr_offset: destination mac address offset
* @hdr_type: layer two header type
*/
struct ipa_eth_hdr_info {
u8 *hdr;
u8 hdr_len;
u8 dst_mac_addr_offset;
enum ipa_hdr_l2_type hdr_type;
};
/**
* struct ipa_eth_intf_info - parameters for ipa offload
* interface registration
*
* @client: ipa ethernet client associated with the interface
* @is_conn_evt: whether or not trigger periph conn/disconn event
* @net_dev: network device
*/
struct ipa_eth_intf_info {
struct ipa_eth_client *client;
/* trigger iface peripheral event */
bool is_conn_evt;
/* IPA internal fields */
struct net_device *net_dev;
};
int ipa_eth_register_ready_cb(struct ipa_eth_ready *ready_info);
int ipa_eth_unregister_ready_cb(struct ipa_eth_ready *ready_info);
int ipa_eth_client_conn_pipes(struct ipa_eth_client *client);
int ipa_eth_client_disconn_pipes(struct ipa_eth_client *client);
int ipa_eth_client_reg_intf(struct ipa_eth_intf_info *intf);
int ipa_eth_client_unreg_intf(struct ipa_eth_intf_info *intf);
int ipa_eth_client_set_perf_profile(struct ipa_eth_client *client,
struct ipa_eth_perf_profile *profile);
enum ipa_client_type ipa_eth_get_ipa_client_type_from_eth_type(
enum ipa_eth_client_type eth_client_type, enum ipa_eth_pipe_direction dir);
bool ipa_eth_client_exist(
enum ipa_eth_client_type eth_client_type, int inst_id);
#endif // _IPA_ETH_H_