diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index f1c796810117..9490da700749 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -267,6 +267,7 @@ static void rv770_mc_program(struct radeon_device *rdev) | |||
267 | */ | 267 | */ |
268 | void r700_cp_stop(struct radeon_device *rdev) | 268 | void r700_cp_stop(struct radeon_device *rdev) |
269 | { | 269 | { |
270 | rdev->mc.active_vram_size = rdev->mc.visible_vram_size; | ||
270 | WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); | 271 | WREG32(CP_ME_CNTL, (CP_ME_HALT | CP_PFP_HALT)); |
271 | } | 272 | } |
272 | 273 | ||
@@ -905,6 +906,54 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
905 | 906 | ||
906 | } | 907 | } |
907 | 908 | ||
909 | static int rv770_vram_scratch_init(struct radeon_device *rdev) | ||
910 | { | ||
911 | int r; | ||
912 | u64 gpu_addr; | ||
913 | |||
914 | if (rdev->vram_scratch.robj == NULL) { | ||
915 | r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, | ||
916 | true, RADEON_GEM_DOMAIN_VRAM, | ||
917 | &rdev->vram_scratch.robj); | ||
918 | if (r) { | ||
919 | return r; | ||
920 | } | ||
921 | } | ||
922 | |||
923 | r = radeon_bo_reserve(rdev->vram_scratch.robj, false); | ||
924 | if (unlikely(r != 0)) | ||
925 | return r; | ||
926 | r = radeon_bo_pin(rdev->vram_scratch.robj, | ||
927 | RADEON_GEM_DOMAIN_VRAM, &gpu_addr); | ||
928 | if (r) { | ||
929 | radeon_bo_unreserve(rdev->vram_scratch.robj); | ||
930 | return r; | ||
931 | } | ||
932 | r = radeon_bo_kmap(rdev->vram_scratch.robj, | ||
933 | (void **)&rdev->vram_scratch.ptr); | ||
934 | if (r) | ||
935 | radeon_bo_unpin(rdev->vram_scratch.robj); | ||
936 | radeon_bo_unreserve(rdev->vram_scratch.robj); | ||
937 | |||
938 | return r; | ||
939 | } | ||
940 | |||
941 | static void rv770_vram_scratch_fini(struct radeon_device *rdev) | ||
942 | { | ||
943 | int r; | ||
944 | |||
945 | if (rdev->vram_scratch.robj == NULL) { | ||
946 | return; | ||
947 | } | ||
948 | r = radeon_bo_reserve(rdev->vram_scratch.robj, false); | ||
949 | if (likely(r == 0)) { | ||
950 | radeon_bo_kunmap(rdev->vram_scratch.robj); | ||
951 | radeon_bo_unpin(rdev->vram_scratch.robj); | ||
952 | radeon_bo_unreserve(rdev->vram_scratch.robj); | ||
953 | } | ||
954 | radeon_bo_unref(&rdev->vram_scratch.robj); | ||
955 | } | ||
956 | |||
908 | int rv770_mc_init(struct radeon_device *rdev) | 957 | int rv770_mc_init(struct radeon_device *rdev) |
909 | { | 958 | { |
910 | u32 tmp; | 959 | u32 tmp; |
@@ -944,6 +993,7 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
944 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); | 993 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); |
945 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); | 994 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); |
946 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 995 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
996 | rdev->mc.active_vram_size = rdev->mc.visible_vram_size; | ||
947 | r600_vram_gtt_location(rdev, &rdev->mc); | 997 | r600_vram_gtt_location(rdev, &rdev->mc); |
948 | radeon_update_bandwidth_info(rdev); | 998 | radeon_update_bandwidth_info(rdev); |
949 | 999 | ||
@@ -970,6 +1020,9 @@ static int rv770_startup(struct radeon_device *rdev) | |||
970 | if (r) | 1020 | if (r) |
971 | return r; | 1021 | return r; |
972 | } | 1022 | } |
1023 | r = rv770_vram_scratch_init(rdev); | ||
1024 | if (r) | ||
1025 | return r; | ||
973 | rv770_gpu_init(rdev); | 1026 | rv770_gpu_init(rdev); |
974 | r = r600_blit_init(rdev); | 1027 | r = r600_blit_init(rdev); |
975 | if (r) { | 1028 | if (r) { |
@@ -1023,11 +1076,6 @@ int rv770_resume(struct radeon_device *rdev) | |||
1023 | */ | 1076 | */ |
1024 | /* post card */ | 1077 | /* post card */ |
1025 | atom_asic_init(rdev->mode_info.atom_context); | 1078 | atom_asic_init(rdev->mode_info.atom_context); |
1026 | /* Initialize clocks */ | ||
1027 | r = radeon_clocks_init(rdev); | ||
1028 | if (r) { | ||
1029 | return r; | ||
1030 | } | ||
1031 | 1079 | ||
1032 | r = rv770_startup(rdev); | 1080 | r = rv770_startup(rdev); |
1033 | if (r) { | 1081 | if (r) { |
@@ -1118,9 +1166,6 @@ int rv770_init(struct radeon_device *rdev) | |||
1118 | radeon_surface_init(rdev); | 1166 | radeon_surface_init(rdev); |
1119 | /* Initialize clocks */ | 1167 | /* Initialize clocks */ |
1120 | radeon_get_clock_info(rdev->ddev); | 1168 | radeon_get_clock_info(rdev->ddev); |
1121 | r = radeon_clocks_init(rdev); | ||
1122 | if (r) | ||
1123 | return r; | ||
1124 | /* Fence driver */ | 1169 | /* Fence driver */ |
1125 | r = radeon_fence_driver_init(rdev); | 1170 | r = radeon_fence_driver_init(rdev); |
1126 | if (r) | 1171 | if (r) |
@@ -1195,9 +1240,9 @@ void rv770_fini(struct radeon_device *rdev) | |||
1195 | r600_irq_fini(rdev); | 1240 | r600_irq_fini(rdev); |
1196 | radeon_irq_kms_fini(rdev); | 1241 | radeon_irq_kms_fini(rdev); |
1197 | rv770_pcie_gart_fini(rdev); | 1242 | rv770_pcie_gart_fini(rdev); |
1243 | rv770_vram_scratch_fini(rdev); | ||
1198 | radeon_gem_fini(rdev); | 1244 | radeon_gem_fini(rdev); |
1199 | radeon_fence_driver_fini(rdev); | 1245 | radeon_fence_driver_fini(rdev); |
1200 | radeon_clocks_fini(rdev); | ||
1201 | radeon_agp_fini(rdev); | 1246 | radeon_agp_fini(rdev); |
1202 | radeon_bo_fini(rdev); | 1247 | radeon_bo_fini(rdev); |
1203 | radeon_atombios_fini(rdev); | 1248 | radeon_atombios_fini(rdev); |