drm/fourcc: Pass the format_info pointer to drm_format_plane_cpp
So far, the drm_format_plane_cpp function was operating on the format's fourcc and was doing a lookup to retrieve the drm_format_info structure and return the cpp. However, this is inefficient since in most cases, we will have the drm_format_info pointer already available so we shouldn't have to perform a new lookup. Some drm_fourcc functions also already operate on the drm_format_info pointer for that reason, so the API is quite inconsistent there. Let's follow the latter pattern and remove the extra lookup while being a bit more consistent. In order to be extra consistent, also rename that function to drm_format_info_plane_cpp and to a static function in the header to match the current policy. Reviewed-by: Emil Velikov <emil.velikov@collabora.com> Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Link: https://patchwork.freedesktop.org/patch/msgid/32aa13e53dbc98a90207fd290aa8e79f785fb11e.1558002671.git-series.maxime.ripard@bootlin.com
This commit is contained in:
Родитель
f3e9632cb6
Коммит
24c478ead0
|
@ -121,6 +121,8 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
|
|||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
const struct drm_format_info *info = drm_get_format_info(dev,
|
||||
mode_cmd);
|
||||
struct amdgpu_device *adev = rfbdev->adev;
|
||||
struct drm_gem_object *gobj = NULL;
|
||||
struct amdgpu_bo *abo = NULL;
|
||||
|
@ -131,7 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,
|
|||
int height = mode_cmd->height;
|
||||
u32 cpp;
|
||||
|
||||
cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0);
|
||||
cpp = drm_format_info_plane_cpp(info, 0);
|
||||
|
||||
/* need to align pitch with crtc limits */
|
||||
mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width, cpp,
|
||||
|
|
|
@ -382,7 +382,8 @@ static void malidp500_modeset(struct malidp_hw_device *hwdev, struct videomode *
|
|||
|
||||
int malidp_format_get_bpp(u32 fmt)
|
||||
{
|
||||
int bpp = drm_format_plane_cpp(fmt, 0) * 8;
|
||||
const struct drm_format_info *info = drm_format_info(fmt);
|
||||
int bpp = drm_format_info_plane_cpp(info, 0) * 8;
|
||||
|
||||
if (bpp == 0) {
|
||||
switch (fmt) {
|
||||
|
|
|
@ -227,7 +227,7 @@ bool malidp_format_mod_supported(struct drm_device *drm,
|
|||
|
||||
if (modifier & AFBC_SPLIT) {
|
||||
if (!info->is_yuv) {
|
||||
if (drm_format_plane_cpp(format, 0) <= 2) {
|
||||
if (drm_format_info_plane_cpp(info, 0) <= 2) {
|
||||
DRM_DEBUG_KMS("RGB formats <= 16bpp are not supported with SPLIT\n");
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -243,6 +243,7 @@ static void drm_client_buffer_delete(struct drm_client_buffer *buffer)
|
|||
static struct drm_client_buffer *
|
||||
drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)
|
||||
{
|
||||
const struct drm_format_info *info = drm_format_info(format);
|
||||
struct drm_mode_create_dumb dumb_args = { };
|
||||
struct drm_device *dev = client->dev;
|
||||
struct drm_client_buffer *buffer;
|
||||
|
@ -258,7 +259,7 @@ drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, u
|
|||
|
||||
dumb_args.width = width;
|
||||
dumb_args.height = height;
|
||||
dumb_args.bpp = drm_format_plane_cpp(format, 0) * 8;
|
||||
dumb_args.bpp = drm_format_info_plane_cpp(info, 0) * 8;
|
||||
ret = drm_mode_create_dumb(dev, &dumb_args, client->file);
|
||||
if (ret)
|
||||
goto err_delete;
|
||||
|
|
|
@ -813,7 +813,7 @@ static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper,
|
|||
struct drm_clip_rect *clip)
|
||||
{
|
||||
struct drm_framebuffer *fb = fb_helper->fb;
|
||||
unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0);
|
||||
unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0);
|
||||
size_t offset = clip->y1 * fb->pitches[0] + clip->x1 * cpp;
|
||||
void *src = fb_helper->fbdev->screen_buffer + offset;
|
||||
void *dst = fb_helper->buffer->vaddr + offset;
|
||||
|
|
|
@ -36,7 +36,7 @@ static unsigned int clip_offset(struct drm_rect *clip,
|
|||
void drm_fb_memcpy(void *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
struct drm_rect *clip)
|
||||
{
|
||||
unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0);
|
||||
unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0);
|
||||
size_t len = (clip->x2 - clip->x1) * cpp;
|
||||
unsigned int y, lines = clip->y2 - clip->y1;
|
||||
|
||||
|
@ -63,7 +63,7 @@ void drm_fb_memcpy_dstclip(void __iomem *dst, void *vaddr,
|
|||
struct drm_framebuffer *fb,
|
||||
struct drm_rect *clip)
|
||||
{
|
||||
unsigned int cpp = drm_format_plane_cpp(fb->format->format, 0);
|
||||
unsigned int cpp = drm_format_info_plane_cpp(fb->format, 0);
|
||||
unsigned int offset = clip_offset(clip, fb->pitches[0], cpp);
|
||||
size_t len = (clip->x2 - clip->x1) * cpp;
|
||||
unsigned int y, lines = clip->y2 - clip->y1;
|
||||
|
|
|
@ -332,26 +332,6 @@ drm_get_format_info(struct drm_device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL(drm_get_format_info);
|
||||
|
||||
/**
|
||||
* drm_format_plane_cpp - determine the bytes per pixel value
|
||||
* @format: pixel format (DRM_FORMAT_*)
|
||||
* @plane: plane index
|
||||
*
|
||||
* Returns:
|
||||
* The bytes per pixel value for the specified plane.
|
||||
*/
|
||||
int drm_format_plane_cpp(uint32_t format, int plane)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
|
||||
info = drm_format_info(format);
|
||||
if (!info || plane >= info->num_planes)
|
||||
return 0;
|
||||
|
||||
return info->cpp[plane];
|
||||
}
|
||||
EXPORT_SYMBOL(drm_format_plane_cpp);
|
||||
|
||||
/**
|
||||
* drm_format_plane_width - width of the plane given the first plane
|
||||
* @width: width of the first plane
|
||||
|
|
|
@ -325,7 +325,8 @@ skl_plane_max_stride(struct intel_plane *plane,
|
|||
u32 pixel_format, u64 modifier,
|
||||
unsigned int rotation)
|
||||
{
|
||||
int cpp = drm_format_plane_cpp(pixel_format, 0);
|
||||
const struct drm_format_info *info = drm_format_info(pixel_format);
|
||||
int cpp = drm_format_info_plane_cpp(info, 0);
|
||||
|
||||
/*
|
||||
* "The stride in bytes must not exceed the
|
||||
|
|
|
@ -104,7 +104,7 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
|
|||
if (!gem)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
bpp = drm_format_plane_cpp(cmd->pixel_format, 0);
|
||||
bpp = drm_format_info_plane_cpp(info, 0);
|
||||
size = (height - 1) * cmd->pitches[0] + width * bpp;
|
||||
size += cmd->offsets[0];
|
||||
|
||||
|
|
|
@ -782,6 +782,7 @@ static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h)
|
|||
|
||||
static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc)
|
||||
{
|
||||
const struct drm_format_info *info = drm_format_info(DRM_FORMAT_ARGB8888);
|
||||
struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
|
||||
struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
|
||||
struct mdp5_kms *mdp5_kms = get_kms(crtc);
|
||||
|
@ -800,7 +801,7 @@ static void mdp5_crtc_restore_cursor(struct drm_crtc *crtc)
|
|||
width = mdp5_crtc->cursor.width;
|
||||
height = mdp5_crtc->cursor.height;
|
||||
|
||||
stride = width * drm_format_plane_cpp(DRM_FORMAT_ARGB8888, 0);
|
||||
stride = width * drm_format_info_plane_cpp(info, 0);
|
||||
|
||||
get_roi(crtc, &roi_w, &roi_h);
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ uint32_t mdp5_smp_calculate(struct mdp5_smp *smp,
|
|||
for (i = 0; i < nplanes; i++) {
|
||||
int n, fetch_stride, cpp;
|
||||
|
||||
cpp = drm_format_plane_cpp(fmt, i);
|
||||
cpp = drm_format_info_plane_cpp(info, i);
|
||||
fetch_stride = width * cpp / (i ? hsub : 1);
|
||||
|
||||
n = DIV_ROUND_UP(fetch_stride * nlines, smp->blk_size);
|
||||
|
|
|
@ -181,7 +181,7 @@ static struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
|||
unsigned int min_size;
|
||||
|
||||
min_size = (height - 1) * mode_cmd->pitches[i]
|
||||
+ width * drm_format_plane_cpp(mode_cmd->pixel_format, i)
|
||||
+ width * drm_format_info_plane_cpp(info, i)
|
||||
+ mode_cmd->offsets[i];
|
||||
|
||||
if (bos[i]->size < min_size) {
|
||||
|
|
|
@ -125,6 +125,7 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
|
|||
struct drm_mode_fb_cmd2 *mode_cmd,
|
||||
struct drm_gem_object **gobj_p)
|
||||
{
|
||||
const struct drm_format_info *info;
|
||||
struct radeon_device *rdev = rfbdev->rdev;
|
||||
struct drm_gem_object *gobj = NULL;
|
||||
struct radeon_bo *rbo = NULL;
|
||||
|
@ -135,7 +136,8 @@ static int radeonfb_create_pinned_object(struct radeon_fbdev *rfbdev,
|
|||
int height = mode_cmd->height;
|
||||
u32 cpp;
|
||||
|
||||
cpp = drm_format_plane_cpp(mode_cmd->pixel_format, 0);
|
||||
info = drm_get_format_info(rdev->ddev, mode_cmd);
|
||||
cpp = drm_format_info_plane_cpp(info, 0);
|
||||
|
||||
/* need to align pitch with crtc limits */
|
||||
mode_cmd->pitches[0] = radeon_align_pitch(rdev, mode_cmd->width, cpp,
|
||||
|
|
|
@ -98,7 +98,7 @@ rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
|||
|
||||
min_size = (height - 1) * mode_cmd->pitches[i] +
|
||||
mode_cmd->offsets[i] +
|
||||
width * drm_format_plane_cpp(mode_cmd->pixel_format, i);
|
||||
width * drm_format_info_plane_cpp(info, i);
|
||||
|
||||
if (obj->size < min_size) {
|
||||
drm_gem_object_put_unlocked(obj);
|
||||
|
|
|
@ -784,7 +784,7 @@ static void ltdc_plane_atomic_update(struct drm_plane *plane,
|
|||
|
||||
/* Configures the color frame buffer pitch in bytes & line length */
|
||||
pitch_in_bytes = fb->pitches[0];
|
||||
line_length = drm_format_plane_cpp(fb->format->format, 0) *
|
||||
line_length = drm_format_info_plane_cpp(fb->format, 0) *
|
||||
(x1 - x0 + 1) + (ldev->caps.bus_width >> 3) - 1;
|
||||
val = ((pitch_in_bytes << 16) | line_length);
|
||||
reg_update_bits(ldev->regs, LTDC_L1CFBLR + lofs,
|
||||
|
|
|
@ -149,7 +149,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
|
|||
goto unreference;
|
||||
}
|
||||
|
||||
bpp = drm_format_plane_cpp(cmd->pixel_format, i);
|
||||
bpp = drm_format_info_plane_cpp(info, i);
|
||||
|
||||
size = (height - 1) * cmd->pitches[i] +
|
||||
width * bpp + cmd->offsets[i];
|
||||
|
|
|
@ -222,7 +222,7 @@ static void zx_vl_plane_atomic_update(struct drm_plane *plane,
|
|||
cma_obj = drm_fb_cma_get_gem_obj(fb, i);
|
||||
paddr = cma_obj->paddr + fb->offsets[i];
|
||||
paddr += src_y * fb->pitches[i];
|
||||
paddr += src_x * drm_format_plane_cpp(format, i);
|
||||
paddr += src_x * drm_format_info_plane_cpp(fb->format, i);
|
||||
zx_writel(paddr_reg, paddr);
|
||||
paddr_reg += 4;
|
||||
}
|
||||
|
|
|
@ -260,6 +260,23 @@ drm_format_info_is_yuv_sampling_444(const struct drm_format_info *info)
|
|||
return info->is_yuv && info->hsub == 1 && info->vsub == 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_format_info_plane_cpp - determine the bytes per pixel value
|
||||
* @format: pixel format info
|
||||
* @plane: plane index
|
||||
*
|
||||
* Returns:
|
||||
* The bytes per pixel value for the specified plane.
|
||||
*/
|
||||
static inline
|
||||
int drm_format_info_plane_cpp(const struct drm_format_info *info, int plane)
|
||||
{
|
||||
if (!info || plane >= info->num_planes)
|
||||
return 0;
|
||||
|
||||
return info->cpp[plane];
|
||||
}
|
||||
|
||||
const struct drm_format_info *__drm_format_info(u32 format);
|
||||
const struct drm_format_info *drm_format_info(u32 format);
|
||||
const struct drm_format_info *
|
||||
|
@ -268,7 +285,6 @@ drm_get_format_info(struct drm_device *dev,
|
|||
uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
|
||||
uint32_t drm_driver_legacy_fb_format(struct drm_device *dev,
|
||||
uint32_t bpp, uint32_t depth);
|
||||
int drm_format_plane_cpp(uint32_t format, int plane);
|
||||
int drm_format_plane_width(int width, uint32_t format, int plane);
|
||||
int drm_format_plane_height(int height, uint32_t format, int plane);
|
||||
unsigned int drm_format_info_block_width(const struct drm_format_info *info,
|
||||
|
|
Загрузка…
Ссылка в новой задаче