1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "drmP.h"
26#define NV_DEBUG_NOTRACE
27#include "nouveau_drv.h"
28#include "nouveau_hw.h"
29#include "nouveau_encoder.h"
30
31#include <linux/io-mapping.h>
32
33
34#define NV_CIO_CRE_44_HEADA 0x0
35#define NV_CIO_CRE_44_HEADB 0x3
36#define FEATURE_MOBILE 0x10
37#define LEGACY_I2C_CRT 0x80
38#define LEGACY_I2C_PANEL 0x81
39#define LEGACY_I2C_TV 0x82
40
41#define EDID1_LEN 128
42
43#define BIOSLOG(sip, fmt, arg...) NV_DEBUG(sip->dev, fmt, ##arg)
44#define LOG_OLD_VALUE(x)
45
46struct init_exec {
47 bool execute;
48 bool repeat;
49};
50
51static bool nv_cksum(const uint8_t *data, unsigned int length)
52{
53
54
55
56
57 int i;
58 uint8_t sum = 0;
59
60 for (i = 0; i < length; i++)
61 sum += data[i];
62
63 if (sum)
64 return true;
65
66 return false;
67}
68
69static int
70score_vbios(struct drm_device *dev, const uint8_t *data, const bool writeable)
71{
72 if (!(data[0] == 0x55 && data[1] == 0xAA)) {
73 NV_TRACEWARN(dev, "... BIOS signature not found\n");
74 return 0;
75 }
76
77 if (nv_cksum(data, data[2] * 512)) {
78 NV_TRACEWARN(dev, "... BIOS checksum invalid\n");
79
80 return writeable ? 2 : 1;
81 } else
82 NV_TRACE(dev, "... appears to be valid\n");
83
84 return 3;
85}
86
87static void load_vbios_prom(struct drm_device *dev, uint8_t *data)
88{
89 struct drm_nouveau_private *dev_priv = dev->dev_private;
90 uint32_t pci_nv_20, save_pci_nv_20;
91 int pcir_ptr;
92 int i;
93
94 if (dev_priv->card_type >= NV_50)
95 pci_nv_20 = 0x88050;
96 else
97 pci_nv_20 = NV_PBUS_PCI_NV_20;
98
99
100 save_pci_nv_20 = nvReadMC(dev, pci_nv_20);
101 nvWriteMC(dev, pci_nv_20,
102 save_pci_nv_20 & ~NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED);
103
104
105 if (nv_rd08(dev, NV_PROM_OFFSET) != 0x55 ||
106 nv_rd08(dev, NV_PROM_OFFSET + 1) != 0xaa)
107 goto out;
108
109
110 pcir_ptr = nv_rd08(dev, NV_PROM_OFFSET + 0x18) |
111 nv_rd08(dev, NV_PROM_OFFSET + 0x19) << 8;
112 if (nv_rd08(dev, NV_PROM_OFFSET + pcir_ptr) != 'P' ||
113 nv_rd08(dev, NV_PROM_OFFSET + pcir_ptr + 1) != 'C' ||
114 nv_rd08(dev, NV_PROM_OFFSET + pcir_ptr + 2) != 'I' ||
115 nv_rd08(dev, NV_PROM_OFFSET + pcir_ptr + 3) != 'R')
116 goto out;
117
118
119
120
121
122 for (i = 0; i < NV_PROM_SIZE; i++)
123 data[i] = nv_rd08(dev, NV_PROM_OFFSET + i);
124
125out:
126
127 nvWriteMC(dev, pci_nv_20,
128 save_pci_nv_20 | NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED);
129}
130
131static void load_vbios_pramin(struct drm_device *dev, uint8_t *data)
132{
133 struct drm_nouveau_private *dev_priv = dev->dev_private;
134 uint32_t old_bar0_pramin = 0;
135 int i;
136
137 if (dev_priv->card_type >= NV_50) {
138 uint32_t vbios_vram = (nv_rd32(dev, 0x619f04) & ~0xff) << 8;
139
140 if (!vbios_vram)
141 vbios_vram = (nv_rd32(dev, 0x1700) << 16) + 0xf0000;
142
143 old_bar0_pramin = nv_rd32(dev, 0x1700);
144 nv_wr32(dev, 0x1700, vbios_vram >> 16);
145 }
146
147
148 if (nv_rd08(dev, NV_PRAMIN_OFFSET) != 0x55 ||
149 nv_rd08(dev, NV_PRAMIN_OFFSET + 1) != 0xaa)
150 goto out;
151
152 for (i = 0; i < NV_PROM_SIZE; i++)
153 data[i] = nv_rd08(dev, NV_PRAMIN_OFFSET + i);
154
155out:
156 if (dev_priv->card_type >= NV_50)
157 nv_wr32(dev, 0x1700, old_bar0_pramin);
158}
159
160static void load_vbios_pci(struct drm_device *dev, uint8_t *data)
161{
162 void __iomem *rom = NULL;
163 size_t rom_len;
164 int ret;
165
166 ret = pci_enable_rom(dev->pdev);
167 if (ret)
168 return;
169
170 rom = pci_map_rom(dev->pdev, &rom_len);
171 if (!rom)
172 goto out;
173 memcpy_fromio(data, rom, rom_len);
174 pci_unmap_rom(dev->pdev, rom);
175
176out:
177 pci_disable_rom(dev->pdev);
178}
179
180static void load_vbios_acpi(struct drm_device *dev, uint8_t *data)
181{
182 int i;
183 int ret;
184 int size = 64 * 1024;
185
186 if (!nouveau_acpi_rom_supported(dev->pdev))
187 return;
188
189 for (i = 0; i < (size / ROM_BIOS_PAGE); i++) {
190 ret = nouveau_acpi_get_bios_chunk(data,
191 (i * ROM_BIOS_PAGE),
192 ROM_BIOS_PAGE);
193 if (ret <= 0)
194 break;
195 }
196 return;
197}
198
199struct methods {
200 const char desc[8];
201 void (*loadbios)(struct drm_device *, uint8_t *);
202 const bool rw;
203};
204
205static struct methods shadow_methods[] = {
206 { "PRAMIN", load_vbios_pramin, true },
207 { "PROM", load_vbios_prom, false },
208 { "PCIROM", load_vbios_pci, true },
209 { "ACPI", load_vbios_acpi, true },
210};
211#define NUM_SHADOW_METHODS ARRAY_SIZE(shadow_methods)
212
213static bool NVShadowVBIOS(struct drm_device *dev, uint8_t *data)
214{
215 struct methods *methods = shadow_methods;
216 int testscore = 3;
217 int scores[NUM_SHADOW_METHODS], i;
218
219 if (nouveau_vbios) {
220 for (i = 0; i < NUM_SHADOW_METHODS; i++)
221 if (!strcasecmp(nouveau_vbios, methods[i].desc))
222 break;
223
224 if (i < NUM_SHADOW_METHODS) {
225 NV_INFO(dev, "Attempting to use BIOS image from %s\n",
226 methods[i].desc);
227
228 methods[i].loadbios(dev, data);
229 if (score_vbios(dev, data, methods[i].rw))
230 return true;
231 }
232
233 NV_ERROR(dev, "VBIOS source \'%s\' invalid\n", nouveau_vbios);
234 }
235
236 for (i = 0; i < NUM_SHADOW_METHODS; i++) {
237 NV_TRACE(dev, "Attempting to load BIOS image from %s\n",
238 methods[i].desc);
239 data[0] = data[1] = 0;
240 methods[i].loadbios(dev, data);
241 scores[i] = score_vbios(dev, data, methods[i].rw);
242 if (scores[i] == testscore)
243 return true;
244 }
245
246 while (--testscore > 0) {
247 for (i = 0; i < NUM_SHADOW_METHODS; i++) {
248 if (scores[i] == testscore) {
249 NV_TRACE(dev, "Using BIOS image from %s\n",
250 methods[i].desc);
251 methods[i].loadbios(dev, data);
252 return true;
253 }
254 }
255 }
256
257 NV_ERROR(dev, "No valid BIOS image found\n");
258 return false;
259}
260
261struct init_tbl_entry {
262 char *name;
263 uint8_t id;
264
265
266
267
268
269 int (*handler)(struct nvbios *, uint16_t, struct init_exec *);
270};
271
272static int parse_init_table(struct nvbios *, unsigned int, struct init_exec *);
273
274#define MACRO_INDEX_SIZE 2
275#define MACRO_SIZE 8
276#define CONDITION_SIZE 12
277#define IO_FLAG_CONDITION_SIZE 9
278#define IO_CONDITION_SIZE 5
279#define MEM_INIT_SIZE 66
280
281static void still_alive(void)
282{
283#if 0
284 sync();
285 msleep(2);
286#endif
287}
288
289static uint32_t
290munge_reg(struct nvbios *bios, uint32_t reg)
291{
292 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
293 struct dcb_entry *dcbent = bios->display.output;
294
295 if (dev_priv->card_type < NV_50)
296 return reg;
297
298 if (reg & 0x40000000) {
299 BUG_ON(!dcbent);
300
301 reg += (ffs(dcbent->or) - 1) * 0x800;
302 if ((reg & 0x20000000) && !(dcbent->sorconf.link & 1))
303 reg += 0x00000080;
304 }
305
306 reg &= ~0x60000000;
307 return reg;
308}
309
310static int
311valid_reg(struct nvbios *bios, uint32_t reg)
312{
313 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
314 struct drm_device *dev = bios->dev;
315
316
317 if (reg & 0x2 ||
318 (reg & 0x1 && dev_priv->vbios.chip_version != 0x51))
319 NV_ERROR(dev, "======= misaligned reg 0x%08X =======\n", reg);
320
321
322 if (reg & 0x1 && dev_priv->vbios.chip_version == 0x51 &&
323 reg != 0x130d && reg != 0x1311 && reg != 0x60081d)
324 NV_WARN(dev, "=== C51 misaligned reg 0x%08X not verified ===\n",
325 reg);
326
327 if (reg >= (8*1024*1024)) {
328 NV_ERROR(dev, "=== reg 0x%08x out of mapped bounds ===\n", reg);
329 return 0;
330 }
331
332 return 1;
333}
334
335static bool
336valid_idx_port(struct nvbios *bios, uint16_t port)
337{
338 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
339 struct drm_device *dev = bios->dev;
340
341
342
343
344
345
346 if (dev_priv->card_type < NV_50) {
347 if (port == NV_CIO_CRX__COLOR)
348 return true;
349 if (port == NV_VIO_SRX)
350 return true;
351 } else {
352 if (port == NV_CIO_CRX__COLOR)
353 return true;
354 }
355
356 NV_ERROR(dev, "========== unknown indexed io port 0x%04X ==========\n",
357 port);
358
359 return false;
360}
361
362static bool
363valid_port(struct nvbios *bios, uint16_t port)
364{
365 struct drm_device *dev = bios->dev;
366
367
368
369
370
371
372 if (port == NV_VIO_VSE2)
373 return true;
374
375 NV_ERROR(dev, "========== unknown io port 0x%04X ==========\n", port);
376
377 return false;
378}
379
380static uint32_t
381bios_rd32(struct nvbios *bios, uint32_t reg)
382{
383 uint32_t data;
384
385 reg = munge_reg(bios, reg);
386 if (!valid_reg(bios, reg))
387 return 0;
388
389
390
391
392
393
394
395
396
397
398
399
400
401 if (reg & 0x1)
402 reg &= ~0x1;
403
404 data = nv_rd32(bios->dev, reg);
405
406 BIOSLOG(bios, " Read: Reg: 0x%08X, Data: 0x%08X\n", reg, data);
407
408 return data;
409}
410
411static void
412bios_wr32(struct nvbios *bios, uint32_t reg, uint32_t data)
413{
414 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
415
416 reg = munge_reg(bios, reg);
417 if (!valid_reg(bios, reg))
418 return;
419
420
421 if (reg & 0x1)
422 reg &= 0xfffffffe;
423
424 LOG_OLD_VALUE(bios_rd32(bios, reg));
425 BIOSLOG(bios, " Write: Reg: 0x%08X, Data: 0x%08X\n", reg, data);
426
427 if (dev_priv->vbios.execute) {
428 still_alive();
429 nv_wr32(bios->dev, reg, data);
430 }
431}
432
433static uint8_t
434bios_idxprt_rd(struct nvbios *bios, uint16_t port, uint8_t index)
435{
436 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
437 struct drm_device *dev = bios->dev;
438 uint8_t data;
439
440 if (!valid_idx_port(bios, port))
441 return 0;
442
443 if (dev_priv->card_type < NV_50) {
444 if (port == NV_VIO_SRX)
445 data = NVReadVgaSeq(dev, bios->state.crtchead, index);
446 else
447 data = NVReadVgaCrtc(dev, bios->state.crtchead, index);
448 } else {
449 uint32_t data32;
450
451 data32 = bios_rd32(bios, NV50_PDISPLAY_VGACRTC(index & ~3));
452 data = (data32 >> ((index & 3) << 3)) & 0xff;
453 }
454
455 BIOSLOG(bios, " Indexed IO read: Port: 0x%04X, Index: 0x%02X, "
456 "Head: 0x%02X, Data: 0x%02X\n",
457 port, index, bios->state.crtchead, data);
458 return data;
459}
460
461static void
462bios_idxprt_wr(struct nvbios *bios, uint16_t port, uint8_t index, uint8_t data)
463{
464 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
465 struct drm_device *dev = bios->dev;
466
467 if (!valid_idx_port(bios, port))
468 return;
469
470
471
472
473
474
475
476
477 if (port == NV_CIO_CRX__COLOR && index == NV_CIO_CRE_44 &&
478 data != NV_CIO_CRE_44_HEADB)
479 bios->state.crtchead = 0;
480
481 LOG_OLD_VALUE(bios_idxprt_rd(bios, port, index));
482 BIOSLOG(bios, " Indexed IO write: Port: 0x%04X, Index: 0x%02X, "
483 "Head: 0x%02X, Data: 0x%02X\n",
484 port, index, bios->state.crtchead, data);
485
486 if (bios->execute && dev_priv->card_type < NV_50) {
487 still_alive();
488 if (port == NV_VIO_SRX)
489 NVWriteVgaSeq(dev, bios->state.crtchead, index, data);
490 else
491 NVWriteVgaCrtc(dev, bios->state.crtchead, index, data);
492 } else
493 if (bios->execute) {
494 uint32_t data32, shift = (index & 3) << 3;
495
496 still_alive();
497
498 data32 = bios_rd32(bios, NV50_PDISPLAY_VGACRTC(index & ~3));
499 data32 &= ~(0xff << shift);
500 data32 |= (data << shift);
501 bios_wr32(bios, NV50_PDISPLAY_VGACRTC(index & ~3), data32);
502 }
503
504 if (port == NV_CIO_CRX__COLOR &&
505 index == NV_CIO_CRE_44 && data == NV_CIO_CRE_44_HEADB)
506 bios->state.crtchead = 1;
507}
508
509static uint8_t
510bios_port_rd(struct nvbios *bios, uint16_t port)
511{
512 uint8_t data, head = bios->state.crtchead;
513
514 if (!valid_port(bios, port))
515 return 0;
516
517 data = NVReadPRMVIO(bios->dev, head, NV_PRMVIO0_OFFSET + port);
518
519 BIOSLOG(bios, " IO read: Port: 0x%04X, Head: 0x%02X, Data: 0x%02X\n",
520 port, head, data);
521
522 return data;
523}
524
525static void
526bios_port_wr(struct nvbios *bios, uint16_t port, uint8_t data)
527{
528 int head = bios->state.crtchead;
529
530 if (!valid_port(bios, port))
531 return;
532
533 LOG_OLD_VALUE(bios_port_rd(bios, port));
534 BIOSLOG(bios, " IO write: Port: 0x%04X, Head: 0x%02X, Data: 0x%02X\n",
535 port, head, data);
536
537 if (!bios->execute)
538 return;
539
540 still_alive();
541 NVWritePRMVIO(bios->dev, head, NV_PRMVIO0_OFFSET + port, data);
542}
543
544static bool
545io_flag_condition_met(struct nvbios *bios, uint16_t offset, uint8_t cond)
546{
547
548
549
550
551
552
553
554
555
556
557 uint16_t condptr = bios->io_flag_condition_tbl_ptr + cond * IO_FLAG_CONDITION_SIZE;
558 uint16_t crtcport = ROM16(bios->data[condptr]);
559 uint8_t crtcindex = bios->data[condptr + 2];
560 uint8_t mask = bios->data[condptr + 3];
561 uint8_t shift = bios->data[condptr + 4];
562 uint16_t flagarray = ROM16(bios->data[condptr + 5]);
563 uint8_t flagarraymask = bios->data[condptr + 7];
564 uint8_t cmpval = bios->data[condptr + 8];
565 uint8_t data;
566
567 BIOSLOG(bios, "0x%04X: Port: 0x%04X, Index: 0x%02X, Mask: 0x%02X, "
568 "Shift: 0x%02X, FlagArray: 0x%04X, FAMask: 0x%02X, "
569 "Cmpval: 0x%02X\n",
570 offset, crtcport, crtcindex, mask, shift, flagarray, flagarraymask, cmpval);
571
572 data = bios_idxprt_rd(bios, crtcport, crtcindex);
573
574 data = bios->data[flagarray + ((data & mask) >> shift)];
575 data &= flagarraymask;
576
577 BIOSLOG(bios, "0x%04X: Checking if 0x%02X equals 0x%02X\n",
578 offset, data, cmpval);
579
580 return (data == cmpval);
581}
582
583static bool
584bios_condition_met(struct nvbios *bios, uint16_t offset, uint8_t cond)
585{
586
587
588
589
590
591
592 uint16_t condptr = bios->condition_tbl_ptr + cond * CONDITION_SIZE;
593 uint32_t reg = ROM32(bios->data[condptr]);
594 uint32_t mask = ROM32(bios->data[condptr + 4]);
595 uint32_t cmpval = ROM32(bios->data[condptr + 8]);
596 uint32_t data;
597
598 BIOSLOG(bios, "0x%04X: Cond: 0x%02X, Reg: 0x%08X, Mask: 0x%08X\n",
599 offset, cond, reg, mask);
600
601 data = bios_rd32(bios, reg) & mask;
602
603 BIOSLOG(bios, "0x%04X: Checking if 0x%08X equals 0x%08X\n",
604 offset, data, cmpval);
605
606 return (data == cmpval);
607}
608
609static bool
610io_condition_met(struct nvbios *bios, uint16_t offset, uint8_t cond)
611{
612
613
614
615
616
617
618
619 uint16_t condptr = bios->io_condition_tbl_ptr + cond * IO_CONDITION_SIZE;
620 uint16_t io_port = ROM16(bios->data[condptr]);
621 uint8_t port_index = bios->data[condptr + 2];
622 uint8_t mask = bios->data[condptr + 3];
623 uint8_t cmpval = bios->data[condptr + 4];
624
625 uint8_t data = bios_idxprt_rd(bios, io_port, port_index) & mask;
626
627 BIOSLOG(bios, "0x%04X: Checking if 0x%02X equals 0x%02X\n",
628 offset, data, cmpval);
629
630 return (data == cmpval);
631}
632
633static int
634nv50_pll_set(struct drm_device *dev, uint32_t reg, uint32_t clk)
635{
636 struct drm_nouveau_private *dev_priv = dev->dev_private;
637 uint32_t reg0 = nv_rd32(dev, reg + 0);
638 uint32_t reg1 = nv_rd32(dev, reg + 4);
639 struct nouveau_pll_vals pll;
640 struct pll_lims pll_limits;
641 int ret;
642
643 ret = get_pll_limits(dev, reg, &pll_limits);
644 if (ret)
645 return ret;
646
647 clk = nouveau_calc_pll_mnp(dev, &pll_limits, clk, &pll);
648 if (!clk)
649 return -ERANGE;
650
651 reg0 = (reg0 & 0xfff8ffff) | (pll.log2P << 16);
652 reg1 = (reg1 & 0xffff0000) | (pll.N1 << 8) | pll.M1;
653
654 if (dev_priv->vbios.execute) {
655 still_alive();
656 nv_wr32(dev, reg + 4, reg1);
657 nv_wr32(dev, reg + 0, reg0);
658 }
659
660 return 0;
661}
662
663static int
664setPLL(struct nvbios *bios, uint32_t reg, uint32_t clk)
665{
666 struct drm_device *dev = bios->dev;
667 struct drm_nouveau_private *dev_priv = dev->dev_private;
668
669 struct pll_lims pll_lim;
670 struct nouveau_pll_vals pllvals;
671 int ret;
672
673 if (dev_priv->card_type >= NV_50)
674 return nv50_pll_set(dev, reg, clk);
675
676
677 ret = get_pll_limits(dev, reg > 0x405c ? reg : reg - 4, &pll_lim);
678 if (ret)
679 return ret;
680
681 clk = nouveau_calc_pll_mnp(dev, &pll_lim, clk, &pllvals);
682 if (!clk)
683 return -ERANGE;
684
685 if (bios->execute) {
686 still_alive();
687 nouveau_hw_setpll(dev, reg, &pllvals);
688 }
689
690 return 0;
691}
692
693static int dcb_entry_idx_from_crtchead(struct drm_device *dev)
694{
695 struct drm_nouveau_private *dev_priv = dev->dev_private;
696 struct nvbios *bios = &dev_priv->vbios;
697
698
699
700
701
702
703
704
705 uint8_t dcb_entry = NVReadVgaCrtc5758(dev, bios->state.crtchead, 0);
706
707 if (dcb_entry > bios->dcb.entries) {
708 NV_ERROR(dev, "CR58 doesn't have a valid DCB entry currently "
709 "(%02X)\n", dcb_entry);
710 dcb_entry = 0x7f;
711 }
712
713 return dcb_entry;
714}
715
716static int
717read_dcb_i2c_entry(struct drm_device *dev, int dcb_version, uint8_t *i2ctable, int index, struct dcb_i2c_entry *i2c)
718{
719 uint8_t dcb_i2c_ver = dcb_version, headerlen = 0, entry_len = 4;
720 int i2c_entries = DCB_MAX_NUM_I2C_ENTRIES;
721 int recordoffset = 0, rdofs = 1, wrofs = 0;
722 uint8_t port_type = 0;
723
724 if (!i2ctable)
725 return -EINVAL;
726
727 if (dcb_version >= 0x30) {
728 if (i2ctable[0] != dcb_version)
729 NV_WARN(dev,
730 "DCB I2C table version mismatch (%02X vs %02X)\n",
731 i2ctable[0], dcb_version);
732 dcb_i2c_ver = i2ctable[0];
733 headerlen = i2ctable[1];
734 if (i2ctable[2] <= DCB_MAX_NUM_I2C_ENTRIES)
735 i2c_entries = i2ctable[2];
736 else
737 NV_WARN(dev,
738 "DCB I2C table has more entries than indexable "
739 "(%d entries, max %d)\n", i2ctable[2],
740 DCB_MAX_NUM_I2C_ENTRIES);
741 entry_len = i2ctable[3];
742
743 }
744
745
746
747
748 if (dcb_version < 0x14) {
749 recordoffset = 2;
750 rdofs = 0;
751 wrofs = 1;
752 }
753
754 if (index == 0xf)
755 return 0;
756 if (index >= i2c_entries) {
757 NV_ERROR(dev, "DCB I2C index too big (%d >= %d)\n",
758 index, i2ctable[2]);
759 return -ENOENT;
760 }
761 if (i2ctable[headerlen + entry_len * index + 3] == 0xff) {
762 NV_ERROR(dev, "DCB I2C entry invalid\n");
763 return -EINVAL;
764 }
765
766 if (dcb_i2c_ver >= 0x30) {
767 port_type = i2ctable[headerlen + recordoffset + 3 + entry_len * index];
768
769
770
771
772
773 if (port_type == 4)
774 rdofs = wrofs = 1;
775 if (port_type >= 5)
776 rdofs = wrofs = 0;
777 }
778
779 if (dcb_i2c_ver >= 0x40) {
780 if (port_type != 5 && port_type != 6)
781 NV_WARN(dev, "DCB I2C table has port type %d\n", port_type);
782
783 i2c->entry = ROM32(i2ctable[headerlen + recordoffset + entry_len * index]);
784 }
785
786 i2c->port_type = port_type;
787 i2c->read = i2ctable[headerlen + recordoffset + rdofs + entry_len * index];
788 i2c->write = i2ctable[headerlen + recordoffset + wrofs + entry_len * index];
789
790 return 0;
791}
792
793static struct nouveau_i2c_chan *
794init_i2c_device_find(struct drm_device *dev, int i2c_index)
795{
796 struct drm_nouveau_private *dev_priv = dev->dev_private;
797 struct dcb_table *dcb = &dev_priv->vbios.dcb;
798
799 if (i2c_index == 0xff) {
800
801 int idx = dcb_entry_idx_from_crtchead(dev), shift = 0;
802 int default_indices = dcb->i2c_default_indices;
803
804 if (idx != 0x7f && dcb->entry[idx].i2c_upper_default)
805 shift = 4;
806
807 i2c_index = (default_indices >> shift) & 0xf;
808 }
809 if (i2c_index == 0x80)
810 i2c_index = dcb->i2c_default_indices & 0xf;
811 else
812 if (i2c_index == 0x81)
813 i2c_index = (dcb->i2c_default_indices & 0xf0) >> 4;
814
815 if (i2c_index >= DCB_MAX_NUM_I2C_ENTRIES) {
816 NV_ERROR(dev, "invalid i2c_index 0x%x\n", i2c_index);
817 return NULL;
818 }
819
820
821
822
823 read_dcb_i2c_entry(dev, dcb->version, dcb->i2c_table,
824 i2c_index, &dcb->i2c[i2c_index]);
825
826 return nouveau_i2c_find(dev, i2c_index);
827}
828
829static uint32_t
830get_tmds_index_reg(struct drm_device *dev, uint8_t mlv)
831{
832
833
834
835
836
837
838
839
840
841
842 struct drm_nouveau_private *dev_priv = dev->dev_private;
843 struct nvbios *bios = &dev_priv->vbios;
844 const int pramdac_offset[13] = {
845 0, 0, 0x8, 0, 0x2000, 0, 0, 0, 0x2008, 0, 0, 0, 0x2000 };
846 const uint32_t pramdac_table[4] = {
847 0x6808b0, 0x6808b8, 0x6828b0, 0x6828b8 };
848
849 if (mlv >= 0x80) {
850 int dcb_entry, dacoffset;
851
852
853 dcb_entry = dcb_entry_idx_from_crtchead(dev);
854 if (dcb_entry == 0x7f)
855 return 0;
856 dacoffset = pramdac_offset[bios->dcb.entry[dcb_entry].or];
857 if (mlv == 0x81)
858 dacoffset ^= 8;
859 return 0x6808b0 + dacoffset;
860 } else {
861 if (mlv >= ARRAY_SIZE(pramdac_table)) {
862 NV_ERROR(dev, "Magic Lookup Value too big (%02X)\n",
863 mlv);
864 return 0;
865 }
866 return pramdac_table[mlv];
867 }
868}
869
870static int
871init_io_restrict_prog(struct nvbios *bios, uint16_t offset,
872 struct init_exec *iexec)
873{
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894 uint16_t crtcport = ROM16(bios->data[offset + 1]);
895 uint8_t crtcindex = bios->data[offset + 3];
896 uint8_t mask = bios->data[offset + 4];
897 uint8_t shift = bios->data[offset + 5];
898 uint8_t count = bios->data[offset + 6];
899 uint32_t reg = ROM32(bios->data[offset + 7]);
900 uint8_t config;
901 uint32_t configval;
902 int len = 11 + count * 4;
903
904 if (!iexec->execute)
905 return len;
906
907 BIOSLOG(bios, "0x%04X: Port: 0x%04X, Index: 0x%02X, Mask: 0x%02X, "
908 "Shift: 0x%02X, Count: 0x%02X, Reg: 0x%08X\n",
909 offset, crtcport, crtcindex, mask, shift, count, reg);
910
911 config = (bios_idxprt_rd(bios, crtcport, crtcindex) & mask) >> shift;
912 if (config > count) {
913 NV_ERROR(bios->dev,
914 "0x%04X: Config 0x%02X exceeds maximal bound 0x%02X\n",
915 offset, config, count);
916 return len;
917 }
918
919 configval = ROM32(bios->data[offset + 11 + config * 4]);
920
921 BIOSLOG(bios, "0x%04X: Writing config %02X\n", offset, config);
922
923 bios_wr32(bios, reg, configval);
924
925 return len;
926}
927
928static int
929init_repeat(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
930{
931
932
933
934
935
936
937
938
939
940
941 uint8_t count = bios->data[offset + 1];
942 uint8_t i;
943
944
945
946 BIOSLOG(bios, "0x%04X: Repeating following segment %d times\n",
947 offset, count);
948
949 iexec->repeat = true;
950
951
952
953
954
955
956
957
958 for (i = 0; i < count - 1; i++)
959 parse_init_table(bios, offset + 2, iexec);
960
961 iexec->repeat = false;
962
963 return 2;
964}
965
966static int
967init_io_restrict_pll(struct nvbios *bios, uint16_t offset,
968 struct init_exec *iexec)
969{
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993 uint16_t crtcport = ROM16(bios->data[offset + 1]);
994 uint8_t crtcindex = bios->data[offset + 3];
995 uint8_t mask = bios->data[offset + 4];
996 uint8_t shift = bios->data[offset + 5];
997 int8_t io_flag_condition_idx = bios->data[offset + 6];
998 uint8_t count = bios->data[offset + 7];
999 uint32_t reg = ROM32(bios->data[offset + 8]);
1000 uint8_t config;
1001 uint16_t freq;
1002 int len = 12 + count * 2;
1003
1004 if (!iexec->execute)
1005 return len;
1006
1007 BIOSLOG(bios, "0x%04X: Port: 0x%04X, Index: 0x%02X, Mask: 0x%02X, "
1008 "Shift: 0x%02X, IO Flag Condition: 0x%02X, "
1009 "Count: 0x%02X, Reg: 0x%08X\n",
1010 offset, crtcport, crtcindex, mask, shift,
1011 io_flag_condition_idx, count, reg);
1012
1013 config = (bios_idxprt_rd(bios, crtcport, crtcindex) & mask) >> shift;
1014 if (config > count) {
1015 NV_ERROR(bios->dev,
1016 "0x%04X: Config 0x%02X exceeds maximal bound 0x%02X\n",
1017 offset, config, count);
1018 return len;
1019 }
1020
1021 freq = ROM16(bios->data[offset + 12 + config * 2]);
1022
1023 if (io_flag_condition_idx > 0) {
1024 if (io_flag_condition_met(bios, offset, io_flag_condition_idx)) {
1025 BIOSLOG(bios, "0x%04X: Condition fulfilled -- "
1026 "frequency doubled\n", offset);
1027 freq *= 2;
1028 } else
1029 BIOSLOG(bios, "0x%04X: Condition not fulfilled -- "
1030 "frequency unchanged\n", offset);
1031 }
1032
1033 BIOSLOG(bios, "0x%04X: Reg: 0x%08X, Config: 0x%02X, Freq: %d0kHz\n",
1034 offset, reg, config, freq);
1035
1036 setPLL(bios, reg, freq * 10);
1037
1038 return len;
1039}
1040
1041static int
1042init_end_repeat(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1043{
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058 if (iexec->repeat)
1059 return 0;
1060
1061 return 1;
1062}
1063
1064static int
1065init_copy(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1066{
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083 uint32_t reg = ROM32(bios->data[offset + 1]);
1084 uint8_t shift = bios->data[offset + 5];
1085 uint8_t srcmask = bios->data[offset + 6];
1086 uint16_t crtcport = ROM16(bios->data[offset + 7]);
1087 uint8_t crtcindex = bios->data[offset + 9];
1088 uint8_t mask = bios->data[offset + 10];
1089 uint32_t data;
1090 uint8_t crtcdata;
1091
1092 if (!iexec->execute)
1093 return 11;
1094
1095 BIOSLOG(bios, "0x%04X: Reg: 0x%08X, Shift: 0x%02X, SrcMask: 0x%02X, "
1096 "Port: 0x%04X, Index: 0x%02X, Mask: 0x%02X\n",
1097 offset, reg, shift, srcmask, crtcport, crtcindex, mask);
1098
1099 data = bios_rd32(bios, reg);
1100
1101 if (shift < 0x80)
1102 data >>= shift;
1103 else
1104 data <<= (0x100 - shift);
1105
1106 data &= srcmask;
1107
1108 crtcdata = bios_idxprt_rd(bios, crtcport, crtcindex) & mask;
1109 crtcdata |= (uint8_t)data;
1110 bios_idxprt_wr(bios, crtcport, crtcindex, crtcdata);
1111
1112 return 11;
1113}
1114
1115static int
1116init_not(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1117{
1118
1119
1120
1121
1122
1123
1124
1125 if (iexec->execute)
1126 BIOSLOG(bios, "0x%04X: ------ Skipping following commands ------\n", offset);
1127 else
1128 BIOSLOG(bios, "0x%04X: ------ Executing following commands ------\n", offset);
1129
1130 iexec->execute = !iexec->execute;
1131 return 1;
1132}
1133
1134static int
1135init_io_flag_condition(struct nvbios *bios, uint16_t offset,
1136 struct init_exec *iexec)
1137{
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149 uint8_t cond = bios->data[offset + 1];
1150
1151 if (!iexec->execute)
1152 return 2;
1153
1154 if (io_flag_condition_met(bios, offset, cond))
1155 BIOSLOG(bios, "0x%04X: Condition fulfilled -- continuing to execute\n", offset);
1156 else {
1157 BIOSLOG(bios, "0x%04X: Condition not fulfilled -- skipping following commands\n", offset);
1158 iexec->execute = false;
1159 }
1160
1161 return 2;
1162}
1163
1164static int
1165init_dp_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1166{
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176 struct bit_displayport_encoder_table *dpe = NULL;
1177 struct dcb_entry *dcb = bios->display.output;
1178 struct drm_device *dev = bios->dev;
1179 uint8_t cond = bios->data[offset + 1];
1180 int dummy;
1181
1182 BIOSLOG(bios, "0x%04X: subop 0x%02X\n", offset, cond);
1183
1184 if (!iexec->execute)
1185 return 3;
1186
1187 dpe = nouveau_bios_dp_table(dev, dcb, &dummy);
1188 if (!dpe) {
1189 NV_ERROR(dev, "0x%04X: INIT_3A: no encoder table!!\n", offset);
1190 return 3;
1191 }
1192
1193 switch (cond) {
1194 case 0:
1195 {
1196 struct dcb_connector_table_entry *ent =
1197 &bios->dcb.connector.entry[dcb->connector];
1198
1199 if (ent->type != DCB_CONNECTOR_eDP)
1200 iexec->execute = false;
1201 }
1202 break;
1203 case 1:
1204 case 2:
1205 if (!(dpe->unknown & cond))
1206 iexec->execute = false;
1207 break;
1208 case 5:
1209 {
1210 struct nouveau_i2c_chan *auxch;
1211 int ret;
1212
1213 auxch = nouveau_i2c_find(dev, bios->display.output->i2c_index);
1214 if (!auxch) {
1215 NV_ERROR(dev, "0x%04X: couldn't get auxch\n", offset);
1216 return 3;
1217 }
1218
1219 ret = nouveau_dp_auxch(auxch, 9, 0xd, &cond, 1);
1220 if (ret) {
1221 NV_ERROR(dev, "0x%04X: auxch rd fail: %d\n", offset, ret);
1222 return 3;
1223 }
1224
1225 if (!(cond & 1))
1226 iexec->execute = false;
1227 }
1228 break;
1229 default:
1230 NV_WARN(dev, "0x%04X: unknown INIT_3A op: %d\n", offset, cond);
1231 break;
1232 }
1233
1234 if (iexec->execute)
1235 BIOSLOG(bios, "0x%04X: continuing to execute\n", offset);
1236 else
1237 BIOSLOG(bios, "0x%04X: skipping following commands\n", offset);
1238
1239 return 3;
1240}
1241
1242static int
1243init_op_3b(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1244{
1245
1246
1247
1248
1249
1250
1251
1252
1253 uint8_t or = ffs(bios->display.output->or) - 1;
1254 uint8_t index = bios->data[offset + 1];
1255 uint8_t data;
1256
1257 if (!iexec->execute)
1258 return 2;
1259
1260 data = bios_idxprt_rd(bios, 0x3d4, index);
1261 bios_idxprt_wr(bios, 0x3d4, index, data & ~(1 << or));
1262 return 2;
1263}
1264
1265static int
1266init_op_3c(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1267{
1268
1269
1270
1271
1272
1273
1274
1275
1276 uint8_t or = ffs(bios->display.output->or) - 1;
1277 uint8_t index = bios->data[offset + 1];
1278 uint8_t data;
1279
1280 if (!iexec->execute)
1281 return 2;
1282
1283 data = bios_idxprt_rd(bios, 0x3d4, index);
1284 bios_idxprt_wr(bios, 0x3d4, index, data | (1 << or));
1285 return 2;
1286}
1287
1288static int
1289init_idx_addr_latched(struct nvbios *bios, uint16_t offset,
1290 struct init_exec *iexec)
1291{
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311 uint32_t controlreg = ROM32(bios->data[offset + 1]);
1312 uint32_t datareg = ROM32(bios->data[offset + 5]);
1313 uint32_t mask = ROM32(bios->data[offset + 9]);
1314 uint32_t data = ROM32(bios->data[offset + 13]);
1315 uint8_t count = bios->data[offset + 17];
1316 int len = 18 + count * 2;
1317 uint32_t value;
1318 int i;
1319
1320 if (!iexec->execute)
1321 return len;
1322
1323 BIOSLOG(bios, "0x%04X: ControlReg: 0x%08X, DataReg: 0x%08X, "
1324 "Mask: 0x%08X, Data: 0x%08X, Count: 0x%02X\n",
1325 offset, controlreg, datareg, mask, data, count);
1326
1327 for (i = 0; i < count; i++) {
1328 uint8_t instaddress = bios->data[offset + 18 + i * 2];
1329 uint8_t instdata = bios->data[offset + 19 + i * 2];
1330
1331 BIOSLOG(bios, "0x%04X: Address: 0x%02X, Data: 0x%02X\n",
1332 offset, instaddress, instdata);
1333
1334 bios_wr32(bios, datareg, instdata);
1335 value = bios_rd32(bios, controlreg) & mask;
1336 value |= data;
1337 value |= instaddress;
1338 bios_wr32(bios, controlreg, value);
1339 }
1340
1341 return len;
1342}
1343
1344static int
1345init_io_restrict_pll2(struct nvbios *bios, uint16_t offset,
1346 struct init_exec *iexec)
1347{
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367 uint16_t crtcport = ROM16(bios->data[offset + 1]);
1368 uint8_t crtcindex = bios->data[offset + 3];
1369 uint8_t mask = bios->data[offset + 4];
1370 uint8_t shift = bios->data[offset + 5];
1371 uint8_t count = bios->data[offset + 6];
1372 uint32_t reg = ROM32(bios->data[offset + 7]);
1373 int len = 11 + count * 4;
1374 uint8_t config;
1375 uint32_t freq;
1376
1377 if (!iexec->execute)
1378 return len;
1379
1380 BIOSLOG(bios, "0x%04X: Port: 0x%04X, Index: 0x%02X, Mask: 0x%02X, "
1381 "Shift: 0x%02X, Count: 0x%02X, Reg: 0x%08X\n",
1382 offset, crtcport, crtcindex, mask, shift, count, reg);
1383
1384 if (!reg)
1385 return len;
1386
1387 config = (bios_idxprt_rd(bios, crtcport, crtcindex) & mask) >> shift;
1388 if (config > count) {
1389 NV_ERROR(bios->dev,
1390 "0x%04X: Config 0x%02X exceeds maximal bound 0x%02X\n",
1391 offset, config, count);
1392 return len;
1393 }
1394
1395 freq = ROM32(bios->data[offset + 11 + config * 4]);
1396
1397 BIOSLOG(bios, "0x%04X: Reg: 0x%08X, Config: 0x%02X, Freq: %dkHz\n",
1398 offset, reg, config, freq);
1399
1400 setPLL(bios, reg, freq);
1401
1402 return len;
1403}
1404
1405static int
1406init_pll2(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1407{
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418 uint32_t reg = ROM32(bios->data[offset + 1]);
1419 uint32_t freq = ROM32(bios->data[offset + 5]);
1420
1421 if (!iexec->execute)
1422 return 9;
1423
1424 BIOSLOG(bios, "0x%04X: Reg: 0x%04X, Freq: %dkHz\n",
1425 offset, reg, freq);
1426
1427 setPLL(bios, reg, freq);
1428 return 9;
1429}
1430
1431static int
1432init_i2c_byte(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1433{
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452 struct drm_device *dev = bios->dev;
1453 uint8_t i2c_index = bios->data[offset + 1];
1454 uint8_t i2c_address = bios->data[offset + 2] >> 1;
1455 uint8_t count = bios->data[offset + 3];
1456 struct nouveau_i2c_chan *chan;
1457 int len = 4 + count * 3;
1458 int ret, i;
1459
1460 if (!iexec->execute)
1461 return len;
1462
1463 BIOSLOG(bios, "0x%04X: DCBI2CIndex: 0x%02X, I2CAddress: 0x%02X, "
1464 "Count: 0x%02X\n",
1465 offset, i2c_index, i2c_address, count);
1466
1467 chan = init_i2c_device_find(dev, i2c_index);
1468 if (!chan) {
1469 NV_ERROR(dev, "0x%04X: i2c bus not found\n", offset);
1470 return len;
1471 }
1472
1473 for (i = 0; i < count; i++) {
1474 uint8_t reg = bios->data[offset + 4 + i * 3];
1475 uint8_t mask = bios->data[offset + 5 + i * 3];
1476 uint8_t data = bios->data[offset + 6 + i * 3];
1477 union i2c_smbus_data val;
1478
1479 ret = i2c_smbus_xfer(&chan->adapter, i2c_address, 0,
1480 I2C_SMBUS_READ, reg,
1481 I2C_SMBUS_BYTE_DATA, &val);
1482 if (ret < 0) {
1483 NV_ERROR(dev, "0x%04X: i2c rd fail: %d\n", offset, ret);
1484 return len;
1485 }
1486
1487 BIOSLOG(bios, "0x%04X: I2CReg: 0x%02X, Value: 0x%02X, "
1488 "Mask: 0x%02X, Data: 0x%02X\n",
1489 offset, reg, val.byte, mask, data);
1490
1491 if (!bios->execute)
1492 continue;
1493
1494 val.byte &= mask;
1495 val.byte |= data;
1496 ret = i2c_smbus_xfer(&chan->adapter, i2c_address, 0,
1497 I2C_SMBUS_WRITE, reg,
1498 I2C_SMBUS_BYTE_DATA, &val);
1499 if (ret < 0) {
1500 NV_ERROR(dev, "0x%04X: i2c wr fail: %d\n", offset, ret);
1501 return len;
1502 }
1503 }
1504
1505 return len;
1506}
1507
1508static int
1509init_zm_i2c_byte(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1510{
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527 struct drm_device *dev = bios->dev;
1528 uint8_t i2c_index = bios->data[offset + 1];
1529 uint8_t i2c_address = bios->data[offset + 2] >> 1;
1530 uint8_t count = bios->data[offset + 3];
1531 struct nouveau_i2c_chan *chan;
1532 int len = 4 + count * 2;
1533 int ret, i;
1534
1535 if (!iexec->execute)
1536 return len;
1537
1538 BIOSLOG(bios, "0x%04X: DCBI2CIndex: 0x%02X, I2CAddress: 0x%02X, "
1539 "Count: 0x%02X\n",
1540 offset, i2c_index, i2c_address, count);
1541
1542 chan = init_i2c_device_find(dev, i2c_index);
1543 if (!chan) {
1544 NV_ERROR(dev, "0x%04X: i2c bus not found\n", offset);
1545 return len;
1546 }
1547
1548 for (i = 0; i < count; i++) {
1549 uint8_t reg = bios->data[offset + 4 + i * 2];
1550 union i2c_smbus_data val;
1551
1552 val.byte = bios->data[offset + 5 + i * 2];
1553
1554 BIOSLOG(bios, "0x%04X: I2CReg: 0x%02X, Data: 0x%02X\n",
1555 offset, reg, val.byte);
1556
1557 if (!bios->execute)
1558 continue;
1559
1560 ret = i2c_smbus_xfer(&chan->adapter, i2c_address, 0,
1561 I2C_SMBUS_WRITE, reg,
1562 I2C_SMBUS_BYTE_DATA, &val);
1563 if (ret < 0) {
1564 NV_ERROR(dev, "0x%04X: i2c wr fail: %d\n", offset, ret);
1565 return len;
1566 }
1567 }
1568
1569 return len;
1570}
1571
1572static int
1573init_zm_i2c(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1574{
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589 struct drm_device *dev = bios->dev;
1590 uint8_t i2c_index = bios->data[offset + 1];
1591 uint8_t i2c_address = bios->data[offset + 2] >> 1;
1592 uint8_t count = bios->data[offset + 3];
1593 int len = 4 + count;
1594 struct nouveau_i2c_chan *chan;
1595 struct i2c_msg msg;
1596 uint8_t data[256];
1597 int ret, i;
1598
1599 if (!iexec->execute)
1600 return len;
1601
1602 BIOSLOG(bios, "0x%04X: DCBI2CIndex: 0x%02X, I2CAddress: 0x%02X, "
1603 "Count: 0x%02X\n",
1604 offset, i2c_index, i2c_address, count);
1605
1606 chan = init_i2c_device_find(dev, i2c_index);
1607 if (!chan) {
1608 NV_ERROR(dev, "0x%04X: i2c bus not found\n", offset);
1609 return len;
1610 }
1611
1612 for (i = 0; i < count; i++) {
1613 data[i] = bios->data[offset + 4 + i];
1614
1615 BIOSLOG(bios, "0x%04X: Data: 0x%02X\n", offset, data[i]);
1616 }
1617
1618 if (bios->execute) {
1619 msg.addr = i2c_address;
1620 msg.flags = 0;
1621 msg.len = count;
1622 msg.buf = data;
1623 ret = i2c_transfer(&chan->adapter, &msg, 1);
1624 if (ret != 1) {
1625 NV_ERROR(dev, "0x%04X: i2c wr fail: %d\n", offset, ret);
1626 return len;
1627 }
1628 }
1629
1630 return len;
1631}
1632
1633static int
1634init_tmds(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1635{
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651 struct drm_device *dev = bios->dev;
1652 uint8_t mlv = bios->data[offset + 1];
1653 uint32_t tmdsaddr = bios->data[offset + 2];
1654 uint8_t mask = bios->data[offset + 3];
1655 uint8_t data = bios->data[offset + 4];
1656 uint32_t reg, value;
1657
1658 if (!iexec->execute)
1659 return 5;
1660
1661 BIOSLOG(bios, "0x%04X: MagicLookupValue: 0x%02X, TMDSAddr: 0x%02X, "
1662 "Mask: 0x%02X, Data: 0x%02X\n",
1663 offset, mlv, tmdsaddr, mask, data);
1664
1665 reg = get_tmds_index_reg(bios->dev, mlv);
1666 if (!reg) {
1667 NV_ERROR(dev, "0x%04X: no tmds_index_reg\n", offset);
1668 return 5;
1669 }
1670
1671 bios_wr32(bios, reg,
1672 tmdsaddr | NV_PRAMDAC_FP_TMDS_CONTROL_WRITE_DISABLE);
1673 value = (bios_rd32(bios, reg + 4) & mask) | data;
1674 bios_wr32(bios, reg + 4, value);
1675 bios_wr32(bios, reg, tmdsaddr);
1676
1677 return 5;
1678}
1679
1680static int
1681init_zm_tmds_group(struct nvbios *bios, uint16_t offset,
1682 struct init_exec *iexec)
1683{
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699 struct drm_device *dev = bios->dev;
1700 uint8_t mlv = bios->data[offset + 1];
1701 uint8_t count = bios->data[offset + 2];
1702 int len = 3 + count * 2;
1703 uint32_t reg;
1704 int i;
1705
1706 if (!iexec->execute)
1707 return len;
1708
1709 BIOSLOG(bios, "0x%04X: MagicLookupValue: 0x%02X, Count: 0x%02X\n",
1710 offset, mlv, count);
1711
1712 reg = get_tmds_index_reg(bios->dev, mlv);
1713 if (!reg) {
1714 NV_ERROR(dev, "0x%04X: no tmds_index_reg\n", offset);
1715 return len;
1716 }
1717
1718 for (i = 0; i < count; i++) {
1719 uint8_t tmdsaddr = bios->data[offset + 3 + i * 2];
1720 uint8_t tmdsdata = bios->data[offset + 4 + i * 2];
1721
1722 bios_wr32(bios, reg + 4, tmdsdata);
1723 bios_wr32(bios, reg, tmdsaddr);
1724 }
1725
1726 return len;
1727}
1728
1729static int
1730init_cr_idx_adr_latch(struct nvbios *bios, uint16_t offset,
1731 struct init_exec *iexec)
1732{
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748 uint8_t crtcindex1 = bios->data[offset + 1];
1749 uint8_t crtcindex2 = bios->data[offset + 2];
1750 uint8_t baseaddr = bios->data[offset + 3];
1751 uint8_t count = bios->data[offset + 4];
1752 int len = 5 + count;
1753 uint8_t oldaddr, data;
1754 int i;
1755
1756 if (!iexec->execute)
1757 return len;
1758
1759 BIOSLOG(bios, "0x%04X: Index1: 0x%02X, Index2: 0x%02X, "
1760 "BaseAddr: 0x%02X, Count: 0x%02X\n",
1761 offset, crtcindex1, crtcindex2, baseaddr, count);
1762
1763 oldaddr = bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, crtcindex1);
1764
1765 for (i = 0; i < count; i++) {
1766 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR, crtcindex1,
1767 baseaddr + i);
1768 data = bios->data[offset + 5 + i];
1769 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR, crtcindex2, data);
1770 }
1771
1772 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR, crtcindex1, oldaddr);
1773
1774 return len;
1775}
1776
1777static int
1778init_cr(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1779{
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792 uint8_t crtcindex = bios->data[offset + 1];
1793 uint8_t mask = bios->data[offset + 2];
1794 uint8_t data = bios->data[offset + 3];
1795 uint8_t value;
1796
1797 if (!iexec->execute)
1798 return 4;
1799
1800 BIOSLOG(bios, "0x%04X: Index: 0x%02X, Mask: 0x%02X, Data: 0x%02X\n",
1801 offset, crtcindex, mask, data);
1802
1803 value = bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, crtcindex) & mask;
1804 value |= data;
1805 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR, crtcindex, value);
1806
1807 return 4;
1808}
1809
1810static int
1811init_zm_cr(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1812{
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823 uint8_t crtcindex = ROM32(bios->data[offset + 1]);
1824 uint8_t data = bios->data[offset + 2];
1825
1826 if (!iexec->execute)
1827 return 3;
1828
1829 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR, crtcindex, data);
1830
1831 return 3;
1832}
1833
1834static int
1835init_zm_cr_group(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1836{
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850 uint8_t count = bios->data[offset + 1];
1851 int len = 2 + count * 2;
1852 int i;
1853
1854 if (!iexec->execute)
1855 return len;
1856
1857 for (i = 0; i < count; i++)
1858 init_zm_cr(bios, offset + 2 + 2 * i - 1, iexec);
1859
1860 return len;
1861}
1862
1863static int
1864init_condition_time(struct nvbios *bios, uint16_t offset,
1865 struct init_exec *iexec)
1866{
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882 uint8_t cond = bios->data[offset + 1];
1883 uint16_t retries = bios->data[offset + 2] * 50;
1884 unsigned cnt;
1885
1886 if (!iexec->execute)
1887 return 3;
1888
1889 if (retries > 100)
1890 retries = 100;
1891
1892 BIOSLOG(bios, "0x%04X: Condition: 0x%02X, Retries: 0x%02X\n",
1893 offset, cond, retries);
1894
1895 if (!bios->execute)
1896 retries = 1;
1897
1898 for (cnt = 0; cnt < retries; cnt++) {
1899 if (bios_condition_met(bios, offset, cond)) {
1900 BIOSLOG(bios, "0x%04X: Condition met, continuing\n",
1901 offset);
1902 break;
1903 } else {
1904 BIOSLOG(bios, "0x%04X: "
1905 "Condition not met, sleeping for 20ms\n",
1906 offset);
1907 msleep(20);
1908 }
1909 }
1910
1911 if (!bios_condition_met(bios, offset, cond)) {
1912 NV_WARN(bios->dev,
1913 "0x%04X: Condition still not met after %dms, "
1914 "skipping following opcodes\n", offset, 20 * retries);
1915 iexec->execute = false;
1916 }
1917
1918 return 3;
1919}
1920
1921static int
1922init_ltime(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1923{
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933 unsigned time = ROM16(bios->data[offset + 1]);
1934
1935 if (!iexec->execute)
1936 return 3;
1937
1938 BIOSLOG(bios, "0x%04X: Sleeping for 0x%04X milliseconds\n",
1939 offset, time);
1940
1941 msleep(time);
1942
1943 return 3;
1944}
1945
1946static int
1947init_zm_reg_sequence(struct nvbios *bios, uint16_t offset,
1948 struct init_exec *iexec)
1949{
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964 uint32_t basereg = ROM32(bios->data[offset + 1]);
1965 uint32_t count = bios->data[offset + 5];
1966 int len = 6 + count * 4;
1967 int i;
1968
1969 if (!iexec->execute)
1970 return len;
1971
1972 BIOSLOG(bios, "0x%04X: BaseReg: 0x%08X, Count: 0x%02X\n",
1973 offset, basereg, count);
1974
1975 for (i = 0; i < count; i++) {
1976 uint32_t reg = basereg + i * 4;
1977 uint32_t data = ROM32(bios->data[offset + 6 + i * 4]);
1978
1979 bios_wr32(bios, reg, data);
1980 }
1981
1982 return len;
1983}
1984
1985static int
1986init_sub_direct(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
1987{
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998 uint16_t sub_offset = ROM16(bios->data[offset + 1]);
1999
2000 if (!iexec->execute)
2001 return 3;
2002
2003 BIOSLOG(bios, "0x%04X: Executing subroutine at 0x%04X\n",
2004 offset, sub_offset);
2005
2006 parse_init_table(bios, sub_offset, iexec);
2007
2008 BIOSLOG(bios, "0x%04X: End of 0x%04X subroutine\n", offset, sub_offset);
2009
2010 return 3;
2011}
2012
2013static int
2014init_i2c_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2015{
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033 uint8_t i2c_index = bios->data[offset + 1];
2034 uint8_t i2c_address = bios->data[offset + 2] >> 1;
2035 uint8_t reg = bios->data[offset + 3];
2036 uint8_t mask = bios->data[offset + 4];
2037 uint8_t data = bios->data[offset + 5];
2038 struct nouveau_i2c_chan *chan;
2039 union i2c_smbus_data val;
2040 int ret;
2041
2042
2043
2044 BIOSLOG(bios, "0x%04X: DCBI2CIndex: 0x%02X, I2CAddress: 0x%02X\n",
2045 offset, i2c_index, i2c_address);
2046
2047 chan = init_i2c_device_find(bios->dev, i2c_index);
2048 if (!chan)
2049 return -ENODEV;
2050
2051 ret = i2c_smbus_xfer(&chan->adapter, i2c_address, 0,
2052 I2C_SMBUS_READ, reg,
2053 I2C_SMBUS_BYTE_DATA, &val);
2054 if (ret < 0) {
2055 BIOSLOG(bios, "0x%04X: I2CReg: 0x%02X, Value: [no device], "
2056 "Mask: 0x%02X, Data: 0x%02X\n",
2057 offset, reg, mask, data);
2058 iexec->execute = 0;
2059 return 6;
2060 }
2061
2062 BIOSLOG(bios, "0x%04X: I2CReg: 0x%02X, Value: 0x%02X, "
2063 "Mask: 0x%02X, Data: 0x%02X\n",
2064 offset, reg, val.byte, mask, data);
2065
2066 iexec->execute = ((val.byte & mask) == data);
2067
2068 return 6;
2069}
2070
2071static int
2072init_copy_nv_reg(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2073{
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090 uint32_t srcreg = *((uint32_t *)(&bios->data[offset + 1]));
2091 uint8_t shift = bios->data[offset + 5];
2092 uint32_t srcmask = *((uint32_t *)(&bios->data[offset + 6]));
2093 uint32_t xor = *((uint32_t *)(&bios->data[offset + 10]));
2094 uint32_t dstreg = *((uint32_t *)(&bios->data[offset + 14]));
2095 uint32_t dstmask = *((uint32_t *)(&bios->data[offset + 18]));
2096 uint32_t srcvalue, dstvalue;
2097
2098 if (!iexec->execute)
2099 return 22;
2100
2101 BIOSLOG(bios, "0x%04X: SrcReg: 0x%08X, Shift: 0x%02X, SrcMask: 0x%08X, "
2102 "Xor: 0x%08X, DstReg: 0x%08X, DstMask: 0x%08X\n",
2103 offset, srcreg, shift, srcmask, xor, dstreg, dstmask);
2104
2105 srcvalue = bios_rd32(bios, srcreg);
2106
2107 if (shift < 0x80)
2108 srcvalue >>= shift;
2109 else
2110 srcvalue <<= (0x100 - shift);
2111
2112 srcvalue = (srcvalue & srcmask) ^ xor;
2113
2114 dstvalue = bios_rd32(bios, dstreg) & dstmask;
2115
2116 bios_wr32(bios, dstreg, dstvalue | srcvalue);
2117
2118 return 22;
2119}
2120
2121static int
2122init_zm_index_io(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2123{
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134 uint16_t crtcport = ROM16(bios->data[offset + 1]);
2135 uint8_t crtcindex = bios->data[offset + 3];
2136 uint8_t data = bios->data[offset + 4];
2137
2138 if (!iexec->execute)
2139 return 5;
2140
2141 bios_idxprt_wr(bios, crtcport, crtcindex, data);
2142
2143 return 5;
2144}
2145
2146static inline void
2147bios_md32(struct nvbios *bios, uint32_t reg,
2148 uint32_t mask, uint32_t val)
2149{
2150 bios_wr32(bios, reg, (bios_rd32(bios, reg) & ~mask) | val);
2151}
2152
2153static uint32_t
2154peek_fb(struct drm_device *dev, struct io_mapping *fb,
2155 uint32_t off)
2156{
2157 uint32_t val = 0;
2158
2159 if (off < pci_resource_len(dev->pdev, 1)) {
2160 uint8_t __iomem *p =
2161 io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
2162
2163 val = ioread32(p + (off & ~PAGE_MASK));
2164
2165 io_mapping_unmap_atomic(p);
2166 }
2167
2168 return val;
2169}
2170
2171static void
2172poke_fb(struct drm_device *dev, struct io_mapping *fb,
2173 uint32_t off, uint32_t val)
2174{
2175 if (off < pci_resource_len(dev->pdev, 1)) {
2176 uint8_t __iomem *p =
2177 io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
2178
2179 iowrite32(val, p + (off & ~PAGE_MASK));
2180 wmb();
2181
2182 io_mapping_unmap_atomic(p);
2183 }
2184}
2185
2186static inline bool
2187read_back_fb(struct drm_device *dev, struct io_mapping *fb,
2188 uint32_t off, uint32_t val)
2189{
2190 poke_fb(dev, fb, off, val);
2191 return val == peek_fb(dev, fb, off);
2192}
2193
2194static int
2195nv04_init_compute_mem(struct nvbios *bios)
2196{
2197 struct drm_device *dev = bios->dev;
2198 uint32_t patt = 0xdeadbeef;
2199 struct io_mapping *fb;
2200 int i;
2201
2202
2203 fb = io_mapping_create_wc(pci_resource_start(dev->pdev, 1),
2204 pci_resource_len(dev->pdev, 1));
2205 if (!fb)
2206 return -ENOMEM;
2207
2208
2209 NVWriteVgaSeq(dev, 0, 1, NVReadVgaSeq(dev, 0, 1) | 0x20);
2210 bios_md32(bios, NV04_PFB_DEBUG_0, 0, NV04_PFB_DEBUG_0_REFRESH_OFF);
2211
2212 bios_md32(bios, NV04_PFB_BOOT_0, ~0,
2213 NV04_PFB_BOOT_0_RAM_AMOUNT_16MB |
2214 NV04_PFB_BOOT_0_RAM_WIDTH_128 |
2215 NV04_PFB_BOOT_0_RAM_TYPE_SGRAM_16MBIT);
2216
2217 for (i = 0; i < 4; i++)
2218 poke_fb(dev, fb, 4 * i, patt);
2219
2220 poke_fb(dev, fb, 0x400000, patt + 1);
2221
2222 if (peek_fb(dev, fb, 0) == patt + 1) {
2223 bios_md32(bios, NV04_PFB_BOOT_0, NV04_PFB_BOOT_0_RAM_TYPE,
2224 NV04_PFB_BOOT_0_RAM_TYPE_SDRAM_16MBIT);
2225 bios_md32(bios, NV04_PFB_DEBUG_0,
2226 NV04_PFB_DEBUG_0_REFRESH_OFF, 0);
2227
2228 for (i = 0; i < 4; i++)
2229 poke_fb(dev, fb, 4 * i, patt);
2230
2231 if ((peek_fb(dev, fb, 0xc) & 0xffff) != (patt & 0xffff))
2232 bios_md32(bios, NV04_PFB_BOOT_0,
2233 NV04_PFB_BOOT_0_RAM_WIDTH_128 |
2234 NV04_PFB_BOOT_0_RAM_AMOUNT,
2235 NV04_PFB_BOOT_0_RAM_AMOUNT_8MB);
2236
2237 } else if ((peek_fb(dev, fb, 0xc) & 0xffff0000) !=
2238 (patt & 0xffff0000)) {
2239 bios_md32(bios, NV04_PFB_BOOT_0,
2240 NV04_PFB_BOOT_0_RAM_WIDTH_128 |
2241 NV04_PFB_BOOT_0_RAM_AMOUNT,
2242 NV04_PFB_BOOT_0_RAM_AMOUNT_4MB);
2243
2244 } else if (peek_fb(dev, fb, 0) != patt) {
2245 if (read_back_fb(dev, fb, 0x800000, patt))
2246 bios_md32(bios, NV04_PFB_BOOT_0,
2247 NV04_PFB_BOOT_0_RAM_AMOUNT,
2248 NV04_PFB_BOOT_0_RAM_AMOUNT_8MB);
2249 else
2250 bios_md32(bios, NV04_PFB_BOOT_0,
2251 NV04_PFB_BOOT_0_RAM_AMOUNT,
2252 NV04_PFB_BOOT_0_RAM_AMOUNT_4MB);
2253
2254 bios_md32(bios, NV04_PFB_BOOT_0, NV04_PFB_BOOT_0_RAM_TYPE,
2255 NV04_PFB_BOOT_0_RAM_TYPE_SGRAM_8MBIT);
2256
2257 } else if (!read_back_fb(dev, fb, 0x800000, patt)) {
2258 bios_md32(bios, NV04_PFB_BOOT_0, NV04_PFB_BOOT_0_RAM_AMOUNT,
2259 NV04_PFB_BOOT_0_RAM_AMOUNT_8MB);
2260
2261 }
2262
2263
2264 bios_md32(bios, NV04_PFB_DEBUG_0, NV04_PFB_DEBUG_0_REFRESH_OFF, 0);
2265 NVWriteVgaSeq(dev, 0, 1, NVReadVgaSeq(dev, 0, 1) & ~0x20);
2266
2267 io_mapping_free(fb);
2268 return 0;
2269}
2270
2271static const uint8_t *
2272nv05_memory_config(struct nvbios *bios)
2273{
2274
2275 static const uint8_t default_config_tab[][2] = {
2276 { 0x24, 0x00 },
2277 { 0x28, 0x00 },
2278 { 0x24, 0x01 },
2279 { 0x1f, 0x00 },
2280 { 0x0f, 0x00 },
2281 { 0x17, 0x00 },
2282 { 0x06, 0x00 },
2283 { 0x00, 0x00 }
2284 };
2285 int i = (bios_rd32(bios, NV_PEXTDEV_BOOT_0) &
2286 NV_PEXTDEV_BOOT_0_RAMCFG) >> 2;
2287
2288 if (bios->legacy.mem_init_tbl_ptr)
2289 return &bios->data[bios->legacy.mem_init_tbl_ptr + 2 * i];
2290 else
2291 return default_config_tab[i];
2292}
2293
2294static int
2295nv05_init_compute_mem(struct nvbios *bios)
2296{
2297 struct drm_device *dev = bios->dev;
2298 const uint8_t *ramcfg = nv05_memory_config(bios);
2299 uint32_t patt = 0xdeadbeef;
2300 struct io_mapping *fb;
2301 int i, v;
2302
2303
2304 fb = io_mapping_create_wc(pci_resource_start(dev->pdev, 1),
2305 pci_resource_len(dev->pdev, 1));
2306 if (!fb)
2307 return -ENOMEM;
2308
2309
2310 NVWriteVgaSeq(dev, 0, 1, NVReadVgaSeq(dev, 0, 1) | 0x20);
2311
2312 if (bios_rd32(bios, NV04_PFB_BOOT_0) & NV04_PFB_BOOT_0_UMA_ENABLE)
2313 goto out;
2314
2315 bios_md32(bios, NV04_PFB_DEBUG_0, NV04_PFB_DEBUG_0_REFRESH_OFF, 0);
2316
2317
2318 if (bios->legacy.mem_init_tbl_ptr) {
2319 uint32_t *scramble_tab = (uint32_t *)&bios->data[
2320 bios->legacy.mem_init_tbl_ptr + 0x10];
2321
2322 for (i = 0; i < 8; i++)
2323 bios_wr32(bios, NV04_PFB_SCRAMBLE(i),
2324 ROM32(scramble_tab[i]));
2325 }
2326
2327
2328 bios_md32(bios, NV04_PFB_BOOT_0, 0x3f, ramcfg[0]);
2329
2330 if (ramcfg[1] & 0x80)
2331 bios_md32(bios, NV04_PFB_CFG0, 0, NV04_PFB_CFG0_SCRAMBLE);
2332
2333 bios_md32(bios, NV04_PFB_CFG1, 0x700001, (ramcfg[1] & 1) << 20);
2334 bios_md32(bios, NV04_PFB_CFG1, 0, 1);
2335
2336
2337 for (i = 0; i < 4; i++)
2338 poke_fb(dev, fb, 4 * i, patt);
2339
2340 if (peek_fb(dev, fb, 0xc) != patt)
2341 bios_md32(bios, NV04_PFB_BOOT_0,
2342 NV04_PFB_BOOT_0_RAM_WIDTH_128, 0);
2343
2344
2345 v = bios_rd32(bios, NV04_PFB_BOOT_0) & NV04_PFB_BOOT_0_RAM_AMOUNT;
2346
2347 if (v == NV04_PFB_BOOT_0_RAM_AMOUNT_32MB &&
2348 (!read_back_fb(dev, fb, 0x1000000, ++patt) ||
2349 !read_back_fb(dev, fb, 0, ++patt)))
2350 bios_md32(bios, NV04_PFB_BOOT_0, NV04_PFB_BOOT_0_RAM_AMOUNT,
2351 NV04_PFB_BOOT_0_RAM_AMOUNT_16MB);
2352
2353 if (v == NV04_PFB_BOOT_0_RAM_AMOUNT_16MB &&
2354 !read_back_fb(dev, fb, 0x800000, ++patt))
2355 bios_md32(bios, NV04_PFB_BOOT_0, NV04_PFB_BOOT_0_RAM_AMOUNT,
2356 NV04_PFB_BOOT_0_RAM_AMOUNT_8MB);
2357
2358 if (!read_back_fb(dev, fb, 0x400000, ++patt))
2359 bios_md32(bios, NV04_PFB_BOOT_0, NV04_PFB_BOOT_0_RAM_AMOUNT,
2360 NV04_PFB_BOOT_0_RAM_AMOUNT_4MB);
2361
2362out:
2363
2364 NVWriteVgaSeq(dev, 0, 1, NVReadVgaSeq(dev, 0, 1) & ~0x20);
2365
2366 io_mapping_free(fb);
2367 return 0;
2368}
2369
2370static int
2371nv10_init_compute_mem(struct nvbios *bios)
2372{
2373 struct drm_device *dev = bios->dev;
2374 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
2375 const int mem_width[] = { 0x10, 0x00, 0x20 };
2376 const int mem_width_count = (dev_priv->chipset >= 0x17 ? 3 : 2);
2377 uint32_t patt = 0xdeadbeef;
2378 struct io_mapping *fb;
2379 int i, j, k;
2380
2381
2382 fb = io_mapping_create_wc(pci_resource_start(dev->pdev, 1),
2383 pci_resource_len(dev->pdev, 1));
2384 if (!fb)
2385 return -ENOMEM;
2386
2387 bios_wr32(bios, NV10_PFB_REFCTRL, NV10_PFB_REFCTRL_VALID_1);
2388
2389
2390 for (i = 0; i < mem_width_count; i++) {
2391 bios_md32(bios, NV04_PFB_CFG0, 0x30, mem_width[i]);
2392
2393 for (j = 0; j < 4; j++) {
2394 for (k = 0; k < 4; k++)
2395 poke_fb(dev, fb, 0x1c, 0);
2396
2397 poke_fb(dev, fb, 0x1c, patt);
2398 poke_fb(dev, fb, 0x3c, 0);
2399
2400 if (peek_fb(dev, fb, 0x1c) == patt)
2401 goto mem_width_found;
2402 }
2403 }
2404
2405mem_width_found:
2406 patt <<= 1;
2407
2408
2409 for (i = 0; i < 4; i++) {
2410 int off = bios_rd32(bios, NV04_PFB_FIFO_DATA) - 0x100000;
2411
2412 poke_fb(dev, fb, off, patt);
2413 poke_fb(dev, fb, 0, 0);
2414
2415 peek_fb(dev, fb, 0);
2416 peek_fb(dev, fb, 0);
2417 peek_fb(dev, fb, 0);
2418 peek_fb(dev, fb, 0);
2419
2420 if (peek_fb(dev, fb, off) == patt)
2421 goto amount_found;
2422 }
2423
2424
2425 bios_md32(bios, NV04_PFB_CFG0, 0x1000, 0);
2426
2427amount_found:
2428 io_mapping_free(fb);
2429 return 0;
2430}
2431
2432static int
2433nv20_init_compute_mem(struct nvbios *bios)
2434{
2435 struct drm_device *dev = bios->dev;
2436 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
2437 uint32_t mask = (dev_priv->chipset >= 0x25 ? 0x300 : 0x900);
2438 uint32_t amount, off;
2439 struct io_mapping *fb;
2440
2441
2442 fb = io_mapping_create_wc(pci_resource_start(dev->pdev, 1),
2443 pci_resource_len(dev->pdev, 1));
2444 if (!fb)
2445 return -ENOMEM;
2446
2447 bios_wr32(bios, NV10_PFB_REFCTRL, NV10_PFB_REFCTRL_VALID_1);
2448
2449
2450 bios_md32(bios, NV04_PFB_CFG0, 0, mask);
2451
2452 amount = bios_rd32(bios, NV04_PFB_FIFO_DATA);
2453 for (off = amount; off > 0x2000000; off -= 0x2000000)
2454 poke_fb(dev, fb, off - 4, off);
2455
2456 amount = bios_rd32(bios, NV04_PFB_FIFO_DATA);
2457 if (amount != peek_fb(dev, fb, amount - 4))
2458
2459 bios_md32(bios, NV04_PFB_CFG0, mask, 0);
2460
2461 io_mapping_free(fb);
2462 return 0;
2463}
2464
2465static int
2466init_compute_mem(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2467{
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
2506 int ret;
2507
2508 if (dev_priv->chipset >= 0x40 ||
2509 dev_priv->chipset == 0x1a ||
2510 dev_priv->chipset == 0x1f)
2511 ret = 0;
2512 else if (dev_priv->chipset >= 0x20 &&
2513 dev_priv->chipset != 0x34)
2514 ret = nv20_init_compute_mem(bios);
2515 else if (dev_priv->chipset >= 0x10)
2516 ret = nv10_init_compute_mem(bios);
2517 else if (dev_priv->chipset >= 0x5)
2518 ret = nv05_init_compute_mem(bios);
2519 else
2520 ret = nv04_init_compute_mem(bios);
2521
2522 if (ret)
2523 return ret;
2524
2525 return 1;
2526}
2527
2528static int
2529init_reset(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2530{
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542 uint32_t reg = ROM32(bios->data[offset + 1]);
2543 uint32_t value1 = ROM32(bios->data[offset + 5]);
2544 uint32_t value2 = ROM32(bios->data[offset + 9]);
2545 uint32_t pci_nv_19, pci_nv_20;
2546
2547
2548
2549 pci_nv_19 = bios_rd32(bios, NV_PBUS_PCI_NV_19);
2550 bios_wr32(bios, NV_PBUS_PCI_NV_19, pci_nv_19 & ~0xf00);
2551
2552 bios_wr32(bios, reg, value1);
2553
2554 udelay(10);
2555
2556 bios_wr32(bios, reg, value2);
2557 bios_wr32(bios, NV_PBUS_PCI_NV_19, pci_nv_19);
2558
2559 pci_nv_20 = bios_rd32(bios, NV_PBUS_PCI_NV_20);
2560 pci_nv_20 &= ~NV_PBUS_PCI_NV_20_ROM_SHADOW_ENABLED;
2561 bios_wr32(bios, NV_PBUS_PCI_NV_20, pci_nv_20);
2562
2563 return 13;
2564}
2565
2566static int
2567init_configure_mem(struct nvbios *bios, uint16_t offset,
2568 struct init_exec *iexec)
2569{
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582 uint16_t meminitoffs = bios->legacy.mem_init_tbl_ptr + MEM_INIT_SIZE * (bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, NV_CIO_CRE_SCRATCH4__INDEX) >> 4);
2583 uint16_t seqtbloffs = bios->legacy.sdr_seq_tbl_ptr, meminitdata = meminitoffs + 6;
2584 uint32_t reg, data;
2585
2586 if (bios->major_version > 2)
2587 return 0;
2588
2589 bios_idxprt_wr(bios, NV_VIO_SRX, NV_VIO_SR_CLOCK_INDEX, bios_idxprt_rd(
2590 bios, NV_VIO_SRX, NV_VIO_SR_CLOCK_INDEX) | 0x20);
2591
2592 if (bios->data[meminitoffs] & 1)
2593 seqtbloffs = bios->legacy.ddr_seq_tbl_ptr;
2594
2595 for (reg = ROM32(bios->data[seqtbloffs]);
2596 reg != 0xffffffff;
2597 reg = ROM32(bios->data[seqtbloffs += 4])) {
2598
2599 switch (reg) {
2600 case NV04_PFB_PRE:
2601 data = NV04_PFB_PRE_CMD_PRECHARGE;
2602 break;
2603 case NV04_PFB_PAD:
2604 data = NV04_PFB_PAD_CKE_NORMAL;
2605 break;
2606 case NV04_PFB_REF:
2607 data = NV04_PFB_REF_CMD_REFRESH;
2608 break;
2609 default:
2610 data = ROM32(bios->data[meminitdata]);
2611 meminitdata += 4;
2612 if (data == 0xffffffff)
2613 continue;
2614 }
2615
2616 bios_wr32(bios, reg, data);
2617 }
2618
2619 return 1;
2620}
2621
2622static int
2623init_configure_clk(struct nvbios *bios, uint16_t offset,
2624 struct init_exec *iexec)
2625{
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638 uint16_t meminitoffs = bios->legacy.mem_init_tbl_ptr + MEM_INIT_SIZE * (bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, NV_CIO_CRE_SCRATCH4__INDEX) >> 4);
2639 int clock;
2640
2641 if (bios->major_version > 2)
2642 return 0;
2643
2644 clock = ROM16(bios->data[meminitoffs + 4]) * 10;
2645 setPLL(bios, NV_PRAMDAC_NVPLL_COEFF, clock);
2646
2647 clock = ROM16(bios->data[meminitoffs + 2]) * 10;
2648 if (bios->data[meminitoffs] & 1)
2649 clock *= 2;
2650 setPLL(bios, NV_PRAMDAC_MPLL_COEFF, clock);
2651
2652 return 1;
2653}
2654
2655static int
2656init_configure_preinit(struct nvbios *bios, uint16_t offset,
2657 struct init_exec *iexec)
2658{
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671 uint32_t straps = bios_rd32(bios, NV_PEXTDEV_BOOT_0);
2672 uint8_t cr3c = ((straps << 2) & 0xf0) | (straps & 0x40) >> 6;
2673
2674 if (bios->major_version > 2)
2675 return 0;
2676
2677 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR,
2678 NV_CIO_CRE_SCRATCH4__INDEX, cr3c);
2679
2680 return 1;
2681}
2682
2683static int
2684init_io(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2685{
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
2698 uint16_t crtcport = ROM16(bios->data[offset + 1]);
2699 uint8_t mask = bios->data[offset + 3];
2700 uint8_t data = bios->data[offset + 4];
2701
2702 if (!iexec->execute)
2703 return 5;
2704
2705 BIOSLOG(bios, "0x%04X: Port: 0x%04X, Mask: 0x%02X, Data: 0x%02X\n",
2706 offset, crtcport, mask, data);
2707
2708
2709
2710
2711
2712 if (dev_priv->card_type >= NV_50 && crtcport == 0x3c3 && data == 1) {
2713 int i;
2714
2715 bios_wr32(bios, 0x614100, (bios_rd32(
2716 bios, 0x614100) & 0x0fffffff) | 0x00800000);
2717
2718 bios_wr32(bios, 0x00e18c, bios_rd32(
2719 bios, 0x00e18c) | 0x00020000);
2720
2721 bios_wr32(bios, 0x614900, (bios_rd32(
2722 bios, 0x614900) & 0x0fffffff) | 0x00800000);
2723
2724 bios_wr32(bios, 0x000200, bios_rd32(
2725 bios, 0x000200) & ~0x40000000);
2726
2727 mdelay(10);
2728
2729 bios_wr32(bios, 0x00e18c, bios_rd32(
2730 bios, 0x00e18c) & ~0x00020000);
2731
2732 bios_wr32(bios, 0x000200, bios_rd32(
2733 bios, 0x000200) | 0x40000000);
2734
2735 bios_wr32(bios, 0x614100, 0x00800018);
2736 bios_wr32(bios, 0x614900, 0x00800018);
2737
2738 mdelay(10);
2739
2740 bios_wr32(bios, 0x614100, 0x10000018);
2741 bios_wr32(bios, 0x614900, 0x10000018);
2742
2743 for (i = 0; i < 3; i++)
2744 bios_wr32(bios, 0x614280 + (i*0x800), bios_rd32(
2745 bios, 0x614280 + (i*0x800)) & 0xf0f0f0f0);
2746
2747 for (i = 0; i < 2; i++)
2748 bios_wr32(bios, 0x614300 + (i*0x800), bios_rd32(
2749 bios, 0x614300 + (i*0x800)) & 0xfffff0f0);
2750
2751 for (i = 0; i < 3; i++)
2752 bios_wr32(bios, 0x614380 + (i*0x800), bios_rd32(
2753 bios, 0x614380 + (i*0x800)) & 0xfffff0f0);
2754
2755 for (i = 0; i < 2; i++)
2756 bios_wr32(bios, 0x614200 + (i*0x800), bios_rd32(
2757 bios, 0x614200 + (i*0x800)) & 0xfffffff0);
2758
2759 for (i = 0; i < 2; i++)
2760 bios_wr32(bios, 0x614108 + (i*0x800), bios_rd32(
2761 bios, 0x614108 + (i*0x800)) & 0x0fffffff);
2762 return 5;
2763 }
2764
2765 bios_port_wr(bios, crtcport, (bios_port_rd(bios, crtcport) & mask) |
2766 data);
2767 return 5;
2768}
2769
2770static int
2771init_sub(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2772{
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782 uint8_t sub = bios->data[offset + 1];
2783
2784 if (!iexec->execute)
2785 return 2;
2786
2787 BIOSLOG(bios, "0x%04X: Calling script %d\n", offset, sub);
2788
2789 parse_init_table(bios,
2790 ROM16(bios->data[bios->init_script_tbls_ptr + sub * 2]),
2791 iexec);
2792
2793 BIOSLOG(bios, "0x%04X: End of script %d\n", offset, sub);
2794
2795 return 2;
2796}
2797
2798static int
2799init_ram_condition(struct nvbios *bios, uint16_t offset,
2800 struct init_exec *iexec)
2801{
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814 uint8_t mask = bios->data[offset + 1];
2815 uint8_t cmpval = bios->data[offset + 2];
2816 uint8_t data;
2817
2818 if (!iexec->execute)
2819 return 3;
2820
2821 data = bios_rd32(bios, NV04_PFB_BOOT_0) & mask;
2822
2823 BIOSLOG(bios, "0x%04X: Checking if 0x%08X equals 0x%08X\n",
2824 offset, data, cmpval);
2825
2826 if (data == cmpval)
2827 BIOSLOG(bios, "0x%04X: Condition fulfilled -- continuing to execute\n", offset);
2828 else {
2829 BIOSLOG(bios, "0x%04X: Condition not fulfilled -- skipping following commands\n", offset);
2830 iexec->execute = false;
2831 }
2832
2833 return 3;
2834}
2835
2836static int
2837init_nv_reg(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2838{
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850 uint32_t reg = ROM32(bios->data[offset + 1]);
2851 uint32_t mask = ROM32(bios->data[offset + 5]);
2852 uint32_t data = ROM32(bios->data[offset + 9]);
2853
2854 if (!iexec->execute)
2855 return 13;
2856
2857 BIOSLOG(bios, "0x%04X: Reg: 0x%08X, Mask: 0x%08X, Data: 0x%08X\n",
2858 offset, reg, mask, data);
2859
2860 bios_wr32(bios, reg, (bios_rd32(bios, reg) & mask) | data);
2861
2862 return 13;
2863}
2864
2865static int
2866init_macro(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2867{
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881 uint8_t macro_index_tbl_idx = bios->data[offset + 1];
2882 uint16_t tmp = bios->macro_index_tbl_ptr + (macro_index_tbl_idx * MACRO_INDEX_SIZE);
2883 uint8_t macro_tbl_idx = bios->data[tmp];
2884 uint8_t count = bios->data[tmp + 1];
2885 uint32_t reg, data;
2886 int i;
2887
2888 if (!iexec->execute)
2889 return 2;
2890
2891 BIOSLOG(bios, "0x%04X: Macro: 0x%02X, MacroTableIndex: 0x%02X, "
2892 "Count: 0x%02X\n",
2893 offset, macro_index_tbl_idx, macro_tbl_idx, count);
2894
2895 for (i = 0; i < count; i++) {
2896 uint16_t macroentryptr = bios->macro_tbl_ptr + (macro_tbl_idx + i) * MACRO_SIZE;
2897
2898 reg = ROM32(bios->data[macroentryptr]);
2899 data = ROM32(bios->data[macroentryptr + 4]);
2900
2901 bios_wr32(bios, reg, data);
2902 }
2903
2904 return 2;
2905}
2906
2907static int
2908init_done(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2909{
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919 return 0;
2920}
2921
2922static int
2923init_resume(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2924{
2925
2926
2927
2928
2929
2930
2931
2932
2933 if (iexec->execute)
2934 return 1;
2935
2936 iexec->execute = true;
2937 BIOSLOG(bios, "0x%04X: ---- Executing following commands ----\n", offset);
2938
2939 return 1;
2940}
2941
2942static int
2943init_time(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2944{
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954 unsigned time = ROM16(bios->data[offset + 1]);
2955
2956 if (!iexec->execute)
2957 return 3;
2958
2959 BIOSLOG(bios, "0x%04X: Sleeping for 0x%04X microseconds\n",
2960 offset, time);
2961
2962 if (time < 1000)
2963 udelay(time);
2964 else
2965 msleep((time + 900) / 1000);
2966
2967 return 3;
2968}
2969
2970static int
2971init_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2972{
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984 uint8_t cond = bios->data[offset + 1];
2985
2986 if (!iexec->execute)
2987 return 2;
2988
2989 BIOSLOG(bios, "0x%04X: Condition: 0x%02X\n", offset, cond);
2990
2991 if (bios_condition_met(bios, offset, cond))
2992 BIOSLOG(bios, "0x%04X: Condition fulfilled -- continuing to execute\n", offset);
2993 else {
2994 BIOSLOG(bios, "0x%04X: Condition not fulfilled -- skipping following commands\n", offset);
2995 iexec->execute = false;
2996 }
2997
2998 return 2;
2999}
3000
3001static int
3002init_io_condition(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3003{
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015 uint8_t cond = bios->data[offset + 1];
3016
3017 if (!iexec->execute)
3018 return 2;
3019
3020 BIOSLOG(bios, "0x%04X: IO condition: 0x%02X\n", offset, cond);
3021
3022 if (io_condition_met(bios, offset, cond))
3023 BIOSLOG(bios, "0x%04X: Condition fulfilled -- continuing to execute\n", offset);
3024 else {
3025 BIOSLOG(bios, "0x%04X: Condition not fulfilled -- skipping following commands\n", offset);
3026 iexec->execute = false;
3027 }
3028
3029 return 2;
3030}
3031
3032static int
3033init_index_io(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3034{
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048 uint16_t crtcport = ROM16(bios->data[offset + 1]);
3049 uint8_t crtcindex = bios->data[offset + 3];
3050 uint8_t mask = bios->data[offset + 4];
3051 uint8_t data = bios->data[offset + 5];
3052 uint8_t value;
3053
3054 if (!iexec->execute)
3055 return 6;
3056
3057 BIOSLOG(bios, "0x%04X: Port: 0x%04X, Index: 0x%02X, Mask: 0x%02X, "
3058 "Data: 0x%02X\n",
3059 offset, crtcport, crtcindex, mask, data);
3060
3061 value = (bios_idxprt_rd(bios, crtcport, crtcindex) & mask) | data;
3062 bios_idxprt_wr(bios, crtcport, crtcindex, value);
3063
3064 return 6;
3065}
3066
3067static int
3068init_pll(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3069{
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081 uint32_t reg = ROM32(bios->data[offset + 1]);
3082 uint16_t freq = ROM16(bios->data[offset + 5]);
3083
3084 if (!iexec->execute)
3085 return 7;
3086
3087 BIOSLOG(bios, "0x%04X: Reg: 0x%08X, Freq: %d0kHz\n", offset, reg, freq);
3088
3089 setPLL(bios, reg, freq * 10);
3090
3091 return 7;
3092}
3093
3094static int
3095init_zm_reg(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3096{
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107 uint32_t reg = ROM32(bios->data[offset + 1]);
3108 uint32_t value = ROM32(bios->data[offset + 5]);
3109
3110 if (!iexec->execute)
3111 return 9;
3112
3113 if (reg == 0x000200)
3114 value |= 1;
3115
3116 bios_wr32(bios, reg, value);
3117
3118 return 9;
3119}
3120
3121static int
3122init_ram_restrict_pll(struct nvbios *bios, uint16_t offset,
3123 struct init_exec *iexec)
3124{
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141 struct drm_device *dev = bios->dev;
3142 uint32_t strap = (bios_rd32(bios, NV_PEXTDEV_BOOT_0) & 0x0000003c) >> 2;
3143 uint8_t index = bios->data[bios->ram_restrict_tbl_ptr + strap];
3144 uint8_t type = bios->data[offset + 1];
3145 uint32_t freq = ROM32(bios->data[offset + 2 + (index * 4)]);
3146 uint8_t *pll_limits = &bios->data[bios->pll_limit_tbl_ptr], *entry;
3147 int len = 2 + bios->ram_restrict_group_count * 4;
3148 int i;
3149
3150 if (!iexec->execute)
3151 return len;
3152
3153 if (!bios->pll_limit_tbl_ptr || (pll_limits[0] & 0xf0) != 0x30) {
3154 NV_ERROR(dev, "PLL limits table not version 3.x\n");
3155 return len;
3156 }
3157
3158 entry = pll_limits + pll_limits[1];
3159 for (i = 0; i < pll_limits[3]; i++, entry += pll_limits[2]) {
3160 if (entry[0] == type) {
3161 uint32_t reg = ROM32(entry[3]);
3162
3163 BIOSLOG(bios, "0x%04X: "
3164 "Type %02x Reg 0x%08x Freq %dKHz\n",
3165 offset, type, reg, freq);
3166
3167 setPLL(bios, reg, freq);
3168 return len;
3169 }
3170 }
3171
3172 NV_ERROR(dev, "PLL type 0x%02x not found in PLL limits table", type);
3173 return len;
3174}
3175
3176static int
3177init_8c(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3178{
3179
3180
3181
3182
3183
3184
3185
3186 return 1;
3187}
3188
3189static int
3190init_8d(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3191{
3192
3193
3194
3195
3196
3197
3198
3199 return 1;
3200}
3201
3202static int
3203init_gpio(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3204{
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214 struct drm_nouveau_private *dev_priv = bios->dev->dev_private;
3215 struct nouveau_gpio_engine *pgpio = &dev_priv->engine.gpio;
3216 const uint32_t nv50_gpio_ctl[2] = { 0xe100, 0xe28c };
3217 int i;
3218
3219 if (dev_priv->card_type < NV_50) {
3220 NV_ERROR(bios->dev, "INIT_GPIO on unsupported chipset\n");
3221 return 1;
3222 }
3223
3224 if (!iexec->execute)
3225 return 1;
3226
3227 for (i = 0; i < bios->dcb.gpio.entries; i++) {
3228 struct dcb_gpio_entry *gpio = &bios->dcb.gpio.entry[i];
3229 uint32_t r, s, v;
3230
3231 BIOSLOG(bios, "0x%04X: Entry: 0x%08X\n", offset, gpio->entry);
3232
3233 BIOSLOG(bios, "0x%04X: set gpio 0x%02x, state %d\n",
3234 offset, gpio->tag, gpio->state_default);
3235 if (bios->execute)
3236 pgpio->set(bios->dev, gpio->tag, gpio->state_default);
3237
3238
3239
3240
3241
3242 r = nv50_gpio_ctl[gpio->line >> 4];
3243 s = (gpio->line & 0x0f);
3244 v = bios_rd32(bios, r) & ~(0x00010001 << s);
3245 switch ((gpio->entry & 0x06000000) >> 25) {
3246 case 1:
3247 v |= (0x00000001 << s);
3248 break;
3249 case 2:
3250 v |= (0x00010000 << s);
3251 break;
3252 default:
3253 break;
3254 }
3255 bios_wr32(bios, r, v);
3256 }
3257
3258 return 1;
3259}
3260
3261static int
3262init_ram_restrict_zm_reg_group(struct nvbios *bios, uint16_t offset,
3263 struct init_exec *iexec)
3264{
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283 uint32_t reg = ROM32(bios->data[offset + 1]);
3284 uint8_t regincrement = bios->data[offset + 5];
3285 uint8_t count = bios->data[offset + 6];
3286 uint32_t strap_ramcfg, data;
3287
3288 uint16_t blocklen = bios->ram_restrict_group_count * 4;
3289 int len = 7 + count * blocklen;
3290 uint8_t index;
3291 int i;
3292
3293 ;
3294 if (!blocklen) {
3295 NV_ERROR(bios->dev,
3296 "0x%04X: Zero block length - has the M table "
3297 "been parsed?\n", offset);
3298 return -EINVAL;
3299 }
3300
3301 if (!iexec->execute)
3302 return len;
3303
3304 strap_ramcfg = (bios_rd32(bios, NV_PEXTDEV_BOOT_0) >> 2) & 0xf;
3305 index = bios->data[bios->ram_restrict_tbl_ptr + strap_ramcfg];
3306
3307 BIOSLOG(bios, "0x%04X: Reg: 0x%08X, RegIncrement: 0x%02X, "
3308 "Count: 0x%02X, StrapRamCfg: 0x%02X, Index: 0x%02X\n",
3309 offset, reg, regincrement, count, strap_ramcfg, index);
3310
3311 for (i = 0; i < count; i++) {
3312 data = ROM32(bios->data[offset + 7 + index * 4 + blocklen * i]);
3313
3314 bios_wr32(bios, reg, data);
3315
3316 reg += regincrement;
3317 }
3318
3319 return len;
3320}
3321
3322static int
3323init_copy_zm_reg(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3324{
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335 uint32_t srcreg = ROM32(bios->data[offset + 1]);
3336 uint32_t dstreg = ROM32(bios->data[offset + 5]);
3337
3338 if (!iexec->execute)
3339 return 9;
3340
3341 bios_wr32(bios, dstreg, bios_rd32(bios, srcreg));
3342
3343 return 9;
3344}
3345
3346static int
3347init_zm_reg_group_addr_latched(struct nvbios *bios, uint16_t offset,
3348 struct init_exec *iexec)
3349{
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362 uint32_t reg = ROM32(bios->data[offset + 1]);
3363 uint8_t count = bios->data[offset + 5];
3364 int len = 6 + count * 4;
3365 int i;
3366
3367 if (!iexec->execute)
3368 return len;
3369
3370 for (i = 0; i < count; i++) {
3371 uint32_t data = ROM32(bios->data[offset + 6 + 4 * i]);
3372 bios_wr32(bios, reg, data);
3373 }
3374
3375 return len;
3376}
3377
3378static int
3379init_reserved(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3380{
3381
3382
3383
3384
3385
3386
3387
3388
3389 return 1;
3390}
3391
3392static int
3393init_96(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3394{
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409 uint16_t xlatptr = bios->init96_tbl_ptr + (bios->data[offset + 7] * 2);
3410 uint32_t reg = ROM32(bios->data[offset + 8]);
3411 uint32_t mask = ROM32(bios->data[offset + 12]);
3412 uint32_t val;
3413
3414 val = bios_rd32(bios, ROM32(bios->data[offset + 1]));
3415 if (bios->data[offset + 5] < 0x80)
3416 val >>= bios->data[offset + 5];
3417 else
3418 val <<= (0x100 - bios->data[offset + 5]);
3419 val &= bios->data[offset + 6];
3420
3421 val = bios->data[ROM16(bios->data[xlatptr]) + val];
3422 val <<= bios->data[offset + 16];
3423
3424 if (!iexec->execute)
3425 return 17;
3426
3427 bios_wr32(bios, reg, (bios_rd32(bios, reg) & mask) | val);
3428 return 17;
3429}
3430
3431static int
3432init_97(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3433{
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446 uint32_t reg = ROM32(bios->data[offset + 1]);
3447 uint32_t mask = ROM32(bios->data[offset + 5]);
3448 uint32_t add = ROM32(bios->data[offset + 9]);
3449 uint32_t val;
3450
3451 val = bios_rd32(bios, reg);
3452 val = (val & mask) | ((val + add) & ~mask);
3453
3454 if (!iexec->execute)
3455 return 13;
3456
3457 bios_wr32(bios, reg, val);
3458 return 13;
3459}
3460
3461static int
3462init_auxch(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3463{
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476 struct drm_device *dev = bios->dev;
3477 struct nouveau_i2c_chan *auxch;
3478 uint32_t addr = ROM32(bios->data[offset + 1]);
3479 uint8_t count = bios->data[offset + 5];
3480 int len = 6 + count * 2;
3481 int ret, i;
3482
3483 if (!bios->display.output) {
3484 NV_ERROR(dev, "INIT_AUXCH: no active output\n");
3485 return len;
3486 }
3487
3488 auxch = init_i2c_device_find(dev, bios->display.output->i2c_index);
3489 if (!auxch) {
3490 NV_ERROR(dev, "INIT_AUXCH: couldn't get auxch %d\n",
3491 bios->display.output->i2c_index);
3492 return len;
3493 }
3494
3495 if (!iexec->execute)
3496 return len;
3497
3498 offset += 6;
3499 for (i = 0; i < count; i++, offset += 2) {
3500 uint8_t data;
3501
3502 ret = nouveau_dp_auxch(auxch, 9, addr, &data, 1);
3503 if (ret) {
3504 NV_ERROR(dev, "INIT_AUXCH: rd auxch fail %d\n", ret);
3505 return len;
3506 }
3507
3508 data &= bios->data[offset + 0];
3509 data |= bios->data[offset + 1];
3510
3511 ret = nouveau_dp_auxch(auxch, 8, addr, &data, 1);
3512 if (ret) {
3513 NV_ERROR(dev, "INIT_AUXCH: wr auxch fail %d\n", ret);
3514 return len;
3515 }
3516 }
3517
3518 return len;
3519}
3520
3521static int
3522init_zm_auxch(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3523{
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535 struct drm_device *dev = bios->dev;
3536 struct nouveau_i2c_chan *auxch;
3537 uint32_t addr = ROM32(bios->data[offset + 1]);
3538 uint8_t count = bios->data[offset + 5];
3539 int len = 6 + count;
3540 int ret, i;
3541
3542 if (!bios->display.output) {
3543 NV_ERROR(dev, "INIT_ZM_AUXCH: no active output\n");
3544 return len;
3545 }
3546
3547 auxch = init_i2c_device_find(dev, bios->display.output->i2c_index);
3548 if (!auxch) {
3549 NV_ERROR(dev, "INIT_ZM_AUXCH: couldn't get auxch %d\n",
3550 bios->display.output->i2c_index);
3551 return len;
3552 }
3553
3554 if (!iexec->execute)
3555 return len;
3556
3557 offset += 6;
3558 for (i = 0; i < count; i++, offset++) {
3559 ret = nouveau_dp_auxch(auxch, 8, addr, &bios->data[offset], 1);
3560 if (ret) {
3561 NV_ERROR(dev, "INIT_ZM_AUXCH: wr auxch fail %d\n", ret);
3562 return len;
3563 }
3564 }
3565
3566 return len;
3567}
3568
3569static int
3570init_i2c_long_if(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
3571{
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589 uint8_t i2c_index = bios->data[offset + 1];
3590 uint8_t i2c_address = bios->data[offset + 2] >> 1;
3591 uint8_t reglo = bios->data[offset + 3];
3592 uint8_t reghi = bios->data[offset + 4];
3593 uint8_t mask = bios->data[offset + 5];
3594 uint8_t data = bios->data[offset + 6];
3595 struct nouveau_i2c_chan *chan;
3596 uint8_t buf0[2] = { reghi, reglo };
3597 uint8_t buf1[1];
3598 struct i2c_msg msg[2] = {
3599 { i2c_address, 0, 1, buf0 },
3600 { i2c_address, I2C_M_RD, 1, buf1 },
3601 };
3602 int ret;
3603
3604
3605
3606 BIOSLOG(bios, "0x%04X: DCBI2CIndex: 0x%02X, I2CAddress: 0x%02X\n",
3607 offset, i2c_index, i2c_address);
3608
3609 chan = init_i2c_device_find(bios->dev, i2c_index);
3610 if (!chan)
3611 return -ENODEV;
3612
3613
3614 ret = i2c_transfer(&chan->adapter, msg, 2);
3615 if (ret < 0) {
3616 BIOSLOG(bios, "0x%04X: I2CReg: 0x%02X:0x%02X, Value: [no device], "
3617 "Mask: 0x%02X, Data: 0x%02X\n",
3618 offset, reghi, reglo, mask, data);
3619 iexec->execute = 0;
3620 return 7;
3621 }
3622
3623 BIOSLOG(bios, "0x%04X: I2CReg: 0x%02X:0x%02X, Value: 0x%02X, "
3624 "Mask: 0x%02X, Data: 0x%02X\n",
3625 offset, reghi, reglo, buf1[0], mask, data);
3626
3627 iexec->execute = ((buf1[0] & mask) == data);
3628
3629 return 7;
3630}
3631
3632static struct init_tbl_entry itbl_entry[] = {
3633
3634
3635 { "INIT_IO_RESTRICT_PROG" , 0x32, init_io_restrict_prog },
3636 { "INIT_REPEAT" , 0x33, init_repeat },
3637 { "INIT_IO_RESTRICT_PLL" , 0x34, init_io_restrict_pll },
3638 { "INIT_END_REPEAT" , 0x36, init_end_repeat },
3639 { "INIT_COPY" , 0x37, init_copy },
3640 { "INIT_NOT" , 0x38, init_not },
3641 { "INIT_IO_FLAG_CONDITION" , 0x39, init_io_flag_condition },
3642 { "INIT_DP_CONDITION" , 0x3A, init_dp_condition },
3643 { "INIT_OP_3B" , 0x3B, init_op_3b },
3644 { "INIT_OP_3C" , 0x3C, init_op_3c },
3645 { "INIT_INDEX_ADDRESS_LATCHED" , 0x49, init_idx_addr_latched },
3646 { "INIT_IO_RESTRICT_PLL2" , 0x4A, init_io_restrict_pll2 },
3647 { "INIT_PLL2" , 0x4B, init_pll2 },
3648 { "INIT_I2C_BYTE" , 0x4C, init_i2c_byte },
3649 { "INIT_ZM_I2C_BYTE" , 0x4D, init_zm_i2c_byte },
3650 { "INIT_ZM_I2C" , 0x4E, init_zm_i2c },
3651 { "INIT_TMDS" , 0x4F, init_tmds },
3652 { "INIT_ZM_TMDS_GROUP" , 0x50, init_zm_tmds_group },
3653 { "INIT_CR_INDEX_ADDRESS_LATCHED" , 0x51, init_cr_idx_adr_latch },
3654 { "INIT_CR" , 0x52, init_cr },
3655 { "INIT_ZM_CR" , 0x53, init_zm_cr },
3656 { "INIT_ZM_CR_GROUP" , 0x54, init_zm_cr_group },
3657 { "INIT_CONDITION_TIME" , 0x56, init_condition_time },
3658 { "INIT_LTIME" , 0x57, init_ltime },
3659 { "INIT_ZM_REG_SEQUENCE" , 0x58, init_zm_reg_sequence },
3660
3661 { "INIT_SUB_DIRECT" , 0x5B, init_sub_direct },
3662 { "INIT_I2C_IF" , 0x5E, init_i2c_if },
3663 { "INIT_COPY_NV_REG" , 0x5F, init_copy_nv_reg },
3664 { "INIT_ZM_INDEX_IO" , 0x62, init_zm_index_io },
3665 { "INIT_COMPUTE_MEM" , 0x63, init_compute_mem },
3666 { "INIT_RESET" , 0x65, init_reset },
3667 { "INIT_CONFIGURE_MEM" , 0x66, init_configure_mem },
3668 { "INIT_CONFIGURE_CLK" , 0x67, init_configure_clk },
3669 { "INIT_CONFIGURE_PREINIT" , 0x68, init_configure_preinit },
3670 { "INIT_IO" , 0x69, init_io },
3671 { "INIT_SUB" , 0x6B, init_sub },
3672 { "INIT_RAM_CONDITION" , 0x6D, init_ram_condition },
3673 { "INIT_NV_REG" , 0x6E, init_nv_reg },
3674 { "INIT_MACRO" , 0x6F, init_macro },
3675 { "INIT_DONE" , 0x71, init_done },
3676 { "INIT_RESUME" , 0x72, init_resume },
3677
3678 { "INIT_TIME" , 0x74, init_time },
3679 { "INIT_CONDITION" , 0x75, init_condition },
3680 { "INIT_IO_CONDITION" , 0x76, init_io_condition },
3681 { "INIT_INDEX_IO" , 0x78, init_index_io },
3682 { "INIT_PLL" , 0x79, init_pll },
3683 { "INIT_ZM_REG" , 0x7A, init_zm_reg },
3684 { "INIT_RAM_RESTRICT_PLL" , 0x87, init_ram_restrict_pll },
3685 { "INIT_8C" , 0x8C, init_8c },
3686 { "INIT_8D" , 0x8D, init_8d },
3687 { "INIT_GPIO" , 0x8E, init_gpio },
3688 { "INIT_RAM_RESTRICT_ZM_REG_GROUP" , 0x8F, init_ram_restrict_zm_reg_group },
3689 { "INIT_COPY_ZM_REG" , 0x90, init_copy_zm_reg },
3690 { "INIT_ZM_REG_GROUP_ADDRESS_LATCHED" , 0x91, init_zm_reg_group_addr_latched },
3691 { "INIT_RESERVED" , 0x92, init_reserved },
3692 { "INIT_96" , 0x96, init_96 },
3693 { "INIT_97" , 0x97, init_97 },
3694 { "INIT_AUXCH" , 0x98, init_auxch },
3695 { "INIT_ZM_AUXCH" , 0x99, init_zm_auxch },
3696 { "INIT_I2C_LONG_IF" , 0x9A, init_i2c_long_if },
3697 { NULL , 0 , NULL }
3698};
3699
3700#define MAX_TABLE_OPS 1000
3701
3702static int
3703parse_init_table(struct nvbios *bios, unsigned int offset,
3704 struct init_exec *iexec)
3705{
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715 int count = 0, i, ret;
3716 uint8_t id;
3717
3718
3719
3720
3721
3722
3723 while ((offset < bios->length) && (count++ < MAX_TABLE_OPS)) {
3724 id = bios->data[offset];
3725
3726
3727 for (i = 0; itbl_entry[i].name && (itbl_entry[i].id != id); i++)
3728 ;
3729
3730 if (!itbl_entry[i].name) {
3731 NV_ERROR(bios->dev,
3732 "0x%04X: Init table command not found: "
3733 "0x%02X\n", offset, id);
3734 return -ENOENT;
3735 }
3736
3737 BIOSLOG(bios, "0x%04X: [ (0x%02X) - %s ]\n", offset,
3738 itbl_entry[i].id, itbl_entry[i].name);
3739
3740
3741 ret = (*itbl_entry[i].handler)(bios, offset, iexec);
3742 if (ret < 0) {
3743 NV_ERROR(bios->dev, "0x%04X: Failed parsing init "
3744 "table opcode: %s %d\n", offset,
3745 itbl_entry[i].name, ret);
3746 }
3747
3748 if (ret <= 0)
3749 break;
3750
3751
3752
3753
3754
3755
3756 offset += ret;
3757 }
3758
3759 if (offset >= bios->length)
3760 NV_WARN(bios->dev,
3761 "Offset 0x%04X greater than known bios image length. "
3762 "Corrupt image?\n", offset);
3763 if (count >= MAX_TABLE_OPS)
3764 NV_WARN(bios->dev,
3765 "More than %d opcodes to a table is unlikely, "
3766 "is the bios image corrupt?\n", MAX_TABLE_OPS);
3767
3768 return 0;
3769}
3770
3771static void
3772parse_init_tables(struct nvbios *bios)
3773{
3774
3775
3776 int i = 0;
3777 uint16_t table;
3778 struct init_exec iexec = {true, false};
3779
3780 if (bios->old_style_init) {
3781 if (bios->init_script_tbls_ptr)
3782 parse_init_table(bios, bios->init_script_tbls_ptr, &iexec);
3783 if (bios->extra_init_script_tbl_ptr)
3784 parse_init_table(bios, bios->extra_init_script_tbl_ptr, &iexec);
3785
3786 return;
3787 }
3788
3789 while ((table = ROM16(bios->data[bios->init_script_tbls_ptr + i]))) {
3790 NV_INFO(bios->dev,
3791 "Parsing VBIOS init table %d at offset 0x%04X\n",
3792 i / 2, table);
3793 BIOSLOG(bios, "0x%04X: ------ Executing following commands ------\n", table);
3794
3795 parse_init_table(bios, table, &iexec);
3796 i += 2;
3797 }
3798}
3799
3800static uint16_t clkcmptable(struct nvbios *bios, uint16_t clktable, int pxclk)
3801{
3802 int compare_record_len, i = 0;
3803 uint16_t compareclk, scriptptr = 0;
3804
3805 if (bios->major_version < 5)
3806 compare_record_len = 3;
3807 else
3808 compare_record_len = 4;
3809
3810 do {
3811 compareclk = ROM16(bios->data[clktable + compare_record_len * i]);
3812 if (pxclk >= compareclk * 10) {
3813 if (bios->major_version < 5) {
3814 uint8_t tmdssub = bios->data[clktable + 2 + compare_record_len * i];
3815 scriptptr = ROM16(bios->data[bios->init_script_tbls_ptr + tmdssub * 2]);
3816 } else
3817 scriptptr = ROM16(bios->data[clktable + 2 + compare_record_len * i]);
3818 break;
3819 }
3820 i++;
3821 } while (compareclk);
3822
3823 return scriptptr;
3824}
3825
3826static void
3827run_digital_op_script(struct drm_device *dev, uint16_t scriptptr,
3828 struct dcb_entry *dcbent, int head, bool dl)
3829{
3830 struct drm_nouveau_private *dev_priv = dev->dev_private;
3831 struct nvbios *bios = &dev_priv->vbios;
3832 struct init_exec iexec = {true, false};
3833
3834 NV_TRACE(dev, "0x%04X: Parsing digital output script table\n",
3835 scriptptr);
3836 bios_idxprt_wr(bios, NV_CIO_CRX__COLOR, NV_CIO_CRE_44,
3837 head ? NV_CIO_CRE_44_HEADB : NV_CIO_CRE_44_HEADA);
3838
3839 NVWriteVgaCrtc5758(dev, head, 0, dcbent->index);
3840 parse_init_table(bios, scriptptr, &iexec);
3841
3842 nv04_dfp_bind_head(dev, dcbent, head, dl);
3843}
3844
3845static int call_lvds_manufacturer_script(struct drm_device *dev, struct dcb_entry *dcbent, int head, enum LVDS_script script)
3846{
3847 struct drm_nouveau_private *dev_priv = dev->dev_private;
3848 struct nvbios *bios = &dev_priv->vbios;
3849 uint8_t sub = bios->data[bios->fp.xlated_entry + script] + (bios->fp.link_c_increment && dcbent->or & OUTPUT_C ? 1 : 0);
3850 uint16_t scriptofs = ROM16(bios->data[bios->init_script_tbls_ptr + sub * 2]);
3851
3852 if (!bios->fp.xlated_entry || !sub || !scriptofs)
3853 return -EINVAL;
3854
3855 run_digital_op_script(dev, scriptofs, dcbent, head, bios->fp.dual_link);
3856
3857 if (script == LVDS_PANEL_OFF) {
3858
3859 msleep(ROM16(bios->data[bios->fp.xlated_entry + 7]));
3860 }
3861#ifdef __powerpc__
3862
3863 if (script == LVDS_RESET &&
3864 (dev->pci_device == 0x0179 || dev->pci_device == 0x0189 ||
3865 dev->pci_device == 0x0329))
3866 nv_write_tmds(dev, dcbent->or, 0, 0x02, 0x72);
3867#endif
3868
3869 return 0;
3870}
3871
3872static int run_lvds_table(struct drm_device *dev, struct dcb_entry *dcbent, int head, enum LVDS_script script, int pxclk)
3873{
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884 struct drm_nouveau_private *dev_priv = dev->dev_private;
3885 struct nvbios *bios = &dev_priv->vbios;
3886 unsigned int outputset = (dcbent->or == 4) ? 1 : 0;
3887 uint16_t scriptptr = 0, clktable;
3888
3889
3890
3891
3892
3893
3894 switch (script) {
3895 case LVDS_INIT:
3896 return -ENOSYS;
3897 case LVDS_BACKLIGHT_ON:
3898 case LVDS_PANEL_ON:
3899 scriptptr = ROM16(bios->data[bios->fp.lvdsmanufacturerpointer + 7 + outputset * 2]);
3900 break;
3901 case LVDS_BACKLIGHT_OFF:
3902 case LVDS_PANEL_OFF:
3903 scriptptr = ROM16(bios->data[bios->fp.lvdsmanufacturerpointer + 11 + outputset * 2]);
3904 break;
3905 case LVDS_RESET:
3906 clktable = bios->fp.lvdsmanufacturerpointer + 15;
3907 if (dcbent->or == 4)
3908 clktable += 8;
3909
3910 if (dcbent->lvdsconf.use_straps_for_mode) {
3911 if (bios->fp.dual_link)
3912 clktable += 4;
3913 if (bios->fp.if_is_24bit)
3914 clktable += 2;
3915 } else {
3916
3917 int cmpval_24bit = (dcbent->or == 4) ? 4 : 1;
3918
3919 if (bios->fp.dual_link) {
3920 clktable += 4;
3921 cmpval_24bit <<= 1;
3922 }
3923
3924 if (bios->fp.strapless_is_24bit & cmpval_24bit)
3925 clktable += 2;
3926 }
3927
3928 clktable = ROM16(bios->data[clktable]);
3929 if (!clktable) {
3930 NV_ERROR(dev, "Pixel clock comparison table not found\n");
3931 return -ENOENT;
3932 }
3933 scriptptr = clkcmptable(bios, clktable, pxclk);
3934 }
3935
3936 if (!scriptptr) {
3937 NV_ERROR(dev, "LVDS output init script not found\n");
3938 return -ENOENT;
3939 }
3940 run_digital_op_script(dev, scriptptr, dcbent, head, bios->fp.dual_link);
3941
3942 return 0;
3943}
3944
3945int call_lvds_script(struct drm_device *dev, struct dcb_entry *dcbent, int head, enum LVDS_script script, int pxclk)
3946{
3947
3948
3949
3950
3951
3952
3953 struct drm_nouveau_private *dev_priv = dev->dev_private;
3954 struct nvbios *bios = &dev_priv->vbios;
3955 uint8_t lvds_ver = bios->data[bios->fp.lvdsmanufacturerpointer];
3956 uint32_t sel_clk_binding, sel_clk;
3957 int ret;
3958
3959 if (bios->fp.last_script_invoc == (script << 1 | head) || !lvds_ver ||
3960 (lvds_ver >= 0x30 && script == LVDS_INIT))
3961 return 0;
3962
3963 if (!bios->fp.lvds_init_run) {
3964 bios->fp.lvds_init_run = true;
3965 call_lvds_script(dev, dcbent, head, LVDS_INIT, pxclk);
3966 }
3967
3968 if (script == LVDS_PANEL_ON && bios->fp.reset_after_pclk_change)
3969 call_lvds_script(dev, dcbent, head, LVDS_RESET, pxclk);
3970 if (script == LVDS_RESET && bios->fp.power_off_for_reset)
3971 call_lvds_script(dev, dcbent, head, LVDS_PANEL_OFF, pxclk);
3972
3973 NV_TRACE(dev, "Calling LVDS script %d:\n", script);
3974
3975
3976 sel_clk_binding = bios_rd32(bios, NV_PRAMDAC_SEL_CLK) & 0x50000;
3977
3978 if (lvds_ver < 0x30)
3979 ret = call_lvds_manufacturer_script(dev, dcbent, head, script);
3980 else
3981 ret = run_lvds_table(dev, dcbent, head, script, pxclk);
3982
3983 bios->fp.last_script_invoc = (script << 1 | head);
3984
3985 sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK) & ~0x50000;
3986 NVWriteRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK, sel_clk | sel_clk_binding);
3987
3988 nvWriteMC(dev, NV_PBUS_POWERCTRL_2, 0);
3989
3990 return ret;
3991}
3992
3993struct lvdstableheader {
3994 uint8_t lvds_ver, headerlen, recordlen;
3995};
3996
3997static int parse_lvds_manufacturer_table_header(struct drm_device *dev, struct nvbios *bios, struct lvdstableheader *lth)
3998{
3999
4000
4001
4002
4003
4004
4005
4006 uint8_t lvds_ver, headerlen, recordlen;
4007
4008 memset(lth, 0, sizeof(struct lvdstableheader));
4009
4010 if (bios->fp.lvdsmanufacturerpointer == 0x0) {
4011 NV_ERROR(dev, "Pointer to LVDS manufacturer table invalid\n");
4012 return -EINVAL;
4013 }
4014
4015 lvds_ver = bios->data[bios->fp.lvdsmanufacturerpointer];
4016
4017 switch (lvds_ver) {
4018 case 0x0a:
4019 headerlen = 2;
4020 recordlen = bios->data[bios->fp.lvdsmanufacturerpointer + 1];
4021 break;
4022 case 0x30:
4023 headerlen = bios->data[bios->fp.lvdsmanufacturerpointer + 1];
4024 if (headerlen < 0x1f) {
4025 NV_ERROR(dev, "LVDS table header not understood\n");
4026 return -EINVAL;
4027 }
4028 recordlen = bios->data[bios->fp.lvdsmanufacturerpointer + 2];
4029 break;
4030 case 0x40:
4031 headerlen = bios->data[bios->fp.lvdsmanufacturerpointer + 1];
4032 if (headerlen < 0x7) {
4033 NV_ERROR(dev, "LVDS table header not understood\n");
4034 return -EINVAL;
4035 }
4036 recordlen = bios->data[bios->fp.lvdsmanufacturerpointer + 2];
4037 break;
4038 default:
4039 NV_ERROR(dev,
4040 "LVDS table revision %d.%d not currently supported\n",
4041 lvds_ver >> 4, lvds_ver & 0xf);
4042 return -ENOSYS;
4043 }
4044
4045 lth->lvds_ver = lvds_ver;
4046 lth->headerlen = headerlen;
4047 lth->recordlen = recordlen;
4048
4049 return 0;
4050}
4051
4052static int
4053get_fp_strap(struct drm_device *dev, struct nvbios *bios)
4054{
4055 struct drm_nouveau_private *dev_priv = dev->dev_private;
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066 if (bios->major_version < 5 && bios->data[0x48] & 0x4)
4067 return NVReadVgaCrtc5758(dev, 0, 0xf) & 0xf;
4068
4069 if (dev_priv->card_type >= NV_50)
4070 return (bios_rd32(bios, NV_PEXTDEV_BOOT_0) >> 24) & 0xf;
4071 else
4072 return (bios_rd32(bios, NV_PEXTDEV_BOOT_0) >> 16) & 0xf;
4073}
4074
4075static int parse_fp_mode_table(struct drm_device *dev, struct nvbios *bios)
4076{
4077 uint8_t *fptable;
4078 uint8_t fptable_ver, headerlen = 0, recordlen, fpentries = 0xf, fpindex;
4079 int ret, ofs, fpstrapping;
4080 struct lvdstableheader lth;
4081
4082 if (bios->fp.fptablepointer == 0x0) {
4083
4084
4085#ifndef __powerpc__
4086 NV_ERROR(dev, "Pointer to flat panel table invalid\n");
4087#endif
4088 bios->digital_min_front_porch = 0x4b;
4089 return 0;
4090 }
4091
4092 fptable = &bios->data[bios->fp.fptablepointer];
4093 fptable_ver = fptable[0];
4094
4095 switch (fptable_ver) {
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105 case 0x05:
4106 recordlen = 42;
4107 ofs = -1;
4108 break;
4109 case 0x10:
4110 recordlen = 44;
4111 ofs = 0;
4112 break;
4113 case 0x20:
4114 headerlen = fptable[1];
4115 recordlen = fptable[2];
4116 fpentries = fptable[3];
4117
4118
4119
4120
4121 bios->digital_min_front_porch = fptable[4];
4122 ofs = -7;
4123 break;
4124 default:
4125 NV_ERROR(dev,
4126 "FP table revision %d.%d not currently supported\n",
4127 fptable_ver >> 4, fptable_ver & 0xf);
4128 return -ENOSYS;
4129 }
4130
4131 if (!bios->is_mobile)
4132 return 0;
4133
4134 ret = parse_lvds_manufacturer_table_header(dev, bios, <h);
4135 if (ret)
4136 return ret;
4137
4138 if (lth.lvds_ver == 0x30 || lth.lvds_ver == 0x40) {
4139 bios->fp.fpxlatetableptr = bios->fp.lvdsmanufacturerpointer +
4140 lth.headerlen + 1;
4141 bios->fp.xlatwidth = lth.recordlen;
4142 }
4143 if (bios->fp.fpxlatetableptr == 0x0) {
4144 NV_ERROR(dev, "Pointer to flat panel xlat table invalid\n");
4145 return -EINVAL;
4146 }
4147
4148 fpstrapping = get_fp_strap(dev, bios);
4149
4150 fpindex = bios->data[bios->fp.fpxlatetableptr +
4151 fpstrapping * bios->fp.xlatwidth];
4152
4153 if (fpindex > fpentries) {
4154 NV_ERROR(dev, "Bad flat panel table index\n");
4155 return -ENOENT;
4156 }
4157
4158
4159 if (lth.lvds_ver > 0x10)
4160 bios->fp_no_ddc = fpstrapping != 0xf || fpindex != 0xf;
4161
4162
4163
4164
4165
4166
4167 if (fpstrapping == 0xf || fpindex == 0xf)
4168 return 0;
4169
4170 bios->fp.mode_ptr = bios->fp.fptablepointer + headerlen +
4171 recordlen * fpindex + ofs;
4172
4173 NV_TRACE(dev, "BIOS FP mode: %dx%d (%dkHz pixel clock)\n",
4174 ROM16(bios->data[bios->fp.mode_ptr + 11]) + 1,
4175 ROM16(bios->data[bios->fp.mode_ptr + 25]) + 1,
4176 ROM16(bios->data[bios->fp.mode_ptr + 7]) * 10);
4177
4178 return 0;
4179}
4180
4181bool nouveau_bios_fp_mode(struct drm_device *dev, struct drm_display_mode *mode)
4182{
4183 struct drm_nouveau_private *dev_priv = dev->dev_private;
4184 struct nvbios *bios = &dev_priv->vbios;
4185 uint8_t *mode_entry = &bios->data[bios->fp.mode_ptr];
4186
4187 if (!mode)
4188 return bios->fp.mode_ptr;
4189
4190 memset(mode, 0, sizeof(struct drm_display_mode));
4191
4192
4193
4194
4195
4196
4197 mode->clock = ROM16(mode_entry[7]) * 10;
4198
4199 mode->hdisplay = ROM16(mode_entry[11]) + 1;
4200
4201
4202
4203
4204 mode->hsync_start = ROM16(mode_entry[17]) + 1;
4205 mode->hsync_end = ROM16(mode_entry[19]) + 1;
4206 mode->htotal = ROM16(mode_entry[21]) + 1;
4207
4208 mode->vdisplay = ROM16(mode_entry[25]) + 1;
4209 mode->vsync_start = ROM16(mode_entry[31]) + 1;
4210 mode->vsync_end = ROM16(mode_entry[33]) + 1;
4211 mode->vtotal = ROM16(mode_entry[35]) + 1;
4212 mode->flags |= (mode_entry[37] & 0x10) ?
4213 DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
4214 mode->flags |= (mode_entry[37] & 0x1) ?
4215 DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
4216
4217
4218
4219
4220
4221 mode->status = MODE_OK;
4222 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
4223 drm_mode_set_name(mode);
4224 return bios->fp.mode_ptr;
4225}
4226
4227int nouveau_bios_parse_lvds_table(struct drm_device *dev, int pxclk, bool *dl, bool *if_is_24bit)
4228{
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254 struct drm_nouveau_private *dev_priv = dev->dev_private;
4255 struct nvbios *bios = &dev_priv->vbios;
4256 int fpstrapping = get_fp_strap(dev, bios), lvdsmanufacturerindex = 0;
4257 struct lvdstableheader lth;
4258 uint16_t lvdsofs;
4259 int ret, chip_version = bios->chip_version;
4260
4261 ret = parse_lvds_manufacturer_table_header(dev, bios, <h);
4262 if (ret)
4263 return ret;
4264
4265 switch (lth.lvds_ver) {
4266 case 0x0a:
4267 lvdsmanufacturerindex = bios->data[
4268 bios->fp.fpxlatemanufacturertableptr +
4269 fpstrapping];
4270
4271
4272 if (!pxclk)
4273 break;
4274
4275 if (chip_version < 0x25) {
4276
4277
4278
4279
4280
4281 lvdsmanufacturerindex =
4282 (bios->legacy.lvds_single_a_script_ptr & 1) ?
4283 2 : 0;
4284 if (pxclk >= bios->fp.duallink_transition_clk)
4285 lvdsmanufacturerindex++;
4286 } else if (chip_version < 0x30) {
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296 lvdsmanufacturerindex = 0;
4297 } else {
4298
4299 lvdsmanufacturerindex = 0;
4300 if (pxclk >= bios->fp.duallink_transition_clk)
4301 lvdsmanufacturerindex = 2;
4302 if (pxclk >= 140000)
4303 lvdsmanufacturerindex = 3;
4304 }
4305
4306
4307
4308
4309
4310 break;
4311 case 0x30:
4312 case 0x40:
4313 lvdsmanufacturerindex = fpstrapping;
4314 break;
4315 default:
4316 NV_ERROR(dev, "LVDS table revision not currently supported\n");
4317 return -ENOSYS;
4318 }
4319
4320 lvdsofs = bios->fp.xlated_entry = bios->fp.lvdsmanufacturerpointer + lth.headerlen + lth.recordlen * lvdsmanufacturerindex;
4321 switch (lth.lvds_ver) {
4322 case 0x0a:
4323 bios->fp.power_off_for_reset = bios->data[lvdsofs] & 1;
4324 bios->fp.reset_after_pclk_change = bios->data[lvdsofs] & 2;
4325 bios->fp.dual_link = bios->data[lvdsofs] & 4;
4326 bios->fp.link_c_increment = bios->data[lvdsofs] & 8;
4327 *if_is_24bit = bios->data[lvdsofs] & 16;
4328 break;
4329 case 0x30:
4330 case 0x40:
4331
4332
4333
4334
4335 bios->fp.power_off_for_reset = true;
4336 bios->fp.reset_after_pclk_change = true;
4337
4338
4339
4340
4341
4342 bios->fp.dual_link = bios->data[lvdsofs] & 1;
4343 bios->fp.if_is_24bit = bios->data[lvdsofs] & 2;
4344 bios->fp.strapless_is_24bit = bios->data[bios->fp.lvdsmanufacturerpointer + 4];
4345 bios->fp.duallink_transition_clk = ROM16(bios->data[bios->fp.lvdsmanufacturerpointer + 5]) * 10;
4346 break;
4347 }
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358 if (nv_match_device(dev, 0x01d7, 0x1028, 0x01c2))
4359 bios->fp.duallink_transition_clk = 80000;
4360
4361
4362 if (pxclk && (chip_version < 0x25 || chip_version > 0x28))
4363 bios->fp.dual_link = (pxclk >= bios->fp.duallink_transition_clk);
4364
4365 *dl = bios->fp.dual_link;
4366
4367 return 0;
4368}
4369
4370static uint8_t *
4371bios_output_config_match(struct drm_device *dev, struct dcb_entry *dcbent,
4372 uint16_t record, int record_len, int record_nr,
4373 bool match_link)
4374{
4375 struct drm_nouveau_private *dev_priv = dev->dev_private;
4376 struct nvbios *bios = &dev_priv->vbios;
4377 uint32_t entry;
4378 uint16_t table;
4379 int i, v;
4380
4381 switch (dcbent->type) {
4382 case OUTPUT_TMDS:
4383 case OUTPUT_LVDS:
4384 case OUTPUT_DP:
4385 break;
4386 default:
4387 match_link = false;
4388 break;
4389 }
4390
4391 for (i = 0; i < record_nr; i++, record += record_len) {
4392 table = ROM16(bios->data[record]);
4393 if (!table)
4394 continue;
4395 entry = ROM32(bios->data[table]);
4396
4397 if (match_link) {
4398 v = (entry & 0x00c00000) >> 22;
4399 if (!(v & dcbent->sorconf.link))
4400 continue;
4401 }
4402
4403 v = (entry & 0x000f0000) >> 16;
4404 if (!(v & dcbent->or))
4405 continue;
4406
4407 v = (entry & 0x000000f0) >> 4;
4408 if (v != dcbent->location)
4409 continue;
4410
4411 v = (entry & 0x0000000f);
4412 if (v != dcbent->type)
4413 continue;
4414
4415 return &bios->data[table];
4416 }
4417
4418 return NULL;
4419}
4420
4421void *
4422nouveau_bios_dp_table(struct drm_device *dev, struct dcb_entry *dcbent,
4423 int *length)
4424{
4425 struct drm_nouveau_private *dev_priv = dev->dev_private;
4426 struct nvbios *bios = &dev_priv->vbios;
4427 uint8_t *table;
4428
4429 if (!bios->display.dp_table_ptr) {
4430 NV_ERROR(dev, "No pointer to DisplayPort table\n");
4431 return NULL;
4432 }
4433 table = &bios->data[bios->display.dp_table_ptr];
4434
4435 if (table[0] != 0x20 && table[0] != 0x21) {
4436 NV_ERROR(dev, "DisplayPort table version 0x%02x unknown\n",
4437 table[0]);
4438 return NULL;
4439 }
4440
4441 *length = table[4];
4442 return bios_output_config_match(dev, dcbent,
4443 bios->display.dp_table_ptr + table[1],
4444 table[2], table[3], table[0] >= 0x21);
4445}
4446
4447int
4448nouveau_bios_run_display_table(struct drm_device *dev, struct dcb_entry *dcbent,
4449 uint32_t sub, int pxclk)
4450{
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474 struct drm_nouveau_private *dev_priv = dev->dev_private;
4475 struct nvbios *bios = &dev_priv->vbios;
4476 uint8_t *table = &bios->data[bios->display.script_table_ptr];
4477 uint8_t *otable = NULL;
4478 uint16_t script;
4479 int i = 0;
4480
4481 if (!bios->display.script_table_ptr) {
4482 NV_ERROR(dev, "No pointer to output script table\n");
4483 return 1;
4484 }
4485
4486
4487
4488
4489
4490 if (table[0] < 0x20)
4491 return 1;
4492
4493 if (table[0] != 0x20 && table[0] != 0x21) {
4494 NV_ERROR(dev, "Output script table version 0x%02x unknown\n",
4495 table[0]);
4496 return 1;
4497 }
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529 NV_DEBUG_KMS(dev, "Searching for output entry for %d %d %d\n",
4530 dcbent->type, dcbent->location, dcbent->or);
4531 otable = bios_output_config_match(dev, dcbent, table[1] +
4532 bios->display.script_table_ptr,
4533 table[2], table[3], table[0] >= 0x21);
4534 if (!otable) {
4535 NV_DEBUG_KMS(dev, "failed to match any output table\n");
4536 return 1;
4537 }
4538
4539 if (pxclk < -2 || pxclk > 0) {
4540
4541 for (i = 0; i < otable[5]; i++) {
4542 if (ROM16(otable[table[4] + i*6]) == sub)
4543 break;
4544 }
4545
4546 if (i == otable[5]) {
4547 NV_ERROR(dev, "Table 0x%04x not found for %d/%d, "
4548 "using first\n",
4549 sub, dcbent->type, dcbent->or);
4550 i = 0;
4551 }
4552 }
4553
4554 if (pxclk == 0) {
4555 script = ROM16(otable[6]);
4556 if (!script) {
4557 NV_DEBUG_KMS(dev, "output script 0 not found\n");
4558 return 1;
4559 }
4560
4561 NV_DEBUG_KMS(dev, "0x%04X: parsing output script 0\n", script);
4562 nouveau_bios_run_init_table(dev, script, dcbent);
4563 } else
4564 if (pxclk == -1) {
4565 script = ROM16(otable[8]);
4566 if (!script) {
4567 NV_DEBUG_KMS(dev, "output script 1 not found\n");
4568 return 1;
4569 }
4570
4571 NV_DEBUG_KMS(dev, "0x%04X: parsing output script 1\n", script);
4572 nouveau_bios_run_init_table(dev, script, dcbent);
4573 } else
4574 if (pxclk == -2) {
4575 if (table[4] >= 12)
4576 script = ROM16(otable[10]);
4577 else
4578 script = 0;
4579 if (!script) {
4580 NV_DEBUG_KMS(dev, "output script 2 not found\n");
4581 return 1;
4582 }
4583
4584 NV_DEBUG_KMS(dev, "0x%04X: parsing output script 2\n", script);
4585 nouveau_bios_run_init_table(dev, script, dcbent);
4586 } else
4587 if (pxclk > 0) {
4588 script = ROM16(otable[table[4] + i*6 + 2]);
4589 if (script)
4590 script = clkcmptable(bios, script, pxclk);
4591 if (!script) {
4592 NV_DEBUG_KMS(dev, "clock script 0 not found\n");
4593 return 1;
4594 }
4595
4596 NV_DEBUG_KMS(dev, "0x%04X: parsing clock script 0\n", script);
4597 nouveau_bios_run_init_table(dev, script, dcbent);
4598 } else
4599 if (pxclk < 0) {
4600 script = ROM16(otable[table[4] + i*6 + 4]);
4601 if (script)
4602 script = clkcmptable(bios, script, -pxclk);
4603 if (!script) {
4604 NV_DEBUG_KMS(dev, "clock script 1 not found\n");
4605 return 1;
4606 }
4607
4608 NV_DEBUG_KMS(dev, "0x%04X: parsing clock script 1\n", script);
4609 nouveau_bios_run_init_table(dev, script, dcbent);
4610 }
4611
4612 return 0;
4613}
4614
4615
4616int run_tmds_table(struct drm_device *dev, struct dcb_entry *dcbent, int head, int pxclk)
4617{
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627 struct drm_nouveau_private *dev_priv = dev->dev_private;
4628 struct nvbios *bios = &dev_priv->vbios;
4629 int cv = bios->chip_version;
4630 uint16_t clktable = 0, scriptptr;
4631 uint32_t sel_clk_binding, sel_clk;
4632
4633
4634 if (cv >= 0x17 && cv != 0x1a && cv != 0x20 &&
4635 dcbent->location != DCB_LOC_ON_CHIP)
4636 return 0;
4637
4638 switch (ffs(dcbent->or)) {
4639 case 1:
4640 clktable = bios->tmds.output0_script_ptr;
4641 break;
4642 case 2:
4643 case 3:
4644 clktable = bios->tmds.output1_script_ptr;
4645 break;
4646 }
4647
4648 if (!clktable) {
4649 NV_ERROR(dev, "Pixel clock comparison table not found\n");
4650 return -EINVAL;
4651 }
4652
4653 scriptptr = clkcmptable(bios, clktable, pxclk);
4654
4655 if (!scriptptr) {
4656 NV_ERROR(dev, "TMDS output init script not found\n");
4657 return -ENOENT;
4658 }
4659
4660
4661 sel_clk_binding = bios_rd32(bios, NV_PRAMDAC_SEL_CLK) & 0x50000;
4662 run_digital_op_script(dev, scriptptr, dcbent, head, pxclk >= 165000);
4663 sel_clk = NVReadRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK) & ~0x50000;
4664 NVWriteRAMDAC(dev, 0, NV_PRAMDAC_SEL_CLK, sel_clk | sel_clk_binding);
4665
4666 return 0;
4667}
4668
4669struct pll_mapping {
4670 u8 type;
4671 u32 reg;
4672};
4673
4674static struct pll_mapping nv04_pll_mapping[] = {
4675 { PLL_CORE , NV_PRAMDAC_NVPLL_COEFF },
4676 { PLL_MEMORY, NV_PRAMDAC_MPLL_COEFF },
4677 { PLL_VPLL0 , NV_PRAMDAC_VPLL_COEFF },
4678 { PLL_VPLL1 , NV_RAMDAC_VPLL2 },
4679 {}
4680};
4681
4682static struct pll_mapping nv40_pll_mapping[] = {
4683 { PLL_CORE , 0x004000 },
4684 { PLL_MEMORY, 0x004020 },
4685 { PLL_VPLL0 , NV_PRAMDAC_VPLL_COEFF },
4686 { PLL_VPLL1 , NV_RAMDAC_VPLL2 },
4687 {}
4688};
4689
4690static struct pll_mapping nv50_pll_mapping[] = {
4691 { PLL_CORE , 0x004028 },
4692 { PLL_SHADER, 0x004020 },
4693 { PLL_UNK03 , 0x004000 },
4694 { PLL_MEMORY, 0x004008 },
4695 { PLL_UNK40 , 0x00e810 },
4696 { PLL_UNK41 , 0x00e818 },
4697 { PLL_UNK42 , 0x00e824 },
4698 { PLL_VPLL0 , 0x614100 },
4699 { PLL_VPLL1 , 0x614900 },
4700 {}
4701};
4702
4703static struct pll_mapping nv84_pll_mapping[] = {
4704 { PLL_CORE , 0x004028 },
4705 { PLL_SHADER, 0x004020 },
4706 { PLL_MEMORY, 0x004008 },
4707 { PLL_UNK05 , 0x004030 },
4708 { PLL_UNK41 , 0x00e818 },
4709 { PLL_VPLL0 , 0x614100 },
4710 { PLL_VPLL1 , 0x614900 },
4711 {}
4712};
4713
4714u32
4715get_pll_register(struct drm_device *dev, enum pll_types type)
4716{
4717 struct drm_nouveau_private *dev_priv = dev->dev_private;
4718 struct nvbios *bios = &dev_priv->vbios;
4719 struct pll_mapping *map;
4720 int i;
4721
4722 if (dev_priv->card_type < NV_40)
4723 map = nv04_pll_mapping;
4724 else
4725 if (dev_priv->card_type < NV_50)
4726 map = nv40_pll_mapping;
4727 else {
4728 u8 *plim = &bios->data[bios->pll_limit_tbl_ptr];
4729
4730 if (plim[0] >= 0x30) {
4731 u8 *entry = plim + plim[1];
4732 for (i = 0; i < plim[3]; i++, entry += plim[2]) {
4733 if (entry[0] == type)
4734 return ROM32(entry[3]);
4735 }
4736
4737 return 0;
4738 }
4739
4740 if (dev_priv->chipset == 0x50)
4741 map = nv50_pll_mapping;
4742 else
4743 map = nv84_pll_mapping;
4744 }
4745
4746 while (map->reg) {
4747 if (map->type == type)
4748 return map->reg;
4749 map++;
4750 }
4751
4752 return 0;
4753}
4754
4755int get_pll_limits(struct drm_device *dev, uint32_t limit_match, struct pll_lims *pll_lim)
4756{
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773 struct drm_nouveau_private *dev_priv = dev->dev_private;
4774 struct nvbios *bios = &dev_priv->vbios;
4775 int cv = bios->chip_version, pllindex = 0;
4776 uint8_t pll_lim_ver = 0, headerlen = 0, recordlen = 0, entries = 0;
4777 uint32_t crystal_strap_mask, crystal_straps;
4778
4779 if (!bios->pll_limit_tbl_ptr) {
4780 if (cv == 0x30 || cv == 0x31 || cv == 0x35 || cv == 0x36 ||
4781 cv >= 0x40) {
4782 NV_ERROR(dev, "Pointer to PLL limits table invalid\n");
4783 return -EINVAL;
4784 }
4785 } else
4786 pll_lim_ver = bios->data[bios->pll_limit_tbl_ptr];
4787
4788 crystal_strap_mask = 1 << 6;
4789
4790 if (cv > 0x10 && cv != 0x15 && cv != 0x1a && cv != 0x20)
4791 crystal_strap_mask |= 1 << 22;
4792 crystal_straps = nvReadEXTDEV(dev, NV_PEXTDEV_BOOT_0) &
4793 crystal_strap_mask;
4794
4795 switch (pll_lim_ver) {
4796
4797
4798
4799
4800 case 0:
4801 break;
4802 case 0x10:
4803 case 0x11:
4804
4805
4806
4807
4808 headerlen = 1;
4809 recordlen = 0x18;
4810 entries = 1;
4811 pllindex = 0;
4812 break;
4813 case 0x20:
4814 case 0x21:
4815 case 0x30:
4816 case 0x40:
4817 headerlen = bios->data[bios->pll_limit_tbl_ptr + 1];
4818 recordlen = bios->data[bios->pll_limit_tbl_ptr + 2];
4819 entries = bios->data[bios->pll_limit_tbl_ptr + 3];
4820 break;
4821 default:
4822 NV_ERROR(dev, "PLL limits table revision 0x%X not currently "
4823 "supported\n", pll_lim_ver);
4824 return -ENOSYS;
4825 }
4826
4827
4828 memset(pll_lim, 0, sizeof(struct pll_lims));
4829
4830
4831
4832
4833 if (limit_match > PLL_MAX)
4834 pll_lim->reg = limit_match;
4835 else {
4836 pll_lim->reg = get_pll_register(dev, limit_match);
4837 if (!pll_lim->reg)
4838 return -ENOENT;
4839 }
4840
4841 if (pll_lim_ver == 0x10 || pll_lim_ver == 0x11) {
4842 uint8_t *pll_rec = &bios->data[bios->pll_limit_tbl_ptr + headerlen + recordlen * pllindex];
4843
4844 pll_lim->vco1.minfreq = ROM32(pll_rec[0]);
4845 pll_lim->vco1.maxfreq = ROM32(pll_rec[4]);
4846 pll_lim->vco2.minfreq = ROM32(pll_rec[8]);
4847 pll_lim->vco2.maxfreq = ROM32(pll_rec[12]);
4848 pll_lim->vco1.min_inputfreq = ROM32(pll_rec[16]);
4849 pll_lim->vco2.min_inputfreq = ROM32(pll_rec[20]);
4850 pll_lim->vco1.max_inputfreq = pll_lim->vco2.max_inputfreq = INT_MAX;
4851
4852
4853 pll_lim->vco1.min_n = 0x1;
4854 if (cv == 0x36)
4855 pll_lim->vco1.min_n = 0x5;
4856 pll_lim->vco1.max_n = 0xff;
4857 pll_lim->vco1.min_m = 0x1;
4858 pll_lim->vco1.max_m = 0xd;
4859 pll_lim->vco2.min_n = 0x4;
4860
4861
4862
4863
4864
4865
4866 pll_lim->vco2.max_n = 0x28;
4867 if (cv == 0x30 || cv == 0x35)
4868
4869 pll_lim->vco2.max_n = 0x1f;
4870 pll_lim->vco2.min_m = 0x1;
4871 pll_lim->vco2.max_m = 0x4;
4872 pll_lim->max_log2p = 0x7;
4873 pll_lim->max_usable_log2p = 0x6;
4874 } else if (pll_lim_ver == 0x20 || pll_lim_ver == 0x21) {
4875 uint16_t plloffs = bios->pll_limit_tbl_ptr + headerlen;
4876 uint8_t *pll_rec;
4877 int i;
4878
4879
4880
4881
4882
4883 if (ROM32(bios->data[plloffs]))
4884 NV_WARN(dev, "Default PLL limit entry has non-zero "
4885 "register field\n");
4886
4887 for (i = 1; i < entries; i++)
4888 if (ROM32(bios->data[plloffs + recordlen * i]) == pll_lim->reg) {
4889 pllindex = i;
4890 break;
4891 }
4892
4893 if ((dev_priv->card_type >= NV_50) && (pllindex == 0)) {
4894 NV_ERROR(dev, "Register 0x%08x not found in PLL "
4895 "limits table", pll_lim->reg);
4896 return -ENOENT;
4897 }
4898
4899 pll_rec = &bios->data[plloffs + recordlen * pllindex];
4900
4901 BIOSLOG(bios, "Loading PLL limits for reg 0x%08x\n",
4902 pllindex ? pll_lim->reg : 0);
4903
4904
4905
4906
4907
4908
4909
4910 pll_lim->vco1.minfreq = ROM16(pll_rec[4]) * 1000;
4911 pll_lim->vco1.maxfreq = ROM16(pll_rec[6]) * 1000;
4912 pll_lim->vco2.minfreq = ROM16(pll_rec[8]) * 1000;
4913 pll_lim->vco2.maxfreq = ROM16(pll_rec[10]) * 1000;
4914
4915
4916 pll_lim->vco1.min_inputfreq = ROM16(pll_rec[12]) * 1000;
4917 pll_lim->vco2.min_inputfreq = ROM16(pll_rec[14]) * 1000;
4918 pll_lim->vco1.max_inputfreq = ROM16(pll_rec[16]) * 1000;
4919 pll_lim->vco2.max_inputfreq = ROM16(pll_rec[18]) * 1000;
4920
4921
4922 pll_lim->vco1.min_n = pll_rec[20];
4923 pll_lim->vco1.max_n = pll_rec[21];
4924 pll_lim->vco1.min_m = pll_rec[22];
4925 pll_lim->vco1.max_m = pll_rec[23];
4926 pll_lim->vco2.min_n = pll_rec[24];
4927 pll_lim->vco2.max_n = pll_rec[25];
4928 pll_lim->vco2.min_m = pll_rec[26];
4929 pll_lim->vco2.max_m = pll_rec[27];
4930
4931 pll_lim->max_usable_log2p = pll_lim->max_log2p = pll_rec[29];
4932 if (pll_lim->max_log2p > 0x7)
4933
4934 NV_WARN(dev, "Max log2 P value greater than 7 (%d)\n",
4935 pll_lim->max_log2p);
4936 if (cv < 0x60)
4937 pll_lim->max_usable_log2p = 0x6;
4938 pll_lim->log2p_bias = pll_rec[30];
4939
4940 if (recordlen > 0x22)
4941 pll_lim->refclk = ROM32(pll_rec[31]);
4942
4943 if (recordlen > 0x23 && pll_rec[35])
4944 NV_WARN(dev,
4945 "Bits set in PLL configuration byte (%x)\n",
4946 pll_rec[35]);
4947
4948
4949 if (cv == 0x51 && !pll_lim->refclk) {
4950 uint32_t sel_clk = bios_rd32(bios, NV_PRAMDAC_SEL_CLK);
4951
4952 if ((pll_lim->reg == NV_PRAMDAC_VPLL_COEFF && sel_clk & 0x20) ||
4953 (pll_lim->reg == NV_RAMDAC_VPLL2 && sel_clk & 0x80)) {
4954 if (bios_idxprt_rd(bios, NV_CIO_CRX__COLOR, NV_CIO_CRE_CHIP_ID_INDEX) < 0xa3)
4955 pll_lim->refclk = 200000;
4956 else
4957 pll_lim->refclk = 25000;
4958 }
4959 }
4960 } else if (pll_lim_ver == 0x30) {
4961 uint8_t *entry = &bios->data[bios->pll_limit_tbl_ptr + headerlen];
4962 uint8_t *record = NULL;
4963 int i;
4964
4965 BIOSLOG(bios, "Loading PLL limits for register 0x%08x\n",
4966 pll_lim->reg);
4967
4968 for (i = 0; i < entries; i++, entry += recordlen) {
4969 if (ROM32(entry[3]) == pll_lim->reg) {
4970 record = &bios->data[ROM16(entry[1])];
4971 break;
4972 }
4973 }
4974
4975 if (!record) {
4976 NV_ERROR(dev, "Register 0x%08x not found in PLL "
4977 "limits table", pll_lim->reg);
4978 return -ENOENT;
4979 }
4980
4981 pll_lim->vco1.minfreq = ROM16(record[0]) * 1000;
4982 pll_lim->vco1.maxfreq = ROM16(record[2]) * 1000;
4983 pll_lim->vco2.minfreq = ROM16(record[4]) * 1000;
4984 pll_lim->vco2.maxfreq = ROM16(record[6]) * 1000;
4985 pll_lim->vco1.min_inputfreq = ROM16(record[8]) * 1000;
4986 pll_lim->vco2.min_inputfreq = ROM16(record[10]) * 1000;
4987 pll_lim->vco1.max_inputfreq = ROM16(record[12]) * 1000;
4988 pll_lim->vco2.max_inputfreq = ROM16(record[14]) * 1000;
4989 pll_lim->vco1.min_n = record[16];
4990 pll_lim->vco1.max_n = record[17];
4991 pll_lim->vco1.min_m = record[18];
4992 pll_lim->vco1.max_m = record[19];
4993 pll_lim->vco2.min_n = record[20];
4994 pll_lim->vco2.max_n = record[21];
4995 pll_lim->vco2.min_m = record[22];
4996 pll_lim->vco2.max_m = record[23];
4997 pll_lim->max_usable_log2p = pll_lim->max_log2p = record[25];
4998 pll_lim->log2p_bias = record[27];
4999 pll_lim->refclk = ROM32(record[28]);
5000 } else if (pll_lim_ver) {
5001 uint8_t *entry = &bios->data[bios->pll_limit_tbl_ptr + headerlen];
5002 uint8_t *record = NULL;
5003 int i;
5004
5005 BIOSLOG(bios, "Loading PLL limits for register 0x%08x\n",
5006 pll_lim->reg);
5007
5008 for (i = 0; i < entries; i++, entry += recordlen) {
5009 if (ROM32(entry[3]) == pll_lim->reg) {
5010 record = &bios->data[ROM16(entry[1])];
5011 break;
5012 }
5013 }
5014
5015 if (!record) {
5016 NV_ERROR(dev, "Register 0x%08x not found in PLL "
5017 "limits table", pll_lim->reg);
5018 return -ENOENT;
5019 }
5020
5021 pll_lim->vco1.minfreq = ROM16(record[0]) * 1000;
5022 pll_lim->vco1.maxfreq = ROM16(record[2]) * 1000;
5023 pll_lim->vco1.min_inputfreq = ROM16(record[4]) * 1000;
5024 pll_lim->vco1.max_inputfreq = ROM16(record[6]) * 1000;
5025 pll_lim->vco1.min_m = record[8];
5026 pll_lim->vco1.max_m = record[9];
5027 pll_lim->vco1.min_n = record[10];
5028 pll_lim->vco1.max_n = record[11];
5029 pll_lim->min_p = record[12];
5030 pll_lim->max_p = record[13];
5031
5032 if ((entry[0] & 0xf0) == 0x80)
5033 pll_lim->refclk = 27000;
5034 else
5035 pll_lim->refclk = 100000;
5036 }
5037
5038
5039
5040
5041
5042
5043 if (!pll_lim->vco1.maxfreq) {
5044 pll_lim->vco1.minfreq = bios->fminvco;
5045 pll_lim->vco1.maxfreq = bios->fmaxvco;
5046 pll_lim->vco1.min_inputfreq = 0;
5047 pll_lim->vco1.max_inputfreq = INT_MAX;
5048 pll_lim->vco1.min_n = 0x1;
5049 pll_lim->vco1.max_n = 0xff;
5050 pll_lim->vco1.min_m = 0x1;
5051 if (crystal_straps == 0) {
5052
5053 if (cv < 0x11)
5054 pll_lim->vco1.min_m = 0x7;
5055 pll_lim->vco1.max_m = 0xd;
5056 } else {
5057 if (cv < 0x11)
5058 pll_lim->vco1.min_m = 0x8;
5059 pll_lim->vco1.max_m = 0xe;
5060 }
5061 if (cv < 0x17 || cv == 0x1a || cv == 0x20)
5062 pll_lim->max_log2p = 4;
5063 else
5064 pll_lim->max_log2p = 5;
5065 pll_lim->max_usable_log2p = pll_lim->max_log2p;
5066 }
5067
5068 if (!pll_lim->refclk)
5069 switch (crystal_straps) {
5070 case 0:
5071 pll_lim->refclk = 13500;
5072 break;
5073 case (1 << 6):
5074 pll_lim->refclk = 14318;
5075 break;
5076 case (1 << 22):
5077 pll_lim->refclk = 27000;
5078 break;
5079 case (1 << 22 | 1 << 6):
5080 pll_lim->refclk = 25000;
5081 break;
5082 }
5083
5084 NV_DEBUG(dev, "pll.vco1.minfreq: %d\n", pll_lim->vco1.minfreq);
5085 NV_DEBUG(dev, "pll.vco1.maxfreq: %d\n", pll_lim->vco1.maxfreq);
5086 NV_DEBUG(dev, "pll.vco1.min_inputfreq: %d\n", pll_lim->vco1.min_inputfreq);
5087 NV_DEBUG(dev, "pll.vco1.max_inputfreq: %d\n", pll_lim->vco1.max_inputfreq);
5088 NV_DEBUG(dev, "pll.vco1.min_n: %d\n", pll_lim->vco1.min_n);
5089 NV_DEBUG(dev, "pll.vco1.max_n: %d\n", pll_lim->vco1.max_n);
5090 NV_DEBUG(dev, "pll.vco1.min_m: %d\n", pll_lim->vco1.min_m);
5091 NV_DEBUG(dev, "pll.vco1.max_m: %d\n", pll_lim->vco1.max_m);
5092 if (pll_lim->vco2.maxfreq) {
5093 NV_DEBUG(dev, "pll.vco2.minfreq: %d\n", pll_lim->vco2.minfreq);
5094 NV_DEBUG(dev, "pll.vco2.maxfreq: %d\n", pll_lim->vco2.maxfreq);
5095 NV_DEBUG(dev, "pll.vco2.min_inputfreq: %d\n", pll_lim->vco2.min_inputfreq);
5096 NV_DEBUG(dev, "pll.vco2.max_inputfreq: %d\n", pll_lim->vco2.max_inputfreq);
5097 NV_DEBUG(dev, "pll.vco2.min_n: %d\n", pll_lim->vco2.min_n);
5098 NV_DEBUG(dev, "pll.vco2.max_n: %d\n", pll_lim->vco2.max_n);
5099 NV_DEBUG(dev, "pll.vco2.min_m: %d\n", pll_lim->vco2.min_m);
5100 NV_DEBUG(dev, "pll.vco2.max_m: %d\n", pll_lim->vco2.max_m);
5101 }
5102 if (!pll_lim->max_p) {
5103 NV_DEBUG(dev, "pll.max_log2p: %d\n", pll_lim->max_log2p);
5104 NV_DEBUG(dev, "pll.log2p_bias: %d\n", pll_lim->log2p_bias);
5105 } else {
5106 NV_DEBUG(dev, "pll.min_p: %d\n", pll_lim->min_p);
5107 NV_DEBUG(dev, "pll.max_p: %d\n", pll_lim->max_p);
5108 }
5109 NV_DEBUG(dev, "pll.refclk: %d\n", pll_lim->refclk);
5110
5111 return 0;
5112}
5113
5114static void parse_bios_version(struct drm_device *dev, struct nvbios *bios, uint16_t offset)
5115{
5116
5117
5118
5119
5120
5121
5122
5123 bios->major_version = bios->data[offset + 3];
5124 bios->chip_version = bios->data[offset + 2];
5125 NV_TRACE(dev, "Bios version %02x.%02x.%02x.%02x\n",
5126 bios->data[offset + 3], bios->data[offset + 2],
5127 bios->data[offset + 1], bios->data[offset]);
5128}
5129
5130static void parse_script_table_pointers(struct nvbios *bios, uint16_t offset)
5131{
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144 bios->init_script_tbls_ptr = ROM16(bios->data[offset]);
5145 bios->macro_index_tbl_ptr = ROM16(bios->data[offset + 2]);
5146 bios->macro_tbl_ptr = ROM16(bios->data[offset + 4]);
5147 bios->condition_tbl_ptr = ROM16(bios->data[offset + 6]);
5148 bios->io_condition_tbl_ptr = ROM16(bios->data[offset + 8]);
5149 bios->io_flag_condition_tbl_ptr = ROM16(bios->data[offset + 10]);
5150 bios->init_function_tbl_ptr = ROM16(bios->data[offset + 12]);
5151}
5152
5153static int parse_bit_A_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5154{
5155
5156
5157
5158
5159
5160
5161 uint16_t load_table_ptr;
5162 uint8_t version, headerlen, entrylen, num_entries;
5163
5164 if (bitentry->length != 3) {
5165 NV_ERROR(dev, "Do not understand BIT A table\n");
5166 return -EINVAL;
5167 }
5168
5169 load_table_ptr = ROM16(bios->data[bitentry->offset]);
5170
5171 if (load_table_ptr == 0x0) {
5172 NV_ERROR(dev, "Pointer to BIT loadval table invalid\n");
5173 return -EINVAL;
5174 }
5175
5176 version = bios->data[load_table_ptr];
5177
5178 if (version != 0x10) {
5179 NV_ERROR(dev, "BIT loadval table version %d.%d not supported\n",
5180 version >> 4, version & 0xF);
5181 return -ENOSYS;
5182 }
5183
5184 headerlen = bios->data[load_table_ptr + 1];
5185 entrylen = bios->data[load_table_ptr + 2];
5186 num_entries = bios->data[load_table_ptr + 3];
5187
5188 if (headerlen != 4 || entrylen != 4 || num_entries != 2) {
5189 NV_ERROR(dev, "Do not understand BIT loadval table\n");
5190 return -EINVAL;
5191 }
5192
5193
5194 bios->dactestval = ROM32(bios->data[load_table_ptr + headerlen]) & 0x3ff;
5195
5196 return 0;
5197}
5198
5199static int parse_bit_C_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5200{
5201
5202
5203
5204
5205
5206
5207 if (bitentry->length < 10) {
5208 NV_ERROR(dev, "Do not understand BIT C table\n");
5209 return -EINVAL;
5210 }
5211
5212 bios->pll_limit_tbl_ptr = ROM16(bios->data[bitentry->offset + 8]);
5213
5214 return 0;
5215}
5216
5217static int parse_bit_display_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5218{
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228 if (bitentry->length != 4) {
5229 NV_ERROR(dev, "Do not understand BIT display table\n");
5230 return -EINVAL;
5231 }
5232
5233 bios->fp.fptablepointer = ROM16(bios->data[bitentry->offset + 2]);
5234
5235 return 0;
5236}
5237
5238static int parse_bit_init_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5239{
5240
5241
5242
5243
5244
5245
5246 if (bitentry->length < 14) {
5247 NV_ERROR(dev, "Do not understand init table\n");
5248 return -EINVAL;
5249 }
5250
5251 parse_script_table_pointers(bios, bitentry->offset);
5252
5253 if (bitentry->length >= 16)
5254 bios->some_script_ptr = ROM16(bios->data[bitentry->offset + 14]);
5255 if (bitentry->length >= 18)
5256 bios->init96_tbl_ptr = ROM16(bios->data[bitentry->offset + 16]);
5257
5258 return 0;
5259}
5260
5261static int parse_bit_i_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5262{
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274 uint16_t daccmpoffset;
5275 uint8_t dacver, dacheaderlen;
5276
5277 if (bitentry->length < 6) {
5278 NV_ERROR(dev, "BIT i table too short for needed information\n");
5279 return -EINVAL;
5280 }
5281
5282 parse_bios_version(dev, bios, bitentry->offset);
5283
5284
5285
5286
5287
5288 bios->feature_byte = bios->data[bitentry->offset + 5];
5289 bios->is_mobile = bios->feature_byte & FEATURE_MOBILE;
5290
5291 if (bitentry->length < 15) {
5292 NV_WARN(dev, "BIT i table not long enough for DAC load "
5293 "detection comparison table\n");
5294 return -EINVAL;
5295 }
5296
5297 daccmpoffset = ROM16(bios->data[bitentry->offset + 13]);
5298
5299
5300 if (!daccmpoffset)
5301 return 0;
5302
5303
5304
5305
5306
5307
5308
5309 dacver = bios->data[daccmpoffset];
5310 dacheaderlen = bios->data[daccmpoffset + 1];
5311
5312 if (dacver != 0x00 && dacver != 0x10) {
5313 NV_WARN(dev, "DAC load detection comparison table version "
5314 "%d.%d not known\n", dacver >> 4, dacver & 0xf);
5315 return -ENOSYS;
5316 }
5317
5318 bios->dactestval = ROM32(bios->data[daccmpoffset + dacheaderlen]);
5319 bios->tvdactestval = ROM32(bios->data[daccmpoffset + dacheaderlen + 4]);
5320
5321 return 0;
5322}
5323
5324static int parse_bit_lvds_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5325{
5326
5327
5328
5329
5330
5331
5332
5333 if (bitentry->length != 2) {
5334 NV_ERROR(dev, "Do not understand BIT LVDS table\n");
5335 return -EINVAL;
5336 }
5337
5338
5339
5340
5341
5342 bios->fp.lvdsmanufacturerpointer = ROM16(bios->data[bitentry->offset]);
5343
5344 return 0;
5345}
5346
5347static int
5348parse_bit_M_tbl_entry(struct drm_device *dev, struct nvbios *bios,
5349 struct bit_entry *bitentry)
5350{
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365 if (bitentry->length < 0x5)
5366 return 0;
5367
5368 if (bitentry->version < 2) {
5369 bios->ram_restrict_group_count = bios->data[bitentry->offset + 2];
5370 bios->ram_restrict_tbl_ptr = ROM16(bios->data[bitentry->offset + 3]);
5371 } else {
5372 bios->ram_restrict_group_count = bios->data[bitentry->offset + 0];
5373 bios->ram_restrict_tbl_ptr = ROM16(bios->data[bitentry->offset + 1]);
5374 }
5375
5376 return 0;
5377}
5378
5379static int parse_bit_tmds_tbl_entry(struct drm_device *dev, struct nvbios *bios, struct bit_entry *bitentry)
5380{
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404 uint16_t tmdstableptr, script1, script2;
5405
5406 if (bitentry->length != 2) {
5407 NV_ERROR(dev, "Do not understand BIT TMDS table\n");
5408 return -EINVAL;
5409 }
5410
5411 tmdstableptr = ROM16(bios->data[bitentry->offset]);
5412 if (!tmdstableptr) {
5413 NV_ERROR(dev, "Pointer to TMDS table invalid\n");
5414 return -EINVAL;
5415 }
5416
5417 NV_INFO(dev, "TMDS table version %d.%d\n",
5418 bios->data[tmdstableptr] >> 4, bios->data[tmdstableptr] & 0xf);
5419
5420
5421 if (bios->data[tmdstableptr] != 0x11)
5422 return -ENOSYS;
5423
5424
5425
5426
5427
5428 script1 = ROM16(bios->data[tmdstableptr + 7]);
5429 script2 = ROM16(bios->data[tmdstableptr + 9]);
5430 if (bios->data[script1] != 'q' || bios->data[script2] != 'q')
5431 NV_WARN(dev, "TMDS table script pointers not stubbed\n");
5432
5433 bios->tmds.output0_script_ptr = ROM16(bios->data[tmdstableptr + 11]);
5434 bios->tmds.output1_script_ptr = ROM16(bios->data[tmdstableptr + 13]);
5435
5436 return 0;
5437}
5438
5439static int
5440parse_bit_U_tbl_entry(struct drm_device *dev, struct nvbios *bios,
5441 struct bit_entry *bitentry)
5442{
5443
5444
5445
5446
5447
5448
5449
5450
5451 uint16_t outputscripttableptr;
5452
5453 if (bitentry->length != 3) {
5454 NV_ERROR(dev, "Do not understand BIT U table\n");
5455 return -EINVAL;
5456 }
5457
5458 outputscripttableptr = ROM16(bios->data[bitentry->offset]);
5459 bios->display.script_table_ptr = outputscripttableptr;
5460 return 0;
5461}
5462
5463static int
5464parse_bit_displayport_tbl_entry(struct drm_device *dev, struct nvbios *bios,
5465 struct bit_entry *bitentry)
5466{
5467 bios->display.dp_table_ptr = ROM16(bios->data[bitentry->offset]);
5468 return 0;
5469}
5470
5471struct bit_table {
5472 const char id;
5473 int (* const parse_fn)(struct drm_device *, struct nvbios *, struct bit_entry *);
5474};
5475
5476#define BIT_TABLE(id, funcid) ((struct bit_table){ id, parse_bit_##funcid##_tbl_entry })
5477
5478int
5479bit_table(struct drm_device *dev, u8 id, struct bit_entry *bit)
5480{
5481 struct drm_nouveau_private *dev_priv = dev->dev_private;
5482 struct nvbios *bios = &dev_priv->vbios;
5483 u8 entries, *entry;
5484
5485 entries = bios->data[bios->offset + 10];
5486 entry = &bios->data[bios->offset + 12];
5487 while (entries--) {
5488 if (entry[0] == id) {
5489 bit->id = entry[0];
5490 bit->version = entry[1];
5491 bit->length = ROM16(entry[2]);
5492 bit->offset = ROM16(entry[4]);
5493 bit->data = ROMPTR(bios, entry[4]);
5494 return 0;
5495 }
5496
5497 entry += bios->data[bios->offset + 9];
5498 }
5499
5500 return -ENOENT;
5501}
5502
5503static int
5504parse_bit_table(struct nvbios *bios, const uint16_t bitoffset,
5505 struct bit_table *table)
5506{
5507 struct drm_device *dev = bios->dev;
5508 struct bit_entry bitentry;
5509
5510 if (bit_table(dev, table->id, &bitentry) == 0)
5511 return table->parse_fn(dev, bios, &bitentry);
5512
5513 NV_INFO(dev, "BIT table '%c' not found\n", table->id);
5514 return -ENOSYS;
5515}
5516
5517static int
5518parse_bit_structure(struct nvbios *bios, const uint16_t bitoffset)
5519{
5520 int ret;
5521
5522
5523
5524
5525
5526
5527
5528 ret = parse_bit_table(bios, bitoffset, &BIT_TABLE('i', i));
5529 if (ret)
5530 return ret;
5531 if (bios->major_version >= 0x60)
5532 parse_bit_table(bios, bitoffset, &BIT_TABLE('A', A));
5533 ret = parse_bit_table(bios, bitoffset, &BIT_TABLE('C', C));
5534 if (ret)
5535 return ret;
5536 parse_bit_table(bios, bitoffset, &BIT_TABLE('D', display));
5537 ret = parse_bit_table(bios, bitoffset, &BIT_TABLE('I', init));
5538 if (ret)
5539 return ret;
5540 parse_bit_table(bios, bitoffset, &BIT_TABLE('M', M));
5541 parse_bit_table(bios, bitoffset, &BIT_TABLE('L', lvds));
5542 parse_bit_table(bios, bitoffset, &BIT_TABLE('T', tmds));
5543 parse_bit_table(bios, bitoffset, &BIT_TABLE('U', U));
5544 parse_bit_table(bios, bitoffset, &BIT_TABLE('d', displayport));
5545
5546 return 0;
5547}
5548
5549static int parse_bmp_structure(struct drm_device *dev, struct nvbios *bios, unsigned int offset)
5550{
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594 uint8_t *bmp = &bios->data[offset], bmp_version_major, bmp_version_minor;
5595 uint16_t bmplength;
5596 uint16_t legacy_scripts_offset, legacy_i2c_offset;
5597
5598
5599 bios->dcb.i2c[0].write = NV_CIO_CRE_DDC_WR__INDEX;
5600 bios->dcb.i2c[0].read = NV_CIO_CRE_DDC_STATUS__INDEX;
5601 bios->dcb.i2c[1].write = NV_CIO_CRE_DDC0_WR__INDEX;
5602 bios->dcb.i2c[1].read = NV_CIO_CRE_DDC0_STATUS__INDEX;
5603 bios->digital_min_front_porch = 0x4b;
5604 bios->fmaxvco = 256000;
5605 bios->fminvco = 128000;
5606 bios->fp.duallink_transition_clk = 90000;
5607
5608 bmp_version_major = bmp[5];
5609 bmp_version_minor = bmp[6];
5610
5611 NV_TRACE(dev, "BMP version %d.%d\n",
5612 bmp_version_major, bmp_version_minor);
5613
5614
5615
5616
5617
5618 if (bmp_version_major < 5)
5619 *(uint16_t *)&bios->data[0x36] = 0;
5620
5621
5622
5623
5624
5625
5626 if ((bmp_version_major < 5 && bmp_version_minor != 1) || bmp_version_major > 5) {
5627 NV_ERROR(dev, "You have an unsupported BMP version. "
5628 "Please send in your bios\n");
5629 return -ENOSYS;
5630 }
5631
5632 if (bmp_version_major == 0)
5633
5634 return 0;
5635 else if (bmp_version_major == 1)
5636 bmplength = 44;
5637 else if (bmp_version_major == 2)
5638 bmplength = 48;
5639 else if (bmp_version_major == 3)
5640 bmplength = 54;
5641
5642 else if (bmp_version_major == 4 || bmp_version_minor < 0x1)
5643
5644 bmplength = 62;
5645
5646 else if (bmp_version_minor < 0x6)
5647 bmplength = 67;
5648 else if (bmp_version_minor < 0x10)
5649 bmplength = 75;
5650 else if (bmp_version_minor == 0x10)
5651 bmplength = 89;
5652 else if (bmp_version_minor < 0x14)
5653 bmplength = 118;
5654 else if (bmp_version_minor < 0x24)
5655
5656
5657
5658
5659
5660 bmplength = 123;
5661 else if (bmp_version_minor < 0x27)
5662
5663
5664
5665
5666 bmplength = 144;
5667 else
5668
5669
5670
5671
5672 bmplength = 158;
5673
5674
5675 if (nv_cksum(bmp, 8)) {
5676 NV_ERROR(dev, "Bad BMP checksum\n");
5677 return -EINVAL;
5678 }
5679
5680
5681
5682
5683
5684
5685
5686 bios->feature_byte = bmp[9];
5687
5688 parse_bios_version(dev, bios, offset + 10);
5689
5690 if (bmp_version_major < 5 || bmp_version_minor < 0x10)
5691 bios->old_style_init = true;
5692 legacy_scripts_offset = 18;
5693 if (bmp_version_major < 2)
5694 legacy_scripts_offset -= 4;
5695 bios->init_script_tbls_ptr = ROM16(bmp[legacy_scripts_offset]);
5696 bios->extra_init_script_tbl_ptr = ROM16(bmp[legacy_scripts_offset + 2]);
5697
5698 if (bmp_version_major > 2) {
5699 bios->legacy.mem_init_tbl_ptr = ROM16(bmp[24]);
5700 bios->legacy.sdr_seq_tbl_ptr = ROM16(bmp[26]);
5701 bios->legacy.ddr_seq_tbl_ptr = ROM16(bmp[28]);
5702 }
5703
5704 legacy_i2c_offset = 0x48;
5705 if (bmplength > 61)
5706 legacy_i2c_offset = offset + 54;
5707 bios->legacy.i2c_indices.crt = bios->data[legacy_i2c_offset];
5708 bios->legacy.i2c_indices.tv = bios->data[legacy_i2c_offset + 1];
5709 bios->legacy.i2c_indices.panel = bios->data[legacy_i2c_offset + 2];
5710 if (bios->data[legacy_i2c_offset + 4])
5711 bios->dcb.i2c[0].write = bios->data[legacy_i2c_offset + 4];
5712 if (bios->data[legacy_i2c_offset + 5])
5713 bios->dcb.i2c[0].read = bios->data[legacy_i2c_offset + 5];
5714 if (bios->data[legacy_i2c_offset + 6])
5715 bios->dcb.i2c[1].write = bios->data[legacy_i2c_offset + 6];
5716 if (bios->data[legacy_i2c_offset + 7])
5717 bios->dcb.i2c[1].read = bios->data[legacy_i2c_offset + 7];
5718
5719 if (bmplength > 74) {
5720 bios->fmaxvco = ROM32(bmp[67]);
5721 bios->fminvco = ROM32(bmp[71]);
5722 }
5723 if (bmplength > 88)
5724 parse_script_table_pointers(bios, offset + 75);
5725 if (bmplength > 94) {
5726 bios->tmds.output0_script_ptr = ROM16(bmp[89]);
5727 bios->tmds.output1_script_ptr = ROM16(bmp[91]);
5728
5729
5730
5731
5732
5733 bios->legacy.lvds_single_a_script_ptr = ROM16(bmp[95]);
5734 }
5735 if (bmplength > 108) {
5736 bios->fp.fptablepointer = ROM16(bmp[105]);
5737 bios->fp.fpxlatetableptr = ROM16(bmp[107]);
5738 bios->fp.xlatwidth = 1;
5739 }
5740 if (bmplength > 120) {
5741 bios->fp.lvdsmanufacturerpointer = ROM16(bmp[117]);
5742 bios->fp.fpxlatemanufacturertableptr = ROM16(bmp[119]);
5743 }
5744 if (bmplength > 143)
5745 bios->pll_limit_tbl_ptr = ROM16(bmp[142]);
5746
5747 if (bmplength > 157)
5748 bios->fp.duallink_transition_clk = ROM16(bmp[156]) * 10;
5749
5750 return 0;
5751}
5752
5753static uint16_t findstr(uint8_t *data, int n, const uint8_t *str, int len)
5754{
5755 int i, j;
5756
5757 for (i = 0; i <= (n - len); i++) {
5758 for (j = 0; j < len; j++)
5759 if (data[i + j] != str[j])
5760 break;
5761 if (j == len)
5762 return i;
5763 }
5764
5765 return 0;
5766}
5767
5768static struct dcb_gpio_entry *
5769new_gpio_entry(struct nvbios *bios)
5770{
5771 struct drm_device *dev = bios->dev;
5772 struct dcb_gpio_table *gpio = &bios->dcb.gpio;
5773
5774 if (gpio->entries >= DCB_MAX_NUM_GPIO_ENTRIES) {
5775 NV_ERROR(dev, "exceeded maximum number of gpio entries!!\n");
5776 return NULL;
5777 }
5778
5779 return &gpio->entry[gpio->entries++];
5780}
5781
5782struct dcb_gpio_entry *
5783nouveau_bios_gpio_entry(struct drm_device *dev, enum dcb_gpio_tag tag)
5784{
5785 struct drm_nouveau_private *dev_priv = dev->dev_private;
5786 struct nvbios *bios = &dev_priv->vbios;
5787 int i;
5788
5789 for (i = 0; i < bios->dcb.gpio.entries; i++) {
5790 if (bios->dcb.gpio.entry[i].tag != tag)
5791 continue;
5792
5793 return &bios->dcb.gpio.entry[i];
5794 }
5795
5796 return NULL;
5797}
5798
5799static void
5800parse_dcb_gpio_table(struct nvbios *bios)
5801{
5802 struct drm_device *dev = bios->dev;
5803 struct dcb_gpio_entry *e;
5804 u8 headerlen, entries, recordlen;
5805 u8 *dcb, *gpio = NULL, *entry;
5806 int i;
5807
5808 dcb = ROMPTR(bios, bios->data[0x36]);
5809 if (dcb[0] >= 0x30) {
5810 gpio = ROMPTR(bios, dcb[10]);
5811 if (!gpio)
5812 goto no_table;
5813
5814 headerlen = gpio[1];
5815 entries = gpio[2];
5816 recordlen = gpio[3];
5817 } else
5818 if (dcb[0] >= 0x22 && dcb[-1] >= 0x13) {
5819 gpio = ROMPTR(bios, dcb[-15]);
5820 if (!gpio)
5821 goto no_table;
5822
5823 headerlen = 3;
5824 entries = gpio[2];
5825 recordlen = gpio[1];
5826 } else
5827 if (dcb[0] >= 0x22) {
5828
5829 uint8_t *tvdac_gpio = &dcb[-5];
5830
5831 if (tvdac_gpio[0] & 1) {
5832 e = new_gpio_entry(bios);
5833 e->tag = DCB_GPIO_TVDAC0;
5834 e->line = tvdac_gpio[1] >> 4;
5835 e->invert = tvdac_gpio[0] & 2;
5836 }
5837
5838 goto no_table;
5839 } else {
5840 NV_DEBUG(dev, "no/unknown gpio table on DCB 0x%02x\n", dcb[0]);
5841 goto no_table;
5842 }
5843
5844 entry = gpio + headerlen;
5845 for (i = 0; i < entries; i++, entry += recordlen) {
5846 e = new_gpio_entry(bios);
5847 if (!e)
5848 break;
5849
5850 if (gpio[0] < 0x40) {
5851 e->entry = ROM16(entry[0]);
5852 e->tag = (e->entry & 0x07e0) >> 5;
5853 if (e->tag == 0x3f) {
5854 bios->dcb.gpio.entries--;
5855 continue;
5856 }
5857
5858 e->line = (e->entry & 0x001f);
5859 e->invert = ((e->entry & 0xf800) >> 11) != 4;
5860 } else {
5861 e->entry = ROM32(entry[0]);
5862 e->tag = (e->entry & 0x0000ff00) >> 8;
5863 if (e->tag == 0xff) {
5864 bios->dcb.gpio.entries--;
5865 continue;
5866 }
5867
5868 e->line = (e->entry & 0x0000001f) >> 0;
5869 e->state_default = (e->entry & 0x01000000) >> 24;
5870 e->state[0] = (e->entry & 0x18000000) >> 27;
5871 e->state[1] = (e->entry & 0x60000000) >> 29;
5872 }
5873 }
5874
5875no_table:
5876
5877 if (nv_match_device(dev, 0x0189, 0x10de, 0x0010)) {
5878 e = new_gpio_entry(bios);
5879 if (e) {
5880 e->tag = DCB_GPIO_TVDAC0;
5881 e->line = 4;
5882 }
5883 }
5884}
5885
5886struct dcb_connector_table_entry *
5887nouveau_bios_connector_entry(struct drm_device *dev, int index)
5888{
5889 struct drm_nouveau_private *dev_priv = dev->dev_private;
5890 struct nvbios *bios = &dev_priv->vbios;
5891 struct dcb_connector_table_entry *cte;
5892
5893 if (index >= bios->dcb.connector.entries)
5894 return NULL;
5895
5896 cte = &bios->dcb.connector.entry[index];
5897 if (cte->type == 0xff)
5898 return NULL;
5899
5900 return cte;
5901}
5902
5903static enum dcb_connector_type
5904divine_connector_type(struct nvbios *bios, int index)
5905{
5906 struct dcb_table *dcb = &bios->dcb;
5907 unsigned encoders = 0, type = DCB_CONNECTOR_NONE;
5908 int i;
5909
5910 for (i = 0; i < dcb->entries; i++) {
5911 if (dcb->entry[i].connector == index)
5912 encoders |= (1 << dcb->entry[i].type);
5913 }
5914
5915 if (encoders & (1 << OUTPUT_DP)) {
5916 if (encoders & (1 << OUTPUT_TMDS))
5917 type = DCB_CONNECTOR_DP;
5918 else
5919 type = DCB_CONNECTOR_eDP;
5920 } else
5921 if (encoders & (1 << OUTPUT_TMDS)) {
5922 if (encoders & (1 << OUTPUT_ANALOG))
5923 type = DCB_CONNECTOR_DVI_I;
5924 else
5925 type = DCB_CONNECTOR_DVI_D;
5926 } else
5927 if (encoders & (1 << OUTPUT_ANALOG)) {
5928 type = DCB_CONNECTOR_VGA;
5929 } else
5930 if (encoders & (1 << OUTPUT_LVDS)) {
5931 type = DCB_CONNECTOR_LVDS;
5932 } else
5933 if (encoders & (1 << OUTPUT_TV)) {
5934 type = DCB_CONNECTOR_TV_0;
5935 }
5936
5937 return type;
5938}
5939
5940static void
5941apply_dcb_connector_quirks(struct nvbios *bios, int idx)
5942{
5943 struct dcb_connector_table_entry *cte = &bios->dcb.connector.entry[idx];
5944 struct drm_device *dev = bios->dev;
5945
5946
5947 if (nv_match_device(dev, 0x0421, 0x1458, 0x344c)) {
5948 if (cte->type == DCB_CONNECTOR_HDMI_1)
5949 cte->type = DCB_CONNECTOR_DVI_I;
5950 }
5951}
5952
5953static void
5954parse_dcb_connector_table(struct nvbios *bios)
5955{
5956 struct drm_device *dev = bios->dev;
5957 struct dcb_connector_table *ct = &bios->dcb.connector;
5958 struct dcb_connector_table_entry *cte;
5959 uint8_t *conntab = &bios->data[bios->dcb.connector_table_ptr];
5960 uint8_t *entry;
5961 int i;
5962
5963 if (!bios->dcb.connector_table_ptr) {
5964 NV_DEBUG_KMS(dev, "No DCB connector table present\n");
5965 return;
5966 }
5967
5968 NV_INFO(dev, "DCB connector table: VHER 0x%02x %d %d %d\n",
5969 conntab[0], conntab[1], conntab[2], conntab[3]);
5970 if ((conntab[0] != 0x30 && conntab[0] != 0x40) ||
5971 (conntab[3] != 2 && conntab[3] != 4)) {
5972 NV_ERROR(dev, " Unknown! Please report.\n");
5973 return;
5974 }
5975
5976 ct->entries = conntab[2];
5977
5978 entry = conntab + conntab[1];
5979 cte = &ct->entry[0];
5980 for (i = 0; i < conntab[2]; i++, entry += conntab[3], cte++) {
5981 cte->index = i;
5982 if (conntab[3] == 2)
5983 cte->entry = ROM16(entry[0]);
5984 else
5985 cte->entry = ROM32(entry[0]);
5986
5987 cte->type = (cte->entry & 0x000000ff) >> 0;
5988 cte->index2 = (cte->entry & 0x00000f00) >> 8;
5989 switch (cte->entry & 0x00033000) {
5990 case 0x00001000:
5991 cte->gpio_tag = 0x07;
5992 break;
5993 case 0x00002000:
5994 cte->gpio_tag = 0x08;
5995 break;
5996 case 0x00010000:
5997 cte->gpio_tag = 0x51;
5998 break;
5999 case 0x00020000:
6000 cte->gpio_tag = 0x52;
6001 break;
6002 default:
6003 cte->gpio_tag = 0xff;
6004 break;
6005 }
6006
6007 if (cte->type == 0xff)
6008 continue;
6009
6010 apply_dcb_connector_quirks(bios, i);
6011
6012 NV_INFO(dev, " %d: 0x%08x: type 0x%02x idx %d tag 0x%02x\n",
6013 i, cte->entry, cte->type, cte->index, cte->gpio_tag);
6014
6015
6016
6017
6018 switch (cte->type) {
6019 case DCB_CONNECTOR_VGA:
6020 case DCB_CONNECTOR_TV_0:
6021 case DCB_CONNECTOR_TV_1:
6022 case DCB_CONNECTOR_TV_3:
6023 case DCB_CONNECTOR_DVI_I:
6024 case DCB_CONNECTOR_DVI_D:
6025 case DCB_CONNECTOR_LVDS:
6026 case DCB_CONNECTOR_DP:
6027 case DCB_CONNECTOR_eDP:
6028 case DCB_CONNECTOR_HDMI_0:
6029 case DCB_CONNECTOR_HDMI_1:
6030 break;
6031 default:
6032 cte->type = divine_connector_type(bios, cte->index);
6033 NV_WARN(dev, "unknown type, using 0x%02x\n", cte->type);
6034 break;
6035 }
6036
6037 if (nouveau_override_conntype) {
6038 int type = divine_connector_type(bios, cte->index);
6039 if (type != cte->type)
6040 NV_WARN(dev, " -> type 0x%02x\n", cte->type);
6041 }
6042
6043 }
6044}
6045
6046static struct dcb_entry *new_dcb_entry(struct dcb_table *dcb)
6047{
6048 struct dcb_entry *entry = &dcb->entry[dcb->entries];
6049
6050 memset(entry, 0, sizeof(struct dcb_entry));
6051 entry->index = dcb->entries++;
6052
6053 return entry;
6054}
6055
6056static void fabricate_dcb_output(struct dcb_table *dcb, int type, int i2c,
6057 int heads, int or)
6058{
6059 struct dcb_entry *entry = new_dcb_entry(dcb);
6060
6061 entry->type = type;
6062 entry->i2c_index = i2c;
6063 entry->heads = heads;
6064 if (type != OUTPUT_ANALOG)
6065 entry->location = !DCB_LOC_ON_CHIP;
6066 entry->or = or;
6067}
6068
6069static bool
6070parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb,
6071 uint32_t conn, uint32_t conf, struct dcb_entry *entry)
6072{
6073 entry->type = conn & 0xf;
6074 entry->i2c_index = (conn >> 4) & 0xf;
6075 entry->heads = (conn >> 8) & 0xf;
6076 if (dcb->version >= 0x40)
6077 entry->connector = (conn >> 12) & 0xf;
6078 entry->bus = (conn >> 16) & 0xf;
6079 entry->location = (conn >> 20) & 0x3;
6080 entry->or = (conn >> 24) & 0xf;
6081
6082 switch (entry->type) {
6083 case OUTPUT_ANALOG:
6084
6085
6086
6087
6088 entry->crtconf.maxfreq = (dcb->version < 0x30) ?
6089 (conf & 0xffff) * 10 :
6090 (conf & 0xff) * 10000;
6091 break;
6092 case OUTPUT_LVDS:
6093 {
6094 uint32_t mask;
6095 if (conf & 0x1)
6096 entry->lvdsconf.use_straps_for_mode = true;
6097 if (dcb->version < 0x22) {
6098 mask = ~0xd;
6099
6100
6101
6102
6103
6104 entry->lvdsconf.use_straps_for_mode = true;
6105
6106
6107
6108
6109 if (conf & 0x4 || conf & 0x8)
6110 entry->lvdsconf.use_power_scripts = true;
6111 } else {
6112 mask = ~0x7;
6113 if (conf & 0x2)
6114 entry->lvdsconf.use_acpi_for_edid = true;
6115 if (conf & 0x4)
6116 entry->lvdsconf.use_power_scripts = true;
6117 entry->lvdsconf.sor.link = (conf & 0x00000030) >> 4;
6118 }
6119 if (conf & mask) {
6120
6121
6122
6123
6124 if (dcb->version >= 0x40)
6125 break;
6126
6127 NV_ERROR(dev, "Unknown LVDS configuration bits, "
6128 "please report\n");
6129 }
6130 break;
6131 }
6132 case OUTPUT_TV:
6133 {
6134 if (dcb->version >= 0x30)
6135 entry->tvconf.has_component_output = conf & (0x8 << 4);
6136 else
6137 entry->tvconf.has_component_output = false;
6138
6139 break;
6140 }
6141 case OUTPUT_DP:
6142 entry->dpconf.sor.link = (conf & 0x00000030) >> 4;
6143 entry->dpconf.link_bw = (conf & 0x00e00000) >> 21;
6144 switch ((conf & 0x0f000000) >> 24) {
6145 case 0xf:
6146 entry->dpconf.link_nr = 4;
6147 break;
6148 case 0x3:
6149 entry->dpconf.link_nr = 2;
6150 break;
6151 default:
6152 entry->dpconf.link_nr = 1;
6153 break;
6154 }
6155 break;
6156 case OUTPUT_TMDS:
6157 if (dcb->version >= 0x40)
6158 entry->tmdsconf.sor.link = (conf & 0x00000030) >> 4;
6159 else if (dcb->version >= 0x30)
6160 entry->tmdsconf.slave_addr = (conf & 0x00000700) >> 8;
6161 else if (dcb->version >= 0x22)
6162 entry->tmdsconf.slave_addr = (conf & 0x00000070) >> 4;
6163
6164 break;
6165 case OUTPUT_EOL:
6166
6167 dcb->entries--;
6168 return false;
6169 default:
6170 break;
6171 }
6172
6173 if (dcb->version < 0x40) {
6174
6175
6176
6177 entry->duallink_possible =
6178 ((1 << (ffs(entry->or) - 1)) * 3 == entry->or);
6179 } else {
6180 entry->duallink_possible = (entry->sorconf.link == 3);
6181 }
6182
6183
6184 if (conf & 0x100000)
6185 entry->i2c_upper_default = true;
6186
6187 return true;
6188}
6189
6190static bool
6191parse_dcb15_entry(struct drm_device *dev, struct dcb_table *dcb,
6192 uint32_t conn, uint32_t conf, struct dcb_entry *entry)
6193{
6194 switch (conn & 0x0000000f) {
6195 case 0:
6196 entry->type = OUTPUT_ANALOG;
6197 break;
6198 case 1:
6199 entry->type = OUTPUT_TV;
6200 break;
6201 case 2:
6202 case 4:
6203 if (conn & 0x10)
6204 entry->type = OUTPUT_LVDS;
6205 else
6206 entry->type = OUTPUT_TMDS;
6207 break;
6208 case 3:
6209 entry->type = OUTPUT_LVDS;
6210 break;
6211 default:
6212 NV_ERROR(dev, "Unknown DCB type %d\n", conn & 0x0000000f);
6213 return false;
6214 }
6215
6216 entry->i2c_index = (conn & 0x0003c000) >> 14;
6217 entry->heads = ((conn & 0x001c0000) >> 18) + 1;
6218 entry->or = entry->heads;
6219 entry->location = (conn & 0x01e00000) >> 21;
6220 entry->bus = (conn & 0x0e000000) >> 25;
6221 entry->duallink_possible = false;
6222
6223 switch (entry->type) {
6224 case OUTPUT_ANALOG:
6225 entry->crtconf.maxfreq = (conf & 0xffff) * 10;
6226 break;
6227 case OUTPUT_TV:
6228 entry->tvconf.has_component_output = false;
6229 break;
6230 case OUTPUT_LVDS:
6231 if ((conn & 0x00003f00) >> 8 != 0x10)
6232 entry->lvdsconf.use_straps_for_mode = true;
6233 entry->lvdsconf.use_power_scripts = true;
6234 break;
6235 default:
6236 break;
6237 }
6238
6239 return true;
6240}
6241
6242static bool parse_dcb_entry(struct drm_device *dev, struct dcb_table *dcb,
6243 uint32_t conn, uint32_t conf)
6244{
6245 struct dcb_entry *entry = new_dcb_entry(dcb);
6246 bool ret;
6247
6248 if (dcb->version >= 0x20)
6249 ret = parse_dcb20_entry(dev, dcb, conn, conf, entry);
6250 else
6251 ret = parse_dcb15_entry(dev, dcb, conn, conf, entry);
6252 if (!ret)
6253 return ret;
6254
6255 read_dcb_i2c_entry(dev, dcb->version, dcb->i2c_table,
6256 entry->i2c_index, &dcb->i2c[entry->i2c_index]);
6257
6258 return true;
6259}
6260
6261static
6262void merge_like_dcb_entries(struct drm_device *dev, struct dcb_table *dcb)
6263{
6264
6265
6266
6267
6268
6269
6270 int i, newentries = 0;
6271
6272 for (i = 0; i < dcb->entries; i++) {
6273 struct dcb_entry *ient = &dcb->entry[i];
6274 int j;
6275
6276 for (j = i + 1; j < dcb->entries; j++) {
6277 struct dcb_entry *jent = &dcb->entry[j];
6278
6279 if (jent->type == 100)
6280 continue;
6281
6282
6283 if (jent->i2c_index == ient->i2c_index &&
6284 jent->type == ient->type &&
6285 jent->location == ient->location &&
6286 jent->or == ient->or) {
6287 NV_TRACE(dev, "Merging DCB entries %d and %d\n",
6288 i, j);
6289 ient->heads |= jent->heads;
6290 jent->type = 100;
6291 }
6292 }
6293 }
6294
6295
6296 for (i = 0; i < dcb->entries; i++) {
6297 if (dcb->entry[i].type == 100)
6298 continue;
6299
6300 if (newentries != i) {
6301 dcb->entry[newentries] = dcb->entry[i];
6302 dcb->entry[newentries].index = newentries;
6303 }
6304 newentries++;
6305 }
6306
6307 dcb->entries = newentries;
6308}
6309
6310static bool
6311apply_dcb_encoder_quirks(struct drm_device *dev, int idx, u32 *conn, u32 *conf)
6312{
6313 struct drm_nouveau_private *dev_priv = dev->dev_private;
6314 struct dcb_table *dcb = &dev_priv->vbios.dcb;
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328 if (nv_match_device(dev, 0x040d, 0x1028, 0x019b)) {
6329 if (*conn == 0x02026312 && *conf == 0x00000020)
6330 return false;
6331 }
6332
6333
6334
6335
6336
6337
6338 if (nv_match_device(dev, 0x0201, 0x1462, 0x8851)) {
6339 if (*conn == 0xf2005014 && *conf == 0xffffffff) {
6340 fabricate_dcb_output(dcb, OUTPUT_TMDS, 1, 1, 1);
6341 return false;
6342 }
6343 }
6344
6345 return true;
6346}
6347
6348static void
6349fabricate_dcb_encoder_table(struct drm_device *dev, struct nvbios *bios)
6350{
6351 struct dcb_table *dcb = &bios->dcb;
6352 int all_heads = (nv_two_heads(dev) ? 3 : 1);
6353
6354#ifdef __powerpc__
6355
6356 if (of_machine_is_compatible("PowerMac4,5")) {
6357 fabricate_dcb_output(dcb, OUTPUT_TMDS, 0, all_heads, 1);
6358 fabricate_dcb_output(dcb, OUTPUT_ANALOG, 1, all_heads, 2);
6359 return;
6360 }
6361#endif
6362
6363
6364 fabricate_dcb_output(dcb, OUTPUT_ANALOG, LEGACY_I2C_CRT, 1, 1);
6365
6366 if (nv04_tv_identify(dev, bios->legacy.i2c_indices.tv) >= 0)
6367 fabricate_dcb_output(dcb, OUTPUT_TV, LEGACY_I2C_TV,
6368 all_heads, 0);
6369
6370 else if (bios->tmds.output0_script_ptr ||
6371 bios->tmds.output1_script_ptr)
6372 fabricate_dcb_output(dcb, OUTPUT_TMDS, LEGACY_I2C_PANEL,
6373 all_heads, 1);
6374}
6375
6376static int
6377parse_dcb_table(struct drm_device *dev, struct nvbios *bios)
6378{
6379 struct drm_nouveau_private *dev_priv = dev->dev_private;
6380 struct dcb_table *dcb = &bios->dcb;
6381 uint16_t dcbptr = 0, i2ctabptr = 0;
6382 uint8_t *dcbtable;
6383 uint8_t headerlen = 0x4, entries = DCB_MAX_NUM_ENTRIES;
6384 bool configblock = true;
6385 int recordlength = 8, confofs = 4;
6386 int i;
6387
6388
6389 if (dev_priv->card_type > NV_04) {
6390 dcbptr = ROM16(bios->data[0x36]);
6391 if (dcbptr == 0x0000)
6392 NV_WARN(dev, "No output data (DCB) found in BIOS\n");
6393 }
6394
6395
6396 if (dcbptr == 0x0) {
6397 fabricate_dcb_encoder_table(dev, bios);
6398 return 0;
6399 }
6400
6401 dcbtable = &bios->data[dcbptr];
6402
6403
6404 dcb->version = dcbtable[0];
6405 NV_TRACE(dev, "Found Display Configuration Block version %d.%d\n",
6406 dcb->version >> 4, dcb->version & 0xf);
6407
6408 if (dcb->version >= 0x20) {
6409 uint32_t sig;
6410
6411 if (dcb->version >= 0x30) {
6412 headerlen = dcbtable[1];
6413 entries = dcbtable[2];
6414 recordlength = dcbtable[3];
6415 i2ctabptr = ROM16(dcbtable[4]);
6416 sig = ROM32(dcbtable[6]);
6417 dcb->gpio_table_ptr = ROM16(dcbtable[10]);
6418 dcb->connector_table_ptr = ROM16(dcbtable[20]);
6419 } else {
6420 i2ctabptr = ROM16(dcbtable[2]);
6421 sig = ROM32(dcbtable[4]);
6422 headerlen = 8;
6423 }
6424
6425 if (sig != 0x4edcbdcb) {
6426 NV_ERROR(dev, "Bad Display Configuration Block "
6427 "signature (%08X)\n", sig);
6428 return -EINVAL;
6429 }
6430 } else if (dcb->version >= 0x15) {
6431 char sig[8] = { 0 };
6432
6433 strncpy(sig, (char *)&dcbtable[-7], 7);
6434 i2ctabptr = ROM16(dcbtable[2]);
6435 recordlength = 10;
6436 confofs = 6;
6437
6438 if (strcmp(sig, "DEV_REC")) {
6439 NV_ERROR(dev, "Bad Display Configuration Block "
6440 "signature (%s)\n", sig);
6441 return -EINVAL;
6442 }
6443 } else {
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455 NV_TRACEWARN(dev, "No useful information in BIOS output table; "
6456 "adding all possible outputs\n");
6457 fabricate_dcb_encoder_table(dev, bios);
6458 return 0;
6459 }
6460
6461 if (!i2ctabptr)
6462 NV_WARN(dev, "No pointer to DCB I2C port table\n");
6463 else {
6464 dcb->i2c_table = &bios->data[i2ctabptr];
6465 if (dcb->version >= 0x30)
6466 dcb->i2c_default_indices = dcb->i2c_table[4];
6467
6468
6469
6470
6471
6472 if (dcb->version >= 0x22) {
6473 int idx = (dcb->version >= 0x40 ?
6474 dcb->i2c_default_indices & 0xf :
6475 2);
6476
6477 read_dcb_i2c_entry(dev, dcb->version, dcb->i2c_table,
6478 idx, &dcb->i2c[idx]);
6479 }
6480 }
6481
6482 if (entries > DCB_MAX_NUM_ENTRIES)
6483 entries = DCB_MAX_NUM_ENTRIES;
6484
6485 for (i = 0; i < entries; i++) {
6486 uint32_t connection, config = 0;
6487
6488 connection = ROM32(dcbtable[headerlen + recordlength * i]);
6489 if (configblock)
6490 config = ROM32(dcbtable[headerlen + confofs + recordlength * i]);
6491
6492
6493 if (connection == 0x00000000)
6494 break;
6495
6496
6497 if (connection == 0xffffffff)
6498 break;
6499
6500 if ((connection & 0x0000000f) == 0x0000000f)
6501 continue;
6502
6503 if (!apply_dcb_encoder_quirks(dev, i, &connection, &config))
6504 continue;
6505
6506 NV_TRACEWARN(dev, "Raw DCB entry %d: %08x %08x\n",
6507 dcb->entries, connection, config);
6508
6509 if (!parse_dcb_entry(dev, dcb, connection, config))
6510 break;
6511 }
6512
6513
6514
6515
6516
6517 if (dcb->version < 0x21)
6518 merge_like_dcb_entries(dev, dcb);
6519
6520 if (!dcb->entries)
6521 return -ENXIO;
6522
6523 parse_dcb_gpio_table(bios);
6524 parse_dcb_connector_table(bios);
6525 return 0;
6526}
6527
6528static void
6529fixup_legacy_connector(struct nvbios *bios)
6530{
6531 struct dcb_table *dcb = &bios->dcb;
6532 int i, i2c, i2c_conn[DCB_MAX_NUM_I2C_ENTRIES] = { };
6533
6534
6535
6536
6537
6538
6539
6540 if (dcb->version >= 0x40)
6541 return;
6542
6543 dcb->connector.entries = 0;
6544
6545
6546
6547
6548
6549
6550
6551 for (i = 0; i < dcb->entries; i++) {
6552
6553
6554
6555
6556
6557 if (dcb->entry[i].type == OUTPUT_TV &&
6558 dcb->entry[i].location == DCB_LOC_ON_CHIP)
6559 dcb->entry[i].i2c_index = 0xf;
6560 i2c = dcb->entry[i].i2c_index;
6561
6562 if (i2c_conn[i2c]) {
6563 dcb->entry[i].connector = i2c_conn[i2c] - 1;
6564 continue;
6565 }
6566
6567 dcb->entry[i].connector = dcb->connector.entries++;
6568 if (i2c != 0xf)
6569 i2c_conn[i2c] = dcb->connector.entries;
6570 }
6571
6572
6573 for (i = 0; i < dcb->connector.entries; i++) {
6574 dcb->connector.entry[i].index = i;
6575 dcb->connector.entry[i].type = divine_connector_type(bios, i);
6576 dcb->connector.entry[i].gpio_tag = 0xff;
6577 }
6578}
6579
6580static void
6581fixup_legacy_i2c(struct nvbios *bios)
6582{
6583 struct dcb_table *dcb = &bios->dcb;
6584 int i;
6585
6586 for (i = 0; i < dcb->entries; i++) {
6587 if (dcb->entry[i].i2c_index == LEGACY_I2C_CRT)
6588 dcb->entry[i].i2c_index = bios->legacy.i2c_indices.crt;
6589 if (dcb->entry[i].i2c_index == LEGACY_I2C_PANEL)
6590 dcb->entry[i].i2c_index = bios->legacy.i2c_indices.panel;
6591 if (dcb->entry[i].i2c_index == LEGACY_I2C_TV)
6592 dcb->entry[i].i2c_index = bios->legacy.i2c_indices.tv;
6593 }
6594}
6595
6596static int load_nv17_hwsq_ucode_entry(struct drm_device *dev, struct nvbios *bios, uint16_t hwsq_offset, int entry)
6597{
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607 uint8_t bytes_to_write;
6608 uint16_t hwsq_entry_offset;
6609 int i;
6610
6611 if (bios->data[hwsq_offset] <= entry) {
6612 NV_ERROR(dev, "Too few entries in HW sequencer table for "
6613 "requested entry\n");
6614 return -ENOENT;
6615 }
6616
6617 bytes_to_write = bios->data[hwsq_offset + 1];
6618
6619 if (bytes_to_write != 36) {
6620 NV_ERROR(dev, "Unknown HW sequencer entry size\n");
6621 return -EINVAL;
6622 }
6623
6624 NV_TRACE(dev, "Loading NV17 power sequencing microcode\n");
6625
6626 hwsq_entry_offset = hwsq_offset + 2 + entry * bytes_to_write;
6627
6628
6629 bios_wr32(bios, 0x00001304, ROM32(bios->data[hwsq_entry_offset]));
6630 bytes_to_write -= 4;
6631
6632
6633 for (i = 0; i < bytes_to_write; i += 4)
6634 bios_wr32(bios, 0x00001400 + i, ROM32(bios->data[hwsq_entry_offset + i + 4]));
6635
6636
6637 bios_wr32(bios, NV_PBUS_DEBUG_4, bios_rd32(bios, NV_PBUS_DEBUG_4) | 0x18);
6638
6639 return 0;
6640}
6641
6642static int load_nv17_hw_sequencer_ucode(struct drm_device *dev,
6643 struct nvbios *bios)
6644{
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654 const uint8_t hwsq_signature[] = { 'H', 'W', 'S', 'Q' };
6655 const int sz = sizeof(hwsq_signature);
6656 int hwsq_offset;
6657
6658 hwsq_offset = findstr(bios->data, bios->length, hwsq_signature, sz);
6659 if (!hwsq_offset)
6660 return 0;
6661
6662
6663 return load_nv17_hwsq_ucode_entry(dev, bios, hwsq_offset + sz, 0);
6664}
6665
6666uint8_t *nouveau_bios_embedded_edid(struct drm_device *dev)
6667{
6668 struct drm_nouveau_private *dev_priv = dev->dev_private;
6669 struct nvbios *bios = &dev_priv->vbios;
6670 const uint8_t edid_sig[] = {
6671 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 };
6672 uint16_t offset = 0;
6673 uint16_t newoffset;
6674 int searchlen = NV_PROM_SIZE;
6675
6676 if (bios->fp.edid)
6677 return bios->fp.edid;
6678
6679 while (searchlen) {
6680 newoffset = findstr(&bios->data[offset], searchlen,
6681 edid_sig, 8);
6682 if (!newoffset)
6683 return NULL;
6684 offset += newoffset;
6685 if (!nv_cksum(&bios->data[offset], EDID1_LEN))
6686 break;
6687
6688 searchlen -= offset;
6689 offset++;
6690 }
6691
6692 NV_TRACE(dev, "Found EDID in BIOS\n");
6693
6694 return bios->fp.edid = &bios->data[offset];
6695}
6696
6697void
6698nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
6699 struct dcb_entry *dcbent)
6700{
6701 struct drm_nouveau_private *dev_priv = dev->dev_private;
6702 struct nvbios *bios = &dev_priv->vbios;
6703 struct init_exec iexec = { true, false };
6704
6705 mutex_lock(&bios->lock);
6706 bios->display.output = dcbent;
6707 parse_init_table(bios, table, &iexec);
6708 bios->display.output = NULL;
6709 mutex_unlock(&bios->lock);
6710}
6711
6712static bool NVInitVBIOS(struct drm_device *dev)
6713{
6714 struct drm_nouveau_private *dev_priv = dev->dev_private;
6715 struct nvbios *bios = &dev_priv->vbios;
6716
6717 memset(bios, 0, sizeof(struct nvbios));
6718 mutex_init(&bios->lock);
6719 bios->dev = dev;
6720
6721 if (!NVShadowVBIOS(dev, bios->data))
6722 return false;
6723
6724 bios->length = NV_PROM_SIZE;
6725 return true;
6726}
6727
6728static int nouveau_parse_vbios_struct(struct drm_device *dev)
6729{
6730 struct drm_nouveau_private *dev_priv = dev->dev_private;
6731 struct nvbios *bios = &dev_priv->vbios;
6732 const uint8_t bit_signature[] = { 0xff, 0xb8, 'B', 'I', 'T' };
6733 const uint8_t bmp_signature[] = { 0xff, 0x7f, 'N', 'V', 0x0 };
6734 int offset;
6735
6736 offset = findstr(bios->data, bios->length,
6737 bit_signature, sizeof(bit_signature));
6738 if (offset) {
6739 NV_TRACE(dev, "BIT BIOS found\n");
6740 bios->type = NVBIOS_BIT;
6741 bios->offset = offset;
6742 return parse_bit_structure(bios, offset + 6);
6743 }
6744
6745 offset = findstr(bios->data, bios->length,
6746 bmp_signature, sizeof(bmp_signature));
6747 if (offset) {
6748 NV_TRACE(dev, "BMP BIOS found\n");
6749 bios->type = NVBIOS_BMP;
6750 bios->offset = offset;
6751 return parse_bmp_structure(dev, bios, offset);
6752 }
6753
6754 NV_ERROR(dev, "No known BIOS signature found\n");
6755 return -ENODEV;
6756}
6757
6758int
6759nouveau_run_vbios_init(struct drm_device *dev)
6760{
6761 struct drm_nouveau_private *dev_priv = dev->dev_private;
6762 struct nvbios *bios = &dev_priv->vbios;
6763 int i, ret = 0;
6764
6765
6766 bios->state.crtchead = 0;
6767
6768 if (bios->major_version < 5)
6769 load_nv17_hw_sequencer_ucode(dev, bios);
6770
6771 if (bios->execute) {
6772 bios->fp.last_script_invoc = 0;
6773 bios->fp.lvds_init_run = false;
6774 }
6775
6776 parse_init_tables(bios);
6777
6778
6779
6780
6781
6782
6783 if (bios->some_script_ptr) {
6784 struct init_exec iexec = {true, false};
6785
6786 NV_INFO(dev, "Parsing VBIOS init table at offset 0x%04X\n",
6787 bios->some_script_ptr);
6788 parse_init_table(bios, bios->some_script_ptr, &iexec);
6789 }
6790
6791 if (dev_priv->card_type >= NV_50) {
6792 for (i = 0; i < bios->dcb.entries; i++) {
6793 nouveau_bios_run_display_table(dev,
6794 &bios->dcb.entry[i],
6795 0, 0);
6796 }
6797 }
6798
6799 return ret;
6800}
6801
6802static void
6803nouveau_bios_i2c_devices_takedown(struct drm_device *dev)
6804{
6805 struct drm_nouveau_private *dev_priv = dev->dev_private;
6806 struct nvbios *bios = &dev_priv->vbios;
6807 struct dcb_i2c_entry *entry;
6808 int i;
6809
6810 entry = &bios->dcb.i2c[0];
6811 for (i = 0; i < DCB_MAX_NUM_I2C_ENTRIES; i++, entry++)
6812 nouveau_i2c_fini(dev, entry);
6813}
6814
6815static bool
6816nouveau_bios_posted(struct drm_device *dev)
6817{
6818 struct drm_nouveau_private *dev_priv = dev->dev_private;
6819 unsigned htotal;
6820
6821 if (dev_priv->card_type >= NV_50) {
6822 if (NVReadVgaCrtc(dev, 0, 0x00) == 0 &&
6823 NVReadVgaCrtc(dev, 0, 0x1a) == 0)
6824 return false;
6825 return true;
6826 }
6827
6828 htotal = NVReadVgaCrtc(dev, 0, 0x06);
6829 htotal |= (NVReadVgaCrtc(dev, 0, 0x07) & 0x01) << 8;
6830 htotal |= (NVReadVgaCrtc(dev, 0, 0x07) & 0x20) << 4;
6831 htotal |= (NVReadVgaCrtc(dev, 0, 0x25) & 0x01) << 10;
6832 htotal |= (NVReadVgaCrtc(dev, 0, 0x41) & 0x01) << 11;
6833
6834 return (htotal != 0);
6835}
6836
6837int
6838nouveau_bios_init(struct drm_device *dev)
6839{
6840 struct drm_nouveau_private *dev_priv = dev->dev_private;
6841 struct nvbios *bios = &dev_priv->vbios;
6842 int ret;
6843
6844 if (!NVInitVBIOS(dev))
6845 return -ENODEV;
6846
6847 ret = nouveau_parse_vbios_struct(dev);
6848 if (ret)
6849 return ret;
6850
6851 ret = parse_dcb_table(dev, bios);
6852 if (ret)
6853 return ret;
6854
6855 fixup_legacy_i2c(bios);
6856 fixup_legacy_connector(bios);
6857
6858 if (!bios->major_version)
6859 return 0;
6860
6861
6862 bios->execute = false;
6863
6864
6865 if (!nouveau_bios_posted(dev)) {
6866 NV_INFO(dev, "Adaptor not initialised, "
6867 "running VBIOS init tables.\n");
6868 bios->execute = true;
6869 }
6870 if (nouveau_force_post)
6871 bios->execute = true;
6872
6873 ret = nouveau_run_vbios_init(dev);
6874 if (ret)
6875 return ret;
6876
6877
6878 if (bios->major_version < 5)
6879 bios->is_mobile = NVReadVgaCrtc(dev, 0, NV_CIO_CRE_4B) & 0x40;
6880
6881
6882 if (bios->is_mobile || bios->major_version >= 5)
6883 ret = parse_fp_mode_table(dev, bios);
6884
6885
6886 bios->execute = true;
6887
6888 return 0;
6889}
6890
6891void
6892nouveau_bios_takedown(struct drm_device *dev)
6893{
6894 nouveau_bios_i2c_devices_takedown(dev);
6895}
6896