Add IPA client named ipa_wigig. This client provides API for the 11AD protocol driver to configure IPA for 11AD clients offload. Currently up to 4 clients are supported. The clients share the RX pipe and have a separate TX pipe. The ipa_wigig client shall SMMU map 11AD HW registers and buffers and shall configure IPA uC and GSI for 11AD clients offload. Signed-off-by: Amir Levy <alevy@codeaurora.org> Change-Id: I6c87dcea5d6e8e0b861cc402d52a83d8388af90dtirimbino
parent
676bb42bc0
commit
bec5800dd2
@ -1,4 +1,4 @@ |
||||
obj-$(CONFIG_IPA3) += ipa_usb.o odu_bridge.o ipa_mhi_client.o ipa_uc_offload.o ipa_wdi3.o ipa_gsb.o
|
||||
obj-$(CONFIG_IPA3) += ipa_usb.o odu_bridge.o ipa_mhi_client.o ipa_uc_offload.o ipa_wdi3.o ipa_gsb.o ipa_wigig.o
|
||||
obj-$(CONFIG_IPA) += odu_bridge.o ipa_mhi_client.o ipa_uc_offload.o ipa_wdi3.o
|
||||
obj-$(CONFIG_ECM_IPA) += ecm_ipa.o
|
||||
obj-$(CONFIG_RNDIS_IPA) += rndis_ipa.o
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,491 @@ |
||||
/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License version 2 and |
||||
* only version 2 as published by the Free Software Foundation. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
*/ |
||||
|
||||
#ifndef _IPA_WIGIG_H_ |
||||
#define _IPA_WIGIG_H_ |
||||
|
||||
#include <linux/msm_ipa.h> |
||||
#include <linux/ipa.h> |
||||
|
||||
typedef void (*ipa_wigig_misc_int_cb)(void *priv); |
||||
|
||||
/*
|
||||
* struct ipa_wigig_init_in_params - wigig init input parameters |
||||
* |
||||
* @periph_baddr_pa: physical address of wigig HW base |
||||
* @pseudo_cause_pa: physical address of wigig HW pseudo_cause register |
||||
* @int_gen_tx_pa: physical address of wigig HW int_gen_tx register |
||||
* @int_gen_rx_pa: physical address of wigig HW int_gen_rx register |
||||
* @dma_ep_misc_pa: physical address of wigig HW dma_ep_misc register |
||||
* @notify: uc ready callback |
||||
* @int_notify: wigig misc interrupt callback |
||||
* @priv: uc ready callback cookie |
||||
*/ |
||||
struct ipa_wigig_init_in_params { |
||||
phys_addr_t periph_baddr_pa; |
||||
phys_addr_t pseudo_cause_pa; |
||||
phys_addr_t int_gen_tx_pa; |
||||
phys_addr_t int_gen_rx_pa; |
||||
phys_addr_t dma_ep_misc_pa; |
||||
ipa_uc_ready_cb notify; |
||||
ipa_wigig_misc_int_cb int_notify; |
||||
void *priv; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_init_out_params - wigig init output parameters |
||||
* |
||||
* @is_uC_ready: is uC ready. No API should be called until uC is ready. |
||||
* @uc_db_pa: physical address of IPA uC doorbell |
||||
*/ |
||||
struct ipa_wigig_init_out_params { |
||||
bool is_uc_ready; |
||||
phys_addr_t uc_db_pa; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_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_wigig_hdr_info { |
||||
u8 *hdr; |
||||
u8 hdr_len; |
||||
u8 dst_mac_addr_offset; |
||||
enum ipa_hdr_l2_type hdr_type; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_reg_intf_in_params - parameters for offload interface |
||||
* registration |
||||
* |
||||
* @netdev_name: network interface name |
||||
* @netdev_mac: netdev mac address |
||||
* @hdr_info: header information |
||||
*/ |
||||
struct ipa_wigig_reg_intf_in_params { |
||||
const char *netdev_name; |
||||
u8 netdev_mac[IPA_MAC_ADDR_SIZE]; |
||||
struct ipa_wigig_hdr_info hdr_info[IPA_IP_MAX]; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_pipe_setup_info - WIGIG TX/Rx configuration |
||||
* @desc_ring_base_pa: physical address of the base of the descriptor ring |
||||
* @desc_ring_size: size of the descriptor ring |
||||
* @desc_ring_HWHEAD_pa: physical address of the wigig descriptor ring HWHEAD |
||||
* @desc_ring_HWTAIL_pa: physical address of the wigig descriptor ring HWTAIL |
||||
* @status_ring_base_pa: physical address of the base of the status ring |
||||
* @status_ring_size: status ring size |
||||
* @desc_ring_HWHEAD_pa: physical address of the wigig descriptor ring HWHEAD |
||||
* @desc_ring_HWTAIL_pa: physical address of the wigig descriptor ring HWTAIL |
||||
*/ |
||||
struct ipa_wigig_pipe_setup_info { |
||||
phys_addr_t desc_ring_base_pa; |
||||
u32 desc_ring_size; |
||||
phys_addr_t desc_ring_HWHEAD_pa; |
||||
phys_addr_t desc_ring_HWTAIL_pa; |
||||
|
||||
phys_addr_t status_ring_base_pa; |
||||
u32 status_ring_size; |
||||
phys_addr_t status_ring_HWHEAD_pa; |
||||
phys_addr_t status_ring_HWTAIL_pa; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_pipe_setup_info_smmu - WIGIG TX/Rx configuration smmu mode |
||||
* @desc_ring_base: sg_table of the base of the descriptor ring |
||||
* @desc_ring_base_iova: IO virtual address mapped to physical base address |
||||
* @desc_ring_size: size of the descriptor ring |
||||
* @desc_ring_HWHEAD_pa: physical address of the wigig descriptor ring HWHEAD |
||||
* @desc_ring_HWTAIL_pa: physical address of the wigig descriptor ring HWTAIL |
||||
* @status_ring_base: sg_table of the base of the status ring |
||||
* @status_ring_base_iova: IO virtual address mapped to physical base address |
||||
* @status_ring_size: status ring size |
||||
* @desc_ring_HWHEAD_pa: physical address of the wigig descriptor ring HWHEAD |
||||
* @desc_ring_HWTAIL_pa: physical address of the wigig descriptor ring HWTAIL |
||||
*/ |
||||
struct ipa_wigig_pipe_setup_info_smmu { |
||||
struct sg_table desc_ring_base; |
||||
u64 desc_ring_base_iova; |
||||
u32 desc_ring_size; |
||||
phys_addr_t desc_ring_HWHEAD_pa; |
||||
phys_addr_t desc_ring_HWTAIL_pa; |
||||
|
||||
struct sg_table status_ring_base; |
||||
u64 status_ring_base_iova; |
||||
u32 status_ring_size; |
||||
phys_addr_t status_ring_HWHEAD_pa; |
||||
phys_addr_t status_ring_HWTAIL_pa; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_rx_pipe_data_buffer_info - WIGIG Rx data buffer |
||||
* configuration |
||||
* @data_buffer_base_pa: physical address of the physically contiguous |
||||
* Rx data buffer |
||||
* @data_buffer_size: size of the data buffer |
||||
*/ |
||||
struct ipa_wigig_rx_pipe_data_buffer_info { |
||||
phys_addr_t data_buffer_base_pa; |
||||
u32 data_buffer_size; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_rx_pipe_data_buffer_info_smmu - WIGIG Rx data buffer |
||||
* configuration smmu mode |
||||
* @data_buffer_base: sg_table of the physically contiguous |
||||
* Rx data buffer |
||||
* @data_buffer_base_iova: IO virtual address mapped to physical base address |
||||
* @data_buffer_size: size of the data buffer |
||||
*/ |
||||
struct ipa_wigig_rx_pipe_data_buffer_info_smmu { |
||||
struct sg_table data_buffer_base; |
||||
u64 data_buffer_base_iova; |
||||
u32 data_buffer_size; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_conn_rx_in_params - information provided by |
||||
* WIGIG offload client for Rx pipe |
||||
* @notify: client callback function |
||||
* @priv: client cookie |
||||
* @pipe: parameters to connect Rx pipe (WIGIG to IPA) |
||||
* @dbuff: Rx data buffer info |
||||
*/ |
||||
struct ipa_wigig_conn_rx_in_params { |
||||
ipa_notify_cb notify; |
||||
void *priv; |
||||
struct ipa_wigig_pipe_setup_info pipe; |
||||
struct ipa_wigig_rx_pipe_data_buffer_info dbuff; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_conn_rx_in_params_smmu - information provided by |
||||
* WIGIG offload client for Rx pipe |
||||
* @notify: client callback function |
||||
* @priv: client cookie |
||||
* @pipe_smmu: parameters to connect Rx pipe (WIGIG to IPA) smmu mode |
||||
* @dbuff_smmu: Rx data buffer info smmu mode |
||||
*/ |
||||
struct ipa_wigig_conn_rx_in_params_smmu { |
||||
ipa_notify_cb notify; |
||||
void *priv; |
||||
struct ipa_wigig_pipe_setup_info_smmu pipe_smmu; |
||||
struct ipa_wigig_rx_pipe_data_buffer_info_smmu dbuff_smmu; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_conn_out_params - information provided |
||||
* to WIGIG driver |
||||
* @client: client type allocated by IPA driver |
||||
*/ |
||||
struct ipa_wigig_conn_out_params { |
||||
enum ipa_client_type client; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_tx_pipe_data_buffer_info - WIGIG Tx data buffer |
||||
* configuration |
||||
* @data_buffer_size: size of a single data buffer |
||||
*/ |
||||
struct ipa_wigig_tx_pipe_data_buffer_info { |
||||
u32 data_buffer_size; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_tx_pipe_data_buffer_info_smmu - WIGIG Tx data buffer |
||||
* configuration smmu mode |
||||
* @data_buffer_base_pa: sg_tables of the Tx data buffers |
||||
* @data_buffer_base_iova: IO virtual address mapped to physical base address |
||||
* @num_buffers: number of buffers |
||||
* @data_buffer_size: size of a single data buffer |
||||
*/ |
||||
struct ipa_wigig_tx_pipe_data_buffer_info_smmu { |
||||
struct sg_table *data_buffer_base; |
||||
u64 *data_buffer_base_iova; |
||||
u32 num_buffers; |
||||
u32 data_buffer_size; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_conn_tx_in_params - information provided by |
||||
* wigig offload client for Tx pipe |
||||
* @pipe: parameters to connect Tx pipe (IPA to WIGIG) |
||||
* @dbuff: Tx data buffer info |
||||
* @int_gen_tx_bit_num: bit in int_gen_tx register associated with this client |
||||
* @client_mac: MAC address of client to be connected |
||||
*/ |
||||
struct ipa_wigig_conn_tx_in_params { |
||||
struct ipa_wigig_pipe_setup_info pipe; |
||||
struct ipa_wigig_tx_pipe_data_buffer_info dbuff; |
||||
u8 int_gen_tx_bit_num; |
||||
u8 client_mac[IPA_MAC_ADDR_SIZE]; |
||||
}; |
||||
|
||||
/*
|
||||
* struct ipa_wigig_conn_tx_in_params_smmu - information provided by |
||||
* wigig offload client for Tx pipe |
||||
* @pipe_smmu: parameters to connect Tx pipe (IPA to WIGIG) smmu mode |
||||
* @dbuff_smmu: Tx data buffer info smmu mode |
||||
* @int_gen_tx_bit_num: bit in int_gen_tx register associated with this client |
||||
* @client_mac: MAC address of client to be connected |
||||
*/ |
||||
struct ipa_wigig_conn_tx_in_params_smmu { |
||||
struct ipa_wigig_pipe_setup_info_smmu pipe_smmu; |
||||
struct ipa_wigig_tx_pipe_data_buffer_info_smmu dbuff_smmu; |
||||
u8 int_gen_tx_bit_num; |
||||
u8 client_mac[IPA_MAC_ADDR_SIZE]; |
||||
}; |
||||
|
||||
#if defined CONFIG_IPA || defined CONFIG_IPA3 |
||||
|
||||
/*
|
||||
* ipa_wigig_init - Client should call this function to |
||||
* init WIGIG IPA offload data path |
||||
* |
||||
* Note: Should not be called from atomic context |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_init(struct ipa_wigig_init_in_params *in, |
||||
struct ipa_wigig_init_out_params *out); |
||||
|
||||
/*
|
||||
* ipa_wigig_cleanup - Client should call this function to |
||||
* clean up WIGIG IPA offload data path |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_cleanup(void); |
||||
|
||||
/*
|
||||
* ipa_wigig_is_smmu_enabled - get smmu state |
||||
* |
||||
* @Return true if smmu is enabled, false if disabled |
||||
*/ |
||||
bool ipa_wigig_is_smmu_enabled(void); |
||||
|
||||
/*
|
||||
* ipa_wigig_reg_intf - Client should call this function to |
||||
* register interface |
||||
* |
||||
* Note: Should not be called from atomic context |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_reg_intf(struct ipa_wigig_reg_intf_in_params *in); |
||||
|
||||
/*
|
||||
* ipa_wigig_dereg_intf - Client Driver should call this |
||||
* function to deregister before unload and after disconnect |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_dereg_intf(const char *netdev_name); |
||||
|
||||
/*
|
||||
* ipa_wigig_conn_rx_pipe - Client should call this |
||||
* function to connect the rx (UL) pipe |
||||
* |
||||
* @in: [in] input parameters from client |
||||
* @out: [out] output params to client |
||||
* |
||||
* Note: Non SMMU mode only, Should not be called from atomic context |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_conn_rx_pipe(struct ipa_wigig_conn_rx_in_params *in, |
||||
struct ipa_wigig_conn_out_params *out); |
||||
|
||||
/*
|
||||
* ipa_wigig_conn_rx_pipe_smmu - Client should call this |
||||
* function to connect the rx (UL) pipe |
||||
* |
||||
* @in: [in] input parameters from client |
||||
* @out: [out] output params to client |
||||
* |
||||
* Note: SMMU mode only, Should not be called from atomic context |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_conn_rx_pipe_smmu(struct ipa_wigig_conn_rx_in_params_smmu *in, |
||||
struct ipa_wigig_conn_out_params *out); |
||||
|
||||
/*
|
||||
* ipa_wigig_conn_client - Client should call this |
||||
* function to connect one of the tx (DL) pipes when a WIGIG client connects |
||||
* |
||||
* @in: [in] input parameters from client |
||||
* @out: [out] output params to client |
||||
* |
||||
* Note: Non SMMU mode only, Should not be called from atomic context |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_conn_client(struct ipa_wigig_conn_tx_in_params *in, |
||||
struct ipa_wigig_conn_out_params *out); |
||||
|
||||
/*
|
||||
* ipa_wigig_conn_client_smmu - Client should call this |
||||
* function to connect one of the tx (DL) pipes when a WIGIG client connects |
||||
* |
||||
* @in: [in] input parameters from client |
||||
* @out: [out] output params to client |
||||
* |
||||
* Note: SMMU mode only, Should not be called from atomic context |
||||
* |
||||
* @Return 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_conn_client_smmu(struct ipa_wigig_conn_tx_in_params_smmu *in, |
||||
struct ipa_wigig_conn_out_params *out); |
||||
|
||||
/*
|
||||
* ipa_wigig_disconn_pipe() - Client should call this |
||||
* function to disconnect a pipe |
||||
* |
||||
* @client: [in] pipe to be disconnected |
||||
* |
||||
* Note: Should not be called from atomic context |
||||
* |
||||
* Returns: 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_disconn_pipe(enum ipa_client_type client); |
||||
|
||||
/*
|
||||
* ipa_wigig_enable_pipe() - Client should call this |
||||
* function to enable IPA offload data path |
||||
* |
||||
* @client: [in] pipe to be enabled |
||||
* Note: Should not be called from atomic context |
||||
* |
||||
* Returns: 0 on success, negative on failure |
||||
*/ |
||||
|
||||
int ipa_wigig_enable_pipe(enum ipa_client_type client); |
||||
|
||||
/*
|
||||
* ipa_wigig_disable_pipe() - Client should call this |
||||
* function to disable IPA offload data path |
||||
* |
||||
* @client: [in] pipe to be disabled |
||||
* Note: Should not be called from atomic context |
||||
* |
||||
* Returns: 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_disable_pipe(enum ipa_client_type client); |
||||
|
||||
/*
|
||||
* ipa_wigig_tx_dp() - transmit tx packet through IPA to 11ad HW |
||||
* |
||||
* @dst: [in] destination ipa client pipe to be used |
||||
* @skb: [in] skb to be transmitted |
||||
* |
||||
* Returns: 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_tx_dp(enum ipa_client_type dst, struct sk_buff *skb); |
||||
|
||||
/**
|
||||
* ipa_wigig_set_perf_profile() - Client should call this function to |
||||
* set IPA clock bandwidth based on data rates |
||||
* |
||||
* @max_supported_bw_mbps: [in] maximum bandwidth needed (in Mbps) |
||||
* |
||||
* Returns: 0 on success, negative on failure |
||||
*/ |
||||
int ipa_wigig_set_perf_profile(u32 max_supported_bw_mbps); |
||||
|
||||
#else /* (CONFIG_IPA || CONFIG_IPA3) */ |
||||
static inline int ipa_wigig_init(struct ipa_wigig_init_in_params *in, |
||||
struct ipa_wigig_init_out_params *out) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_cleanup(void) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline bool ipa_wigig_is_smmu_enabled(void) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_reg_intf(struct ipa_wigig_reg_intf_in_params *in) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_dereg_intf(const char *netdev_name) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_conn_rx_pipe( |
||||
struct ipa_wigig_conn_rx_in_params *in, |
||||
struct ipa_wigig_conn_out_params *out) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_conn_rx_pipe_smmu( |
||||
struct ipa_wigig_conn_rx_in_params_smmu *in, |
||||
struct ipa_wigig_conn_out_params *out) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_conn_client( |
||||
struct ipa_wigig_conn_tx_in_params *in, |
||||
struct ipa_wigig_conn_out_params *out) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_conn_client_smmu( |
||||
struct ipa_wigig_conn_tx_in_params_smmu *in, |
||||
struct ipa_wigig_conn_out_params *out) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_disconn_pipe(enum ipa_client_type client) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_enable_pipe(enum ipa_client_type client) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_disable_pipe(enum ipa_client_type client) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
static inline int ipa_wigig_tx_dp(enum ipa_client_type dst, |
||||
struct sk_buff *skb) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
|
||||
int ipa_wigig_set_perf_profile(u32 max_supported_bw_mbps) |
||||
{ |
||||
return -EPERM; |
||||
} |
||||
#endif /* CONFIG_IPA3 */ |
||||
#endif /* _IPA_WIGIG_H_ */ |
Loading…
Reference in new issue