mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
drm/nouveau/volt: Add min_id parameter to nvkm_volt_set_id
Each pstate has its own voltage map entry like each cstate has. The voltages of those entries act as a floor value for the currently selected pstate and nvidia never sets a voltage below them. Signed-off-by: Karol Herbst <karolherbst@gmail.com> Reviewed-by: Martin Peres <martin.peres@free.fr> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
4a4555a7f1
commit
fa6c4d8e2c
3 changed files with 9 additions and 4 deletions
|
@ -29,7 +29,7 @@ struct nvkm_volt {
|
|||
|
||||
int nvkm_volt_map_min(struct nvkm_volt *volt, u8 id);
|
||||
int nvkm_volt_get(struct nvkm_volt *);
|
||||
int nvkm_volt_set_id(struct nvkm_volt *, u8 id, int condition);
|
||||
int nvkm_volt_set_id(struct nvkm_volt *, u8 id, u8 min_id, int condition);
|
||||
|
||||
int nv40_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
|
||||
int gk104_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
|
||||
|
|
|
@ -99,7 +99,8 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei)
|
|||
}
|
||||
|
||||
if (volt) {
|
||||
ret = nvkm_volt_set_id(volt, cstate->voltage, +1);
|
||||
ret = nvkm_volt_set_id(volt, cstate->voltage,
|
||||
pstate->base.voltage, +1);
|
||||
if (ret && ret != -ENODEV) {
|
||||
nvkm_error(subdev, "failed to raise voltage: %d\n", ret);
|
||||
return ret;
|
||||
|
@ -113,7 +114,8 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei)
|
|||
}
|
||||
|
||||
if (volt) {
|
||||
ret = nvkm_volt_set_id(volt, cstate->voltage, -1);
|
||||
ret = nvkm_volt_set_id(volt, cstate->voltage,
|
||||
pstate->base.voltage, -1);
|
||||
if (ret && ret != -ENODEV)
|
||||
nvkm_error(subdev, "failed to lower voltage: %d\n", ret);
|
||||
}
|
||||
|
|
|
@ -110,7 +110,7 @@ nvkm_volt_map(struct nvkm_volt *volt, u8 id)
|
|||
}
|
||||
|
||||
int
|
||||
nvkm_volt_set_id(struct nvkm_volt *volt, u8 id, int condition)
|
||||
nvkm_volt_set_id(struct nvkm_volt *volt, u8 id, u8 min_id, int condition)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -123,6 +123,9 @@ nvkm_volt_set_id(struct nvkm_volt *volt, u8 id, int condition)
|
|||
if (!condition || prev < 0 ||
|
||||
(condition < 0 && ret < prev) ||
|
||||
(condition > 0 && ret > prev)) {
|
||||
int min = nvkm_volt_map(volt, min_id);
|
||||
if (min >= 0)
|
||||
ret = max(min, ret);
|
||||
ret = nvkm_volt_set(volt, ret);
|
||||
} else {
|
||||
ret = 0;
|
||||
|
|
Loading…
Reference in a new issue