Commit fa6c4d8e authored by Karol Herbst's avatar Karol Herbst Committed by Ben Skeggs

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: default avatarKarol Herbst <karolherbst@gmail.com>
Reviewed-by: default avatarMartin Peres <martin.peres@free.fr>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 4a4555a7
...@@ -29,7 +29,7 @@ struct nvkm_volt { ...@@ -29,7 +29,7 @@ struct nvkm_volt {
int nvkm_volt_map_min(struct nvkm_volt *volt, u8 id); int nvkm_volt_map_min(struct nvkm_volt *volt, u8 id);
int nvkm_volt_get(struct nvkm_volt *); 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 nv40_volt_new(struct nvkm_device *, int, struct nvkm_volt **);
int gk104_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) ...@@ -99,7 +99,8 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei)
} }
if (volt) { 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) { if (ret && ret != -ENODEV) {
nvkm_error(subdev, "failed to raise voltage: %d\n", ret); nvkm_error(subdev, "failed to raise voltage: %d\n", ret);
return ret; return ret;
...@@ -113,7 +114,8 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei) ...@@ -113,7 +114,8 @@ nvkm_cstate_prog(struct nvkm_clk *clk, struct nvkm_pstate *pstate, int cstatei)
} }
if (volt) { 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) if (ret && ret != -ENODEV)
nvkm_error(subdev, "failed to lower voltage: %d\n", ret); nvkm_error(subdev, "failed to lower voltage: %d\n", ret);
} }
......
...@@ -110,7 +110,7 @@ nvkm_volt_map(struct nvkm_volt *volt, u8 id) ...@@ -110,7 +110,7 @@ nvkm_volt_map(struct nvkm_volt *volt, u8 id)
} }
int 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; int ret;
...@@ -123,6 +123,9 @@ nvkm_volt_set_id(struct nvkm_volt *volt, u8 id, int condition) ...@@ -123,6 +123,9 @@ nvkm_volt_set_id(struct nvkm_volt *volt, u8 id, int condition)
if (!condition || prev < 0 || if (!condition || prev < 0 ||
(condition < 0 && ret < prev) || (condition < 0 && ret < prev) ||
(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); ret = nvkm_volt_set(volt, ret);
} else { } else {
ret = 0; ret = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment