1
2
3
4
5
6
7#include <linux/slab.h>
8
9#include "ai-engine-internal.h"
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26ssize_t aie_part_read_cb_status(struct kobject *kobj, char *buffer,
27 ssize_t size)
28{
29 struct device *dev = container_of(kobj, struct device, kobj);
30 struct aie_partition *apart = dev_to_aiepart(dev);
31 struct aie_tile *atile = apart->atiles;
32 ssize_t len = 0;
33 size_t temp_size = AIE_SYSFS_CORE_STS_SIZE + AIE_SYSFS_CHAN_STS_SIZE +
34 AIE_SYSFS_ERROR_CATEGORY_SIZE +
35 AIE_SYSFS_LOCK_STS_SIZE;
36 char *cs_buf, *ds_buf, *es_buf, *ls_buf;
37 u32 index;
38
39 if (mutex_lock_interruptible(&apart->mlock)) {
40 dev_err(&apart->dev,
41 "Failed to acquire lock. Process was interrupted by fatal signals\n");
42 return len;
43 }
44
45 cs_buf = kmalloc(temp_size, GFP_KERNEL);
46 if (!cs_buf) {
47 mutex_unlock(&apart->mlock);
48 return len;
49 }
50
51 ds_buf = cs_buf + AIE_SYSFS_CORE_STS_SIZE;
52 es_buf = ds_buf + AIE_SYSFS_CHAN_STS_SIZE;
53 ls_buf = es_buf + AIE_SYSFS_ERROR_CATEGORY_SIZE;
54
55 for (index = 0; index < apart->range.size.col * apart->range.size.row;
56 index++, atile++) {
57 u32 cs = 0, ds = 0, es = 0, ls = 0;
58
59 cs = aie_sysfs_get_core_status(apart, &atile->loc, cs_buf,
60 AIE_SYSFS_CORE_STS_SIZE);
61 ds = aie_sysfs_get_dma_status(apart, &atile->loc, ds_buf,
62 AIE_SYSFS_CHAN_STS_SIZE);
63 es = aie_sysfs_get_errors(apart, &atile->loc, es_buf,
64 AIE_SYSFS_ERROR_CATEGORY_SIZE);
65 ls = aie_sysfs_get_lock_status(apart, &atile->loc, ls_buf,
66 AIE_SYSFS_LOCK_STS_SIZE);
67
68 if (!(cs || ds || es || ls))
69 continue;
70
71 len += scnprintf(&buffer[len], max(0L, size - len), "%d_%d: ",
72 atile->loc.col, atile->loc.row);
73
74 if (cs) {
75 len += scnprintf(&buffer[len], max(0L, size - len),
76 "cs: %s", cs_buf);
77 }
78
79 if (ds) {
80 len += scnprintf(&buffer[len], max(0L, size - len),
81 "%sds: %s", cs ?
82 DELIMITER_LEVEL2 : "", ds_buf);
83 }
84
85 if (es) {
86 len += scnprintf(&buffer[len], max(0L, size - len),
87 "%ses: %s", (cs || ds) ?
88 DELIMITER_LEVEL2 : "", es_buf);
89 }
90
91 if (ls) {
92 len += scnprintf(&buffer[len], max(0L, size - len),
93 "%sls: %s", (cs || ds || es) ?
94 DELIMITER_LEVEL2 : "", ls_buf);
95 }
96
97 len += scnprintf(&buffer[len], max(0L, size - len), "\n");
98 }
99
100 mutex_unlock(&apart->mlock);
101 kfree(cs_buf);
102 return len;
103}
104