qaic_ras.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. */
  3. /* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. */
  4. /* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */
  5. #include <asm/byteorder.h>
  6. #include <linux/device.h>
  7. #include <linux/kernel.h>
  8. #include <linux/mhi.h>
  9. #include "qaic.h"
  10. #include "qaic_ras.h"
  11. #define MAGIC 0x55AA
  12. #define VERSION 0x2
  13. #define HDR_SZ 12
  14. #define NUM_TEMP_LVL 3
  15. #define POWER_BREAK BIT(0)
  16. enum msg_type {
  17. MSG_PUSH, /* async push from device */
  18. MSG_REQ, /* sync request to device */
  19. MSG_RESP, /* sync response from device */
  20. };
  21. enum err_type {
  22. CE, /* correctable error */
  23. UE, /* uncorrectable error */
  24. UE_NF, /* uncorrectable error that is non-fatal, expect a disruption */
  25. ERR_TYPE_MAX,
  26. };
  27. static const char * const err_type_str[] = {
  28. [CE] = "Correctable",
  29. [UE] = "Uncorrectable",
  30. [UE_NF] = "Uncorrectable Non-Fatal",
  31. };
  32. static const char * const err_class_str[] = {
  33. [CE] = "Warning",
  34. [UE] = "Fatal",
  35. [UE_NF] = "Warning",
  36. };
  37. enum err_source {
  38. SOC_MEM,
  39. PCIE,
  40. DDR,
  41. SYS_BUS1,
  42. SYS_BUS2,
  43. NSP_MEM,
  44. TSENS,
  45. };
  46. static const char * const err_src_str[TSENS + 1] = {
  47. [SOC_MEM] = "SoC Memory",
  48. [PCIE] = "PCIE",
  49. [DDR] = "DDR",
  50. [SYS_BUS1] = "System Bus source 1",
  51. [SYS_BUS2] = "System Bus source 2",
  52. [NSP_MEM] = "NSP Memory",
  53. [TSENS] = "Temperature Sensors",
  54. };
  55. struct ras_data {
  56. /* header start */
  57. /* Magic number to validate the message */
  58. u16 magic;
  59. /* RAS version number */
  60. u16 ver;
  61. u32 seq_num;
  62. /* RAS message type */
  63. u8 type;
  64. u8 id;
  65. /* Size of RAS message without the header in byte */
  66. u16 len;
  67. /* header end */
  68. s32 result;
  69. /*
  70. * Error source
  71. * 0 : SoC Memory
  72. * 1 : PCIE
  73. * 2 : DDR
  74. * 3 : System Bus source 1
  75. * 4 : System Bus source 2
  76. * 5 : NSP Memory
  77. * 6 : Temperature Sensors
  78. */
  79. u32 source;
  80. /*
  81. * Stores the error type, there are three types of error in RAS
  82. * 0 : correctable error (CE)
  83. * 1 : uncorrectable error (UE)
  84. * 2 : uncorrectable error that is non-fatal (UE_NF)
  85. */
  86. u32 err_type;
  87. u32 err_threshold;
  88. u32 ce_count;
  89. u32 ue_count;
  90. u32 intr_num;
  91. /* Data specific to error source */
  92. u8 syndrome[64];
  93. } __packed;
  94. struct soc_mem_syndrome {
  95. u64 error_address[8];
  96. } __packed;
  97. struct nsp_mem_syndrome {
  98. u32 error_address[8];
  99. u8 nsp_id;
  100. } __packed;
  101. struct ddr_syndrome {
  102. u32 count;
  103. u32 irq_status;
  104. u32 data_31_0[2];
  105. u32 data_63_32[2];
  106. u32 data_95_64[2];
  107. u32 data_127_96[2];
  108. u32 addr_lsb;
  109. u16 addr_msb;
  110. u16 parity_bits;
  111. u16 instance;
  112. u16 err_type;
  113. } __packed;
  114. struct tsens_syndrome {
  115. u32 threshold_type;
  116. s32 temp;
  117. } __packed;
  118. struct sysbus1_syndrome {
  119. u32 slave;
  120. u32 err_type;
  121. u16 addr[8];
  122. u8 instance;
  123. } __packed;
  124. struct sysbus2_syndrome {
  125. u32 lsb3;
  126. u32 msb3;
  127. u32 lsb2;
  128. u32 msb2;
  129. u32 ext_id;
  130. u16 path;
  131. u16 op_type;
  132. u16 len;
  133. u16 redirect;
  134. u8 valid;
  135. u8 word_error;
  136. u8 non_secure;
  137. u8 opc;
  138. u8 error_code;
  139. u8 trans_type;
  140. u8 addr_space;
  141. u8 instance;
  142. } __packed;
  143. struct pcie_syndrome {
  144. /* CE info */
  145. u32 bad_tlp;
  146. u32 bad_dllp;
  147. u32 replay_rollover;
  148. u32 replay_timeout;
  149. u32 rx_err;
  150. u32 internal_ce_count;
  151. /* UE_NF info */
  152. u32 fc_timeout;
  153. u32 poison_tlp;
  154. u32 ecrc_err;
  155. u32 unsupported_req;
  156. u32 completer_abort;
  157. u32 completion_timeout;
  158. /* UE info */
  159. u32 addr;
  160. u8 index;
  161. /*
  162. * Flag to indicate specific event of PCIe
  163. * BIT(0): Power break (low power)
  164. * BIT(1) to BIT(7): Reserved
  165. */
  166. u8 flag;
  167. } __packed;
  168. static const char * const threshold_type_str[NUM_TEMP_LVL] = {
  169. [0] = "lower",
  170. [1] = "upper",
  171. [2] = "critical",
  172. };
  173. static void ras_msg_to_cpu(struct ras_data *msg)
  174. {
  175. struct sysbus1_syndrome *sysbus1_syndrome = (struct sysbus1_syndrome *)&msg->syndrome[0];
  176. struct sysbus2_syndrome *sysbus2_syndrome = (struct sysbus2_syndrome *)&msg->syndrome[0];
  177. struct soc_mem_syndrome *soc_syndrome = (struct soc_mem_syndrome *)&msg->syndrome[0];
  178. struct nsp_mem_syndrome *nsp_syndrome = (struct nsp_mem_syndrome *)&msg->syndrome[0];
  179. struct tsens_syndrome *tsens_syndrome = (struct tsens_syndrome *)&msg->syndrome[0];
  180. struct pcie_syndrome *pcie_syndrome = (struct pcie_syndrome *)&msg->syndrome[0];
  181. struct ddr_syndrome *ddr_syndrome = (struct ddr_syndrome *)&msg->syndrome[0];
  182. int i;
  183. le16_to_cpus(&msg->magic);
  184. le16_to_cpus(&msg->ver);
  185. le32_to_cpus(&msg->seq_num);
  186. le16_to_cpus(&msg->len);
  187. le32_to_cpus(&msg->result);
  188. le32_to_cpus(&msg->source);
  189. le32_to_cpus(&msg->err_type);
  190. le32_to_cpus(&msg->err_threshold);
  191. le32_to_cpus(&msg->ce_count);
  192. le32_to_cpus(&msg->ue_count);
  193. le32_to_cpus(&msg->intr_num);
  194. switch (msg->source) {
  195. case SOC_MEM:
  196. for (i = 0; i < 8; i++)
  197. le64_to_cpus(&soc_syndrome->error_address[i]);
  198. break;
  199. case PCIE:
  200. le32_to_cpus(&pcie_syndrome->bad_tlp);
  201. le32_to_cpus(&pcie_syndrome->bad_dllp);
  202. le32_to_cpus(&pcie_syndrome->replay_rollover);
  203. le32_to_cpus(&pcie_syndrome->replay_timeout);
  204. le32_to_cpus(&pcie_syndrome->rx_err);
  205. le32_to_cpus(&pcie_syndrome->internal_ce_count);
  206. le32_to_cpus(&pcie_syndrome->fc_timeout);
  207. le32_to_cpus(&pcie_syndrome->poison_tlp);
  208. le32_to_cpus(&pcie_syndrome->ecrc_err);
  209. le32_to_cpus(&pcie_syndrome->unsupported_req);
  210. le32_to_cpus(&pcie_syndrome->completer_abort);
  211. le32_to_cpus(&pcie_syndrome->completion_timeout);
  212. le32_to_cpus(&pcie_syndrome->addr);
  213. break;
  214. case DDR:
  215. le16_to_cpus(&ddr_syndrome->instance);
  216. le16_to_cpus(&ddr_syndrome->err_type);
  217. le32_to_cpus(&ddr_syndrome->count);
  218. le32_to_cpus(&ddr_syndrome->irq_status);
  219. le32_to_cpus(&ddr_syndrome->data_31_0[0]);
  220. le32_to_cpus(&ddr_syndrome->data_31_0[1]);
  221. le32_to_cpus(&ddr_syndrome->data_63_32[0]);
  222. le32_to_cpus(&ddr_syndrome->data_63_32[1]);
  223. le32_to_cpus(&ddr_syndrome->data_95_64[0]);
  224. le32_to_cpus(&ddr_syndrome->data_95_64[1]);
  225. le32_to_cpus(&ddr_syndrome->data_127_96[0]);
  226. le32_to_cpus(&ddr_syndrome->data_127_96[1]);
  227. le16_to_cpus(&ddr_syndrome->parity_bits);
  228. le16_to_cpus(&ddr_syndrome->addr_msb);
  229. le32_to_cpus(&ddr_syndrome->addr_lsb);
  230. break;
  231. case SYS_BUS1:
  232. le32_to_cpus(&sysbus1_syndrome->slave);
  233. le32_to_cpus(&sysbus1_syndrome->err_type);
  234. for (i = 0; i < 8; i++)
  235. le16_to_cpus(&sysbus1_syndrome->addr[i]);
  236. break;
  237. case SYS_BUS2:
  238. le16_to_cpus(&sysbus2_syndrome->op_type);
  239. le16_to_cpus(&sysbus2_syndrome->len);
  240. le16_to_cpus(&sysbus2_syndrome->redirect);
  241. le16_to_cpus(&sysbus2_syndrome->path);
  242. le32_to_cpus(&sysbus2_syndrome->ext_id);
  243. le32_to_cpus(&sysbus2_syndrome->lsb2);
  244. le32_to_cpus(&sysbus2_syndrome->msb2);
  245. le32_to_cpus(&sysbus2_syndrome->lsb3);
  246. le32_to_cpus(&sysbus2_syndrome->msb3);
  247. break;
  248. case NSP_MEM:
  249. for (i = 0; i < 8; i++)
  250. le32_to_cpus(&nsp_syndrome->error_address[i]);
  251. break;
  252. case TSENS:
  253. le32_to_cpus(&tsens_syndrome->threshold_type);
  254. le32_to_cpus(&tsens_syndrome->temp);
  255. break;
  256. }
  257. }
  258. static void decode_ras_msg(struct qaic_device *qdev, struct ras_data *msg)
  259. {
  260. struct sysbus1_syndrome *sysbus1_syndrome = (struct sysbus1_syndrome *)&msg->syndrome[0];
  261. struct sysbus2_syndrome *sysbus2_syndrome = (struct sysbus2_syndrome *)&msg->syndrome[0];
  262. struct soc_mem_syndrome *soc_syndrome = (struct soc_mem_syndrome *)&msg->syndrome[0];
  263. struct nsp_mem_syndrome *nsp_syndrome = (struct nsp_mem_syndrome *)&msg->syndrome[0];
  264. struct tsens_syndrome *tsens_syndrome = (struct tsens_syndrome *)&msg->syndrome[0];
  265. struct pcie_syndrome *pcie_syndrome = (struct pcie_syndrome *)&msg->syndrome[0];
  266. struct ddr_syndrome *ddr_syndrome = (struct ddr_syndrome *)&msg->syndrome[0];
  267. char *class;
  268. char *level;
  269. if (msg->magic != MAGIC) {
  270. pci_warn(qdev->pdev, "Dropping RAS message with invalid magic %x\n", msg->magic);
  271. return;
  272. }
  273. if (!msg->ver || msg->ver > VERSION) {
  274. pci_warn(qdev->pdev, "Dropping RAS message with invalid version %d\n", msg->ver);
  275. return;
  276. }
  277. if (msg->type != MSG_PUSH) {
  278. pci_warn(qdev->pdev, "Dropping non-PUSH RAS message\n");
  279. return;
  280. }
  281. if (msg->len != sizeof(*msg) - HDR_SZ) {
  282. pci_warn(qdev->pdev, "Dropping RAS message with invalid len %d\n", msg->len);
  283. return;
  284. }
  285. if (msg->err_type >= ERR_TYPE_MAX) {
  286. pci_warn(qdev->pdev, "Dropping RAS message with err type %d\n", msg->err_type);
  287. return;
  288. }
  289. if (msg->err_type == UE)
  290. level = KERN_ERR;
  291. else
  292. level = KERN_WARNING;
  293. switch (msg->source) {
  294. case SOC_MEM:
  295. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\nSyndrome:\n 0x%llx\n 0x%llx\n 0x%llx\n 0x%llx\n 0x%llx\n 0x%llx\n 0x%llx\n 0x%llx\n",
  296. err_class_str[msg->err_type],
  297. err_type_str[msg->err_type],
  298. "error from",
  299. err_src_str[msg->source],
  300. msg->err_threshold,
  301. soc_syndrome->error_address[0],
  302. soc_syndrome->error_address[1],
  303. soc_syndrome->error_address[2],
  304. soc_syndrome->error_address[3],
  305. soc_syndrome->error_address[4],
  306. soc_syndrome->error_address[5],
  307. soc_syndrome->error_address[6],
  308. soc_syndrome->error_address[7]);
  309. break;
  310. case PCIE:
  311. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\n",
  312. err_class_str[msg->err_type],
  313. err_type_str[msg->err_type],
  314. "error from",
  315. err_src_str[msg->source],
  316. msg->err_threshold);
  317. switch (msg->err_type) {
  318. case CE:
  319. /*
  320. * Modeled after AER prints. This continues the dev_printk() from a few
  321. * lines up. We reduce duplication of code, but also avoid re-printing the
  322. * PCI device info so that the end result looks uniform to the log user.
  323. */
  324. printk(KERN_WARNING pr_fmt("Syndrome:\n Bad TLP count %d\n Bad DLLP count %d\n Replay Rollover count %d\n Replay Timeout count %d\n Recv Error count %d\n Internal CE count %d\n"),
  325. pcie_syndrome->bad_tlp,
  326. pcie_syndrome->bad_dllp,
  327. pcie_syndrome->replay_rollover,
  328. pcie_syndrome->replay_timeout,
  329. pcie_syndrome->rx_err,
  330. pcie_syndrome->internal_ce_count);
  331. if (msg->ver > 0x1)
  332. pr_warn(" Power break %s\n",
  333. pcie_syndrome->flag & POWER_BREAK ? "ON" : "OFF");
  334. break;
  335. case UE:
  336. printk(KERN_ERR pr_fmt("Syndrome:\n Index %d\n Address 0x%x\n"),
  337. pcie_syndrome->index, pcie_syndrome->addr);
  338. break;
  339. case UE_NF:
  340. printk(KERN_WARNING pr_fmt("Syndrome:\n FC timeout count %d\n Poisoned TLP count %d\n ECRC error count %d\n Unsupported request count %d\n Completer abort count %d\n Completion timeout count %d\n"),
  341. pcie_syndrome->fc_timeout,
  342. pcie_syndrome->poison_tlp,
  343. pcie_syndrome->ecrc_err,
  344. pcie_syndrome->unsupported_req,
  345. pcie_syndrome->completer_abort,
  346. pcie_syndrome->completion_timeout);
  347. break;
  348. default:
  349. break;
  350. }
  351. break;
  352. case DDR:
  353. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\nSyndrome:\n Instance %d\n Count %d\n Data 31_0 0x%x 0x%x\n Data 63_32 0x%x 0x%x\n Data 95_64 0x%x 0x%x\n Data 127_96 0x%x 0x%x\n Parity bits 0x%x\n Address msb 0x%x\n Address lsb 0x%x\n",
  354. err_class_str[msg->err_type],
  355. err_type_str[msg->err_type],
  356. "error from",
  357. err_src_str[msg->source],
  358. msg->err_threshold,
  359. ddr_syndrome->instance,
  360. ddr_syndrome->count,
  361. ddr_syndrome->data_31_0[1],
  362. ddr_syndrome->data_31_0[0],
  363. ddr_syndrome->data_63_32[1],
  364. ddr_syndrome->data_63_32[0],
  365. ddr_syndrome->data_95_64[1],
  366. ddr_syndrome->data_95_64[0],
  367. ddr_syndrome->data_127_96[1],
  368. ddr_syndrome->data_127_96[0],
  369. ddr_syndrome->parity_bits,
  370. ddr_syndrome->addr_msb,
  371. ddr_syndrome->addr_lsb);
  372. break;
  373. case SYS_BUS1:
  374. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\nSyndrome:\n instance %d\n %s\n err_type %d\n address0 0x%x\n address1 0x%x\n address2 0x%x\n address3 0x%x\n address4 0x%x\n address5 0x%x\n address6 0x%x\n address7 0x%x\n",
  375. err_class_str[msg->err_type],
  376. err_type_str[msg->err_type],
  377. "error from",
  378. err_src_str[msg->source],
  379. msg->err_threshold,
  380. sysbus1_syndrome->instance,
  381. sysbus1_syndrome->slave ? "Slave" : "Master",
  382. sysbus1_syndrome->err_type,
  383. sysbus1_syndrome->addr[0],
  384. sysbus1_syndrome->addr[1],
  385. sysbus1_syndrome->addr[2],
  386. sysbus1_syndrome->addr[3],
  387. sysbus1_syndrome->addr[4],
  388. sysbus1_syndrome->addr[5],
  389. sysbus1_syndrome->addr[6],
  390. sysbus1_syndrome->addr[7]);
  391. break;
  392. case SYS_BUS2:
  393. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\nSyndrome:\n instance %d\n valid %d\n word error %d\n non-secure %d\n opc %d\n error code %d\n transaction type %d\n address space %d\n operation type %d\n len %d\n redirect %d\n path %d\n ext_id %d\n lsb2 %d\n msb2 %d\n lsb3 %d\n msb3 %d\n",
  394. err_class_str[msg->err_type],
  395. err_type_str[msg->err_type],
  396. "error from",
  397. err_src_str[msg->source],
  398. msg->err_threshold,
  399. sysbus2_syndrome->instance,
  400. sysbus2_syndrome->valid,
  401. sysbus2_syndrome->word_error,
  402. sysbus2_syndrome->non_secure,
  403. sysbus2_syndrome->opc,
  404. sysbus2_syndrome->error_code,
  405. sysbus2_syndrome->trans_type,
  406. sysbus2_syndrome->addr_space,
  407. sysbus2_syndrome->op_type,
  408. sysbus2_syndrome->len,
  409. sysbus2_syndrome->redirect,
  410. sysbus2_syndrome->path,
  411. sysbus2_syndrome->ext_id,
  412. sysbus2_syndrome->lsb2,
  413. sysbus2_syndrome->msb2,
  414. sysbus2_syndrome->lsb3,
  415. sysbus2_syndrome->msb3);
  416. break;
  417. case NSP_MEM:
  418. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\nSyndrome:\n NSP ID %d\n 0x%x\n 0x%x\n 0x%x\n 0x%x\n 0x%x\n 0x%x\n 0x%x\n 0x%x\n",
  419. err_class_str[msg->err_type],
  420. err_type_str[msg->err_type],
  421. "error from",
  422. err_src_str[msg->source],
  423. msg->err_threshold,
  424. nsp_syndrome->nsp_id,
  425. nsp_syndrome->error_address[0],
  426. nsp_syndrome->error_address[1],
  427. nsp_syndrome->error_address[2],
  428. nsp_syndrome->error_address[3],
  429. nsp_syndrome->error_address[4],
  430. nsp_syndrome->error_address[5],
  431. nsp_syndrome->error_address[6],
  432. nsp_syndrome->error_address[7]);
  433. break;
  434. case TSENS:
  435. if (tsens_syndrome->threshold_type >= NUM_TEMP_LVL) {
  436. pci_warn(qdev->pdev, "Dropping RAS message with invalid temp threshold %d\n",
  437. tsens_syndrome->threshold_type);
  438. break;
  439. }
  440. if (msg->err_type)
  441. class = "Fatal";
  442. else if (tsens_syndrome->threshold_type)
  443. class = "Critical";
  444. else
  445. class = "Warning";
  446. dev_printk(level, &qdev->pdev->dev, "RAS event.\nClass:%s\nDescription:%s %s %s\nError Threshold for this report %d\nSyndrome:\n %s threshold\n %d deg C\n",
  447. class,
  448. err_type_str[msg->err_type],
  449. "error from",
  450. err_src_str[msg->source],
  451. msg->err_threshold,
  452. threshold_type_str[tsens_syndrome->threshold_type],
  453. tsens_syndrome->temp);
  454. break;
  455. }
  456. /* Uncorrectable errors are fatal */
  457. if (msg->err_type == UE)
  458. mhi_soc_reset(qdev->mhi_cntrl);
  459. switch (msg->err_type) {
  460. case CE:
  461. if (qdev->ce_count != UINT_MAX)
  462. qdev->ce_count++;
  463. break;
  464. case UE:
  465. if (qdev->ce_count != UINT_MAX)
  466. qdev->ue_count++;
  467. break;
  468. case UE_NF:
  469. if (qdev->ce_count != UINT_MAX)
  470. qdev->ue_nf_count++;
  471. break;
  472. default:
  473. /* not possible */
  474. break;
  475. }
  476. }
  477. static ssize_t ce_count_show(struct device *dev, struct device_attribute *attr, char *buf)
  478. {
  479. struct qaic_device *qdev = pci_get_drvdata(to_pci_dev(dev));
  480. return sysfs_emit(buf, "%d\n", qdev->ce_count);
  481. }
  482. static ssize_t ue_count_show(struct device *dev, struct device_attribute *attr, char *buf)
  483. {
  484. struct qaic_device *qdev = pci_get_drvdata(to_pci_dev(dev));
  485. return sysfs_emit(buf, "%d\n", qdev->ue_count);
  486. }
  487. static ssize_t ue_nonfatal_count_show(struct device *dev, struct device_attribute *attr, char *buf)
  488. {
  489. struct qaic_device *qdev = pci_get_drvdata(to_pci_dev(dev));
  490. return sysfs_emit(buf, "%d\n", qdev->ue_nf_count);
  491. }
  492. static DEVICE_ATTR_RO(ce_count);
  493. static DEVICE_ATTR_RO(ue_count);
  494. static DEVICE_ATTR_RO(ue_nonfatal_count);
  495. static struct attribute *ras_attrs[] = {
  496. &dev_attr_ce_count.attr,
  497. &dev_attr_ue_count.attr,
  498. &dev_attr_ue_nonfatal_count.attr,
  499. NULL,
  500. };
  501. static struct attribute_group ras_group = {
  502. .attrs = ras_attrs,
  503. };
  504. static int qaic_ras_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_device_id *id)
  505. {
  506. struct qaic_device *qdev = pci_get_drvdata(to_pci_dev(mhi_dev->mhi_cntrl->cntrl_dev));
  507. struct ras_data *resp;
  508. int ret;
  509. ret = mhi_prepare_for_transfer(mhi_dev);
  510. if (ret)
  511. return ret;
  512. resp = kzalloc_obj(*resp);
  513. if (!resp) {
  514. mhi_unprepare_from_transfer(mhi_dev);
  515. return -ENOMEM;
  516. }
  517. ret = mhi_queue_buf(mhi_dev, DMA_FROM_DEVICE, resp, sizeof(*resp), MHI_EOT);
  518. if (ret) {
  519. kfree(resp);
  520. mhi_unprepare_from_transfer(mhi_dev);
  521. return ret;
  522. }
  523. ret = device_add_group(&qdev->pdev->dev, &ras_group);
  524. if (ret) {
  525. mhi_unprepare_from_transfer(mhi_dev);
  526. pci_dbg(qdev->pdev, "ras add sysfs failed %d\n", ret);
  527. return ret;
  528. }
  529. dev_set_drvdata(&mhi_dev->dev, qdev);
  530. qdev->ras_ch = mhi_dev;
  531. return ret;
  532. }
  533. static void qaic_ras_mhi_remove(struct mhi_device *mhi_dev)
  534. {
  535. struct qaic_device *qdev;
  536. qdev = dev_get_drvdata(&mhi_dev->dev);
  537. qdev->ras_ch = NULL;
  538. device_remove_group(&qdev->pdev->dev, &ras_group);
  539. mhi_unprepare_from_transfer(mhi_dev);
  540. }
  541. static void qaic_ras_mhi_ul_xfer_cb(struct mhi_device *mhi_dev, struct mhi_result *mhi_result) {}
  542. static void qaic_ras_mhi_dl_xfer_cb(struct mhi_device *mhi_dev, struct mhi_result *mhi_result)
  543. {
  544. struct qaic_device *qdev = dev_get_drvdata(&mhi_dev->dev);
  545. struct ras_data *msg = mhi_result->buf_addr;
  546. int ret;
  547. if (mhi_result->transaction_status) {
  548. kfree(msg);
  549. return;
  550. }
  551. ras_msg_to_cpu(msg);
  552. decode_ras_msg(qdev, msg);
  553. ret = mhi_queue_buf(qdev->ras_ch, DMA_FROM_DEVICE, msg, sizeof(*msg), MHI_EOT);
  554. if (ret) {
  555. dev_err(&mhi_dev->dev, "Cannot requeue RAS recv buf %d\n", ret);
  556. kfree(msg);
  557. }
  558. }
  559. static const struct mhi_device_id qaic_ras_mhi_match_table[] = {
  560. { .chan = "QAIC_STATUS", },
  561. {},
  562. };
  563. static struct mhi_driver qaic_ras_mhi_driver = {
  564. .id_table = qaic_ras_mhi_match_table,
  565. .remove = qaic_ras_mhi_remove,
  566. .probe = qaic_ras_mhi_probe,
  567. .ul_xfer_cb = qaic_ras_mhi_ul_xfer_cb,
  568. .dl_xfer_cb = qaic_ras_mhi_dl_xfer_cb,
  569. .driver = {
  570. .name = "qaic_ras",
  571. },
  572. };
  573. int qaic_ras_register(void)
  574. {
  575. return mhi_driver_register(&qaic_ras_mhi_driver);
  576. }
  577. void qaic_ras_unregister(void)
  578. {
  579. mhi_driver_unregister(&qaic_ras_mhi_driver);
  580. }