Commit 437bb44d authored by Karol Herbst's avatar Karol Herbst Committed by Ben Skeggs

drm/nouveau/volt: save the voltage range we are able to set

We shouldn't set voltages below the min or above the max voltage the gpu is
able to set, so save the range for future lookups.
Signed-off-by: default avatarKarol Herbst <karolherbst@gmail.de>
Reviewed-by: default avatarMartin Peres <martin.peres@free.fr>
Tested-by: default avatarPierre Moreau <pierre.morrow@free.fr>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 22b6c9e8
...@@ -12,6 +12,9 @@ struct nvkm_volt { ...@@ -12,6 +12,9 @@ struct nvkm_volt {
u32 uv; u32 uv;
u8 vid; u8 vid;
} vid[256]; } vid[256];
u32 max_uv;
u32 min_uv;
}; };
int nvkm_volt_get(struct nvkm_volt *); int nvkm_volt_get(struct nvkm_volt *);
......
...@@ -120,6 +120,8 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt) ...@@ -120,6 +120,8 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt)
data = nvbios_volt_parse(bios, &ver, &hdr, &cnt, &len, &info); data = nvbios_volt_parse(bios, &ver, &hdr, &cnt, &len, &info);
if (data && info.vidmask && info.base && info.step) { if (data && info.vidmask && info.base && info.step) {
volt->min_uv = info.min;
volt->max_uv = info.max;
for (i = 0; i < info.vidmask + 1; i++) { for (i = 0; i < info.vidmask + 1; i++) {
if (info.base >= info.min && if (info.base >= info.min &&
info.base <= info.max) { info.base <= info.max) {
...@@ -131,6 +133,8 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt) ...@@ -131,6 +133,8 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt)
} }
volt->vid_mask = info.vidmask; volt->vid_mask = info.vidmask;
} else if (data && info.vidmask) { } else if (data && info.vidmask) {
volt->min_uv = 0xffffffff;
volt->max_uv = 0;
for (i = 0; i < cnt; i++) { for (i = 0; i < cnt; i++) {
data = nvbios_volt_entry_parse(bios, i, &ver, &hdr, data = nvbios_volt_entry_parse(bios, i, &ver, &hdr,
&ivid); &ivid);
...@@ -138,9 +142,14 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt) ...@@ -138,9 +142,14 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt)
volt->vid[volt->vid_nr].uv = ivid.voltage; volt->vid[volt->vid_nr].uv = ivid.voltage;
volt->vid[volt->vid_nr].vid = ivid.vid; volt->vid[volt->vid_nr].vid = ivid.vid;
volt->vid_nr++; volt->vid_nr++;
volt->min_uv = min(volt->min_uv, ivid.voltage);
volt->max_uv = max(volt->max_uv, ivid.voltage);
} }
} }
volt->vid_mask = info.vidmask; volt->vid_mask = info.vidmask;
} else if (data && info.type == NVBIOS_VOLT_PWM) {
volt->min_uv = info.base;
volt->max_uv = info.base + info.pwm_range;
} }
} }
...@@ -181,8 +190,11 @@ nvkm_volt_ctor(const struct nvkm_volt_func *func, struct nvkm_device *device, ...@@ -181,8 +190,11 @@ nvkm_volt_ctor(const struct nvkm_volt_func *func, struct nvkm_device *device,
volt->func = func; volt->func = func;
/* Assuming the non-bios device should build the voltage table later */ /* Assuming the non-bios device should build the voltage table later */
if (bios) if (bios) {
nvkm_volt_parse_bios(bios, volt); nvkm_volt_parse_bios(bios, volt);
nvkm_debug(&volt->subdev, "min: %iuv max: %iuv\n",
volt->min_uv, volt->max_uv);
}
if (volt->vid_nr) { if (volt->vid_nr) {
for (i = 0; i < volt->vid_nr; i++) { for (i = 0; i < volt->vid_nr; i++) {
......
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