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: Alex Elder <elder@linaro.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
0439e6743c
commit
8defab8bdf
|
@ -525,13 +525,14 @@ static const struct ipa_power_data ipa_power_data = {
|
|||
|
||||
/* Configuration data for an SoC having IPA v3.1 */
|
||||
const struct ipa_data ipa_data_v3_1 = {
|
||||
.version = IPA_VERSION_3_1,
|
||||
.backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY),
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
.version = IPA_VERSION_3_1,
|
||||
.backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY),
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.modem_route_count = 8,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.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 */
|
||||
const struct ipa_data ipa_data_v3_5_1 = {
|
||||
.version = IPA_VERSION_3_5_1,
|
||||
.backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) |
|
||||
BIT(BCR_TX_NOT_USING_BRESP) |
|
||||
BIT(BCR_SUSPEND_L2_IRQ) |
|
||||
BIT(BCR_HOLB_DROP_L2_IRQ) |
|
||||
BIT(BCR_DUAL_TX),
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
.version = IPA_VERSION_3_5_1,
|
||||
.backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) |
|
||||
BIT(BCR_TX_NOT_USING_BRESP) |
|
||||
BIT(BCR_SUSPEND_L2_IRQ) |
|
||||
BIT(BCR_HOLB_DROP_L2_IRQ) |
|
||||
BIT(BCR_DUAL_TX),
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.modem_route_count = 8,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.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 */
|
||||
const struct ipa_data ipa_data_v4_11 = {
|
||||
.version = IPA_VERSION_4_11,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
.version = IPA_VERSION_4_11,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.modem_route_count = 8,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.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 */
|
||||
const struct ipa_data ipa_data_v4_2 = {
|
||||
.version = IPA_VERSION_4_2,
|
||||
.version = IPA_VERSION_4_2,
|
||||
/* backward_compat value is 0 */
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.modem_route_count = 8,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.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 */
|
||||
const struct ipa_data ipa_data_v4_5 = {
|
||||
.version = IPA_VERSION_4_5,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
.version = IPA_VERSION_4_5,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.modem_route_count = 8,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.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. */
|
||||
const struct ipa_data ipa_data_v4_9 = {
|
||||
.version = IPA_VERSION_4_9,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
.version = IPA_VERSION_4_9,
|
||||
.qsb_count = ARRAY_SIZE(ipa_qsb_data),
|
||||
.qsb_data = ipa_qsb_data,
|
||||
.modem_route_count = 8,
|
||||
.endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data),
|
||||
.endpoint_data = ipa_gsi_endpoint_data,
|
||||
.resource_data = &ipa_resource_data,
|
||||
.mem_data = &ipa_mem_data,
|
||||
.power_data = &ipa_power_data,
|
||||
};
|
||||
|
|
|
@ -40,6 +40,7 @@ struct ipa_interrupt;
|
|||
* @table_addr: DMA 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
|
||||
* @modem_route_count: Number of modem entries in a routing table
|
||||
* @interrupt: IPA Interrupt information
|
||||
* @uc_powered: true if power is active by proxy for microcontroller
|
||||
* @uc_loaded: true after microcontroller has reported it's ready
|
||||
|
@ -86,6 +87,7 @@ struct ipa {
|
|||
dma_addr_t table_addr;
|
||||
__le64 *table_virt;
|
||||
u32 route_count;
|
||||
u32 modem_route_count;
|
||||
|
||||
struct ipa_interrupt *interrupt;
|
||||
bool uc_powered;
|
||||
|
|
|
@ -222,6 +222,7 @@ struct ipa_power_data {
|
|||
* @backward_compat: BCR register value (prior to IPA v4.5 only)
|
||||
* @qsb_count: number of entries in the qsb_data array
|
||||
* @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_data: IPA endpoint/GSI channel data
|
||||
* @resource_data: IPA resource configuration data
|
||||
|
@ -233,6 +234,7 @@ struct ipa_data {
|
|||
u32 backward_compat;
|
||||
u32 qsb_count; /* number of entries in qsb_data[] */
|
||||
const struct ipa_qsb_data *qsb_data;
|
||||
u32 modem_route_count;
|
||||
u32 endpoint_count; /* number of entries in endpoint_data[] */
|
||||
const struct ipa_gsi_endpoint_data *endpoint_data;
|
||||
const struct ipa_resource_data *resource_data;
|
||||
|
|
|
@ -739,6 +739,11 @@ static int ipa_probe(struct platform_device *pdev)
|
|||
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 */
|
||||
modem_init = of_property_read_bool(dev->of_node, "modem-init");
|
||||
if (!modem_init)
|
||||
|
@ -763,6 +768,7 @@ static int ipa_probe(struct platform_device *pdev)
|
|||
dev_set_drvdata(dev, ipa);
|
||||
ipa->power = power;
|
||||
ipa->version = data->version;
|
||||
ipa->modem_route_count = data->modem_route_count;
|
||||
init_completion(&ipa->completion);
|
||||
|
||||
ret = ipa_reg_init(ipa);
|
||||
|
|
|
@ -618,9 +618,9 @@ int ipa_mem_init(struct ipa *ipa, const struct ipa_mem_data *mem_data)
|
|||
ipa->mem = mem_data->local;
|
||||
|
||||
/* Check the route and filter table memory regions */
|
||||
if (!ipa_table_mem_valid(ipa, 0))
|
||||
if (!ipa_table_mem_valid(ipa, false))
|
||||
return -EINVAL;
|
||||
if (!ipa_table_mem_valid(ipa, IPA_ROUTE_MODEM_COUNT))
|
||||
if (!ipa_table_mem_valid(ipa, true))
|
||||
return -EINVAL;
|
||||
|
||||
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 *
|
|||
init_modem_driver_req(struct ipa_qmi *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;
|
||||
const struct ipa_mem *mem;
|
||||
|
||||
|
@ -308,12 +309,12 @@ init_modem_driver_req(struct ipa_qmi *ipa_qmi)
|
|||
mem = ipa_mem_find(ipa, IPA_MEM_V4_ROUTE);
|
||||
req.v4_route_tbl_info_valid = 1;
|
||||
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);
|
||||
req.v6_route_tbl_info_valid = 1;
|
||||
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);
|
||||
req.v4_filter_tbl_start_valid = 1;
|
||||
|
@ -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.start =
|
||||
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);
|
||||
|
@ -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.start =
|
||||
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);
|
||||
|
|
|
@ -129,9 +129,6 @@ static void ipa_table_validate_build(void)
|
|||
* assumes that it can be written using a pointer to __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 *
|
||||
|
@ -281,6 +278,7 @@ static int ipa_filter_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;
|
||||
u16 first;
|
||||
u16 count;
|
||||
|
@ -295,10 +293,10 @@ static int ipa_route_reset(struct ipa *ipa, bool modem)
|
|||
|
||||
if (modem) {
|
||||
first = 0;
|
||||
count = IPA_ROUTE_MODEM_COUNT;
|
||||
count = modem_route_count;
|
||||
} else {
|
||||
first = IPA_ROUTE_MODEM_COUNT;
|
||||
count = ipa->route_count - IPA_ROUTE_MODEM_COUNT;
|
||||
first = modem_route_count;
|
||||
count = ipa->route_count - modem_route_count;
|
||||
}
|
||||
|
||||
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)
|
|||
}
|
||||
}
|
||||
|
||||
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)
|
|||
return;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -565,10 +563,9 @@ void ipa_table_config(struct ipa *ipa)
|
|||
/* 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 filter)
|
||||
{
|
||||
bool hash_support = ipa_table_hash_support(ipa);
|
||||
bool filter = !modem_route_count;
|
||||
const struct ipa_mem *mem_hashed;
|
||||
const struct ipa_mem *mem_ipv4;
|
||||
const struct ipa_mem *mem_ipv6;
|
||||
|
@ -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,
|
||||
* plus at least one entry for the AP.
|
||||
*/
|
||||
if (count < modem_route_count + 1)
|
||||
if (count < ipa->modem_route_count + 1)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,9 +13,6 @@ struct ipa;
|
|||
/* The maximum number of filter table entries (IPv4, IPv6; hashed or not) */
|
||||
#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: IPA pointer
|
||||
|
@ -78,8 +75,8 @@ void ipa_table_exit(struct ipa *ipa);
|
|||
/**
|
||||
* ipa_table_mem_valid() - Validate sizes of table memory regions
|
||||
* @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_ */
|
||||
|
|
Loading…
Reference in New Issue