41 static void nv50_display_bh(
unsigned long);
66 for (i = 0; i < 2; i++)
69 for (i = 0; i < 4; i++)
73 for (i = 0; i < 3; i++)
97 ret = RING_SPACE(evo, 6);
99 BEGIN_NV04(evo, 0, 0x0084, 1);
101 BEGIN_NV04(evo, 0, 0x0080, 1);
103 BEGIN_NV04(evo, 0, 0x0084, 1);
106 nv_wo32(disp->
ramin, 0x2000, 0x00000000);
127 nv_wr32(device, 0x00610184, nv_rd32(device, 0x00614004));
134 for (i = 0; i < 2; i++) {
135 val = nv_rd32(device, 0x00616100 + (i * 0x800));
136 nv_wr32(device, 0x00610190 + (i * 0x10), val);
137 val = nv_rd32(device, 0x00616104 + (i * 0x800));
138 nv_wr32(device, 0x00610194 + (i * 0x10), val);
139 val = nv_rd32(device, 0x00616108 + (i * 0x800));
140 nv_wr32(device, 0x00610198 + (i * 0x10), val);
141 val = nv_rd32(device, 0x0061610c + (i * 0x800));
142 nv_wr32(device, 0x0061019c + (i * 0x10), val);
146 for (i = 0; i < 3; i++) {
147 val = nv_rd32(device, 0x0061a000 + (i * 0x800));
148 nv_wr32(device, 0x006101d0 + (i * 0x04), val);
152 for (i = 0; i < nv50_sor_nr(dev); i++) {
153 val = nv_rd32(device, 0x0061c000 + (i * 0x800));
154 nv_wr32(device, 0x006101e0 + (i * 0x04), val);
158 for (i = 0; i < 3; i++) {
159 val = nv_rd32(device, 0x0061e000 + (i * 0x800));
160 nv_wr32(device, 0x006101f0 + (i * 0x04), val);
163 for (i = 0; i < 3; i++) {
174 nv_wr32(device, 0x006194e8, nv_rd32(device, 0x006194e8) & ~1);
175 if (!
nv_wait(device, 0x006194e8, 2, 0)) {
176 NV_ERROR(drm,
"timeout: (0x6194e8 & 2) != 0\n");
177 NV_ERROR(drm,
"0x6194e8 = 0x%08x\n",
178 nv_rd32(device, 0x6194e8));
183 for (i = 0; i < 2; i++) {
187 NV_ERROR(drm,
"timeout: CURSOR_CTRL2_STATUS == 0\n");
188 NV_ERROR(drm,
"CURSOR_CTRL2 = 0x%08x\n",
199 "CURSOR_CTRL2_STATUS_ACTIVE(%d)\n", i);
200 NV_ERROR(drm,
"CURSOR_CTRL2(%d) = 0x%08x\n", i,
222 ret = RING_SPACE(evo, 3);
250 ret = RING_SPACE(evo, 2);
264 if (!crtc->
base.enabled)
269 NV_ERROR(drm,
"timeout: (0x610024 & 0x%08x) == "
270 "0x%08x\n", mask, mask);
271 NV_ERROR(drm,
"0x610024 = 0x%08x\n",
276 for (i = 0; i < 2; i++) {
280 NV_ERROR(drm,
"timeout: CURSOR_CTRL2_STATUS == 0\n");
281 NV_ERROR(drm,
"CURSOR_CTRL2 = 0x%08x\n",
288 for (i = 0; i < 3; i++) {
291 NV_ERROR(drm,
"timeout: SOR_DPMS_STATE_WAIT(%d) == 0\n", i);
292 NV_ERROR(drm,
"SOR_DPMS_STATE(%d) = 0x%08x\n", i,
322 for (i = 0; i < 2; i++) {
329 for (i = 0 ; i < dcb->
entries; i++) {
333 NV_WARN(drm,
"Off-chip encoder %d/%d unsupported\n",
339 if (IS_ERR(connector))
342 switch (entry->
type) {
352 NV_WARN(drm,
"DCB encoder %d unknown\n", entry->
type);
358 &dev->mode_config.connector_list,
head) {
360 NV_WARN(drm,
"%s has no encoders, removing\n",
362 connector->
funcs->destroy(connector);
401 ret = RING_SPACE(evo, 8);
407 BEGIN_NV04(evo, 0, 0x0084, 1);
409 BEGIN_NV04(evo, 0, 0x0094, 1);
411 BEGIN_NV04(evo, 0, 0x00c0, 1);
413 BEGIN_NV04(evo, 0, 0x0080, 1);
430 ret = RING_SPACE(evo, chan ? 25 : 27);
436 ret = RING_SPACE(chan, 10);
442 if (nv_device(drm->
device)->chipset < 0xc0) {
443 BEGIN_NV04(chan, 0, 0x0060, 2);
446 BEGIN_NV04(chan, 0, 0x006c, 1);
448 BEGIN_NV04(chan, 0, 0x0064, 2);
451 BEGIN_NV04(chan, 0, 0x0060, 1);
452 if (nv_device(drm->
device)->chipset < 0x84)
458 offset += dispc->
sem.offset;
459 BEGIN_NVC0(chan, 0, 0x0010, 4);
464 BEGIN_NVC0(chan, 0, 0x0010, 4);
473 0xf00d0000 | dispc->
sem.value);
477 BEGIN_NV04(evo, 0, 0x0100, 1);
480 BEGIN_NV04(evo, 0, 0x0084, 1);
483 BEGIN_NV04(evo, 0, 0x0084, 1);
488 BEGIN_NV04(evo, 0, 0x00e0, 1);
491 BEGIN_NV04(evo, 0, 0x0088, 4);
496 BEGIN_NV04(evo, 0, 0x00a0, 2);
499 BEGIN_NV04(evo, 0, 0x00c0, 1);
501 BEGIN_NV04(evo, 0, 0x0110, 2);
504 BEGIN_NV04(evo, 0, 0x0800, 5);
510 BEGIN_NV04(evo, 0, 0x0080, 1);
514 dispc->
sem.offset ^= 0x10;
532 if (nv_encoder->
dcb != dcb)
542 script = (mc >> 8) & 0xf;
544 if (bios->
fp.dual_link)
546 if (bios->
fp.if_is_24bit)
550 if (nv_connector && nv_connector->
edid &&
553 if (((
u8 *)nv_connector->
edid)[121] == 2)
556 if (pxclk >= bios->
fp.duallink_transition_clk) {
561 if (script & 0x0100) {
562 if (bios->
fp.strapless_is_24bit & 2)
565 if (bios->
fp.strapless_is_24bit & 1)
569 if (nv_connector && nv_connector->
edid &&
570 (nv_connector->
edid->revision >= 4) &&
571 (nv_connector->
edid->input & 0x70) >= 0x20)
576 script = (mc >> 8) & 0xf;
581 script = (mc >> 8) & 0xf;
587 NV_ERROR(drm,
"modeset on unsupported output type!\n");
595 nv50_display_unk10_handler(
struct drm_device *dev)
600 u32 unk30 = nv_rd32(device, 0x610030),
mc;
603 NV_DEBUG(drm,
"0x610030: 0x%08x\n", unk30);
606 nv_wr32(device, 0x619494, nv_rd32(device, 0x619494) & ~8);
611 crtc =
ffs((unk30 & 0x00000060) >> 5) - 1;
616 crtc =
ffs((unk30 & 0x00000180) >> 7) - 1;
623 NV_DEBUG(drm,
"DAC-%d mc: 0x%08x\n", i, mc);
624 if (!(mc & (1 << crtc)))
627 switch ((mc & 0x00000f00) >> 8) {
631 NV_ERROR(drm,
"invalid mc, DAC-%d: 0x%08x\n", i, mc);
639 if (nv_device(drm->
device)->chipset < 0x90 ||
640 nv_device(drm->
device)->chipset == 0x92 ||
641 nv_device(drm->
device)->chipset == 0xa0)
646 NV_DEBUG(drm,
"SOR-%d mc: 0x%08x\n", i, mc);
647 if (!(mc & (1 << crtc)))
650 switch ((mc & 0x00000f00) >> 8) {
658 NV_ERROR(drm,
"invalid mc, SOR-%d: 0x%08x\n", i, mc);
670 for (i = 0; i < drm->
vbios.dcb.entries; i++) {
673 if (dcb->
type ==
type && (dcb->
or & (1 << or))) {
680 NV_ERROR(drm,
"no dcb for %d %d 0x%08x\n", or,
type, mc);
683 nv_wr32(device, 0x610030, 0x80000000);
687 nv50_display_unk20_handler(
struct drm_device *dev)
696 NV_DEBUG(drm,
"0x610030: 0x%08x\n", unk30);
704 crtc =
ffs((unk30 & 0x00000600) >> 9) - 1;
717 crtc =
ffs((unk30 & 0x00000180) >> 7) - 1;
725 NV_DEBUG(drm,
"DAC-%d mc: 0x%08x\n", i, mc);
726 if (!(mc & (1 << crtc)))
729 switch ((mc & 0x00000f00) >> 8) {
733 NV_ERROR(drm,
"invalid mc, DAC-%d: 0x%08x\n", i, mc);
741 if (nv_device(drm->
device)->chipset < 0x90 ||
742 nv_device(drm->
device)->chipset == 0x92 ||
743 nv_device(drm->
device)->chipset == 0xa0)
748 NV_DEBUG(drm,
"SOR-%d mc: 0x%08x\n", i, mc);
749 if (!(mc & (1 << crtc)))
752 switch ((mc & 0x00000f00) >> 8) {
760 NV_ERROR(drm,
"invalid mc, SOR-%d: 0x%08x\n", i, mc);
771 for (i = 0; i < drm->
vbios.dcb.entries; i++) {
772 dcb = &drm->
vbios.dcb.entry[
i];
773 if (dcb->
type ==
type && (dcb->
or & (1 << or)))
777 if (i == drm->
vbios.dcb.entries) {
778 NV_ERROR(drm,
"no dcb for %d %d 0x%08x\n", or,
type, mc);
782 script = nv50_display_script_select(dev, dcb, mc, pclk);
787 if ((mc & 0x000f0000) == 0x00020000)
804 disp->
irq.pclk = pclk;
805 disp->
irq.script = script;
809 nv_wr32(device, 0x610030, 0x80000000);
824 int or =
ffs(dcb->
or) - 1, link = !(dcb->
dpconf.sor.link & 1);
835 nv_encoder->
dcb->or & (1 << or)) {
845 nv50_display_unk40_handler(
struct drm_device *dev)
851 u16 script = disp->
irq.script;
852 u32 unk30 = nv_rd32(device, 0x610030), pclk = disp->
irq.pclk;
854 NV_DEBUG(drm,
"0x610030: 0x%08x\n", unk30);
860 nv50_display_unk40_dp_set_tmds(dev, dcb);
864 nv_wr32(device, 0x610030, 0x80000000);
865 nv_wr32(device, 0x619494, nv_rd32(device, 0x619494) | 8);
869 nv50_display_bh(
unsigned long data)
879 NV_DEBUG(drm,
"PDISPLAY_INTR_BH 0x%08x 0x%08x\n", intr0, intr1);
882 nv50_display_unk10_handler(dev);
885 nv50_display_unk20_handler(dev);
888 nv50_display_unk40_handler(dev);
897 nv50_display_error_handler(
struct drm_device *dev)
905 for (chid = 0; chid < 5; chid++) {
906 if (!(channels & (1 << chid)))
912 NV_ERROR(drm,
"EvoCh %d Mthd 0x%04x Data 0x%08x "
913 "(0x%04x 0x%02x)\n", chid,
914 addr & 0xffc, data, addr >> 16, (addr >> 12) & 0xf);
933 NV_DEBUG(drm,
"PDISPLAY_INTR 0x%08x 0x%08x\n", intr0, intr1);
935 if (!intr0 && !(intr1 & ~delayed))
938 if (intr0 & 0x001f0000) {
939 nv50_display_error_handler(dev);
940 intr0 &= ~0x001f0000;
944 intr1 &= ~NV50_PDISPLAY_INTR_1_VBLANK_CRTC;
948 clock = (intr1 & (NV50_PDISPLAY_INTR_1_CLK_UNK10 |
953 tasklet_schedule(&disp->
tasklet);
959 NV_ERROR(drm,
"unknown PDISPLAY_INTR_0: 0x%08x\n", intr0);
965 "unknown PDISPLAY_INTR_1: 0x%08x\n", intr1);