[v4,31/37] clk: split out update code to nv40

Submitted by Karol Herbst on April 18, 2016, 7:14 p.m.

Details

Message ID 1461006851-5007-32-git-send-email-nouveau@karolherbst.de
State New
Headers show
Series "Volting/Clocking improvements for Fermi and newer" ( rev: 4 ) in Nouveau

Not browsing as part of any series.

Commit Message

Karol Herbst April 18, 2016, 7:14 p.m.
this code will change for gf100 and newer

Signed-off-by: Karol Herbst <nouveau@karolherbst.de>
---
 drm/nouveau/nvkm/subdev/clk/base.c  | 14 ++++++--------
 drm/nouveau/nvkm/subdev/clk/g84.c   |  1 +
 drm/nouveau/nvkm/subdev/clk/gf100.c |  1 +
 drm/nouveau/nvkm/subdev/clk/gk104.c |  1 +
 drm/nouveau/nvkm/subdev/clk/gk20a.c |  1 +
 drm/nouveau/nvkm/subdev/clk/gm20b.c |  1 +
 drm/nouveau/nvkm/subdev/clk/gt215.c |  1 +
 drm/nouveau/nvkm/subdev/clk/mcp77.c |  1 +
 drm/nouveau/nvkm/subdev/clk/nv40.c  | 15 +++++++++++++++
 drm/nouveau/nvkm/subdev/clk/nv50.c  |  1 +
 drm/nouveau/nvkm/subdev/clk/priv.h  |  5 +++++
 11 files changed, 34 insertions(+), 8 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drm/nouveau/nvkm/subdev/clk/base.c b/drm/nouveau/nvkm/subdev/clk/base.c
index d6f239f..3c40f67 100644
--- a/drm/nouveau/nvkm/subdev/clk/base.c
+++ b/drm/nouveau/nvkm/subdev/clk/base.c
@@ -279,7 +279,7 @@  nvkm_cstate_new(struct nvkm_clk *clk, int idx, struct nvkm_pstate *pstate)
 /******************************************************************************
  * P-States
  *****************************************************************************/
-static int
+int
 nvkm_pstate_prog(struct nvkm_clk *clk, int pstateid)
 {
 	struct nvkm_subdev *subdev = &clk->subdev;
@@ -322,7 +322,10 @@  static void
 nvkm_clk_update_impl(struct nvkm_clk *clk)
 {
 	struct nvkm_subdev *subdev = &clk->subdev;
-	int pstate, ret;
+	int pstate;
+
+	if (!clk->func->update)
+		return;
 
 	clk->pwrsrc = power_supply_is_system_supplied();
 
@@ -341,12 +344,7 @@  nvkm_clk_update_impl(struct nvkm_clk *clk)
 		pstate = -1;
 	}
 
-	nvkm_trace(subdev, "-> %d\n", pstate);
-	ret = nvkm_pstate_prog(clk, pstate);
-	if (ret) {
-		nvkm_error(subdev, "error setting pstate %d: %d\n",
-			   pstate, ret);
-	}
+	clk->func->update(clk, pstate);
 }
 
 static void
diff --git a/drm/nouveau/nvkm/subdev/clk/g84.c b/drm/nouveau/nvkm/subdev/clk/g84.c
index f97e3ec..7b9b30d 100644
--- a/drm/nouveau/nvkm/subdev/clk/g84.c
+++ b/drm/nouveau/nvkm/subdev/clk/g84.c
@@ -29,6 +29,7 @@  g84_clk = {
 	.calc = nv50_clk_calc,
 	.prog = nv50_clk_prog,
 	.tidy = nv50_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal, 0xff },
 		{ nv_clk_src_href   , 0xff },
diff --git a/drm/nouveau/nvkm/subdev/clk/gf100.c b/drm/nouveau/nvkm/subdev/clk/gf100.c
index 71b7c9f..808e1ed 100644
--- a/drm/nouveau/nvkm/subdev/clk/gf100.c
+++ b/drm/nouveau/nvkm/subdev/clk/gf100.c
@@ -437,6 +437,7 @@  gf100_clk = {
 	.calc = gf100_clk_calc,
 	.prog = gf100_clk_prog,
 	.tidy = gf100_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal, 0xff },
 		{ nv_clk_src_href   , 0xff },
diff --git a/drm/nouveau/nvkm/subdev/clk/gk104.c b/drm/nouveau/nvkm/subdev/clk/gk104.c
index 639234f..8448a88 100644
--- a/drm/nouveau/nvkm/subdev/clk/gk104.c
+++ b/drm/nouveau/nvkm/subdev/clk/gk104.c
@@ -482,6 +482,7 @@  gk104_clk = {
 	.calc = gk104_clk_calc,
 	.prog = gk104_clk_prog,
 	.tidy = gk104_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal, 0xff },
 		{ nv_clk_src_href   , 0xff },
diff --git a/drm/nouveau/nvkm/subdev/clk/gk20a.c b/drm/nouveau/nvkm/subdev/clk/gk20a.c
index 5f0ee24..8b64cc9 100644
--- a/drm/nouveau/nvkm/subdev/clk/gk20a.c
+++ b/drm/nouveau/nvkm/subdev/clk/gk20a.c
@@ -636,6 +636,7 @@  gk20a_clk = {
 	.calc = gk20a_clk_calc,
 	.prog = gk20a_clk_prog,
 	.tidy = gk20a_clk_tidy,
+	.update = nv40_clk_update,
 	.pstates = gk20a_pstates,
 	.nr_pstates = ARRAY_SIZE(gk20a_pstates),
 	.domains = {
diff --git a/drm/nouveau/nvkm/subdev/clk/gm20b.c b/drm/nouveau/nvkm/subdev/clk/gm20b.c
index 71b2bbb..8c8eb8c 100644
--- a/drm/nouveau/nvkm/subdev/clk/gm20b.c
+++ b/drm/nouveau/nvkm/subdev/clk/gm20b.c
@@ -168,6 +168,7 @@  gm20b_clk_speedo0 = {
 	.calc = gk20a_clk_calc,
 	.prog = gk20a_clk_prog,
 	.tidy = gk20a_clk_tidy,
+	.update = nv40_clk_update,
 	.pstates = gm20b_pstates,
 	.nr_pstates = ARRAY_SIZE(gm20b_pstates) - 1,
 	.domains = {
diff --git a/drm/nouveau/nvkm/subdev/clk/gt215.c b/drm/nouveau/nvkm/subdev/clk/gt215.c
index 056702e..8913afa 100644
--- a/drm/nouveau/nvkm/subdev/clk/gt215.c
+++ b/drm/nouveau/nvkm/subdev/clk/gt215.c
@@ -520,6 +520,7 @@  gt215_clk = {
 	.calc = gt215_clk_calc,
 	.prog = gt215_clk_prog,
 	.tidy = gt215_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal  , 0xff },
 		{ nv_clk_src_core     , 0x00, 0, "core", 1000 },
diff --git a/drm/nouveau/nvkm/subdev/clk/mcp77.c b/drm/nouveau/nvkm/subdev/clk/mcp77.c
index 1c21b8b..e80b68e 100644
--- a/drm/nouveau/nvkm/subdev/clk/mcp77.c
+++ b/drm/nouveau/nvkm/subdev/clk/mcp77.c
@@ -400,6 +400,7 @@  mcp77_clk = {
 	.calc = mcp77_clk_calc,
 	.prog = mcp77_clk_prog,
 	.tidy = mcp77_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal, 0xff },
 		{ nv_clk_src_href   , 0xff },
diff --git a/drm/nouveau/nvkm/subdev/clk/nv40.c b/drm/nouveau/nvkm/subdev/clk/nv40.c
index 2ab9b9b..a808319 100644
--- a/drm/nouveau/nvkm/subdev/clk/nv40.c
+++ b/drm/nouveau/nvkm/subdev/clk/nv40.c
@@ -201,12 +201,27 @@  nv40_clk_tidy(struct nvkm_clk *obj)
 {
 }
 
+void
+nv40_clk_update(struct nvkm_clk *clk, int pstate)
+{
+	struct nvkm_subdev *subdev = &clk->subdev;
+	int ret;
+
+	nvkm_trace(subdev, "-> %d\n", pstate);
+	ret = nvkm_pstate_prog(clk, pstate);
+	if (ret) {
+		nvkm_error(subdev, "error setting pstate %d: %d\n",
+			   pstate, ret);
+	}
+}
+
 static const struct nvkm_clk_func
 nv40_clk = {
 	.read = nv40_clk_read,
 	.calc = nv40_clk_calc,
 	.prog = nv40_clk_prog,
 	.tidy = nv40_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal, 0xff },
 		{ nv_clk_src_href   , 0xff },
diff --git a/drm/nouveau/nvkm/subdev/clk/nv50.c b/drm/nouveau/nvkm/subdev/clk/nv50.c
index 5841f29..b29318e 100644
--- a/drm/nouveau/nvkm/subdev/clk/nv50.c
+++ b/drm/nouveau/nvkm/subdev/clk/nv50.c
@@ -544,6 +544,7 @@  nv50_clk = {
 	.calc = nv50_clk_calc,
 	.prog = nv50_clk_prog,
 	.tidy = nv50_clk_tidy,
+	.update = nv40_clk_update,
 	.domains = {
 		{ nv_clk_src_crystal, 0xff },
 		{ nv_clk_src_href   , 0xff },
diff --git a/drm/nouveau/nvkm/subdev/clk/priv.h b/drm/nouveau/nvkm/subdev/clk/priv.h
index 51eafc0..958f5e3 100644
--- a/drm/nouveau/nvkm/subdev/clk/priv.h
+++ b/drm/nouveau/nvkm/subdev/clk/priv.h
@@ -10,6 +10,7 @@  struct nvkm_clk_func {
 	int (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
 	int (*prog)(struct nvkm_clk *);
 	void (*tidy)(struct nvkm_clk *);
+	void (*update)(struct nvkm_clk *, int pstate);
 	struct nvkm_pstate *pstates;
 	int nr_pstates;
 	struct nvkm_domain domains[];
@@ -20,7 +21,11 @@  int nvkm_clk_ctor(const struct nvkm_clk_func *, struct nvkm_device *, int,
 int nvkm_clk_new_(const struct nvkm_clk_func *, struct nvkm_device *, int,
 		  bool allow_reclock, struct nvkm_clk **);
 
+int nvkm_pstate_prog(struct nvkm_clk *, int pstateid);
+
 int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
 		      struct nvkm_pll_vals *);
 int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
+
+void nv40_clk_update(struct nvkm_clk *, int pstate);
 #endif

Comments

On 18/04/16 22:14, Karol Herbst wrote:
> this code will change for gf100 and newer

Reviewed-by: Martin Peres <martin.peres@free.fr>
>
> Signed-off-by: Karol Herbst <nouveau@karolherbst.de>
> ---
>   drm/nouveau/nvkm/subdev/clk/base.c  | 14 ++++++--------
>   drm/nouveau/nvkm/subdev/clk/g84.c   |  1 +
>   drm/nouveau/nvkm/subdev/clk/gf100.c |  1 +
>   drm/nouveau/nvkm/subdev/clk/gk104.c |  1 +
>   drm/nouveau/nvkm/subdev/clk/gk20a.c |  1 +
>   drm/nouveau/nvkm/subdev/clk/gm20b.c |  1 +
>   drm/nouveau/nvkm/subdev/clk/gt215.c |  1 +
>   drm/nouveau/nvkm/subdev/clk/mcp77.c |  1 +
>   drm/nouveau/nvkm/subdev/clk/nv40.c  | 15 +++++++++++++++
>   drm/nouveau/nvkm/subdev/clk/nv50.c  |  1 +
>   drm/nouveau/nvkm/subdev/clk/priv.h  |  5 +++++
>   11 files changed, 34 insertions(+), 8 deletions(-)
>
> diff --git a/drm/nouveau/nvkm/subdev/clk/base.c b/drm/nouveau/nvkm/subdev/clk/base.c
> index d6f239f..3c40f67 100644
> --- a/drm/nouveau/nvkm/subdev/clk/base.c
> +++ b/drm/nouveau/nvkm/subdev/clk/base.c
> @@ -279,7 +279,7 @@ nvkm_cstate_new(struct nvkm_clk *clk, int idx, struct nvkm_pstate *pstate)
>   /******************************************************************************
>    * P-States
>    *****************************************************************************/
> -static int
> +int
>   nvkm_pstate_prog(struct nvkm_clk *clk, int pstateid)
>   {
>   	struct nvkm_subdev *subdev = &clk->subdev;
> @@ -322,7 +322,10 @@ static void
>   nvkm_clk_update_impl(struct nvkm_clk *clk)
>   {
>   	struct nvkm_subdev *subdev = &clk->subdev;
> -	int pstate, ret;
> +	int pstate;
> +
> +	if (!clk->func->update)
> +		return;
>   
>   	clk->pwrsrc = power_supply_is_system_supplied();
>   
> @@ -341,12 +344,7 @@ nvkm_clk_update_impl(struct nvkm_clk *clk)
>   		pstate = -1;
>   	}
>   
> -	nvkm_trace(subdev, "-> %d\n", pstate);
> -	ret = nvkm_pstate_prog(clk, pstate);
> -	if (ret) {
> -		nvkm_error(subdev, "error setting pstate %d: %d\n",
> -			   pstate, ret);
> -	}
> +	clk->func->update(clk, pstate);
>   }
>   
>   static void
> diff --git a/drm/nouveau/nvkm/subdev/clk/g84.c b/drm/nouveau/nvkm/subdev/clk/g84.c
> index f97e3ec..7b9b30d 100644
> --- a/drm/nouveau/nvkm/subdev/clk/g84.c
> +++ b/drm/nouveau/nvkm/subdev/clk/g84.c
> @@ -29,6 +29,7 @@ g84_clk = {
>   	.calc = nv50_clk_calc,
>   	.prog = nv50_clk_prog,
>   	.tidy = nv50_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal, 0xff },
>   		{ nv_clk_src_href   , 0xff },
> diff --git a/drm/nouveau/nvkm/subdev/clk/gf100.c b/drm/nouveau/nvkm/subdev/clk/gf100.c
> index 71b7c9f..808e1ed 100644
> --- a/drm/nouveau/nvkm/subdev/clk/gf100.c
> +++ b/drm/nouveau/nvkm/subdev/clk/gf100.c
> @@ -437,6 +437,7 @@ gf100_clk = {
>   	.calc = gf100_clk_calc,
>   	.prog = gf100_clk_prog,
>   	.tidy = gf100_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal, 0xff },
>   		{ nv_clk_src_href   , 0xff },
> diff --git a/drm/nouveau/nvkm/subdev/clk/gk104.c b/drm/nouveau/nvkm/subdev/clk/gk104.c
> index 639234f..8448a88 100644
> --- a/drm/nouveau/nvkm/subdev/clk/gk104.c
> +++ b/drm/nouveau/nvkm/subdev/clk/gk104.c
> @@ -482,6 +482,7 @@ gk104_clk = {
>   	.calc = gk104_clk_calc,
>   	.prog = gk104_clk_prog,
>   	.tidy = gk104_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal, 0xff },
>   		{ nv_clk_src_href   , 0xff },
> diff --git a/drm/nouveau/nvkm/subdev/clk/gk20a.c b/drm/nouveau/nvkm/subdev/clk/gk20a.c
> index 5f0ee24..8b64cc9 100644
> --- a/drm/nouveau/nvkm/subdev/clk/gk20a.c
> +++ b/drm/nouveau/nvkm/subdev/clk/gk20a.c
> @@ -636,6 +636,7 @@ gk20a_clk = {
>   	.calc = gk20a_clk_calc,
>   	.prog = gk20a_clk_prog,
>   	.tidy = gk20a_clk_tidy,
> +	.update = nv40_clk_update,
>   	.pstates = gk20a_pstates,
>   	.nr_pstates = ARRAY_SIZE(gk20a_pstates),
>   	.domains = {
> diff --git a/drm/nouveau/nvkm/subdev/clk/gm20b.c b/drm/nouveau/nvkm/subdev/clk/gm20b.c
> index 71b2bbb..8c8eb8c 100644
> --- a/drm/nouveau/nvkm/subdev/clk/gm20b.c
> +++ b/drm/nouveau/nvkm/subdev/clk/gm20b.c
> @@ -168,6 +168,7 @@ gm20b_clk_speedo0 = {
>   	.calc = gk20a_clk_calc,
>   	.prog = gk20a_clk_prog,
>   	.tidy = gk20a_clk_tidy,
> +	.update = nv40_clk_update,
>   	.pstates = gm20b_pstates,
>   	.nr_pstates = ARRAY_SIZE(gm20b_pstates) - 1,
>   	.domains = {
> diff --git a/drm/nouveau/nvkm/subdev/clk/gt215.c b/drm/nouveau/nvkm/subdev/clk/gt215.c
> index 056702e..8913afa 100644
> --- a/drm/nouveau/nvkm/subdev/clk/gt215.c
> +++ b/drm/nouveau/nvkm/subdev/clk/gt215.c
> @@ -520,6 +520,7 @@ gt215_clk = {
>   	.calc = gt215_clk_calc,
>   	.prog = gt215_clk_prog,
>   	.tidy = gt215_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal  , 0xff },
>   		{ nv_clk_src_core     , 0x00, 0, "core", 1000 },
> diff --git a/drm/nouveau/nvkm/subdev/clk/mcp77.c b/drm/nouveau/nvkm/subdev/clk/mcp77.c
> index 1c21b8b..e80b68e 100644
> --- a/drm/nouveau/nvkm/subdev/clk/mcp77.c
> +++ b/drm/nouveau/nvkm/subdev/clk/mcp77.c
> @@ -400,6 +400,7 @@ mcp77_clk = {
>   	.calc = mcp77_clk_calc,
>   	.prog = mcp77_clk_prog,
>   	.tidy = mcp77_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal, 0xff },
>   		{ nv_clk_src_href   , 0xff },
> diff --git a/drm/nouveau/nvkm/subdev/clk/nv40.c b/drm/nouveau/nvkm/subdev/clk/nv40.c
> index 2ab9b9b..a808319 100644
> --- a/drm/nouveau/nvkm/subdev/clk/nv40.c
> +++ b/drm/nouveau/nvkm/subdev/clk/nv40.c
> @@ -201,12 +201,27 @@ nv40_clk_tidy(struct nvkm_clk *obj)
>   {
>   }
>   
> +void
> +nv40_clk_update(struct nvkm_clk *clk, int pstate)
> +{
> +	struct nvkm_subdev *subdev = &clk->subdev;
> +	int ret;
> +
> +	nvkm_trace(subdev, "-> %d\n", pstate);
> +	ret = nvkm_pstate_prog(clk, pstate);
> +	if (ret) {
> +		nvkm_error(subdev, "error setting pstate %d: %d\n",
> +			   pstate, ret);
> +	}
> +}
> +
>   static const struct nvkm_clk_func
>   nv40_clk = {
>   	.read = nv40_clk_read,
>   	.calc = nv40_clk_calc,
>   	.prog = nv40_clk_prog,
>   	.tidy = nv40_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal, 0xff },
>   		{ nv_clk_src_href   , 0xff },
> diff --git a/drm/nouveau/nvkm/subdev/clk/nv50.c b/drm/nouveau/nvkm/subdev/clk/nv50.c
> index 5841f29..b29318e 100644
> --- a/drm/nouveau/nvkm/subdev/clk/nv50.c
> +++ b/drm/nouveau/nvkm/subdev/clk/nv50.c
> @@ -544,6 +544,7 @@ nv50_clk = {
>   	.calc = nv50_clk_calc,
>   	.prog = nv50_clk_prog,
>   	.tidy = nv50_clk_tidy,
> +	.update = nv40_clk_update,
>   	.domains = {
>   		{ nv_clk_src_crystal, 0xff },
>   		{ nv_clk_src_href   , 0xff },
> diff --git a/drm/nouveau/nvkm/subdev/clk/priv.h b/drm/nouveau/nvkm/subdev/clk/priv.h
> index 51eafc0..958f5e3 100644
> --- a/drm/nouveau/nvkm/subdev/clk/priv.h
> +++ b/drm/nouveau/nvkm/subdev/clk/priv.h
> @@ -10,6 +10,7 @@ struct nvkm_clk_func {
>   	int (*calc)(struct nvkm_clk *, struct nvkm_cstate *);
>   	int (*prog)(struct nvkm_clk *);
>   	void (*tidy)(struct nvkm_clk *);
> +	void (*update)(struct nvkm_clk *, int pstate);
>   	struct nvkm_pstate *pstates;
>   	int nr_pstates;
>   	struct nvkm_domain domains[];
> @@ -20,7 +21,11 @@ int nvkm_clk_ctor(const struct nvkm_clk_func *, struct nvkm_device *, int,
>   int nvkm_clk_new_(const struct nvkm_clk_func *, struct nvkm_device *, int,
>   		  bool allow_reclock, struct nvkm_clk **);
>   
> +int nvkm_pstate_prog(struct nvkm_clk *, int pstateid);
> +
>   int nv04_clk_pll_calc(struct nvkm_clk *, struct nvbios_pll *, int clk,
>   		      struct nvkm_pll_vals *);
>   int nv04_clk_pll_prog(struct nvkm_clk *, u32 reg1, struct nvkm_pll_vals *);
> +
> +void nv40_clk_update(struct nvkm_clk *, int pstate);
>   #endif