OSDN Git Service

net: ipa: don't assume 8 modem routing table entries
authorAlex Elder <elder@linaro.org>
Tue, 25 Oct 2022 19:51:42 +0000 (14:51 -0500)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 27 Oct 2022 11:38:13 +0000 (13:38 +0200)
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>
13 files changed:
drivers/net/ipa/data/ipa_data-v3.1.c
drivers/net/ipa/data/ipa_data-v3.5.1.c
drivers/net/ipa/data/ipa_data-v4.11.c
drivers/net/ipa/data/ipa_data-v4.2.c
drivers/net/ipa/data/ipa_data-v4.5.c
drivers/net/ipa/data/ipa_data-v4.9.c
drivers/net/ipa/ipa.h
drivers/net/ipa/ipa_data.h
drivers/net/ipa/ipa_main.c
drivers/net/ipa/ipa_mem.c
drivers/net/ipa/ipa_qmi.c
drivers/net/ipa/ipa_table.c
drivers/net/ipa/ipa_table.h

index e0d71f6..3380fb3 100644 (file)
@@ -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,
 };
index 383ef18..47591fa 100644 (file)
@@ -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,
 };
index a204e43..1b4b525 100644 (file)
@@ -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,
 };
index 04f574f..199ed0e 100644 (file)
@@ -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,
 };
index 684239e..19b549f 100644 (file)
@@ -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,
 };
index 2333e15..d30fc1f 100644 (file)
@@ -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,
 };
index aa39509..5c95acc 100644 (file)
@@ -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;
index e5a6ce7..412edbf 100644 (file)
@@ -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;
index 3461ad3..ce5eada 100644 (file)
@@ -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);
index a3d2317..cb95402 100644 (file)
@@ -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));
index 8295fd4..f70f0a1 100644 (file)
@@ -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);
index 23d3f08..c9ab6a3 100644 (file)
@@ -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;
        }
 
index 3136329..79583b1 100644 (file)
@@ -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_ */