Signed-off-by: Karol Herbst <karolher...@gmail.com>
---
 drm/nouveau/include/nvkm/subdev/clk.h |  1 +
 drm/nouveau/nvkm/subdev/clk/base.c    | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/drm/nouveau/include/nvkm/subdev/clk.h 
b/drm/nouveau/include/nvkm/subdev/clk.h
index 70505c9b..fae45e6e 100644
--- a/drm/nouveau/include/nvkm/subdev/clk.h
+++ b/drm/nouveau/include/nvkm/subdev/clk.h
@@ -120,6 +120,7 @@ struct nvkm_clk {
        u8  boost_mode;
        struct nvkm_clk_limit base_limit;
        struct nvkm_clk_limit boost_limit;
+       struct nvkm_clk_limit batt_limit;
        u32 max_khz;
 
        /*XXX: die, these are here *only* to support the completely
diff --git a/drm/nouveau/nvkm/subdev/clk/base.c 
b/drm/nouveau/nvkm/subdev/clk/base.c
index 994d32b9..0de5b3dc 100644
--- a/drm/nouveau/nvkm/subdev/clk/base.c
+++ b/drm/nouveau/nvkm/subdev/clk/base.c
@@ -98,6 +98,14 @@ nvkm_cstate_valid(struct nvkm_clk *clk, struct nvkm_cstate 
*cstate,
                break;
        }
 
+       if (!clk->pwrsrc) {
+               u32 blimit = clk->batt_limit.max_khz;
+               if (!limit)
+                       limit = blimit;
+               else if (blimit)
+                       limit = min(blimit, limit);
+       }
+
        if (limit) {
                for (; domain && domain->name != nv_clk_src_max; domain++) {
                        u32 freq;
@@ -309,6 +317,14 @@ nvkm_pstate_find_best(struct nvkm_clk *clk, struct 
nvkm_pstate *start)
                break;
        }
 
+       if (!clk->pwrsrc) {
+               u8 blimit = clk->batt_limit.pstate;
+               if (!limit)
+                       limit = blimit;
+               else if (blimit)
+                       limit = min(blimit, limit);
+       }
+
        if (!limit)
                return start;
 
@@ -807,6 +823,8 @@ nvkm_clk_ctor(const struct nvkm_clk_func *func, struct 
nvkm_device *device,
                        nvkm_clk_fill_limit(&clk->boost_limit, &vpe);
                if (!nvbios_vpstate_entry(bios, &h, h.base_id, &vpe))
                        nvkm_clk_fill_limit(&clk->base_limit, &vpe);
+               if (!nvbios_vpstate_entry(bios, &h, h.battery_id, &vpe))
+                       nvkm_clk_fill_limit(&clk->batt_limit, &vpe);
        }
 
        clk->func = func;
-- 
2.14.1

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

Reply via email to