|
@@ -132,49 +132,54 @@ __ATTR(_name, 0444, show_##_name, NULL)
|
|
|
|
|
|
#define to_cpc_desc(a) container_of(a, struct cpc_desc, kobj)
|
|
#define to_cpc_desc(a) container_of(a, struct cpc_desc, kobj)
|
|
|
|
|
|
|
|
+#define show_cppc_data(access_fn, struct_name, member_name) \
|
|
|
|
+ static ssize_t show_##member_name(struct kobject *kobj, \
|
|
|
|
+ struct attribute *attr, char *buf) \
|
|
|
|
+ { \
|
|
|
|
+ struct cpc_desc *cpc_ptr = to_cpc_desc(kobj); \
|
|
|
|
+ struct struct_name st_name = {0}; \
|
|
|
|
+ int ret; \
|
|
|
|
+ \
|
|
|
|
+ ret = access_fn(cpc_ptr->cpu_id, &st_name); \
|
|
|
|
+ if (ret) \
|
|
|
|
+ return ret; \
|
|
|
|
+ \
|
|
|
|
+ return scnprintf(buf, PAGE_SIZE, "%llu\n", \
|
|
|
|
+ (u64)st_name.member_name); \
|
|
|
|
+ } \
|
|
|
|
+ define_one_cppc_ro(member_name)
|
|
|
|
+
|
|
|
|
+show_cppc_data(cppc_get_perf_caps, cppc_perf_caps, highest_perf);
|
|
|
|
+show_cppc_data(cppc_get_perf_caps, cppc_perf_caps, lowest_perf);
|
|
|
|
+show_cppc_data(cppc_get_perf_caps, cppc_perf_caps, nominal_perf);
|
|
|
|
+show_cppc_data(cppc_get_perf_caps, cppc_perf_caps, lowest_nonlinear_perf);
|
|
|
|
+show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, reference_perf);
|
|
|
|
+show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, wraparound_time);
|
|
|
|
+
|
|
static ssize_t show_feedback_ctrs(struct kobject *kobj,
|
|
static ssize_t show_feedback_ctrs(struct kobject *kobj,
|
|
struct attribute *attr, char *buf)
|
|
struct attribute *attr, char *buf)
|
|
{
|
|
{
|
|
struct cpc_desc *cpc_ptr = to_cpc_desc(kobj);
|
|
struct cpc_desc *cpc_ptr = to_cpc_desc(kobj);
|
|
struct cppc_perf_fb_ctrs fb_ctrs = {0};
|
|
struct cppc_perf_fb_ctrs fb_ctrs = {0};
|
|
|
|
+ int ret;
|
|
|
|
|
|
- cppc_get_perf_ctrs(cpc_ptr->cpu_id, &fb_ctrs);
|
|
|
|
|
|
+ ret = cppc_get_perf_ctrs(cpc_ptr->cpu_id, &fb_ctrs);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
|
|
return scnprintf(buf, PAGE_SIZE, "ref:%llu del:%llu\n",
|
|
return scnprintf(buf, PAGE_SIZE, "ref:%llu del:%llu\n",
|
|
fb_ctrs.reference, fb_ctrs.delivered);
|
|
fb_ctrs.reference, fb_ctrs.delivered);
|
|
}
|
|
}
|
|
define_one_cppc_ro(feedback_ctrs);
|
|
define_one_cppc_ro(feedback_ctrs);
|
|
|
|
|
|
-static ssize_t show_reference_perf(struct kobject *kobj,
|
|
|
|
- struct attribute *attr, char *buf)
|
|
|
|
-{
|
|
|
|
- struct cpc_desc *cpc_ptr = to_cpc_desc(kobj);
|
|
|
|
- struct cppc_perf_fb_ctrs fb_ctrs = {0};
|
|
|
|
-
|
|
|
|
- cppc_get_perf_ctrs(cpc_ptr->cpu_id, &fb_ctrs);
|
|
|
|
-
|
|
|
|
- return scnprintf(buf, PAGE_SIZE, "%llu\n",
|
|
|
|
- fb_ctrs.reference_perf);
|
|
|
|
-}
|
|
|
|
-define_one_cppc_ro(reference_perf);
|
|
|
|
-
|
|
|
|
-static ssize_t show_wraparound_time(struct kobject *kobj,
|
|
|
|
- struct attribute *attr, char *buf)
|
|
|
|
-{
|
|
|
|
- struct cpc_desc *cpc_ptr = to_cpc_desc(kobj);
|
|
|
|
- struct cppc_perf_fb_ctrs fb_ctrs = {0};
|
|
|
|
-
|
|
|
|
- cppc_get_perf_ctrs(cpc_ptr->cpu_id, &fb_ctrs);
|
|
|
|
-
|
|
|
|
- return scnprintf(buf, PAGE_SIZE, "%llu\n", fb_ctrs.ctr_wrap_time);
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-define_one_cppc_ro(wraparound_time);
|
|
|
|
-
|
|
|
|
static struct attribute *cppc_attrs[] = {
|
|
static struct attribute *cppc_attrs[] = {
|
|
&feedback_ctrs.attr,
|
|
&feedback_ctrs.attr,
|
|
&reference_perf.attr,
|
|
&reference_perf.attr,
|
|
&wraparound_time.attr,
|
|
&wraparound_time.attr,
|
|
|
|
+ &highest_perf.attr,
|
|
|
|
+ &lowest_perf.attr,
|
|
|
|
+ &lowest_nonlinear_perf.attr,
|
|
|
|
+ &nominal_perf.attr,
|
|
NULL
|
|
NULL
|
|
};
|
|
};
|
|
|
|
|
|
@@ -1086,7 +1091,7 @@ int cppc_get_perf_ctrs(int cpunum, struct cppc_perf_fb_ctrs *perf_fb_ctrs)
|
|
perf_fb_ctrs->delivered = delivered;
|
|
perf_fb_ctrs->delivered = delivered;
|
|
perf_fb_ctrs->reference = reference;
|
|
perf_fb_ctrs->reference = reference;
|
|
perf_fb_ctrs->reference_perf = ref_perf;
|
|
perf_fb_ctrs->reference_perf = ref_perf;
|
|
- perf_fb_ctrs->ctr_wrap_time = ctr_wrap_time;
|
|
|
|
|
|
+ perf_fb_ctrs->wraparound_time = ctr_wrap_time;
|
|
out_err:
|
|
out_err:
|
|
if (regs_in_pcc)
|
|
if (regs_in_pcc)
|
|
up_write(&pcc_data.pcc_lock);
|
|
up_write(&pcc_data.pcc_lock);
|