diff options
author | Dave Airlie <airlied@redhat.com> | 2017-04-06 15:41:42 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-04-06 15:49:12 -0400 |
commit | 0168778115687486575a6831df865dbc4f5369fe (patch) | |
tree | 29a3f1e3348f1ddbc9924611fa0cad738507ba64 /drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | |
parent | aed93ee7d03eac9b7d21f08aebe8a7d9ea069e20 (diff) | |
parent | f4e7c7c1b4ed4c28caf679bc94ca5aa096310c10 (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.c | 17 |
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; |