aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-04-06 15:41:42 -0400
committerDave Airlie <airlied@redhat.com>2017-04-06 15:49:12 -0400
commit0168778115687486575a6831df865dbc4f5369fe (patch)
tree29a3f1e3348f1ddbc9924611fa0cad738507ba64 /drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
parentaed93ee7d03eac9b7d21f08aebe8a7d9ea069e20 (diff)
parentf4e7c7c1b4ed4c28caf679bc94ca5aa096310c10 (diff)
Merge branch 'drm-next-4.12' of git://people.freedesktop.org/~agd5f/linux into drm-next
A few more things for 4.12: - ttm and amdgpu support for non-contiguous vram CPU mappings - lots of bug fixes and cleanups for vega10 - misc bug fixes and code cleanups [airlied: fix do_div error on 32-bit arm, not sure it's 100% correct] * 'drm-next-4.12' of git://people.freedesktop.org/~agd5f/linux: (58 commits) drm/amdgpu: use uintptr_t instead of unsigned long to store pointer drm/amdgpu: Avoid using signed integer to store pointer value drm/amdgpu:invoke new implemented AI MB func drm/amdgpu/vega10:timeout set to equal with VI drm/amdgpu:implement the reset MB func for vega10 drm/amdgpu:fix typo for mxgpu_ai drm/amdgpu:no need to involv HDP in KIQ drm/amdgpu:add PSP block only load_type=PSP (v2) drm/amdgpu/smu9: update to latest driver interface drm/amd/amdgpu: cleanup gfx_v9_0_gpu_init() drm/amd/amdgpu: cleanup gfx_v9_0_rlc_reset() drm/amd/amdgpu: cleanup gfx_v9_0_rlc_start() drm/amd/amdgpu: simplify gfx_v9_0_cp_gfx_enable() drm/amd/amdgpu: cleanup gfx_v9_0_kiq_init_register() drm/amd/amdgpu: Drop gfx_v9_0_print_status() drm/amd/amdgpu: cleanup gfx_v9_0_set_gfx_eop_interrupt_state() drm/amd/amdgpu: cleanup gfx_v9_0_set_priv_reg_fault_state() drm/amd/amdgpu: cleanup gfx_v9_0_set_priv_inst_fault_state() drm/amd/amdgpu: cleanup gfx_v9_0_init_queue() drm/amdgpu: Move function amdgpu_has_atpx near other similar functions ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
index 9e577e3d3147..a4831fe0223b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -93,7 +93,6 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
93 const struct ttm_place *place, 93 const struct ttm_place *place,
94 struct ttm_mem_reg *mem) 94 struct ttm_mem_reg *mem)
95{ 95{
96 struct amdgpu_bo *bo = container_of(tbo, struct amdgpu_bo, tbo);
97 struct amdgpu_vram_mgr *mgr = man->priv; 96 struct amdgpu_vram_mgr *mgr = man->priv;
98 struct drm_mm *mm = &mgr->mm; 97 struct drm_mm *mm = &mgr->mm;
99 struct drm_mm_node *nodes; 98 struct drm_mm_node *nodes;
@@ -106,8 +105,8 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
106 if (!lpfn) 105 if (!lpfn)
107 lpfn = man->size; 106 lpfn = man->size;
108 107
109 if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS || 108 if (place->flags & TTM_PL_FLAG_CONTIGUOUS ||
110 place->lpfn || amdgpu_vram_page_split == -1) { 109 amdgpu_vram_page_split == -1) {
111 pages_per_node = ~0ul; 110 pages_per_node = ~0ul;
112 num_nodes = 1; 111 num_nodes = 1;
113 } else { 112 } else {
@@ -124,12 +123,14 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
124 if (place->flags & TTM_PL_FLAG_TOPDOWN) 123 if (place->flags & TTM_PL_FLAG_TOPDOWN)
125 mode = DRM_MM_INSERT_HIGH; 124 mode = DRM_MM_INSERT_HIGH;
126 125
126 mem->start = 0;
127 pages_left = mem->num_pages; 127 pages_left = mem->num_pages;
128 128
129 spin_lock(&mgr->lock); 129 spin_lock(&mgr->lock);
130 for (i = 0; i < num_nodes; ++i) { 130 for (i = 0; i < num_nodes; ++i) {
131 unsigned long pages = min(pages_left, pages_per_node); 131 unsigned long pages = min(pages_left, pages_per_node);
132 uint32_t alignment = mem->page_alignment; 132 uint32_t alignment = mem->page_alignment;
133 unsigned long start;
133 134
134 if (pages == pages_per_node) 135 if (pages == pages_per_node)
135 alignment = pages_per_node; 136 alignment = pages_per_node;
@@ -141,11 +142,19 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man,
141 if (unlikely(r)) 142 if (unlikely(r))
142 goto error; 143 goto error;
143 144
145 /* Calculate a virtual BO start address to easily check if
146 * everything is CPU accessible.
147 */
148 start = nodes[i].start + nodes[i].size;
149 if (start > mem->num_pages)
150 start -= mem->num_pages;
151 else
152 start = 0;
153 mem->start = max(mem->start, start);
144 pages_left -= pages; 154 pages_left -= pages;
145 } 155 }
146 spin_unlock(&mgr->lock); 156 spin_unlock(&mgr->lock);
147 157
148 mem->start = num_nodes == 1 ? nodes[0].start : AMDGPU_BO_INVALID_OFFSET;
149 mem->mm_node = nodes; 158 mem->mm_node = nodes;
150 159
151 return 0; 160 return 0;