Commit 8797972a authored by Alex Elder's avatar Alex Elder Committed by David S. Miller

net: ipa: remove command info pool

The ipa_cmd_info structure now contains only one field, and it's an
enumerated type whose values all fit in 8 bits.  Currently we'll
never use more than 8 TREs in a command transaction, and we can
represent that number of command opcodes in the same space as a 64
bit pointer to an ipa_cmd_info structure.

Define IPA_COMMAND_TRANS_TRE_MAX as the maximum number of TREs that
can be in a command transaction.  Replace the info pointer in a
transaction with a fixed-size array named cmd_opcode[] of that many
bytes.  Store the opcode in this array when adding a command TRE to
a transaction, as was done previously for the info array.  This
makes the ipa_cmd_info unused, so get rid of it.

When committing an immediate command transaction, use the channel's
Boolean command flag to determine whether to fill in the opcode,
which will be taken (as before) from the array in the transaction.

This makes the command info pool unnecessary, so get rid of it.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4de284b7
...@@ -84,7 +84,6 @@ struct gsi_trans_info { ...@@ -84,7 +84,6 @@ struct gsi_trans_info {
struct gsi_trans_pool pool; /* transaction pool */ struct gsi_trans_pool pool; /* transaction pool */
struct gsi_trans_pool sg_pool; /* scatterlist pool */ struct gsi_trans_pool sg_pool; /* scatterlist pool */
struct gsi_trans_pool cmd_pool; /* command payload DMA pool */ struct gsi_trans_pool cmd_pool; /* command payload DMA pool */
struct gsi_trans_pool info_pool;/* command information pool */
struct gsi_trans **map; /* TRE -> transaction map */ struct gsi_trans **map; /* TRE -> transaction map */
spinlock_t spinlock; /* protects updates to the lists */ spinlock_t spinlock; /* protects updates to the lists */
......
...@@ -436,7 +436,7 @@ void gsi_trans_cmd_add(struct gsi_trans *trans, void *buf, u32 size, ...@@ -436,7 +436,7 @@ void gsi_trans_cmd_add(struct gsi_trans *trans, void *buf, u32 size,
sg_dma_address(sg) = addr; sg_dma_address(sg) = addr;
sg_dma_len(sg) = size; sg_dma_len(sg) = size;
trans->info[which].opcode = opcode; trans->cmd_opcode[which] = opcode;
} }
/* Add a page transfer to a transaction. It will fill the only TRE. */ /* Add a page transfer to a transaction. It will fill the only TRE. */
...@@ -552,10 +552,10 @@ static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db) ...@@ -552,10 +552,10 @@ static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db)
struct gsi_ring *ring = &channel->tre_ring; struct gsi_ring *ring = &channel->tre_ring;
enum ipa_cmd_opcode opcode = IPA_CMD_NONE; enum ipa_cmd_opcode opcode = IPA_CMD_NONE;
bool bei = channel->toward_ipa; bool bei = channel->toward_ipa;
struct ipa_cmd_info *info;
struct gsi_tre *dest_tre; struct gsi_tre *dest_tre;
struct scatterlist *sg; struct scatterlist *sg;
u32 byte_count = 0; u32 byte_count = 0;
u8 *cmd_opcode;
u32 avail; u32 avail;
u32 i; u32 i;
...@@ -566,7 +566,7 @@ static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db) ...@@ -566,7 +566,7 @@ static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db)
* If there is no info array we're doing a simple data * If there is no info array we're doing a simple data
* transfer request, whose opcode is IPA_CMD_NONE. * transfer request, whose opcode is IPA_CMD_NONE.
*/ */
info = trans->info ? &trans->info[0] : NULL; cmd_opcode = channel->command ? &trans->cmd_opcode[0] : NULL;
avail = ring->count - ring->index % ring->count; avail = ring->count - ring->index % ring->count;
dest_tre = gsi_ring_virt(ring, ring->index); dest_tre = gsi_ring_virt(ring, ring->index);
for_each_sg(trans->sgl, sg, trans->used, i) { for_each_sg(trans->sgl, sg, trans->used, i) {
...@@ -577,8 +577,8 @@ static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db) ...@@ -577,8 +577,8 @@ static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db)
byte_count += len; byte_count += len;
if (!avail--) if (!avail--)
dest_tre = gsi_ring_virt(ring, 0); dest_tre = gsi_ring_virt(ring, 0);
if (info) if (cmd_opcode)
opcode = info++->opcode; opcode = *cmd_opcode++;
gsi_trans_tre_fill(dest_tre, addr, len, last_tre, bei, opcode); gsi_trans_tre_fill(dest_tre, addr, len, last_tre, bei, opcode);
dest_tre++; dest_tre++;
......
...@@ -22,6 +22,9 @@ struct gsi; ...@@ -22,6 +22,9 @@ struct gsi;
struct gsi_trans; struct gsi_trans;
struct gsi_trans_pool; struct gsi_trans_pool;
/* Maximum number of TREs in an IPA immediate command transaction */
#define IPA_COMMAND_TRANS_TRE_MAX 8
/** /**
* struct gsi_trans - a GSI transaction * struct gsi_trans - a GSI transaction
* *
...@@ -34,8 +37,8 @@ struct gsi_trans_pool; ...@@ -34,8 +37,8 @@ struct gsi_trans_pool;
* @used: Number of TREs *used* (could be less than tre_count) * @used: Number of TREs *used* (could be less than tre_count)
* @len: Total # of transfer bytes represented in sgl[] (set by core) * @len: Total # of transfer bytes represented in sgl[] (set by core)
* @data: Preserved but not touched by the core transaction code * @data: Preserved but not touched by the core transaction code
* @cmd_opcode: Array of command opcodes (command channel only)
* @sgl: An array of scatter/gather entries managed by core code * @sgl: An array of scatter/gather entries managed by core code
* @info: Array of command information structures (command channel)
* @direction: DMA transfer direction (DMA_NONE for commands) * @direction: DMA transfer direction (DMA_NONE for commands)
* @refcount: Reference count used for destruction * @refcount: Reference count used for destruction
* @completion: Completed when the transaction completes * @completion: Completed when the transaction completes
...@@ -58,8 +61,8 @@ struct gsi_trans { ...@@ -58,8 +61,8 @@ struct gsi_trans {
u32 len; /* total # bytes across sgl[] */ u32 len; /* total # bytes across sgl[] */
void *data; void *data;
u8 cmd_opcode[IPA_COMMAND_TRANS_TRE_MAX];
struct scatterlist *sgl; struct scatterlist *sgl;
struct ipa_cmd_info *info; /* array of entries, or null */
enum dma_data_direction direction; enum dma_data_direction direction;
refcount_t refcount; refcount_t refcount;
......
...@@ -349,7 +349,6 @@ int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_max) ...@@ -349,7 +349,6 @@ int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_max)
{ {
struct gsi_trans_info *trans_info = &channel->trans_info; struct gsi_trans_info *trans_info = &channel->trans_info;
struct device *dev = channel->gsi->dev; struct device *dev = channel->gsi->dev;
int ret;
/* This is as good a place as any to validate build constants */ /* This is as good a place as any to validate build constants */
ipa_cmd_validate_build(); ipa_cmd_validate_build();
...@@ -358,20 +357,9 @@ int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_max) ...@@ -358,20 +357,9 @@ int ipa_cmd_pool_init(struct gsi_channel *channel, u32 tre_max)
* a single transaction can require up to tlv_count of them, * a single transaction can require up to tlv_count of them,
* so we treat them as if that many can be allocated at once. * so we treat them as if that many can be allocated at once.
*/ */
ret = gsi_trans_pool_init_dma(dev, &trans_info->cmd_pool, return gsi_trans_pool_init_dma(dev, &trans_info->cmd_pool,
sizeof(union ipa_cmd_payload), sizeof(union ipa_cmd_payload),
tre_max, channel->tlv_count); tre_max, channel->tlv_count);
if (ret)
return ret;
/* Each TRE needs a command info structure */
ret = gsi_trans_pool_init(&trans_info->info_pool,
sizeof(struct ipa_cmd_info),
tre_max, channel->tlv_count);
if (ret)
gsi_trans_pool_exit_dma(dev, &trans_info->cmd_pool);
return ret;
} }
void ipa_cmd_pool_exit(struct gsi_channel *channel) void ipa_cmd_pool_exit(struct gsi_channel *channel)
...@@ -379,7 +367,6 @@ void ipa_cmd_pool_exit(struct gsi_channel *channel) ...@@ -379,7 +367,6 @@ void ipa_cmd_pool_exit(struct gsi_channel *channel)
struct gsi_trans_info *trans_info = &channel->trans_info; struct gsi_trans_info *trans_info = &channel->trans_info;
struct device *dev = channel->gsi->dev; struct device *dev = channel->gsi->dev;
gsi_trans_pool_exit(&trans_info->info_pool);
gsi_trans_pool_exit_dma(dev, &trans_info->cmd_pool); gsi_trans_pool_exit_dma(dev, &trans_info->cmd_pool);
} }
...@@ -652,28 +639,16 @@ void ipa_cmd_pipeline_clear_wait(struct ipa *ipa) ...@@ -652,28 +639,16 @@ void ipa_cmd_pipeline_clear_wait(struct ipa *ipa)
wait_for_completion(&ipa->completion); wait_for_completion(&ipa->completion);
} }
static struct ipa_cmd_info *
ipa_cmd_info_alloc(struct ipa_endpoint *endpoint, u32 tre_count)
{
struct gsi_channel *channel;
channel = &endpoint->ipa->gsi.channel[endpoint->channel_id];
return gsi_trans_pool_alloc(&channel->trans_info.info_pool, tre_count);
}
/* Allocate a transaction for the command TX endpoint */ /* Allocate a transaction for the command TX endpoint */
struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count) struct gsi_trans *ipa_cmd_trans_alloc(struct ipa *ipa, u32 tre_count)
{ {
struct ipa_endpoint *endpoint; struct ipa_endpoint *endpoint;
struct gsi_trans *trans;
if (WARN_ON(tre_count > IPA_COMMAND_TRANS_TRE_MAX))
return NULL;
endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX]; endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
trans = gsi_channel_trans_alloc(&ipa->gsi, endpoint->channel_id, return gsi_channel_trans_alloc(&ipa->gsi, endpoint->channel_id,
tre_count, DMA_NONE); tre_count, DMA_NONE);
if (trans)
trans->info = ipa_cmd_info_alloc(endpoint, tre_count);
return trans;
} }
...@@ -46,15 +46,6 @@ enum ipa_cmd_opcode { ...@@ -46,15 +46,6 @@ enum ipa_cmd_opcode {
IPA_CMD_IP_PACKET_TAG_STATUS = 0x14, IPA_CMD_IP_PACKET_TAG_STATUS = 0x14,
}; };
/**
* struct ipa_cmd_info - information needed for an IPA immediate command
*
* @opcode: The command opcode.
*/
struct ipa_cmd_info {
enum ipa_cmd_opcode opcode;
};
/** /**
* ipa_cmd_table_valid() - Validate a memory region holding a table * ipa_cmd_table_valid() - Validate a memory region holding a table
* @ipa: - IPA pointer * @ipa: - IPA pointer
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment