diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 806 |
1 files changed, 604 insertions, 202 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 7b337c361a12..7fe8ebdcdc0e 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -39,6 +39,62 @@ | |||
39 | 39 | ||
40 | static void evergreen_gpu_init(struct radeon_device *rdev); | 40 | static void evergreen_gpu_init(struct radeon_device *rdev); |
41 | void evergreen_fini(struct radeon_device *rdev); | 41 | void evergreen_fini(struct radeon_device *rdev); |
42 | static void evergreen_pcie_gen2_enable(struct radeon_device *rdev); | ||
43 | |||
44 | void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc) | ||
45 | { | ||
46 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; | ||
47 | u32 tmp; | ||
48 | |||
49 | /* make sure flip is at vb rather than hb */ | ||
50 | tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); | ||
51 | tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; | ||
52 | WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); | ||
53 | |||
54 | /* set pageflip to happen anywhere in vblank interval */ | ||
55 | WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); | ||
56 | |||
57 | /* enable the pflip int */ | ||
58 | radeon_irq_kms_pflip_irq_get(rdev, crtc); | ||
59 | } | ||
60 | |||
61 | void evergreen_post_page_flip(struct radeon_device *rdev, int crtc) | ||
62 | { | ||
63 | /* disable the pflip int */ | ||
64 | radeon_irq_kms_pflip_irq_put(rdev, crtc); | ||
65 | } | ||
66 | |||
67 | u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | ||
68 | { | ||
69 | struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; | ||
70 | u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset); | ||
71 | |||
72 | /* Lock the graphics update lock */ | ||
73 | tmp |= EVERGREEN_GRPH_UPDATE_LOCK; | ||
74 | WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); | ||
75 | |||
76 | /* update the scanout addresses */ | ||
77 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, | ||
78 | upper_32_bits(crtc_base)); | ||
79 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | ||
80 | (u32)crtc_base); | ||
81 | |||
82 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, | ||
83 | upper_32_bits(crtc_base)); | ||
84 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, | ||
85 | (u32)crtc_base); | ||
86 | |||
87 | /* Wait for update_pending to go high. */ | ||
88 | while (!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING)); | ||
89 | DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n"); | ||
90 | |||
91 | /* Unlock the lock, so double-buffering can take place inside vblank */ | ||
92 | tmp &= ~EVERGREEN_GRPH_UPDATE_LOCK; | ||
93 | WREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); | ||
94 | |||
95 | /* Return current update_pending status: */ | ||
96 | return RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING; | ||
97 | } | ||
42 | 98 | ||
43 | /* get temperature in millidegrees */ | 99 | /* get temperature in millidegrees */ |
44 | u32 evergreen_get_temp(struct radeon_device *rdev) | 100 | u32 evergreen_get_temp(struct radeon_device *rdev) |
@@ -57,6 +113,14 @@ u32 evergreen_get_temp(struct radeon_device *rdev) | |||
57 | return actual_temp * 1000; | 113 | return actual_temp * 1000; |
58 | } | 114 | } |
59 | 115 | ||
116 | u32 sumo_get_temp(struct radeon_device *rdev) | ||
117 | { | ||
118 | u32 temp = RREG32(CG_THERMAL_STATUS) & 0xff; | ||
119 | u32 actual_temp = (temp >> 1) & 0xff; | ||
120 | |||
121 | return actual_temp * 1000; | ||
122 | } | ||
123 | |||
60 | void evergreen_pm_misc(struct radeon_device *rdev) | 124 | void evergreen_pm_misc(struct radeon_device *rdev) |
61 | { | 125 | { |
62 | int req_ps_idx = rdev->pm.requested_power_state_index; | 126 | int req_ps_idx = rdev->pm.requested_power_state_index; |
@@ -337,16 +401,28 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev, | |||
337 | case 0: | 401 | case 0: |
338 | case 4: | 402 | case 4: |
339 | default: | 403 | default: |
340 | return 3840 * 2; | 404 | if (ASIC_IS_DCE5(rdev)) |
405 | return 4096 * 2; | ||
406 | else | ||
407 | return 3840 * 2; | ||
341 | case 1: | 408 | case 1: |
342 | case 5: | 409 | case 5: |
343 | return 5760 * 2; | 410 | if (ASIC_IS_DCE5(rdev)) |
411 | return 6144 * 2; | ||
412 | else | ||
413 | return 5760 * 2; | ||
344 | case 2: | 414 | case 2: |
345 | case 6: | 415 | case 6: |
346 | return 7680 * 2; | 416 | if (ASIC_IS_DCE5(rdev)) |
417 | return 8192 * 2; | ||
418 | else | ||
419 | return 7680 * 2; | ||
347 | case 3: | 420 | case 3: |
348 | case 7: | 421 | case 7: |
349 | return 1920 * 2; | 422 | if (ASIC_IS_DCE5(rdev)) |
423 | return 2048 * 2; | ||
424 | else | ||
425 | return 1920 * 2; | ||
350 | } | 426 | } |
351 | } | 427 | } |
352 | 428 | ||
@@ -890,31 +966,39 @@ static void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_sa | |||
890 | save->vga_hdp_control = RREG32(VGA_HDP_CONTROL); | 966 | save->vga_hdp_control = RREG32(VGA_HDP_CONTROL); |
891 | save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); | 967 | save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); |
892 | save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); | 968 | save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); |
893 | save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET); | 969 | if (!(rdev->flags & RADEON_IS_IGP)) { |
894 | save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); | 970 | save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET); |
895 | save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET); | 971 | save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); |
896 | save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); | 972 | save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET); |
973 | save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); | ||
974 | } | ||
897 | 975 | ||
898 | /* Stop all video */ | 976 | /* Stop all video */ |
899 | WREG32(VGA_RENDER_CONTROL, 0); | 977 | WREG32(VGA_RENDER_CONTROL, 0); |
900 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1); | 978 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1); |
901 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); | 979 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); |
902 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1); | 980 | if (!(rdev->flags & RADEON_IS_IGP)) { |
903 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); | 981 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1); |
904 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1); | 982 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); |
905 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1); | 983 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1); |
984 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1); | ||
985 | } | ||
906 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 986 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
907 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 987 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
908 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | 988 | if (!(rdev->flags & RADEON_IS_IGP)) { |
909 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | 989 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
910 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 990 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
911 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 991 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
992 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
993 | } | ||
912 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 994 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
913 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 995 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
914 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | 996 | if (!(rdev->flags & RADEON_IS_IGP)) { |
915 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | 997 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
916 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 998 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
917 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 999 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
1000 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
1001 | } | ||
918 | 1002 | ||
919 | WREG32(D1VGA_CONTROL, 0); | 1003 | WREG32(D1VGA_CONTROL, 0); |
920 | WREG32(D2VGA_CONTROL, 0); | 1004 | WREG32(D2VGA_CONTROL, 0); |
@@ -944,41 +1028,43 @@ static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_ | |||
944 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET, | 1028 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC1_REGISTER_OFFSET, |
945 | (u32)rdev->mc.vram_start); | 1029 | (u32)rdev->mc.vram_start); |
946 | 1030 | ||
947 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, | 1031 | if (!(rdev->flags & RADEON_IS_IGP)) { |
948 | upper_32_bits(rdev->mc.vram_start)); | 1032 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, |
949 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, | 1033 | upper_32_bits(rdev->mc.vram_start)); |
950 | upper_32_bits(rdev->mc.vram_start)); | 1034 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC2_REGISTER_OFFSET, |
951 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET, | 1035 | upper_32_bits(rdev->mc.vram_start)); |
952 | (u32)rdev->mc.vram_start); | 1036 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET, |
953 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET, | 1037 | (u32)rdev->mc.vram_start); |
954 | (u32)rdev->mc.vram_start); | 1038 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC2_REGISTER_OFFSET, |
955 | 1039 | (u32)rdev->mc.vram_start); | |
956 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET, | 1040 | |
957 | upper_32_bits(rdev->mc.vram_start)); | 1041 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET, |
958 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET, | 1042 | upper_32_bits(rdev->mc.vram_start)); |
959 | upper_32_bits(rdev->mc.vram_start)); | 1043 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC3_REGISTER_OFFSET, |
960 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET, | 1044 | upper_32_bits(rdev->mc.vram_start)); |
961 | (u32)rdev->mc.vram_start); | 1045 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET, |
962 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET, | 1046 | (u32)rdev->mc.vram_start); |
963 | (u32)rdev->mc.vram_start); | 1047 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC3_REGISTER_OFFSET, |
964 | 1048 | (u32)rdev->mc.vram_start); | |
965 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, | 1049 | |
966 | upper_32_bits(rdev->mc.vram_start)); | 1050 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, |
967 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, | 1051 | upper_32_bits(rdev->mc.vram_start)); |
968 | upper_32_bits(rdev->mc.vram_start)); | 1052 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC4_REGISTER_OFFSET, |
969 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET, | 1053 | upper_32_bits(rdev->mc.vram_start)); |
970 | (u32)rdev->mc.vram_start); | 1054 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET, |
971 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET, | 1055 | (u32)rdev->mc.vram_start); |
972 | (u32)rdev->mc.vram_start); | 1056 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC4_REGISTER_OFFSET, |
973 | 1057 | (u32)rdev->mc.vram_start); | |
974 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET, | 1058 | |
975 | upper_32_bits(rdev->mc.vram_start)); | 1059 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET, |
976 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET, | 1060 | upper_32_bits(rdev->mc.vram_start)); |
977 | upper_32_bits(rdev->mc.vram_start)); | 1061 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + EVERGREEN_CRTC5_REGISTER_OFFSET, |
978 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET, | 1062 | upper_32_bits(rdev->mc.vram_start)); |
979 | (u32)rdev->mc.vram_start); | 1063 | WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET, |
980 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET, | 1064 | (u32)rdev->mc.vram_start); |
981 | (u32)rdev->mc.vram_start); | 1065 | WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + EVERGREEN_CRTC5_REGISTER_OFFSET, |
1066 | (u32)rdev->mc.vram_start); | ||
1067 | } | ||
982 | 1068 | ||
983 | WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start)); | 1069 | WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH, upper_32_bits(rdev->mc.vram_start)); |
984 | WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start); | 1070 | WREG32(EVERGREEN_VGA_MEMORY_BASE_ADDRESS, (u32)rdev->mc.vram_start); |
@@ -994,22 +1080,28 @@ static void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_ | |||
994 | WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]); | 1080 | WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]); |
995 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1); | 1081 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1); |
996 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); | 1082 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1); |
997 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1); | 1083 | if (!(rdev->flags & RADEON_IS_IGP)) { |
998 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); | 1084 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1); |
999 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1); | 1085 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1); |
1000 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1); | 1086 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1); |
1087 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1); | ||
1088 | } | ||
1001 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]); | 1089 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]); |
1002 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]); | 1090 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]); |
1003 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]); | 1091 | if (!(rdev->flags & RADEON_IS_IGP)) { |
1004 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]); | 1092 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]); |
1005 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]); | 1093 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]); |
1006 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]); | 1094 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]); |
1095 | WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]); | ||
1096 | } | ||
1007 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 1097 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
1008 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 1098 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
1009 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | 1099 | if (!(rdev->flags & RADEON_IS_IGP)) { |
1010 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | 1100 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
1011 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 1101 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
1012 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 1102 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
1103 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
1104 | } | ||
1013 | WREG32(VGA_RENDER_CONTROL, save->vga_render_control); | 1105 | WREG32(VGA_RENDER_CONTROL, save->vga_render_control); |
1014 | } | 1106 | } |
1015 | 1107 | ||
@@ -1057,11 +1149,17 @@ static void evergreen_mc_program(struct radeon_device *rdev) | |||
1057 | rdev->mc.vram_end >> 12); | 1149 | rdev->mc.vram_end >> 12); |
1058 | } | 1150 | } |
1059 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 1151 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
1152 | if (rdev->flags & RADEON_IS_IGP) { | ||
1153 | tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF; | ||
1154 | tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24; | ||
1155 | tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20; | ||
1156 | WREG32(MC_FUS_VM_FB_OFFSET, tmp); | ||
1157 | } | ||
1060 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; | 1158 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
1061 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 1159 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
1062 | WREG32(MC_VM_FB_LOCATION, tmp); | 1160 | WREG32(MC_VM_FB_LOCATION, tmp); |
1063 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 1161 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
1064 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 1162 | WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30)); |
1065 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); | 1163 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
1066 | if (rdev->flags & RADEON_IS_AGP) { | 1164 | if (rdev->flags & RADEON_IS_AGP) { |
1067 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); | 1165 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
@@ -1285,11 +1383,15 @@ static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | |||
1285 | switch (rdev->family) { | 1383 | switch (rdev->family) { |
1286 | case CHIP_CEDAR: | 1384 | case CHIP_CEDAR: |
1287 | case CHIP_REDWOOD: | 1385 | case CHIP_REDWOOD: |
1386 | case CHIP_PALM: | ||
1387 | case CHIP_TURKS: | ||
1388 | case CHIP_CAICOS: | ||
1288 | force_no_swizzle = false; | 1389 | force_no_swizzle = false; |
1289 | break; | 1390 | break; |
1290 | case CHIP_CYPRESS: | 1391 | case CHIP_CYPRESS: |
1291 | case CHIP_HEMLOCK: | 1392 | case CHIP_HEMLOCK: |
1292 | case CHIP_JUNIPER: | 1393 | case CHIP_JUNIPER: |
1394 | case CHIP_BARTS: | ||
1293 | default: | 1395 | default: |
1294 | force_no_swizzle = true; | 1396 | force_no_swizzle = true; |
1295 | break; | 1397 | break; |
@@ -1384,6 +1486,46 @@ static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | |||
1384 | return backend_map; | 1486 | return backend_map; |
1385 | } | 1487 | } |
1386 | 1488 | ||
1489 | static void evergreen_program_channel_remap(struct radeon_device *rdev) | ||
1490 | { | ||
1491 | u32 tcp_chan_steer_lo, tcp_chan_steer_hi, mc_shared_chremap, tmp; | ||
1492 | |||
1493 | tmp = RREG32(MC_SHARED_CHMAP); | ||
1494 | switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { | ||
1495 | case 0: | ||
1496 | case 1: | ||
1497 | case 2: | ||
1498 | case 3: | ||
1499 | default: | ||
1500 | /* default mapping */ | ||
1501 | mc_shared_chremap = 0x00fac688; | ||
1502 | break; | ||
1503 | } | ||
1504 | |||
1505 | switch (rdev->family) { | ||
1506 | case CHIP_HEMLOCK: | ||
1507 | case CHIP_CYPRESS: | ||
1508 | case CHIP_BARTS: | ||
1509 | tcp_chan_steer_lo = 0x54763210; | ||
1510 | tcp_chan_steer_hi = 0x0000ba98; | ||
1511 | break; | ||
1512 | case CHIP_JUNIPER: | ||
1513 | case CHIP_REDWOOD: | ||
1514 | case CHIP_CEDAR: | ||
1515 | case CHIP_PALM: | ||
1516 | case CHIP_TURKS: | ||
1517 | case CHIP_CAICOS: | ||
1518 | default: | ||
1519 | tcp_chan_steer_lo = 0x76543210; | ||
1520 | tcp_chan_steer_hi = 0x0000ba98; | ||
1521 | break; | ||
1522 | } | ||
1523 | |||
1524 | WREG32(TCP_CHAN_STEER_LO, tcp_chan_steer_lo); | ||
1525 | WREG32(TCP_CHAN_STEER_HI, tcp_chan_steer_hi); | ||
1526 | WREG32(MC_SHARED_CHREMAP, mc_shared_chremap); | ||
1527 | } | ||
1528 | |||
1387 | static void evergreen_gpu_init(struct radeon_device *rdev) | 1529 | static void evergreen_gpu_init(struct radeon_device *rdev) |
1388 | { | 1530 | { |
1389 | u32 cc_rb_backend_disable = 0; | 1531 | u32 cc_rb_backend_disable = 0; |
@@ -1495,6 +1637,90 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1495 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1637 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1496 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1638 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1497 | break; | 1639 | break; |
1640 | case CHIP_PALM: | ||
1641 | rdev->config.evergreen.num_ses = 1; | ||
1642 | rdev->config.evergreen.max_pipes = 2; | ||
1643 | rdev->config.evergreen.max_tile_pipes = 2; | ||
1644 | rdev->config.evergreen.max_simds = 2; | ||
1645 | rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; | ||
1646 | rdev->config.evergreen.max_gprs = 256; | ||
1647 | rdev->config.evergreen.max_threads = 192; | ||
1648 | rdev->config.evergreen.max_gs_threads = 16; | ||
1649 | rdev->config.evergreen.max_stack_entries = 256; | ||
1650 | rdev->config.evergreen.sx_num_of_sets = 4; | ||
1651 | rdev->config.evergreen.sx_max_export_size = 128; | ||
1652 | rdev->config.evergreen.sx_max_export_pos_size = 32; | ||
1653 | rdev->config.evergreen.sx_max_export_smx_size = 96; | ||
1654 | rdev->config.evergreen.max_hw_contexts = 4; | ||
1655 | rdev->config.evergreen.sq_num_cf_insts = 1; | ||
1656 | |||
1657 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | ||
1658 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
1659 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
1660 | break; | ||
1661 | case CHIP_BARTS: | ||
1662 | rdev->config.evergreen.num_ses = 2; | ||
1663 | rdev->config.evergreen.max_pipes = 4; | ||
1664 | rdev->config.evergreen.max_tile_pipes = 8; | ||
1665 | rdev->config.evergreen.max_simds = 7; | ||
1666 | rdev->config.evergreen.max_backends = 4 * rdev->config.evergreen.num_ses; | ||
1667 | rdev->config.evergreen.max_gprs = 256; | ||
1668 | rdev->config.evergreen.max_threads = 248; | ||
1669 | rdev->config.evergreen.max_gs_threads = 32; | ||
1670 | rdev->config.evergreen.max_stack_entries = 512; | ||
1671 | rdev->config.evergreen.sx_num_of_sets = 4; | ||
1672 | rdev->config.evergreen.sx_max_export_size = 256; | ||
1673 | rdev->config.evergreen.sx_max_export_pos_size = 64; | ||
1674 | rdev->config.evergreen.sx_max_export_smx_size = 192; | ||
1675 | rdev->config.evergreen.max_hw_contexts = 8; | ||
1676 | rdev->config.evergreen.sq_num_cf_insts = 2; | ||
1677 | |||
1678 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | ||
1679 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
1680 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
1681 | break; | ||
1682 | case CHIP_TURKS: | ||
1683 | rdev->config.evergreen.num_ses = 1; | ||
1684 | rdev->config.evergreen.max_pipes = 4; | ||
1685 | rdev->config.evergreen.max_tile_pipes = 4; | ||
1686 | rdev->config.evergreen.max_simds = 6; | ||
1687 | rdev->config.evergreen.max_backends = 2 * rdev->config.evergreen.num_ses; | ||
1688 | rdev->config.evergreen.max_gprs = 256; | ||
1689 | rdev->config.evergreen.max_threads = 248; | ||
1690 | rdev->config.evergreen.max_gs_threads = 32; | ||
1691 | rdev->config.evergreen.max_stack_entries = 256; | ||
1692 | rdev->config.evergreen.sx_num_of_sets = 4; | ||
1693 | rdev->config.evergreen.sx_max_export_size = 256; | ||
1694 | rdev->config.evergreen.sx_max_export_pos_size = 64; | ||
1695 | rdev->config.evergreen.sx_max_export_smx_size = 192; | ||
1696 | rdev->config.evergreen.max_hw_contexts = 8; | ||
1697 | rdev->config.evergreen.sq_num_cf_insts = 2; | ||
1698 | |||
1699 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | ||
1700 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
1701 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
1702 | break; | ||
1703 | case CHIP_CAICOS: | ||
1704 | rdev->config.evergreen.num_ses = 1; | ||
1705 | rdev->config.evergreen.max_pipes = 4; | ||
1706 | rdev->config.evergreen.max_tile_pipes = 2; | ||
1707 | rdev->config.evergreen.max_simds = 2; | ||
1708 | rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; | ||
1709 | rdev->config.evergreen.max_gprs = 256; | ||
1710 | rdev->config.evergreen.max_threads = 192; | ||
1711 | rdev->config.evergreen.max_gs_threads = 16; | ||
1712 | rdev->config.evergreen.max_stack_entries = 256; | ||
1713 | rdev->config.evergreen.sx_num_of_sets = 4; | ||
1714 | rdev->config.evergreen.sx_max_export_size = 128; | ||
1715 | rdev->config.evergreen.sx_max_export_pos_size = 32; | ||
1716 | rdev->config.evergreen.sx_max_export_smx_size = 96; | ||
1717 | rdev->config.evergreen.max_hw_contexts = 4; | ||
1718 | rdev->config.evergreen.sq_num_cf_insts = 1; | ||
1719 | |||
1720 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | ||
1721 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
1722 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
1723 | break; | ||
1498 | } | 1724 | } |
1499 | 1725 | ||
1500 | /* Initialize HDP */ | 1726 | /* Initialize HDP */ |
@@ -1636,6 +1862,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1636 | switch (rdev->family) { | 1862 | switch (rdev->family) { |
1637 | case CHIP_CYPRESS: | 1863 | case CHIP_CYPRESS: |
1638 | case CHIP_HEMLOCK: | 1864 | case CHIP_HEMLOCK: |
1865 | case CHIP_BARTS: | ||
1639 | gb_backend_map = 0x66442200; | 1866 | gb_backend_map = 0x66442200; |
1640 | break; | 1867 | break; |
1641 | case CHIP_JUNIPER: | 1868 | case CHIP_JUNIPER: |
@@ -1687,6 +1914,8 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1687 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | 1914 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
1688 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); | 1915 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); |
1689 | 1916 | ||
1917 | evergreen_program_channel_remap(rdev); | ||
1918 | |||
1690 | num_shader_engines = ((RREG32(GB_ADDR_CONFIG) & NUM_SHADER_ENGINES(3)) >> 12) + 1; | 1919 | num_shader_engines = ((RREG32(GB_ADDR_CONFIG) & NUM_SHADER_ENGINES(3)) >> 12) + 1; |
1691 | grbm_gfx_index = INSTANCE_BROADCAST_WRITES; | 1920 | grbm_gfx_index = INSTANCE_BROADCAST_WRITES; |
1692 | 1921 | ||
@@ -1769,9 +1998,16 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1769 | GS_PRIO(2) | | 1998 | GS_PRIO(2) | |
1770 | ES_PRIO(3)); | 1999 | ES_PRIO(3)); |
1771 | 2000 | ||
1772 | if (rdev->family == CHIP_CEDAR) | 2001 | switch (rdev->family) { |
2002 | case CHIP_CEDAR: | ||
2003 | case CHIP_PALM: | ||
2004 | case CHIP_CAICOS: | ||
1773 | /* no vertex cache */ | 2005 | /* no vertex cache */ |
1774 | sq_config &= ~VC_ENABLE; | 2006 | sq_config &= ~VC_ENABLE; |
2007 | break; | ||
2008 | default: | ||
2009 | break; | ||
2010 | } | ||
1775 | 2011 | ||
1776 | sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT); | 2012 | sq_lds_resource_mgmt = RREG32(SQ_LDS_RESOURCE_MGMT); |
1777 | 2013 | ||
@@ -1783,10 +2019,15 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1783 | sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); | 2019 | sq_gpr_resource_mgmt_3 = NUM_HS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); |
1784 | sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); | 2020 | sq_gpr_resource_mgmt_3 |= NUM_LS_GPRS((rdev->config.evergreen.max_gprs - (4 * 2)) * 3 / 32); |
1785 | 2021 | ||
1786 | if (rdev->family == CHIP_CEDAR) | 2022 | switch (rdev->family) { |
2023 | case CHIP_CEDAR: | ||
2024 | case CHIP_PALM: | ||
1787 | ps_thread_count = 96; | 2025 | ps_thread_count = 96; |
1788 | else | 2026 | break; |
2027 | default: | ||
1789 | ps_thread_count = 128; | 2028 | ps_thread_count = 128; |
2029 | break; | ||
2030 | } | ||
1790 | 2031 | ||
1791 | sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); | 2032 | sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); |
1792 | sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); | 2033 | sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
@@ -1817,10 +2058,16 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1817 | WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | | 2058 | WREG32(PA_SC_FORCE_EOV_MAX_CNTS, (FORCE_EOV_MAX_CLK_CNT(4095) | |
1818 | FORCE_EOV_MAX_REZ_CNT(255))); | 2059 | FORCE_EOV_MAX_REZ_CNT(255))); |
1819 | 2060 | ||
1820 | if (rdev->family == CHIP_CEDAR) | 2061 | switch (rdev->family) { |
2062 | case CHIP_CEDAR: | ||
2063 | case CHIP_PALM: | ||
2064 | case CHIP_CAICOS: | ||
1821 | vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); | 2065 | vgt_cache_invalidation = CACHE_INVALIDATION(TC_ONLY); |
1822 | else | 2066 | break; |
2067 | default: | ||
1823 | vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC); | 2068 | vgt_cache_invalidation = CACHE_INVALIDATION(VC_AND_TC); |
2069 | break; | ||
2070 | } | ||
1824 | vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO); | 2071 | vgt_cache_invalidation |= AUTO_INVLD_EN(ES_AND_GS_AUTO); |
1825 | WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation); | 2072 | WREG32(VGT_CACHE_INVALIDATION, vgt_cache_invalidation); |
1826 | 2073 | ||
@@ -1904,12 +2151,18 @@ int evergreen_mc_init(struct radeon_device *rdev) | |||
1904 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); | 2151 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
1905 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); | 2152 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
1906 | /* Setup GPU memory space */ | 2153 | /* Setup GPU memory space */ |
1907 | /* size in MB on evergreen */ | 2154 | if (rdev->flags & RADEON_IS_IGP) { |
1908 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 2155 | /* size in bytes on fusion */ |
1909 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | 2156 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); |
2157 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); | ||
2158 | } else { | ||
2159 | /* size in MB on evergreen */ | ||
2160 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | ||
2161 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; | ||
2162 | } | ||
1910 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 2163 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
1911 | rdev->mc.active_vram_size = rdev->mc.visible_vram_size; | 2164 | rdev->mc.active_vram_size = rdev->mc.visible_vram_size; |
1912 | r600_vram_gtt_location(rdev, &rdev->mc); | 2165 | r700_vram_gtt_location(rdev, &rdev->mc); |
1913 | radeon_update_bandwidth_info(rdev); | 2166 | radeon_update_bandwidth_info(rdev); |
1914 | 2167 | ||
1915 | return 0; | 2168 | return 0; |
@@ -1917,8 +2170,30 @@ int evergreen_mc_init(struct radeon_device *rdev) | |||
1917 | 2170 | ||
1918 | bool evergreen_gpu_is_lockup(struct radeon_device *rdev) | 2171 | bool evergreen_gpu_is_lockup(struct radeon_device *rdev) |
1919 | { | 2172 | { |
1920 | /* FIXME: implement for evergreen */ | 2173 | u32 srbm_status; |
1921 | return false; | 2174 | u32 grbm_status; |
2175 | u32 grbm_status_se0, grbm_status_se1; | ||
2176 | struct r100_gpu_lockup *lockup = &rdev->config.evergreen.lockup; | ||
2177 | int r; | ||
2178 | |||
2179 | srbm_status = RREG32(SRBM_STATUS); | ||
2180 | grbm_status = RREG32(GRBM_STATUS); | ||
2181 | grbm_status_se0 = RREG32(GRBM_STATUS_SE0); | ||
2182 | grbm_status_se1 = RREG32(GRBM_STATUS_SE1); | ||
2183 | if (!(grbm_status & GUI_ACTIVE)) { | ||
2184 | r100_gpu_lockup_update(lockup, &rdev->cp); | ||
2185 | return false; | ||
2186 | } | ||
2187 | /* force CP activities */ | ||
2188 | r = radeon_ring_lock(rdev, 2); | ||
2189 | if (!r) { | ||
2190 | /* PACKET2 NOP */ | ||
2191 | radeon_ring_write(rdev, 0x80000000); | ||
2192 | radeon_ring_write(rdev, 0x80000000); | ||
2193 | radeon_ring_unlock_commit(rdev); | ||
2194 | } | ||
2195 | rdev->cp.rptr = RREG32(CP_RB_RPTR); | ||
2196 | return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp); | ||
1922 | } | 2197 | } |
1923 | 2198 | ||
1924 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev) | 2199 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev) |
@@ -2011,17 +2286,21 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) | |||
2011 | WREG32(GRBM_INT_CNTL, 0); | 2286 | WREG32(GRBM_INT_CNTL, 0); |
2012 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 2287 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
2013 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 2288 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
2014 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | 2289 | if (!(rdev->flags & RADEON_IS_IGP)) { |
2015 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | 2290 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
2016 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 2291 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
2017 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 2292 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
2293 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
2294 | } | ||
2018 | 2295 | ||
2019 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 2296 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
2020 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 2297 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
2021 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | 2298 | if (!(rdev->flags & RADEON_IS_IGP)) { |
2022 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | 2299 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
2023 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 2300 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
2024 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 2301 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
2302 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
2303 | } | ||
2025 | 2304 | ||
2026 | WREG32(DACA_AUTODETECT_INT_CONTROL, 0); | 2305 | WREG32(DACA_AUTODETECT_INT_CONTROL, 0); |
2027 | WREG32(DACB_AUTODETECT_INT_CONTROL, 0); | 2306 | WREG32(DACB_AUTODETECT_INT_CONTROL, 0); |
@@ -2047,6 +2326,7 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
2047 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; | 2326 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
2048 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; | 2327 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; |
2049 | u32 grbm_int_cntl = 0; | 2328 | u32 grbm_int_cntl = 0; |
2329 | u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0; | ||
2050 | 2330 | ||
2051 | if (!rdev->irq.installed) { | 2331 | if (!rdev->irq.installed) { |
2052 | WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); | 2332 | WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); |
@@ -2072,27 +2352,33 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
2072 | cp_int_cntl |= RB_INT_ENABLE; | 2352 | cp_int_cntl |= RB_INT_ENABLE; |
2073 | cp_int_cntl |= TIME_STAMP_INT_ENABLE; | 2353 | cp_int_cntl |= TIME_STAMP_INT_ENABLE; |
2074 | } | 2354 | } |
2075 | if (rdev->irq.crtc_vblank_int[0]) { | 2355 | if (rdev->irq.crtc_vblank_int[0] || |
2356 | rdev->irq.pflip[0]) { | ||
2076 | DRM_DEBUG("evergreen_irq_set: vblank 0\n"); | 2357 | DRM_DEBUG("evergreen_irq_set: vblank 0\n"); |
2077 | crtc1 |= VBLANK_INT_MASK; | 2358 | crtc1 |= VBLANK_INT_MASK; |
2078 | } | 2359 | } |
2079 | if (rdev->irq.crtc_vblank_int[1]) { | 2360 | if (rdev->irq.crtc_vblank_int[1] || |
2361 | rdev->irq.pflip[1]) { | ||
2080 | DRM_DEBUG("evergreen_irq_set: vblank 1\n"); | 2362 | DRM_DEBUG("evergreen_irq_set: vblank 1\n"); |
2081 | crtc2 |= VBLANK_INT_MASK; | 2363 | crtc2 |= VBLANK_INT_MASK; |
2082 | } | 2364 | } |
2083 | if (rdev->irq.crtc_vblank_int[2]) { | 2365 | if (rdev->irq.crtc_vblank_int[2] || |
2366 | rdev->irq.pflip[2]) { | ||
2084 | DRM_DEBUG("evergreen_irq_set: vblank 2\n"); | 2367 | DRM_DEBUG("evergreen_irq_set: vblank 2\n"); |
2085 | crtc3 |= VBLANK_INT_MASK; | 2368 | crtc3 |= VBLANK_INT_MASK; |
2086 | } | 2369 | } |
2087 | if (rdev->irq.crtc_vblank_int[3]) { | 2370 | if (rdev->irq.crtc_vblank_int[3] || |
2371 | rdev->irq.pflip[3]) { | ||
2088 | DRM_DEBUG("evergreen_irq_set: vblank 3\n"); | 2372 | DRM_DEBUG("evergreen_irq_set: vblank 3\n"); |
2089 | crtc4 |= VBLANK_INT_MASK; | 2373 | crtc4 |= VBLANK_INT_MASK; |
2090 | } | 2374 | } |
2091 | if (rdev->irq.crtc_vblank_int[4]) { | 2375 | if (rdev->irq.crtc_vblank_int[4] || |
2376 | rdev->irq.pflip[4]) { | ||
2092 | DRM_DEBUG("evergreen_irq_set: vblank 4\n"); | 2377 | DRM_DEBUG("evergreen_irq_set: vblank 4\n"); |
2093 | crtc5 |= VBLANK_INT_MASK; | 2378 | crtc5 |= VBLANK_INT_MASK; |
2094 | } | 2379 | } |
2095 | if (rdev->irq.crtc_vblank_int[5]) { | 2380 | if (rdev->irq.crtc_vblank_int[5] || |
2381 | rdev->irq.pflip[5]) { | ||
2096 | DRM_DEBUG("evergreen_irq_set: vblank 5\n"); | 2382 | DRM_DEBUG("evergreen_irq_set: vblank 5\n"); |
2097 | crtc6 |= VBLANK_INT_MASK; | 2383 | crtc6 |= VBLANK_INT_MASK; |
2098 | } | 2384 | } |
@@ -2130,10 +2416,19 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
2130 | 2416 | ||
2131 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); | 2417 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); |
2132 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2); | 2418 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, crtc2); |
2133 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3); | 2419 | if (!(rdev->flags & RADEON_IS_IGP)) { |
2134 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4); | 2420 | WREG32(INT_MASK + EVERGREEN_CRTC2_REGISTER_OFFSET, crtc3); |
2135 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5); | 2421 | WREG32(INT_MASK + EVERGREEN_CRTC3_REGISTER_OFFSET, crtc4); |
2136 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); | 2422 | WREG32(INT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, crtc5); |
2423 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); | ||
2424 | } | ||
2425 | |||
2426 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1); | ||
2427 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); | ||
2428 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); | ||
2429 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); | ||
2430 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); | ||
2431 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); | ||
2137 | 2432 | ||
2138 | WREG32(DC_HPD1_INT_CONTROL, hpd1); | 2433 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
2139 | WREG32(DC_HPD2_INT_CONTROL, hpd2); | 2434 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
@@ -2145,79 +2440,92 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
2145 | return 0; | 2440 | return 0; |
2146 | } | 2441 | } |
2147 | 2442 | ||
2148 | static inline void evergreen_irq_ack(struct radeon_device *rdev, | 2443 | static inline void evergreen_irq_ack(struct radeon_device *rdev) |
2149 | u32 *disp_int, | ||
2150 | u32 *disp_int_cont, | ||
2151 | u32 *disp_int_cont2, | ||
2152 | u32 *disp_int_cont3, | ||
2153 | u32 *disp_int_cont4, | ||
2154 | u32 *disp_int_cont5) | ||
2155 | { | 2444 | { |
2156 | u32 tmp; | 2445 | u32 tmp; |
2157 | 2446 | ||
2158 | *disp_int = RREG32(DISP_INTERRUPT_STATUS); | 2447 | rdev->irq.stat_regs.evergreen.disp_int = RREG32(DISP_INTERRUPT_STATUS); |
2159 | *disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE); | 2448 | rdev->irq.stat_regs.evergreen.disp_int_cont = RREG32(DISP_INTERRUPT_STATUS_CONTINUE); |
2160 | *disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2); | 2449 | rdev->irq.stat_regs.evergreen.disp_int_cont2 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE2); |
2161 | *disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3); | 2450 | rdev->irq.stat_regs.evergreen.disp_int_cont3 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE3); |
2162 | *disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4); | 2451 | rdev->irq.stat_regs.evergreen.disp_int_cont4 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE4); |
2163 | *disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); | 2452 | rdev->irq.stat_regs.evergreen.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); |
2164 | 2453 | rdev->irq.stat_regs.evergreen.d1grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET); | |
2165 | if (*disp_int & LB_D1_VBLANK_INTERRUPT) | 2454 | rdev->irq.stat_regs.evergreen.d2grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET); |
2455 | rdev->irq.stat_regs.evergreen.d3grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET); | ||
2456 | rdev->irq.stat_regs.evergreen.d4grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET); | ||
2457 | rdev->irq.stat_regs.evergreen.d5grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET); | ||
2458 | rdev->irq.stat_regs.evergreen.d6grph_int = RREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET); | ||
2459 | |||
2460 | if (rdev->irq.stat_regs.evergreen.d1grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
2461 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); | ||
2462 | if (rdev->irq.stat_regs.evergreen.d2grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
2463 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); | ||
2464 | if (rdev->irq.stat_regs.evergreen.d3grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
2465 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); | ||
2466 | if (rdev->irq.stat_regs.evergreen.d4grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
2467 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); | ||
2468 | if (rdev->irq.stat_regs.evergreen.d5grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
2469 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); | ||
2470 | if (rdev->irq.stat_regs.evergreen.d6grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
2471 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, GRPH_PFLIP_INT_CLEAR); | ||
2472 | |||
2473 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) | ||
2166 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); | 2474 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); |
2167 | if (*disp_int & LB_D1_VLINE_INTERRUPT) | 2475 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) |
2168 | WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK); | 2476 | WREG32(VLINE_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VLINE_ACK); |
2169 | 2477 | ||
2170 | if (*disp_int_cont & LB_D2_VBLANK_INTERRUPT) | 2478 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) |
2171 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK); | 2479 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VBLANK_ACK); |
2172 | if (*disp_int_cont & LB_D2_VLINE_INTERRUPT) | 2480 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) |
2173 | WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); | 2481 | WREG32(VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); |
2174 | 2482 | ||
2175 | if (*disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) | 2483 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) |
2176 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); | 2484 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); |
2177 | if (*disp_int_cont2 & LB_D3_VLINE_INTERRUPT) | 2485 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) |
2178 | WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK); | 2486 | WREG32(VLINE_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VLINE_ACK); |
2179 | 2487 | ||
2180 | if (*disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) | 2488 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) |
2181 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK); | 2489 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VBLANK_ACK); |
2182 | if (*disp_int_cont3 & LB_D4_VLINE_INTERRUPT) | 2490 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) |
2183 | WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK); | 2491 | WREG32(VLINE_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, VLINE_ACK); |
2184 | 2492 | ||
2185 | if (*disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) | 2493 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) |
2186 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); | 2494 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); |
2187 | if (*disp_int_cont4 & LB_D5_VLINE_INTERRUPT) | 2495 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) |
2188 | WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK); | 2496 | WREG32(VLINE_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VLINE_ACK); |
2189 | 2497 | ||
2190 | if (*disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) | 2498 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) |
2191 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK); | 2499 | WREG32(VBLANK_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VBLANK_ACK); |
2192 | if (*disp_int_cont5 & LB_D6_VLINE_INTERRUPT) | 2500 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) |
2193 | WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK); | 2501 | WREG32(VLINE_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, VLINE_ACK); |
2194 | 2502 | ||
2195 | if (*disp_int & DC_HPD1_INTERRUPT) { | 2503 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { |
2196 | tmp = RREG32(DC_HPD1_INT_CONTROL); | 2504 | tmp = RREG32(DC_HPD1_INT_CONTROL); |
2197 | tmp |= DC_HPDx_INT_ACK; | 2505 | tmp |= DC_HPDx_INT_ACK; |
2198 | WREG32(DC_HPD1_INT_CONTROL, tmp); | 2506 | WREG32(DC_HPD1_INT_CONTROL, tmp); |
2199 | } | 2507 | } |
2200 | if (*disp_int_cont & DC_HPD2_INTERRUPT) { | 2508 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) { |
2201 | tmp = RREG32(DC_HPD2_INT_CONTROL); | 2509 | tmp = RREG32(DC_HPD2_INT_CONTROL); |
2202 | tmp |= DC_HPDx_INT_ACK; | 2510 | tmp |= DC_HPDx_INT_ACK; |
2203 | WREG32(DC_HPD2_INT_CONTROL, tmp); | 2511 | WREG32(DC_HPD2_INT_CONTROL, tmp); |
2204 | } | 2512 | } |
2205 | if (*disp_int_cont2 & DC_HPD3_INTERRUPT) { | 2513 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) { |
2206 | tmp = RREG32(DC_HPD3_INT_CONTROL); | 2514 | tmp = RREG32(DC_HPD3_INT_CONTROL); |
2207 | tmp |= DC_HPDx_INT_ACK; | 2515 | tmp |= DC_HPDx_INT_ACK; |
2208 | WREG32(DC_HPD3_INT_CONTROL, tmp); | 2516 | WREG32(DC_HPD3_INT_CONTROL, tmp); |
2209 | } | 2517 | } |
2210 | if (*disp_int_cont3 & DC_HPD4_INTERRUPT) { | 2518 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) { |
2211 | tmp = RREG32(DC_HPD4_INT_CONTROL); | 2519 | tmp = RREG32(DC_HPD4_INT_CONTROL); |
2212 | tmp |= DC_HPDx_INT_ACK; | 2520 | tmp |= DC_HPDx_INT_ACK; |
2213 | WREG32(DC_HPD4_INT_CONTROL, tmp); | 2521 | WREG32(DC_HPD4_INT_CONTROL, tmp); |
2214 | } | 2522 | } |
2215 | if (*disp_int_cont4 & DC_HPD5_INTERRUPT) { | 2523 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) { |
2216 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 2524 | tmp = RREG32(DC_HPD5_INT_CONTROL); |
2217 | tmp |= DC_HPDx_INT_ACK; | 2525 | tmp |= DC_HPDx_INT_ACK; |
2218 | WREG32(DC_HPD5_INT_CONTROL, tmp); | 2526 | WREG32(DC_HPD5_INT_CONTROL, tmp); |
2219 | } | 2527 | } |
2220 | if (*disp_int_cont5 & DC_HPD6_INTERRUPT) { | 2528 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
2221 | tmp = RREG32(DC_HPD5_INT_CONTROL); | 2529 | tmp = RREG32(DC_HPD5_INT_CONTROL); |
2222 | tmp |= DC_HPDx_INT_ACK; | 2530 | tmp |= DC_HPDx_INT_ACK; |
2223 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 2531 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
@@ -2226,14 +2534,10 @@ static inline void evergreen_irq_ack(struct radeon_device *rdev, | |||
2226 | 2534 | ||
2227 | void evergreen_irq_disable(struct radeon_device *rdev) | 2535 | void evergreen_irq_disable(struct radeon_device *rdev) |
2228 | { | 2536 | { |
2229 | u32 disp_int, disp_int_cont, disp_int_cont2; | ||
2230 | u32 disp_int_cont3, disp_int_cont4, disp_int_cont5; | ||
2231 | |||
2232 | r600_disable_interrupts(rdev); | 2537 | r600_disable_interrupts(rdev); |
2233 | /* Wait and acknowledge irq */ | 2538 | /* Wait and acknowledge irq */ |
2234 | mdelay(1); | 2539 | mdelay(1); |
2235 | evergreen_irq_ack(rdev, &disp_int, &disp_int_cont, &disp_int_cont2, | 2540 | evergreen_irq_ack(rdev); |
2236 | &disp_int_cont3, &disp_int_cont4, &disp_int_cont5); | ||
2237 | evergreen_disable_interrupt_state(rdev); | 2541 | evergreen_disable_interrupt_state(rdev); |
2238 | } | 2542 | } |
2239 | 2543 | ||
@@ -2273,8 +2577,6 @@ int evergreen_irq_process(struct radeon_device *rdev) | |||
2273 | u32 rptr = rdev->ih.rptr; | 2577 | u32 rptr = rdev->ih.rptr; |
2274 | u32 src_id, src_data; | 2578 | u32 src_id, src_data; |
2275 | u32 ring_index; | 2579 | u32 ring_index; |
2276 | u32 disp_int, disp_int_cont, disp_int_cont2; | ||
2277 | u32 disp_int_cont3, disp_int_cont4, disp_int_cont5; | ||
2278 | unsigned long flags; | 2580 | unsigned long flags; |
2279 | bool queue_hotplug = false; | 2581 | bool queue_hotplug = false; |
2280 | 2582 | ||
@@ -2295,8 +2597,7 @@ int evergreen_irq_process(struct radeon_device *rdev) | |||
2295 | 2597 | ||
2296 | restart_ih: | 2598 | restart_ih: |
2297 | /* display interrupts */ | 2599 | /* display interrupts */ |
2298 | evergreen_irq_ack(rdev, &disp_int, &disp_int_cont, &disp_int_cont2, | 2600 | evergreen_irq_ack(rdev); |
2299 | &disp_int_cont3, &disp_int_cont4, &disp_int_cont5); | ||
2300 | 2601 | ||
2301 | rdev->ih.wptr = wptr; | 2602 | rdev->ih.wptr = wptr; |
2302 | while (rptr != wptr) { | 2603 | while (rptr != wptr) { |
@@ -2309,17 +2610,21 @@ restart_ih: | |||
2309 | case 1: /* D1 vblank/vline */ | 2610 | case 1: /* D1 vblank/vline */ |
2310 | switch (src_data) { | 2611 | switch (src_data) { |
2311 | case 0: /* D1 vblank */ | 2612 | case 0: /* D1 vblank */ |
2312 | if (disp_int & LB_D1_VBLANK_INTERRUPT) { | 2613 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VBLANK_INTERRUPT) { |
2313 | drm_handle_vblank(rdev->ddev, 0); | 2614 | if (rdev->irq.crtc_vblank_int[0]) { |
2314 | rdev->pm.vblank_sync = true; | 2615 | drm_handle_vblank(rdev->ddev, 0); |
2315 | wake_up(&rdev->irq.vblank_queue); | 2616 | rdev->pm.vblank_sync = true; |
2316 | disp_int &= ~LB_D1_VBLANK_INTERRUPT; | 2617 | wake_up(&rdev->irq.vblank_queue); |
2618 | } | ||
2619 | if (rdev->irq.pflip[0]) | ||
2620 | radeon_crtc_handle_flip(rdev, 0); | ||
2621 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
2317 | DRM_DEBUG("IH: D1 vblank\n"); | 2622 | DRM_DEBUG("IH: D1 vblank\n"); |
2318 | } | 2623 | } |
2319 | break; | 2624 | break; |
2320 | case 1: /* D1 vline */ | 2625 | case 1: /* D1 vline */ |
2321 | if (disp_int & LB_D1_VLINE_INTERRUPT) { | 2626 | if (rdev->irq.stat_regs.evergreen.disp_int & LB_D1_VLINE_INTERRUPT) { |
2322 | disp_int &= ~LB_D1_VLINE_INTERRUPT; | 2627 | rdev->irq.stat_regs.evergreen.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
2323 | DRM_DEBUG("IH: D1 vline\n"); | 2628 | DRM_DEBUG("IH: D1 vline\n"); |
2324 | } | 2629 | } |
2325 | break; | 2630 | break; |
@@ -2331,17 +2636,21 @@ restart_ih: | |||
2331 | case 2: /* D2 vblank/vline */ | 2636 | case 2: /* D2 vblank/vline */ |
2332 | switch (src_data) { | 2637 | switch (src_data) { |
2333 | case 0: /* D2 vblank */ | 2638 | case 0: /* D2 vblank */ |
2334 | if (disp_int_cont & LB_D2_VBLANK_INTERRUPT) { | 2639 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VBLANK_INTERRUPT) { |
2335 | drm_handle_vblank(rdev->ddev, 1); | 2640 | if (rdev->irq.crtc_vblank_int[1]) { |
2336 | rdev->pm.vblank_sync = true; | 2641 | drm_handle_vblank(rdev->ddev, 1); |
2337 | wake_up(&rdev->irq.vblank_queue); | 2642 | rdev->pm.vblank_sync = true; |
2338 | disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | 2643 | wake_up(&rdev->irq.vblank_queue); |
2644 | } | ||
2645 | if (rdev->irq.pflip[1]) | ||
2646 | radeon_crtc_handle_flip(rdev, 1); | ||
2647 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VBLANK_INTERRUPT; | ||
2339 | DRM_DEBUG("IH: D2 vblank\n"); | 2648 | DRM_DEBUG("IH: D2 vblank\n"); |
2340 | } | 2649 | } |
2341 | break; | 2650 | break; |
2342 | case 1: /* D2 vline */ | 2651 | case 1: /* D2 vline */ |
2343 | if (disp_int_cont & LB_D2_VLINE_INTERRUPT) { | 2652 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & LB_D2_VLINE_INTERRUPT) { |
2344 | disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; | 2653 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~LB_D2_VLINE_INTERRUPT; |
2345 | DRM_DEBUG("IH: D2 vline\n"); | 2654 | DRM_DEBUG("IH: D2 vline\n"); |
2346 | } | 2655 | } |
2347 | break; | 2656 | break; |
@@ -2353,17 +2662,21 @@ restart_ih: | |||
2353 | case 3: /* D3 vblank/vline */ | 2662 | case 3: /* D3 vblank/vline */ |
2354 | switch (src_data) { | 2663 | switch (src_data) { |
2355 | case 0: /* D3 vblank */ | 2664 | case 0: /* D3 vblank */ |
2356 | if (disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { | 2665 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) { |
2357 | drm_handle_vblank(rdev->ddev, 2); | 2666 | if (rdev->irq.crtc_vblank_int[2]) { |
2358 | rdev->pm.vblank_sync = true; | 2667 | drm_handle_vblank(rdev->ddev, 2); |
2359 | wake_up(&rdev->irq.vblank_queue); | 2668 | rdev->pm.vblank_sync = true; |
2360 | disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | 2669 | wake_up(&rdev->irq.vblank_queue); |
2670 | } | ||
2671 | if (rdev->irq.pflip[2]) | ||
2672 | radeon_crtc_handle_flip(rdev, 2); | ||
2673 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VBLANK_INTERRUPT; | ||
2361 | DRM_DEBUG("IH: D3 vblank\n"); | 2674 | DRM_DEBUG("IH: D3 vblank\n"); |
2362 | } | 2675 | } |
2363 | break; | 2676 | break; |
2364 | case 1: /* D3 vline */ | 2677 | case 1: /* D3 vline */ |
2365 | if (disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { | 2678 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) { |
2366 | disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; | 2679 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~LB_D3_VLINE_INTERRUPT; |
2367 | DRM_DEBUG("IH: D3 vline\n"); | 2680 | DRM_DEBUG("IH: D3 vline\n"); |
2368 | } | 2681 | } |
2369 | break; | 2682 | break; |
@@ -2375,17 +2688,21 @@ restart_ih: | |||
2375 | case 4: /* D4 vblank/vline */ | 2688 | case 4: /* D4 vblank/vline */ |
2376 | switch (src_data) { | 2689 | switch (src_data) { |
2377 | case 0: /* D4 vblank */ | 2690 | case 0: /* D4 vblank */ |
2378 | if (disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { | 2691 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VBLANK_INTERRUPT) { |
2379 | drm_handle_vblank(rdev->ddev, 3); | 2692 | if (rdev->irq.crtc_vblank_int[3]) { |
2380 | rdev->pm.vblank_sync = true; | 2693 | drm_handle_vblank(rdev->ddev, 3); |
2381 | wake_up(&rdev->irq.vblank_queue); | 2694 | rdev->pm.vblank_sync = true; |
2382 | disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | 2695 | wake_up(&rdev->irq.vblank_queue); |
2696 | } | ||
2697 | if (rdev->irq.pflip[3]) | ||
2698 | radeon_crtc_handle_flip(rdev, 3); | ||
2699 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VBLANK_INTERRUPT; | ||
2383 | DRM_DEBUG("IH: D4 vblank\n"); | 2700 | DRM_DEBUG("IH: D4 vblank\n"); |
2384 | } | 2701 | } |
2385 | break; | 2702 | break; |
2386 | case 1: /* D4 vline */ | 2703 | case 1: /* D4 vline */ |
2387 | if (disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { | 2704 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & LB_D4_VLINE_INTERRUPT) { |
2388 | disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; | 2705 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~LB_D4_VLINE_INTERRUPT; |
2389 | DRM_DEBUG("IH: D4 vline\n"); | 2706 | DRM_DEBUG("IH: D4 vline\n"); |
2390 | } | 2707 | } |
2391 | break; | 2708 | break; |
@@ -2397,17 +2714,21 @@ restart_ih: | |||
2397 | case 5: /* D5 vblank/vline */ | 2714 | case 5: /* D5 vblank/vline */ |
2398 | switch (src_data) { | 2715 | switch (src_data) { |
2399 | case 0: /* D5 vblank */ | 2716 | case 0: /* D5 vblank */ |
2400 | if (disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { | 2717 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) { |
2401 | drm_handle_vblank(rdev->ddev, 4); | 2718 | if (rdev->irq.crtc_vblank_int[4]) { |
2402 | rdev->pm.vblank_sync = true; | 2719 | drm_handle_vblank(rdev->ddev, 4); |
2403 | wake_up(&rdev->irq.vblank_queue); | 2720 | rdev->pm.vblank_sync = true; |
2404 | disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | 2721 | wake_up(&rdev->irq.vblank_queue); |
2722 | } | ||
2723 | if (rdev->irq.pflip[4]) | ||
2724 | radeon_crtc_handle_flip(rdev, 4); | ||
2725 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VBLANK_INTERRUPT; | ||
2405 | DRM_DEBUG("IH: D5 vblank\n"); | 2726 | DRM_DEBUG("IH: D5 vblank\n"); |
2406 | } | 2727 | } |
2407 | break; | 2728 | break; |
2408 | case 1: /* D5 vline */ | 2729 | case 1: /* D5 vline */ |
2409 | if (disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { | 2730 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) { |
2410 | disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; | 2731 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~LB_D5_VLINE_INTERRUPT; |
2411 | DRM_DEBUG("IH: D5 vline\n"); | 2732 | DRM_DEBUG("IH: D5 vline\n"); |
2412 | } | 2733 | } |
2413 | break; | 2734 | break; |
@@ -2419,17 +2740,21 @@ restart_ih: | |||
2419 | case 6: /* D6 vblank/vline */ | 2740 | case 6: /* D6 vblank/vline */ |
2420 | switch (src_data) { | 2741 | switch (src_data) { |
2421 | case 0: /* D6 vblank */ | 2742 | case 0: /* D6 vblank */ |
2422 | if (disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { | 2743 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VBLANK_INTERRUPT) { |
2423 | drm_handle_vblank(rdev->ddev, 5); | 2744 | if (rdev->irq.crtc_vblank_int[5]) { |
2424 | rdev->pm.vblank_sync = true; | 2745 | drm_handle_vblank(rdev->ddev, 5); |
2425 | wake_up(&rdev->irq.vblank_queue); | 2746 | rdev->pm.vblank_sync = true; |
2426 | disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | 2747 | wake_up(&rdev->irq.vblank_queue); |
2748 | } | ||
2749 | if (rdev->irq.pflip[5]) | ||
2750 | radeon_crtc_handle_flip(rdev, 5); | ||
2751 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VBLANK_INTERRUPT; | ||
2427 | DRM_DEBUG("IH: D6 vblank\n"); | 2752 | DRM_DEBUG("IH: D6 vblank\n"); |
2428 | } | 2753 | } |
2429 | break; | 2754 | break; |
2430 | case 1: /* D6 vline */ | 2755 | case 1: /* D6 vline */ |
2431 | if (disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { | 2756 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & LB_D6_VLINE_INTERRUPT) { |
2432 | disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; | 2757 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~LB_D6_VLINE_INTERRUPT; |
2433 | DRM_DEBUG("IH: D6 vline\n"); | 2758 | DRM_DEBUG("IH: D6 vline\n"); |
2434 | } | 2759 | } |
2435 | break; | 2760 | break; |
@@ -2441,43 +2766,43 @@ restart_ih: | |||
2441 | case 42: /* HPD hotplug */ | 2766 | case 42: /* HPD hotplug */ |
2442 | switch (src_data) { | 2767 | switch (src_data) { |
2443 | case 0: | 2768 | case 0: |
2444 | if (disp_int & DC_HPD1_INTERRUPT) { | 2769 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_INTERRUPT) { |
2445 | disp_int &= ~DC_HPD1_INTERRUPT; | 2770 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_INTERRUPT; |
2446 | queue_hotplug = true; | 2771 | queue_hotplug = true; |
2447 | DRM_DEBUG("IH: HPD1\n"); | 2772 | DRM_DEBUG("IH: HPD1\n"); |
2448 | } | 2773 | } |
2449 | break; | 2774 | break; |
2450 | case 1: | 2775 | case 1: |
2451 | if (disp_int_cont & DC_HPD2_INTERRUPT) { | 2776 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_INTERRUPT) { |
2452 | disp_int_cont &= ~DC_HPD2_INTERRUPT; | 2777 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_INTERRUPT; |
2453 | queue_hotplug = true; | 2778 | queue_hotplug = true; |
2454 | DRM_DEBUG("IH: HPD2\n"); | 2779 | DRM_DEBUG("IH: HPD2\n"); |
2455 | } | 2780 | } |
2456 | break; | 2781 | break; |
2457 | case 2: | 2782 | case 2: |
2458 | if (disp_int_cont2 & DC_HPD3_INTERRUPT) { | 2783 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_INTERRUPT) { |
2459 | disp_int_cont2 &= ~DC_HPD3_INTERRUPT; | 2784 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_INTERRUPT; |
2460 | queue_hotplug = true; | 2785 | queue_hotplug = true; |
2461 | DRM_DEBUG("IH: HPD3\n"); | 2786 | DRM_DEBUG("IH: HPD3\n"); |
2462 | } | 2787 | } |
2463 | break; | 2788 | break; |
2464 | case 3: | 2789 | case 3: |
2465 | if (disp_int_cont3 & DC_HPD4_INTERRUPT) { | 2790 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_INTERRUPT) { |
2466 | disp_int_cont3 &= ~DC_HPD4_INTERRUPT; | 2791 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_INTERRUPT; |
2467 | queue_hotplug = true; | 2792 | queue_hotplug = true; |
2468 | DRM_DEBUG("IH: HPD4\n"); | 2793 | DRM_DEBUG("IH: HPD4\n"); |
2469 | } | 2794 | } |
2470 | break; | 2795 | break; |
2471 | case 4: | 2796 | case 4: |
2472 | if (disp_int_cont4 & DC_HPD5_INTERRUPT) { | 2797 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_INTERRUPT) { |
2473 | disp_int_cont4 &= ~DC_HPD5_INTERRUPT; | 2798 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_INTERRUPT; |
2474 | queue_hotplug = true; | 2799 | queue_hotplug = true; |
2475 | DRM_DEBUG("IH: HPD5\n"); | 2800 | DRM_DEBUG("IH: HPD5\n"); |
2476 | } | 2801 | } |
2477 | break; | 2802 | break; |
2478 | case 5: | 2803 | case 5: |
2479 | if (disp_int_cont5 & DC_HPD6_INTERRUPT) { | 2804 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { |
2480 | disp_int_cont5 &= ~DC_HPD6_INTERRUPT; | 2805 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_INTERRUPT; |
2481 | queue_hotplug = true; | 2806 | queue_hotplug = true; |
2482 | DRM_DEBUG("IH: HPD6\n"); | 2807 | DRM_DEBUG("IH: HPD6\n"); |
2483 | } | 2808 | } |
@@ -2516,7 +2841,7 @@ restart_ih: | |||
2516 | if (wptr != rdev->ih.wptr) | 2841 | if (wptr != rdev->ih.wptr) |
2517 | goto restart_ih; | 2842 | goto restart_ih; |
2518 | if (queue_hotplug) | 2843 | if (queue_hotplug) |
2519 | queue_work(rdev->wq, &rdev->hotplug_work); | 2844 | schedule_work(&rdev->hotplug_work); |
2520 | rdev->ih.rptr = rptr; | 2845 | rdev->ih.rptr = rptr; |
2521 | WREG32(IH_RB_RPTR, rdev->ih.rptr); | 2846 | WREG32(IH_RB_RPTR, rdev->ih.rptr); |
2522 | spin_unlock_irqrestore(&rdev->ih.lock, flags); | 2847 | spin_unlock_irqrestore(&rdev->ih.lock, flags); |
@@ -2527,12 +2852,31 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
2527 | { | 2852 | { |
2528 | int r; | 2853 | int r; |
2529 | 2854 | ||
2530 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { | 2855 | /* enable pcie gen2 link */ |
2531 | r = r600_init_microcode(rdev); | 2856 | if (!ASIC_IS_DCE5(rdev)) |
2857 | evergreen_pcie_gen2_enable(rdev); | ||
2858 | |||
2859 | if (ASIC_IS_DCE5(rdev)) { | ||
2860 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { | ||
2861 | r = ni_init_microcode(rdev); | ||
2862 | if (r) { | ||
2863 | DRM_ERROR("Failed to load firmware!\n"); | ||
2864 | return r; | ||
2865 | } | ||
2866 | } | ||
2867 | r = btc_mc_load_microcode(rdev); | ||
2532 | if (r) { | 2868 | if (r) { |
2533 | DRM_ERROR("Failed to load firmware!\n"); | 2869 | DRM_ERROR("Failed to load MC firmware!\n"); |
2534 | return r; | 2870 | return r; |
2535 | } | 2871 | } |
2872 | } else { | ||
2873 | if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { | ||
2874 | r = r600_init_microcode(rdev); | ||
2875 | if (r) { | ||
2876 | DRM_ERROR("Failed to load firmware!\n"); | ||
2877 | return r; | ||
2878 | } | ||
2879 | } | ||
2536 | } | 2880 | } |
2537 | 2881 | ||
2538 | evergreen_mc_program(rdev); | 2882 | evergreen_mc_program(rdev); |
@@ -2551,6 +2895,11 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
2551 | rdev->asic->copy = NULL; | 2895 | rdev->asic->copy = NULL; |
2552 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | 2896 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); |
2553 | } | 2897 | } |
2898 | /* XXX: ontario has problems blitting to gart at the moment */ | ||
2899 | if (rdev->family == CHIP_PALM) { | ||
2900 | rdev->asic->copy = NULL; | ||
2901 | rdev->mc.active_vram_size = rdev->mc.visible_vram_size; | ||
2902 | } | ||
2554 | 2903 | ||
2555 | /* allocate wb buffer */ | 2904 | /* allocate wb buffer */ |
2556 | r = radeon_wb_init(rdev); | 2905 | r = radeon_wb_init(rdev); |
@@ -2658,12 +3007,16 @@ static bool evergreen_card_posted(struct radeon_device *rdev) | |||
2658 | u32 reg; | 3007 | u32 reg; |
2659 | 3008 | ||
2660 | /* first check CRTCs */ | 3009 | /* first check CRTCs */ |
2661 | reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | | 3010 | if (rdev->flags & RADEON_IS_IGP) |
2662 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) | | 3011 | reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | |
2663 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) | | 3012 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); |
2664 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) | | 3013 | else |
2665 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) | | 3014 | reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | |
2666 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); | 3015 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) | |
3016 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) | | ||
3017 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) | | ||
3018 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) | | ||
3019 | RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); | ||
2667 | if (reg & EVERGREEN_CRTC_MASTER_EN) | 3020 | if (reg & EVERGREEN_CRTC_MASTER_EN) |
2668 | return true; | 3021 | return true; |
2669 | 3022 | ||
@@ -2800,3 +3153,52 @@ void evergreen_fini(struct radeon_device *rdev) | |||
2800 | rdev->bios = NULL; | 3153 | rdev->bios = NULL; |
2801 | radeon_dummy_page_fini(rdev); | 3154 | radeon_dummy_page_fini(rdev); |
2802 | } | 3155 | } |
3156 | |||
3157 | static void evergreen_pcie_gen2_enable(struct radeon_device *rdev) | ||
3158 | { | ||
3159 | u32 link_width_cntl, speed_cntl; | ||
3160 | |||
3161 | if (rdev->flags & RADEON_IS_IGP) | ||
3162 | return; | ||
3163 | |||
3164 | if (!(rdev->flags & RADEON_IS_PCIE)) | ||
3165 | return; | ||
3166 | |||
3167 | /* x2 cards have a special sequence */ | ||
3168 | if (ASIC_IS_X2(rdev)) | ||
3169 | return; | ||
3170 | |||
3171 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
3172 | if ((speed_cntl & LC_OTHER_SIDE_EVER_SENT_GEN2) || | ||
3173 | (speed_cntl & LC_OTHER_SIDE_SUPPORTS_GEN2)) { | ||
3174 | |||
3175 | link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); | ||
3176 | link_width_cntl &= ~LC_UPCONFIGURE_DIS; | ||
3177 | WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); | ||
3178 | |||
3179 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
3180 | speed_cntl &= ~LC_TARGET_LINK_SPEED_OVERRIDE_EN; | ||
3181 | WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); | ||
3182 | |||
3183 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
3184 | speed_cntl |= LC_CLR_FAILED_SPD_CHANGE_CNT; | ||
3185 | WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); | ||
3186 | |||
3187 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
3188 | speed_cntl &= ~LC_CLR_FAILED_SPD_CHANGE_CNT; | ||
3189 | WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); | ||
3190 | |||
3191 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
3192 | speed_cntl |= LC_GEN2_EN_STRAP; | ||
3193 | WREG32_PCIE_P(PCIE_LC_SPEED_CNTL, speed_cntl); | ||
3194 | |||
3195 | } else { | ||
3196 | link_width_cntl = RREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL); | ||
3197 | /* XXX: only disable it if gen1 bridge vendor == 0x111d or 0x1106 */ | ||
3198 | if (1) | ||
3199 | link_width_cntl |= LC_UPCONFIGURE_DIS; | ||
3200 | else | ||
3201 | link_width_cntl &= ~LC_UPCONFIGURE_DIS; | ||
3202 | WREG32_PCIE_P(PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); | ||
3203 | } | ||
3204 | } | ||