Skip to content

Commit

Permalink
drm/nouveau/volt: save the voltage range we are able to set
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Karol Herbst authored and Ben Skeggs committed Jul 14, 2016
1 parent 22b6c9e commit 437bb44
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
3 changes: 3 additions & 0 deletions drivers/gpu/drm/nouveau/include/nvkm/subdev/volt.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);
Expand Down
14 changes: 13 additions & 1 deletion drivers/gpu/drm/nouveau/nvkm/subdev/volt/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -131,16 +133,23 @@ 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);
if (data) {
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;
}
}

Expand Down Expand Up @@ -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++) {
Expand Down

0 comments on commit 437bb44

Please sign in to comment.