[14/32] clk: Hold information about the current cstate status

Submitted by Karol Herbst on Nov. 17, 2017, 12:04 a.m.

Details

Message ID 20171117000436.2432-15-karolherbst@gmail.com
State New
Headers show
Series "Updated State of my clk patches" ( rev: 1 ) in Nouveau

Not browsing as part of any series.

Commit Message

Karol Herbst Nov. 17, 2017, 12:04 a.m.
Later we will have situations where the expected and the current state
isn't the same.

Signed-off-by: Karol Herbst <karolherbst@gmail.com>
Reviewed-by: Martin Peres <martin.peres@free.fr>
Acked-by: Pierre Moreau <pierre.morrow@free.fr>
---
 drm/nouveau/include/nvkm/subdev/clk.h | 9 +++++----
 drm/nouveau/nvkm/subdev/clk/base.c    | 5 +++++
 2 files changed, 10 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drm/nouveau/include/nvkm/subdev/clk.h b/drm/nouveau/include/nvkm/subdev/clk.h
index ebaa57eb..310df485 100644
--- a/drm/nouveau/include/nvkm/subdev/clk.h
+++ b/drm/nouveau/include/nvkm/subdev/clk.h
@@ -6,11 +6,11 @@ 
 struct nvbios_pll;
 struct nvkm_pll_vals;
 
-#define NVKM_CLK_PSTATE_BOOT    -1 /* POSTed default */
+#define NVKM_CLK_PSTATE_BOOT -1 /* POSTed default */
 
-#define NVKM_CLK_CSTATE_DEFAULT -1 /* POSTed default */
-#define NVKM_CLK_CSTATE_BASE    -2 /* pstate base */
-#define NVKM_CLK_CSTATE_AUTO    -3 /* highest possible */
+#define NVKM_CLK_CSTATE_BOOT -1 /* POSTed default */
+#define NVKM_CLK_CSTATE_BASE -2 /* pstate base */
+#define NVKM_CLK_CSTATE_AUTO -3 /* highest possible */
 
 enum nv_clk_src {
 	nv_clk_src_crystal,
@@ -101,6 +101,7 @@  struct nvkm_clk {
 	int ustate_ac; /* user-requested (-1 disabled, -2 perfmon) */
 	int ustate_dc; /* user-requested (-1 disabled, -2 perfmon) */
 	int astate; /* perfmon adjustment (base) */
+	int cstate_id;
 	int temp;
 
 	bool allow_reclock;
diff --git a/drm/nouveau/nvkm/subdev/clk/base.c b/drm/nouveau/nvkm/subdev/clk/base.c
index 85b9fb48..b2c1605e 100644
--- a/drm/nouveau/nvkm/subdev/clk/base.c
+++ b/drm/nouveau/nvkm/subdev/clk/base.c
@@ -167,6 +167,9 @@  nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate,
 	struct nvkm_cstate *cstate;
 	int ret;
 
+	if (cstate_id == NVKM_CLK_CSTATE_BOOT)
+		return 0;
+
 	if (!list_empty(&pstate->cstates)) {
 		cstate = nvkm_cstate_get(clk, pstate, cstate_id);
 		cstate = nvkm_cstate_find_best(clk, pstate, cstate);
@@ -196,6 +199,7 @@  nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate,
 		ret = clk->func->prog(clk);
 		clk->func->tidy(clk);
 	}
+	clk->cstate_id = cstate->id;
 
 	if (volt) {
 		ret = nvkm_volt_set_id(volt, cstate->voltage,
@@ -603,6 +607,7 @@  nvkm_clk_init(struct nvkm_subdev *subdev)
 
 	clk->astate = NVKM_CLK_PSTATE_BOOT;
 	clk->pstate_id = NVKM_CLK_PSTATE_BOOT;
+	clk->cstate_id = NVKM_CLK_CSTATE_BOOT;
 	clk->temp = 90; /* reasonable default value */
 	nvkm_clk_update(clk, true);
 	return 0;