Mesa (main): radv/winsys: add support for new CTX OP to set/get stable pstates

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Feb 21 11:47:33 UTC 2022


Module: Mesa
Branch: main
Commit: 5cf4f0cc9197c2baed4395c12f6e9dc81ee9eae4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5cf4f0cc9197c2baed4395c12f6e9dc81ee9eae4

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri Dec  3 09:03:31 2021 +0100

radv/winsys: add support for new CTX OP to set/get stable pstates

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14038>

---

 src/amd/vulkan/radv_radeon_winsys.h           | 10 ++++++++++
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 28 +++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index 047e07afa22..d72b4d670d8 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -77,6 +77,14 @@ enum radeon_ctx_priority {
    RADEON_CTX_PRIORITY_REALTIME,
 };
 
+enum radeon_ctx_pstate {
+   RADEON_CTX_PSTATE_NONE = 0,
+   RADEON_CTX_PSTATE_STANDARD,
+   RADEON_CTX_PSTATE_MIN_SCLK,
+   RADEON_CTX_PSTATE_MIN_MCLK,
+   RADEON_CTX_PSTATE_PEAK,
+};
+
 enum radeon_value_id {
    RADEON_ALLOCATED_VRAM,
    RADEON_ALLOCATED_VRAM_VIS,
@@ -250,6 +258,8 @@ struct radeon_winsys {
 
    bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx, enum ring_type ring_type, int ring_index);
 
+   int (*ctx_set_pstate)(struct radeon_winsys_ctx *ctx, uint32_t pstate);
+
    enum radeon_bo_domain (*cs_domain)(const struct radeon_winsys *ws);
 
    struct radeon_cmdbuf *(*cs_create)(struct radeon_winsys *ws, enum ring_type ring_type);
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index 9b4f34df7bd..907588c25d6 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -1576,6 +1576,33 @@ radv_amdgpu_ctx_wait_idle(struct radeon_winsys_ctx *rwctx, enum ring_type ring_t
    return true;
 }
 
+static uint32_t
+radv_to_amdgpu_pstate(enum radeon_ctx_pstate radv_pstate)
+{
+   switch (radv_pstate) {
+   case RADEON_CTX_PSTATE_NONE:
+      return AMDGPU_CTX_STABLE_PSTATE_NONE;
+   case RADEON_CTX_PSTATE_STANDARD:
+      return AMDGPU_CTX_STABLE_PSTATE_STANDARD;
+   case RADEON_CTX_PSTATE_MIN_SCLK:
+      return AMDGPU_CTX_STABLE_PSTATE_MIN_SCLK;
+   case RADEON_CTX_PSTATE_MIN_MCLK:
+      return AMDGPU_CTX_STABLE_PSTATE_MIN_MCLK;
+   case RADEON_CTX_PSTATE_PEAK:
+      return AMDGPU_CTX_STABLE_PSTATE_PEAK;
+   default:
+      unreachable("Invalid pstate");
+   }
+}
+
+static int
+radv_amdgpu_ctx_set_pstate(struct radeon_winsys_ctx *rwctx, enum radeon_ctx_pstate pstate)
+{
+   struct radv_amdgpu_ctx *ctx = (struct radv_amdgpu_ctx *)rwctx;
+   uint32_t amdgpu_pstate = radv_to_amdgpu_pstate(pstate);
+   return amdgpu_cs_ctx_stable_pstate(ctx->ctx, AMDGPU_CTX_OP_SET_STABLE_PSTATE, amdgpu_pstate, NULL);
+}
+
 static void *
 radv_amdgpu_cs_alloc_syncobj_chunk(struct radv_winsys_sem_counts *counts, uint32_t queue_syncobj,
                                    struct drm_amdgpu_cs_chunk *chunk, int chunk_id)
@@ -1803,6 +1830,7 @@ radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws)
    ws->base.ctx_create = radv_amdgpu_ctx_create;
    ws->base.ctx_destroy = radv_amdgpu_ctx_destroy;
    ws->base.ctx_wait_idle = radv_amdgpu_ctx_wait_idle;
+   ws->base.ctx_set_pstate = radv_amdgpu_ctx_set_pstate;
    ws->base.cs_domain = radv_amdgpu_cs_domain;
    ws->base.cs_create = radv_amdgpu_cs_create;
    ws->base.cs_destroy = radv_amdgpu_cs_destroy;



More information about the mesa-commit mailing list