drm/cma: Introduce drm_gem_cma_dumb_create_internal()
This function is similar to drm_gem_cma_dumb_create() but targetted at kernel internal users so that they can override the pitch and size requirements of the dumb buffer. It is important to make this difference because the IOCTL says that the pitch and size fields are to be considered outputs and therefore should not be used in computations of the framebuffer size. Internal users may still want to use this code to avoid duplication and at the same time pass on additional, driver-specific restrictions on the pitch and size. While at it, convert the R-Car DU driver, the single user that overrides the pitch, to use the new internal helper. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
Родитель
d7883f8759
Коммит
6d1782919d
|
@ -204,6 +204,39 @@ void drm_gem_cma_free_object(struct drm_gem_object *gem_obj)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_cma_free_object);
|
||||
|
||||
/**
|
||||
* drm_gem_cma_dumb_create_internal - create a dumb buffer object
|
||||
* @file_priv: DRM file-private structure to create the dumb buffer for
|
||||
* @drm: DRM device
|
||||
* @args: IOCTL data
|
||||
*
|
||||
* This aligns the pitch and size arguments to the minimum required. This is
|
||||
* an internal helper that can be wrapped by a driver to account for hardware
|
||||
* with more specific alignment requirements. It should not be used directly
|
||||
* as the ->dumb_create() callback in a DRM driver.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int drm_gem_cma_dumb_create_internal(struct drm_file *file_priv,
|
||||
struct drm_device *drm,
|
||||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
unsigned int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
|
||||
struct drm_gem_cma_object *cma_obj;
|
||||
|
||||
if (args->pitch < min_pitch)
|
||||
args->pitch = min_pitch;
|
||||
|
||||
if (args->size < args->pitch * args->height)
|
||||
args->size = args->pitch * args->height;
|
||||
|
||||
cma_obj = drm_gem_cma_create_with_handle(file_priv, drm, args->size,
|
||||
&args->handle);
|
||||
return PTR_ERR_OR_ZERO(cma_obj);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(drm_gem_cma_dumb_create_internal);
|
||||
|
||||
/**
|
||||
* drm_gem_cma_dumb_create - create a dumb buffer object
|
||||
* @file_priv: DRM file-private structure to create the dumb buffer for
|
||||
|
@ -215,6 +248,10 @@ EXPORT_SYMBOL_GPL(drm_gem_cma_free_object);
|
|||
* any additional restrictions on the pitch can directly use this function as
|
||||
* their ->dumb_create() callback.
|
||||
*
|
||||
* For hardware with additional restrictions, drivers can adjust the fields
|
||||
* set up by userspace and pass the IOCTL data along to the
|
||||
* drm_gem_cma_dumb_create_internal() function.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success or a negative error code on failure.
|
||||
*/
|
||||
|
@ -223,13 +260,9 @@ int drm_gem_cma_dumb_create(struct drm_file *file_priv,
|
|||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
struct drm_gem_cma_object *cma_obj;
|
||||
int min_pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
|
||||
|
||||
if (args->pitch < min_pitch)
|
||||
args->pitch = min_pitch;
|
||||
|
||||
if (args->size < args->pitch * args->height)
|
||||
args->size = args->pitch * args->height;
|
||||
args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
|
||||
args->size = args->pitch * args->height;
|
||||
|
||||
cma_obj = drm_gem_cma_create_with_handle(file_priv, drm, args->size,
|
||||
&args->handle);
|
||||
|
|
|
@ -128,7 +128,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
|
|||
|
||||
args->pitch = roundup(max(args->pitch, min_pitch), align);
|
||||
|
||||
return drm_gem_cma_dumb_create(file, dev, args);
|
||||
return drm_gem_cma_dumb_create_internal(file, dev, args);
|
||||
}
|
||||
|
||||
static struct drm_framebuffer *
|
||||
|
|
|
@ -29,6 +29,11 @@ to_drm_gem_cma_obj(struct drm_gem_object *gem_obj)
|
|||
/* free GEM object */
|
||||
void drm_gem_cma_free_object(struct drm_gem_object *gem_obj);
|
||||
|
||||
/* create memory region for DRM framebuffer */
|
||||
int drm_gem_cma_dumb_create_internal(struct drm_file *file_priv,
|
||||
struct drm_device *drm,
|
||||
struct drm_mode_create_dumb *args);
|
||||
|
||||
/* create memory region for DRM framebuffer */
|
||||
int drm_gem_cma_dumb_create(struct drm_file *file_priv,
|
||||
struct drm_device *drm,
|
||||
|
|
Загрузка…
Ссылка в новой задаче