[Intel-xe] [RFC PATCH 2/3] drm/xe : add rc6_residency in ms
Rodrigo Vivi
rodrigo.vivi at kernel.org
Thu May 4 15:57:38 UTC 2023
On Thu, May 04, 2023 at 06:55:48AM -0400, Gupta, Anshuman wrote:
>
>
> > -----Original Message-----
> > From: Tauro, Riana <riana.tauro at intel.com>
> > Sent: Wednesday, May 3, 2023 12:13 PM
> > To: intel-xe at lists.freedesktop.org
> > Cc: Tauro, Riana <riana.tauro at intel.com>; Gupta, Anshuman
> > <anshuman.gupta at intel.com>; Vivi, Rodrigo <rodrigo.vivi at intel.com>; Dixit,
> > Ashutosh <ashutosh.dixit at intel.com>; Nilawar, Badal
> > <badal.nilawar at intel.com>
> > Subject: [RFC PATCH 2/3] drm/xe : add rc6_residency in ms
> >
> > add rc6_residency in ms instead of rc6 residency counter.
> > Handle wrap around for the counter
> > The counter can still wrap as it relies on the frequency of counter being read
> >
> > Signed-off-by: Riana Tauro <riana.tauro at intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_idle.c | 46 +++++++++++++++++++++++++++++----
> > ---
> > 1 file changed, 37 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_idle.c b/drivers/gpu/drm/xe/xe_idle.c
> > index 231bdb45a6b7..a7e97ddd7253 100644
> > --- a/drivers/gpu/drm/xe/xe_idle.c
> > +++ b/drivers/gpu/drm/xe/xe_idle.c
> > @@ -11,6 +11,8 @@
> > #include "xe_idle.h"
> > #include "xe_mmio.h"
> >
> > +#define XE_RC6_MULTIPLIER 1280
> > +
> > /*
> > * Render-C States:
> > * ================
> > @@ -27,8 +29,7 @@
> > *
> > * device/gt#/gpu_idle/rc* *read-only* files:
> > * - rc_status: Provide the actual immediate status of Render-C: (rc0 or rc6)
> > - * - rc6_residency: Provide the rc6_residency in units of 1.28 uSec
> > - * Prone to overflows.
> > + * - rc6_residency_ms: Provide the rc6_residency in ms
> > */
> >
> > static struct xe_gt *idle_to_gt(struct xe_idle *idle) @@ -51,6 +52,35 @@
> > static struct kobj_type xe_idle_kobj_type = {
> > .sysfs_ops = &kobj_sysfs_ops,
> > };
> >
> > +static u64 rc6_residency_us(struct xe_idle *idle) {
> > + struct xe_gt *gt = idle_to_gt(idle);
> > + u64 cur_residency, delta, overflow_residency, prev_residency;
> > +
> > + overflow_residency = BIT_ULL(32);
> > + cur_residency = xe_mmio_read32(gt, GEN6_GT_GFX_RC6.reg);
> We shall use function pointer here to get the residency, so underlying function can read from
> appropriate counter and abstract it from sysfs show function, same comment for converting to
> ms as well.
Yes, please!
Leave this new component as clean and free from the 'RC' stuff as possible.
Leave all RC stuff inside xe_guc_pc and then this new infra is specific for
the report and control so you can make this as generic as possible and likely
extend to other stuff.
And contain the platform stuff to the lower level.
> Br,
> Anshuman Gupta.
> > +
> > + /*
> > + * Counter wrap handling
> > + * Store previous hw counter values for counter wrap-around
> > handling
> > + * Relying on sufficient frequency of queries otherwise counters can
> > still wrap.
> > + */
> > + prev_residency = idle->prev_rc6_residency;
> > + idle->prev_rc6_residency = cur_residency;
> > +
> > + /* RC6 delta */
> > + if (cur_residency >= prev_residency)
> > + delta = cur_residency - prev_residency;
> > + else
> > + delta = cur_residency + (overflow_residency -
> > prev_residency);
> > +
> > + /* Add delta to RC6 extended raw driver copy. */
> > + cur_residency = idle->cur_rc6_residency + delta;
> > + idle->cur_rc6_residency = cur_residency;
> > +
> > + return mul_u64_u32_div(cur_residency, XE_RC6_MULTIPLIER, 1000);
> > }
> > +
> > static ssize_t
> > rc_status_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
> > { @@ -76,11 +106,10 @@ static const struct kobj_attribute rc_status =
> > __ATTR(rc_status, 0444, rc_status_show, NULL);
> >
> > static ssize_t
> > -rc6_residency_show(struct kobject *kobj, struct kobj_attribute *attr, char
> > *buf)
> > +rc6_residency_ms_show(struct kobject *kobj, struct kobj_attribute
> > +*attr, char *buf)
> > {
> > struct xe_idle *idle = kobj_to_idle(kobj);
> > struct xe_gt *gt = idle_to_gt(idle);
> > - u32 reg;
> > ssize_t ret;
> >
> > xe_device_mem_access_get(gt_to_xe(gt));
> > @@ -88,8 +117,7 @@ rc6_residency_show(struct kobject *kobj, struct
> > kobj_attribute *attr, char *buf)
> > if (ret)
> > goto out;
> >
> > - reg = xe_mmio_read32(gt, GEN6_GT_GFX_RC6.reg);
> > - ret = sysfs_emit(buf, "%u\n", reg);
> > + ret = sysfs_emit(buf, "%llu\n",
> > +DIV_ROUND_UP_ULL(rc6_residency_us(>->idle), 1000));
> >
> > XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt),
> > XE_FORCEWAKE_ALL));
> > out:
> > @@ -97,12 +125,12 @@ rc6_residency_show(struct kobject *kobj, struct
> > kobj_attribute *attr, char *buf)
> > return ret;
> > }
> >
> > -static const struct kobj_attribute rc6_residency = -__ATTR(rc6_residency,
> > 0444, rc6_residency_show, NULL);
> > +static const struct kobj_attribute rc6_residency_ms =
> > +__ATTR(rc6_residency_ms, 0444, rc6_residency_ms_show, NULL);
> >
> > static const struct attribute *idle_attrs[] = {
> > &rc_status.attr,
> > - &rc6_residency.attr,
> > + &rc6_residency_ms.attr,
> > NULL,
> > };
> >
> > --
> > 2.40.0
>
More information about the Intel-xe
mailing list