1731c46edSAlex Elder /* SPDX-License-Identifier: GPL-2.0 */ 2731c46edSAlex Elder 3731c46edSAlex Elder /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. 48c044024SAlex Elder * Copyright (C) 2019-2024 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 11*88412277SAlex Elder struct gsi_channel; 12*88412277SAlex Elder struct gsi_trans; 13731c46edSAlex Elder struct ipa; 14731c46edSAlex Elder struct ipa_mem; 15731c46edSAlex Elder 16731c46edSAlex Elder /** 17731c46edSAlex Elder * enum ipa_cmd_opcode: IPA immediate commands 18731c46edSAlex Elder * 19862d3f2cSAlex Elder * @IPA_CMD_IP_V4_FILTER_INIT: Initialize IPv4 filter table 20862d3f2cSAlex Elder * @IPA_CMD_IP_V6_FILTER_INIT: Initialize IPv6 filter table 21862d3f2cSAlex Elder * @IPA_CMD_IP_V4_ROUTING_INIT: Initialize IPv4 routing table 22862d3f2cSAlex Elder * @IPA_CMD_IP_V6_ROUTING_INIT: Initialize IPv6 routing table 23862d3f2cSAlex Elder * @IPA_CMD_HDR_INIT_LOCAL: Initialize IPA-local header memory 24862d3f2cSAlex Elder * @IPA_CMD_REGISTER_WRITE: Register write performed by IPA 25862d3f2cSAlex Elder * @IPA_CMD_IP_PACKET_INIT: Set up next packet's destination endpoint 26862d3f2cSAlex Elder * @IPA_CMD_DMA_SHARED_MEM: DMA command performed by IPA 27862d3f2cSAlex Elder * @IPA_CMD_IP_PACKET_TAG_STATUS: Have next packet generate tag * status 28862d3f2cSAlex Elder * @IPA_CMD_NONE: Special (invalid) "not a command" value 29731c46edSAlex Elder * 30862d3f2cSAlex Elder * All immediate commands are issued using the AP command TX endpoint. 31731c46edSAlex Elder */ 32731c46edSAlex Elder enum ipa_cmd_opcode { 338701cb00SAlex Elder IPA_CMD_NONE = 0x0, 348701cb00SAlex Elder IPA_CMD_IP_V4_FILTER_INIT = 0x3, 358701cb00SAlex Elder IPA_CMD_IP_V6_FILTER_INIT = 0x4, 368701cb00SAlex Elder IPA_CMD_IP_V4_ROUTING_INIT = 0x7, 378701cb00SAlex Elder IPA_CMD_IP_V6_ROUTING_INIT = 0x8, 388701cb00SAlex Elder IPA_CMD_HDR_INIT_LOCAL = 0x9, 398701cb00SAlex Elder IPA_CMD_REGISTER_WRITE = 0xc, 408701cb00SAlex Elder IPA_CMD_IP_PACKET_INIT = 0x10, 418701cb00SAlex Elder IPA_CMD_DMA_SHARED_MEM = 0x13, 428701cb00SAlex Elder IPA_CMD_IP_PACKET_TAG_STATUS = 0x14, 43731c46edSAlex Elder }; 44731c46edSAlex Elder 45731c46edSAlex Elder /** 465444b0eaSAlex Elder * ipa_cmd_table_init_valid() - Validate a memory region holding a table 47731c46edSAlex Elder * @ipa: - IPA pointer 48731c46edSAlex Elder * @mem: - IPA memory region descriptor 49731c46edSAlex Elder * @route: - Whether the region holds a route or filter table 50731c46edSAlex Elder * 51e3eea08eSAlex Elder * Return: true if region is valid, false otherwise 52731c46edSAlex Elder */ 535444b0eaSAlex Elder bool ipa_cmd_table_init_valid(struct ipa *ipa, const struct ipa_mem *mem, 54f2c1dac0SAlex Elder bool route); 55f2c1dac0SAlex Elder 56731c46edSAlex Elder /** 57731c46edSAlex Elder * ipa_cmd_pool_init() - initialize command channel pools 58731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 59731c46edSAlex Elder * @tre_count: Number of pool elements to allocate 60731c46edSAlex Elder * 61e3eea08eSAlex Elder * Return: 0 if successful, or a negative error code 62731c46edSAlex Elder */ 63862d3f2cSAlex Elder int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_count); 64731c46edSAlex Elder 65731c46edSAlex Elder /** 66731c46edSAlex Elder * ipa_cmd_pool_exit() - Inverse of ipa_cmd_pool_init() 67731c46edSAlex Elder * @channel: AP->IPA command TX GSI channel pointer 68731c46edSAlex Elder */ 69731c46edSAlex Elder void ipa_cmd_pool_exit(struct gsi_channel *channel); 70731c46edSAlex Elder 71731c46edSAlex Elder /** 72731c46edSAlex Elder * ipa_cmd_table_init_add() - Add table init command to a transaction 73731c46edSAlex Elder * @trans: GSI transaction 74731c46edSAlex Elder * @opcode: IPA immediate command opcode 75731c46edSAlex Elder * @size: Size of non-hashed routing table memory 76731c46edSAlex Elder * @offset: Offset in IPA shared memory of non-hashed routing table memory 77731c46edSAlex Elder * @addr: DMA address of non-hashed table data to write 78731c46edSAlex Elder * @hash_size: Size of hashed routing table memory 79731c46edSAlex Elder * @hash_offset: Offset in IPA shared memory of hashed routing table memory 80731c46edSAlex Elder * @hash_addr: DMA address of hashed table data to write 81731c46edSAlex Elder * 82731c46edSAlex Elder * If hash_size is 0, hash_offset and hash_addr are ignored. 83731c46edSAlex Elder */ 84731c46edSAlex Elder void ipa_cmd_table_init_add(struct gsi_trans *trans, enum ipa_cmd_opcode opcode, 85731c46edSAlex Elder u16 size, u32 offset, dma_addr_t addr, 86731c46edSAlex Elder u16 hash_size, u32 hash_offset, 87731c46edSAlex Elder dma_addr_t hash_addr); 88731c46edSAlex Elder 89731c46edSAlex Elder /** 90731c46edSAlex Elder * ipa_cmd_hdr_init_local_add() - Add a header init command to a transaction 91862d3f2cSAlex Elder * @trans: GSI transaction 92731c46edSAlex Elder * @offset: Offset of header memory in IPA local space 93731c46edSAlex Elder * @size: Size of header memory 94731c46edSAlex Elder * @addr: DMA address of buffer to be written from 95731c46edSAlex Elder * 96731c46edSAlex Elder * Defines and fills the location in IPA memory to use for headers. 97731c46edSAlex Elder */ 98731c46edSAlex Elder void ipa_cmd_hdr_init_local_add(struct gsi_trans *trans, u32 offset, u16 size, 99731c46edSAlex Elder dma_addr_t addr); 100731c46edSAlex Elder 101731c46edSAlex Elder /** 102731c46edSAlex Elder * ipa_cmd_register_write_add() - Add a register write command to a transaction 103731c46edSAlex Elder * @trans: GSI transaction 104731c46edSAlex Elder * @offset: Offset of register to be written 105731c46edSAlex Elder * @value: Value to be written 106731c46edSAlex Elder * @mask: Mask of bits in register to update with bits from value 107731c46edSAlex Elder * @clear_full: Pipeline clear option; true means full pipeline clear 108731c46edSAlex Elder */ 109731c46edSAlex Elder void ipa_cmd_register_write_add(struct gsi_trans *trans, u32 offset, u32 value, 110731c46edSAlex Elder u32 mask, bool clear_full); 111731c46edSAlex Elder 112731c46edSAlex Elder /** 113731c46edSAlex Elder * ipa_cmd_dma_shared_mem_add() - Add a DMA memory command to a transaction 114731c46edSAlex Elder * @trans: GSI transaction 115731c46edSAlex Elder * @offset: Offset of IPA memory to be read or written 116731c46edSAlex Elder * @size: Number of bytes of memory to be transferred 117731c46edSAlex Elder * @addr: DMA address of buffer to be read into or written from 118731c46edSAlex Elder * @toward_ipa: true means write to IPA memory; false means read 119731c46edSAlex Elder */ 120731c46edSAlex Elder void ipa_cmd_dma_shared_mem_add(struct gsi_trans *trans, u32 offset, 121731c46edSAlex Elder u16 size, dma_addr_t addr, bool toward_ipa); 122731c46edSAlex Elder 123731c46edSAlex Elder /** 124aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear_add() - Add pipeline clear commands to a transaction 125731c46edSAlex Elder * @trans: GSI transaction 126731c46edSAlex Elder */ 127aa56e3e5SAlex Elder void ipa_cmd_pipeline_clear_add(struct gsi_trans *trans); 128731c46edSAlex Elder 129731c46edSAlex Elder /** 130aa56e3e5SAlex Elder * ipa_cmd_pipeline_clear_count() - # commands required to clear pipeline 131731c46edSAlex Elder * 132e3eea08eSAlex Elder * Return: The number of elements to allocate in a transaction 133aa56e3e5SAlex Elder * to hold commands to clear the pipeline 134731c46edSAlex Elder */ 135aa56e3e5SAlex Elder u32 ipa_cmd_pipeline_clear_count(void); 136731c46edSAlex Elder 137731c46edSAlex Elder /** 13851c48ce2SAlex Elder * ipa_cmd_pipeline_clear_wait() - Wait pipeline clear to complete 13951c48ce2SAlex Elder * @ipa: - IPA pointer 14051c48ce2SAlex Elder */ 14151c48ce2SAlex Elder void ipa_cmd_pipeline_clear_wait(struct ipa *ipa); 14251c48ce2SAlex Elder 14351c48ce2SAlex Elder /** 144731c46edSAlex Elder * ipa_cmd_trans_alloc() - Allocate a transaction for the command TX endpoint 145731c46edSAlex Elder * @ipa: IPA pointer 146731c46edSAlex Elder * @tre_count: Number of elements in the transaction 147731c46edSAlex Elder * 148e3eea08eSAlex Elder * Return: A GSI transaction structure, or a null pointer if all 149731c46edSAlex Elder * available transactions are in use 150731c46edSAlex Elder */ 151731c46edSAlex Elder struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count); 152731c46edSAlex Elder 1537fd10a2aSAlex Elder /** 1547fd10a2aSAlex Elder * ipa_cmd_init() - Initialize IPA immediate commands 1557fd10a2aSAlex Elder * @ipa: - IPA pointer 1567fd10a2aSAlex Elder * 1577fd10a2aSAlex Elder * Return: 0 if successful, or a negative error code 1587fd10a2aSAlex Elder * 1597fd10a2aSAlex Elder * There is no need for a matching ipa_cmd_exit() function. 1607fd10a2aSAlex Elder */ 1617fd10a2aSAlex Elder int ipa_cmd_init(struct ipa *ipa); 1627fd10a2aSAlex Elder 163731c46edSAlex Elder #endif /* _IPA_CMD_H_ */ 164