Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alex Elder and committed by
Paolo Abeni
8defab8b 0439e674

+88 -77
+10 -9
drivers/net/ipa/data/ipa_data-v3.1.c
··· 525 525 526 526 /* Configuration data for an SoC having IPA v3.1 */ 527 527 const struct ipa_data ipa_data_v3_1 = { 528 - .version = IPA_VERSION_3_1, 529 - .backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY), 530 - .qsb_count = ARRAY_SIZE(ipa_qsb_data), 531 - .qsb_data = ipa_qsb_data, 532 - .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 533 - .endpoint_data = ipa_gsi_endpoint_data, 534 - .resource_data = &ipa_resource_data, 535 - .mem_data = &ipa_mem_data, 536 - .power_data = &ipa_power_data, 528 + .version = IPA_VERSION_3_1, 529 + .backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY), 530 + .qsb_count = ARRAY_SIZE(ipa_qsb_data), 531 + .qsb_data = ipa_qsb_data, 532 + .modem_route_count = 8, 533 + .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 534 + .endpoint_data = ipa_gsi_endpoint_data, 535 + .resource_data = &ipa_resource_data, 536 + .mem_data = &ipa_mem_data, 537 + .power_data = &ipa_power_data, 537 538 };
+14 -13
drivers/net/ipa/data/ipa_data-v3.5.1.c
··· 406 406 407 407 /* Configuration data for an SoC having IPA v3.5.1 */ 408 408 const struct ipa_data ipa_data_v3_5_1 = { 409 - .version = IPA_VERSION_3_5_1, 410 - .backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) | 411 - BIT(BCR_TX_NOT_USING_BRESP) | 412 - BIT(BCR_SUSPEND_L2_IRQ) | 413 - BIT(BCR_HOLB_DROP_L2_IRQ) | 414 - BIT(BCR_DUAL_TX), 415 - .qsb_count = ARRAY_SIZE(ipa_qsb_data), 416 - .qsb_data = ipa_qsb_data, 417 - .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 418 - .endpoint_data = ipa_gsi_endpoint_data, 419 - .resource_data = &ipa_resource_data, 420 - .mem_data = &ipa_mem_data, 421 - .power_data = &ipa_power_data, 409 + .version = IPA_VERSION_3_5_1, 410 + .backward_compat = BIT(BCR_CMDQ_L_LACK_ONE_ENTRY) | 411 + BIT(BCR_TX_NOT_USING_BRESP) | 412 + BIT(BCR_SUSPEND_L2_IRQ) | 413 + BIT(BCR_HOLB_DROP_L2_IRQ) | 414 + BIT(BCR_DUAL_TX), 415 + .qsb_count = ARRAY_SIZE(ipa_qsb_data), 416 + .qsb_data = ipa_qsb_data, 417 + .modem_route_count = 8, 418 + .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 419 + .endpoint_data = ipa_gsi_endpoint_data, 420 + .resource_data = &ipa_resource_data, 421 + .mem_data = &ipa_mem_data, 422 + .power_data = &ipa_power_data, 422 423 };
+9 -8
drivers/net/ipa/data/ipa_data-v4.11.c
··· 394 394 395 395 /* Configuration data for an SoC having IPA v4.11 */ 396 396 const struct ipa_data ipa_data_v4_11 = { 397 - .version = IPA_VERSION_4_11, 398 - .qsb_count = ARRAY_SIZE(ipa_qsb_data), 399 - .qsb_data = ipa_qsb_data, 400 - .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 401 - .endpoint_data = ipa_gsi_endpoint_data, 402 - .resource_data = &ipa_resource_data, 403 - .mem_data = &ipa_mem_data, 404 - .power_data = &ipa_power_data, 397 + .version = IPA_VERSION_4_11, 398 + .qsb_count = ARRAY_SIZE(ipa_qsb_data), 399 + .qsb_data = ipa_qsb_data, 400 + .modem_route_count = 8, 401 + .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 402 + .endpoint_data = ipa_gsi_endpoint_data, 403 + .resource_data = &ipa_resource_data, 404 + .mem_data = &ipa_mem_data, 405 + .power_data = &ipa_power_data, 405 406 };
+9 -8
drivers/net/ipa/data/ipa_data-v4.2.c
··· 372 372 373 373 /* Configuration data for an SoC having IPA v4.2 */ 374 374 const struct ipa_data ipa_data_v4_2 = { 375 - .version = IPA_VERSION_4_2, 375 + .version = IPA_VERSION_4_2, 376 376 /* backward_compat value is 0 */ 377 - .qsb_count = ARRAY_SIZE(ipa_qsb_data), 378 - .qsb_data = ipa_qsb_data, 379 - .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 380 - .endpoint_data = ipa_gsi_endpoint_data, 381 - .resource_data = &ipa_resource_data, 382 - .mem_data = &ipa_mem_data, 383 - .power_data = &ipa_power_data, 377 + .qsb_count = ARRAY_SIZE(ipa_qsb_data), 378 + .qsb_data = ipa_qsb_data, 379 + .modem_route_count = 8, 380 + .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 381 + .endpoint_data = ipa_gsi_endpoint_data, 382 + .resource_data = &ipa_resource_data, 383 + .mem_data = &ipa_mem_data, 384 + .power_data = &ipa_power_data, 384 385 };
+9 -8
drivers/net/ipa/data/ipa_data-v4.5.c
··· 450 450 451 451 /* Configuration data for an SoC having IPA v4.5 */ 452 452 const struct ipa_data ipa_data_v4_5 = { 453 - .version = IPA_VERSION_4_5, 454 - .qsb_count = ARRAY_SIZE(ipa_qsb_data), 455 - .qsb_data = ipa_qsb_data, 456 - .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 457 - .endpoint_data = ipa_gsi_endpoint_data, 458 - .resource_data = &ipa_resource_data, 459 - .mem_data = &ipa_mem_data, 460 - .power_data = &ipa_power_data, 453 + .version = IPA_VERSION_4_5, 454 + .qsb_count = ARRAY_SIZE(ipa_qsb_data), 455 + .qsb_data = ipa_qsb_data, 456 + .modem_route_count = 8, 457 + .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 458 + .endpoint_data = ipa_gsi_endpoint_data, 459 + .resource_data = &ipa_resource_data, 460 + .mem_data = &ipa_mem_data, 461 + .power_data = &ipa_power_data, 461 462 };
+9 -8
drivers/net/ipa/data/ipa_data-v4.9.c
··· 444 444 445 445 /* Configuration data for an SoC having IPA v4.9. */ 446 446 const struct ipa_data ipa_data_v4_9 = { 447 - .version = IPA_VERSION_4_9, 448 - .qsb_count = ARRAY_SIZE(ipa_qsb_data), 449 - .qsb_data = ipa_qsb_data, 450 - .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 451 - .endpoint_data = ipa_gsi_endpoint_data, 452 - .resource_data = &ipa_resource_data, 453 - .mem_data = &ipa_mem_data, 454 - .power_data = &ipa_power_data, 447 + .version = IPA_VERSION_4_9, 448 + .qsb_count = ARRAY_SIZE(ipa_qsb_data), 449 + .qsb_data = ipa_qsb_data, 450 + .modem_route_count = 8, 451 + .endpoint_count = ARRAY_SIZE(ipa_gsi_endpoint_data), 452 + .endpoint_data = ipa_gsi_endpoint_data, 453 + .resource_data = &ipa_resource_data, 454 + .mem_data = &ipa_mem_data, 455 + .power_data = &ipa_power_data, 455 456 };
+2
drivers/net/ipa/ipa.h
··· 40 40 * @table_addr: DMA address of filter/route table content 41 41 * @table_virt: Virtual address of filter/route table content 42 42 * @route_count: Total number of entries in a routing table 43 + * @modem_route_count: Number of modem entries in a routing table 43 44 * @interrupt: IPA Interrupt information 44 45 * @uc_powered: true if power is active by proxy for microcontroller 45 46 * @uc_loaded: true after microcontroller has reported it's ready ··· 87 86 dma_addr_t table_addr; 88 87 __le64 *table_virt; 89 88 u32 route_count; 89 + u32 modem_route_count; 90 90 91 91 struct ipa_interrupt *interrupt; 92 92 bool uc_powered;
+2
drivers/net/ipa/ipa_data.h
··· 222 222 * @backward_compat: BCR register value (prior to IPA v4.5 only) 223 223 * @qsb_count: number of entries in the qsb_data array 224 224 * @qsb_data: Qualcomm System Bus configuration data 225 + * @modem_route_count: number of modem entries in a routing table 225 226 * @endpoint_count: number of entries in the endpoint_data array 226 227 * @endpoint_data: IPA endpoint/GSI channel data 227 228 * @resource_data: IPA resource configuration data ··· 234 233 u32 backward_compat; 235 234 u32 qsb_count; /* number of entries in qsb_data[] */ 236 235 const struct ipa_qsb_data *qsb_data; 236 + u32 modem_route_count; 237 237 u32 endpoint_count; /* number of entries in endpoint_data[] */ 238 238 const struct ipa_gsi_endpoint_data *endpoint_data; 239 239 const struct ipa_resource_data *resource_data;
+6
drivers/net/ipa/ipa_main.c
··· 739 739 return -EINVAL; 740 740 } 741 741 742 + if (!data->modem_route_count) { 743 + dev_err(dev, "modem_route_count cannot be zero\n"); 744 + return -EINVAL; 745 + } 746 + 742 747 /* If we need Trust Zone, make sure it's available */ 743 748 modem_init = of_property_read_bool(dev->of_node, "modem-init"); 744 749 if (!modem_init) ··· 768 763 dev_set_drvdata(dev, ipa); 769 764 ipa->power = power; 770 765 ipa->version = data->version; 766 + ipa->modem_route_count = data->modem_route_count; 771 767 init_completion(&ipa->completion); 772 768 773 769 ret = ipa_reg_init(ipa);
+2 -2
drivers/net/ipa/ipa_mem.c
··· 618 618 ipa->mem = mem_data->local; 619 619 620 620 /* Check the route and filter table memory regions */ 621 - if (!ipa_table_mem_valid(ipa, 0)) 621 + if (!ipa_table_mem_valid(ipa, false)) 622 622 return -EINVAL; 623 - if (!ipa_table_mem_valid(ipa, IPA_ROUTE_MODEM_COUNT)) 623 + if (!ipa_table_mem_valid(ipa, true)) 624 624 return -EINVAL; 625 625 626 626 ret = dma_set_mask_and_coherent(&ipa->pdev->dev, DMA_BIT_MASK(64));
+5 -4
drivers/net/ipa/ipa_qmi.c
··· 284 284 init_modem_driver_req(struct ipa_qmi *ipa_qmi) 285 285 { 286 286 struct ipa *ipa = container_of(ipa_qmi, struct ipa, qmi); 287 + u32 modem_route_count = ipa->modem_route_count; 287 288 static struct ipa_init_modem_driver_req req; 288 289 const struct ipa_mem *mem; 289 290 ··· 309 308 mem = ipa_mem_find(ipa, IPA_MEM_V4_ROUTE); 310 309 req.v4_route_tbl_info_valid = 1; 311 310 req.v4_route_tbl_info.start = ipa->mem_offset + mem->offset; 312 - req.v4_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; 311 + req.v4_route_tbl_info.end = modem_route_count - 1; 313 312 314 313 mem = ipa_mem_find(ipa, IPA_MEM_V6_ROUTE); 315 314 req.v6_route_tbl_info_valid = 1; 316 315 req.v6_route_tbl_info.start = ipa->mem_offset + mem->offset; 317 - req.v6_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; 316 + req.v6_route_tbl_info.end = modem_route_count - 1; 318 317 319 318 mem = ipa_mem_find(ipa, IPA_MEM_V4_FILTER); 320 319 req.v4_filter_tbl_start_valid = 1; ··· 353 352 req.v4_hash_route_tbl_info_valid = 1; 354 353 req.v4_hash_route_tbl_info.start = 355 354 ipa->mem_offset + mem->offset; 356 - req.v4_hash_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; 355 + req.v4_hash_route_tbl_info.end = modem_route_count - 1; 357 356 } 358 357 359 358 mem = ipa_mem_find(ipa, IPA_MEM_V6_ROUTE_HASHED); ··· 361 360 req.v6_hash_route_tbl_info_valid = 1; 362 361 req.v6_hash_route_tbl_info.start = 363 362 ipa->mem_offset + mem->offset; 364 - req.v6_hash_route_tbl_info.end = IPA_ROUTE_MODEM_COUNT - 1; 363 + req.v6_hash_route_tbl_info.end = modem_route_count - 1; 365 364 } 366 365 367 366 mem = ipa_mem_find(ipa, IPA_MEM_V4_FILTER_HASHED);
+9 -12
drivers/net/ipa/ipa_table.c
··· 129 129 * assumes that it can be written using a pointer to __le64. 130 130 */ 131 131 BUILD_BUG_ON(IPA_ZERO_RULE_SIZE != sizeof(__le64)); 132 - 133 - /* The modem must be allotted at least one route table entry */ 134 - BUILD_BUG_ON(!IPA_ROUTE_MODEM_COUNT); 135 132 } 136 133 137 134 static const struct ipa_mem * ··· 278 281 * */ 279 282 static int ipa_route_reset(struct ipa *ipa, bool modem) 280 283 { 284 + u32 modem_route_count = ipa->modem_route_count; 281 285 struct gsi_trans *trans; 282 286 u16 first; 283 287 u16 count; ··· 293 295 294 296 if (modem) { 295 297 first = 0; 296 - count = IPA_ROUTE_MODEM_COUNT; 298 + count = modem_route_count; 297 299 } else { 298 - first = IPA_ROUTE_MODEM_COUNT; 299 - count = ipa->route_count - IPA_ROUTE_MODEM_COUNT; 300 + first = modem_route_count; 301 + count = ipa->route_count - modem_route_count; 300 302 } 301 303 302 304 ipa_table_reset_add(trans, false, first, count, IPA_MEM_V4_ROUTE); ··· 509 511 } 510 512 } 511 513 512 - static bool ipa_route_id_modem(u32 route_id) 514 + static bool ipa_route_id_modem(struct ipa *ipa, u32 route_id) 513 515 { 514 - return route_id < IPA_ROUTE_MODEM_COUNT; 516 + return route_id < ipa->modem_route_count; 515 517 } 516 518 517 519 /** ··· 547 549 return; 548 550 549 551 for (route_id = 0; route_id < ipa->route_count; route_id++) 550 - if (ipa_route_id_modem(route_id) == modem) 552 + if (ipa_route_id_modem(ipa, route_id) == modem) 551 553 ipa_route_tuple_zero(ipa, route_id); 552 554 } 553 555 ··· 563 565 /* Verify the sizes of all IPA table filter or routing table memory regions 564 566 * are valid. If valid, this records the size of the routing table. 565 567 */ 566 - bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count) 568 + bool ipa_table_mem_valid(struct ipa *ipa, bool filter) 567 569 { 568 570 bool hash_support = ipa_table_hash_support(ipa); 569 - bool filter = !modem_route_count; 570 571 const struct ipa_mem *mem_hashed; 571 572 const struct ipa_mem *mem_ipv4; 572 573 const struct ipa_mem *mem_ipv6; ··· 608 611 /* Routing tables must be able to hold all modem entries, 609 612 * plus at least one entry for the AP. 610 613 */ 611 - if (count < modem_route_count + 1) 614 + if (count < ipa->modem_route_count + 1) 612 615 return false; 613 616 } 614 617
+2 -5
drivers/net/ipa/ipa_table.h
··· 13 13 /* The maximum number of filter table entries (IPv4, IPv6; hashed or not) */ 14 14 #define IPA_FILTER_COUNT_MAX 14 15 15 16 - /* The number of route table entries allotted to the modem */ 17 - #define IPA_ROUTE_MODEM_COUNT 8 18 - 19 16 /** 20 17 * ipa_filter_map_valid() - Validate a filter table endpoint bitmap 21 18 * @ipa: IPA pointer ··· 75 78 /** 76 79 * ipa_table_mem_valid() - Validate sizes of table memory regions 77 80 * @ipa: IPA pointer 78 - * @modem_route_count: Number of modem route table entries 81 + * @filter: Whether to check filter or routing tables 79 82 */ 80 - bool ipa_table_mem_valid(struct ipa *ipa, bool modem_route_count); 83 + bool ipa_table_mem_valid(struct ipa *ipa, bool filter); 81 84 82 85 #endif /* _IPA_TABLE_H_ */