* [v6] drm/xe: Add vram frequency sysfs attributes
@ 2023-12-22 11:06 Sujaritha Sundaresan
2023-12-22 14:04 ` Gupta, Anshuman
0 siblings, 1 reply; 9+ messages in thread
From: Sujaritha Sundaresan @ 2023-12-22 11:06 UTC (permalink / raw)
To: intel-xe; +Cc: Sujaritha Sundaresan, rodrigo.vivi
Add vram frequency sysfs attributes under the below hierarchy;
/device/tile#/memory/freq0
|-max_freq
|-min_freq
v2: Drop "vram" from attribute names (Rodrigo)
v3: Add documentation for new sysfs (Riana)
Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana)
v4: Create sysfs under tile#/freq0 after removal of
physical_memsize attrbute
v5: Revert back to creating sysfs under tile#/memory/freq0
Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo)
v6: Rename attributes to max/min_freq (Anshuman)
Fix review comments (Rodrigo)
Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com>
---
drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++
drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 ++++++++++++++++++++++++++++++
2 files changed, 93 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h b/drivers/gpu/drm/xe/xe_pcode_api.h
index 5935cfe30204..f153ce96f69a 100644
--- a/drivers/gpu/drm/xe/xe_pcode_api.h
+++ b/drivers/gpu/drm/xe/xe_pcode_api.h
@@ -42,6 +42,13 @@
#define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed point format */
#define POWER_SETUP_I1_DATA_MASK REG_GENMASK(15, 0)
+#define PCODE_FREQUENCY_CONFIG 0x6e
+/* Frequency Config Sub Commands (param1) */
+#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0
+#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1
+/* Domain IDs (param2) */
+#define PCODE_MBOX_DOMAIN_HBM 0x2
+
struct pcode_err_decode {
int errno;
const char *str;
diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c b/drivers/gpu/drm/xe/xe_tile_sysfs.c
index 0f8d3e7fce46..cdc9dbbc97b0 100644
--- a/drivers/gpu/drm/xe/xe_tile_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c
@@ -7,9 +7,21 @@
#include <linux/sysfs.h>
#include <drm/drm_managed.h>
+#include "xe_gt_types.h"
+#include "xe_pcode.h"
+#include "xe_pcode_api.h"
#include "xe_tile.h"
#include "xe_tile_sysfs.h"
+/**
+ * DOC: Xe Tile sysfs
+ *
+ * Provides sysfs entries for frequency in tile
+ *
+ * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a configuration and read-only.
+ * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a configuration and read-only.
+ */
+
static void xe_tile_sysfs_kobj_release(struct kobject *kobj)
{
kfree(kobj);
@@ -20,6 +32,65 @@ static const struct kobj_type xe_tile_sysfs_kobj_type = {
.sysfs_ops = &kobj_sysfs_ops,
};
+static ssize_t max_freq_show(struct device *kdev, struct device_attribute *attr,
+ char *buf)
+{
+ struct kobject *kobj = &kdev->kobj;
+ struct xe_tile *tile = kobj_to_tile(kobj->parent);
+ struct xe_gt *gt = tile->primary_gt;
+ u32 val, mbox;
+ int err;
+
+ mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, PCODE_FREQUENCY_CONFIG)
+ | REG_FIELD_PREP(PCODE_MB_PARAM1, PCODE_MBOX_FC_SC_READ_FUSED_P0)
+ | REG_FIELD_PREP(PCODE_MB_PARAM2, PCODE_MBOX_DOMAIN_HBM);
+
+ err = xe_pcode_read(gt, mbox, &val, NULL);
+ if (err)
+ return err;
+
+ /* data_out - Fused P0 for domain ID in units of 50 MHz */
+ val *= 50;
+
+ return sysfs_emit(buf, "%u\n", val);
+}
+static DEVICE_ATTR_RO(max_freq);
+
+static ssize_t min_freq_show(struct device *kdev, struct device_attribute *attr,
+ char *buf)
+{
+ struct kobject *kobj = &kdev->kobj;
+ struct xe_tile *tile = kobj_to_tile(kobj->parent);
+ struct xe_gt *gt = tile->primary_gt;
+ u32 val, mbox;
+ int err;
+
+ mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, PCODE_FREQUENCY_CONFIG)
+ | REG_FIELD_PREP(PCODE_MB_PARAM1, PCODE_MBOX_FC_SC_READ_FUSED_PN)
+ | REG_FIELD_PREP(PCODE_MB_PARAM2, PCODE_MBOX_DOMAIN_HBM);
+
+ err = xe_pcode_read(gt, mbox, &val, NULL);
+ if (err)
+ return err;
+
+ /* data_out - Fused Pn for domain ID in units of 50 MHz */
+ val *= 50;
+
+ return sysfs_emit(buf, "%u\n", val);
+}
+static DEVICE_ATTR_RO(min_freq);
+
+static struct attribute *freq_attrs[] = {
+ &dev_attr_max_freq.attr,
+ &dev_attr_min_freq.attr,
+ NULL
+};
+
+static const struct attribute_group freq_group_attrs = {
+ .name = "freq0",
+ .attrs = freq_attrs,
+};
+
static void tile_sysfs_fini(struct drm_device *drm, void *arg)
{
struct xe_tile *tile = arg;
@@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile)
struct xe_device *xe = tile_to_xe(tile);
struct device *dev = xe->drm.dev;
struct kobj_tile *kt;
+ struct kobject *kobj;
int err;
kt = kzalloc(sizeof(*kt), GFP_KERNEL);
@@ -50,6 +122,20 @@ void xe_tile_sysfs_init(struct xe_tile *tile)
tile->sysfs = &kt->base;
+ if (xe->info.platform == XE_PVC) {
+ kobj = kobject_create_and_add("memory", tile->sysfs);
+ if (!kobj)
+ drm_warn(&xe->drm, "failed to add memory directory, err: %d\n", -ENOMEM);
+ }
+
+ if (kobj && xe->info.platform == XE_PVC) {
+ err = sysfs_create_group(kobj, &freq_group_attrs);
+ if (err) {
+ drm_warn(&xe->drm, "failed to register vram freq sysfs, err: %d\n", err);
+ return;
+ }
+ }
+
err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile);
if (err)
drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, err: %d\n",
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* RE: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-22 11:06 [v6] drm/xe: Add vram frequency sysfs attributes Sujaritha Sundaresan @ 2023-12-22 14:04 ` Gupta, Anshuman 2023-12-26 4:32 ` Sundaresan, Sujaritha 0 siblings, 1 reply; 9+ messages in thread From: Gupta, Anshuman @ 2023-12-22 14:04 UTC (permalink / raw) To: Sundaresan, Sujaritha, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo > -----Original Message----- > From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> > Sent: Friday, December 22, 2023 4:37 PM > To: intel-xe@lists.freedesktop.org > Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman > <anshuman.gupta@intel.com>; Sundaresan, Sujaritha > <sujaritha.sundaresan@intel.com> > Subject: [v6] drm/xe: Add vram frequency sysfs attributes > > Add vram frequency sysfs attributes under the below hierarchy; > > /device/tile#/memory/freq0 > |-max_freq > |-min_freq > > v2: Drop "vram" from attribute names (Rodrigo) > > v3: Add documentation for new sysfs (Riana) > Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) > > v4: Create sysfs under tile#/freq0 after removal of > physical_memsize attrbute > > v5: Revert back to creating sysfs under tile#/memory/freq0 > Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) > > v6: Rename attributes to max/min_freq (Anshuman) > Fix review comments (Rodrigo) > > Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> > --- > drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ > drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 > ++++++++++++++++++++++++++++++ > 2 files changed, 93 insertions(+) > > diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h > b/drivers/gpu/drm/xe/xe_pcode_api.h > index 5935cfe30204..f153ce96f69a 100644 > --- a/drivers/gpu/drm/xe/xe_pcode_api.h > +++ b/drivers/gpu/drm/xe/xe_pcode_api.h > @@ -42,6 +42,13 @@ > #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed > point format */ > #define POWER_SETUP_I1_DATA_MASK > REG_GENMASK(15, 0) > > +#define PCODE_FREQUENCY_CONFIG 0x6e > +/* Frequency Config Sub Commands (param1) */ > +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 > +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 > +/* Domain IDs (param2) */ > +#define PCODE_MBOX_DOMAIN_HBM 0x2 > + > struct pcode_err_decode { > int errno; > const char *str; > diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c > b/drivers/gpu/drm/xe/xe_tile_sysfs.c > index 0f8d3e7fce46..cdc9dbbc97b0 100644 > --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c > +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c > @@ -7,9 +7,21 @@ > #include <linux/sysfs.h> > #include <drm/drm_managed.h> > > +#include "xe_gt_types.h" > +#include "xe_pcode.h" > +#include "xe_pcode_api.h" > #include "xe_tile.h" > #include "xe_tile_sysfs.h" > > +/** > + * DOC: Xe Tile sysfs > + * > + * Provides sysfs entries for frequency in tile > + * > + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a > configuration and read-only. Let's increase verbosity of doc something explaining it is a fixed fuse point not a configuration. > + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a > configuration and read-only. > + */ > + > static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { > kfree(kobj); > @@ -20,6 +32,65 @@ static const struct kobj_type xe_tile_sysfs_kobj_type = > { > .sysfs_ops = &kobj_sysfs_ops, > }; > > +static ssize_t max_freq_show(struct device *kdev, struct device_attribute > *attr, > + char *buf) > +{ > + struct kobject *kobj = &kdev->kobj; > + struct xe_tile *tile = kobj_to_tile(kobj->parent); > + struct xe_gt *gt = tile->primary_gt; > + u32 val, mbox; > + int err; > + > + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, > PCODE_FREQUENCY_CONFIG) > + | REG_FIELD_PREP(PCODE_MB_PARAM1, > PCODE_MBOX_FC_SC_READ_FUSED_P0) > + | REG_FIELD_PREP(PCODE_MB_PARAM2, > PCODE_MBOX_DOMAIN_HBM); > + > + err = xe_pcode_read(gt, mbox, &val, NULL); > + if (err) > + return err; > + > + /* data_out - Fused P0 for domain ID in units of 50 MHz */ > + val *= 50; > + > + return sysfs_emit(buf, "%u\n", val); > +} > +static DEVICE_ATTR_RO(max_freq); > + > +static ssize_t min_freq_show(struct device *kdev, struct device_attribute > *attr, > + char *buf) > +{ > + struct kobject *kobj = &kdev->kobj; > + struct xe_tile *tile = kobj_to_tile(kobj->parent); If you are missing to create a kobject for freq0 , then this should be kobj->parent->parent. > + struct xe_gt *gt = tile->primary_gt; > + u32 val, mbox; > + int err; > + > + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, > PCODE_FREQUENCY_CONFIG) > + | REG_FIELD_PREP(PCODE_MB_PARAM1, > PCODE_MBOX_FC_SC_READ_FUSED_PN) > + | REG_FIELD_PREP(PCODE_MB_PARAM2, > PCODE_MBOX_DOMAIN_HBM); > + > + err = xe_pcode_read(gt, mbox, &val, NULL); > + if (err) > + return err; > + > + /* data_out - Fused Pn for domain ID in units of 50 MHz */ > + val *= 50; > + > + return sysfs_emit(buf, "%u\n", val); > +} > +static DEVICE_ATTR_RO(min_freq); > + > +static struct attribute *freq_attrs[] = { > + &dev_attr_max_freq.attr, > + &dev_attr_min_freq.attr, > + NULL > +}; > + > +static const struct attribute_group freq_group_attrs = { > + .name = "freq0", > + .attrs = freq_attrs, > +}; > + > static void tile_sysfs_fini(struct drm_device *drm, void *arg) { > struct xe_tile *tile = arg; > @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) > struct xe_device *xe = tile_to_xe(tile); > struct device *dev = xe->drm.dev; > struct kobj_tile *kt; > + struct kobject *kobj; > int err; > > kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 @@ void > xe_tile_sysfs_init(struct xe_tile *tile) > > tile->sysfs = &kt->base; > > + if (xe->info.platform == XE_PVC) { > + kobj = kobject_create_and_add("memory", tile->sysfs); How freq0 is getting added, I am unable to see the freq0 kobject as per the path "device/tile#/memory/freq0/" > + if (!kobj) > + drm_warn(&xe->drm, "failed to add memory > directory, err: %d\n", -ENOMEM); > + } > + > + if (kobj && xe->info.platform == XE_PVC) { > + err = sysfs_create_group(kobj, &freq_group_attrs); > + if (err) { > + drm_warn(&xe->drm, "failed to register vram freq > sysfs, err: %d\n", err); > + return; > + } > + } Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? Have you made sure kmemleak won't complain here on memory leak ? Thanks, Anshuman Gupta. > + > err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); > if (err) > drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, > err: %d\n", > -- > 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-22 14:04 ` Gupta, Anshuman @ 2023-12-26 4:32 ` Sundaresan, Sujaritha 2023-12-26 14:28 ` Gupta, Anshuman 0 siblings, 1 reply; 9+ messages in thread From: Sundaresan, Sujaritha @ 2023-12-26 4:32 UTC (permalink / raw) To: Gupta, Anshuman, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: > >> -----Original Message----- >> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >> Sent: Friday, December 22, 2023 4:37 PM >> To: intel-xe@lists.freedesktop.org >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman >> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha >> <sujaritha.sundaresan@intel.com> >> Subject: [v6] drm/xe: Add vram frequency sysfs attributes >> >> Add vram frequency sysfs attributes under the below hierarchy; >> >> /device/tile#/memory/freq0 >> |-max_freq >> |-min_freq >> >> v2: Drop "vram" from attribute names (Rodrigo) >> >> v3: Add documentation for new sysfs (Riana) >> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) >> >> v4: Create sysfs under tile#/freq0 after removal of >> physical_memsize attrbute >> >> v5: Revert back to creating sysfs under tile#/memory/freq0 >> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) >> >> v6: Rename attributes to max/min_freq (Anshuman) >> Fix review comments (Rodrigo) >> >> Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> >> --- >> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ >> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 >> ++++++++++++++++++++++++++++++ >> 2 files changed, 93 insertions(+) >> >> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h >> b/drivers/gpu/drm/xe/xe_pcode_api.h >> index 5935cfe30204..f153ce96f69a 100644 >> --- a/drivers/gpu/drm/xe/xe_pcode_api.h >> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h >> @@ -42,6 +42,13 @@ >> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed >> point format */ >> #define POWER_SETUP_I1_DATA_MASK >> REG_GENMASK(15, 0) >> >> +#define PCODE_FREQUENCY_CONFIG 0x6e >> +/* Frequency Config Sub Commands (param1) */ >> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 >> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 >> +/* Domain IDs (param2) */ >> +#define PCODE_MBOX_DOMAIN_HBM 0x2 >> + >> struct pcode_err_decode { >> int errno; >> const char *str; >> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c >> b/drivers/gpu/drm/xe/xe_tile_sysfs.c >> index 0f8d3e7fce46..cdc9dbbc97b0 100644 >> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c >> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c >> @@ -7,9 +7,21 @@ >> #include <linux/sysfs.h> >> #include <drm/drm_managed.h> >> >> +#include "xe_gt_types.h" >> +#include "xe_pcode.h" >> +#include "xe_pcode_api.h" >> #include "xe_tile.h" >> #include "xe_tile_sysfs.h" >> >> +/** >> + * DOC: Xe Tile sysfs >> + * >> + * Provides sysfs entries for frequency in tile >> + * >> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a >> configuration and read-only. > Let's increase verbosity of doc something explaining it is a fixed fuse point not a configuration. Sure >> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a >> configuration and read-only. >> + */ >> + >> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { >> kfree(kobj); >> @@ -20,6 +32,65 @@ static const struct kobj_type xe_tile_sysfs_kobj_type = >> { >> .sysfs_ops = &kobj_sysfs_ops, >> }; >> >> +static ssize_t max_freq_show(struct device *kdev, struct device_attribute >> *attr, >> + char *buf) >> +{ >> + struct kobject *kobj = &kdev->kobj; >> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >> + struct xe_gt *gt = tile->primary_gt; >> + u32 val, mbox; >> + int err; >> + >> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >> PCODE_FREQUENCY_CONFIG) >> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >> PCODE_MBOX_FC_SC_READ_FUSED_P0) >> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >> PCODE_MBOX_DOMAIN_HBM); >> + >> + err = xe_pcode_read(gt, mbox, &val, NULL); >> + if (err) >> + return err; >> + >> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ >> + val *= 50; >> + >> + return sysfs_emit(buf, "%u\n", val); >> +} >> +static DEVICE_ATTR_RO(max_freq); >> + >> +static ssize_t min_freq_show(struct device *kdev, struct device_attribute >> *attr, >> + char *buf) >> +{ >> + struct kobject *kobj = &kdev->kobj; >> + struct xe_tile *tile = kobj_to_tile(kobj->parent); > If you are missing to create a kobject for freq0 , then this should be > kobj->parent->parent. I don't think a kobject is needed for freq0, since it we are only using attribute_group for it. Similar to throttle_reasons. >> + struct xe_gt *gt = tile->primary_gt; >> + u32 val, mbox; >> + int err; >> + >> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >> PCODE_FREQUENCY_CONFIG) >> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >> PCODE_MBOX_FC_SC_READ_FUSED_PN) >> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >> PCODE_MBOX_DOMAIN_HBM); >> + >> + err = xe_pcode_read(gt, mbox, &val, NULL); >> + if (err) >> + return err; >> + >> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ >> + val *= 50; >> + >> + return sysfs_emit(buf, "%u\n", val); >> +} >> +static DEVICE_ATTR_RO(min_freq); >> + >> +static struct attribute *freq_attrs[] = { >> + &dev_attr_max_freq.attr, >> + &dev_attr_min_freq.attr, >> + NULL >> +}; >> + >> +static const struct attribute_group freq_group_attrs = { >> + .name = "freq0", >> + .attrs = freq_attrs, >> +}; >> + >> static void tile_sysfs_fini(struct drm_device *drm, void *arg) { >> struct xe_tile *tile = arg; >> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) >> struct xe_device *xe = tile_to_xe(tile); >> struct device *dev = xe->drm.dev; >> struct kobj_tile *kt; >> + struct kobject *kobj; >> int err; >> >> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 @@ void >> xe_tile_sysfs_init(struct xe_tile *tile) >> >> tile->sysfs = &kt->base; >> >> + if (xe->info.platform == XE_PVC) { >> + kobj = kobject_create_and_add("memory", tile->sysfs); > How freq0 is getting added, I am unable to see the freq0 kobject as per the path "device/tile#/memory/freq0/" freq0 is being added as an attribute group. It is similar to the throttle_reasons implementation. >> + if (!kobj) >> + drm_warn(&xe->drm, "failed to add memory >> directory, err: %d\n", -ENOMEM); >> + } >> + >> + if (kobj && xe->info.platform == XE_PVC) { >> + err = sysfs_create_group(kobj, &freq_group_attrs); >> + if (err) { >> + drm_warn(&xe->drm, "failed to register vram freq >> sysfs, err: %d\n", err); >> + return; >> + } >> + } > Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? > Have you made sure kmemleak won't complain here on memory leak ? > > Thanks, > Anshuman Gupta. I have already checked for mem leaks during the cleanup. The kobject_put is not needed. Thanks, Suja >> + >> err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); >> if (err) >> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, >> err: %d\n", >> -- >> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-26 4:32 ` Sundaresan, Sujaritha @ 2023-12-26 14:28 ` Gupta, Anshuman 2023-12-27 9:31 ` Sundaresan, Sujaritha 0 siblings, 1 reply; 9+ messages in thread From: Gupta, Anshuman @ 2023-12-26 14:28 UTC (permalink / raw) To: Sundaresan, Sujaritha, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo > -----Original Message----- > From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> > Sent: Tuesday, December 26, 2023 10:02 AM > To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- > xe@lists.freedesktop.org > Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> > Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes > > > On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: > > > >> -----Original Message----- > >> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> > >> Sent: Friday, December 22, 2023 4:37 PM > >> To: intel-xe@lists.freedesktop.org > >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman > >> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha > >> <sujaritha.sundaresan@intel.com> > >> Subject: [v6] drm/xe: Add vram frequency sysfs attributes > >> > >> Add vram frequency sysfs attributes under the below hierarchy; > >> > >> /device/tile#/memory/freq0 > >> |-max_freq > >> |-min_freq > >> > >> v2: Drop "vram" from attribute names (Rodrigo) > >> > >> v3: Add documentation for new sysfs (Riana) > >> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) > >> > >> v4: Create sysfs under tile#/freq0 after removal of > >> physical_memsize attrbute > >> > >> v5: Revert back to creating sysfs under tile#/memory/freq0 > >> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) > >> > >> v6: Rename attributes to max/min_freq (Anshuman) > >> Fix review comments (Rodrigo) > >> > >> Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> > >> --- > >> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ > >> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 > >> ++++++++++++++++++++++++++++++ > >> 2 files changed, 93 insertions(+) > >> > >> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h > >> b/drivers/gpu/drm/xe/xe_pcode_api.h > >> index 5935cfe30204..f153ce96f69a 100644 > >> --- a/drivers/gpu/drm/xe/xe_pcode_api.h > >> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h > >> @@ -42,6 +42,13 @@ > >> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed > >> point format */ > >> #define POWER_SETUP_I1_DATA_MASK > >> REG_GENMASK(15, 0) > >> > >> +#define PCODE_FREQUENCY_CONFIG 0x6e > >> +/* Frequency Config Sub Commands (param1) */ > >> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 > >> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 > >> +/* Domain IDs (param2) */ > >> +#define PCODE_MBOX_DOMAIN_HBM 0x2 > >> + > >> struct pcode_err_decode { > >> int errno; > >> const char *str; > >> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c > >> b/drivers/gpu/drm/xe/xe_tile_sysfs.c > >> index 0f8d3e7fce46..cdc9dbbc97b0 100644 > >> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c > >> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c > >> @@ -7,9 +7,21 @@ > >> #include <linux/sysfs.h> > >> #include <drm/drm_managed.h> > >> > >> +#include "xe_gt_types.h" > >> +#include "xe_pcode.h" > >> +#include "xe_pcode_api.h" > >> #include "xe_tile.h" > >> #include "xe_tile_sysfs.h" > >> > >> +/** > >> + * DOC: Xe Tile sysfs > >> + * > >> + * Provides sysfs entries for frequency in tile > >> + * > >> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a > >> configuration and read-only. > > Let's increase verbosity of doc something explaining it is a fixed fuse point not a > configuration. > Sure > >> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a > >> configuration and read-only. > >> + */ > >> + > >> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { > >> kfree(kobj); > >> @@ -20,6 +32,65 @@ static const struct kobj_type > >> xe_tile_sysfs_kobj_type = { > >> .sysfs_ops = &kobj_sysfs_ops, > >> }; > >> > >> +static ssize_t max_freq_show(struct device *kdev, struct > >> +device_attribute > >> *attr, > >> + char *buf) > >> +{ > >> + struct kobject *kobj = &kdev->kobj; > >> + struct xe_tile *tile = kobj_to_tile(kobj->parent); > >> + struct xe_gt *gt = tile->primary_gt; > >> + u32 val, mbox; > >> + int err; > >> + > >> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, > >> PCODE_FREQUENCY_CONFIG) > >> + | REG_FIELD_PREP(PCODE_MB_PARAM1, > >> PCODE_MBOX_FC_SC_READ_FUSED_P0) > >> + | REG_FIELD_PREP(PCODE_MB_PARAM2, > >> PCODE_MBOX_DOMAIN_HBM); > >> + > >> + err = xe_pcode_read(gt, mbox, &val, NULL); > >> + if (err) > >> + return err; > >> + > >> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ > >> + val *= 50; > >> + > >> + return sysfs_emit(buf, "%u\n", val); } static > >> +DEVICE_ATTR_RO(max_freq); > >> + > >> +static ssize_t min_freq_show(struct device *kdev, struct > >> +device_attribute > >> *attr, > >> + char *buf) > >> +{ > >> + struct kobject *kobj = &kdev->kobj; > >> + struct xe_tile *tile = kobj_to_tile(kobj->parent); > > If you are missing to create a kobject for freq0 , then this should be > > kobj->parent->parent. > > I don't think a kobject is needed for freq0, since it we are only using > attribute_group for it. > > Similar to throttle_reasons. Sure, thanks for explanation. > > >> + struct xe_gt *gt = tile->primary_gt; > >> + u32 val, mbox; > >> + int err; > >> + > >> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, > >> PCODE_FREQUENCY_CONFIG) > >> + | REG_FIELD_PREP(PCODE_MB_PARAM1, > >> PCODE_MBOX_FC_SC_READ_FUSED_PN) > >> + | REG_FIELD_PREP(PCODE_MB_PARAM2, > >> PCODE_MBOX_DOMAIN_HBM); > >> + > >> + err = xe_pcode_read(gt, mbox, &val, NULL); > >> + if (err) > >> + return err; > >> + > >> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ > >> + val *= 50; > >> + > >> + return sysfs_emit(buf, "%u\n", val); } static > >> +DEVICE_ATTR_RO(min_freq); > >> + > >> +static struct attribute *freq_attrs[] = { > >> + &dev_attr_max_freq.attr, > >> + &dev_attr_min_freq.attr, > >> + NULL > >> +}; > >> + > >> +static const struct attribute_group freq_group_attrs = { > >> + .name = "freq0", > >> + .attrs = freq_attrs, > >> +}; > >> + > >> static void tile_sysfs_fini(struct drm_device *drm, void *arg) { > >> struct xe_tile *tile = arg; > >> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) > >> struct xe_device *xe = tile_to_xe(tile); > >> struct device *dev = xe->drm.dev; > >> struct kobj_tile *kt; > >> + struct kobject *kobj; > >> int err; > >> > >> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 @@ void > >> xe_tile_sysfs_init(struct xe_tile *tile) > >> > >> tile->sysfs = &kt->base; > >> > >> + if (xe->info.platform == XE_PVC) { > >> + kobj = kobject_create_and_add("memory", tile->sysfs); > > How freq0 is getting added, I am unable to see the freq0 kobject as per the path > "device/tile#/memory/freq0/" > freq0 is being added as an attribute group. It is similar to the throttle_reasons > implementation. > >> + if (!kobj) > >> + drm_warn(&xe->drm, "failed to add memory > >> directory, err: %d\n", -ENOMEM); > >> + } > >> + > >> + if (kobj && xe->info.platform == XE_PVC) { > >> + err = sysfs_create_group(kobj, &freq_group_attrs); > >> + if (err) { > >> + drm_warn(&xe->drm, "failed to register vram freq > >> sysfs, err: %d\n", err); > >> + return; > >> + } > >> + } > > Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? > > Have you made sure kmemleak won't complain here on memory leak ? Check the kobject_release() , this will only get call , when all ref count of that kobj is being put. Here you are creating a object and it will never be released. Also we need to call the sysfs_remove_group() as well in fini function ? Thanks, Anshuman. > > > > Thanks, > > Anshuman Gupta. > > I have already checked for mem leaks during the cleanup. The kobject_put is not > needed. > > Thanks, > > Suja > > >> + > >> err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); > >> if (err) > >> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, > >> err: %d\n", > >> -- > >> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-26 14:28 ` Gupta, Anshuman @ 2023-12-27 9:31 ` Sundaresan, Sujaritha 2023-12-27 10:56 ` Gupta, Anshuman 0 siblings, 1 reply; 9+ messages in thread From: Sundaresan, Sujaritha @ 2023-12-27 9:31 UTC (permalink / raw) To: Gupta, Anshuman, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo On 12/26/2023 7:58 PM, Gupta, Anshuman wrote: > >> -----Original Message----- >> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >> Sent: Tuesday, December 26, 2023 10:02 AM >> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >> xe@lists.freedesktop.org >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >> >> >> On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: >>>> -----Original Message----- >>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>> Sent: Friday, December 22, 2023 4:37 PM >>>> To: intel-xe@lists.freedesktop.org >>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman >>>> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha >>>> <sujaritha.sundaresan@intel.com> >>>> Subject: [v6] drm/xe: Add vram frequency sysfs attributes >>>> >>>> Add vram frequency sysfs attributes under the below hierarchy; >>>> >>>> /device/tile#/memory/freq0 >>>> |-max_freq >>>> |-min_freq >>>> >>>> v2: Drop "vram" from attribute names (Rodrigo) >>>> >>>> v3: Add documentation for new sysfs (Riana) >>>> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) >>>> >>>> v4: Create sysfs under tile#/freq0 after removal of >>>> physical_memsize attrbute >>>> >>>> v5: Revert back to creating sysfs under tile#/memory/freq0 >>>> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) >>>> >>>> v6: Rename attributes to max/min_freq (Anshuman) >>>> Fix review comments (Rodrigo) >>>> >>>> Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com> >>>> --- >>>> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ >>>> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 >>>> ++++++++++++++++++++++++++++++ >>>> 2 files changed, 93 insertions(+) >>>> >>>> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h >>>> b/drivers/gpu/drm/xe/xe_pcode_api.h >>>> index 5935cfe30204..f153ce96f69a 100644 >>>> --- a/drivers/gpu/drm/xe/xe_pcode_api.h >>>> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h >>>> @@ -42,6 +42,13 @@ >>>> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed >>>> point format */ >>>> #define POWER_SETUP_I1_DATA_MASK >>>> REG_GENMASK(15, 0) >>>> >>>> +#define PCODE_FREQUENCY_CONFIG 0x6e >>>> +/* Frequency Config Sub Commands (param1) */ >>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 >>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 >>>> +/* Domain IDs (param2) */ >>>> +#define PCODE_MBOX_DOMAIN_HBM 0x2 >>>> + >>>> struct pcode_err_decode { >>>> int errno; >>>> const char *str; >>>> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>> b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>> index 0f8d3e7fce46..cdc9dbbc97b0 100644 >>>> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>> @@ -7,9 +7,21 @@ >>>> #include <linux/sysfs.h> >>>> #include <drm/drm_managed.h> >>>> >>>> +#include "xe_gt_types.h" >>>> +#include "xe_pcode.h" >>>> +#include "xe_pcode_api.h" >>>> #include "xe_tile.h" >>>> #include "xe_tile_sysfs.h" >>>> >>>> +/** >>>> + * DOC: Xe Tile sysfs >>>> + * >>>> + * Provides sysfs entries for frequency in tile >>>> + * >>>> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a >>>> configuration and read-only. >>> Let's increase verbosity of doc something explaining it is a fixed fuse point not a >> configuration. >> Sure >>>> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a >>>> configuration and read-only. >>>> + */ >>>> + >>>> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { >>>> kfree(kobj); >>>> @@ -20,6 +32,65 @@ static const struct kobj_type >>>> xe_tile_sysfs_kobj_type = { >>>> .sysfs_ops = &kobj_sysfs_ops, >>>> }; >>>> >>>> +static ssize_t max_freq_show(struct device *kdev, struct >>>> +device_attribute >>>> *attr, >>>> + char *buf) >>>> +{ >>>> + struct kobject *kobj = &kdev->kobj; >>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>> + struct xe_gt *gt = tile->primary_gt; >>>> + u32 val, mbox; >>>> + int err; >>>> + >>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>> PCODE_FREQUENCY_CONFIG) >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>> PCODE_MBOX_FC_SC_READ_FUSED_P0) >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>> PCODE_MBOX_DOMAIN_HBM); >>>> + >>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>> + if (err) >>>> + return err; >>>> + >>>> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ >>>> + val *= 50; >>>> + >>>> + return sysfs_emit(buf, "%u\n", val); } static >>>> +DEVICE_ATTR_RO(max_freq); >>>> + >>>> +static ssize_t min_freq_show(struct device *kdev, struct >>>> +device_attribute >>>> *attr, >>>> + char *buf) >>>> +{ >>>> + struct kobject *kobj = &kdev->kobj; >>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>> If you are missing to create a kobject for freq0 , then this should be >>> kobj->parent->parent. >> I don't think a kobject is needed for freq0, since it we are only using >> attribute_group for it. >> >> Similar to throttle_reasons. > Sure, thanks for explanation. >>>> + struct xe_gt *gt = tile->primary_gt; >>>> + u32 val, mbox; >>>> + int err; >>>> + >>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>> PCODE_FREQUENCY_CONFIG) >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>> PCODE_MBOX_FC_SC_READ_FUSED_PN) >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>> PCODE_MBOX_DOMAIN_HBM); >>>> + >>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>> + if (err) >>>> + return err; >>>> + >>>> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ >>>> + val *= 50; >>>> + >>>> + return sysfs_emit(buf, "%u\n", val); } static >>>> +DEVICE_ATTR_RO(min_freq); >>>> + >>>> +static struct attribute *freq_attrs[] = { >>>> + &dev_attr_max_freq.attr, >>>> + &dev_attr_min_freq.attr, >>>> + NULL >>>> +}; >>>> + >>>> +static const struct attribute_group freq_group_attrs = { >>>> + .name = "freq0", >>>> + .attrs = freq_attrs, >>>> +}; >>>> + >>>> static void tile_sysfs_fini(struct drm_device *drm, void *arg) { >>>> struct xe_tile *tile = arg; >>>> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) >>>> struct xe_device *xe = tile_to_xe(tile); >>>> struct device *dev = xe->drm.dev; >>>> struct kobj_tile *kt; >>>> + struct kobject *kobj; >>>> int err; >>>> >>>> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 @@ void >>>> xe_tile_sysfs_init(struct xe_tile *tile) >>>> >>>> tile->sysfs = &kt->base; >>>> >>>> + if (xe->info.platform == XE_PVC) { >>>> + kobj = kobject_create_and_add("memory", tile->sysfs); >>> How freq0 is getting added, I am unable to see the freq0 kobject as per the path >> "device/tile#/memory/freq0/" >> freq0 is being added as an attribute group. It is similar to the throttle_reasons >> implementation. >>>> + if (!kobj) >>>> + drm_warn(&xe->drm, "failed to add memory >>>> directory, err: %d\n", -ENOMEM); >>>> + } >>>> + >>>> + if (kobj && xe->info.platform == XE_PVC) { >>>> + err = sysfs_create_group(kobj, &freq_group_attrs); >>>> + if (err) { >>>> + drm_warn(&xe->drm, "failed to register vram freq >>>> sysfs, err: %d\n", err); >>>> + return; >>>> + } >>>> + } >>> Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? >>> Have you made sure kmemleak won't complain here on memory leak ? > Check the kobject_release() , this will only get call , when all ref count of that kobj is being put. > Here you are creating a object and it will never be released. > Also we need to call the sysfs_remove_group() as well in fini function ? > > Thanks, > Anshuman. This is a bit of unique case. In this file we have two issues that keeps us from cleaning up like others. One, we need to cleanup the base tile directory here. And second, we are creating the kobject only for PVC. If we add the "memory" kobject cleanup to fini, we will be defining tile using kobj. This is causing an error on unload, despite adding platform conditions on fini. After testing multiple iterations of the fini function, this was the cleanest way with no errors that worked across platforms. If needed, the only way to accommodate the kobject_put(kobj) and the sysfs_remove_group is to move the vram sysfs creation to a separate file, similar to throttle_reasons and gt_freq. Thanks, Suja > >>> Thanks, >>> Anshuman Gupta. >> I have already checked for mem leaks during the cleanup. The kobject_put is not >> needed. >> >> Thanks, >> >> Suja >> >>>> + >>>> err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); >>>> if (err) >>>> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, >>>> err: %d\n", >>>> -- >>>> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-27 9:31 ` Sundaresan, Sujaritha @ 2023-12-27 10:56 ` Gupta, Anshuman 2023-12-27 12:18 ` Sundaresan, Sujaritha 0 siblings, 1 reply; 9+ messages in thread From: Gupta, Anshuman @ 2023-12-27 10:56 UTC (permalink / raw) To: Sundaresan, Sujaritha, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo > -----Original Message----- > From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> > Sent: Wednesday, December 27, 2023 3:01 PM > To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- > xe@lists.freedesktop.org > Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> > Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes > > > On 12/26/2023 7:58 PM, Gupta, Anshuman wrote: > > > >> -----Original Message----- > >> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> > >> Sent: Tuesday, December 26, 2023 10:02 AM > >> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- > >> xe@lists.freedesktop.org > >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> > >> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes > >> > >> > >> On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: > >>>> -----Original Message----- > >>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> > >>>> Sent: Friday, December 22, 2023 4:37 PM > >>>> To: intel-xe@lists.freedesktop.org > >>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman > >>>> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha > >>>> <sujaritha.sundaresan@intel.com> > >>>> Subject: [v6] drm/xe: Add vram frequency sysfs attributes > >>>> > >>>> Add vram frequency sysfs attributes under the below hierarchy; > >>>> > >>>> /device/tile#/memory/freq0 > >>>> |-max_freq > >>>> |-min_freq > >>>> > >>>> v2: Drop "vram" from attribute names (Rodrigo) > >>>> > >>>> v3: Add documentation for new sysfs (Riana) > >>>> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) > >>>> > >>>> v4: Create sysfs under tile#/freq0 after removal of > >>>> physical_memsize attrbute > >>>> > >>>> v5: Revert back to creating sysfs under tile#/memory/freq0 > >>>> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) > >>>> > >>>> v6: Rename attributes to max/min_freq (Anshuman) > >>>> Fix review comments (Rodrigo) > >>>> > >>>> Signed-off-by: Sujaritha Sundaresan > >>>> <sujaritha.sundaresan@intel.com> > >>>> --- > >>>> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ > >>>> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 > >>>> ++++++++++++++++++++++++++++++ > >>>> 2 files changed, 93 insertions(+) > >>>> > >>>> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h > >>>> b/drivers/gpu/drm/xe/xe_pcode_api.h > >>>> index 5935cfe30204..f153ce96f69a 100644 > >>>> --- a/drivers/gpu/drm/xe/xe_pcode_api.h > >>>> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h > >>>> @@ -42,6 +42,13 @@ > >>>> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed > >>>> point format */ > >>>> #define POWER_SETUP_I1_DATA_MASK > >>>> REG_GENMASK(15, 0) > >>>> > >>>> +#define PCODE_FREQUENCY_CONFIG 0x6e > >>>> +/* Frequency Config Sub Commands (param1) */ > >>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 > >>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 > >>>> +/* Domain IDs (param2) */ > >>>> +#define PCODE_MBOX_DOMAIN_HBM 0x2 > >>>> + > >>>> struct pcode_err_decode { > >>>> int errno; > >>>> const char *str; > >>>> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c > >>>> b/drivers/gpu/drm/xe/xe_tile_sysfs.c > >>>> index 0f8d3e7fce46..cdc9dbbc97b0 100644 > >>>> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c > >>>> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c > >>>> @@ -7,9 +7,21 @@ > >>>> #include <linux/sysfs.h> > >>>> #include <drm/drm_managed.h> > >>>> > >>>> +#include "xe_gt_types.h" > >>>> +#include "xe_pcode.h" > >>>> +#include "xe_pcode_api.h" > >>>> #include "xe_tile.h" > >>>> #include "xe_tile_sysfs.h" > >>>> > >>>> +/** > >>>> + * DOC: Xe Tile sysfs > >>>> + * > >>>> + * Provides sysfs entries for frequency in tile > >>>> + * > >>>> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a > >>>> configuration and read-only. > >>> Let's increase verbosity of doc something explaining it is a fixed > >>> fuse point not a > >> configuration. > >> Sure > >>>> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a > >>>> configuration and read-only. > >>>> + */ > >>>> + > >>>> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { > >>>> kfree(kobj); > >>>> @@ -20,6 +32,65 @@ static const struct kobj_type > >>>> xe_tile_sysfs_kobj_type = { > >>>> .sysfs_ops = &kobj_sysfs_ops, > >>>> }; > >>>> > >>>> +static ssize_t max_freq_show(struct device *kdev, struct > >>>> +device_attribute > >>>> *attr, > >>>> + char *buf) > >>>> +{ > >>>> + struct kobject *kobj = &kdev->kobj; > >>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); > >>>> + struct xe_gt *gt = tile->primary_gt; > >>>> + u32 val, mbox; > >>>> + int err; > >>>> + > >>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, > >>>> PCODE_FREQUENCY_CONFIG) > >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, > >>>> PCODE_MBOX_FC_SC_READ_FUSED_P0) > >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, > >>>> PCODE_MBOX_DOMAIN_HBM); > >>>> + > >>>> + err = xe_pcode_read(gt, mbox, &val, NULL); > >>>> + if (err) > >>>> + return err; > >>>> + > >>>> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ > >>>> + val *= 50; > >>>> + > >>>> + return sysfs_emit(buf, "%u\n", val); } static > >>>> +DEVICE_ATTR_RO(max_freq); > >>>> + > >>>> +static ssize_t min_freq_show(struct device *kdev, struct > >>>> +device_attribute > >>>> *attr, > >>>> + char *buf) > >>>> +{ > >>>> + struct kobject *kobj = &kdev->kobj; > >>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); > >>> If you are missing to create a kobject for freq0 , then this should > >>> be > >>> kobj->parent->parent. > >> I don't think a kobject is needed for freq0, since it we are only > >> using attribute_group for it. > >> > >> Similar to throttle_reasons. > > Sure, thanks for explanation. > >>>> + struct xe_gt *gt = tile->primary_gt; > >>>> + u32 val, mbox; > >>>> + int err; > >>>> + > >>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, > >>>> PCODE_FREQUENCY_CONFIG) > >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, > >>>> PCODE_MBOX_FC_SC_READ_FUSED_PN) > >>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, > >>>> PCODE_MBOX_DOMAIN_HBM); > >>>> + > >>>> + err = xe_pcode_read(gt, mbox, &val, NULL); > >>>> + if (err) > >>>> + return err; > >>>> + > >>>> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ > >>>> + val *= 50; > >>>> + > >>>> + return sysfs_emit(buf, "%u\n", val); } static > >>>> +DEVICE_ATTR_RO(min_freq); > >>>> + > >>>> +static struct attribute *freq_attrs[] = { > >>>> + &dev_attr_max_freq.attr, > >>>> + &dev_attr_min_freq.attr, > >>>> + NULL > >>>> +}; > >>>> + > >>>> +static const struct attribute_group freq_group_attrs = { > >>>> + .name = "freq0", > >>>> + .attrs = freq_attrs, > >>>> +}; > >>>> + > >>>> static void tile_sysfs_fini(struct drm_device *drm, void *arg) { > >>>> struct xe_tile *tile = arg; > >>>> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) > >>>> struct xe_device *xe = tile_to_xe(tile); > >>>> struct device *dev = xe->drm.dev; > >>>> struct kobj_tile *kt; > >>>> + struct kobject *kobj; > >>>> int err; > >>>> > >>>> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 @@ void > >>>> xe_tile_sysfs_init(struct xe_tile *tile) > >>>> > >>>> tile->sysfs = &kt->base; > >>>> > >>>> + if (xe->info.platform == XE_PVC) { > >>>> + kobj = kobject_create_and_add("memory", tile->sysfs); > >>> How freq0 is getting added, I am unable to see the freq0 kobject as > >>> per the path > >> "device/tile#/memory/freq0/" > >> freq0 is being added as an attribute group. It is similar to the > >> throttle_reasons implementation. > >>>> + if (!kobj) > >>>> + drm_warn(&xe->drm, "failed to add memory > >>>> directory, err: %d\n", -ENOMEM); > >>>> + } > >>>> + > >>>> + if (kobj && xe->info.platform == XE_PVC) { > >>>> + err = sysfs_create_group(kobj, &freq_group_attrs); > >>>> + if (err) { > >>>> + drm_warn(&xe->drm, "failed to register vram freq > >>>> sysfs, err: %d\n", err); > >>>> + return; > >>>> + } > >>>> + } > >>> Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? > >>> Have you made sure kmemleak won't complain here on memory leak ? > > Check the kobject_release() , this will only get call , when all ref count of that > kobj is being put. > > Here you are creating a object and it will never be released. > > Also we need to call the sysfs_remove_group() as well in fini function ? > > > > Thanks, > > Anshuman. > > This is a bit of unique case. In this file we have two issues that keeps us from > cleaning up like others. Current patch looks broken to me, this will leak the kobject on module unload. Please check kmemleak after module unload. > > One, we need to cleanup the base tile directory here. And second, we are > creating the kobject only for PVC. If we add the "memory" kobject cleanup to > fini, we will be defining tile using kobj. This is causing an error on unload, > despite adding platform conditions on fini. You may try by changing the type of void *arg to "memory" kob to fini function ? > > After testing multiple iterations of the fini function, this was the cleanest way > with no errors that worked across platforms. > > If needed, the only way to accommodate the kobject_put(kobj) and the > sysfs_remove_group is to move the vram sysfs creation to a separate file, > similar to throttle_reasons and gt_freq. I think it is needed for a functional working patch, if it can not be handled by using "void *arg" in fini function. Thanks, Anshuman Gupta. > > Thanks, > > Suja > > > > >>> Thanks, > >>> Anshuman Gupta. > >> I have already checked for mem leaks during the cleanup. The > >> kobject_put is not needed. > >> > >> Thanks, > >> > >> Suja > >> > >>>> + > >>>> err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); > >>>> if (err) > >>>> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, > >>>> err: %d\n", > >>>> -- > >>>> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-27 10:56 ` Gupta, Anshuman @ 2023-12-27 12:18 ` Sundaresan, Sujaritha 2023-12-28 10:04 ` Sundaresan, Sujaritha 0 siblings, 1 reply; 9+ messages in thread From: Sundaresan, Sujaritha @ 2023-12-27 12:18 UTC (permalink / raw) To: Gupta, Anshuman, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo On 12/27/2023 4:26 PM, Gupta, Anshuman wrote: > >> -----Original Message----- >> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >> Sent: Wednesday, December 27, 2023 3:01 PM >> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >> xe@lists.freedesktop.org >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >> >> >> On 12/26/2023 7:58 PM, Gupta, Anshuman wrote: >>>> -----Original Message----- >>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>> Sent: Tuesday, December 26, 2023 10:02 AM >>>> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >>>> xe@lists.freedesktop.org >>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >>>> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >>>> >>>> >>>> On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: >>>>>> -----Original Message----- >>>>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>>>> Sent: Friday, December 22, 2023 4:37 PM >>>>>> To: intel-xe@lists.freedesktop.org >>>>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman >>>>>> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha >>>>>> <sujaritha.sundaresan@intel.com> >>>>>> Subject: [v6] drm/xe: Add vram frequency sysfs attributes >>>>>> >>>>>> Add vram frequency sysfs attributes under the below hierarchy; >>>>>> >>>>>> /device/tile#/memory/freq0 >>>>>> |-max_freq >>>>>> |-min_freq >>>>>> >>>>>> v2: Drop "vram" from attribute names (Rodrigo) >>>>>> >>>>>> v3: Add documentation for new sysfs (Riana) >>>>>> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) >>>>>> >>>>>> v4: Create sysfs under tile#/freq0 after removal of >>>>>> physical_memsize attrbute >>>>>> >>>>>> v5: Revert back to creating sysfs under tile#/memory/freq0 >>>>>> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) >>>>>> >>>>>> v6: Rename attributes to max/min_freq (Anshuman) >>>>>> Fix review comments (Rodrigo) >>>>>> >>>>>> Signed-off-by: Sujaritha Sundaresan >>>>>> <sujaritha.sundaresan@intel.com> >>>>>> --- >>>>>> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ >>>>>> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 >>>>>> ++++++++++++++++++++++++++++++ >>>>>> 2 files changed, 93 insertions(+) >>>>>> >>>>>> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>> b/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>> index 5935cfe30204..f153ce96f69a 100644 >>>>>> --- a/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>> @@ -42,6 +42,13 @@ >>>>>> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed >>>>>> point format */ >>>>>> #define POWER_SETUP_I1_DATA_MASK >>>>>> REG_GENMASK(15, 0) >>>>>> >>>>>> +#define PCODE_FREQUENCY_CONFIG 0x6e >>>>>> +/* Frequency Config Sub Commands (param1) */ >>>>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 >>>>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 >>>>>> +/* Domain IDs (param2) */ >>>>>> +#define PCODE_MBOX_DOMAIN_HBM 0x2 >>>>>> + >>>>>> struct pcode_err_decode { >>>>>> int errno; >>>>>> const char *str; >>>>>> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>> b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>> index 0f8d3e7fce46..cdc9dbbc97b0 100644 >>>>>> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>> @@ -7,9 +7,21 @@ >>>>>> #include <linux/sysfs.h> >>>>>> #include <drm/drm_managed.h> >>>>>> >>>>>> +#include "xe_gt_types.h" >>>>>> +#include "xe_pcode.h" >>>>>> +#include "xe_pcode_api.h" >>>>>> #include "xe_tile.h" >>>>>> #include "xe_tile_sysfs.h" >>>>>> >>>>>> +/** >>>>>> + * DOC: Xe Tile sysfs >>>>>> + * >>>>>> + * Provides sysfs entries for frequency in tile >>>>>> + * >>>>>> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a >>>>>> configuration and read-only. >>>>> Let's increase verbosity of doc something explaining it is a fixed >>>>> fuse point not a >>>> configuration. >>>> Sure >>>>>> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a >>>>>> configuration and read-only. >>>>>> + */ >>>>>> + >>>>>> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { >>>>>> kfree(kobj); >>>>>> @@ -20,6 +32,65 @@ static const struct kobj_type >>>>>> xe_tile_sysfs_kobj_type = { >>>>>> .sysfs_ops = &kobj_sysfs_ops, >>>>>> }; >>>>>> >>>>>> +static ssize_t max_freq_show(struct device *kdev, struct >>>>>> +device_attribute >>>>>> *attr, >>>>>> + char *buf) >>>>>> +{ >>>>>> + struct kobject *kobj = &kdev->kobj; >>>>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>>>> + struct xe_gt *gt = tile->primary_gt; >>>>>> + u32 val, mbox; >>>>>> + int err; >>>>>> + >>>>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>>>> PCODE_FREQUENCY_CONFIG) >>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>>>> PCODE_MBOX_FC_SC_READ_FUSED_P0) >>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>>>> PCODE_MBOX_DOMAIN_HBM); >>>>>> + >>>>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>>>> + if (err) >>>>>> + return err; >>>>>> + >>>>>> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ >>>>>> + val *= 50; >>>>>> + >>>>>> + return sysfs_emit(buf, "%u\n", val); } static >>>>>> +DEVICE_ATTR_RO(max_freq); >>>>>> + >>>>>> +static ssize_t min_freq_show(struct device *kdev, struct >>>>>> +device_attribute >>>>>> *attr, >>>>>> + char *buf) >>>>>> +{ >>>>>> + struct kobject *kobj = &kdev->kobj; >>>>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>>> If you are missing to create a kobject for freq0 , then this should >>>>> be >>>>> kobj->parent->parent. >>>> I don't think a kobject is needed for freq0, since it we are only >>>> using attribute_group for it. >>>> >>>> Similar to throttle_reasons. >>> Sure, thanks for explanation. >>>>>> + struct xe_gt *gt = tile->primary_gt; >>>>>> + u32 val, mbox; >>>>>> + int err; >>>>>> + >>>>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>>>> PCODE_FREQUENCY_CONFIG) >>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>>>> PCODE_MBOX_FC_SC_READ_FUSED_PN) >>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>>>> PCODE_MBOX_DOMAIN_HBM); >>>>>> + >>>>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>>>> + if (err) >>>>>> + return err; >>>>>> + >>>>>> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ >>>>>> + val *= 50; >>>>>> + >>>>>> + return sysfs_emit(buf, "%u\n", val); } static >>>>>> +DEVICE_ATTR_RO(min_freq); >>>>>> + >>>>>> +static struct attribute *freq_attrs[] = { >>>>>> + &dev_attr_max_freq.attr, >>>>>> + &dev_attr_min_freq.attr, >>>>>> + NULL >>>>>> +}; >>>>>> + >>>>>> +static const struct attribute_group freq_group_attrs = { >>>>>> + .name = "freq0", >>>>>> + .attrs = freq_attrs, >>>>>> +}; >>>>>> + >>>>>> static void tile_sysfs_fini(struct drm_device *drm, void *arg) { >>>>>> struct xe_tile *tile = arg; >>>>>> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) >>>>>> struct xe_device *xe = tile_to_xe(tile); >>>>>> struct device *dev = xe->drm.dev; >>>>>> struct kobj_tile *kt; >>>>>> + struct kobject *kobj; >>>>>> int err; >>>>>> >>>>>> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 @@ void >>>>>> xe_tile_sysfs_init(struct xe_tile *tile) >>>>>> >>>>>> tile->sysfs = &kt->base; >>>>>> >>>>>> + if (xe->info.platform == XE_PVC) { >>>>>> + kobj = kobject_create_and_add("memory", tile->sysfs); >>>>> How freq0 is getting added, I am unable to see the freq0 kobject as >>>>> per the path >>>> "device/tile#/memory/freq0/" >>>> freq0 is being added as an attribute group. It is similar to the >>>> throttle_reasons implementation. >>>>>> + if (!kobj) >>>>>> + drm_warn(&xe->drm, "failed to add memory >>>>>> directory, err: %d\n", -ENOMEM); >>>>>> + } >>>>>> + >>>>>> + if (kobj && xe->info.platform == XE_PVC) { >>>>>> + err = sysfs_create_group(kobj, &freq_group_attrs); >>>>>> + if (err) { >>>>>> + drm_warn(&xe->drm, "failed to register vram freq >>>>>> sysfs, err: %d\n", err); >>>>>> + return; >>>>>> + } >>>>>> + } >>>>> Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? >>>>> Have you made sure kmemleak won't complain here on memory leak ? >>> Check the kobject_release() , this will only get call , when all ref count of that >> kobj is being put. >>> Here you are creating a object and it will never be released. >>> Also we need to call the sysfs_remove_group() as well in fini function ? >>> >>> Thanks, >>> Anshuman. >> This is a bit of unique case. In this file we have two issues that keeps us from >> cleaning up like others. > Current patch looks broken to me, this will leak the kobject on module unload. > Please check kmemleak after module unload. >> One, we need to cleanup the base tile directory here. And second, we are >> creating the kobject only for PVC. If we add the "memory" kobject cleanup to >> fini, we will be defining tile using kobj. This is causing an error on unload, >> despite adding platform conditions on fini. > You may try by changing the type of void *arg to "memory" kob to fini function ? >> After testing multiple iterations of the fini function, this was the cleanest way >> with no errors that worked across platforms. >> >> If needed, the only way to accommodate the kobject_put(kobj) and the >> sysfs_remove_group is to move the vram sysfs creation to a separate file, >> similar to throttle_reasons and gt_freq. > I think it is needed for a functional working patch, if it can not be handled by using > "void *arg" in fini function. > > Thanks, > Anshuman Gupta. Since this is bit contentious even though the patch is functional, I will move these sysfs out of xe_tile_sysfs.c to it own new file. This should clear up everything. Thanks, Suja > > >> Thanks, >> >> Suja >> >>>>> Thanks, >>>>> Anshuman Gupta. >>>> I have already checked for mem leaks during the cleanup. The >>>> kobject_put is not needed. >>>> >>>> Thanks, >>>> >>>> Suja >>>> >>>>>> + >>>>>> err = drmm_add_action_or_reset(&xe->drm, tile_sysfs_fini, tile); >>>>>> if (err) >>>>>> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset failed, >>>>>> err: %d\n", >>>>>> -- >>>>>> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-27 12:18 ` Sundaresan, Sujaritha @ 2023-12-28 10:04 ` Sundaresan, Sujaritha 2024-01-02 7:09 ` Riana Tauro 0 siblings, 1 reply; 9+ messages in thread From: Sundaresan, Sujaritha @ 2023-12-28 10:04 UTC (permalink / raw) To: Gupta, Anshuman, intel-xe@lists.freedesktop.org; +Cc: Vivi, Rodrigo On 12/27/2023 5:48 PM, Sundaresan, Sujaritha wrote: > > On 12/27/2023 4:26 PM, Gupta, Anshuman wrote: >> >>> -----Original Message----- >>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>> Sent: Wednesday, December 27, 2023 3:01 PM >>> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >>> xe@lists.freedesktop.org >>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >>> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >>> >>> >>> On 12/26/2023 7:58 PM, Gupta, Anshuman wrote: >>>>> -----Original Message----- >>>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>>> Sent: Tuesday, December 26, 2023 10:02 AM >>>>> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >>>>> xe@lists.freedesktop.org >>>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >>>>> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >>>>> >>>>> >>>>> On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: >>>>>>> -----Original Message----- >>>>>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>>>>> Sent: Friday, December 22, 2023 4:37 PM >>>>>>> To: intel-xe@lists.freedesktop.org >>>>>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman >>>>>>> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha >>>>>>> <sujaritha.sundaresan@intel.com> >>>>>>> Subject: [v6] drm/xe: Add vram frequency sysfs attributes >>>>>>> >>>>>>> Add vram frequency sysfs attributes under the below hierarchy; >>>>>>> >>>>>>> /device/tile#/memory/freq0 >>>>>>> |-max_freq >>>>>>> |-min_freq >>>>>>> >>>>>>> v2: Drop "vram" from attribute names (Rodrigo) >>>>>>> >>>>>>> v3: Add documentation for new sysfs (Riana) >>>>>>> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) >>>>>>> >>>>>>> v4: Create sysfs under tile#/freq0 after removal of >>>>>>> physical_memsize attrbute >>>>>>> >>>>>>> v5: Revert back to creating sysfs under tile#/memory/freq0 >>>>>>> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) >>>>>>> >>>>>>> v6: Rename attributes to max/min_freq (Anshuman) >>>>>>> Fix review comments (Rodrigo) >>>>>>> >>>>>>> Signed-off-by: Sujaritha Sundaresan >>>>>>> <sujaritha.sundaresan@intel.com> >>>>>>> --- >>>>>>> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ >>>>>>> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 >>>>>>> ++++++++++++++++++++++++++++++ >>>>>>> 2 files changed, 93 insertions(+) >>>>>>> >>>>>>> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>> b/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>> index 5935cfe30204..f153ce96f69a 100644 >>>>>>> --- a/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>> @@ -42,6 +42,13 @@ >>>>>>> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed >>>>>>> point format */ >>>>>>> #define POWER_SETUP_I1_DATA_MASK >>>>>>> REG_GENMASK(15, 0) >>>>>>> >>>>>>> +#define PCODE_FREQUENCY_CONFIG 0x6e >>>>>>> +/* Frequency Config Sub Commands (param1) */ >>>>>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 >>>>>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 >>>>>>> +/* Domain IDs (param2) */ >>>>>>> +#define PCODE_MBOX_DOMAIN_HBM 0x2 >>>>>>> + >>>>>>> struct pcode_err_decode { >>>>>>> int errno; >>>>>>> const char *str; >>>>>>> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>> b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>> index 0f8d3e7fce46..cdc9dbbc97b0 100644 >>>>>>> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>> @@ -7,9 +7,21 @@ >>>>>>> #include <linux/sysfs.h> >>>>>>> #include <drm/drm_managed.h> >>>>>>> >>>>>>> +#include "xe_gt_types.h" >>>>>>> +#include "xe_pcode.h" >>>>>>> +#include "xe_pcode_api.h" >>>>>>> #include "xe_tile.h" >>>>>>> #include "xe_tile_sysfs.h" >>>>>>> >>>>>>> +/** >>>>>>> + * DOC: Xe Tile sysfs >>>>>>> + * >>>>>>> + * Provides sysfs entries for frequency in tile >>>>>>> + * >>>>>>> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a >>>>>>> configuration and read-only. >>>>>> Let's increase verbosity of doc something explaining it is a fixed >>>>>> fuse point not a >>>>> configuration. >>>>> Sure >>>>>>> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a >>>>>>> configuration and read-only. >>>>>>> + */ >>>>>>> + >>>>>>> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { >>>>>>> kfree(kobj); >>>>>>> @@ -20,6 +32,65 @@ static const struct kobj_type >>>>>>> xe_tile_sysfs_kobj_type = { >>>>>>> .sysfs_ops = &kobj_sysfs_ops, >>>>>>> }; >>>>>>> >>>>>>> +static ssize_t max_freq_show(struct device *kdev, struct >>>>>>> +device_attribute >>>>>>> *attr, >>>>>>> + char *buf) >>>>>>> +{ >>>>>>> + struct kobject *kobj = &kdev->kobj; >>>>>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>>>>> + struct xe_gt *gt = tile->primary_gt; >>>>>>> + u32 val, mbox; >>>>>>> + int err; >>>>>>> + >>>>>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>>>>> PCODE_FREQUENCY_CONFIG) >>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>>>>> PCODE_MBOX_FC_SC_READ_FUSED_P0) >>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>>>>> PCODE_MBOX_DOMAIN_HBM); >>>>>>> + >>>>>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>>>>> + if (err) >>>>>>> + return err; >>>>>>> + >>>>>>> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ >>>>>>> + val *= 50; >>>>>>> + >>>>>>> + return sysfs_emit(buf, "%u\n", val); } static >>>>>>> +DEVICE_ATTR_RO(max_freq); >>>>>>> + >>>>>>> +static ssize_t min_freq_show(struct device *kdev, struct >>>>>>> +device_attribute >>>>>>> *attr, >>>>>>> + char *buf) >>>>>>> +{ >>>>>>> + struct kobject *kobj = &kdev->kobj; >>>>>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>>>> If you are missing to create a kobject for freq0 , then this should >>>>>> be >>>>>> kobj->parent->parent. >>>>> I don't think a kobject is needed for freq0, since it we are only >>>>> using attribute_group for it. >>>>> >>>>> Similar to throttle_reasons. >>>> Sure, thanks for explanation. >>>>>>> + struct xe_gt *gt = tile->primary_gt; >>>>>>> + u32 val, mbox; >>>>>>> + int err; >>>>>>> + >>>>>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>>>>> PCODE_FREQUENCY_CONFIG) >>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>>>>> PCODE_MBOX_FC_SC_READ_FUSED_PN) >>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>>>>> PCODE_MBOX_DOMAIN_HBM); >>>>>>> + >>>>>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>>>>> + if (err) >>>>>>> + return err; >>>>>>> + >>>>>>> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ >>>>>>> + val *= 50; >>>>>>> + >>>>>>> + return sysfs_emit(buf, "%u\n", val); } static >>>>>>> +DEVICE_ATTR_RO(min_freq); >>>>>>> + >>>>>>> +static struct attribute *freq_attrs[] = { >>>>>>> + &dev_attr_max_freq.attr, >>>>>>> + &dev_attr_min_freq.attr, >>>>>>> + NULL >>>>>>> +}; >>>>>>> + >>>>>>> +static const struct attribute_group freq_group_attrs = { >>>>>>> + .name = "freq0", >>>>>>> + .attrs = freq_attrs, >>>>>>> +}; >>>>>>> + >>>>>>> static void tile_sysfs_fini(struct drm_device *drm, void >>>>>>> *arg) { >>>>>>> struct xe_tile *tile = arg; >>>>>>> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) >>>>>>> struct xe_device *xe = tile_to_xe(tile); >>>>>>> struct device *dev = xe->drm.dev; >>>>>>> struct kobj_tile *kt; >>>>>>> + struct kobject *kobj; >>>>>>> int err; >>>>>>> >>>>>>> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 >>>>>>> @@ void >>>>>>> xe_tile_sysfs_init(struct xe_tile *tile) >>>>>>> >>>>>>> tile->sysfs = &kt->base; >>>>>>> >>>>>>> + if (xe->info.platform == XE_PVC) { >>>>>>> + kobj = kobject_create_and_add("memory", tile->sysfs); >>>>>> How freq0 is getting added, I am unable to see the freq0 kobject as >>>>>> per the path >>>>> "device/tile#/memory/freq0/" >>>>> freq0 is being added as an attribute group. It is similar to the >>>>> throttle_reasons implementation. >>>>>>> + if (!kobj) >>>>>>> + drm_warn(&xe->drm, "failed to add memory >>>>>>> directory, err: %d\n", -ENOMEM); >>>>>>> + } >>>>>>> + >>>>>>> + if (kobj && xe->info.platform == XE_PVC) { >>>>>>> + err = sysfs_create_group(kobj, &freq_group_attrs); >>>>>>> + if (err) { >>>>>>> + drm_warn(&xe->drm, "failed to register vram freq >>>>>>> sysfs, err: %d\n", err); >>>>>>> + return; >>>>>>> + } >>>>>>> + } >>>>>> Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? >>>>>> Have you made sure kmemleak won't complain here on memory leak ? >>>> Check the kobject_release() , this will only get call , when all >>>> ref count of that >>> kobj is being put. >>>> Here you are creating a object and it will never be released. >>>> Also we need to call the sysfs_remove_group() as well in fini >>>> function ? >>>> >>>> Thanks, >>>> Anshuman. >>> This is a bit of unique case. In this file we have two issues that >>> keeps us from >>> cleaning up like others. >> Current patch looks broken to me, this will leak the kobject on >> module unload. >> Please check kmemleak after module unload. >>> One, we need to cleanup the base tile directory here. And second, we >>> are >>> creating the kobject only for PVC. If we add the "memory" kobject >>> cleanup to >>> fini, we will be defining tile using kobj. This is causing an error >>> on unload, >>> despite adding platform conditions on fini. >> You may try by changing the type of void *arg to "memory" kob to fini >> function ? >>> After testing multiple iterations of the fini function, this was the >>> cleanest way >>> with no errors that worked across platforms. >>> >>> If needed, the only way to accommodate the kobject_put(kobj) and the >>> sysfs_remove_group is to move the vram sysfs creation to a separate >>> file, >>> similar to throttle_reasons and gt_freq. >> I think it is needed for a functional working patch, if it can not be >> handled by using >> "void *arg" in fini function. >> >> Thanks, >> Anshuman Gupta. > > Since this is bit contentious even though the patch is functional, I > will move these sysfs out of xe_tile_sysfs.c to it own new file. > > This should clear up everything. > > Thanks, > > Suja Hi Anshuman, I've moved everything to a new file called xe_vram_freq.c/h . All kmemleaks and unload/reload checks are clean. Let me know if the naming works. The documentation added is as below, let me know if any tweaks are needed; /** * DOC: Xe VRAM freq * * Provides sysfs entries for vram frequency in tile * * device/tile#/memory/freq0/max_freq - This is maximum frequency. This value is read-only as it * is the fixed fuse point P0. It is not the system * configuration frequency. * device/tile#/memory/freq0/min_freq - This is minimum frequency. This value is read-only as it * is the fixed fuse point PN. It is not the system * configuration frequency. */ Thanks, Suja > >> >> >>> Thanks, >>> >>> Suja >>> >>>>>> Thanks, >>>>>> Anshuman Gupta. >>>>> I have already checked for mem leaks during the cleanup. The >>>>> kobject_put is not needed. >>>>> >>>>> Thanks, >>>>> >>>>> Suja >>>>> >>>>>>> + >>>>>>> err = drmm_add_action_or_reset(&xe->drm, >>>>>>> tile_sysfs_fini, tile); >>>>>>> if (err) >>>>>>> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset >>>>>>> failed, >>>>>>> err: %d\n", >>>>>>> -- >>>>>>> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [v6] drm/xe: Add vram frequency sysfs attributes 2023-12-28 10:04 ` Sundaresan, Sujaritha @ 2024-01-02 7:09 ` Riana Tauro 0 siblings, 0 replies; 9+ messages in thread From: Riana Tauro @ 2024-01-02 7:09 UTC (permalink / raw) To: Sundaresan, Sujaritha, Gupta, Anshuman, intel-xe@lists.freedesktop.org Cc: Vivi, Rodrigo Hi Suja On 12/28/2023 3:34 PM, Sundaresan, Sujaritha wrote: > > On 12/27/2023 5:48 PM, Sundaresan, Sujaritha wrote: >> >> On 12/27/2023 4:26 PM, Gupta, Anshuman wrote: >>> >>>> -----Original Message----- >>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>> Sent: Wednesday, December 27, 2023 3:01 PM >>>> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >>>> xe@lists.freedesktop.org >>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >>>> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >>>> >>>> >>>> On 12/26/2023 7:58 PM, Gupta, Anshuman wrote: >>>>>> -----Original Message----- >>>>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>>>> Sent: Tuesday, December 26, 2023 10:02 AM >>>>>> To: Gupta, Anshuman <anshuman.gupta@intel.com>; intel- >>>>>> xe@lists.freedesktop.org >>>>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >>>>>> Subject: Re: [v6] drm/xe: Add vram frequency sysfs attributes >>>>>> >>>>>> >>>>>> On 12/22/2023 7:34 PM, Gupta, Anshuman wrote: >>>>>>>> -----Original Message----- >>>>>>>> From: Sundaresan, Sujaritha <sujaritha.sundaresan@intel.com> >>>>>>>> Sent: Friday, December 22, 2023 4:37 PM >>>>>>>> To: intel-xe@lists.freedesktop.org >>>>>>>> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman >>>>>>>> <anshuman.gupta@intel.com>; Sundaresan, Sujaritha >>>>>>>> <sujaritha.sundaresan@intel.com> >>>>>>>> Subject: [v6] drm/xe: Add vram frequency sysfs attributes >>>>>>>> >>>>>>>> Add vram frequency sysfs attributes under the below hierarchy; >>>>>>>> >>>>>>>> /device/tile#/memory/freq0 >>>>>>>> |-max_freq >>>>>>>> |-min_freq >>>>>>>> >>>>>>>> v2: Drop "vram" from attribute names (Rodrigo) >>>>>>>> >>>>>>>> v3: Add documentation for new sysfs (Riana) >>>>>>>> Drop prefix from XEHP_PCODE_FREQUENCY_CONFIG (Riana) >>>>>>>> >>>>>>>> v4: Create sysfs under tile#/freq0 after removal of >>>>>>>> physical_memsize attrbute >>>>>>>> >>>>>>>> v5: Revert back to creating sysfs under tile#/memory/freq0 >>>>>>>> Remove definition of GT_FREQUENCY_MULTIPLIER (Rodrigo) >>>>>>>> >>>>>>>> v6: Rename attributes to max/min_freq (Anshuman) >>>>>>>> Fix review comments (Rodrigo) >>>>>>>> >>>>>>>> Signed-off-by: Sujaritha Sundaresan >>>>>>>> <sujaritha.sundaresan@intel.com> >>>>>>>> --- >>>>>>>> drivers/gpu/drm/xe/xe_pcode_api.h | 7 +++ >>>>>>>> drivers/gpu/drm/xe/xe_tile_sysfs.c | 86 >>>>>>>> ++++++++++++++++++++++++++++++ >>>>>>>> 2 files changed, 93 insertions(+) >>>>>>>> >>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>>> b/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>>> index 5935cfe30204..f153ce96f69a 100644 >>>>>>>> --- a/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>>> +++ b/drivers/gpu/drm/xe/xe_pcode_api.h >>>>>>>> @@ -42,6 +42,13 @@ >>>>>>>> #define POWER_SETUP_I1_SHIFT 6 /* 10.6 fixed >>>>>>>> point format */ >>>>>>>> #define POWER_SETUP_I1_DATA_MASK >>>>>>>> REG_GENMASK(15, 0) >>>>>>>> >>>>>>>> +#define PCODE_FREQUENCY_CONFIG 0x6e >>>>>>>> +/* Frequency Config Sub Commands (param1) */ >>>>>>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 >>>>>>>> +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 >>>>>>>> +/* Domain IDs (param2) */ >>>>>>>> +#define PCODE_MBOX_DOMAIN_HBM 0x2 >>>>>>>> + >>>>>>>> struct pcode_err_decode { >>>>>>>> int errno; >>>>>>>> const char *str; >>>>>>>> diff --git a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>>> b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>>> index 0f8d3e7fce46..cdc9dbbc97b0 100644 >>>>>>>> --- a/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>>> +++ b/drivers/gpu/drm/xe/xe_tile_sysfs.c >>>>>>>> @@ -7,9 +7,21 @@ >>>>>>>> #include <linux/sysfs.h> >>>>>>>> #include <drm/drm_managed.h> >>>>>>>> >>>>>>>> +#include "xe_gt_types.h" >>>>>>>> +#include "xe_pcode.h" >>>>>>>> +#include "xe_pcode_api.h" >>>>>>>> #include "xe_tile.h" >>>>>>>> #include "xe_tile_sysfs.h" >>>>>>>> >>>>>>>> +/** >>>>>>>> + * DOC: Xe Tile sysfs >>>>>>>> + * >>>>>>>> + * Provides sysfs entries for frequency in tile >>>>>>>> + * >>>>>>>> + * device/tile#/memory/freq0/max_freq - Maximum Frequency, not a >>>>>>>> configuration and read-only. >>>>>>> Let's increase verbosity of doc something explaining it is a fixed >>>>>>> fuse point not a >>>>>> configuration. >>>>>> Sure >>>>>>>> + * device/tile#/memory/freq0/min_freq - Minimum Frequency, not a >>>>>>>> configuration and read-only. >>>>>>>> + */ >>>>>>>> + >>>>>>>> static void xe_tile_sysfs_kobj_release(struct kobject *kobj) { >>>>>>>> kfree(kobj); >>>>>>>> @@ -20,6 +32,65 @@ static const struct kobj_type >>>>>>>> xe_tile_sysfs_kobj_type = { >>>>>>>> .sysfs_ops = &kobj_sysfs_ops, >>>>>>>> }; >>>>>>>> >>>>>>>> +static ssize_t max_freq_show(struct device *kdev, struct >>>>>>>> +device_attribute >>>>>>>> *attr, >>>>>>>> + char *buf) >>>>>>>> +{ >>>>>>>> + struct kobject *kobj = &kdev->kobj; >>>>>>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>>>>>> + struct xe_gt *gt = tile->primary_gt; >>>>>>>> + u32 val, mbox; >>>>>>>> + int err; >>>>>>>> + >>>>>>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>>>>>> PCODE_FREQUENCY_CONFIG) >>>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>>>>>> PCODE_MBOX_FC_SC_READ_FUSED_P0) >>>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>>>>>> PCODE_MBOX_DOMAIN_HBM); >>>>>>>> + >>>>>>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>>>>>> + if (err) >>>>>>>> + return err; >>>>>>>> + >>>>>>>> + /* data_out - Fused P0 for domain ID in units of 50 MHz */ >>>>>>>> + val *= 50; >>>>>>>> + >>>>>>>> + return sysfs_emit(buf, "%u\n", val); } static >>>>>>>> +DEVICE_ATTR_RO(max_freq); >>>>>>>> + >>>>>>>> +static ssize_t min_freq_show(struct device *kdev, struct >>>>>>>> +device_attribute >>>>>>>> *attr, >>>>>>>> + char *buf) >>>>>>>> +{ >>>>>>>> + struct kobject *kobj = &kdev->kobj; >>>>>>>> + struct xe_tile *tile = kobj_to_tile(kobj->parent); >>>>>>> If you are missing to create a kobject for freq0 , then this should >>>>>>> be >>>>>>> kobj->parent->parent. >>>>>> I don't think a kobject is needed for freq0, since it we are only >>>>>> using attribute_group for it. >>>>>> >>>>>> Similar to throttle_reasons. >>>>> Sure, thanks for explanation. >>>>>>>> + struct xe_gt *gt = tile->primary_gt; >>>>>>>> + u32 val, mbox; >>>>>>>> + int err; >>>>>>>> + >>>>>>>> + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, >>>>>>>> PCODE_FREQUENCY_CONFIG) >>>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM1, >>>>>>>> PCODE_MBOX_FC_SC_READ_FUSED_PN) >>>>>>>> + | REG_FIELD_PREP(PCODE_MB_PARAM2, >>>>>>>> PCODE_MBOX_DOMAIN_HBM); >>>>>>>> + >>>>>>>> + err = xe_pcode_read(gt, mbox, &val, NULL); >>>>>>>> + if (err) >>>>>>>> + return err; >>>>>>>> + >>>>>>>> + /* data_out - Fused Pn for domain ID in units of 50 MHz */ >>>>>>>> + val *= 50; >>>>>>>> + >>>>>>>> + return sysfs_emit(buf, "%u\n", val); } static >>>>>>>> +DEVICE_ATTR_RO(min_freq); >>>>>>>> + >>>>>>>> +static struct attribute *freq_attrs[] = { >>>>>>>> + &dev_attr_max_freq.attr, >>>>>>>> + &dev_attr_min_freq.attr, >>>>>>>> + NULL >>>>>>>> +}; >>>>>>>> + >>>>>>>> +static const struct attribute_group freq_group_attrs = { >>>>>>>> + .name = "freq0", >>>>>>>> + .attrs = freq_attrs, >>>>>>>> +}; >>>>>>>> + >>>>>>>> static void tile_sysfs_fini(struct drm_device *drm, void >>>>>>>> *arg) { >>>>>>>> struct xe_tile *tile = arg; >>>>>>>> @@ -32,6 +103,7 @@ void xe_tile_sysfs_init(struct xe_tile *tile) >>>>>>>> struct xe_device *xe = tile_to_xe(tile); >>>>>>>> struct device *dev = xe->drm.dev; >>>>>>>> struct kobj_tile *kt; >>>>>>>> + struct kobject *kobj; >>>>>>>> int err; >>>>>>>> >>>>>>>> kt = kzalloc(sizeof(*kt), GFP_KERNEL); @@ -50,6 +122,20 >>>>>>>> @@ void >>>>>>>> xe_tile_sysfs_init(struct xe_tile *tile) >>>>>>>> >>>>>>>> tile->sysfs = &kt->base; >>>>>>>> >>>>>>>> + if (xe->info.platform == XE_PVC) { >>>>>>>> + kobj = kobject_create_and_add("memory", tile->sysfs); >>>>>>> How freq0 is getting added, I am unable to see the freq0 kobject as >>>>>>> per the path >>>>>> "device/tile#/memory/freq0/" >>>>>> freq0 is being added as an attribute group. It is similar to the >>>>>> throttle_reasons implementation. >>>>>>>> + if (!kobj) >>>>>>>> + drm_warn(&xe->drm, "failed to add memory >>>>>>>> directory, err: %d\n", -ENOMEM); >>>>>>>> + } >>>>>>>> + >>>>>>>> + if (kobj && xe->info.platform == XE_PVC) { >>>>>>>> + err = sysfs_create_group(kobj, &freq_group_attrs); >>>>>>>> + if (err) { >>>>>>>> + drm_warn(&xe->drm, "failed to register vram freq >>>>>>>> sysfs, err: %d\n", err); >>>>>>>> + return; >>>>>>>> + } >>>>>>>> + } >>>>>>> Don't we need sysfs cleanup and kobject_put in tile_sysfs_fini() ? >>>>>>> Have you made sure kmemleak won't complain here on memory leak ? >>>>> Check the kobject_release() , this will only get call , when all >>>>> ref count of that >>>> kobj is being put. >>>>> Here you are creating a object and it will never be released. >>>>> Also we need to call the sysfs_remove_group() as well in fini >>>>> function ? >>>>> >>>>> Thanks, >>>>> Anshuman. >>>> This is a bit of unique case. In this file we have two issues that >>>> keeps us from >>>> cleaning up like others. >>> Current patch looks broken to me, this will leak the kobject on >>> module unload. >>> Please check kmemleak after module unload. >>>> One, we need to cleanup the base tile directory here. And second, we >>>> are >>>> creating the kobject only for PVC. If we add the "memory" kobject >>>> cleanup to >>>> fini, we will be defining tile using kobj. This is causing an error >>>> on unload, >>>> despite adding platform conditions on fini. >>> You may try by changing the type of void *arg to "memory" kob to fini >>> function ? >>>> After testing multiple iterations of the fini function, this was the >>>> cleanest way >>>> with no errors that worked across platforms. >>>> >>>> If needed, the only way to accommodate the kobject_put(kobj) and the >>>> sysfs_remove_group is to move the vram sysfs creation to a separate >>>> file, >>>> similar to throttle_reasons and gt_freq. >>> I think it is needed for a functional working patch, if it can not be >>> handled by using >>> "void *arg" in fini function. I think you can try something similar to the below file xe_hw_engine_class_sysfs.c Has different functions for different hierarchy of kobjects. Thanks Riana >>> >>> Thanks, >>> Anshuman Gupta. >> >> Since this is bit contentious even though the patch is functional, I >> will move these sysfs out of xe_tile_sysfs.c to it own new file. >> >> This should clear up everything. >> >> Thanks, >> >> Suja > > Hi Anshuman, > > I've moved everything to a new file called xe_vram_freq.c/h . All > kmemleaks and unload/reload checks are clean. > > Let me know if the naming works. > > The documentation added is as below, let me know if any tweaks are needed; > > /** > * DOC: Xe VRAM freq > * > * Provides sysfs entries for vram frequency in tile > * > * device/tile#/memory/freq0/max_freq - This is maximum frequency. This > value is read-only as it > * is the fixed fuse point P0. It is not the system > * configuration frequency. > * device/tile#/memory/freq0/min_freq - This is minimum frequency. This > value is read-only as it > * is the fixed fuse point PN. It is not the system > * configuration frequency. > */ > > Thanks, > > Suja > >> >>> >>> >>>> Thanks, >>>> >>>> Suja >>>> >>>>>>> Thanks, >>>>>>> Anshuman Gupta. >>>>>> I have already checked for mem leaks during the cleanup. The >>>>>> kobject_put is not needed. >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Suja >>>>>> >>>>>>>> + >>>>>>>> err = drmm_add_action_or_reset(&xe->drm, >>>>>>>> tile_sysfs_fini, tile); >>>>>>>> if (err) >>>>>>>> drm_warn(&xe->drm, "%s: drmm_add_action_or_reset >>>>>>>> failed, >>>>>>>> err: %d\n", >>>>>>>> -- >>>>>>>> 2.25.1 ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-01-02 7:09 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-12-22 11:06 [v6] drm/xe: Add vram frequency sysfs attributes Sujaritha Sundaresan 2023-12-22 14:04 ` Gupta, Anshuman 2023-12-26 4:32 ` Sundaresan, Sujaritha 2023-12-26 14:28 ` Gupta, Anshuman 2023-12-27 9:31 ` Sundaresan, Sujaritha 2023-12-27 10:56 ` Gupta, Anshuman 2023-12-27 12:18 ` Sundaresan, Sujaritha 2023-12-28 10:04 ` Sundaresan, Sujaritha 2024-01-02 7:09 ` Riana Tauro
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox