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 * 23731c46edSAlex Elder * All immediate commands are issued using the AP command TX endpoint. 24731c46edSAlex Elder * The numeric values here are the opcodes for IPA v3.5.1 hardware. 25731c46edSAlex Elder * 26731c46edSAlex Elder * IPA_CMD_NONE is a special (invalid) value that's used to indicate 27731c46edSAlex Elder * a request is *not* an immediate command. 28731c46edSAlex Elder */ 29731c46edSAlex Elder enum ipa_cmd_opcode { 30731c46edSAlex Elder IPA_CMD_NONE = 0, 31731c46edSAlex Elder IPA_CMD_IP_V4_FILTER_INIT = 3, 32731c46edSAlex Elder IPA_CMD_IP_V6_FILTER_INIT = 4, 33731c46edSAlex Elder IPA_CMD_IP_V4_ROUTING_INIT = 7, 34731c46edSAlex Elder IPA_CMD_IP_V6_ROUTING_INIT = 8, 35731c46edSAlex Elder IPA_CMD_HDR_INIT_LOCAL = 9, 36731c46edSAlex Elder IPA_CMD_REGISTER_WRITE = 12, 37731c46edSAlex Elder IPA_CMD_IP_PACKET_INIT = 16, 38731c46edSAlex Elder IPA_CMD_DMA_SHARED_MEM = 19, 39731c46edSAlex Elder IPA_CMD_IP_PACKET_TAG_STATUS = 20, 40731c46edSAlex Elder }; 41731c46edSAlex Elder 42731c46edSAlex Elder /** 43731c46edSAlex Elder * struct ipa_cmd_info - information needed for an IPA immediate command 44731c46edSAlex Elder * 45731c46edSAlex Elder * @opcode: The command opcode. 46731c46edSAlex Elder * @direction: Direction of data transfer for DMA commands 47731c46edSAlex Elder */ 48731c46edSAlex Elder struct ipa_cmd_info { 49731c46edSAlex Elder enum ipa_cmd_opcode opcode; 50731c46edSAlex Elder enum dma_data_direction direction; 51731c46edSAlex Elder }; 52731c46edSAlex Elder 53731c46edSAlex Elder 54731c46edSAlex Elder #ifdef IPA_VALIDATE 55731c46edSAlex Elder 56731c46edSAlex Elder /** 57731c46edSAlex Elder * ipa_cmd_table_valid() - Validate a memory region holding a table 58731c46edSAlex Elder * @ipa: - IPA pointer 59731c46edSAlex Elder * @mem: - IPA memory region descriptor 60731c46edSAlex Elder * @route: - Whether the region holds a route or filter table 61731c46edSAlex Elder * @ipv6: - Whether the table is for IPv6 or IPv4 62731c46edSAlex Elder * @hashed: - Whether the table is hashed or non-hashed 63731c46edSAlex Elder * 64e3eea08eSAlex Elder * Return: true if region is valid, false otherwise 65731c46edSAlex Elder */ 66731c46edSAlex Elder bool ipa_cmd_table_valid(struct ipa *ipa, const struct ipa_mem *mem, 67731c46edSAlex Elder bool route, bool ipv6, bool hashed); 68731c46edSAlex Elder 69731c46edSAlex Elder /** 70731c46edSAlex Elder * ipa_cmd_data_valid() - Validate command-realted configuration is valid 71731c46edSAlex Elder * @ipa: - IPA pointer 72731c46edSAlex Elder * 73e3eea08eSAlex Elder * Return: true if assumptions required for command are valid 74731c46edSAlex Elder */ 75731c46edSAlex Elder bool ipa_cmd_data_valid(struct ipa *ipa); 76731c46edSAlex Elder 77731c46edSAlex Elder #else /* !IPA_VALIDATE */ 78731c46edSAlex Elder 79731c46edSAlex Elder static inline bool ipa_cmd_table_valid(struct ipa *ipa, 80731c46edSAlex Elder const struct ipa_mem *mem, bool route, 81731c46edSAlex Elder bool ipv6, bool hashed) 82731c46edSAlex Elder { 83731c46edSAlex Elder return true; 84731c46edSAlex Elder } 85731c46edSAlex Elder 86731c46edSAlex Elder static inline bool ipa_cmd_data_valid(struct ipa *ipa) 87731c46edSAlex Elder { 88731c46edSAlex Elder return true; 89731c46edSAlex Elder } 90731c46edSAlex Elder 91731c46edSAlex Elder #endif /* !IPA_VALIDATE */ 92731c46edSAlex Elder 93731c46edSAlex Elder /** 94731c46edSAlex Elder * ipa_cmd_pool_init() - initialize command channel pools 95731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 96731c46edSAlex Elder * @tre_count: Number of pool elements to allocate 97731c46edSAlex Elder * 98e3eea08eSAlex Elder * Return: 0 if successful, or a negative error code 99731c46edSAlex Elder */ 100731c46edSAlex Elder int ipa_cmd_pool_init(struct gsi_channel *gsi_channel, u32 tre_count); 101731c46edSAlex Elder 102731c46edSAlex Elder /** 103731c46edSAlex Elder * ipa_cmd_pool_exit() - Inverse of ipa_cmd_pool_init() 104731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 105731c46edSAlex Elder */ 106731c46edSAlex Elder void ipa_cmd_pool_exit(struct gsi_channel *channel); 107731c46edSAlex Elder 108731c46edSAlex Elder /** 109731c46edSAlex Elder * ipa_cmd_table_init_add() - Add table init command to a transaction 110731c46edSAlex Elder * @trans: GSI transaction 111731c46edSAlex Elder * @opcode: IPA immediate command opcode 112731c46edSAlex Elder * @size: Size of non-hashed routing table memory 113731c46edSAlex Elder * @offset: Offset in IPA shared memory of non-hashed routing table memory 114731c46edSAlex Elder * @addr: DMA address of non-hashed table data to write 115731c46edSAlex Elder * @hash_size: Size of hashed routing table memory 116731c46edSAlex Elder * @hash_offset: Offset in IPA shared memory of hashed routing table memory 117731c46edSAlex Elder * @hash_addr: DMA address of hashed table data to write 118731c46edSAlex Elder * 119731c46edSAlex Elder * If hash_size is 0, hash_offset and hash_addr are ignored. 120731c46edSAlex Elder */ 121731c46edSAlex Elder void ipa_cmd_table_init_add(struct gsi_trans *trans, enum ipa_cmd_opcode opcode, 122731c46edSAlex Elder u16 size, u32 offset, dma_addr_t addr, 123731c46edSAlex Elder u16 hash_size, u32 hash_offset, 124731c46edSAlex Elder dma_addr_t hash_addr); 125731c46edSAlex Elder 126731c46edSAlex Elder /** 127731c46edSAlex Elder * ipa_cmd_hdr_init_local_add() - Add a header init command to a transaction 128731c46edSAlex Elder * @ipa: IPA structure 129731c46edSAlex Elder * @offset: Offset of header memory in IPA local space 130731c46edSAlex Elder * @size: Size of header memory 131731c46edSAlex Elder * @addr: DMA address of buffer to be written from 132731c46edSAlex Elder * 133731c46edSAlex Elder * Defines and fills the location in IPA memory to use for headers. 134731c46edSAlex Elder */ 135731c46edSAlex Elder void ipa_cmd_hdr_init_local_add(struct gsi_trans *trans, u32 offset, u16 size, 136731c46edSAlex Elder dma_addr_t addr); 137731c46edSAlex Elder 138731c46edSAlex Elder /** 139731c46edSAlex Elder * ipa_cmd_register_write_add() - Add a register write command to a transaction 140731c46edSAlex Elder * @trans: GSI transaction 141731c46edSAlex Elder * @offset: Offset of register to be written 142731c46edSAlex Elder * @value: Value to be written 143731c46edSAlex Elder * @mask: Mask of bits in register to update with bits from value 144731c46edSAlex Elder * @clear_full: Pipeline clear option; true means full pipeline clear 145731c46edSAlex Elder */ 146731c46edSAlex Elder void ipa_cmd_register_write_add(struct gsi_trans *trans, u32 offset, u32 value, 147731c46edSAlex Elder u32 mask, bool clear_full); 148731c46edSAlex Elder 149731c46edSAlex Elder /** 150731c46edSAlex Elder * ipa_cmd_dma_shared_mem_add() - Add a DMA memory command to a transaction 151731c46edSAlex Elder * @trans: GSI transaction 152731c46edSAlex Elder * @offset: Offset of IPA memory to be read or written 153731c46edSAlex Elder * @size: Number of bytes of memory to be transferred 154731c46edSAlex Elder * @addr: DMA address of buffer to be read into or written from 155731c46edSAlex Elder * @toward_ipa: true means write to IPA memory; false means read 156731c46edSAlex Elder */ 157731c46edSAlex Elder void ipa_cmd_dma_shared_mem_add(struct gsi_trans *trans, u32 offset, 158731c46edSAlex Elder u16 size, dma_addr_t addr, bool toward_ipa); 159731c46edSAlex Elder 160731c46edSAlex Elder /** 161731c46edSAlex Elder * ipa_cmd_tag_process_add() - Add IPA tag process commands to a transaction 162731c46edSAlex Elder * @trans: GSI transaction 163731c46edSAlex Elder */ 164731c46edSAlex Elder void ipa_cmd_tag_process_add(struct gsi_trans *trans); 165731c46edSAlex Elder 166731c46edSAlex Elder /** 167731c46edSAlex Elder * ipa_cmd_tag_process_add_count() - Number of commands in a tag process 168731c46edSAlex Elder * 169e3eea08eSAlex Elder * Return: The number of elements to allocate in a transaction 170731c46edSAlex Elder * to hold tag process commands 171731c46edSAlex Elder */ 172731c46edSAlex Elder u32 ipa_cmd_tag_process_count(void); 173731c46edSAlex Elder 174731c46edSAlex Elder /** 1756cb63ea6SAlex Elder * ipa_cmd_tag_process() - Perform a tag process 1766cb63ea6SAlex Elder * 1776cb63ea6SAlex Elder * @Return: The number of elements to allocate in a transaction 1786cb63ea6SAlex Elder * to hold tag process commands 1796cb63ea6SAlex Elder */ 1806cb63ea6SAlex Elder void ipa_cmd_tag_process(struct ipa *ipa); 1816cb63ea6SAlex Elder 1826cb63ea6SAlex Elder /** 183731c46edSAlex Elder * ipa_cmd_trans_alloc() - Allocate a transaction for the command TX endpoint 184731c46edSAlex Elder * @ipa: IPA pointer 185731c46edSAlex Elder * @tre_count: Number of elements in the transaction 186731c46edSAlex Elder * 187e3eea08eSAlex Elder * Return: A GSI transaction structure, or a null pointer if all 188731c46edSAlex Elder * available transactions are in use 189731c46edSAlex Elder */ 190731c46edSAlex Elder struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count); 191731c46edSAlex Elder 192731c46edSAlex Elder #endif /* _IPA_CMD_H_ */ 193