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 { 30*8701cb00SAlex Elder IPA_CMD_NONE = 0x0, 31*8701cb00SAlex Elder IPA_CMD_IP_V4_FILTER_INIT = 0x3, 32*8701cb00SAlex Elder IPA_CMD_IP_V6_FILTER_INIT = 0x4, 33*8701cb00SAlex Elder IPA_CMD_IP_V4_ROUTING_INIT = 0x7, 34*8701cb00SAlex Elder IPA_CMD_IP_V6_ROUTING_INIT = 0x8, 35*8701cb00SAlex Elder IPA_CMD_HDR_INIT_LOCAL = 0x9, 36*8701cb00SAlex Elder IPA_CMD_REGISTER_WRITE = 0xc, 37*8701cb00SAlex Elder IPA_CMD_IP_PACKET_INIT = 0x10, 38*8701cb00SAlex Elder IPA_CMD_DMA_SHARED_MEM = 0x13, 39*8701cb00SAlex Elder IPA_CMD_IP_PACKET_TAG_STATUS = 0x14, 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 #ifdef IPA_VALIDATE 54731c46edSAlex Elder 55731c46edSAlex Elder /** 56731c46edSAlex Elder * ipa_cmd_table_valid() - Validate a memory region holding a table 57731c46edSAlex Elder * @ipa: - IPA pointer 58731c46edSAlex Elder * @mem: - IPA memory region descriptor 59731c46edSAlex Elder * @route: - Whether the region holds a route or filter table 60731c46edSAlex Elder * @ipv6: - Whether the table is for IPv6 or IPv4 61731c46edSAlex Elder * @hashed: - Whether the table is hashed or non-hashed 62731c46edSAlex Elder * 63e3eea08eSAlex Elder * Return: true if region is valid, false otherwise 64731c46edSAlex Elder */ 65731c46edSAlex Elder bool ipa_cmd_table_valid(struct ipa *ipa, const struct ipa_mem *mem, 66731c46edSAlex Elder bool route, bool ipv6, bool hashed); 67731c46edSAlex Elder 68731c46edSAlex Elder /** 69731c46edSAlex Elder * ipa_cmd_data_valid() - Validate command-realted configuration is valid 70731c46edSAlex Elder * @ipa: - IPA pointer 71731c46edSAlex Elder * 72e3eea08eSAlex Elder * Return: true if assumptions required for command are valid 73731c46edSAlex Elder */ 74731c46edSAlex Elder bool ipa_cmd_data_valid(struct ipa *ipa); 75731c46edSAlex Elder 76731c46edSAlex Elder #else /* !IPA_VALIDATE */ 77731c46edSAlex Elder 78731c46edSAlex Elder static inline bool ipa_cmd_table_valid(struct ipa *ipa, 79731c46edSAlex Elder const struct ipa_mem *mem, bool route, 80731c46edSAlex Elder bool ipv6, bool hashed) 81731c46edSAlex Elder { 82731c46edSAlex Elder return true; 83731c46edSAlex Elder } 84731c46edSAlex Elder 85731c46edSAlex Elder static inline bool ipa_cmd_data_valid(struct ipa *ipa) 86731c46edSAlex Elder { 87731c46edSAlex Elder return true; 88731c46edSAlex Elder } 89731c46edSAlex Elder 90731c46edSAlex Elder #endif /* !IPA_VALIDATE */ 91731c46edSAlex Elder 92731c46edSAlex Elder /** 93731c46edSAlex Elder * ipa_cmd_pool_init() - initialize command channel pools 94731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 95731c46edSAlex Elder * @tre_count: Number of pool elements to allocate 96731c46edSAlex Elder * 97e3eea08eSAlex Elder * Return: 0 if successful, or a negative error code 98731c46edSAlex Elder */ 99731c46edSAlex Elder int ipa_cmd_pool_init(struct gsi_channel *gsi_channel, u32 tre_count); 100731c46edSAlex Elder 101731c46edSAlex Elder /** 102731c46edSAlex Elder * ipa_cmd_pool_exit() - Inverse of ipa_cmd_pool_init() 103731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 104731c46edSAlex Elder */ 105731c46edSAlex Elder void ipa_cmd_pool_exit(struct gsi_channel *channel); 106731c46edSAlex Elder 107731c46edSAlex Elder /** 108731c46edSAlex Elder * ipa_cmd_table_init_add() - Add table init command to a transaction 109731c46edSAlex Elder * @trans: GSI transaction 110731c46edSAlex Elder * @opcode: IPA immediate command opcode 111731c46edSAlex Elder * @size: Size of non-hashed routing table memory 112731c46edSAlex Elder * @offset: Offset in IPA shared memory of non-hashed routing table memory 113731c46edSAlex Elder * @addr: DMA address of non-hashed table data to write 114731c46edSAlex Elder * @hash_size: Size of hashed routing table memory 115731c46edSAlex Elder * @hash_offset: Offset in IPA shared memory of hashed routing table memory 116731c46edSAlex Elder * @hash_addr: DMA address of hashed table data to write 117731c46edSAlex Elder * 118731c46edSAlex Elder * If hash_size is 0, hash_offset and hash_addr are ignored. 119731c46edSAlex Elder */ 120731c46edSAlex Elder void ipa_cmd_table_init_add(struct gsi_trans *trans, enum ipa_cmd_opcode opcode, 121731c46edSAlex Elder u16 size, u32 offset, dma_addr_t addr, 122731c46edSAlex Elder u16 hash_size, u32 hash_offset, 123731c46edSAlex Elder dma_addr_t hash_addr); 124731c46edSAlex Elder 125731c46edSAlex Elder /** 126731c46edSAlex Elder * ipa_cmd_hdr_init_local_add() - Add a header init command to a transaction 127731c46edSAlex Elder * @ipa: IPA structure 128731c46edSAlex Elder * @offset: Offset of header memory in IPA local space 129731c46edSAlex Elder * @size: Size of header memory 130731c46edSAlex Elder * @addr: DMA address of buffer to be written from 131731c46edSAlex Elder * 132731c46edSAlex Elder * Defines and fills the location in IPA memory to use for headers. 133731c46edSAlex Elder */ 134731c46edSAlex Elder void ipa_cmd_hdr_init_local_add(struct gsi_trans *trans, u32 offset, u16 size, 135731c46edSAlex Elder dma_addr_t addr); 136731c46edSAlex Elder 137731c46edSAlex Elder /** 138731c46edSAlex Elder * ipa_cmd_register_write_add() - Add a register write command to a transaction 139731c46edSAlex Elder * @trans: GSI transaction 140731c46edSAlex Elder * @offset: Offset of register to be written 141731c46edSAlex Elder * @value: Value to be written 142731c46edSAlex Elder * @mask: Mask of bits in register to update with bits from value 143731c46edSAlex Elder * @clear_full: Pipeline clear option; true means full pipeline clear 144731c46edSAlex Elder */ 145731c46edSAlex Elder void ipa_cmd_register_write_add(struct gsi_trans *trans, u32 offset, u32 value, 146731c46edSAlex Elder u32 mask, bool clear_full); 147731c46edSAlex Elder 148731c46edSAlex Elder /** 149731c46edSAlex Elder * ipa_cmd_dma_shared_mem_add() - Add a DMA memory command to a transaction 150731c46edSAlex Elder * @trans: GSI transaction 151731c46edSAlex Elder * @offset: Offset of IPA memory to be read or written 152731c46edSAlex Elder * @size: Number of bytes of memory to be transferred 153731c46edSAlex Elder * @addr: DMA address of buffer to be read into or written from 154731c46edSAlex Elder * @toward_ipa: true means write to IPA memory; false means read 155731c46edSAlex Elder */ 156731c46edSAlex Elder void ipa_cmd_dma_shared_mem_add(struct gsi_trans *trans, u32 offset, 157731c46edSAlex Elder u16 size, dma_addr_t addr, bool toward_ipa); 158731c46edSAlex Elder 159731c46edSAlex Elder /** 160731c46edSAlex Elder * ipa_cmd_tag_process_add() - Add IPA tag process commands to a transaction 161731c46edSAlex Elder * @trans: GSI transaction 162731c46edSAlex Elder */ 163731c46edSAlex Elder void ipa_cmd_tag_process_add(struct gsi_trans *trans); 164731c46edSAlex Elder 165731c46edSAlex Elder /** 166731c46edSAlex Elder * ipa_cmd_tag_process_add_count() - Number of commands in a tag process 167731c46edSAlex Elder * 168e3eea08eSAlex Elder * Return: The number of elements to allocate in a transaction 169731c46edSAlex Elder * to hold tag process commands 170731c46edSAlex Elder */ 171731c46edSAlex Elder u32 ipa_cmd_tag_process_count(void); 172731c46edSAlex Elder 173731c46edSAlex Elder /** 1746cb63ea6SAlex Elder * ipa_cmd_tag_process() - Perform a tag process 1756cb63ea6SAlex Elder * 1766cb63ea6SAlex Elder * @Return: The number of elements to allocate in a transaction 1776cb63ea6SAlex Elder * to hold tag process commands 1786cb63ea6SAlex Elder */ 1796cb63ea6SAlex Elder void ipa_cmd_tag_process(struct ipa *ipa); 1806cb63ea6SAlex Elder 1816cb63ea6SAlex Elder /** 182731c46edSAlex Elder * ipa_cmd_trans_alloc() - Allocate a transaction for the command TX endpoint 183731c46edSAlex Elder * @ipa: IPA pointer 184731c46edSAlex Elder * @tre_count: Number of elements in the transaction 185731c46edSAlex Elder * 186e3eea08eSAlex Elder * Return: A GSI transaction structure, or a null pointer if all 187731c46edSAlex Elder * available transactions are in use 188731c46edSAlex Elder */ 189731c46edSAlex Elder struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count); 190731c46edSAlex Elder 191731c46edSAlex Elder #endif /* _IPA_CMD_H_ */ 192