|
@@ -148,6 +148,80 @@ static bool is_thresh_cmp_valid(u64 event)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static inline u64 isa207_find_source(u64 idx, u32 sub_idx)
|
|
|
+{
|
|
|
+ u64 ret = PERF_MEM_NA;
|
|
|
+
|
|
|
+ switch(idx) {
|
|
|
+ case 0:
|
|
|
+ /* Nothing to do */
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ ret = PH(LVL, L1);
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ ret = PH(LVL, L2);
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ ret = PH(LVL, L3);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ if (sub_idx <= 1)
|
|
|
+ ret = PH(LVL, LOC_RAM);
|
|
|
+ else if (sub_idx > 1 && sub_idx <= 2)
|
|
|
+ ret = PH(LVL, REM_RAM1);
|
|
|
+ else
|
|
|
+ ret = PH(LVL, REM_RAM2);
|
|
|
+ ret |= P(SNOOP, HIT);
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ ret = PH(LVL, REM_CCE1);
|
|
|
+ if ((sub_idx == 0) || (sub_idx == 2) || (sub_idx == 4))
|
|
|
+ ret |= P(SNOOP, HIT);
|
|
|
+ else if ((sub_idx == 1) || (sub_idx == 3) || (sub_idx == 5))
|
|
|
+ ret |= P(SNOOP, HITM);
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ ret = PH(LVL, REM_CCE2);
|
|
|
+ if ((sub_idx == 0) || (sub_idx == 2))
|
|
|
+ ret |= P(SNOOP, HIT);
|
|
|
+ else if ((sub_idx == 1) || (sub_idx == 3))
|
|
|
+ ret |= P(SNOOP, HITM);
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ ret = PM(LVL, L1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+void isa207_get_mem_data_src(union perf_mem_data_src *dsrc, u32 flags,
|
|
|
+ struct pt_regs *regs)
|
|
|
+{
|
|
|
+ u64 idx;
|
|
|
+ u32 sub_idx;
|
|
|
+ u64 sier;
|
|
|
+ u64 val;
|
|
|
+
|
|
|
+ /* Skip if no SIER support */
|
|
|
+ if (!(flags & PPMU_HAS_SIER)) {
|
|
|
+ dsrc->val = 0;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ sier = mfspr(SPRN_SIER);
|
|
|
+ val = (sier & ISA207_SIER_TYPE_MASK) >> ISA207_SIER_TYPE_SHIFT;
|
|
|
+ if (val == 1 || val == 2) {
|
|
|
+ idx = (sier & ISA207_SIER_LDST_MASK) >> ISA207_SIER_LDST_SHIFT;
|
|
|
+ sub_idx = (sier & ISA207_SIER_DATA_SRC_MASK) >> ISA207_SIER_DATA_SRC_SHIFT;
|
|
|
+
|
|
|
+ dsrc->val = isa207_find_source(idx, sub_idx);
|
|
|
+ dsrc->val |= (val == 1) ? P(OP, LOAD) : P(OP, STORE);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp)
|
|
|
{
|
|
|
unsigned int unit, pmc, cache, ebb;
|