]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
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 e0d71f609272991cbfb6429834bdf4ea85f2db82..3380fb3483b2ca8c2ea1f30d4db37e7ac0257195 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 383ef18900654505bf83b361006fd97ef36dfc29..47591faf8bd625bf23c5c854a543e6aaef9722b2 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 a204e439c23d3a7bd7dd9576613296f28f367c52..1b4b52501ee33acfbfc0232c4a43121deaf5c088 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 04f574fe006f02751643f2c54d95ac47bbe7fbce..199ed0ed868b979760a8c40ed2e862a71c0f053a 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 684239e71f46a932dfd1e4e78a71e8dc5f00acf3..19b549f2998b85bab0abd6fae6714efe324656d2 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 2333e15f9533831a32d5b496816604c4bb0ffbb1..d30fc1fe6ca22385d305ca254b53b8e9ae68c1b9 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 aa39509e209a333396171869a9e819b602ecc2ec..5c95acc70bb33ab7c1a9244452f75f09b8d564ef 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 e5a6ce75c7ddd50c1eaf7bcbe57b002fe9630278..412edbfac78623d4fc32daa3d67b3ff5d2665313 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 3461ad3029ab825c3b6e58002a6885a10436642e..ce5eadad671f34c84828fcf27f968187e5a4619b 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 a3d2317452ac6d1954e4cfc8f03158bd838b342d..cb9540201839471967754cbbdc656cdd64273327 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 8295fd4b70d16ce79fd2b5149dadc8ef2f96b09c..f70f0a1d1cdacc942385efb1279ed73f40440571 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 23d3f081ac8e1b765db11309bcad65827774d05b..c9ab6a3fabbc3a8abd8d9edfba25d1df98cd71c0 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 31363292dc1dbb939c715eeff77e0b2441368a45..79583b16f363f47df5875496bb0866bb2a9250ac 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_ */