Message ID | 20200921144856.2797-5-christian.koenig@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [01/11] drm/ttm: add ttm_bo_pin()/ttm_bo_unpin() | expand |
Hi Am 21.09.20 um 16:48 schrieb Christian König: > Implement in the driver instead since it is the only user of that function. Maybe merge this patch with patch 10. Best regards Thomas > > Signed-off-by: Christian König <christian.koenig@amd.com> > --- > drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 42 ++++++++++++++++++++++ > drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c | 6 ++-- > drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 4 +++ > drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 8 ++--- > 4 files changed, 52 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c > index 813f1b148094..30d19b45b602 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c > @@ -487,6 +487,48 @@ static void vmw_user_bo_destroy(struct ttm_buffer_object *bo) > ttm_prime_object_kfree(vmw_user_bo, prime); > } > > +/** > + * vmw_bo_create_kernel - Create a pinned BO for internal kernel use. > + * > + * @dev_priv: Pointer to the device private struct > + * @size: size of the BO we need > + * @placement: where to put it > + * @p_bo: resulting BO > + * > + * Creates and pin a simple BO for in kernel use. > + */ > +int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size, > + struct ttm_placement *placement, > + struct ttm_buffer_object **p_bo) > +{ > + unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT; > + struct ttm_buffer_object *bo; > + size_t acc_size; > + int ret; > + > + bo = kzalloc(sizeof(*bo), GFP_KERNEL); > + if (unlikely(!bo)) > + return -ENOMEM; > + > + acc_size = ttm_round_pot(sizeof(*bo)); > + acc_size += ttm_round_pot(npages * sizeof(void *)); > + acc_size += ttm_round_pot(sizeof(struct ttm_tt)); > + ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size, > + ttm_bo_type_device, placement, 0, > + false, acc_size, NULL, NULL, NULL); > + if (unlikely(ret)) > + goto error_free; > + > + ttm_bo_pin(bo); > + ttm_bo_unreserve(bo); > + *p_bo = bo; > + > + return 0; > + > +error_free: > + kfree(bo); > + return ret; > +} > > /** > * vmw_bo_init - Initialize a vmw buffer object > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c > index 3b41cf63110a..9a9fe10d829b 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c > @@ -1245,9 +1245,9 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, > !dev_priv->has_mob) > return -ENOMEM; > > - ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device, > - &vmw_mob_ne_placement, 0, false, > - &man->cmd_space); > + ret = vmw_bo_create_kernel(dev_priv, size, > + &vmw_mob_placement, > + &man->cmd_space); > if (ret) > return ret; > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h > index 9ceee4eb0b13..5d07de5183e1 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h > @@ -845,6 +845,10 @@ extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf, > SVGAGuestPtr *ptr); > extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin); > extern void vmw_bo_bo_free(struct ttm_buffer_object *bo); > +extern int vmw_bo_create_kernel(struct vmw_private *dev_priv, > + unsigned long size, > + struct ttm_placement *placement, > + struct ttm_buffer_object **p_bo); > extern int vmw_bo_init(struct vmw_private *dev_priv, > struct vmw_buffer_object *vmw_bo, > size_t size, struct ttm_placement *placement, > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c > index d7ea658e9910..39a2f720f4ed 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c > @@ -793,11 +793,9 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv, > struct ttm_buffer_object *bo; > int ret; > > - ret = ttm_bo_create(&dev_priv->bdev, bo_size, > - ttm_bo_type_device, > - &vmw_sys_ne_placement, > - 0, false, &bo); > - > + ret = vmw_bo_create_kernel(dev_priv, bo_size, > + &vmw_sys_placement, > + &bo); > if (unlikely(ret != 0)) > return ret; > >
Am 22.09.20 um 08:45 schrieb Thomas Zimmermann: > Hi > > Am 21.09.20 um 16:48 schrieb Christian König: >> Implement in the driver instead since it is the only user of that function. > Maybe merge this patch with patch 10. That's how I initially did it as well, but then found a number of bugs in the VMware patches and so thought it would be better to separate it (less code to revert and double check). Regards, Christian. > > Best regards > Thomas > >> Signed-off-by: Christian König <christian.koenig@amd.com> >> --- >> drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 42 ++++++++++++++++++++++ >> drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c | 6 ++-- >> drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 4 +++ >> drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 8 ++--- >> 4 files changed, 52 insertions(+), 8 deletions(-) >> >> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >> index 813f1b148094..30d19b45b602 100644 >> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >> @@ -487,6 +487,48 @@ static void vmw_user_bo_destroy(struct ttm_buffer_object *bo) >> ttm_prime_object_kfree(vmw_user_bo, prime); >> } >> >> +/** >> + * vmw_bo_create_kernel - Create a pinned BO for internal kernel use. >> + * >> + * @dev_priv: Pointer to the device private struct >> + * @size: size of the BO we need >> + * @placement: where to put it >> + * @p_bo: resulting BO >> + * >> + * Creates and pin a simple BO for in kernel use. >> + */ >> +int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size, >> + struct ttm_placement *placement, >> + struct ttm_buffer_object **p_bo) >> +{ >> + unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT; >> + struct ttm_buffer_object *bo; >> + size_t acc_size; >> + int ret; >> + >> + bo = kzalloc(sizeof(*bo), GFP_KERNEL); >> + if (unlikely(!bo)) >> + return -ENOMEM; >> + >> + acc_size = ttm_round_pot(sizeof(*bo)); >> + acc_size += ttm_round_pot(npages * sizeof(void *)); >> + acc_size += ttm_round_pot(sizeof(struct ttm_tt)); >> + ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size, >> + ttm_bo_type_device, placement, 0, >> + false, acc_size, NULL, NULL, NULL); >> + if (unlikely(ret)) >> + goto error_free; >> + >> + ttm_bo_pin(bo); >> + ttm_bo_unreserve(bo); >> + *p_bo = bo; >> + >> + return 0; >> + >> +error_free: >> + kfree(bo); >> + return ret; >> +} >> >> /** >> * vmw_bo_init - Initialize a vmw buffer object >> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c >> index 3b41cf63110a..9a9fe10d829b 100644 >> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c >> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c >> @@ -1245,9 +1245,9 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, >> !dev_priv->has_mob) >> return -ENOMEM; >> >> - ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device, >> - &vmw_mob_ne_placement, 0, false, >> - &man->cmd_space); >> + ret = vmw_bo_create_kernel(dev_priv, size, >> + &vmw_mob_placement, >> + &man->cmd_space); >> if (ret) >> return ret; >> >> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h >> index 9ceee4eb0b13..5d07de5183e1 100644 >> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h >> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h >> @@ -845,6 +845,10 @@ extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf, >> SVGAGuestPtr *ptr); >> extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin); >> extern void vmw_bo_bo_free(struct ttm_buffer_object *bo); >> +extern int vmw_bo_create_kernel(struct vmw_private *dev_priv, >> + unsigned long size, >> + struct ttm_placement *placement, >> + struct ttm_buffer_object **p_bo); >> extern int vmw_bo_init(struct vmw_private *dev_priv, >> struct vmw_buffer_object *vmw_bo, >> size_t size, struct ttm_placement *placement, >> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >> index d7ea658e9910..39a2f720f4ed 100644 >> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >> @@ -793,11 +793,9 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv, >> struct ttm_buffer_object *bo; >> int ret; >> >> - ret = ttm_bo_create(&dev_priv->bdev, bo_size, >> - ttm_bo_type_device, >> - &vmw_sys_ne_placement, >> - 0, false, &bo); >> - >> + ret = vmw_bo_create_kernel(dev_priv, bo_size, >> + &vmw_sys_placement, >> + &bo); >> if (unlikely(ret != 0)) >> return ret; >> >>
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c index 813f1b148094..30d19b45b602 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c @@ -487,6 +487,48 @@ static void vmw_user_bo_destroy(struct ttm_buffer_object *bo) ttm_prime_object_kfree(vmw_user_bo, prime); } +/** + * vmw_bo_create_kernel - Create a pinned BO for internal kernel use. + * + * @dev_priv: Pointer to the device private struct + * @size: size of the BO we need + * @placement: where to put it + * @p_bo: resulting BO + * + * Creates and pin a simple BO for in kernel use. + */ +int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size, + struct ttm_placement *placement, + struct ttm_buffer_object **p_bo) +{ + unsigned npages = PAGE_ALIGN(size) >> PAGE_SHIFT; + struct ttm_buffer_object *bo; + size_t acc_size; + int ret; + + bo = kzalloc(sizeof(*bo), GFP_KERNEL); + if (unlikely(!bo)) + return -ENOMEM; + + acc_size = ttm_round_pot(sizeof(*bo)); + acc_size += ttm_round_pot(npages * sizeof(void *)); + acc_size += ttm_round_pot(sizeof(struct ttm_tt)); + ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size, + ttm_bo_type_device, placement, 0, + false, acc_size, NULL, NULL, NULL); + if (unlikely(ret)) + goto error_free; + + ttm_bo_pin(bo); + ttm_bo_unreserve(bo); + *p_bo = bo; + + return 0; + +error_free: + kfree(bo); + return ret; +} /** * vmw_bo_init - Initialize a vmw buffer object diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c index 3b41cf63110a..9a9fe10d829b 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c @@ -1245,9 +1245,9 @@ int vmw_cmdbuf_set_pool_size(struct vmw_cmdbuf_man *man, !dev_priv->has_mob) return -ENOMEM; - ret = ttm_bo_create(&dev_priv->bdev, size, ttm_bo_type_device, - &vmw_mob_ne_placement, 0, false, - &man->cmd_space); + ret = vmw_bo_create_kernel(dev_priv, size, + &vmw_mob_placement, + &man->cmd_space); if (ret) return ret; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 9ceee4eb0b13..5d07de5183e1 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h @@ -845,6 +845,10 @@ extern void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *buf, SVGAGuestPtr *ptr); extern void vmw_bo_pin_reserved(struct vmw_buffer_object *bo, bool pin); extern void vmw_bo_bo_free(struct ttm_buffer_object *bo); +extern int vmw_bo_create_kernel(struct vmw_private *dev_priv, + unsigned long size, + struct ttm_placement *placement, + struct ttm_buffer_object **p_bo); extern int vmw_bo_init(struct vmw_private *dev_priv, struct vmw_buffer_object *vmw_bo, size_t size, struct ttm_placement *placement, diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c index d7ea658e9910..39a2f720f4ed 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c @@ -793,11 +793,9 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv, struct ttm_buffer_object *bo; int ret; - ret = ttm_bo_create(&dev_priv->bdev, bo_size, - ttm_bo_type_device, - &vmw_sys_ne_placement, - 0, false, &bo); - + ret = vmw_bo_create_kernel(dev_priv, bo_size, + &vmw_sys_placement, + &bo); if (unlikely(ret != 0)) return ret;
Implement in the driver instead since it is the only user of that function. Signed-off-by: Christian König <christian.koenig@amd.com> --- drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 42 ++++++++++++++++++++++ drivers/gpu/drm/vmwgfx/vmwgfx_cmdbuf.c | 6 ++-- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 4 +++ drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 8 ++--- 4 files changed, 52 insertions(+), 8 deletions(-)