Commit fc094058 authored by Alex Elder's avatar Alex Elder Committed by Paolo Abeni

net: ipa: record the route table size in the IPA structure

The non-hashed routing tables for IPv4 and IPv6 will be the same
size.  And if supported, the hashed routing tables will be the same
size as the non-hashed tables.

Record the size (number of entries) of all routing tables in the IPA
structure.  For now, initialize this field using IPA_ROUTE_TABLE_MAX,
and just do so when the first route table is validated.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent d5e2d038
...@@ -39,6 +39,7 @@ struct ipa_interrupt; ...@@ -39,6 +39,7 @@ struct ipa_interrupt;
* @power: IPA power information * @power: IPA power information
* @table_addr: DMA address of filter/route table content * @table_addr: DMA address of filter/route table content
* @table_virt: Virtual address of filter/route table content * @table_virt: Virtual address of filter/route table content
* @route_count: Total number of entries in a routing table
* @interrupt: IPA Interrupt information * @interrupt: IPA Interrupt information
* @uc_powered: true if power is active by proxy for microcontroller * @uc_powered: true if power is active by proxy for microcontroller
* @uc_loaded: true after microcontroller has reported it's ready * @uc_loaded: true after microcontroller has reported it's ready
...@@ -84,6 +85,7 @@ struct ipa { ...@@ -84,6 +85,7 @@ struct ipa {
dma_addr_t table_addr; dma_addr_t table_addr;
__le64 *table_virt; __le64 *table_virt;
u32 route_count;
struct ipa_interrupt *interrupt; struct ipa_interrupt *interrupt;
bool uc_powered; bool uc_powered;
......
...@@ -185,7 +185,7 @@ static dma_addr_t ipa_table_addr(struct ipa *ipa, bool filter_mask, u16 count) ...@@ -185,7 +185,7 @@ static dma_addr_t ipa_table_addr(struct ipa *ipa, bool filter_mask, u16 count)
if (!count) if (!count)
return 0; return 0;
WARN_ON(count > max_t(u32, IPA_FILTER_COUNT_MAX, IPA_ROUTE_COUNT_MAX)); WARN_ON(count > max_t(u32, IPA_FILTER_COUNT_MAX, ipa->route_count));
/* Skip over the zero rule and possibly the filter mask */ /* Skip over the zero rule and possibly the filter mask */
skip = filter_mask ? 1 : 2; skip = filter_mask ? 1 : 2;
...@@ -302,7 +302,7 @@ static int ipa_route_reset(struct ipa *ipa, bool modem) ...@@ -302,7 +302,7 @@ static int ipa_route_reset(struct ipa *ipa, bool modem)
count = IPA_ROUTE_MODEM_COUNT; count = IPA_ROUTE_MODEM_COUNT;
} else { } else {
first = IPA_ROUTE_MODEM_COUNT; first = IPA_ROUTE_MODEM_COUNT;
count = IPA_ROUTE_COUNT_MAX - IPA_ROUTE_MODEM_COUNT; count = ipa->route_count - IPA_ROUTE_MODEM_COUNT;
} }
ipa_table_reset_add(trans, false, first, count, IPA_MEM_V4_ROUTE); ipa_table_reset_add(trans, false, first, count, IPA_MEM_V4_ROUTE);
...@@ -552,7 +552,7 @@ static void ipa_route_config(struct ipa *ipa, bool modem) ...@@ -552,7 +552,7 @@ static void ipa_route_config(struct ipa *ipa, bool modem)
if (!ipa_table_hash_support(ipa)) if (!ipa_table_hash_support(ipa))
return; return;
for (route_id = 0; route_id < IPA_ROUTE_COUNT_MAX; route_id++) for (route_id = 0; route_id < ipa->route_count; route_id++)
if (ipa_route_id_modem(route_id) == modem) if (ipa_route_id_modem(route_id) == modem)
ipa_route_tuple_zero(ipa, route_id); ipa_route_tuple_zero(ipa, route_id);
} }
...@@ -566,7 +566,9 @@ void ipa_table_config(struct ipa *ipa) ...@@ -566,7 +566,9 @@ void ipa_table_config(struct ipa *ipa)
ipa_route_config(ipa, true); ipa_route_config(ipa, true);
} }
/* Zero modem_route_count means filter table memory check */ /* Verify the sizes of all IPA table filter or routing table memory regions
* are valid. If valid, this records the size of the routing table.
*/
bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count)
{ {
bool hash_support = ipa_table_hash_support(ipa); bool hash_support = ipa_table_hash_support(ipa);
...@@ -591,6 +593,10 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) ...@@ -591,6 +593,10 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count)
if (mem_ipv4->size != mem_ipv6->size) if (mem_ipv4->size != mem_ipv6->size)
return false; return false;
/* Record the number of routing table entries */
if (!filter)
ipa->route_count = IPA_ROUTE_COUNT_MAX;
/* Table offset and size must fit in TABLE_INIT command fields */ /* Table offset and size must fit in TABLE_INIT command fields */
if (!ipa_cmd_table_init_valid(ipa, mem_ipv4, !filter)) if (!ipa_cmd_table_init_valid(ipa, mem_ipv4, !filter))
return false; return false;
...@@ -671,7 +677,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) ...@@ -671,7 +677,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count)
* | ---- zero rule address | \ * | ---- zero rule address | \
* |\ |-------------------| | * |\ |-------------------| |
* | ---- zero rule address | | IPA_FILTER_COUNT_MAX * | ---- zero rule address | | IPA_FILTER_COUNT_MAX
* | |-------------------| > or IPA_ROUTE_COUNT_MAX, * | |-------------------| > or IPA route count,
* | ... | whichever is greater * | ... | whichever is greater
* \ |-------------------| | * \ |-------------------| |
* ---- zero rule address | / * ---- zero rule address | /
...@@ -679,15 +685,17 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) ...@@ -679,15 +685,17 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count)
*/ */
int ipa_table_init(struct ipa *ipa) int ipa_table_init(struct ipa *ipa)
{ {
u32 count = max_t(u32, IPA_FILTER_COUNT_MAX, IPA_ROUTE_COUNT_MAX);
struct device *dev = &ipa->pdev->dev; struct device *dev = &ipa->pdev->dev;
dma_addr_t addr; dma_addr_t addr;
__le64 le_addr; __le64 le_addr;
__le64 *virt; __le64 *virt;
size_t size; size_t size;
u32 count;
ipa_table_validate_build(); ipa_table_validate_build();
count = max_t(u32, IPA_FILTER_COUNT_MAX, ipa->route_count);
/* The IPA hardware requires route and filter table rules to be /* The IPA hardware requires route and filter table rules to be
* aligned on a 128-byte boundary. We put the "zero rule" at the * aligned on a 128-byte boundary. We put the "zero rule" at the
* base of the table area allocated here. The DMA address returned * base of the table area allocated here. The DMA address returned
...@@ -722,7 +730,7 @@ int ipa_table_init(struct ipa *ipa) ...@@ -722,7 +730,7 @@ int ipa_table_init(struct ipa *ipa)
void ipa_table_exit(struct ipa *ipa) void ipa_table_exit(struct ipa *ipa)
{ {
u32 count = max_t(u32, 1 + IPA_FILTER_COUNT_MAX, IPA_ROUTE_COUNT_MAX); u32 count = max_t(u32, 1 + IPA_FILTER_COUNT_MAX, ipa->route_count);
struct device *dev = &ipa->pdev->dev; struct device *dev = &ipa->pdev->dev;
size_t size; size_t size;
......
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