diff options
30 files changed, 1710 insertions, 706 deletions
diff --git a/drivers/gpu/drm/i2c/ch7006_drv.c b/drivers/gpu/drm/i2c/ch7006_drv.c index 9422a74c8b54..81681a07a806 100644 --- a/drivers/gpu/drm/i2c/ch7006_drv.c +++ b/drivers/gpu/drm/i2c/ch7006_drv.c | |||
| @@ -408,6 +408,11 @@ static int ch7006_probe(struct i2c_client *client, const struct i2c_device_id *i | |||
| 408 | 408 | ||
| 409 | ch7006_info(client, "Detected version ID: %x\n", val); | 409 | ch7006_info(client, "Detected version ID: %x\n", val); |
| 410 | 410 | ||
| 411 | /* I don't know what this is for, but otherwise I get no | ||
| 412 | * signal. | ||
| 413 | */ | ||
| 414 | ch7006_write(client, 0x3d, 0x0); | ||
| 415 | |||
| 411 | return 0; | 416 | return 0; |
| 412 | 417 | ||
| 413 | fail: | 418 | fail: |
diff --git a/drivers/gpu/drm/i2c/ch7006_mode.c b/drivers/gpu/drm/i2c/ch7006_mode.c index 87f5445092e8..e447dfb63890 100644 --- a/drivers/gpu/drm/i2c/ch7006_mode.c +++ b/drivers/gpu/drm/i2c/ch7006_mode.c | |||
| @@ -427,11 +427,6 @@ void ch7006_state_load(struct i2c_client *client, | |||
| 427 | ch7006_load_reg(client, state, CH7006_SUBC_INC7); | 427 | ch7006_load_reg(client, state, CH7006_SUBC_INC7); |
| 428 | ch7006_load_reg(client, state, CH7006_PLL_CONTROL); | 428 | ch7006_load_reg(client, state, CH7006_PLL_CONTROL); |
| 429 | ch7006_load_reg(client, state, CH7006_CALC_SUBC_INC0); | 429 | ch7006_load_reg(client, state, CH7006_CALC_SUBC_INC0); |
| 430 | |||
| 431 | /* I don't know what this is for, but otherwise I get no | ||
| 432 | * signal. | ||
| 433 | */ | ||
| 434 | ch7006_write(client, 0x3d, 0x0); | ||
| 435 | } | 430 | } |
| 436 | 431 | ||
| 437 | void ch7006_state_save(struct i2c_client *client, | 432 | void ch7006_state_save(struct i2c_client *client, |
diff --git a/drivers/gpu/drm/nouveau/Makefile b/drivers/gpu/drm/nouveau/Makefile index 1d90d4d0144f..48c290b5da8c 100644 --- a/drivers/gpu/drm/nouveau/Makefile +++ b/drivers/gpu/drm/nouveau/Makefile | |||
| @@ -8,14 +8,15 @@ nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \ | |||
| 8 | nouveau_sgdma.o nouveau_dma.o \ | 8 | nouveau_sgdma.o nouveau_dma.o \ |
| 9 | nouveau_bo.o nouveau_fence.o nouveau_gem.o nouveau_ttm.o \ | 9 | nouveau_bo.o nouveau_fence.o nouveau_gem.o nouveau_ttm.o \ |
| 10 | nouveau_hw.o nouveau_calc.o nouveau_bios.o nouveau_i2c.o \ | 10 | nouveau_hw.o nouveau_calc.o nouveau_bios.o nouveau_i2c.o \ |
| 11 | nouveau_display.o nouveau_connector.o nouveau_fbcon.o \ | 11 | nouveau_display.o nouveau_connector.o nouveau_fbcon.o \ |
| 12 | nouveau_dp.o \ | 12 | nouveau_dp.o nouveau_grctx.o \ |
| 13 | nv04_timer.o \ | 13 | nv04_timer.o \ |
| 14 | nv04_mc.o nv40_mc.o nv50_mc.o \ | 14 | nv04_mc.o nv40_mc.o nv50_mc.o \ |
| 15 | nv04_fb.o nv10_fb.o nv40_fb.o \ | 15 | nv04_fb.o nv10_fb.o nv40_fb.o \ |
| 16 | nv04_fifo.o nv10_fifo.o nv40_fifo.o nv50_fifo.o \ | 16 | nv04_fifo.o nv10_fifo.o nv40_fifo.o nv50_fifo.o \ |
| 17 | nv04_graph.o nv10_graph.o nv20_graph.o \ | 17 | nv04_graph.o nv10_graph.o nv20_graph.o \ |
| 18 | nv40_graph.o nv50_graph.o \ | 18 | nv40_graph.o nv50_graph.o \ |
| 19 | nv40_grctx.o \ | ||
| 19 | nv04_instmem.o nv50_instmem.o \ | 20 | nv04_instmem.o nv50_instmem.o \ |
| 20 | nv50_crtc.o nv50_dac.o nv50_sor.o \ | 21 | nv50_crtc.o nv50_dac.o nv50_sor.o \ |
| 21 | nv50_cursor.o nv50_display.o nv50_fbcon.o \ | 22 | nv50_cursor.o nv50_display.o nv50_fbcon.o \ |
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c index 5eec5ed69489..ba143972769f 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bios.c +++ b/drivers/gpu/drm/nouveau/nouveau_bios.c | |||
| @@ -181,43 +181,42 @@ struct methods { | |||
| 181 | const char desc[8]; | 181 | const char desc[8]; |
| 182 | void (*loadbios)(struct drm_device *, uint8_t *); | 182 | void (*loadbios)(struct drm_device *, uint8_t *); |
| 183 | const bool rw; | 183 | const bool rw; |
| 184 | int score; | ||
| 185 | }; | 184 | }; |
| 186 | 185 | ||
| 187 | static struct methods nv04_methods[] = { | 186 | static struct methods nv04_methods[] = { |
| 188 | { "PROM", load_vbios_prom, false }, | 187 | { "PROM", load_vbios_prom, false }, |
| 189 | { "PRAMIN", load_vbios_pramin, true }, | 188 | { "PRAMIN", load_vbios_pramin, true }, |
| 190 | { "PCIROM", load_vbios_pci, true }, | 189 | { "PCIROM", load_vbios_pci, true }, |
| 191 | { } | ||
| 192 | }; | 190 | }; |
| 193 | 191 | ||
| 194 | static struct methods nv50_methods[] = { | 192 | static struct methods nv50_methods[] = { |
| 195 | { "PRAMIN", load_vbios_pramin, true }, | 193 | { "PRAMIN", load_vbios_pramin, true }, |
| 196 | { "PROM", load_vbios_prom, false }, | 194 | { "PROM", load_vbios_prom, false }, |
| 197 | { "PCIROM", load_vbios_pci, true }, | 195 | { "PCIROM", load_vbios_pci, true }, |
| 198 | { } | ||
| 199 | }; | 196 | }; |
| 200 | 197 | ||
| 198 | #define METHODCNT 3 | ||
| 199 | |||
| 201 | static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) | 200 | static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) |
| 202 | { | 201 | { |
| 203 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 202 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 204 | struct methods *methods, *method; | 203 | struct methods *methods; |
| 204 | int i; | ||
| 205 | int testscore = 3; | 205 | int testscore = 3; |
| 206 | int scores[METHODCNT]; | ||
| 206 | 207 | ||
| 207 | if (nouveau_vbios) { | 208 | if (nouveau_vbios) { |
| 208 | method = nv04_methods; | 209 | methods = nv04_methods; |
| 209 | while (method->loadbios) { | 210 | for (i = 0; i < METHODCNT; i++) |
| 210 | if (!strcasecmp(nouveau_vbios, method->desc)) | 211 | if (!strcasecmp(nouveau_vbios, methods[i].desc)) |
| 211 | break; | 212 | break; |
| 212 | method++; | ||
| 213 | } | ||
| 214 | 213 | ||
| 215 | if (method->loadbios) { | 214 | if (i < METHODCNT) { |
| 216 | NV_INFO(dev, "Attempting to use BIOS image from %s\n", | 215 | NV_INFO(dev, "Attempting to use BIOS image from %s\n", |
| 217 | method->desc); | 216 | methods[i].desc); |
| 218 | 217 | ||
| 219 | method->loadbios(dev, data); | 218 | methods[i].loadbios(dev, data); |
| 220 | if (score_vbios(dev, data, method->rw)) | 219 | if (score_vbios(dev, data, methods[i].rw)) |
| 221 | return true; | 220 | return true; |
| 222 | } | 221 | } |
| 223 | 222 | ||
| @@ -229,28 +228,24 @@ static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data) | |||
| 229 | else | 228 | else |
| 230 | methods = nv50_methods; | 229 | methods = nv50_methods; |
| 231 | 230 | ||
| 232 | method = methods; | 231 | for (i = 0; i < METHODCNT; i++) { |
| 233 | while (method->loadbios) { | ||
| 234 | NV_TRACE(dev, "Attempting to load BIOS image from %s\n", | 232 | NV_TRACE(dev, "Attempting to load BIOS image from %s\n", |
| 235 | method->desc); | 233 | methods[i].desc); |
| 236 | data[0] = data[1] = 0; /* avoid reuse of previous image */ | 234 | data[0] = data[1] = 0; /* avoid reuse of previous image */ |
| 237 | method->loadbios(dev, data); | 235 | methods[i].loadbios(dev, data); |
| 238 | method->score = score_vbios(dev, data, method->rw); | 236 | scores[i] = score_vbios(dev, data, methods[i].rw); |
| 239 | if (method->score == testscore) | 237 | if (scores[i] == testscore) |
| 240 | return true; | 238 | return true; |
| 241 | method++; | ||
| 242 | } | 239 | } |
| 243 | 240 | ||
| 244 | while (--testscore > 0) { | 241 | while (--testscore > 0) { |
| 245 | method = methods; | 242 | for (i = 0; i < METHODCNT; i++) { |
| 246 | while (method->loadbios) { | 243 | if (scores[i] == testscore) { |
| 247 | if (method->score == testscore) { | ||
