Commit 8defab8b authored by Alex Elder's avatar Alex Elder Committed by Paolo Abeni

net: ipa: don't assume 8 modem routing table entries

Currently all platforms are assumed allot 8 routing table entries
for use by the modem.  Instead, add a new configuration data entry
that defines the number of modem routing table entries, and record
that in the IPA structure.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 0439e674
...@@ -525,13 +525,14 @@ static const struct ipa_power_data ipa_power_data = { ...@@ -525,13 +525,14 @@ static const struct ipa_power_data ipa_power_data = {
/* Configuration data for an SoC having IPA v3.1 */ /* Configuration data for an SoC having IPA v3.1 */
const struct ipa_data ipa_data_v3_1 = { const struct ipa_data ipa_data_v3_1 = {
.version = IPA_VERSION_3_1, .version = IPA_VERSION_3_1,
.backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY), .backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY),
.qsb_count = ARRAY_SIZE(ipa_qsb_data), .qsb_count = ARRAY_SIZE(ipa_qsb_data),
.qsb_data = ipa_qsb_data, .qsb_data = ipa_qsb_data,
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), .modem_route_count = 8,
.endpoint_data = ipa_gsi_endpoint_data, .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
.resource_data = &ipa_resource_data, .endpoint_data = ipa_gsi_endpoint_data,
.mem_data = &ipa_mem_data, .resource_data = &ipa_resource_data,
.power_data = &ipa_power_data, .mem_data = &ipa_mem_data,
.power_data = &ipa_power_data,
}; };
...@@ -406,17 +406,18 @@ static const struct ipa_power_data ipa_power_data = { ...@@ -406,17 +406,18 @@ static const struct ipa_power_data ipa_power_data = {
/* Configuration data for an SoC having IPA v3.5.1 */ /* Configuration data for an SoC having IPA v3.5.1 */
const struct ipa_data ipa_data_v3_5_1 = { const struct ipa_data ipa_data_v3_5_1 = {
.version = IPA_VERSION_3_5_1, .version = IPA_VERSION_3_5_1,
.backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) | .backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) |
BIT(BCR_TX_NOT_USING_BRESP) | BIT(BCR_TX_NOT_USING_BRESP) |
BIT(BCR_SUSPEND_L2_IRQ) | BIT(BCR_SUSPEND_L2_IRQ) |
BIT(BCR_HOLB_DROP_L2_IRQ) | BIT(BCR_HOLB_DROP_L2_IRQ) |
BIT(BCR_DUAL_TX), BIT(BCR_DUAL_TX),
.qsb_count = ARRAY_SIZE(ipa_qsb_data), .qsb_count = ARRAY_SIZE(ipa_qsb_data),
.qsb_data = ipa_qsb_data, .qsb_data = ipa_qsb_data,
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), .modem_route_count = 8,
.endpoint_data = ipa_gsi_endpoint_data, .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
.resource_data = &ipa_resource_data, .endpoint_data = ipa_gsi_endpoint_data,
.mem_data = &ipa_mem_data, .resource_data = &ipa_resource_data,
.power_data = &ipa_power_data, .mem_data = &ipa_mem_data,
.power_data = &ipa_power_data,
}; };
...@@ -394,12 +394,13 @@ static const struct ipa_power_data ipa_power_data = { ...@@ -394,12 +394,13 @@ static const struct ipa_power_data ipa_power_data = {
/* Configuration data for an SoC having IPA v4.11 */ /* Configuration data for an SoC having IPA v4.11 */
const struct ipa_data ipa_data_v4_11 = { const struct ipa_data ipa_data_v4_11 = {
.version = IPA_VERSION_4_11, .version = IPA_VERSION_4_11,
.qsb_count = ARRAY_SIZE(ipa_qsb_data), .qsb_count = ARRAY_SIZE(ipa_qsb_data),
.qsb_data = ipa_qsb_data, .qsb_data = ipa_qsb_data,
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), .modem_route_count = 8,
.endpoint_data = ipa_gsi_endpoint_data, .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
.resource_data = &ipa_resource_data, .endpoint_data = ipa_gsi_endpoint_data,
.mem_data = &ipa_mem_data, .resource_data = &ipa_resource_data,
.power_data = &ipa_power_data, .mem_data = &ipa_mem_data,
.power_data = &ipa_power_data,
}; };
...@@ -372,13 +372,14 @@ static const struct ipa_power_data ipa_power_data = { ...@@ -372,13 +372,14 @@ static const struct ipa_power_data ipa_power_data = {
/* Configuration data for an SoC having IPA v4.2 */ /* Configuration data for an SoC having IPA v4.2 */
const struct ipa_data ipa_data_v4_2 = { const struct ipa_data ipa_data_v4_2 = {
.version = IPA_VERSION_4_2, .version = IPA_VERSION_4_2,
/* backward_compat value is 0 */ /* backward_compat value is 0 */
.qsb_count = ARRAY_SIZE(ipa_qsb_data), .qsb_count = ARRAY_SIZE(ipa_qsb_data),
.qsb_data = ipa_qsb_data, .qsb_data = ipa_qsb_data,
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), .modem_route_count = 8,
.endpoint_data = ipa_gsi_endpoint_data, .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
.resource_data = &ipa_resource_data, .endpoint_data = ipa_gsi_endpoint_data,
.mem_data = &ipa_mem_data, .resource_data = &ipa_resource_data,
.power_data = &ipa_power_data, .mem_data = &ipa_mem_data,
.power_data = &ipa_power_data,
}; };
...@@ -450,12 +450,13 @@ static const struct ipa_power_data ipa_power_data = { ...@@ -450,12 +450,13 @@ static const struct ipa_power_data ipa_power_data = {
/* Configuration data for an SoC having IPA v4.5 */ /* Configuration data for an SoC having IPA v4.5 */
const struct ipa_data ipa_data_v4_5 = { const struct ipa_data ipa_data_v4_5 = {
.version = IPA_VERSION_4_5, .version = IPA_VERSION_4_5,
.qsb_count = ARRAY_SIZE(ipa_qsb_data), .qsb_count = ARRAY_SIZE(ipa_qsb_data),
.qsb_data = ipa_qsb_data, .qsb_data = ipa_qsb_data,
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), .modem_route_count = 8,
.endpoint_data = ipa_gsi_endpoint_data, .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
.resource_data = &ipa_resource_data, .endpoint_data = ipa_gsi_endpoint_data,
.mem_data = &ipa_mem_data, .resource_data = &ipa_resource_data,
.power_data = &ipa_power_data, .mem_data = &ipa_mem_data,
.power_data = &ipa_power_data,
}; };
...@@ -444,12 +444,13 @@ static const struct ipa_power_data ipa_power_data = { ...@@ -444,12 +444,13 @@ static const struct ipa_power_data ipa_power_data = {
/* Configuration data for an SoC having IPA v4.9. */ /* Configuration data for an SoC having IPA v4.9. */
const struct ipa_data ipa_data_v4_9 = { const struct ipa_data ipa_data_v4_9 = {
.version = IPA_VERSION_4_9, .version = IPA_VERSION_4_9,
.qsb_count = ARRAY_SIZE(ipa_qsb_data), .qsb_count = ARRAY_SIZE(ipa_qsb_data),
.qsb_data = ipa_qsb_data, .qsb_data = ipa_qsb_data,
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), .modem_route_count = 8,
.endpoint_data = ipa_gsi_endpoint_data, .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
.resource_data = &ipa_resource_data, .endpoint_data = ipa_gsi_endpoint_data,
.mem_data = &ipa_mem_data, .resource_data = &ipa_resource_data,
.power_data = &ipa_power_data, .mem_data = &ipa_mem_data,
.power_data = &ipa_power_data,
}; };
...@@ -40,6 +40,7 @@ struct ipa_interrupt; ...@@ -40,6 +40,7 @@ struct ipa_interrupt;
* @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 * @route_count: Total number of entries in a routing table
* @modem_route_count: Number of modem 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
...@@ -86,6 +87,7 @@ struct ipa { ...@@ -86,6 +87,7 @@ struct ipa {
dma_addr_t table_addr; dma_addr_t table_addr;
__le64 *table_virt; __le64 *table_virt;
u32 route_count; u32 route_count;
u32 modem_route_count;
struct ipa_interrupt *interrupt; struct ipa_interrupt *interrupt;
bool uc_powered; bool uc_powered;
......
...@@ -222,6 +222,7 @@ struct ipa_power_data { ...@@ -222,6 +222,7 @@ struct ipa_power_data {
* @backward_compat: BCR register value (prior to IPA v4.5 only) * @backward_compat: BCR register value (prior to IPA v4.5 only)
* @qsb_count: number of entries in the qsb_data array * @qsb_count: number of entries in the qsb_data array
* @qsb_data: Qualcomm System Bus configuration data * @qsb_data: Qualcomm System Bus configuration data
* @modem_route_count: number of modem entries in a routing table
* @endpoint_count: number of entries in the endpoint_data array * @endpoint_count: number of entries in the endpoint_data array
* @endpoint_data: IPA endpoint/GSI channel data * @endpoint_data: IPA endpoint/GSI channel data
* @resource_data: IPA resource configuration data * @resource_data: IPA resource configuration data
...@@ -233,6 +234,7 @@ struct ipa_data { ...@@ -233,6 +234,7 @@ struct ipa_data {
u32 backward_compat; u32 backward_compat;
u32 qsb_count; /* number of entries in qsb_data[] */ u32 qsb_count; /* number of entries in qsb_data[] */
const struct ipa_qsb_data *qsb_data; const struct ipa_qsb_data *qsb_data;
u32 modem_route_count;
u32 endpoint_count; /* number of entries in endpoint_data[] */ u32 endpoint_count; /* number of entries in endpoint_data[] */
const struct ipa_gsi_endpoint_data *endpoint_data; const struct ipa_gsi_endpoint_data *endpoint_data;
const struct ipa_resource_data *resource_data; const struct ipa_resource_data *resource_data;
......
...@@ -739,6 +739,11 @@ static int ipa_probe(struct platform_device *pdev) ...@@ -739,6 +739,11 @@ static int ipa_probe(struct platform_device *pdev)
return -EINVAL; return -EINVAL;
} }
if (!data->modem_route_count) {
dev_err(dev, "modem_route_count cannot be zero\n");
return -EINVAL;
}
/* If we need Trust Zone, make sure it's available */ /* If we need Trust Zone, make sure it's available */
modem_init = of_property_read_bool(dev->of_node, "modem-init"); modem_init = of_property_read_bool(dev->of_node, "modem-init");
if (!modem_init) if (!modem_init)
...@@ -763,6 +768,7 @@ static int ipa_probe(struct platform_device *pdev) ...@@ -763,6 +768,7 @@ static int ipa_probe(struct platform_device *pdev)
dev_set_drvdata(dev, ipa); dev_set_drvdata(dev, ipa);
ipa->power = power; ipa->power = power;
ipa->version = data->version; ipa->version = data->version;
ipa->modem_route_count = data->modem_route_count;
init_completion(&ipa->completion); init_completion(&ipa->completion);
ret = ipa_reg_init(ipa); ret = ipa_reg_init(ipa);
......
...@@ -618,9 +618,9 @@ int ipa_mem_init(struct ipa *ipa, const struct ipa_mem_data *mem_data) ...@@ -618,9 +618,9 @@ int ipa_mem_init(struct ipa *ipa, const struct ipa_mem_data *mem_data)
ipa->mem = mem_data->local; ipa->mem = mem_data->local;
/* Check the route and filter table memory regions */ /* Check the route and filter table memory regions */
if (!ipa_table_mem_valid(ipa, 0)) if (!ipa_table_mem_valid(ipa, false))
return -EINVAL; return -EINVAL;
if (!ipa_table_mem_valid(ipa, IPA_ROUTE_MODEM_COUNT)) if (!ipa_table_mem_valid(ipa, true))
return -EINVAL; return -EINVAL;
ret = dma_set_mask_and_coherent(&ipa->pdev->dev, DMA_BIT_MASK(64)); ret = dma_set_mask_and_coherent(&ipa->pdev->dev, DMA_BIT_MASK(64));
......
...@@ -284,6 +284,7 @@ static const struct ipa_init_modem_driver_req * ...@@ -284,6 +284,7 @@ static const struct ipa_init_modem_driver_req *
init_modem_driver_req(struct ipa_qmi *ipa_qmi) init_modem_driver_req(struct ipa_qmi *ipa_qmi)
{ {
struct ipa *ipa = container_of(ipa_qmi, struct ipa, qmi); struct ipa *ipa = container_of(ipa_qmi, struct ipa, qmi);
u32 modem_route_count = ipa->modem_route_count;
static struct ipa_init_modem_driver_req req; static struct ipa_init_modem_driver_req req;
const struct ipa_mem *mem; const struct ipa_mem *mem;
...@@ -308,12 +309,12 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi) ...@@ -308,12 +309,12 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi)
mem = ipa_mem_find(ipa, IPA_MEM_V4_ROUTE); mem = ipa_mem_find(ipa, IPA_MEM_V4_ROUTE);
req.v4_route_tbl_info_valid = 1; req.v4_route_tbl_info_valid = 1;
req.v4_route_tbl_info.start = ipa->mem_offset + mem->offset; req.v4_route_tbl_info.start = ipa->mem_offset + mem->offset;
req.v4_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; req.v4_route_tbl_info.end = modem_route_count - 1;
mem = ipa_mem_find(ipa, IPA_MEM_V6_ROUTE); mem = ipa_mem_find(ipa, IPA_MEM_V6_ROUTE);
req.v6_route_tbl_info_valid = 1; req.v6_route_tbl_info_valid = 1;
req.v6_route_tbl_info.start = ipa->mem_offset + mem->offset; req.v6_route_tbl_info.start = ipa->mem_offset + mem->offset;
req.v6_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; req.v6_route_tbl_info.end = modem_route_count - 1;
mem = ipa_mem_find(ipa, IPA_MEM_V4_FILTER); mem = ipa_mem_find(ipa, IPA_MEM_V4_FILTER);
req.v4_filter_tbl_start_valid = 1; req.v4_filter_tbl_start_valid = 1;
...@@ -352,7 +353,7 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi) ...@@ -352,7 +353,7 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi)
req.v4_hash_route_tbl_info_valid = 1; req.v4_hash_route_tbl_info_valid = 1;
req.v4_hash_route_tbl_info.start = req.v4_hash_route_tbl_info.start =
ipa->mem_offset + mem->offset; ipa->mem_offset + mem->offset;
req.v4_hash_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; req.v4_hash_route_tbl_info.end = modem_route_count - 1;
} }
mem = ipa_mem_find(ipa, IPA_MEM_V6_ROUTE_HASHED); mem = ipa_mem_find(ipa, IPA_MEM_V6_ROUTE_HASHED);
...@@ -360,7 +361,7 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi) ...@@ -360,7 +361,7 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi)
req.v6_hash_route_tbl_info_valid = 1; req.v6_hash_route_tbl_info_valid = 1;
req.v6_hash_route_tbl_info.start = req.v6_hash_route_tbl_info.start =
ipa->mem_offset + mem->offset; ipa->mem_offset + mem->offset;
req.v6_hash_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; req.v6_hash_route_tbl_info.end = modem_route_count - 1;
} }
mem = ipa_mem_find(ipa, IPA_MEM_V4_FILTER_HASHED); mem = ipa_mem_find(ipa, IPA_MEM_V4_FILTER_HASHED);
......
...@@ -129,9 +129,6 @@ static void ipa_table_validate_build(void) ...@@ -129,9 +129,6 @@ static void ipa_table_validate_build(void)
* assumes that it can be written using a pointer to __le64. * assumes that it can be written using a pointer to __le64.
*/ */
BUILD_BUG_ON(IPA_ZERO_RULE_SIZE != sizeof(__le64)); BUILD_BUG_ON(IPA_ZERO_RULE_SIZE != sizeof(__le64));
/* The modem must be allotted at least one route table entry */
BUILD_BUG_ON(!IPA_ROUTE_MODEM_COUNT);
} }
static const struct ipa_mem * static const struct ipa_mem *
...@@ -281,6 +278,7 @@ static int ipa_filter_reset(struct ipa *ipa, bool modem) ...@@ -281,6 +278,7 @@ static int ipa_filter_reset(struct ipa *ipa, bool modem)
* */ * */
static int ipa_route_reset(struct ipa *ipa, bool modem) static int ipa_route_reset(struct ipa *ipa, bool modem)
{ {
u32 modem_route_count = ipa->modem_route_count;
struct gsi_trans *trans; struct gsi_trans *trans;
u16 first; u16 first;
u16 count; u16 count;
...@@ -295,10 +293,10 @@ static int ipa_route_reset(struct ipa *ipa, bool modem) ...@@ -295,10 +293,10 @@ static int ipa_route_reset(struct ipa *ipa, bool modem)
if (modem) { if (modem) {
first = 0; first = 0;
count = IPA_ROUTE_MODEM_COUNT; count = modem_route_count;
} else { } else {
first = IPA_ROUTE_MODEM_COUNT; first = modem_route_count;
count = ipa->route_count - IPA_ROUTE_MODEM_COUNT; count = ipa->route_count - modem_route_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);
...@@ -511,9 +509,9 @@ static void ipa_filter_config(struct ipa *ipa, bool modem) ...@@ -511,9 +509,9 @@ static void ipa_filter_config(struct ipa *ipa, bool modem)
} }
} }
static bool ipa_route_id_modem(u32 route_id) static bool ipa_route_id_modem(struct ipa *ipa, u32 route_id)
{ {
return route_id < IPA_ROUTE_MODEM_COUNT; return route_id < ipa->modem_route_count;
} }
/** /**
...@@ -549,7 +547,7 @@ static void ipa_route_config(struct ipa *ipa, bool modem) ...@@ -549,7 +547,7 @@ static void ipa_route_config(struct ipa *ipa, bool modem)
return; return;
for (route_id = 0; route_id < ipa->route_count; 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(ipa, route_id) == modem)
ipa_route_tuple_zero(ipa, route_id); ipa_route_tuple_zero(ipa, route_id);
} }
...@@ -565,10 +563,9 @@ void ipa_table_config(struct ipa *ipa) ...@@ -565,10 +563,9 @@ void ipa_table_config(struct ipa *ipa)
/* Verify the sizes of all IPA table filter or routing table memory regions /* 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. * 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 filter)
{ {
bool hash_support = ipa_table_hash_support(ipa); bool hash_support = ipa_table_hash_support(ipa);
bool filter = !modem_route_count;
const struct ipa_mem *mem_hashed; const struct ipa_mem *mem_hashed;
const struct ipa_mem *mem_ipv4; const struct ipa_mem *mem_ipv4;
const struct ipa_mem *mem_ipv6; const struct ipa_mem *mem_ipv6;
...@@ -611,7 +608,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) ...@@ -611,7 +608,7 @@ bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count)
/* Routing tables must be able to hold all modem entries, /* Routing tables must be able to hold all modem entries,
* plus at least one entry for the AP. * plus at least one entry for the AP.
*/ */
if (count < modem_route_count + 1) if (count < ipa->modem_route_count + 1)
return false; return false;
} }
......
...@@ -13,9 +13,6 @@ struct ipa; ...@@ -13,9 +13,6 @@ struct ipa;
/* The maximum number of filter table entries (IPv4, IPv6; hashed or not) */ /* The maximum number of filter table entries (IPv4, IPv6; hashed or not) */
#define IPA_FILTER_COUNT_MAX 14 #define IPA_FILTER_COUNT_MAX 14
/* The number of route table entries allotted to the modem */
#define IPA_ROUTE_MODEM_COUNT 8
/** /**
* ipa_filter_map_valid() - Validate a filter table endpoint bitmap * ipa_filter_map_valid() - Validate a filter table endpoint bitmap
* @ipa: IPA pointer * @ipa: IPA pointer
...@@ -78,8 +75,8 @@ void ipa_table_exit(struct ipa *ipa); ...@@ -78,8 +75,8 @@ void ipa_table_exit(struct ipa *ipa);
/** /**
* ipa_table_mem_valid() - Validate sizes of table memory regions * ipa_table_mem_valid() - Validate sizes of table memory regions
* @ipa: IPA pointer * @ipa: IPA pointer
* @modem_route_count: Number of modem route table entries * @filter: Whether to check filter or routing tables
*/ */
bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count); bool ipa_table_mem_valid(struct ipa *ipa, bool filter);
#endif /* _IPA_TABLE_H_ */ #endif /* _IPA_TABLE_H_ */
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