dwc_pcie_pmu.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Synopsys DesignWare PCIe PMU driver
  4. *
  5. * Copyright (C) 2021-2023 Alibaba Inc.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/bitops.h>
  9. #include <linux/cpuhotplug.h>
  10. #include <linux/cpumask.h>
  11. #include <linux/device.h>
  12. #include <linux/errno.h>
  13. #include <linux/kernel.h>
  14. #include <linux/list.h>
  15. #include <linux/pcie-dwc.h>
  16. #include <linux/perf_event.h>
  17. #include <linux/pci.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/smp.h>
  20. #include <linux/sysfs.h>
  21. #include <linux/types.h>
  22. #define DWC_PCIE_EVENT_CNT_CTL 0x8
  23. /*
  24. * Event Counter Data Select includes two parts:
  25. * - 27-24: Group number(4-bit: 0..0x7)
  26. * - 23-16: Event number(8-bit: 0..0x13) within the Group
  27. *
  28. * Put them together as in TRM.
  29. */
  30. #define DWC_PCIE_CNT_EVENT_SEL GENMASK(27, 16)
  31. #define DWC_PCIE_CNT_LANE_SEL GENMASK(11, 8)
  32. #define DWC_PCIE_CNT_STATUS BIT(7)
  33. #define DWC_PCIE_CNT_ENABLE GENMASK(4, 2)
  34. #define DWC_PCIE_PER_EVENT_OFF 0x1
  35. #define DWC_PCIE_PER_EVENT_ON 0x3
  36. #define DWC_PCIE_EVENT_CLEAR GENMASK(1, 0)
  37. #define DWC_PCIE_EVENT_PER_CLEAR 0x1
  38. /* Event Selection Field has two subfields */
  39. #define DWC_PCIE_CNT_EVENT_SEL_GROUP GENMASK(11, 8)
  40. #define DWC_PCIE_CNT_EVENT_SEL_EVID GENMASK(7, 0)
  41. #define DWC_PCIE_EVENT_CNT_DATA 0xC
  42. #define DWC_PCIE_TIME_BASED_ANAL_CTL 0x10
  43. #define DWC_PCIE_TIME_BASED_REPORT_SEL GENMASK(31, 24)
  44. #define DWC_PCIE_TIME_BASED_DURATION_SEL GENMASK(15, 8)
  45. #define DWC_PCIE_DURATION_MANUAL_CTL 0x0
  46. #define DWC_PCIE_DURATION_1MS 0x1
  47. #define DWC_PCIE_DURATION_10MS 0x2
  48. #define DWC_PCIE_DURATION_100MS 0x3
  49. #define DWC_PCIE_DURATION_1S 0x4
  50. #define DWC_PCIE_DURATION_2S 0x5
  51. #define DWC_PCIE_DURATION_4S 0x6
  52. #define DWC_PCIE_DURATION_4US 0xFF
  53. #define DWC_PCIE_TIME_BASED_TIMER_START BIT(0)
  54. #define DWC_PCIE_TIME_BASED_CNT_ENABLE 0x1
  55. #define DWC_PCIE_TIME_BASED_ANAL_DATA_REG_LOW 0x14
  56. #define DWC_PCIE_TIME_BASED_ANAL_DATA_REG_HIGH 0x18
  57. /* Event attributes */
  58. #define DWC_PCIE_CONFIG_EVENTID GENMASK(15, 0)
  59. #define DWC_PCIE_CONFIG_TYPE GENMASK(19, 16)
  60. #define DWC_PCIE_CONFIG_LANE GENMASK(27, 20)
  61. #define DWC_PCIE_EVENT_ID(event) FIELD_GET(DWC_PCIE_CONFIG_EVENTID, (event)->attr.config)
  62. #define DWC_PCIE_EVENT_TYPE(event) FIELD_GET(DWC_PCIE_CONFIG_TYPE, (event)->attr.config)
  63. #define DWC_PCIE_EVENT_LANE(event) FIELD_GET(DWC_PCIE_CONFIG_LANE, (event)->attr.config)
  64. enum dwc_pcie_event_type {
  65. DWC_PCIE_TIME_BASE_EVENT,
  66. DWC_PCIE_LANE_EVENT,
  67. DWC_PCIE_EVENT_TYPE_MAX,
  68. };
  69. #define DWC_PCIE_LANE_GROUP_6 6
  70. #define DWC_PCIE_LANE_GROUP_7 7
  71. #define DWC_PCIE_LANE_MAX_EVENTS_PER_GROUP 256
  72. #define DWC_PCIE_LANE_EVENT_MAX_PERIOD GENMASK_ULL(31, 0)
  73. #define DWC_PCIE_MAX_PERIOD GENMASK_ULL(63, 0)
  74. struct dwc_pcie_pmu {
  75. struct pmu pmu;
  76. struct pci_dev *pdev; /* Root Port device */
  77. u16 ras_des_offset;
  78. u32 nr_lanes;
  79. /* Groups #6 and #7 */
  80. DECLARE_BITMAP(lane_events, 2 * DWC_PCIE_LANE_MAX_EVENTS_PER_GROUP);
  81. struct perf_event *time_based_event;
  82. struct hlist_node cpuhp_node;
  83. int on_cpu;
  84. };
  85. #define to_dwc_pcie_pmu(p) (container_of(p, struct dwc_pcie_pmu, pmu))
  86. static int dwc_pcie_pmu_hp_state;
  87. static struct list_head dwc_pcie_dev_info_head =
  88. LIST_HEAD_INIT(dwc_pcie_dev_info_head);
  89. static bool notify;
  90. struct dwc_pcie_dev_info {
  91. struct platform_device *plat_dev;
  92. struct pci_dev *pdev;
  93. struct list_head dev_node;
  94. };
  95. static ssize_t cpumask_show(struct device *dev,
  96. struct device_attribute *attr,
  97. char *buf)
  98. {
  99. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(dev_get_drvdata(dev));
  100. return cpumap_print_to_pagebuf(true, buf, cpumask_of(pcie_pmu->on_cpu));
  101. }
  102. static DEVICE_ATTR_RO(cpumask);
  103. static struct attribute *dwc_pcie_pmu_cpumask_attrs[] = {
  104. &dev_attr_cpumask.attr,
  105. NULL
  106. };
  107. static struct attribute_group dwc_pcie_cpumask_attr_group = {
  108. .attrs = dwc_pcie_pmu_cpumask_attrs,
  109. };
  110. struct dwc_pcie_format_attr {
  111. struct device_attribute attr;
  112. u64 field;
  113. int config;
  114. };
  115. PMU_FORMAT_ATTR(eventid, "config:0-15");
  116. PMU_FORMAT_ATTR(type, "config:16-19");
  117. PMU_FORMAT_ATTR(lane, "config:20-27");
  118. static struct attribute *dwc_pcie_format_attrs[] = {
  119. &format_attr_type.attr,
  120. &format_attr_eventid.attr,
  121. &format_attr_lane.attr,
  122. NULL,
  123. };
  124. static struct attribute_group dwc_pcie_format_attrs_group = {
  125. .name = "format",
  126. .attrs = dwc_pcie_format_attrs,
  127. };
  128. struct dwc_pcie_event_attr {
  129. struct device_attribute attr;
  130. enum dwc_pcie_event_type type;
  131. u16 eventid;
  132. u8 lane;
  133. };
  134. static ssize_t dwc_pcie_event_show(struct device *dev,
  135. struct device_attribute *attr, char *buf)
  136. {
  137. struct dwc_pcie_event_attr *eattr;
  138. eattr = container_of(attr, typeof(*eattr), attr);
  139. if (eattr->type == DWC_PCIE_LANE_EVENT)
  140. return sysfs_emit(buf, "eventid=0x%x,type=0x%x,lane=?\n",
  141. eattr->eventid, eattr->type);
  142. else if (eattr->type == DWC_PCIE_TIME_BASE_EVENT)
  143. return sysfs_emit(buf, "eventid=0x%x,type=0x%x\n",
  144. eattr->eventid, eattr->type);
  145. return 0;
  146. }
  147. #define DWC_PCIE_EVENT_ATTR(_name, _type, _eventid, _lane) \
  148. (&((struct dwc_pcie_event_attr[]) {{ \
  149. .attr = __ATTR(_name, 0444, dwc_pcie_event_show, NULL), \
  150. .type = _type, \
  151. .eventid = _eventid, \
  152. .lane = _lane, \
  153. }})[0].attr.attr)
  154. #define DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(_name, _eventid) \
  155. DWC_PCIE_EVENT_ATTR(_name, DWC_PCIE_TIME_BASE_EVENT, _eventid, 0)
  156. #define DWC_PCIE_PMU_LANE_EVENT_ATTR(_name, _eventid) \
  157. DWC_PCIE_EVENT_ATTR(_name, DWC_PCIE_LANE_EVENT, _eventid, 0)
  158. static struct attribute *dwc_pcie_pmu_time_event_attrs[] = {
  159. /* Group #0 */
  160. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(one_cycle, 0x00),
  161. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(TX_L0S, 0x01),
  162. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(RX_L0S, 0x02),
  163. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(L0, 0x03),
  164. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(L1, 0x04),
  165. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(L1_1, 0x05),
  166. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(L1_2, 0x06),
  167. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(CFG_RCVRY, 0x07),
  168. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(L1_AUX, 0x08),
  169. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(TX_RX_L0S, 0x09),
  170. /* Group #1 */
  171. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(tx_pcie_tlp_data_payload, 0x20),
  172. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(rx_pcie_tlp_data_payload, 0x21),
  173. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(tx_ccix_tlp_data_payload, 0x22),
  174. DWC_PCIE_PMU_TIME_BASE_EVENT_ATTR(rx_ccix_tlp_data_payload, 0x23),
  175. /*
  176. * Leave it to the user to specify the lane ID to avoid generating
  177. * a list of hundreds of events.
  178. */
  179. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_ack_dllp, 0x600),
  180. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_update_fc_dllp, 0x601),
  181. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_ack_dllp, 0x602),
  182. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_update_fc_dllp, 0x603),
  183. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_nullified_tlp, 0x604),
  184. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_nullified_tlp, 0x605),
  185. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_duplicate_tlp, 0x606),
  186. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_memory_write, 0x700),
  187. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_memory_read, 0x701),
  188. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_configuration_write, 0x702),
  189. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_configuration_read, 0x703),
  190. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_io_write, 0x704),
  191. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_io_read, 0x705),
  192. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_completion_without_data, 0x706),
  193. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_completion_with_data, 0x707),
  194. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_message_tlp, 0x708),
  195. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_atomic, 0x709),
  196. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_tlp_with_prefix, 0x70A),
  197. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_memory_write, 0x70B),
  198. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_memory_read, 0x70C),
  199. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_io_write, 0x70F),
  200. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_io_read, 0x710),
  201. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_completion_without_data, 0x711),
  202. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_completion_with_data, 0x712),
  203. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_message_tlp, 0x713),
  204. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_atomic, 0x714),
  205. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_tlp_with_prefix, 0x715),
  206. DWC_PCIE_PMU_LANE_EVENT_ATTR(tx_ccix_tlp, 0x716),
  207. DWC_PCIE_PMU_LANE_EVENT_ATTR(rx_ccix_tlp, 0x717),
  208. NULL
  209. };
  210. static const struct attribute_group dwc_pcie_event_attrs_group = {
  211. .name = "events",
  212. .attrs = dwc_pcie_pmu_time_event_attrs,
  213. };
  214. static const struct attribute_group *dwc_pcie_attr_groups[] = {
  215. &dwc_pcie_event_attrs_group,
  216. &dwc_pcie_format_attrs_group,
  217. &dwc_pcie_cpumask_attr_group,
  218. NULL
  219. };
  220. static void dwc_pcie_pmu_lane_event_enable(struct dwc_pcie_pmu *pcie_pmu,
  221. struct perf_event *event,
  222. bool enable)
  223. {
  224. struct pci_dev *pdev = pcie_pmu->pdev;
  225. u16 ras_des_offset = pcie_pmu->ras_des_offset;
  226. int event_id = DWC_PCIE_EVENT_ID(event);
  227. int lane = DWC_PCIE_EVENT_LANE(event);
  228. u32 ctrl;
  229. ctrl = FIELD_PREP(DWC_PCIE_CNT_EVENT_SEL, event_id) |
  230. FIELD_PREP(DWC_PCIE_CNT_LANE_SEL, lane) |
  231. FIELD_PREP(DWC_PCIE_EVENT_CLEAR, DWC_PCIE_EVENT_PER_CLEAR);
  232. if (enable)
  233. ctrl |= FIELD_PREP(DWC_PCIE_CNT_ENABLE, DWC_PCIE_PER_EVENT_ON);
  234. else
  235. ctrl |= FIELD_PREP(DWC_PCIE_CNT_ENABLE, DWC_PCIE_PER_EVENT_OFF);
  236. pci_write_config_dword(pdev, ras_des_offset + DWC_PCIE_EVENT_CNT_CTL,
  237. ctrl);
  238. }
  239. static void dwc_pcie_pmu_time_based_event_enable(struct dwc_pcie_pmu *pcie_pmu,
  240. bool enable)
  241. {
  242. struct pci_dev *pdev = pcie_pmu->pdev;
  243. u16 ras_des_offset = pcie_pmu->ras_des_offset;
  244. pci_clear_and_set_config_dword(pdev,
  245. ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_CTL,
  246. DWC_PCIE_TIME_BASED_TIMER_START, enable);
  247. }
  248. static u64 dwc_pcie_pmu_read_lane_event_counter(struct perf_event *event)
  249. {
  250. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  251. struct pci_dev *pdev = pcie_pmu->pdev;
  252. int event_id = DWC_PCIE_EVENT_ID(event);
  253. int lane = DWC_PCIE_EVENT_LANE(event);
  254. u16 ras_des_offset = pcie_pmu->ras_des_offset;
  255. u32 val, ctrl;
  256. ctrl = FIELD_PREP(DWC_PCIE_CNT_EVENT_SEL, event_id) |
  257. FIELD_PREP(DWC_PCIE_CNT_LANE_SEL, lane) |
  258. FIELD_PREP(DWC_PCIE_CNT_ENABLE, DWC_PCIE_PER_EVENT_ON);
  259. pci_write_config_dword(pdev, ras_des_offset + DWC_PCIE_EVENT_CNT_CTL,
  260. ctrl);
  261. pci_read_config_dword(pdev, ras_des_offset + DWC_PCIE_EVENT_CNT_DATA, &val);
  262. ctrl |= FIELD_PREP(DWC_PCIE_EVENT_CLEAR, DWC_PCIE_EVENT_PER_CLEAR);
  263. pci_write_config_dword(pdev, ras_des_offset + DWC_PCIE_EVENT_CNT_CTL,
  264. ctrl);
  265. return val;
  266. }
  267. static u64 dwc_pcie_pmu_read_time_based_counter(struct perf_event *event)
  268. {
  269. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  270. struct pci_dev *pdev = pcie_pmu->pdev;
  271. int event_id = DWC_PCIE_EVENT_ID(event);
  272. u16 ras_des_offset = pcie_pmu->ras_des_offset;
  273. u32 lo, hi, ss;
  274. u64 val;
  275. /*
  276. * The 64-bit value of the data counter is spread across two
  277. * registers that are not synchronized. In order to read them
  278. * atomically, ensure that the high 32 bits match before and after
  279. * reading the low 32 bits.
  280. */
  281. pci_read_config_dword(pdev,
  282. ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_DATA_REG_HIGH, &hi);
  283. do {
  284. /* snapshot the high 32 bits */
  285. ss = hi;
  286. pci_read_config_dword(
  287. pdev, ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_DATA_REG_LOW,
  288. &lo);
  289. pci_read_config_dword(
  290. pdev, ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_DATA_REG_HIGH,
  291. &hi);
  292. } while (hi != ss);
  293. val = ((u64)hi << 32) | lo;
  294. /*
  295. * The Group#1 event measures the amount of data processed in 16-byte
  296. * units. Simplify the end-user interface by multiplying the counter
  297. * at the point of read.
  298. */
  299. if (event_id >= 0x20 && event_id <= 0x23)
  300. val *= 16;
  301. return val;
  302. }
  303. static void dwc_pcie_pmu_event_update(struct perf_event *event)
  304. {
  305. struct hw_perf_event *hwc = &event->hw;
  306. enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event);
  307. u64 delta, prev, now;
  308. if (type == DWC_PCIE_LANE_EVENT) {
  309. now = dwc_pcie_pmu_read_lane_event_counter(event) &
  310. DWC_PCIE_LANE_EVENT_MAX_PERIOD;
  311. local64_add(now, &event->count);
  312. return;
  313. }
  314. do {
  315. prev = local64_read(&hwc->prev_count);
  316. now = dwc_pcie_pmu_read_time_based_counter(event);
  317. } while (local64_cmpxchg(&hwc->prev_count, prev, now) != prev);
  318. delta = (now - prev) & DWC_PCIE_MAX_PERIOD;
  319. local64_add(delta, &event->count);
  320. }
  321. static int dwc_pcie_pmu_validate_add_lane_event(struct perf_event *event,
  322. unsigned long val_lane_events[])
  323. {
  324. int event_id, event_nr, group;
  325. event_id = DWC_PCIE_EVENT_ID(event);
  326. event_nr = FIELD_GET(DWC_PCIE_CNT_EVENT_SEL_EVID, event_id);
  327. group = FIELD_GET(DWC_PCIE_CNT_EVENT_SEL_GROUP, event_id);
  328. if (group != DWC_PCIE_LANE_GROUP_6 && group != DWC_PCIE_LANE_GROUP_7)
  329. return -EINVAL;
  330. group -= DWC_PCIE_LANE_GROUP_6;
  331. if (test_and_set_bit(group * DWC_PCIE_LANE_MAX_EVENTS_PER_GROUP + event_nr,
  332. val_lane_events))
  333. return -EINVAL;
  334. return 0;
  335. }
  336. static int dwc_pcie_pmu_validate_group(struct perf_event *event)
  337. {
  338. struct perf_event *sibling, *leader = event->group_leader;
  339. DECLARE_BITMAP(val_lane_events, 2 * DWC_PCIE_LANE_MAX_EVENTS_PER_GROUP);
  340. bool time_event = false;
  341. int type;
  342. type = DWC_PCIE_EVENT_TYPE(leader);
  343. if (type == DWC_PCIE_TIME_BASE_EVENT)
  344. time_event = true;
  345. else
  346. if (dwc_pcie_pmu_validate_add_lane_event(leader, val_lane_events))
  347. return -ENOSPC;
  348. for_each_sibling_event(sibling, leader) {
  349. type = DWC_PCIE_EVENT_TYPE(sibling);
  350. if (type == DWC_PCIE_TIME_BASE_EVENT) {
  351. if (time_event)
  352. return -ENOSPC;
  353. time_event = true;
  354. continue;
  355. }
  356. if (dwc_pcie_pmu_validate_add_lane_event(sibling, val_lane_events))
  357. return -ENOSPC;
  358. }
  359. return 0;
  360. }
  361. static int dwc_pcie_pmu_event_init(struct perf_event *event)
  362. {
  363. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  364. enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event);
  365. struct perf_event *sibling;
  366. u32 lane;
  367. if (event->attr.type != event->pmu->type)
  368. return -ENOENT;
  369. /* We don't support sampling */
  370. if (is_sampling_event(event))
  371. return -EINVAL;
  372. /* We cannot support task bound events */
  373. if (event->cpu < 0 || event->attach_state & PERF_ATTACH_TASK)
  374. return -EINVAL;
  375. for_each_sibling_event(sibling, event->group_leader) {
  376. if (sibling->pmu != event->pmu && !is_software_event(sibling))
  377. return -EINVAL;
  378. }
  379. if (type < 0 || type >= DWC_PCIE_EVENT_TYPE_MAX)
  380. return -EINVAL;
  381. if (type == DWC_PCIE_LANE_EVENT) {
  382. lane = DWC_PCIE_EVENT_LANE(event);
  383. if (lane < 0 || lane >= pcie_pmu->nr_lanes)
  384. return -EINVAL;
  385. }
  386. if (dwc_pcie_pmu_validate_group(event))
  387. return -ENOSPC;
  388. event->cpu = pcie_pmu->on_cpu;
  389. return 0;
  390. }
  391. static void dwc_pcie_pmu_event_start(struct perf_event *event, int flags)
  392. {
  393. struct hw_perf_event *hwc = &event->hw;
  394. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  395. enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event);
  396. hwc->state = 0;
  397. local64_set(&hwc->prev_count, 0);
  398. if (type == DWC_PCIE_LANE_EVENT)
  399. dwc_pcie_pmu_lane_event_enable(pcie_pmu, event, true);
  400. else if (type == DWC_PCIE_TIME_BASE_EVENT)
  401. dwc_pcie_pmu_time_based_event_enable(pcie_pmu, true);
  402. }
  403. static void dwc_pcie_pmu_event_stop(struct perf_event *event, int flags)
  404. {
  405. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  406. enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event);
  407. struct hw_perf_event *hwc = &event->hw;
  408. if (event->hw.state & PERF_HES_STOPPED)
  409. return;
  410. dwc_pcie_pmu_event_update(event);
  411. if (type == DWC_PCIE_LANE_EVENT)
  412. dwc_pcie_pmu_lane_event_enable(pcie_pmu, event, false);
  413. else if (type == DWC_PCIE_TIME_BASE_EVENT)
  414. dwc_pcie_pmu_time_based_event_enable(pcie_pmu, false);
  415. hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
  416. }
  417. static int dwc_pcie_pmu_event_add(struct perf_event *event, int flags)
  418. {
  419. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  420. struct pci_dev *pdev = pcie_pmu->pdev;
  421. struct hw_perf_event *hwc = &event->hw;
  422. enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event);
  423. int event_id = DWC_PCIE_EVENT_ID(event);
  424. int lane = DWC_PCIE_EVENT_LANE(event);
  425. u16 ras_des_offset = pcie_pmu->ras_des_offset;
  426. u32 ctrl;
  427. hwc->state = PERF_HES_STOPPED | PERF_HES_UPTODATE;
  428. if (type == DWC_PCIE_LANE_EVENT) {
  429. int event_nr = FIELD_GET(DWC_PCIE_CNT_EVENT_SEL_EVID, event_id);
  430. int group = FIELD_GET(DWC_PCIE_CNT_EVENT_SEL_GROUP, event_id) -
  431. DWC_PCIE_LANE_GROUP_6;
  432. if (test_and_set_bit(group * DWC_PCIE_LANE_MAX_EVENTS_PER_GROUP + event_nr,
  433. pcie_pmu->lane_events))
  434. return -ENOSPC;
  435. /* EVENT_COUNTER_DATA_REG needs clear manually */
  436. ctrl = FIELD_PREP(DWC_PCIE_CNT_EVENT_SEL, event_id) |
  437. FIELD_PREP(DWC_PCIE_CNT_LANE_SEL, lane) |
  438. FIELD_PREP(DWC_PCIE_CNT_ENABLE, DWC_PCIE_PER_EVENT_OFF) |
  439. FIELD_PREP(DWC_PCIE_EVENT_CLEAR, DWC_PCIE_EVENT_PER_CLEAR);
  440. pci_write_config_dword(pdev, ras_des_offset + DWC_PCIE_EVENT_CNT_CTL,
  441. ctrl);
  442. } else if (type == DWC_PCIE_TIME_BASE_EVENT) {
  443. if (pcie_pmu->time_based_event)
  444. return -ENOSPC;
  445. pcie_pmu->time_based_event = event;
  446. /*
  447. * TIME_BASED_ANAL_DATA_REG is a 64 bit register, we can safely
  448. * use it with any manually controlled duration. And it is
  449. * cleared when next measurement starts.
  450. */
  451. ctrl = FIELD_PREP(DWC_PCIE_TIME_BASED_REPORT_SEL, event_id) |
  452. FIELD_PREP(DWC_PCIE_TIME_BASED_DURATION_SEL,
  453. DWC_PCIE_DURATION_MANUAL_CTL) |
  454. DWC_PCIE_TIME_BASED_CNT_ENABLE;
  455. pci_write_config_dword(
  456. pdev, ras_des_offset + DWC_PCIE_TIME_BASED_ANAL_CTL, ctrl);
  457. }
  458. if (flags & PERF_EF_START)
  459. dwc_pcie_pmu_event_start(event, PERF_EF_RELOAD);
  460. perf_event_update_userpage(event);
  461. return 0;
  462. }
  463. static void dwc_pcie_pmu_event_del(struct perf_event *event, int flags)
  464. {
  465. struct dwc_pcie_pmu *pcie_pmu = to_dwc_pcie_pmu(event->pmu);
  466. enum dwc_pcie_event_type type = DWC_PCIE_EVENT_TYPE(event);
  467. dwc_pcie_pmu_event_stop(event, flags | PERF_EF_UPDATE);
  468. perf_event_update_userpage(event);
  469. if (type == DWC_PCIE_TIME_BASE_EVENT) {
  470. pcie_pmu->time_based_event = NULL;
  471. } else {
  472. int event_id = DWC_PCIE_EVENT_ID(event);
  473. int event_nr = FIELD_GET(DWC_PCIE_CNT_EVENT_SEL_EVID, event_id);
  474. int group = FIELD_GET(DWC_PCIE_CNT_EVENT_SEL_GROUP, event_id) -
  475. DWC_PCIE_LANE_GROUP_6;
  476. clear_bit(group * DWC_PCIE_LANE_MAX_EVENTS_PER_GROUP + event_nr,
  477. pcie_pmu->lane_events);
  478. }
  479. }
  480. static void dwc_pcie_pmu_remove_cpuhp_instance(void *hotplug_node)
  481. {
  482. cpuhp_state_remove_instance_nocalls(dwc_pcie_pmu_hp_state, hotplug_node);
  483. }
  484. /*
  485. * Find the binded DES capability device info of a PCI device.
  486. * @pdev: The PCI device.
  487. */
  488. static struct dwc_pcie_dev_info *dwc_pcie_find_dev_info(struct pci_dev *pdev)
  489. {
  490. struct dwc_pcie_dev_info *dev_info;
  491. list_for_each_entry(dev_info, &dwc_pcie_dev_info_head, dev_node)
  492. if (dev_info->pdev == pdev)
  493. return dev_info;
  494. return NULL;
  495. }
  496. static void dwc_pcie_unregister_pmu(void *data)
  497. {
  498. struct dwc_pcie_pmu *pcie_pmu = data;
  499. perf_pmu_unregister(&pcie_pmu->pmu);
  500. }
  501. static u16 dwc_pcie_des_cap(struct pci_dev *pdev)
  502. {
  503. const struct dwc_pcie_vsec_id *vid;
  504. u16 vsec;
  505. u32 val;
  506. if (!pci_is_pcie(pdev) || !(pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT))
  507. return 0;
  508. for (vid = dwc_pcie_rasdes_vsec_ids; vid->vendor_id; vid++) {
  509. vsec = pci_find_vsec_capability(pdev, vid->vendor_id,
  510. vid->vsec_id);
  511. if (vsec) {
  512. pci_read_config_dword(pdev, vsec + PCI_VNDR_HEADER,
  513. &val);
  514. if (PCI_VNDR_HEADER_REV(val) == vid->vsec_rev) {
  515. pci_dbg(pdev, "Detected PCIe Vendor-Specific Extended Capability RAS DES\n");
  516. return vsec;
  517. }
  518. }
  519. }
  520. return 0;
  521. }
  522. static void dwc_pcie_unregister_dev(struct dwc_pcie_dev_info *dev_info)
  523. {
  524. platform_device_unregister(dev_info->plat_dev);
  525. list_del(&dev_info->dev_node);
  526. kfree(dev_info);
  527. }
  528. static int dwc_pcie_register_dev(struct pci_dev *pdev)
  529. {
  530. struct platform_device *plat_dev;
  531. struct dwc_pcie_dev_info *dev_info;
  532. u32 sbdf;
  533. sbdf = (pci_domain_nr(pdev->bus) << 16) | PCI_DEVID(pdev->bus->number, pdev->devfn);
  534. plat_dev = platform_device_register_simple("dwc_pcie_pmu", sbdf, NULL, 0);
  535. if (IS_ERR(plat_dev))
  536. return PTR_ERR(plat_dev);
  537. dev_info = kzalloc_obj(*dev_info);
  538. if (!dev_info) {
  539. platform_device_unregister(plat_dev);
  540. return -ENOMEM;
  541. }
  542. /* Cache platform device to handle pci device hotplug */
  543. dev_info->plat_dev = plat_dev;
  544. dev_info->pdev = pdev;
  545. list_add(&dev_info->dev_node, &dwc_pcie_dev_info_head);
  546. return 0;
  547. }
  548. static int dwc_pcie_pmu_notifier(struct notifier_block *nb,
  549. unsigned long action, void *data)
  550. {
  551. struct device *dev = data;
  552. struct pci_dev *pdev = to_pci_dev(dev);
  553. struct dwc_pcie_dev_info *dev_info;
  554. switch (action) {
  555. case BUS_NOTIFY_ADD_DEVICE:
  556. if (!dwc_pcie_des_cap(pdev))
  557. return NOTIFY_DONE;
  558. if (dwc_pcie_register_dev(pdev))
  559. return NOTIFY_BAD;
  560. break;
  561. case BUS_NOTIFY_DEL_DEVICE:
  562. dev_info = dwc_pcie_find_dev_info(pdev);
  563. if (!dev_info)
  564. return NOTIFY_DONE;
  565. dwc_pcie_unregister_dev(dev_info);
  566. break;
  567. }
  568. return NOTIFY_OK;
  569. }
  570. static struct notifier_block dwc_pcie_pmu_nb = {
  571. .notifier_call = dwc_pcie_pmu_notifier,
  572. };
  573. static int dwc_pcie_pmu_probe(struct platform_device *plat_dev)
  574. {
  575. struct pci_dev *pdev;
  576. struct dwc_pcie_pmu *pcie_pmu;
  577. char *name;
  578. u32 sbdf;
  579. u16 vsec;
  580. int ret;
  581. sbdf = plat_dev->id;
  582. pdev = pci_get_domain_bus_and_slot(sbdf >> 16, PCI_BUS_NUM(sbdf & 0xffff),
  583. sbdf & 0xff);
  584. if (!pdev) {
  585. pr_err("No pdev found for the sbdf 0x%x\n", sbdf);
  586. return -ENODEV;
  587. }
  588. vsec = dwc_pcie_des_cap(pdev);
  589. if (!vsec)
  590. return -ENODEV;
  591. pci_dev_put(pdev);
  592. name = devm_kasprintf(&plat_dev->dev, GFP_KERNEL, "dwc_rootport_%x", sbdf);
  593. if (!name)
  594. return -ENOMEM;
  595. pcie_pmu = devm_kzalloc(&plat_dev->dev, sizeof(*pcie_pmu), GFP_KERNEL);
  596. if (!pcie_pmu)
  597. return -ENOMEM;
  598. pcie_pmu->pdev = pdev;
  599. pcie_pmu->ras_des_offset = vsec;
  600. pcie_pmu->nr_lanes = pcie_get_width_cap(pdev);
  601. pcie_pmu->on_cpu = -1;
  602. pcie_pmu->pmu = (struct pmu){
  603. .name = name,
  604. .parent = &plat_dev->dev,
  605. .module = THIS_MODULE,
  606. .attr_groups = dwc_pcie_attr_groups,
  607. .capabilities = PERF_PMU_CAP_NO_EXCLUDE,
  608. .task_ctx_nr = perf_invalid_context,
  609. .event_init = dwc_pcie_pmu_event_init,
  610. .add = dwc_pcie_pmu_event_add,
  611. .del = dwc_pcie_pmu_event_del,
  612. .start = dwc_pcie_pmu_event_start,
  613. .stop = dwc_pcie_pmu_event_stop,
  614. .read = dwc_pcie_pmu_event_update,
  615. };
  616. /* Add this instance to the list used by the offline callback */
  617. ret = cpuhp_state_add_instance(dwc_pcie_pmu_hp_state,
  618. &pcie_pmu->cpuhp_node);
  619. if (ret) {
  620. pci_err(pdev, "Error %d registering hotplug @%x\n", ret, sbdf);
  621. return ret;
  622. }
  623. /* Unwind when platform driver removes */
  624. ret = devm_add_action_or_reset(&plat_dev->dev,
  625. dwc_pcie_pmu_remove_cpuhp_instance,
  626. &pcie_pmu->cpuhp_node);
  627. if (ret)
  628. return ret;
  629. ret = perf_pmu_register(&pcie_pmu->pmu, name, -1);
  630. if (ret) {
  631. pci_err(pdev, "Error %d registering PMU @%x\n", ret, sbdf);
  632. return ret;
  633. }
  634. ret = devm_add_action_or_reset(&plat_dev->dev, dwc_pcie_unregister_pmu,
  635. pcie_pmu);
  636. if (ret)
  637. return ret;
  638. return 0;
  639. }
  640. static int dwc_pcie_pmu_online_cpu(unsigned int cpu, struct hlist_node *cpuhp_node)
  641. {
  642. struct dwc_pcie_pmu *pcie_pmu;
  643. pcie_pmu = hlist_entry_safe(cpuhp_node, struct dwc_pcie_pmu, cpuhp_node);
  644. if (pcie_pmu->on_cpu == -1)
  645. pcie_pmu->on_cpu = cpumask_local_spread(
  646. 0, dev_to_node(&pcie_pmu->pdev->dev));
  647. return 0;
  648. }
  649. static int dwc_pcie_pmu_offline_cpu(unsigned int cpu, struct hlist_node *cpuhp_node)
  650. {
  651. struct dwc_pcie_pmu *pcie_pmu;
  652. struct pci_dev *pdev;
  653. unsigned int target;
  654. int node;
  655. pcie_pmu = hlist_entry_safe(cpuhp_node, struct dwc_pcie_pmu, cpuhp_node);
  656. /* Nothing to do if this CPU doesn't own the PMU */
  657. if (cpu != pcie_pmu->on_cpu)
  658. return 0;
  659. pcie_pmu->on_cpu = -1;
  660. pdev = pcie_pmu->pdev;
  661. node = dev_to_node(&pdev->dev);
  662. target = cpumask_any_and_but(cpumask_of_node(node), cpu_online_mask, cpu);
  663. if (target >= nr_cpu_ids)
  664. target = cpumask_any_but(cpu_online_mask, cpu);
  665. if (target >= nr_cpu_ids) {
  666. pci_err(pdev, "There is no CPU to set\n");
  667. return 0;
  668. }
  669. /* This PMU does NOT support interrupt, just migrate context. */
  670. perf_pmu_migrate_context(&pcie_pmu->pmu, cpu, target);
  671. pcie_pmu->on_cpu = target;
  672. return 0;
  673. }
  674. static struct platform_driver dwc_pcie_pmu_driver = {
  675. .probe = dwc_pcie_pmu_probe,
  676. .driver = {.name = "dwc_pcie_pmu",},
  677. };
  678. static void dwc_pcie_cleanup_devices(void)
  679. {
  680. struct dwc_pcie_dev_info *dev_info, *tmp;
  681. list_for_each_entry_safe(dev_info, tmp, &dwc_pcie_dev_info_head, dev_node) {
  682. dwc_pcie_unregister_dev(dev_info);
  683. }
  684. }
  685. static int __init dwc_pcie_pmu_init(void)
  686. {
  687. struct pci_dev *pdev = NULL;
  688. int ret;
  689. for_each_pci_dev(pdev) {
  690. if (!dwc_pcie_des_cap(pdev))
  691. continue;
  692. ret = dwc_pcie_register_dev(pdev);
  693. if (ret) {
  694. pci_dev_put(pdev);
  695. goto err_cleanup;
  696. }
  697. }
  698. ret = cpuhp_setup_state_multi(CPUHP_AP_ONLINE_DYN,
  699. "perf/dwc_pcie_pmu:online",
  700. dwc_pcie_pmu_online_cpu,
  701. dwc_pcie_pmu_offline_cpu);
  702. if (ret < 0)
  703. goto err_cleanup;
  704. dwc_pcie_pmu_hp_state = ret;
  705. ret = platform_driver_register(&dwc_pcie_pmu_driver);
  706. if (ret)
  707. goto err_remove_cpuhp;
  708. ret = bus_register_notifier(&pci_bus_type, &dwc_pcie_pmu_nb);
  709. if (ret)
  710. goto err_unregister_driver;
  711. notify = true;
  712. return 0;
  713. err_unregister_driver:
  714. platform_driver_unregister(&dwc_pcie_pmu_driver);
  715. err_remove_cpuhp:
  716. cpuhp_remove_multi_state(dwc_pcie_pmu_hp_state);
  717. err_cleanup:
  718. dwc_pcie_cleanup_devices();
  719. return ret;
  720. }
  721. static void __exit dwc_pcie_pmu_exit(void)
  722. {
  723. if (notify)
  724. bus_unregister_notifier(&pci_bus_type, &dwc_pcie_pmu_nb);
  725. dwc_pcie_cleanup_devices();
  726. platform_driver_unregister(&dwc_pcie_pmu_driver);
  727. cpuhp_remove_multi_state(dwc_pcie_pmu_hp_state);
  728. }
  729. module_init(dwc_pcie_pmu_init);
  730. module_exit(dwc_pcie_pmu_exit);
  731. MODULE_DESCRIPTION("PMU driver for DesignWare Cores PCI Express Controller");
  732. MODULE_AUTHOR("Shuai Xue <xueshuai@linux.alibaba.com>");
  733. MODULE_LICENSE("GPL v2");