|
@@ -187,6 +187,7 @@ struct arm_ccn {
|
|
struct arm_ccn_component *xp;
|
|
struct arm_ccn_component *xp;
|
|
|
|
|
|
struct arm_ccn_dt dt;
|
|
struct arm_ccn_dt dt;
|
|
|
|
+ int mn_id;
|
|
};
|
|
};
|
|
|
|
|
|
static DEFINE_MUTEX(arm_ccn_mutex);
|
|
static DEFINE_MUTEX(arm_ccn_mutex);
|
|
@@ -328,6 +329,7 @@ struct arm_ccn_pmu_event {
|
|
static ssize_t arm_ccn_pmu_event_show(struct device *dev,
|
|
static ssize_t arm_ccn_pmu_event_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
{
|
|
|
|
+ struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev));
|
|
struct arm_ccn_pmu_event *event = container_of(attr,
|
|
struct arm_ccn_pmu_event *event = container_of(attr,
|
|
struct arm_ccn_pmu_event, attr);
|
|
struct arm_ccn_pmu_event, attr);
|
|
ssize_t res;
|
|
ssize_t res;
|
|
@@ -354,6 +356,9 @@ static ssize_t arm_ccn_pmu_event_show(struct device *dev,
|
|
res += snprintf(buf + res, PAGE_SIZE - res,
|
|
res += snprintf(buf + res, PAGE_SIZE - res,
|
|
",cmp_l=?,cmp_h=?,mask=?");
|
|
",cmp_l=?,cmp_h=?,mask=?");
|
|
break;
|
|
break;
|
|
|
|
+ case CCN_TYPE_MN:
|
|
|
|
+ res += snprintf(buf + res, PAGE_SIZE - res, ",node=%d", ccn->mn_id);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
res += snprintf(buf + res, PAGE_SIZE - res, ",node=?");
|
|
res += snprintf(buf + res, PAGE_SIZE - res, ",node=?");
|
|
break;
|
|
break;
|
|
@@ -383,9 +388,9 @@ static umode_t arm_ccn_pmu_events_is_visible(struct kobject *kobj,
|
|
}
|
|
}
|
|
|
|
|
|
static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = {
|
|
static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = {
|
|
- CCN_EVENT_MN(eobarrier, "dir=0,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE),
|
|
|
|
- CCN_EVENT_MN(ecbarrier, "dir=0,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE),
|
|
|
|
- CCN_EVENT_MN(dvmop, "dir=0,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE),
|
|
|
|
|
|
+ CCN_EVENT_MN(eobarrier, "dir=1,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE),
|
|
|
|
+ CCN_EVENT_MN(ecbarrier, "dir=1,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE),
|
|
|
|
+ CCN_EVENT_MN(dvmop, "dir=1,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE),
|
|
CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY),
|
|
CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY),
|
|
CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY),
|
|
CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY),
|
|
CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY),
|
|
CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY),
|
|
@@ -759,6 +764,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event)
|
|
|
|
|
|
/* Validate node/xp vs topology */
|
|
/* Validate node/xp vs topology */
|
|
switch (type) {
|
|
switch (type) {
|
|
|
|
+ case CCN_TYPE_MN:
|
|
|
|
+ if (node_xp != ccn->mn_id) {
|
|
|
|
+ dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp);
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
case CCN_TYPE_XP:
|
|
case CCN_TYPE_XP:
|
|
if (node_xp >= ccn->num_xps) {
|
|
if (node_xp >= ccn->num_xps) {
|
|
dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp);
|
|
dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp);
|
|
@@ -1361,6 +1372,8 @@ static int arm_ccn_init_nodes(struct arm_ccn *ccn, int region,
|
|
|
|
|
|
switch (type) {
|
|
switch (type) {
|
|
case CCN_TYPE_MN:
|
|
case CCN_TYPE_MN:
|
|
|
|
+ ccn->mn_id = id;
|
|
|
|
+ return 0;
|
|
case CCN_TYPE_DT:
|
|
case CCN_TYPE_DT:
|
|
return 0;
|
|
return 0;
|
|
case CCN_TYPE_XP:
|
|
case CCN_TYPE_XP:
|