icc-rpm.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020 Linaro Ltd
  4. * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H
  7. #define __DRIVERS_INTERCONNECT_QCOM_ICC_RPM_H
  8. #include <linux/platform_device.h>
  9. #include <linux/regmap.h>
  10. #include <soc/qcom/rpm-smd.h>
  11. #define RPM_BUS_MASTER_REQ 0x73616d62
  12. #define RPM_BUS_SLAVE_REQ 0x766c7362
  13. #define QCOM_MAX_LINKS 128
  14. #define RPM_SLEEP_SET MSM_RPM_CTX_SLEEP_SET
  15. #define RPM_ACTIVE_SET MSM_RPM_CTX_ACTIVE_SET
  16. #define RPM_CLK_MAX_LEVEL INT_MAX
  17. #define RPM_CLK_MIN_LEVEL 19200000
  18. #define DEFAULT_UTIL_FACTOR 100
  19. #define to_qcom_provider(_provider) \
  20. container_of(_provider, struct qcom_icc_provider, provider)
  21. enum qcom_icc_rpm_mas_field_type {
  22. RPM_MASTER_FIELD_BW = 0x00007762,
  23. RPM_MASTER_FIELD_BW_T0 = 0x30747762,
  24. RPM_MASTER_FIELD_BW_T1 = 0x31747762,
  25. RPM_MASTER_FIELD_BW_T2 = 0x32747762,
  26. };
  27. enum qcom_icc_rpm_context {
  28. RPM_SLEEP_CXT,
  29. RPM_ACTIVE_CXT,
  30. RPM_NUM_CXT
  31. };
  32. /**
  33. * struct qcom_icc_provider - Qualcomm specific interconnect provider
  34. * @provider: generic interconnect provider
  35. * @dev: reference to the NoC device
  36. * @qos_clks: the clk_bulk_data table of QoS clocks
  37. * @num_qos_clks: the total number of clk_bulk_data entries
  38. * @bus_clks: the clk_bulk_data table of bus clocks
  39. * @num_clks: the total number of clk_bulk_data entries
  40. * @bus_clk_cur_rate: current frequency of bus clock
  41. * @keepalive: flag used to indicate whether a keepalive is required
  42. * @init: flag to determine when init has completed.
  43. */
  44. struct qcom_icc_provider {
  45. struct icc_provider provider;
  46. struct device *dev;
  47. struct regmap *regmap;
  48. struct list_head probe_list;
  49. struct clk_bulk_data *qos_clks;
  50. int num_qos_clks;
  51. struct clk_bulk_data *bus_clks;
  52. int num_clks;
  53. u32 util_factor;
  54. u64 bus_clk_cur_rate[RPM_NUM_CXT];
  55. bool keepalive;
  56. bool init;
  57. };
  58. /**
  59. * struct qcom_icc_node - Qualcomm specific interconnect nodes
  60. * @name: the node name used in debugfs
  61. * @id: a unique node identifier
  62. * @links: an array of nodes where we can go next while traversing
  63. * @num_links: the total number of @links
  64. * @channels: num of channels at this node
  65. * @buswidth: width of the interconnect between a node and the bus (bytes)
  66. * @last_sum_avg: aggregated average bandwidth from previous aggregation
  67. * @sum_avg: current sum aggregate value of all avg bw requests
  68. * @max_peak: current max aggregate value of all peak bw requests
  69. * @mas_rpm_id: RPM id for devices that are bus masters
  70. * @slv_rpm_id: RPM id for devices that are bus slaves
  71. * @rate: current bus clock rate in Hz
  72. * @dirty: flag used to indicate whether the node needs to be committed
  73. */
  74. struct qcom_icc_node {
  75. unsigned char *name;
  76. u16 id;
  77. u16 links[QCOM_MAX_LINKS];
  78. u16 num_links;
  79. u16 channels;
  80. u16 buswidth;
  81. u64 last_sum_avg[RPM_NUM_CXT];
  82. u64 sum_avg[RPM_NUM_CXT];
  83. u64 max_peak[RPM_NUM_CXT];
  84. int mas_rpm_id;
  85. int slv_rpm_id;
  86. u64 rate;
  87. struct regmap *regmap;
  88. struct qcom_icc_qosbox *qosbox;
  89. const struct qcom_icc_noc_ops *noc_ops;
  90. bool dirty;
  91. };
  92. struct qcom_icc_desc {
  93. struct qcom_icc_node **nodes;
  94. size_t num_nodes;
  95. };
  96. #define DEFINE_QNODE(_name, _id, _buswidth, _mas_rpm_id, _slv_rpm_id, \
  97. ...) \
  98. static struct qcom_icc_node _name = { \
  99. .name = #_name, \
  100. .id = _id, \
  101. .buswidth = _buswidth, \
  102. .mas_rpm_id = _mas_rpm_id, \
  103. .slv_rpm_id = _slv_rpm_id, \
  104. .num_links = ARRAY_SIZE(((int[]){ __VA_ARGS__ })), \
  105. .links = { __VA_ARGS__ }, \
  106. }
  107. int qcom_icc_rpm_aggregate(struct icc_node *node, u32 tag, u32 avg_bw,
  108. u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
  109. int qcom_icc_rpm_set(struct icc_node *src, struct icc_node *dst);
  110. void qcom_icc_rpm_pre_aggregate(struct icc_node *node);
  111. int qcom_icc_get_bw_stub(struct icc_node *node, u32 *avg, u32 *peak);
  112. #endif