Acked-by: Pierre Moreau <[email protected]>

On 2017-09-15 — 17:11, Karol Herbst wrote:
> Later we will have situations where the expected and the current state
> isn't the same.
> 
> Signed-off-by: Karol Herbst <[email protected]>
> Reviewed-by: Martin Peres <[email protected]>
> ---
>  drm/nouveau/include/nvkm/subdev/clk.h |  2 ++
>  drm/nouveau/nvkm/subdev/clk/base.c    | 32 +++++++++++++++++++++++++-------
>  2 files changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/drm/nouveau/include/nvkm/subdev/clk.h 
> b/drm/nouveau/include/nvkm/subdev/clk.h
> index ec537e08..f35518c3 100644
> --- a/drm/nouveau/include/nvkm/subdev/clk.h
> +++ b/drm/nouveau/include/nvkm/subdev/clk.h
> @@ -101,6 +101,8 @@ 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) */
> +     struct nvkm_cstate *cstate;
> +     int exp_cstateid;
>       u8  temp;
>  
>       bool allow_reclock;
> diff --git a/drm/nouveau/nvkm/subdev/clk/base.c 
> b/drm/nouveau/nvkm/subdev/clk/base.c
> index 0d4d9fdf..d37c13b7 100644
> --- a/drm/nouveau/nvkm/subdev/clk/base.c
> +++ b/drm/nouveau/nvkm/subdev/clk/base.c
> @@ -146,9 +146,14 @@ static struct nvkm_cstate *
>  nvkm_cstate_get(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int 
> cstatei)
>  {
>       struct nvkm_cstate *cstate;
> -     if (cstatei == NVKM_CLK_CSTATE_HIGHEST)
> +     switch (cstatei) {
> +     case NVKM_CLK_CSTATE_HIGHEST:
>               return list_last_entry(&pstate->list, typeof(*cstate), head);
> -     else {
> +     case NVKM_CLK_CSTATE_BASE:
> +             return &pstate->base;
> +     case NVKM_CLK_CSTATE_DEFAULT:
> +             return NULL;
> +     default:
>               list_for_each_entry(cstate, &pstate->list, head) {
>                       if (cstate->id == cstatei)
>                               return cstate;
> @@ -167,6 +172,9 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate 
> *pstate, int cstatei)
>       struct nvkm_cstate *cstate;
>       int ret;
>  
> +     if (cstatei == NVKM_CLK_CSTATE_DEFAULT)
> +             return 0;
> +
>       if (!list_empty(&pstate->list)) {
>               cstate = nvkm_cstate_get(clk, pstate, cstatei);
>               cstate = nvkm_cstate_find_best(clk, pstate, cstate);
> @@ -193,6 +201,7 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate 
> *pstate, int cstatei)
>  
>       ret = clk->func->calc(clk, cstate);
>       if (ret == 0) {
> +             clk->cstate = cstate;
>               ret = clk->func->prog(clk);
>               clk->func->tidy(clk);
>       }
> @@ -295,7 +304,7 @@ nvkm_pstate_prog(struct nvkm_clk *clk, int pstatei)
>               ram->func->tidy(ram);
>       }
>  
> -     return nvkm_cstate_prog(clk, pstate, NVKM_CLK_CSTATE_HIGHEST);
> +     return nvkm_cstate_prog(clk, pstate, clk->exp_cstateid);
>  }
>  
>  static void
> @@ -313,9 +322,9 @@ nvkm_clk_update_work(struct work_struct *work)
>               pstate = clk->pstate->pstate;
>       else
>               pstate = NVKM_CLK_PSTATE_DEFAULT;
> -     nvkm_trace(subdev, "P %d PWR %d U(AC) %d U(DC) %d A %d T %d°C\n",
> +     nvkm_trace(subdev, "P %d PWR %d U(AC) %d U(DC) %d A %d C %d T %d°C\n",
>                  pstate, clk->pwrsrc, clk->ustate_ac, clk->ustate_dc,
> -                clk->astate, clk->temp);
> +                clk->astate, clk->exp_cstateid, clk->temp);
>  
>       pstate = clk->pwrsrc ? clk->ustate_ac : clk->ustate_dc;
>       if (clk->state_nr && pstate != -1) {
> @@ -536,6 +545,7 @@ nvkm_clk_ustate(struct nvkm_clk *clk, int req, int pwr)
>       if (ret >= 0) {
>               if (ret -= 2, pwr) clk->ustate_ac = ret;
>               else               clk->ustate_dc = ret;
> +             clk->exp_cstateid = NVKM_CLK_CSTATE_HIGHEST;
>               return nvkm_clk_update(clk, true);
>       }
>       return ret;
> @@ -548,6 +558,7 @@ nvkm_clk_astate(struct nvkm_clk *clk, int req, int rel, 
> bool wait)
>       if ( rel) clk->astate += rel;
>       clk->astate = min(clk->astate, clk->state_nr - 1);
>       clk->astate = max(clk->astate, 0);
> +     clk->exp_cstateid = NVKM_CLK_CSTATE_BASE;
>       return nvkm_clk_update(clk, wait);
>  }
>  
> @@ -618,6 +629,8 @@ nvkm_clk_init(struct nvkm_subdev *subdev)
>  
>       clk->astate = clk->state_nr - 1;
>       clk->pstate = NULL;
> +     clk->exp_cstateid = NVKM_CLK_CSTATE_DEFAULT;
> +     clk->cstate = NULL;
>       clk->temp = 90; /* reasonable default value */
>       nvkm_clk_update(clk, true);
>       return 0;
> @@ -701,15 +714,20 @@ nvkm_clk_ctor(const struct nvkm_clk_func *func, struct 
> nvkm_device *device,
>       if (mode) {
>               clk->ustate_ac = nvkm_clk_nstate(clk, mode, arglen);
>               clk->ustate_dc = nvkm_clk_nstate(clk, mode, arglen);
> +             clk->exp_cstateid = NVKM_CLK_CSTATE_HIGHEST;
>       }
>  
>       mode = nvkm_stropt(device->cfgopt, "NvClkModeAC", &arglen);
> -     if (mode)
> +     if (mode) {
>               clk->ustate_ac = nvkm_clk_nstate(clk, mode, arglen);
> +             clk->exp_cstateid = NVKM_CLK_CSTATE_HIGHEST;
> +     }
>  
>       mode = nvkm_stropt(device->cfgopt, "NvClkModeDC", &arglen);
> -     if (mode)
> +     if (mode) {
>               clk->ustate_dc = nvkm_clk_nstate(clk, mode, arglen);
> +             clk->exp_cstateid = NVKM_CLK_CSTATE_HIGHEST;
> +     }
>  
>       clk->boost_mode = nvkm_longopt(device->cfgopt, "NvBoost",
>                                      NVKM_CLK_BOOST_NONE);
> -- 
> 2.14.1
> 
> _______________________________________________
> Nouveau mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/nouveau

Attachment: signature.asc
Description: PGP signature

_______________________________________________
Nouveau mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to