aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2011-07-06 00:39:23 -0400
committerBen Skeggs <bskeggs@redhat.com>2011-09-20 02:06:47 -0400
commita36f04c0447a3d59b9b4faf4ddb3dbe1ea808956 (patch)
treeb3121ace7485c607fcd67138392f57baec159672 /drivers/gpu
parentc0cc92a1151447588db6d96e94fc2210b8fc32df (diff)
drm/nvd0/disp: extend the init voodoo to cover crtcs
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/nouveau/nvd0_display.c46
1 files changed, 27 insertions, 19 deletions
diff --git a/drivers/gpu/drm/nouveau/nvd0_display.c b/drivers/gpu/drm/nouveau/nvd0_display.c
index a0cc287aa6fc..d282f2aaacd9 100644
--- a/drivers/gpu/drm/nouveau/nvd0_display.c
+++ b/drivers/gpu/drm/nouveau/nvd0_display.c
@@ -718,9 +718,8 @@ nvd0_sor_create(struct drm_connector *connector, struct dcb_entry *dcbe)
718static void 718static void
719nvd0_display_unk1_handler(struct drm_device *dev) 719nvd0_display_unk1_handler(struct drm_device *dev)
720{ 720{
721 u32 unk0 = nv_rd32(dev, 0x6101d0); 721 NV_INFO(dev, "PDISP: 1 0x%08x 0x%08x 0x%08x\n", nv_rd32(dev, 0x6101d0),
722 722 nv_rd32(dev, 0x6101d4), nv_rd32(dev, 0x6109d4));
723 NV_INFO(dev, "PDISP: unk1 0x%08x\n", unk0);
724 723
725 nv_wr32(dev, 0x6101d4, 0x00000000); 724 nv_wr32(dev, 0x6101d4, 0x00000000);
726 nv_wr32(dev, 0x6109d4, 0x00000000); 725 nv_wr32(dev, 0x6109d4, 0x00000000);
@@ -730,9 +729,8 @@ nvd0_display_unk1_handler(struct drm_device *dev)
730static void 729static void
731nvd0_display_unk2_handler(struct drm_device *dev) 730nvd0_display_unk2_handler(struct drm_device *dev)
732{ 731{
733 u32 unk0 = nv_rd32(dev, 0x6101d0); 732 NV_INFO(dev, "PDISP: 2 0x%08x 0x%08x 0x%08x\n", nv_rd32(dev, 0x6101d0),
734 733 nv_rd32(dev, 0x6101d4), nv_rd32(dev, 0x6109d4));
735 NV_INFO(dev, "PDISP: unk2 0x%08x\n", unk0);
736 734
737 nv_wr32(dev, 0x6101d4, 0x00000000); 735 nv_wr32(dev, 0x6101d4, 0x00000000);
738 nv_wr32(dev, 0x6109d4, 0x00000000); 736 nv_wr32(dev, 0x6109d4, 0x00000000);
@@ -742,9 +740,8 @@ nvd0_display_unk2_handler(struct drm_device *dev)
742static void 740static void
743nvd0_display_unk4_handler(struct drm_device *dev) 741nvd0_display_unk4_handler(struct drm_device *dev)
744{ 742{
745 u32 unk0 = nv_rd32(dev, 0x6101d0); 743 NV_INFO(dev, "PDISP: 4 0x%08x 0x%08x 0x%08x\n", nv_rd32(dev, 0x6101d0),
746 744 nv_rd32(dev, 0x6101d4), nv_rd32(dev, 0x6109d4));
747 NV_INFO(dev, "PDISP: unk4 0x%08x\n", unk0);
748 745
749 nv_wr32(dev, 0x6101d4, 0x00000000); 746 nv_wr32(dev, 0x6101d4, 0x00000000);
750 nv_wr32(dev, 0x6109d4, 0x00000000); 747 nv_wr32(dev, 0x6109d4, 0x00000000);
@@ -849,28 +846,39 @@ nvd0_display_init(struct drm_device *dev)
849 u32 *push; 846 u32 *push;
850 int i; 847 int i;
851 848
852 /*XXX: wrong, and wtf is it for? */ 849 if (nv_rd32(dev, 0x6100ac) & 0x00000100) {
850 nv_wr32(dev, 0x6100ac, 0x00000100);
851 nv_mask(dev, 0x6194e8, 0x00000001, 0x00000000);
852 if (!nv_wait(dev, 0x6194e8, 0x00000002, 0x00000000)) {
853 NV_ERROR(dev, "PDISP: 0x6194e8 0x%08x\n",
854 nv_rd32(dev, 0x6194e8));
855 return -EBUSY;
856 }
857 }
858
859 /* nfi what these are exactly, i do know that SOR_MODE_CTRL won't
860 * work at all unless you do the SOR part below.
861 */
853 for (i = 0; i < 3; i++) { 862 for (i = 0; i < 3; i++) {
854 u32 dac = nv_rd32(dev, 0x61a000 + (i * 0x800)); 863 u32 dac = nv_rd32(dev, 0x61a000 + (i * 0x800));
855 nv_wr32(dev, 0x6101c0 + (i * 0x800), dac); 864 nv_wr32(dev, 0x6101c0 + (i * 0x800), dac);
856 } 865 }
857 866
858 /*XXX: wrong, and wtf is it for? SOR_MODE_CTRL is an error without.. */
859 for (i = 0; i < 4; i++) { 867 for (i = 0; i < 4; i++) {
860 u32 sor = nv_rd32(dev, 0x61c000 + (i * 0x800)); 868 u32 sor = nv_rd32(dev, 0x61c000 + (i * 0x800));
861 nv_wr32(dev, 0x6301c4 + (i * 0x800), sor); 869 nv_wr32(dev, 0x6301c4 + (i * 0x800), sor);
862 } 870 }
863 871
864 if (nv_rd32(dev, 0x6100ac) & 0x00000100) { 872 for (i = 0; i < 2; i++) {
865 nv_wr32(dev, 0x6100ac, 0x00000100); 873 u32 crtc0 = nv_rd32(dev, 0x616104 + (i * 0x800));
866 nv_mask(dev, 0x6194e8, 0x00000001, 0x00000000); 874 u32 crtc1 = nv_rd32(dev, 0x616108 + (i * 0x800));
867 if (!nv_wait(dev, 0x6194e8, 0x00000002, 0x00000000)) { 875 u32 crtc2 = nv_rd32(dev, 0x61610c + (i * 0x800));
868 NV_ERROR(dev, "PDISP: 0x6194e8 0x%08x\n", 876 nv_wr32(dev, 0x6101b4 + (i * 0x800), crtc0);
869 nv_rd32(dev, 0x6194e8)); 877 nv_wr32(dev, 0x6101b8 + (i * 0x800), crtc1);
870 return -EBUSY; 878 nv_wr32(dev, 0x6101bc + (i * 0x800), crtc2);
871 }
872 } 879 }
873 880
881 /* point at our hash table / objects, enable interrupts */
874 nv_wr32(dev, 0x610010, (disp->mem->vinst >> 8) | 9); 882 nv_wr32(dev, 0x610010, (disp->mem->vinst >> 8) | 9);
875 nv_mask(dev, 0x6100b0, 0x00000307, 0x00000307); 883 nv_mask(dev, 0x6100b0, 0x00000307, 0x00000307);
876 884