1731c46edSAlex Elder /* SPDX-License-Identifier: GPL-2.0 */ 2731c46edSAlex Elder 3731c46edSAlex Elder /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. 4a4388da5SAlex Elder * Copyright (C) 2019-2022 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 * 23862d3f2cSAlex Elder * @IPA_CMD_IP_V4_FILTER_INIT: Initialize IPv4 filter table 24862d3f2cSAlex Elder * @IPA_CMD_IP_V6_FILTER_INIT: Initialize IPv6 filter table 25862d3f2cSAlex Elder * @IPA_CMD_IP_V4_ROUTING_INIT: Initialize IPv4 routing table 26862d3f2cSAlex Elder * @IPA_CMD_IP_V6_ROUTING_INIT: Initialize IPv6 routing table 27862d3f2cSAlex Elder * @IPA_CMD_HDR_INIT_LOCAL: Initialize IPA-local header memory 28862d3f2cSAlex Elder * @IPA_CMD_REGISTER_WRITE: Register write performed by IPA 29862d3f2cSAlex Elder * @IPA_CMD_IP_PACKET_INIT: Set up next packet's destination endpoint 30862d3f2cSAlex Elder * @IPA_CMD_DMA_SHARED_MEM: DMA command performed by IPA 31862d3f2cSAlex Elder * @IPA_CMD_IP_PACKET_TAG_STATUS: Have next packet generate tag * status 32862d3f2cSAlex Elder * @IPA_CMD_NONE: Special (invalid) "not a command" value 33731c46edSAlex Elder * 34862d3f2cSAlex 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 /** 505444b0eaSAlex Elder * ipa_cmd_table_init_valid() - Validate a memory region holding a table 51731c46edSAlex Elder * @ipa: - IPA pointer 52731c46edSAlex Elder * @mem: - IPA memory region descriptor 53731c46edSAlex Elder * @route: - Whether the region holds a route or filter table 54731c46edSAlex Elder * 55e3eea08eSAlex Elder * Return: true if region is valid, false otherwise 56731c46edSAlex Elder */ 575444b0eaSAlex Elder bool ipa_cmd_table_init_valid(struct ipa *ipa, const struct ipa_mem *mem, 58f2c1dac0SAlex Elder bool route); 59f2c1dac0SAlex Elder 60731c46edSAlex Elder /** 61731c46edSAlex Elder * ipa_cmd_data_valid() - Validate command-realted configuration is valid 62731c46edSAlex Elder * @ipa: - IPA pointer 63731c46edSAlex Elder * 64e3eea08eSAlex Elder * Return: true if assumptions required for command are valid 65731c46edSAlex Elder */ 66731c46edSAlex Elder bool ipa_cmd_data_valid(struct ipa *ipa); 67731c46edSAlex Elder 68731c46edSAlex Elder /** 69731c46edSAlex Elder * ipa_cmd_pool_init() - initialize command channel pools 70731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 71731c46edSAlex Elder * @tre_count: Number of pool elements to allocate 72731c46edSAlex Elder * 73e3eea08eSAlex Elder * Return: 0 if successful, or a negative error code 74731c46edSAlex Elder */ 75862d3f2cSAlex Elder int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_count); 76731c46edSAlex Elder 77731c46edSAlex Elder /** 78731c46edSAlex Elder * ipa_cmd_pool_exit() - Inverse of ipa_cmd_pool_init() 79731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 80731c46edSAlex Elder */ 81731c46edSAlex Elder void ipa_cmd_pool_exit(struct gsi_channel *channel); 82731c46edSAlex Elder 83731c46edSAlex Elder /** 84731c46edSAlex Elder * ipa_cmd_table_init_add() - Add table init command to a transaction 85731c46edSAlex Elder * @trans: GSI transaction 86731c46edSAlex Elder * @opcode: IPA immediate command opcode 87731c46edSAlex Elder * @size: Size of non-hashed routing table memory 88731c46edSAlex Elder * @offset: Offset in IPA shared memory of non-hashed routing table memory 89731c46edSAlex Elder * @addr: DMA address of non-hashed table data to write 90731c46edSAlex Elder * @hash_size: Size of hashed routing table memory 91731c46edSAlex Elder * @hash_offset: Offset in IPA shared memory of hashed routing table memory 92731c46edSAlex Elder * @hash_addr: DMA address of hashed table data to write 93731c46edSAlex Elder * 94731c46edSAlex Elder * If hash_size is 0, hash_offset and hash_addr are ignored. 95731c46edSAlex Elder */ 96731c46edSAlex Elder void ipa_cmd_table_init_add(struct gsi_trans *trans, enum ipa_cmd_opcode opcode, 97731c46edSAlex Elder u16 size, u32 offset, dma_addr_t addr, 98731c46edSAlex Elder u16 hash_size, u32 hash_offset, 99731c46edSAlex Elder dma_addr_t hash_addr); 100731c46edSAlex Elder 101731c46edSAlex Elder /** 102731c46edSAlex Elder * ipa_cmd_hdr_init_local_add() - Add a header init command to a transaction 103862d3f2cSAlex Elder * @trans: GSI transaction 104731c46edSAlex Elder * @offset: Offset of header memory in IPA local space 105731c46edSAlex Elder * @size: Size of header memory 106731c46edSAlex Elder * @addr: DMA address of buffer to be written from 107731c46edSAlex Elder * 108731c46edSAlex Elder * Defines and fills the location in IPA memory to use for headers. 109731c46edSAlex Elder */ 110731c46edSAlex Elder void ipa_cmd_hdr_init_local_add(struct gsi_trans *trans, u32 offset, u16 size, 111731c46edSAlex Elder dma_addr_t addr); 112731c46edSAlex Elder 113731c46edSAlex Elder /** 114731c46edSAlex Elder * ipa_cmd_register_write_add() - Add a register write command to a transaction 115731c46edSAlex Elder * @trans: GSI transaction 116731c46edSAlex Elder * @offset: Offset of register to be written 117731c46edSAlex Elder * @value: Value to be written 118731c46edSAlex Elder * @mask: Mask of bits in register to update with bits from value 119731c46edSAlex Elder * @clear_full: Pipeline clear option; true means full pipeline clear 120731c46edSAlex Elder */ 121731c46edSAlex Elder void ipa_cmd_register_write_add(struct gsi_trans *trans, u32 offset, u32 value, 122731c46edSAlex Elder u32 mask, bool clear_full); 123731c46edSAlex Elder 124731c46edSAlex Elder /** 125731c46edSAlex Elder * ipa_cmd_dma_shared_mem_add() - Add a DMA memory command to a transaction 126731c46edSAlex Elder * @trans: GSI transaction 127731c46edSAlex Elder * @offset: Offset of IPA memory to be read or written 128731c46edSAlex Elder * @size: Number of bytes of memory to be transferred 129731c46edSAlex Elder * @addr: DMA address of buffer to be read into or written from 130731c46edSAlex Elder * @toward_ipa: true means write to IPA memory; false means read 131731c46edSAlex Elder */ 132731c46edSAlex Elder void ipa_cmd_dma_shared_mem_add(struct gsi_trans *trans, u32 offset, 133731c46edSAlex Elder u16 size, dma_addr_t addr, bool toward_ipa); 134731c46edSAlex Elder 135731c46edSAlex Elder /** 136aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear_add() - Add pipeline clear commands to a transaction 137731c46edSAlex Elder * @trans: GSI transaction 138731c46edSAlex Elder */ 139aa56e3e5SAlex Elder void ipa_cmd_pipeline_clear_add(struct gsi_trans *trans); 140731c46edSAlex Elder 141731c46edSAlex Elder /** 142aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear_count() - # commands required to clear pipeline 143731c46edSAlex Elder * 144e3eea08eSAlex Elder * Return: The number of elements to allocate in a transaction 145aa56e3e5SAlex Elder * to hold commands to clear the pipeline 146731c46edSAlex Elder */ 147aa56e3e5SAlex Elder u32 ipa_cmd_pipeline_clear_count(void); 148731c46edSAlex Elder 149731c46edSAlex Elder /** 15051c48ce2SAlex Elder * ipa_cmd_pipeline_clear_wait() - Wait pipeline clear to complete 15151c48ce2SAlex Elder * @ipa: - IPA pointer 15251c48ce2SAlex Elder */ 15351c48ce2SAlex Elder void ipa_cmd_pipeline_clear_wait(struct ipa *ipa); 15451c48ce2SAlex Elder 15551c48ce2SAlex Elder /** 156731c46edSAlex Elder * ipa_cmd_trans_alloc() - Allocate a transaction for the command TX endpoint 157731c46edSAlex Elder * @ipa: IPA pointer 158731c46edSAlex Elder * @tre_count: Number of elements in the transaction 159731c46edSAlex Elder * 160e3eea08eSAlex Elder * Return: A GSI transaction structure, or a null pointer if all 161731c46edSAlex Elder * available transactions are in use 162731c46edSAlex Elder */ 163731c46edSAlex Elder struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count); 164731c46edSAlex Elder 165*7fd10a2aSAlex Elder /** 166*7fd10a2aSAlex Elder * ipa_cmd_init() - Initialize IPA immediate commands 167*7fd10a2aSAlex Elder * @ipa: - IPA pointer 168*7fd10a2aSAlex Elder * 169*7fd10a2aSAlex Elder * Return: 0 if successful, or a negative error code 170*7fd10a2aSAlex Elder * 171*7fd10a2aSAlex Elder * There is no need for a matching ipa_cmd_exit() function. 172*7fd10a2aSAlex Elder */ 173*7fd10a2aSAlex Elder int ipa_cmd_init(struct ipa *ipa); 174*7fd10a2aSAlex Elder 175731c46edSAlex Elder #endif /* _IPA_CMD_H_ */ 176