aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/vmwgfx/ttm_object.c2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c8
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c20
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c27
5 files changed, 35 insertions, 24 deletions
diff --git a/drivers/gpu/drm/vmwgfx/ttm_object.c b/drivers/gpu/drm/vmwgfx/ttm_object.c
index 36990b80e790..16077785ad47 100644
--- a/drivers/gpu/drm/vmwgfx/ttm_object.c
+++ b/drivers/gpu/drm/vmwgfx/ttm_object.c
@@ -174,7 +174,7 @@ int ttm_base_object_init(struct ttm_object_file *tfile,
174 kref_init(&base->refcount); 174 kref_init(&base->refcount);
175 idr_preload(GFP_KERNEL); 175 idr_preload(GFP_KERNEL);
176 spin_lock(&tdev->object_lock); 176 spin_lock(&tdev->object_lock);
177 ret = idr_alloc(&tdev->idr, base, 0, 0, GFP_NOWAIT); 177 ret = idr_alloc(&tdev->idr, base, 1, 0, GFP_NOWAIT);
178 spin_unlock(&tdev->object_lock); 178 spin_unlock(&tdev->object_lock);
179 idr_preload_end(); 179 idr_preload_end();
180 if (ret < 0) 180 if (ret < 0)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index bf6c3500d363..4ff11a0077e1 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -1239,7 +1239,13 @@ static int vmw_master_set(struct drm_device *dev,
1239 } 1239 }
1240 1240
1241 dev_priv->active_master = vmaster; 1241 dev_priv->active_master = vmaster;
1242 drm_sysfs_hotplug_event(dev); 1242
1243 /*
1244 * Inform a new master that the layout may have changed while
1245 * it was gone.
1246 */
1247 if (!from_open)
1248 drm_sysfs_hotplug_event(dev);
1243 1249
1244 return 0; 1250 return 0;
1245} 1251}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 96983c47fb40..366dcfc1f9bb 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -296,7 +296,7 @@ struct vmw_sg_table {
296struct vmw_piter { 296struct vmw_piter {
297 struct page **pages; 297 struct page **pages;
298 const dma_addr_t *addrs; 298 const dma_addr_t *addrs;
299 struct sg_page_iter iter; 299 struct sg_dma_page_iter iter;
300 unsigned long i; 300 unsigned long i;
301 unsigned long num_pages; 301 unsigned long num_pages;
302 bool (*next)(struct vmw_piter *); 302 bool (*next)(struct vmw_piter *);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
index 2ff7ba04d8c8..33533d126277 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
@@ -2010,6 +2010,11 @@ static int vmw_cmd_set_shader(struct vmw_private *dev_priv,
2010 return 0; 2010 return 0;
2011 2011
2012 if (cmd->body.shid != SVGA3D_INVALID_ID) { 2012 if (cmd->body.shid != SVGA3D_INVALID_ID) {
2013 /*
2014 * This is the compat shader path - Per device guest-backed
2015 * shaders, but user-space thinks it's per context host-
2016 * backed shaders.
2017 */
2013 res = vmw_shader_lookup(vmw_context_res_man(ctx), 2018 res = vmw_shader_lookup(vmw_context_res_man(ctx),
2014 cmd->body.shid, cmd->body.type); 2019 cmd->body.shid, cmd->body.type);
2015 if (!IS_ERR(res)) { 2020 if (!IS_ERR(res)) {
@@ -2017,6 +2022,14 @@ static int vmw_cmd_set_shader(struct vmw_private *dev_priv,
2017 VMW_RES_DIRTY_NONE); 2022 VMW_RES_DIRTY_NONE);
2018 if (unlikely(ret != 0)) 2023 if (unlikely(ret != 0))
2019 return ret; 2024 return ret;
2025
2026 ret = vmw_resource_relocation_add
2027 (sw_context, res,
2028 vmw_ptr_diff(sw_context->buf_start,
2029 &cmd->body.shid),
2030 vmw_res_rel_normal);
2031 if (unlikely(ret != 0))
2032 return ret;
2020 } 2033 }
2021 } 2034 }
2022 2035
@@ -2193,7 +2206,8 @@ static int vmw_cmd_dx_set_shader(struct vmw_private *dev_priv,
2193 2206
2194 cmd = container_of(header, typeof(*cmd), header); 2207 cmd = container_of(header, typeof(*cmd), header);
2195 2208
2196 if (cmd->body.type >= SVGA3D_SHADERTYPE_DX10_MAX) { 2209 if (cmd->body.type >= SVGA3D_SHADERTYPE_DX10_MAX ||
2210 cmd->body.type < SVGA3D_SHADERTYPE_MIN) {
2197 VMW_DEBUG_USER("Illegal shader type %u.\n", 2211 VMW_DEBUG_USER("Illegal shader type %u.\n",
2198 (unsigned int) cmd->body.type); 2212 (unsigned int) cmd->body.type);
2199 return -EINVAL; 2213 return -EINVAL;
@@ -2414,6 +2428,10 @@ static int vmw_cmd_dx_view_define(struct vmw_private *dev_priv,
2414 return -EINVAL; 2428 return -EINVAL;
2415 2429
2416 cmd = container_of(header, typeof(*cmd), header); 2430 cmd = container_of(header, typeof(*cmd), header);
2431 if (unlikely(cmd->sid == SVGA3D_INVALID_ID)) {
2432 VMW_DEBUG_USER("Invalid surface id.\n");
2433 return -EINVAL;
2434 }
2417 ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface, 2435 ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
2418 VMW_RES_DIRTY_NONE, user_surface_converter, 2436 VMW_RES_DIRTY_NONE, user_surface_converter,
2419 &cmd->sid, &srf); 2437 &cmd->sid, &srf);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
index a3357ff7540d..a6ea75b58a83 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
@@ -266,7 +266,9 @@ static bool __vmw_piter_non_sg_next(struct vmw_piter *viter)
266 266
267static bool __vmw_piter_sg_next(struct vmw_piter *viter) 267static bool __vmw_piter_sg_next(struct vmw_piter *viter)
268{ 268{
269 return __sg_page_iter_next(&viter->iter); 269 bool ret = __vmw_piter_non_sg_next(viter);
270
271 return __sg_page_iter_dma_next(&viter->iter) && ret;
270} 272}
271 273
272 274
@@ -284,12 +286,6 @@ static struct page *__vmw_piter_non_sg_page(struct vmw_piter *viter)
284 return viter->pages[viter->i]; 286 return viter->pages[viter->i];
285} 287}
286 288
287static struct page *__vmw_piter_sg_page(struct vmw_piter *viter)
288{
289 return sg_page_iter_page(&viter->iter);
290}
291
292
293/** 289/**
294 * Helper functions to return the DMA address of the current page. 290 * Helper functions to return the DMA address of the current page.
295 * 291 *
@@ -311,13 +307,7 @@ static dma_addr_t __vmw_piter_dma_addr(struct vmw_piter *viter)
311 307
312static dma_addr_t __vmw_piter_sg_addr(struct vmw_piter *viter) 308static dma_addr_t __vmw_piter_sg_addr(struct vmw_piter *viter)
313{ 309{
314 /* 310 return sg_page_iter_dma_address(&viter->iter);
315 * FIXME: This driver wrongly mixes DMA and CPU SG list iteration and
316 * needs revision. See
317 * https://lore.kernel.org/lkml/20190104223531.GA1705@ziepe.ca/
318 */
319 return sg_page_iter_dma_address(
320 container_of(&viter->iter, struct sg_dma_page_iter, base));
321} 311}
322 312
323 313
@@ -336,26 +326,23 @@ void vmw_piter_start(struct vmw_piter *viter, const struct vmw_sg_table *vsgt,
336{ 326{
337 viter->i = p_offset - 1; 327 viter->i = p_offset - 1;
338 viter->num_pages = vsgt->num_pages; 328 viter->num_pages = vsgt->num_pages;
329 viter->page = &__vmw_piter_non_sg_page;
330 viter->pages = vsgt->pages;
339 switch (vsgt->mode) { 331 switch (vsgt->mode) {
340 case vmw_dma_phys: 332 case vmw_dma_phys:
341 viter->next = &__vmw_piter_non_sg_next; 333 viter->next = &__vmw_piter_non_sg_next;
342 viter->dma_address = &__vmw_piter_phys_addr; 334 viter->dma_address = &__vmw_piter_phys_addr;
343 viter->page = &__vmw_piter_non_sg_page;
344 viter->pages = vsgt->pages;
345 break; 335 break;
346 case vmw_dma_alloc_coherent: 336 case vmw_dma_alloc_coherent:
347 viter->next = &__vmw_piter_non_sg_next; 337 viter->next = &__vmw_piter_non_sg_next;
348 viter->dma_address = &__vmw_piter_dma_addr; 338 viter->dma_address = &__vmw_piter_dma_addr;
349 viter->page = &__vmw_piter_non_sg_page;
350 viter->addrs = vsgt->addrs; 339 viter->addrs = vsgt->addrs;
351 viter->pages = vsgt->pages;
352 break; 340 break;
353 case vmw_dma_map_populate: 341 case vmw_dma_map_populate:
354 case vmw_dma_map_bind: 342 case vmw_dma_map_bind:
355 viter->next = &__vmw_piter_sg_next; 343 viter->next = &__vmw_piter_sg_next;
356 viter->dma_address = &__vmw_piter_sg_addr; 344 viter->dma_address = &__vmw_piter_sg_addr;
357 viter->page = &__vmw_piter_sg_page; 345 __sg_page_iter_start(&viter->iter.base, vsgt->sgt->sgl,
358 __sg_page_iter_start(&viter->iter, vsgt->sgt->sgl,
359 vsgt->sgt->orig_nents, p_offset); 346 vsgt->sgt->orig_nents, p_offset);
360 break; 347 break;
361 default: 348 default: