103-45-net-ethernet-qualcomm-Add-sysctl-for-RPS-bitmap.patch 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. From a36607b554841358733167483d194ae7d3969444 Mon Sep 17 00:00:00 2001
  2. From: Pavithra R <[email protected]>
  3. Date: Tue, 11 Jun 2024 01:43:22 +0530
  4. Subject: [PATCH 45/50] net: ethernet: qualcomm: Add sysctl for RPS bitmap
  5. Add sysctl to configure RPS bitmap for EDMA receive.
  6. This bitmap is used to configure the set of ARM cores
  7. used to receive packets from EDMA.
  8. Change-Id: Ie0e7d5971db93ea1494608a9e79c4abb13ce69b6
  9. Signed-off-by: Pavithra R <[email protected]>
  10. ---
  11. drivers/net/ethernet/qualcomm/ppe/edma.c | 23 ++++++++++++++++
  12. drivers/net/ethernet/qualcomm/ppe/edma.h | 2 ++
  13. .../net/ethernet/qualcomm/ppe/edma_cfg_rx.c | 27 +++++++++++++++++++
  14. .../net/ethernet/qualcomm/ppe/edma_cfg_rx.h | 4 +++
  15. 4 files changed, 56 insertions(+)
  16. --- a/drivers/net/ethernet/qualcomm/ppe/edma.c
  17. +++ b/drivers/net/ethernet/qualcomm/ppe/edma.c
  18. @@ -797,6 +797,11 @@ void edma_destroy(struct ppe_device *ppe
  19. struct edma_ring_info *rx = hw_info->rx;
  20. u32 i;
  21. + if (edma_ctx->rx_rps_ctl_table_hdr) {
  22. + unregister_sysctl_table(edma_ctx->rx_rps_ctl_table_hdr);
  23. + edma_ctx->rx_rps_ctl_table_hdr = NULL;
  24. + }
  25. +
  26. /* Disable interrupts. */
  27. for (i = 1; i <= hw_info->max_ports; i++)
  28. edma_cfg_tx_disable_interrupts(i);
  29. @@ -840,6 +845,17 @@ void edma_destroy(struct ppe_device *ppe
  30. kfree(edma_ctx->netdev_arr);
  31. }
  32. +/* EDMA Rx RPS core sysctl table */
  33. +static struct ctl_table edma_rx_rps_core_table[] = {
  34. + {
  35. + .procname = "rps_bitmap_cores",
  36. + .data = &edma_cfg_rx_rps_bitmap_cores,
  37. + .maxlen = sizeof(int),
  38. + .mode = 0644,
  39. + .proc_handler = edma_cfg_rx_rps_bitmap
  40. + },
  41. +};
  42. +
  43. /**
  44. * edma_setup - EDMA Setup.
  45. * @ppe_dev: PPE device
  46. @@ -865,6 +881,13 @@ int edma_setup(struct ppe_device *ppe_de
  47. if (tx_requeue_stop != 0)
  48. edma_ctx->tx_requeue_stop = true;
  49. + edma_ctx->rx_rps_ctl_table_hdr = register_sysctl("net/edma",
  50. + edma_rx_rps_core_table);
  51. + if (!edma_ctx->rx_rps_ctl_table_hdr) {
  52. + pr_err("Rx rps sysctl table configuration failed\n");
  53. + return -EINVAL;
  54. + }
  55. +
  56. /* Configure the EDMA common clocks. */
  57. ret = edma_clock_init();
  58. if (ret) {
  59. --- a/drivers/net/ethernet/qualcomm/ppe/edma.h
  60. +++ b/drivers/net/ethernet/qualcomm/ppe/edma.h
  61. @@ -122,6 +122,7 @@ struct edma_intr_info {
  62. * @tx_rings: Tx Descriptor Ring, SW is producer
  63. * @txcmpl_rings: Tx complete Ring, SW is consumer
  64. * @err_stats: Per CPU error statistics
  65. + * @rx_rps_ctl_table_hdr: Rx RPS sysctl table
  66. * @rx_page_mode: Page mode enabled or disabled
  67. * @rx_buf_size: Rx buffer size for Jumbo MRU
  68. * @tx_requeue_stop: Tx requeue stop enabled or disabled
  69. @@ -137,6 +138,7 @@ struct edma_context {
  70. struct edma_txdesc_ring *tx_rings;
  71. struct edma_txcmpl_ring *txcmpl_rings;
  72. struct edma_err_stats __percpu *err_stats;
  73. + struct ctl_table_header *rx_rps_ctl_table_hdr;
  74. u32 rx_page_mode;
  75. u32 rx_buf_size;
  76. bool tx_requeue_stop;
  77. --- a/drivers/net/ethernet/qualcomm/ppe/edma_cfg_rx.c
  78. +++ b/drivers/net/ethernet/qualcomm/ppe/edma_cfg_rx.c
  79. @@ -43,6 +43,8 @@ static u32 edma_rx_ring_queue_map[][EDMA
  80. { 6, 14, 22, 30 },
  81. { 7, 15, 23, 31 }};
  82. +u32 edma_cfg_rx_rps_bitmap_cores = EDMA_RX_DEFAULT_BITMAP;
  83. +
  84. static int edma_cfg_rx_desc_rings_reset_queue_mapping(void)
  85. {
  86. struct edma_hw_info *hw_info = edma_ctx->hw_info;
  87. @@ -987,3 +989,28 @@ int edma_cfg_rx_rps_hash_map(void)
  88. return 0;
  89. }
  90. +
  91. +/* Configure RPS hash mapping based on bitmap */
  92. +int edma_cfg_rx_rps_bitmap(struct ctl_table *table, int write,
  93. + void *buffer, size_t *lenp, loff_t *ppos)
  94. +{
  95. + int ret;
  96. +
  97. + ret = proc_dointvec(table, write, buffer, lenp, ppos);
  98. +
  99. + if (!write)
  100. + return ret;
  101. +
  102. + if (!edma_cfg_rx_rps_bitmap_cores ||
  103. + edma_cfg_rx_rps_bitmap_cores > EDMA_RX_DEFAULT_BITMAP) {
  104. + pr_warn("Incorrect CPU bitmap: %x. Setting it to default value: %d",
  105. + edma_cfg_rx_rps_bitmap_cores, EDMA_RX_DEFAULT_BITMAP);
  106. + edma_cfg_rx_rps_bitmap_cores = EDMA_RX_DEFAULT_BITMAP;
  107. + }
  108. +
  109. + ret = edma_cfg_rx_rps_hash_map();
  110. +
  111. + pr_info("EDMA RPS bitmap value: %d\n", edma_cfg_rx_rps_bitmap_cores);
  112. +
  113. + return ret;
  114. +}
  115. --- a/drivers/net/ethernet/qualcomm/ppe/edma_cfg_rx.h
  116. +++ b/drivers/net/ethernet/qualcomm/ppe/edma_cfg_rx.h
  117. @@ -49,6 +49,8 @@
  118. /* Default bitmap of cores for RPS to ARM cores */
  119. #define EDMA_RX_DEFAULT_BITMAP ((1 << EDMA_MAX_CORE) - 1)
  120. +extern u32 edma_cfg_rx_rps_bitmap_cores;
  121. +
  122. int edma_cfg_rx_rings(void);
  123. int edma_cfg_rx_rings_alloc(void);
  124. void edma_cfg_rx_ring_mappings(void);
  125. @@ -66,4 +68,6 @@ void edma_cfg_rx_buff_size_setup(void);
  126. int edma_cfg_rx_rps_hash_map(void);
  127. int edma_cfg_rx_rps(struct ctl_table *table, int write,
  128. void *buffer, size_t *lenp, loff_t *ppos);
  129. +int edma_cfg_rx_rps_bitmap(struct ctl_table *table, int write,
  130. + void *buffer, size_t *lenp, loff_t *ppos);
  131. #endif