From cb682cc68481950fbb7682d122dc562994dc53d0 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 9 Jun 2011 16:16:38 +1000 Subject: [PATCH] --- yaml --- r: 269587 b: refs/heads/master c: f60dfb996c510d9f197d67983a7f61eaf1c8ad67 h: refs/heads/master i: 269585: c520b0c401295bf2fb027cf2fed163d3ea15f2fe 269583: 3499824d57e500139fe90513317f83f4bd15b419 v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/nouveau/nouveau_volt.c | 43 ++++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index be5922c45a90..199ca0917c02 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c3450239c78a4ef6c10da13dfc18831f43dbe0c5 +refs/heads/master: f60dfb996c510d9f197d67983a7f61eaf1c8ad67 diff --git a/trunk/drivers/gpu/drm/nouveau/nouveau_volt.c b/trunk/drivers/gpu/drm/nouveau/nouveau_volt.c index 9eec27581b16..471daec933f1 100644 --- a/trunk/drivers/gpu/drm/nouveau/nouveau_volt.c +++ b/trunk/drivers/gpu/drm/nouveau/nouveau_volt.c @@ -170,6 +170,13 @@ nouveau_volt_init(struct drm_device *dev) */ vidshift = 2; break; + case 0x40: + headerlen = volt[1]; + recordlen = volt[2]; + entries = volt[3]; /* not a clue what the entries are for.. */ + vidmask = volt[11]; /* guess.. */ + vidshift = 0; + break; default: NV_WARN(dev, "voltage table 0x%02x unknown\n", volt[0]); return; @@ -197,16 +204,36 @@ nouveau_volt_init(struct drm_device *dev) } /* parse vbios entries into common format */ - voltage->level = kcalloc(entries, sizeof(*voltage->level), GFP_KERNEL); - if (!voltage->level) - return; + if (volt[0] < 0x40) { + voltage->nr_level = entries; + voltage->level = + kcalloc(entries, sizeof(*voltage->level), GFP_KERNEL); + if (!voltage->level) + return; - entry = volt + headerlen; - for (i = 0; i < entries; i++, entry += recordlen) { - voltage->level[i].voltage = entry[0] * 10000; - voltage->level[i].vid = entry[1] >> vidshift; + entry = volt + headerlen; + for (i = 0; i < entries; i++, entry += recordlen) { + voltage->level[i].voltage = entry[0] * 10000; + voltage->level[i].vid = entry[1] >> vidshift; + } + } else { + u32 volt_uv = ROM32(volt[4]); + s16 step_uv = ROM16(volt[8]); + u8 vid; + + voltage->nr_level = voltage->vid_mask + 1; + voltage->level = kcalloc(voltage->nr_level, + sizeof(*voltage->level), GFP_KERNEL); + if (!voltage->level) + return; + + for (vid = 0; vid <= voltage->vid_mask; vid++) { + voltage->level[vid].voltage = volt_uv; + voltage->level[vid].vid = vid; + volt_uv += step_uv; + } } - voltage->nr_level = entries; + voltage->supported = true; }