On 05/03/17 18:35, Karol Herbst wrote:
This makes the code easier, because we can compare the id with
pstate->pstate and safe us the trouble iterating over the entire pstate

saves us from the trouble of iterating over the pstates.

list to match the index.

Signed-off-by: Karol Herbst <karolher...@gmail.com>
Reviewed-by: Martin Peres <martin.pe...@free.fr>
---
 drm/nouveau/nouveau_debugfs.c      |  6 +--
 drm/nouveau/nvkm/subdev/clk/base.c | 78 +++++++++++++++++++-------------------
 2 files changed, 41 insertions(+), 43 deletions(-)

diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c
index fd64dfdc..b114a429 100644
--- a/drm/nouveau/nouveau_debugfs.c
+++ b/drm/nouveau/nouveau_debugfs.c
@@ -96,11 +96,11 @@ nouveau_debugfs_pstate_get(struct seq_file *m, void *data)
                } while (attr.index);

                if (state >= 0) {
-                       if (info.ustate_ac == state)
+                       if (info.ustate_ac == attr.state)
                                seq_printf(m, " AC");
-                       if (info.ustate_dc == state)
+                       if (info.ustate_dc == attr.state)
                                seq_printf(m, " DC");
-                       if (info.pstate == state)
+                       if (info.pstate == attr.state)
                                seq_printf(m, " *");
                } else {
                        if (info.ustate_ac < -1)
diff --git a/drm/nouveau/nvkm/subdev/clk/base.c 
b/drm/nouveau/nvkm/subdev/clk/base.c
index d37c13b7..1d71bf09 100644
--- a/drm/nouveau/nvkm/subdev/clk/base.c
+++ b/drm/nouveau/nvkm/subdev/clk/base.c
@@ -272,23 +272,26 @@ nvkm_cstate_new(struct nvkm_clk *clk, int idx, struct 
nvkm_pstate *pstate)
  * P-States
  *****************************************************************************/
 static int
-nvkm_pstate_prog(struct nvkm_clk *clk, int pstatei)
+nvkm_pstate_prog(struct nvkm_clk *clk, int pstateid)
 {
        struct nvkm_subdev *subdev = &clk->subdev;
        struct nvkm_fb *fb = subdev->device->fb;
        struct nvkm_pci *pci = subdev->device->pci;
        struct nvkm_pstate *pstate;
-       int ret, idx = 0;
+       int ret;

-       if (pstatei == NVKM_CLK_PSTATE_DEFAULT)
+       if (pstateid == NVKM_CLK_PSTATE_DEFAULT)
                return 0;

        list_for_each_entry(pstate, &clk->states, head) {
-               if (idx++ == pstatei)
+               if (pstate->pstate == pstateid)
                        break;
        }

-       nvkm_debug(subdev, "setting performance state %d\n", pstatei);
+       if (!pstate)
+               return -EINVAL;
+
+       nvkm_debug(subdev, "setting performance state %x\n", pstateid);
        clk->pstate = pstate;

        nvkm_pcie_set_link(pci, pstate->pcie_speed, pstate->pcie_width);
@@ -329,7 +332,6 @@ nvkm_clk_update_work(struct work_struct *work)
        pstate = clk->pwrsrc ? clk->ustate_ac : clk->ustate_dc;
        if (clk->state_nr && pstate != -1) {
                pstate = (pstate < 0) ? clk->astate : pstate;
-               pstate = min(pstate, clk->state_nr - 1);
        } else {
                pstate = NVKM_CLK_PSTATE_DEFAULT;
        }
@@ -491,32 +493,9 @@ nvkm_pstate_new(struct nvkm_clk *clk, int idx)
  * Adjustment triggers
  *****************************************************************************/
 static int
-nvkm_clk_ustate_update(struct nvkm_clk *clk, int req)
-{
-       struct nvkm_pstate *pstate;
-       int i = 0;
-
-       if (!clk->allow_reclock)
-               return -ENOSYS;
-
-       if (req != -1 && req != -2) {
-               list_for_each_entry(pstate, &clk->states, head) {
-                       if (pstate->pstate == req)
-                               break;
-                       i++;
-               }
-
-               if (pstate->pstate != req)
-                       return -EINVAL;
-               req = i;
-       }
-
-       return req + 2;
-}
-
-static int
 nvkm_clk_nstate(struct nvkm_clk *clk, const char *mode, int arglen)
 {
+       struct nvkm_pstate *pstate;
        int ret = 1;

        if (clk->allow_reclock && !strncasecmpz(mode, "auto", arglen))
@@ -528,27 +507,46 @@ nvkm_clk_nstate(struct nvkm_clk *clk, const char *mode, 
int arglen)

                ((char *)mode)[arglen] = '\0';
                if (!kstrtol(mode, 0, &v)) {
-                       ret = nvkm_clk_ustate_update(clk, v);
+                       ret = v;
                        if (ret < 0)
                                ret = 1;
                }
                ((char *)mode)[arglen] = save;
        }

-       return ret - 2;
+       if (ret < 0)
+               return ret;
+
+       list_for_each_entry(pstate, &clk->states, head) {
+               if (pstate->pstate == ret)
+                       return ret;
+       }
+       return -EINVAL;
 }

 int
 nvkm_clk_ustate(struct nvkm_clk *clk, int req, int pwr)
 {
-       int ret = nvkm_clk_ustate_update(clk, req);
-       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);
+       struct nvkm_pstate *pstate;
+       bool valid = false;
+
+       list_for_each_entry(pstate, &clk->states, head) {
+               if (pstate->pstate == req) {
+                       valid = true;
+                       break;
+               }
        }
-       return ret;
+
+       if (!valid)
+               return -EINVAL;
+
+       if (pwr)
+               clk->ustate_ac = req;
+       else
+               clk->ustate_dc = req;
+
+       clk->exp_cstateid = NVKM_CLK_CSTATE_HIGHEST;
+       return nvkm_clk_update(clk, true);
 }

 int
@@ -627,7 +625,7 @@ nvkm_clk_init(struct nvkm_subdev *subdev)
        if (clk->func->init)
                return clk->func->init(clk);

-       clk->astate = clk->state_nr - 1;
+       clk->astate = NVKM_CLK_PSTATE_DEFAULT;
        clk->pstate = NULL;
        clk->exp_cstateid = NVKM_CLK_CSTATE_DEFAULT;
        clk->cstate = NULL;

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to