1731c46edSAlex Elder /* SPDX-License-Identifier: GPL-2.0 */ 2731c46edSAlex Elder 3731c46edSAlex Elder /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. 4731c46edSAlex Elder * Copyright (C) 2019-2020 Linaro Ltd. 5731c46edSAlex Elder */ 6731c46edSAlex Elder #ifndef _IPA_CMD_H_ 7731c46edSAlex Elder #define _IPA_CMD_H_ 8731c46edSAlex Elder 9731c46edSAlex Elder #include <linux/types.h> 10731c46edSAlex Elder #include <linux/dma-direction.h> 11731c46edSAlex Elder 12731c46edSAlex Elder struct sk_buff; 13731c46edSAlex Elder struct scatterlist; 14731c46edSAlex Elder 15731c46edSAlex Elder struct ipa; 16731c46edSAlex Elder struct ipa_mem; 17731c46edSAlex Elder struct gsi_trans; 18731c46edSAlex Elder struct gsi_channel; 19731c46edSAlex Elder 20731c46edSAlex Elder /** 21731c46edSAlex Elder * enum ipa_cmd_opcode: IPA immediate commands 22731c46edSAlex Elder * 23*862d3f2cSAlex Elder * @IPA_CMD_IP_V4_FILTER_INIT: Initialize IPv4 filter table 24*862d3f2cSAlex Elder * @IPA_CMD_IP_V6_FILTER_INIT: Initialize IPv6 filter table 25*862d3f2cSAlex Elder * @IPA_CMD_IP_V4_ROUTING_INIT: Initialize IPv4 routing table 26*862d3f2cSAlex Elder * @IPA_CMD_IP_V6_ROUTING_INIT: Initialize IPv6 routing table 27*862d3f2cSAlex Elder * @IPA_CMD_HDR_INIT_LOCAL: Initialize IPA-local header memory 28*862d3f2cSAlex Elder * @IPA_CMD_REGISTER_WRITE: Register write performed by IPA 29*862d3f2cSAlex Elder * @IPA_CMD_IP_PACKET_INIT: Set up next packet's destination endpoint 30*862d3f2cSAlex Elder * @IPA_CMD_DMA_SHARED_MEM: DMA command performed by IPA 31*862d3f2cSAlex Elder * @IPA_CMD_IP_PACKET_TAG_STATUS: Have next packet generate tag * status 32*862d3f2cSAlex Elder * @IPA_CMD_NONE: Special (invalid) "not a command" value 33731c46edSAlex Elder * 34*862d3f2cSAlex Elder * All immediate commands are issued using the AP command TX endpoint. 35731c46edSAlex Elder */ 36731c46edSAlex Elder enum ipa_cmd_opcode { 378701cb00SAlex Elder IPA_CMD_NONE = 0x0, 388701cb00SAlex Elder IPA_CMD_IP_V4_FILTER_INIT = 0x3, 398701cb00SAlex Elder IPA_CMD_IP_V6_FILTER_INIT = 0x4, 408701cb00SAlex Elder IPA_CMD_IP_V4_ROUTING_INIT = 0x7, 418701cb00SAlex Elder IPA_CMD_IP_V6_ROUTING_INIT = 0x8, 428701cb00SAlex Elder IPA_CMD_HDR_INIT_LOCAL = 0x9, 438701cb00SAlex Elder IPA_CMD_REGISTER_WRITE = 0xc, 448701cb00SAlex Elder IPA_CMD_IP_PACKET_INIT = 0x10, 458701cb00SAlex Elder IPA_CMD_DMA_SHARED_MEM = 0x13, 468701cb00SAlex Elder IPA_CMD_IP_PACKET_TAG_STATUS = 0x14, 47731c46edSAlex Elder }; 48731c46edSAlex Elder 49731c46edSAlex Elder /** 50731c46edSAlex Elder * struct ipa_cmd_info - information needed for an IPA immediate command 51731c46edSAlex Elder * 52731c46edSAlex Elder * @opcode: The command opcode. 53731c46edSAlex Elder * @direction: Direction of data transfer for DMA commands 54731c46edSAlex Elder */ 55731c46edSAlex Elder struct ipa_cmd_info { 56731c46edSAlex Elder enum ipa_cmd_opcode opcode; 57731c46edSAlex Elder enum dma_data_direction direction; 58731c46edSAlex Elder }; 59731c46edSAlex Elder 60731c46edSAlex Elder #ifdef IPA_VALIDATE 61731c46edSAlex Elder 62731c46edSAlex Elder /** 63731c46edSAlex Elder * ipa_cmd_table_valid() - Validate a memory region holding a table 64731c46edSAlex Elder * @ipa: - IPA pointer 65731c46edSAlex Elder * @mem: - IPA memory region descriptor 66731c46edSAlex Elder * @route: - Whether the region holds a route or filter table 67731c46edSAlex Elder * @ipv6: - Whether the table is for IPv6 or IPv4 68731c46edSAlex Elder * @hashed: - Whether the table is hashed or non-hashed 69731c46edSAlex Elder * 70e3eea08eSAlex Elder * Return: true if region is valid, false otherwise 71731c46edSAlex Elder */ 72731c46edSAlex Elder bool ipa_cmd_table_valid(struct ipa *ipa, const struct ipa_mem *mem, 73731c46edSAlex Elder bool route, bool ipv6, bool hashed); 74731c46edSAlex Elder 75731c46edSAlex Elder /** 76731c46edSAlex Elder * ipa_cmd_data_valid() - Validate command-realted configuration is valid 77731c46edSAlex Elder * @ipa: - IPA pointer 78731c46edSAlex Elder * 79e3eea08eSAlex Elder * Return: true if assumptions required for command are valid 80731c46edSAlex Elder */ 81731c46edSAlex Elder bool ipa_cmd_data_valid(struct ipa *ipa); 82731c46edSAlex Elder 83731c46edSAlex Elder #else /* !IPA_VALIDATE */ 84731c46edSAlex Elder 85731c46edSAlex Elder static inline bool ipa_cmd_table_valid(struct ipa *ipa, 86731c46edSAlex Elder const struct ipa_mem *mem, bool route, 87731c46edSAlex Elder bool ipv6, bool hashed) 88731c46edSAlex Elder { 89731c46edSAlex Elder return true; 90731c46edSAlex Elder } 91731c46edSAlex Elder 92731c46edSAlex Elder static inline bool ipa_cmd_data_valid(struct ipa *ipa) 93731c46edSAlex Elder { 94731c46edSAlex Elder return true; 95731c46edSAlex Elder } 96731c46edSAlex Elder 97731c46edSAlex Elder #endif /* !IPA_VALIDATE */ 98731c46edSAlex Elder 99731c46edSAlex Elder /** 100731c46edSAlex Elder * ipa_cmd_pool_init() - initialize command channel pools 101731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 102731c46edSAlex Elder * @tre_count: Number of pool elements to allocate 103731c46edSAlex Elder * 104e3eea08eSAlex Elder * Return: 0 if successful, or a negative error code 105731c46edSAlex Elder */ 106*862d3f2cSAlex Elder int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_count); 107731c46edSAlex Elder 108731c46edSAlex Elder /** 109731c46edSAlex Elder * ipa_cmd_pool_exit() - Inverse of ipa_cmd_pool_init() 110731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 111731c46edSAlex Elder */ 112731c46edSAlex Elder void ipa_cmd_pool_exit(struct gsi_channel *channel); 113731c46edSAlex Elder 114731c46edSAlex Elder /** 115731c46edSAlex Elder * ipa_cmd_table_init_add() - Add table init command to a transaction 116731c46edSAlex Elder * @trans: GSI transaction 117731c46edSAlex Elder * @opcode: IPA immediate command opcode 118731c46edSAlex Elder * @size: Size of non-hashed routing table memory 119731c46edSAlex Elder * @offset: Offset in IPA shared memory of non-hashed routing table memory 120731c46edSAlex Elder * @addr: DMA address of non-hashed table data to write 121731c46edSAlex Elder * @hash_size: Size of hashed routing table memory 122731c46edSAlex Elder * @hash_offset: Offset in IPA shared memory of hashed routing table memory 123731c46edSAlex Elder * @hash_addr: DMA address of hashed table data to write 124731c46edSAlex Elder * 125731c46edSAlex Elder * If hash_size is 0, hash_offset and hash_addr are ignored. 126731c46edSAlex Elder */ 127731c46edSAlex Elder void ipa_cmd_table_init_add(struct gsi_trans *trans, enum ipa_cmd_opcode opcode, 128731c46edSAlex Elder u16 size, u32 offset, dma_addr_t addr, 129731c46edSAlex Elder u16 hash_size, u32 hash_offset, 130731c46edSAlex Elder dma_addr_t hash_addr); 131731c46edSAlex Elder 132731c46edSAlex Elder /** 133731c46edSAlex Elder * ipa_cmd_hdr_init_local_add() - Add a header init command to a transaction 134*862d3f2cSAlex Elder * @trans: GSI transaction 135731c46edSAlex Elder * @offset: Offset of header memory in IPA local space 136731c46edSAlex Elder * @size: Size of header memory 137731c46edSAlex Elder * @addr: DMA address of buffer to be written from 138731c46edSAlex Elder * 139731c46edSAlex Elder * Defines and fills the location in IPA memory to use for headers. 140731c46edSAlex Elder */ 141731c46edSAlex Elder void ipa_cmd_hdr_init_local_add(struct gsi_trans *trans, u32 offset, u16 size, 142731c46edSAlex Elder dma_addr_t addr); 143731c46edSAlex Elder 144731c46edSAlex Elder /** 145731c46edSAlex Elder * ipa_cmd_register_write_add() - Add a register write command to a transaction 146731c46edSAlex Elder * @trans: GSI transaction 147731c46edSAlex Elder * @offset: Offset of register to be written 148731c46edSAlex Elder * @value: Value to be written 149731c46edSAlex Elder * @mask: Mask of bits in register to update with bits from value 150731c46edSAlex Elder * @clear_full: Pipeline clear option; true means full pipeline clear 151731c46edSAlex Elder */ 152731c46edSAlex Elder void ipa_cmd_register_write_add(struct gsi_trans *trans, u32 offset, u32 value, 153731c46edSAlex Elder u32 mask, bool clear_full); 154731c46edSAlex Elder 155731c46edSAlex Elder /** 156731c46edSAlex Elder * ipa_cmd_dma_shared_mem_add() - Add a DMA memory command to a transaction 157731c46edSAlex Elder * @trans: GSI transaction 158731c46edSAlex Elder * @offset: Offset of IPA memory to be read or written 159731c46edSAlex Elder * @size: Number of bytes of memory to be transferred 160731c46edSAlex Elder * @addr: DMA address of buffer to be read into or written from 161731c46edSAlex Elder * @toward_ipa: true means write to IPA memory; false means read 162731c46edSAlex Elder */ 163731c46edSAlex Elder void ipa_cmd_dma_shared_mem_add(struct gsi_trans *trans, u32 offset, 164731c46edSAlex Elder u16 size, dma_addr_t addr, bool toward_ipa); 165731c46edSAlex Elder 166731c46edSAlex Elder /** 167aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear_add() - Add pipeline clear commands to a transaction 168731c46edSAlex Elder * @trans: GSI transaction 169731c46edSAlex Elder */ 170aa56e3e5SAlex Elder void ipa_cmd_pipeline_clear_add(struct gsi_trans *trans); 171731c46edSAlex Elder 172731c46edSAlex Elder /** 173aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear_count() - # commands required to clear pipeline 174731c46edSAlex Elder * 175e3eea08eSAlex Elder * Return: The number of elements to allocate in a transaction 176aa56e3e5SAlex Elder * to hold commands to clear the pipeline 177731c46edSAlex Elder */ 178aa56e3e5SAlex Elder u32 ipa_cmd_pipeline_clear_count(void); 179731c46edSAlex Elder 180731c46edSAlex Elder /** 18151c48ce2SAlex Elder * ipa_cmd_pipeline_clear_wait() - Wait pipeline clear to complete 18251c48ce2SAlex Elder * @ipa: - IPA pointer 18351c48ce2SAlex Elder */ 18451c48ce2SAlex Elder void ipa_cmd_pipeline_clear_wait(struct ipa *ipa); 18551c48ce2SAlex Elder 18651c48ce2SAlex Elder /** 187aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear() - Clear the hardware pipeline 18851c48ce2SAlex Elder * @ipa: - IPA pointer 1896cb63ea6SAlex Elder */ 190aa56e3e5SAlex Elder void ipa_cmd_pipeline_clear(struct ipa *ipa); 1916cb63ea6SAlex Elder 1926cb63ea6SAlex Elder /** 193731c46edSAlex Elder * ipa_cmd_trans_alloc() - Allocate a transaction for the command TX endpoint 194731c46edSAlex Elder * @ipa: IPA pointer 195731c46edSAlex Elder * @tre_count: Number of elements in the transaction 196731c46edSAlex Elder * 197e3eea08eSAlex Elder * Return: A GSI transaction structure, or a null pointer if all 198731c46edSAlex Elder * available transactions are in use 199731c46edSAlex Elder */ 200731c46edSAlex Elder struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count); 201731c46edSAlex Elder 202731c46edSAlex Elder #endif /* _IPA_CMD_H_ */ 203