mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-23 11:04:44 +08:00
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: Karol Herbst <karolherbst@gmail.de> Reviewed-by: Martin Peres <martin.peres@free.fr> Tested-by: Pierre Moreau <pierre.morrow@free.fr> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
22b6c9e8fe
commit
437bb44d38
@ -12,6 +12,9 @@ struct nvkm_volt {
|
||||
u32 uv;
|
||||
u8 vid;
|
||||
} vid[256];
|
||||
|
||||
u32 max_uv;
|
||||
u32 min_uv;
|
||||
};
|
||||
|
||||
int nvkm_volt_get(struct nvkm_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);
|
||||
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++) {
|
||||
if (info.base >= info.min &&
|
||||
info.base <= info.max) {
|
||||
@ -131,6 +133,8 @@ nvkm_volt_parse_bios(struct nvkm_bios *bios, struct nvkm_volt *volt)
|
||||
}
|
||||
volt->vid_mask = info.vidmask;
|
||||
} else if (data && info.vidmask) {
|
||||
volt->min_uv = 0xffffffff;
|
||||
volt->max_uv = 0;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
data = nvbios_volt_entry_parse(bios, i, &ver, &hdr,
|
||||
&ivid);
|
||||
@ -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].vid = ivid.vid;
|
||||
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;
|
||||
} 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,
|
||||
volt->func = func;
|
||||
|
||||
/* Assuming the non-bios device should build the voltage table later */
|
||||
if (bios)
|
||||
if (bios) {
|
||||
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) {
|
||||
for (i = 0; i < volt->vid_nr; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user