diff options
Diffstat (limited to 'drivers/bus/arm-ccn.c')
-rw-r--r-- | drivers/bus/arm-ccn.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index 27fd0dacad5f..4d523cfe51ce 100644 --- a/drivers/bus/arm-ccn.c +++ b/drivers/bus/arm-ccn.c | |||
@@ -183,6 +183,7 @@ struct arm_ccn { | |||
183 | struct arm_ccn_component *xp; | 183 | struct arm_ccn_component *xp; |
184 | 184 | ||
185 | struct arm_ccn_dt dt; | 185 | struct arm_ccn_dt dt; |
186 | int mn_id; | ||
186 | }; | 187 | }; |
187 | 188 | ||
188 | 189 | ||
@@ -322,6 +323,7 @@ struct arm_ccn_pmu_event { | |||
322 | static ssize_t arm_ccn_pmu_event_show(struct device *dev, | 323 | static ssize_t arm_ccn_pmu_event_show(struct device *dev, |
323 | struct device_attribute *attr, char *buf) | 324 | struct device_attribute *attr, char *buf) |
324 | { | 325 | { |
326 | struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev)); | ||
325 | struct arm_ccn_pmu_event *event = container_of(attr, | 327 | struct arm_ccn_pmu_event *event = container_of(attr, |
326 | struct arm_ccn_pmu_event, attr); | 328 | struct arm_ccn_pmu_event, attr); |
327 | ssize_t res; | 329 | ssize_t res; |
@@ -336,6 +338,26 @@ static ssize_t arm_ccn_pmu_event_show(struct device *dev, | |||
336 | if (event->mask) | 338 | if (event->mask) |
337 | res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x", | 339 | res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x", |
338 | event->mask); | 340 | event->mask); |
341 | |||
342 | /* Arguments required by an event */ | ||
343 | switch (event->type) { | ||
344 | case CCN_TYPE_CYCLES: | ||
345 | break; | ||
346 | case CCN_TYPE_XP: | ||
347 | res += snprintf(buf + res, PAGE_SIZE - res, | ||
348 | ",xp=?,port=?,vc=?,dir=?"); | ||
349 | if (event->event == CCN_EVENT_WATCHPOINT) | ||
350 | res += snprintf(buf + res, PAGE_SIZE - res, | ||
351 | ",cmp_l=?,cmp_h=?,mask=?"); | ||
352 | break; | ||
353 | case CCN_TYPE_MN: | ||
354 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=%d", ccn->mn_id); | ||
355 | break; | ||
356 | default: | ||
357 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=?"); | ||
358 | break; | ||
359 | } | ||
360 | |||
339 | res += snprintf(buf + res, PAGE_SIZE - res, "\n"); | 361 | res += snprintf(buf + res, PAGE_SIZE - res, "\n"); |
340 | 362 | ||
341 | return res; | 363 | return res; |
@@ -360,9 +382,9 @@ static umode_t arm_ccn_pmu_events_is_visible(struct kobject *kobj, | |||
360 | } | 382 | } |
361 | 383 | ||
362 | static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { | 384 | static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { |
363 | CCN_EVENT_MN(eobarrier, "dir=0,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), | 385 | CCN_EVENT_MN(eobarrier, "dir=1,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), |
364 | CCN_EVENT_MN(ecbarrier, "dir=0,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), | 386 | CCN_EVENT_MN(ecbarrier, "dir=1,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), |
365 | CCN_EVENT_MN(dvmop, "dir=0,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), | 387 | CCN_EVENT_MN(dvmop, "dir=1,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), |
366 | CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), | 388 | CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), |
367 | CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), | 389 | CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), |
368 | CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), | 390 | CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), |
@@ -649,6 +671,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) | |||
649 | 671 | ||
650 | /* Validate node/xp vs topology */ | 672 | /* Validate node/xp vs topology */ |
651 | switch (type) { | 673 | switch (type) { |
674 | case CCN_TYPE_MN: | ||
675 | if (node_xp != ccn->mn_id) { | ||
676 | dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp); | ||
677 | return -EINVAL; | ||
678 | } | ||
679 | break; | ||
652 | case CCN_TYPE_XP: | 680 | case CCN_TYPE_XP: |
653 | if (node_xp >= ccn->num_xps) { | 681 | if (node_xp >= ccn->num_xps) { |
654 | dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); | 682 | dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); |
@@ -1214,6 +1242,8 @@ static int arm_ccn_init_nodes(struct arm_ccn *ccn, int region, | |||
1214 | 1242 | ||
1215 | switch (type) { | 1243 | switch (type) { |
1216 | case CCN_TYPE_MN: | 1244 | case CCN_TYPE_MN: |
1245 | ccn->mn_id = id; | ||
1246 | return 0; | ||
1217 | case CCN_TYPE_DT: | 1247 | case CCN_TYPE_DT: |
1218 | return 0; | 1248 | return 0; |
1219 | case CCN_TYPE_XP: | 1249 | case CCN_TYPE_XP: |