From patchwork Fri Aug 18 08:58:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/2] drm/xe: Add a couple of pcode helpers From: Sujaritha Sundaresan X-Patchwork-Id: 553389 Message-Id: <20230818085849.3489869-2-sujaritha.sundaresan@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Sujaritha Sundaresan Date: Fri, 18 Aug 2023 14:28:48 +0530 Some pcode commands take additional sub-commands and parameters. Add a couple of helpers to help formatting these commands to improve code readability. Signed-off-by: Sujaritha Sundaresan --- drivers/gpu/drm/xe/xe_pcode.c | 28 ++++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_pcode.h | 3 +++ 2 files changed, 31 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_pcode.c b/drivers/gpu/drm/xe/xe_pcode.c index 7f1bf2297f51..e45169f47500 100644 --- a/drivers/gpu/drm/xe/xe_pcode.c +++ b/drivers/gpu/drm/xe/xe_pcode.c @@ -104,6 +104,34 @@ int xe_pcode_read(struct xe_gt *gt, u32 mbox, u32 *val, u32 *val1) return err; } +int xe_pcode_read_p(struct xe_gt *gt, u32 mbcmd, u32 p1, u32 p2, u32 *val) +{ + u32 mbox; + int err; + + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, mbcmd) + | REG_FIELD_PREP(PCODE_MB_PARAM1, p1) + | REG_FIELD_PREP(PCODE_MB_PARAM2, p2); + + err = xe_pcode_read(gt, mbox, val, NULL); + + return err; +} + +int xe_pcode_write_p(struct xe_gt *gt, u32 mbcmd, u32 p1, u32 p2, u32 val) +{ + u32 mbox; + int err; + + mbox = REG_FIELD_PREP(PCODE_MB_COMMAND, mbcmd) + | REG_FIELD_PREP(PCODE_MB_PARAM1, p1) + | REG_FIELD_PREP(PCODE_MB_PARAM2, p2); + + err = xe_pcode_write(gt, mbox, val); + + return err; +} + static int xe_pcode_try_request(struct xe_gt *gt, u32 mbox, u32 request, u32 reply_mask, u32 reply, u32 *status, bool atomic, int timeout_us) diff --git a/drivers/gpu/drm/xe/xe_pcode.h b/drivers/gpu/drm/xe/xe_pcode.h index 3b4aa8c1a3ba..8d4103afd7e0 100644 --- a/drivers/gpu/drm/xe/xe_pcode.h +++ b/drivers/gpu/drm/xe/xe_pcode.h @@ -19,6 +19,9 @@ int xe_pcode_write_timeout(struct xe_gt *gt, u32 mbox, u32 val, #define xe_pcode_write(gt, mbox, val) \ xe_pcode_write_timeout(gt, mbox, val, 1) +int xe_pcode_read_p(struct xe_gt *gt, u32 mbcmd, u32 p1, u32 p2, u32 *val); +int xe_pcode_write_p(struct xe_gt *gt, u32 mbcmd, u32 p1, u32 p2, u32 val); + int xe_pcode_request(struct xe_gt *gt, u32 mbox, u32 request, u32 reply_mask, u32 reply, int timeout_ms); From patchwork Fri Aug 18 08:58:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2/2] drm/xe: Sysfs entries to query vram fused min, max frequency From: Sujaritha Sundaresan X-Patchwork-Id: 553390 Message-Id: <20230818085849.3489869-3-sujaritha.sundaresan@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Sujaritha Sundaresan Date: Fri, 18 Aug 2023 14:28:49 +0530 Add sysfs entries to query fused min and max frequency of vram Signed-off-by: Sujaritha Sundaresan --- drivers/gpu/drm/xe/xe_guc_pc.c | 55 +++++++++++++++++++++++++++++++ drivers/gpu/drm/xe/xe_pcode_api.h | 8 +++++ 2 files changed, 63 insertions(+) diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c index c03bb58e7049..d7e9609c74c0 100644 --- a/drivers/gpu/drm/xe/xe_guc_pc.c +++ b/drivers/gpu/drm/xe/xe_guc_pc.c @@ -20,6 +20,7 @@ #include "xe_map.h" #include "xe_mmio.h" #include "xe_pcode.h" +#include "xe_pcode_api.h" #define MCHBAR_MIRROR_BASE_SNB 0x140000 @@ -568,6 +569,54 @@ static ssize_t freq_max_store(struct device *dev, struct device_attribute *attr, } static DEVICE_ATTR_RW(freq_max); +static ssize_t freq_vram_rp0_show(struct device *dev, struct device_attribute *attr, + char *buff) +{ + struct xe_guc_pc *pc = dev_to_pc(dev); + struct xe_gt *gt = pc_to_gt(pc); + u32 val; + int err; + + err = xe_pcode_read_p(gt, XEHP_PCODE_FREQUENCY_CONFIG, + PCODE_MBOX_FC_SC_READ_FUSED_P0, + PCODE_MBOX_DOMAIN_HBM, &val); + if (err) + return err; + + /* data_out - Fused P0 for domain ID in units of 50 MHz */ + val *= GT_FREQUENCY_MULTIPLIER; + + return sysfs_emit(buff, "%u\n", val); +} +static DEVICE_ATTR_RO(freq_vram_rp0); + +static ssize_t freq_vram_rpn_show(struct device *dev, struct device_attribute *attr, + char *buff) +{ + struct xe_guc_pc *pc = dev_to_pc(dev); + struct xe_gt *gt = pc_to_gt(pc); + u32 val; + int err; + + err = xe_pcode_read_p(gt, XEHP_PCODE_FREQUENCY_CONFIG, + PCODE_MBOX_FC_SC_READ_FUSED_PN, + PCODE_MBOX_DOMAIN_HBM, &val); + if (err) + return err; + + /* data_out - Fused P0 for domain ID in units of 50 MHz */ + val *= GT_FREQUENCY_MULTIPLIER; + + return sysfs_emit(buff, "%u\n", val); +} +static DEVICE_ATTR_RO(freq_vram_rpn); + +static const struct attribute *vram_freq_attrs[] = { + &dev_attr_freq_vram_rp0.attr, + &dev_attr_freq_vram_rpn.attr, + NULL +}; + /** * xe_guc_pc_c_status - get the current GT C state * @pc: XE_GuC_PC instance @@ -921,6 +970,12 @@ int xe_guc_pc_init(struct xe_guc_pc *pc) pc_init_fused_rp_values(pc); + if (IS_DGFX(xe) && xe->info.platform != XE_DG2) { + err = sysfs_create_files(gt->sysfs, vram_freq_attrs); + if (err) + return err; + } + err = sysfs_create_files(gt->sysfs, pc_attrs); if (err) return err; diff --git a/drivers/gpu/drm/xe/xe_pcode_api.h b/drivers/gpu/drm/xe/xe_pcode_api.h index 837ff7c71280..846c99aba3bc 100644 --- a/drivers/gpu/drm/xe/xe_pcode_api.h +++ b/drivers/gpu/drm/xe/xe_pcode_api.h @@ -25,6 +25,14 @@ #define PCODE_DATA0 XE_REG(0x138128) #define PCODE_DATA1 XE_REG(0x13812C) +#define XEHP_PCODE_FREQUENCY_CONFIG 0x6e /* xehp, pvc */ +/* XEHP_PCODE_FREQUENCY_CONFIG sub-commands (param1) */ +#define PCODE_MBOX_FC_SC_READ_FUSED_P0 0x0 +#define PCODE_MBOX_FC_SC_READ_FUSED_PN 0x1 +/* PCODE_MBOX_DOMAIN_* - mailbox domain IDs */ +/* XEHP_PCODE_FREQUENCY_CONFIG param2 */ +#define PCODE_MBOX_DOMAIN_HBM 0x2 + /* Min Freq QOS Table */ #define PCODE_WRITE_MIN_FREQ_TABLE 0x8 #define PCODE_READ_MIN_FREQ_TABLE 0x9