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