diff options
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/ttm_object.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 27 |
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 { | |||
| 296 | struct vmw_piter { | 296 | struct 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 | ||
| 267 | static bool __vmw_piter_sg_next(struct vmw_piter *viter) | 267 | static 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 | ||
| 287 | static 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 | ||
| 312 | static dma_addr_t __vmw_piter_sg_addr(struct vmw_piter *viter) | 308 | static 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: |
