[PATCH 1/3] drm/vram: Provide vmap and vunmap operations for GEM VRAM objects
Thomas Zimmermann
tzimmermann at suse.de
Wed Jul 24 16:55:00 UTC 2019
Hi
Am 24.07.19 um 14:00 schrieb Daniel Vetter:
> On Wed, Jul 24, 2019 at 1:30 PM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>>
>> The pattern of temporarily pinning and kmap-ing the BO's memory is
>> common enough to justify helper functions that do and undo these
>> operations.
>>
>> The implementation of vmap and vunmap for GEM VRAM helpers is
>> already in PRIME helpers. The patch moves the operations to separate
>> functions and exports them for general use.
>>
>> The patch also adds a note about possible kmap counting. So far this
>> isn't required by drivers, but more complex use cases might make it
>> necessary.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
>> ---
>> drivers/gpu/drm/drm_gem_vram_helper.c | 55 ++++++++++++++++++++++-----
>> include/drm/drm_gem_vram_helper.h | 12 ++++++
>> 2 files changed, 57 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
>> index e0fbfb6570cf..54758e4debca 100644
>> --- a/drivers/gpu/drm/drm_gem_vram_helper.c
>> +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
>> @@ -340,6 +340,48 @@ void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo)
>> }
>> EXPORT_SYMBOL(drm_gem_vram_kunmap);
>>
>> +/**
>> + * drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address
>> + space
>> + * @gem: The GEM VRAM object to map
>
> variable names need to match, kernel-doc should be complaining here.
>
>> + *
>> + * The vmap function pins a GEM VRAM object to it's current location, either
>> + * system or video memory, and maps it's buffer into kernel address space. As
>> + * pinned object cannot be reloacted, you should not permanently pin objects.
>
> Imo also good to point at the corresponding functions, i.e. reference
> unmap here and in the unmap function reference the map function. And
> please make sure the links work in the generated doc output.
>
>> + *
>> + * Returns:
>> + * The buffer's virtual address on success, or
>> + * an ERR_PTR()-encoded error code otherwise.
>> + */
>> +void *drm_gem_vram_vmap(struct drm_gem_vram_object *gbo)
>> +{
>> + int ret;
>> + void *base;
>> +
>> + ret = drm_gem_vram_pin(gbo, 0);
>> + if (ret)
>> + return ERR_PTR(ret);
>> + base = drm_gem_vram_kmap(gbo, true, NULL);
>> + if (IS_ERR(base)) {
>> + drm_gem_vram_unpin(gbo);
>> + return base;
>> + }
>> + return base;
>> +}
>> +EXPORT_SYMBOL(drm_gem_vram_vmap);
>> +
>> +/**
>> + * drm_gem_vram_vunmap() - Unmaps and unpins a GEM VRAM object
>> + * @gem: The GEM VRAM object to unmap
>> + * @vaddr: The mapping's base address
>> + */
>> +void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, void *vaddr)
>> +{
>> + drm_gem_vram_kunmap(gbo);
>> + drm_gem_vram_unpin(gbo);
>> +}
>> +EXPORT_SYMBOL(drm_gem_vram_vunmap);
>> +
>> /**
>> * drm_gem_vram_fill_create_dumb() - \
>> Helper for implementing &struct drm_driver.dumb_create
>> @@ -595,17 +637,11 @@ static void drm_gem_vram_object_unpin(struct drm_gem_object *gem)
>> static void *drm_gem_vram_object_vmap(struct drm_gem_object *gem)
>> {
>> struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
>> - int ret;
>> void *base;
>>
>> - ret = drm_gem_vram_pin(gbo, 0);
>> - if (ret)
>> + base = drm_gem_vram_vmap(gbo);
>> + if (IS_ERR(base))
>> return NULL;
>> - base = drm_gem_vram_kmap(gbo, true, NULL);
>> - if (IS_ERR(base)) {
>> - drm_gem_vram_unpin(gbo);
>> - return NULL;
>> - }
>> return base;
>> }
>>
>> @@ -620,8 +656,7 @@ static void drm_gem_vram_object_vunmap(struct drm_gem_object *gem,
>> {
>> struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem);
>>
>> - drm_gem_vram_kunmap(gbo);
>> - drm_gem_vram_unpin(gbo);
>> + drm_gem_vram_vunmap(gbo, vaddr);
>> }
>>
>> /*
>> diff --git a/include/drm/drm_gem_vram_helper.h b/include/drm/drm_gem_vram_helper.h
>> index b41d932eb53a..5192c169cec2 100644
>> --- a/include/drm/drm_gem_vram_helper.h
>> +++ b/include/drm/drm_gem_vram_helper.h
>> @@ -44,6 +44,16 @@ struct drm_gem_vram_object {
>> struct ttm_placement placement;
>> struct ttm_place placements[2];
>>
>> + /* TODO: Maybe implement a map counter.
>
> Kerneldoc is missing here. You can use the inline style so that the
> todo comment here is still included.
> -Daniel
Actually, this comment wasn't intended to be in the kernel docs. I guess
I integrate it into the structure's overall documentation then.
Best regards
Thomas
>> + *
>> + * So far, drivers based on VRAM helpers don't have overlapping
>> + * mapping operations. A driver temporarily maps an object and
>> + * unmaps it ASAP. This works well for fbdev emulation or cursors.
>> + *
>> + * If we ever have a driver with buffer objects that are mapped
>> + * by multiple code fragments concurrently, we may need a map
>> + * counter to get the mapping right.
>> + */
>> int pin_count;
>> };
>>
>> @@ -84,6 +94,8 @@ int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo);
>> void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map,
>> bool *is_iomem);
>> void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo);
>> +void *drm_gem_vram_vmap(struct drm_gem_vram_object *gbo);
>> +void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, void *vaddr);
>>
>> int drm_gem_vram_fill_create_dumb(struct drm_file *file,
>> struct drm_device *dev,
>> --
>> 2.22.0
>>
>
>
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20190724/ea3f1ff8/attachment.sig>
More information about the dri-devel
mailing list