diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 76 |
1 files changed, 40 insertions, 36 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 59c71245fb91..5943d561fd1e 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -779,7 +779,6 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
779 | fixed20_12 a; | 779 | fixed20_12 a; |
780 | u32 tmp; | 780 | u32 tmp; |
781 | int chansize, numchan; | 781 | int chansize, numchan; |
782 | int r; | ||
783 | 782 | ||
784 | /* Get VRAM informations */ | 783 | /* Get VRAM informations */ |
785 | rdev->mc.vram_is_ddr = true; | 784 | rdev->mc.vram_is_ddr = true; |
@@ -822,9 +821,6 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
822 | rdev->mc.real_vram_size = rdev->mc.aper_size; | 821 | rdev->mc.real_vram_size = rdev->mc.aper_size; |
823 | 822 | ||
824 | if (rdev->flags & RADEON_IS_AGP) { | 823 | if (rdev->flags & RADEON_IS_AGP) { |
825 | r = radeon_agp_init(rdev); | ||
826 | if (r) | ||
827 | return r; | ||
828 | /* gtt_size is setup by radeon_agp_init */ | 824 | /* gtt_size is setup by radeon_agp_init */ |
829 | rdev->mc.gtt_location = rdev->mc.agp_base; | 825 | rdev->mc.gtt_location = rdev->mc.agp_base; |
830 | tmp = 0xFFFFFFFFUL - rdev->mc.agp_base - rdev->mc.gtt_size; | 826 | tmp = 0xFFFFFFFFUL - rdev->mc.agp_base - rdev->mc.gtt_size; |
@@ -891,26 +887,25 @@ static int rv770_startup(struct radeon_device *rdev) | |||
891 | return r; | 887 | return r; |
892 | } | 888 | } |
893 | rv770_gpu_init(rdev); | 889 | rv770_gpu_init(rdev); |
894 | 890 | r = r600_blit_init(rdev); | |
895 | if (!rdev->r600_blit.shader_obj) { | 891 | if (r) { |
896 | r = r600_blit_init(rdev); | 892 | r600_blit_fini(rdev); |
893 | rdev->asic->copy = NULL; | ||
894 | dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r); | ||
895 | } | ||
896 | /* pin copy shader into vram */ | ||
897 | if (rdev->r600_blit.shader_obj) { | ||
898 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | ||
899 | if (unlikely(r != 0)) | ||
900 | return r; | ||
901 | r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | ||
902 | &rdev->r600_blit.shader_gpu_addr); | ||
903 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); | ||
897 | if (r) { | 904 | if (r) { |
898 | DRM_ERROR("radeon: failed blitter (%d).\n", r); | 905 | DRM_ERROR("failed to pin blit object %d\n", r); |
899 | return r; | 906 | return r; |
900 | } | 907 | } |
901 | } | 908 | } |
902 | |||
903 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | ||
904 | if (unlikely(r != 0)) | ||
905 | return r; | ||
906 | r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | ||
907 | &rdev->r600_blit.shader_gpu_addr); | ||
908 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); | ||
909 | if (r) { | ||
910 | DRM_ERROR("failed to pin blit object %d\n", r); | ||
911 | return r; | ||
912 | } | ||
913 | |||
914 | /* Enable IRQ */ | 909 | /* Enable IRQ */ |
915 | r = r600_irq_init(rdev); | 910 | r = r600_irq_init(rdev); |
916 | if (r) { | 911 | if (r) { |
@@ -972,13 +967,16 @@ int rv770_suspend(struct radeon_device *rdev) | |||
972 | /* FIXME: we should wait for ring to be empty */ | 967 | /* FIXME: we should wait for ring to be empty */ |
973 | r700_cp_stop(rdev); | 968 | r700_cp_stop(rdev); |
974 | rdev->cp.ready = false; | 969 | rdev->cp.ready = false; |
970 | r600_irq_suspend(rdev); | ||
975 | r600_wb_disable(rdev); | 971 | r600_wb_disable(rdev); |
976 | rv770_pcie_gart_disable(rdev); | 972 | rv770_pcie_gart_disable(rdev); |
977 | /* unpin shaders bo */ | 973 | /* unpin shaders bo */ |
978 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); | 974 | if (rdev->r600_blit.shader_obj) { |
979 | if (likely(r == 0)) { | 975 | r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false); |
980 | radeon_bo_unpin(rdev->r600_blit.shader_obj); | 976 | if (likely(r == 0)) { |
981 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); | 977 | radeon_bo_unpin(rdev->r600_blit.shader_obj); |
978 | radeon_bo_unreserve(rdev->r600_blit.shader_obj); | ||
979 | } | ||
982 | } | 980 | } |
983 | return 0; | 981 | return 0; |
984 | } | 982 | } |
@@ -1037,6 +1035,11 @@ int rv770_init(struct radeon_device *rdev) | |||
1037 | r = radeon_fence_driver_init(rdev); | 1035 | r = radeon_fence_driver_init(rdev); |
1038 | if (r) | 1036 | if (r) |
1039 | return r; | 1037 | return r; |
1038 | if (rdev->flags & RADEON_IS_AGP) { | ||
1039 | r = radeon_agp_init(rdev); | ||
1040 | if (r) | ||
1041 | radeon_agp_disable(rdev); | ||
1042 | } | ||
1040 | r = rv770_mc_init(rdev); | 1043 | r = rv770_mc_init(rdev); |
1041 | if (r) | 1044 | if (r) |
1042 | return r; | 1045 | return r; |
@@ -1062,22 +1065,25 @@ int rv770_init(struct radeon_device *rdev) | |||
1062 | rdev->accel_working = true; | 1065 | rdev->accel_working = true; |
1063 | r = rv770_startup(rdev); | 1066 | r = rv770_startup(rdev); |
1064 | if (r) { | 1067 | if (r) { |
1065 | rv770_suspend(rdev); | 1068 | dev_err(rdev->dev, "disabling GPU acceleration\n"); |
1069 | r600_cp_fini(rdev); | ||
1066 | r600_wb_fini(rdev); | 1070 | r600_wb_fini(rdev); |
1067 | radeon_ring_fini(rdev); | 1071 | r600_irq_fini(rdev); |
1072 | radeon_irq_kms_fini(rdev); | ||
1068 | rv770_pcie_gart_fini(rdev); | 1073 | rv770_pcie_gart_fini(rdev); |
1069 | rdev->accel_working = false; | 1074 | rdev->accel_working = false; |
1070 | } | 1075 | } |
1071 | if (rdev->accel_working) { | 1076 | if (rdev->accel_working) { |
1072 | r = radeon_ib_pool_init(rdev); | 1077 | r = radeon_ib_pool_init(rdev); |
1073 | if (r) { | 1078 | if (r) { |
1074 | DRM_ERROR("radeon: failed initializing IB pool (%d).\n", r); | 1079 | dev_err(rdev->dev, "IB initialization failed (%d).\n", r); |
1075 | rdev->accel_working = false; | ||
1076 | } | ||
1077 | r = r600_ib_test(rdev); | ||
1078 | if (r) { | ||
1079 | DRM_ERROR("radeon: failed testing IB (%d).\n", r); | ||
1080 | rdev->accel_working = false; | 1080 | rdev->accel_working = false; |
1081 | } else { | ||
1082 | r = r600_ib_test(rdev); | ||
1083 | if (r) { | ||
1084 | dev_err(rdev->dev, "IB test failed (%d).\n", r); | ||
1085 | rdev->accel_working = false; | ||
1086 | } | ||
1081 | } | 1087 | } |
1082 | } | 1088 | } |
1083 | return 0; | 1089 | return 0; |
@@ -1085,13 +1091,11 @@ int rv770_init(struct radeon_device *rdev) | |||
1085 | 1091 | ||
1086 | void rv770_fini(struct radeon_device *rdev) | 1092 | void rv770_fini(struct radeon_device *rdev) |
1087 | { | 1093 | { |
1088 | rv770_suspend(rdev); | ||
1089 | |||
1090 | r600_blit_fini(rdev); | 1094 | r600_blit_fini(rdev); |
1095 | r600_cp_fini(rdev); | ||
1096 | r600_wb_fini(rdev); | ||
1091 | r600_irq_fini(rdev); | 1097 | r600_irq_fini(rdev); |
1092 | radeon_irq_kms_fini(rdev); | 1098 | radeon_irq_kms_fini(rdev); |
1093 | radeon_ring_fini(rdev); | ||
1094 | r600_wb_fini(rdev); | ||
1095 | rv770_pcie_gart_fini(rdev); | 1099 | rv770_pcie_gart_fini(rdev); |
1096 | radeon_gem_fini(rdev); | 1100 | radeon_gem_fini(rdev); |
1097 | radeon_fence_driver_fini(rdev); | 1101 | radeon_fence_driver_fini(rdev); |