| /* Copyright (c) 2012-2014, 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_HW_DEFS_H |
| #define _IPA_HW_DEFS_H |
| #include <linux/bitops.h> |
| |
| /* This header defines various HW related data types */ |
| |
| /* immediate command op-codes */ |
| #define IPA_DECIPH_INIT (1) |
| #define IPA_PPP_FRM_INIT (2) |
| #define IPA_IP_V4_FILTER_INIT (3) |
| #define IPA_IP_V6_FILTER_INIT (4) |
| #define IPA_IP_V4_NAT_INIT (5) |
| #define IPA_IP_V6_NAT_INIT (6) |
| #define IPA_IP_V4_ROUTING_INIT (7) |
| #define IPA_IP_V6_ROUTING_INIT (8) |
| #define IPA_HDR_INIT_LOCAL (9) |
| #define IPA_HDR_INIT_SYSTEM (10) |
| #define IPA_DECIPH_SETUP (11) |
| #define IPA_INSERT_NAT_RULE (12) |
| #define IPA_DELETE_NAT_RULE (13) |
| #define IPA_NAT_DMA (14) |
| #define IPA_IP_PACKET_TAG (15) |
| #define IPA_IP_PACKET_INIT (16) |
| #define IPA_DMA_SHARED_MEM (19) |
| |
| /** |
| * struct ipa_flt_rule_hw_hdr - HW header of IPA filter rule |
| * @word: filtering rule properties |
| * @en_rule: enable rule |
| * @action: post routing action |
| * @rt_tbl_idx: index in routing table |
| * @retain_hdr: added to add back to the packet the header removed |
| * as part of header removal. This will be done as part of |
| * header insertion block. |
| * @to_uc: direct IPA to sent the packet to uc instead of |
| * the intended destination. This will be performed just after |
| * routing block processing, so routing will have determined |
| * destination end point and uc will receive this information |
| * together with the packet as part of the HW packet TX commands |
| * @rsvd: reserved bits |
| */ |
| struct ipa_flt_rule_hw_hdr { |
| union { |
| u32 word; |
| struct { |
| u32 en_rule:16; |
| u32 action:5; |
| u32 rt_tbl_idx:5; |
| u32 retain_hdr:1; |
| u32 to_uc:1; |
| u32 rsvd:4; |
| } hdr; |
| } u; |
| }; |
| |
| /** |
| * struct ipa_rt_rule_hw_hdr - HW header of IPA routing rule |
| * @word: filtering rule properties |
| * @en_rule: enable rule |
| * @pipe_dest_idx: destination pipe index |
| * @system: changed from local to system due to HW change |
| * @hdr_offset: header offset |
| */ |
| struct ipa_rt_rule_hw_hdr { |
| union { |
| u32 word; |
| struct { |
| u32 en_rule:16; |
| u32 pipe_dest_idx:5; |
| u32 system:1; |
| u32 hdr_offset:10; |
| } hdr; |
| } u; |
| }; |
| |
| /** |
| * struct ipa_ip_v4_filter_init - IPA_IP_V4_FILTER_INIT command payload |
| * @ipv4_rules_addr: address of ipv4 rules |
| * @size_ipv4_rules: size of the above |
| * @ipv4_addr: ipv4 address |
| * @rsvd: reserved |
| */ |
| struct ipa_ip_v4_filter_init { |
| u64 ipv4_rules_addr:32; |
| u64 size_ipv4_rules:12; |
| u64 ipv4_addr:16; |
| u64 rsvd:4; |
| }; |
| |
| /** |
| * struct ipa_ip_v6_filter_init - IPA_IP_V6_FILTER_INIT command payload |
| * @ipv6_rules_addr: address of ipv6 rules |
| * @size_ipv6_rules: size of the above |
| * @ipv6_addr: ipv6 address |
| */ |
| struct ipa_ip_v6_filter_init { |
| u64 ipv6_rules_addr:32; |
| u64 size_ipv6_rules:16; |
| u64 ipv6_addr:16; |
| }; |
| |
| /** |
| * struct ipa_ip_v4_routing_init - IPA_IP_V4_ROUTING_INIT command payload |
| * @ipv4_rules_addr: address of ipv4 rules |
| * @size_ipv4_rules: size of the above |
| * @ipv4_addr: ipv4 address |
| * @rsvd: reserved |
| */ |
| struct ipa_ip_v4_routing_init { |
| u64 ipv4_rules_addr:32; |
| u64 size_ipv4_rules:12; |
| u64 ipv4_addr:16; |
| u64 rsvd:4; |
| }; |
| |
| /** |
| * struct ipa_ip_v6_routing_init - IPA_IP_V6_ROUTING_INIT command payload |
| * @ipv6_rules_addr: address of ipv6 rules |
| * @size_ipv6_rules: size of the above |
| * @ipv6_addr: ipv6 address |
| */ |
| struct ipa_ip_v6_routing_init { |
| u64 ipv6_rules_addr:32; |
| u64 size_ipv6_rules:16; |
| u64 ipv6_addr:16; |
| }; |
| |
| /** |
| * struct ipa_hdr_init_local - IPA_HDR_INIT_LOCAL command payload |
| * @hdr_table_src_addr: word address of header table in system memory where the |
| * table starts (use as source for memory copying) |
| * @size_hdr_table: size of the above (in bytes) |
| * @hdr_table_dst_addr: header address in IPA sram (used as dst for memory copy) |
| * @rsvd: reserved |
| */ |
| struct ipa_hdr_init_local { |
| u64 hdr_table_src_addr:32; |
| u64 size_hdr_table:12; |
| u64 hdr_table_dst_addr:16; |
| u64 rsvd:4; |
| }; |
| |
| /** |
| * struct ipa_hdr_init_system - IPA_HDR_INIT_SYSTEM command payload |
| * @hdr_table_addr: word address of header table in system memory where the |
| * table starts (use as source for memory copying) |
| * @rsvd: reserved |
| */ |
| struct ipa_hdr_init_system { |
| u64 hdr_table_addr:32; |
| u64 rsvd:32; |
| }; |
| |
| #define IPA_A5_MUX_HDR_EXCP_FLAG_IP BIT(7) |
| #define IPA_A5_MUX_HDR_EXCP_FLAG_NAT BIT(6) |
| #define IPA_A5_MUX_HDR_EXCP_FLAG_SW_FLT BIT(5) |
| #define IPA_A5_MUX_HDR_EXCP_FLAG_TAG BIT(4) |
| #define IPA_A5_MUX_HDR_EXCP_FLAG_REPLICATED BIT(3) |
| #define IPA_A5_MUX_HDR_EXCP_FLAG_IHL BIT(2) |
| |
| /** |
| * struct ipa_a5_mux_hdr - A5 MUX header definition |
| * @interface_id: interface ID |
| * @src_pipe_index: source pipe index |
| * @flags: flags |
| * @metadata: metadata |
| * |
| * A5 MUX header is in BE, A5 runs in LE. This struct definition |
| * allows A5 SW to correctly parse the header |
| */ |
| struct ipa_a5_mux_hdr { |
| u16 interface_id; |
| u8 src_pipe_index; |
| u8 flags; |
| u32 metadata; |
| }; |
| |
| /** |
| * struct ipa_nat_dma - IPA_NAT_DMA command payload |
| * @table_index: NAT table index |
| * @rsvd1: reserved |
| * @base_addr: base address |
| * @rsvd2: reserved |
| * @offset: offset |
| * @data: metadata |
| * @rsvd3: reserved |
| */ |
| struct ipa_nat_dma { |
| u64 table_index:3; |
| u64 rsvd1:1; |
| u64 base_addr:2; |
| u64 rsvd2:2; |
| u64 offset:32; |
| u64 data:16; |
| u64 rsvd3:8; |
| }; |
| |
| /** |
| * struct ipa_nat_dma - IPA_IP_PACKET_INIT command payload |
| * @destination_pipe_index: destination pipe index |
| * @rsvd1: reserved |
| * @metadata: metadata |
| * @rsvd2: reserved |
| */ |
| struct ipa_ip_packet_init { |
| u64 destination_pipe_index:5; |
| u64 rsvd1:3; |
| u64 metadata:32; |
| u64 rsvd2:24; |
| }; |
| |
| /** |
| * struct ipa_nat_dma - IPA_IP_V4_NAT_INIT command payload |
| * @ipv4_rules_addr: ipv4 rules address |
| * @ipv4_expansion_rules_addr: ipv4 expansion rules address |
| * @index_table_addr: index tables address |
| * @index_table_expansion_addr: index expansion table address |
| * @table_index: index in table |
| * @ipv4_rules_addr_type: ipv4 address type |
| * @ipv4_expansion_rules_addr_type: ipv4 expansion address type |
| * @index_table_addr_type: index table address type |
| * @index_table_expansion_addr_type: index expansion table type |
| * @size_base_tables: size of base tables |
| * @size_expansion_tables: size of expansion tables |
| * @rsvd2: reserved |
| * @public_ip_addr: public IP address |
| */ |
| struct ipa_ip_v4_nat_init { |
| u64 ipv4_rules_addr:32; |
| u64 ipv4_expansion_rules_addr:32; |
| u64 index_table_addr:32; |
| u64 index_table_expansion_addr:32; |
| u64 table_index:3; |
| u64 rsvd1:1; |
| u64 ipv4_rules_addr_type:1; |
| u64 ipv4_expansion_rules_addr_type:1; |
| u64 index_table_addr_type:1; |
| u64 index_table_expansion_addr_type:1; |
| u64 size_base_tables:12; |
| u64 size_expansion_tables:10; |
| u64 rsvd2:2; |
| u64 public_ip_addr:32; |
| }; |
| |
| /** |
| * struct ipa_ip_packet_tag - IPA_IP_PACKET_TAG command payload |
| * @tag: tag value returned with response |
| */ |
| struct ipa_ip_packet_tag { |
| u32 tag; |
| }; |
| |
| /*! @brief Struct for the the IPA UL packet status header */ |
| struct ipa_hw_pkt_status { |
| u32 status_opcode:8; |
| u32 exception:8; |
| u32 status_mask:16; |
| u32 pkt_len:16; |
| u32 endp_src_idx:5; |
| u32 reserved_1:3; |
| u32 endp_dest_idx:5; |
| u32 reserved_2:3; |
| u32 metadata:32; |
| u32 filt_local:1; |
| u32 filt_global:1; |
| u32 filt_pipe_idx:5; |
| u32 filt_match:1; |
| u32 filt_rule_idx:6; |
| u32 ret_hdr:1; |
| u32 reserved_3:1; |
| u32 tag_f_1:16; |
| u32 tag_f_2:32; |
| u32 time_day_ctr:32; |
| u32 nat_hit:1; |
| u32 nat_tbl_idx:13; |
| u32 nat_type:2; |
| u32 route_local:1; |
| u32 route_tbl_idx:5; |
| u32 route_match:1; |
| u32 reserved_4:1; |
| u32 route_rule_idx:8; |
| u32 hdr_local:1; |
| u32 hdr_offset:10; |
| u32 frag_hit:1; |
| u32 frag_rule:4; |
| u32 reserved_5:16; |
| }; |
| |
| #define IPA_PKT_STATUS_SIZE sizeof(struct ipa_hw_pkt_status) |
| |
| /*! @brief Status header opcodes */ |
| enum ipa_hw_status_opcode { |
| IPA_HW_STATUS_OPCODE_MIN, |
| IPA_HW_STATUS_OPCODE_PACKET = IPA_HW_STATUS_OPCODE_MIN, |
| IPA_HW_STATUS_OPCODE_NEW_FRAG_RULE, |
| IPA_HW_STATUS_OPCODE_DROPPED_PACKET, |
| IPA_HW_STATUS_OPCODE_MAX |
| }; |
| |
| /*! @brief Possible Masks received in status */ |
| enum ipa_hw_pkt_status_mask { |
| IPA_HW_PKT_STATUS_MASK_FRAG_PROCESS = 0x1, |
| IPA_HW_PKT_STATUS_MASK_FILT_PROCESS = 0x2, |
| IPA_HW_PKT_STATUS_MASK_NAT_PROCESS = 0x4, |
| IPA_HW_PKT_STATUS_MASK_ROUTE_PROCESS = 0x8, |
| IPA_HW_PKT_STATUS_MASK_TAG_VALID = 0x10, |
| IPA_HW_PKT_STATUS_MASK_FRAGMENT = 0x20, |
| IPA_HW_PKT_STATUS_MASK_FIRST_FRAGMENT = 0x40, |
| IPA_HW_PKT_STATUS_MASK_V4 = 0x80, |
| IPA_HW_PKT_STATUS_MASK_CKSUM_PROCESS = 0x100, |
| IPA_HW_PKT_STATUS_MASK_AGGR_PROCESS = 0x200, |
| IPA_HW_PKT_STATUS_MASK_DEST_EOT = 0x400, |
| IPA_HW_PKT_STATUS_MASK_DEAGGR_PROCESS = 0x800, |
| IPA_HW_PKT_STATUS_MASK_DEAGG_FIRST = 0x1000, |
| IPA_HW_PKT_STATUS_MASK_SRC_EOT = 0x2000 |
| }; |
| |
| /*! @brief Possible Exceptions received in status */ |
| enum ipa_hw_pkt_status_exception { |
| IPA_HW_PKT_STATUS_EXCEPTION_NONE = 0x0, |
| IPA_HW_PKT_STATUS_EXCEPTION_DEAGGR = 0x1, |
| IPA_HW_PKT_STATUS_EXCEPTION_REPL = 0x2, |
| IPA_HW_PKT_STATUS_EXCEPTION_IPTYPE = 0x4, |
| IPA_HW_PKT_STATUS_EXCEPTION_IHL = 0x8, |
| IPA_HW_PKT_STATUS_EXCEPTION_FRAG_RULE_MISS = 0x10, |
| IPA_HW_PKT_STATUS_EXCEPTION_SW_FILT = 0x20, |
| IPA_HW_PKT_STATUS_EXCEPTION_NAT = 0x40, |
| IPA_HW_PKT_STATUS_EXCEPTION_ACTUAL_MAX, |
| IPA_HW_PKT_STATUS_EXCEPTION_MAX = 0xFF |
| }; |
| |
| /*! @brief IPA_HW_IMM_CMD_DMA_SHARED_MEM Immediate Command Parameters */ |
| struct ipa_hw_imm_cmd_dma_shared_mem { |
| u32 reserved_1:16; |
| u32 size:16; |
| u32 system_addr:32; |
| u32 local_addr:16; |
| u32 direction:1; |
| u32 skip_pipeline_clear:1; |
| u32 reserved_2:14; |
| u32 padding:32; |
| }; |
| |
| #endif /* _IPA_HW_DEFS_H */ |