diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2011-10-28 10:30:02 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-11-01 12:05:02 -0400 |
commit | 16cdf04d30c24a6e698863351c11d9a8da2591ed (patch) | |
tree | f104a8d49318daebd1e598d03eb1455e09288621 /drivers/gpu/drm/radeon/rv770.c | |
parent | 996d5c59006cd970dd3a9007aa1f76532909bae2 (diff) |
drm/radeon/kms: allocate vram scratch page on 6xx+
The vram scratch was originally only used on some 7xx asics
to work around a hw bug. Allocate the scratch page on all 6xx+
radeons and set the MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR to point
to it. We shouldn't ever hit it since we limit the system
aperture to vram or vram and AGP, but better safe than sorry.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 60 |
1 files changed, 7 insertions, 53 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 87cc1feee3a..a09049d1590 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -282,7 +282,7 @@ static void rv770_mc_program(struct radeon_device *rdev) | |||
282 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | 282 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, |
283 | rdev->mc.vram_end >> 12); | 283 | rdev->mc.vram_end >> 12); |
284 | } | 284 | } |
285 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 285 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12); |
286 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; | 286 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
287 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 287 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
288 | WREG32(MC_VM_FB_LOCATION, tmp); | 288 | WREG32(MC_VM_FB_LOCATION, tmp); |
@@ -959,54 +959,6 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
959 | 959 | ||
960 | } | 960 | } |
961 | 961 | ||
962 | static int rv770_vram_scratch_init(struct radeon_device *rdev) | ||
963 | { | ||
964 | int r; | ||
965 | u64 gpu_addr; | ||
966 | |||
967 | if (rdev->vram_scratch.robj == NULL) { | ||
968 | r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, | ||
969 | PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, | ||
970 | &rdev->vram_scratch.robj); | ||
971 | if (r) { | ||
972 | return r; | ||
973 | } | ||
974 | } | ||
975 | |||
976 | r = radeon_bo_reserve(rdev->vram_scratch.robj, false); | ||
977 | if (unlikely(r != 0)) | ||
978 | return r; | ||
979 | r = radeon_bo_pin(rdev->vram_scratch.robj, | ||
980 | RADEON_GEM_DOMAIN_VRAM, &gpu_addr); | ||
981 | if (r) { | ||
982 | radeon_bo_unreserve(rdev->vram_scratch.robj); | ||
983 | return r; | ||
984 | } | ||
985 | r = radeon_bo_kmap(rdev->vram_scratch.robj, | ||
986 | (void **)&rdev->vram_scratch.ptr); | ||
987 | if (r) | ||
988 | radeon_bo_unpin(rdev->vram_scratch.robj); | ||
989 | radeon_bo_unreserve(rdev->vram_scratch.robj); | ||
990 | |||
991 | return r; | ||
992 | } | ||
993 | |||
994 | static void rv770_vram_scratch_fini(struct radeon_device *rdev) | ||
995 | { | ||
996 | int r; | ||
997 | |||
998 | if (rdev->vram_scratch.robj == NULL) { | ||
999 | return; | ||
1000 | } | ||
1001 | r = radeon_bo_reserve(rdev->vram_scratch.robj, false); | ||
1002 | if (likely(r == 0)) { | ||
1003 | radeon_bo_kunmap(rdev->vram_scratch.robj); | ||
1004 | radeon_bo_unpin(rdev->vram_scratch.robj); | ||
1005 | radeon_bo_unreserve(rdev->vram_scratch.robj); | ||
1006 | } | ||
1007 | radeon_bo_unref(&rdev->vram_scratch.robj); | ||
1008 | } | ||
1009 | |||
1010 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) | 962 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) |
1011 | { | 963 | { |
1012 | u64 size_bf, size_af; | 964 | u64 size_bf, size_af; |
@@ -1106,6 +1058,10 @@ static int rv770_startup(struct radeon_device *rdev) | |||
1106 | } | 1058 | } |
1107 | } | 1059 | } |
1108 | 1060 | ||
1061 | r = r600_vram_scratch_init(rdev); | ||
1062 | if (r) | ||
1063 | return r; | ||
1064 | |||
1109 | rv770_mc_program(rdev); | 1065 | rv770_mc_program(rdev); |
1110 | if (rdev->flags & RADEON_IS_AGP) { | 1066 | if (rdev->flags & RADEON_IS_AGP) { |
1111 | rv770_agp_enable(rdev); | 1067 | rv770_agp_enable(rdev); |
@@ -1114,9 +1070,7 @@ static int rv770_startup(struct radeon_device *rdev) | |||
1114 | if (r) | 1070 | if (r) |
1115 | return r; | 1071 | return r; |
1116 | } | 1072 | } |
1117 | r = rv770_vram_scratch_init(rdev); | 1073 | |
1118 | if (r) | ||
1119 | return r; | ||
1120 | rv770_gpu_init(rdev); | 1074 | rv770_gpu_init(rdev); |
1121 | r = r600_blit_init(rdev); | 1075 | r = r600_blit_init(rdev); |
1122 | if (r) { | 1076 | if (r) { |
@@ -1316,7 +1270,7 @@ void rv770_fini(struct radeon_device *rdev) | |||
1316 | radeon_ib_pool_fini(rdev); | 1270 | radeon_ib_pool_fini(rdev); |
1317 | radeon_irq_kms_fini(rdev); | 1271 | radeon_irq_kms_fini(rdev); |
1318 | rv770_pcie_gart_fini(rdev); | 1272 | rv770_pcie_gart_fini(rdev); |
1319 | rv770_vram_scratch_fini(rdev); | 1273 | r600_vram_scratch_fini(rdev); |
1320 | radeon_gem_fini(rdev); | 1274 | radeon_gem_fini(rdev); |
1321 | radeon_fence_driver_fini(rdev); | 1275 | radeon_fence_driver_fini(rdev); |
1322 | radeon_agp_fini(rdev); | 1276 | radeon_agp_fini(rdev); |