diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-21 23:32:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-21 23:32:09 -0400 |
commit | 1cfea546b10c8fec218973c3f3c39ff797a3e50c (patch) | |
tree | d2aa389291efa4d5552baa2502706a8a95c30ca6 /drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | |
parent | 27db64f65f1be2f2ee741a1bf20d8d13d62c167f (diff) | |
parent | f3294568bbb19cbfc53451de192df6daae80f9b3 (diff) |
Merge tag 'drm-fixes-2018-06-22' of git://anongit.freedesktop.org/drm/drm
Pull drm fixes from Dave Airlie:
"Just run of the mill fixes,
core:
- regression fix in device unplug
qxl:
- regression fix for might sleep in cursor handling
nouveau:
- regression fix in multi-screen cursor handling
amdgpu:
- switch off DC by default on Kaveri and older
- some minor fixes
i915:
- some GEM regression fixes
- doublescan mode fixes
sun4i:
- revert fix for a regression
sii8620 bridge:
- misc fixes"
* tag 'drm-fixes-2018-06-22' of git://anongit.freedesktop.org/drm/drm: (28 commits)
drm/bridge/sii8620: fix display of packed pixel modes in MHL2
drm/amdgpu: Make amdgpu_vram_mgr_bo_invisible_size always accurate
drm/amdgpu: Refactor amdgpu_vram_mgr_bo_invisible_size helper
drm/amdgpu: Update pin_size values before unpinning BO
drm/amdgpu:All UVD instances share one idle_work handle
drm/amdgpu: Don't default to DC support for Kaveri and older
drm/amdgpu: Use kvmalloc_array for allocating VRAM manager nodes array
drm/amd/pp: Fix uninitialized variable
drm/i915: Enable provoking vertex fix on Gen9 systems.
drm/i915: Fix context ban and hang accounting for client
drm/i915: Turn off g4x DP port in .post_disable()
drm/i915: Disallow interlaced modes on g4x DP outputs
drm/i915: Fix PIPESTAT irq ack on i965/g4x
drm/i915: Allow DBLSCAN user modes with eDP/LVDS/DSI
drm/i915/execlists: Avoid putting the error pointer
drm/i915: Apply batch location restrictions before pinning
drm/nouveau/kms/nv50-: cursors always use core channel vram ctxdma
Revert "drm/sun4i: Handle DRM_BUS_FLAG_PIXDATA_*EDGE"
drm/atmel-hlcdc: check stride values in the first plane
drm/bridge/sii8620: fix HDMI cable connection to dongle
...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 9aca653bec07..b6333f92ba45 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | |||
@@ -97,6 +97,38 @@ static u64 amdgpu_vram_mgr_vis_size(struct amdgpu_device *adev, | |||
97 | } | 97 | } |
98 | 98 | ||
99 | /** | 99 | /** |
100 | * amdgpu_vram_mgr_bo_invisible_size - CPU invisible BO size | ||
101 | * | ||
102 | * @bo: &amdgpu_bo buffer object (must be in VRAM) | ||
103 | * | ||
104 | * Returns: | ||
105 | * How much of the given &amdgpu_bo buffer object lies in CPU invisible VRAM. | ||
106 | */ | ||
107 | u64 amdgpu_vram_mgr_bo_invisible_size(struct amdgpu_bo *bo) | ||
108 | { | ||
109 | struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); | ||
110 | struct ttm_mem_reg *mem = &bo->tbo.mem; | ||
111 | struct drm_mm_node *nodes = mem->mm_node; | ||
112 | unsigned pages = mem->num_pages; | ||
113 | u64 usage = 0; | ||
114 | |||
115 | if (adev->gmc.visible_vram_size == adev->gmc.real_vram_size) | ||
116 | return 0; | ||
117 | |||
118 | if (mem->start >= adev->gmc.visible_vram_size >> PAGE_SHIFT) | ||
119 | return amdgpu_bo_size(bo); | ||
120 | |||
121 | while (nodes && pages) { | ||
122 | usage += nodes->size << PAGE_SHIFT; | ||
123 | usage -= amdgpu_vram_mgr_vis_size(adev, nodes); | ||
124 | pages -= nodes->size; | ||
125 | ++nodes; | ||
126 | } | ||
127 | |||
128 | return usage; | ||
129 | } | ||
130 | |||
131 | /** | ||
100 | * amdgpu_vram_mgr_new - allocate new ranges | 132 | * amdgpu_vram_mgr_new - allocate new ranges |
101 | * | 133 | * |
102 | * @man: TTM memory type manager | 134 | * @man: TTM memory type manager |
@@ -135,7 +167,8 @@ static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, | |||
135 | num_nodes = DIV_ROUND_UP(mem->num_pages, pages_per_node); | 167 | num_nodes = DIV_ROUND_UP(mem->num_pages, pages_per_node); |
136 | } | 168 | } |
137 | 169 | ||
138 | nodes = kcalloc(num_nodes, sizeof(*nodes), GFP_KERNEL); | 170 | nodes = kvmalloc_array(num_nodes, sizeof(*nodes), |
171 | GFP_KERNEL | __GFP_ZERO); | ||
139 | if (!nodes) | 172 | if (!nodes) |
140 | return -ENOMEM; | 173 | return -ENOMEM; |
141 | 174 | ||
@@ -190,7 +223,7 @@ error: | |||
190 | drm_mm_remove_node(&nodes[i]); | 223 | drm_mm_remove_node(&nodes[i]); |
191 | spin_unlock(&mgr->lock); | 224 | spin_unlock(&mgr->lock); |
192 | 225 | ||
193 | kfree(nodes); | 226 | kvfree(nodes); |
194 | return r == -ENOSPC ? 0 : r; | 227 | return r == -ENOSPC ? 0 : r; |
195 | } | 228 | } |
196 | 229 | ||
@@ -229,7 +262,7 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, | |||
229 | atomic64_sub(usage, &mgr->usage); | 262 | atomic64_sub(usage, &mgr->usage); |
230 | atomic64_sub(vis_usage, &mgr->vis_usage); | 263 | atomic64_sub(vis_usage, &mgr->vis_usage); |
231 | 264 | ||
232 | kfree(mem->mm_node); | 265 | kvfree(mem->mm_node); |
233 | mem->mm_node = NULL; | 266 | mem->mm_node = NULL; |
234 | } | 267 | } |
235 | 268 | ||