Commit b98e3f5c authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nv50/disp: synchronise display right after init



This has the effect of ensuring the encoders which were active before we
loaded get disconnected properly before we start reprogramming them.

Also removing a bit of cargo-cult from the initial evo pushbuf.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e6e039d1
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -627,7 +627,7 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
		}
	}

	ret = RING_SPACE(evo, 17);
	ret = RING_SPACE(evo, 19);
	if (ret)
		return ret;

@@ -653,6 +653,9 @@ nv50_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,

	BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, UNK082C), 1);
	OUT_RING  (evo, 0);
	/* required to make display sync channel not hate life */
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, UNK900), 1);
	OUT_RING  (evo, 0x00000311);

	/* This is the actual resolution of the mode. */
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(nv_crtc->index, REAL_RES), 1);
+6 −23
Original line number Diff line number Diff line
@@ -210,31 +210,14 @@ nv50_display_init(struct drm_device *dev)

	nv_wr32(dev, NV50_PDISPLAY_OBJECTS, (evo->ramin->vinst >> 8) | 9);

	ret = RING_SPACE(evo, 15);
	ret = RING_SPACE(evo, 3);
	if (ret)
		return ret;
	BEGIN_RING(evo, 0, NV50_EVO_UNK84, 2);
	OUT_RING  (evo, NV50_EVO_UNK84_NOTIFY_DISABLED);
	OUT_RING  (evo, NvEvoSync);
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, FB_DMA), 1);
	OUT_RING(evo, NV50_EVO_CRTC_FB_DMA_HANDLE_NONE);
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK0800), 1);
	OUT_RING(evo, 0);
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, DISPLAY_START), 1);
	OUT_RING(evo, 0);
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK082C), 1);
	OUT_RING(evo, 0);
	/* required to make display sync channels not hate life */
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(0, UNK900), 1);
	OUT_RING  (evo, 0x00000311);
	BEGIN_RING(evo, 0, NV50_EVO_CRTC(1, UNK900), 1);
	OUT_RING  (evo, 0x00000311);
	FIRE_RING(evo);
	if (!nv_wait(dev, 0x640004, 0xffffffff, evo->dma.put << 2))
		NV_ERROR(dev, "evo pushbuf stalled\n");


	return 0;
	return nv50_display_sync(dev);
}

static int nv50_display_disable(struct drm_device *dev)
@@ -754,7 +737,7 @@ nv50_display_unk20_handler(struct drm_device *dev)
	if (crtc >= 0) {
		pclk  = nv_rd32(dev, NV50_PDISPLAY_CRTC_P(crtc, CLOCK));
		pclk &= 0x003fffff;

		if (pclk)
			nv50_crtc_set_clock(dev, crtc, pclk);

		tmp = nv_rd32(dev, NV50_PDISPLAY_CRTC_CLK_CTRL2(crtc));