diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2011-07-06 00:39:23 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2011-09-20 02:06:47 -0400 |
commit | a36f04c0447a3d59b9b4faf4ddb3dbe1ea808956 (patch) | |
tree | b3121ace7485c607fcd67138392f57baec159672 /drivers/gpu | |
parent | c0cc92a1151447588db6d96e94fc2210b8fc32df (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.c | 46 |
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) | |||
718 | static void | 718 | static void |
719 | nvd0_display_unk1_handler(struct drm_device *dev) | 719 | nvd0_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) | |||
730 | static void | 729 | static void |
731 | nvd0_display_unk2_handler(struct drm_device *dev) | 730 | nvd0_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) | |||
742 | static void | 740 | static void |
743 | nvd0_display_unk4_handler(struct drm_device *dev) | 741 | nvd0_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 | ||