aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2014-08-28 02:56:00 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-09-10 11:29:45 -0400
commitc858403943886a92eece9d0413aa65c48bbe6fa7 (patch)
treea259ede5ad9d773075b868e9bd28fbd4e2ae75cb
parentfdcaa1dbb7c6ed419b10fb8cdb5001ab0a00538f (diff)
drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
This flag is a hint that userspace expects the BO to be accessed by the CPU. We can use that hint to prevent such BOs from ever being stored in the CPU inaccessible part of VRAM. Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c11
-rw-r--r--include/uapi/drm/radeon_drm.h2
2 files changed, 11 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index aadbd36e64b9..eef60aaf4e64 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -144,7 +144,12 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
144 144
145 for (i = 0; i < c; ++i) { 145 for (i = 0; i < c; ++i) {
146 rbo->placements[i].fpfn = 0; 146 rbo->placements[i].fpfn = 0;
147 rbo->placements[i].lpfn = 0; 147 if ((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
148 (rbo->placements[i].flags & TTM_PL_FLAG_VRAM))
149 rbo->placements[i].lpfn =
150 rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
151 else
152 rbo->placements[i].lpfn = 0;
148 } 153 }
149 154
150 /* 155 /*
@@ -152,7 +157,9 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
152 * improve fragmentation quality. 157 * improve fragmentation quality.
153 * 512kb was measured as the most optimal number. 158 * 512kb was measured as the most optimal number.
154 */ 159 */
155 if (rbo->tbo.mem.size > 512 * 1024) { 160 if (!((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
161 (rbo->placements[i].flags & TTM_PL_FLAG_VRAM)) &&
162 rbo->tbo.mem.size > 512 * 1024) {
156 for (i = 0; i < c; i++) { 163 for (i = 0; i < c; i++) {
157 rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN; 164 rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
158 } 165 }
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index 375b6e656c54..f755f20d2b5c 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -801,6 +801,8 @@ struct drm_radeon_gem_info {
801#define RADEON_GEM_NO_BACKING_STORE (1 << 0) 801#define RADEON_GEM_NO_BACKING_STORE (1 << 0)
802#define RADEON_GEM_GTT_UC (1 << 1) 802#define RADEON_GEM_GTT_UC (1 << 1)
803#define RADEON_GEM_GTT_WC (1 << 2) 803#define RADEON_GEM_GTT_WC (1 << 2)
804/* BO is expected to be accessed by the CPU */
805#define RADEON_GEM_CPU_ACCESS (1 << 3)
804 806
805struct drm_radeon_gem_create { 807struct drm_radeon_gem_create {
806 uint64_t size; 808 uint64_t size;