@@ -36,51 +36,6 @@ static const struct drm_framebuffer_funcs komeda_fb_funcs = {
.create_handle = komeda_fb_create_handle,
};
-static int
-komeda_fb_afbc_size_check(struct drm_device *dev,
- struct komeda_fb *kfb,
- const struct drm_format_info *info,
- struct drm_gem_object **objs,
- struct drm_file *file,
- const struct drm_mode_fb_cmd2 *mode_cmd)
-{
- struct drm_size_check check = { 0 };
- u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks, bpp;
-
- if (!drm_afbc_get_superblock_wh(mode_cmd->modifier[0], &alignment_w, &alignment_h))
- return -EINVAL;
-
- /* tiled header afbc */
- if (mode_cmd->modifier[0] & AFBC_FORMAT_MOD_TILED) {
- alignment_w *= AFBC_TH_LAYOUT_ALIGNMENT;
- alignment_h *= AFBC_TH_LAYOUT_ALIGNMENT;
- alignment_header = AFBC_TH_BODY_START_ALIGNMENT;
- } else {
- alignment_header = AFBC_BODY_START_ALIGNMENT;
- }
-
- kfb->aligned_w = ALIGN(mode_cmd->width, alignment_w);
- kfb->aligned_h = ALIGN(mode_cmd->height, alignment_h);
-
- if (mode_cmd->offsets[0] % alignment_header) {
- DRM_DEBUG_KMS("afbc offset alignment check failed.\n");
- return -EINVAL;
- }
-
- n_blocks = (kfb->aligned_w * kfb->aligned_h) / AFBC_SUPERBLK_PIXELS;
- kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE,
- alignment_header);
-
- bpp = komeda_get_afbc_format_bpp(info, mode_cmd->modifier[0]);
- kfb->afbc_size = kfb->offset_payload + n_blocks *
- ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8,
- AFBC_SUPERBLK_ALIGNMENT);
- check.min_size[0] = kfb->afbc_size + mode_cmd->offsets[0];
- check.use_min_size = true;
-
- return drm_gem_fb_size_check2(dev, mode_cmd, &check, objs);
-}
-
struct drm_framebuffer *
komeda_fb_create(struct drm_device *dev, struct drm_file *file,
const struct drm_mode_fb_cmd2 *mode_cmd)
@@ -113,14 +68,49 @@ komeda_fb_create(struct drm_device *dev, struct drm_file *file,
info = drm_get_format_info(dev, mode_cmd);
if (mode_cmd->modifier[0]) {
+ struct drm_size_check check = { 0 };
+ u32 alignment_w = 0, alignment_h = 0;
+ u32 alignment_header, n_blocks, bpp;
+
if (num_planes != 1) {
DRM_DEBUG_KMS("AFBC requires exactly 1 plane.\n");
ret = -EINVAL;
goto err_cleanup;
}
- ret = komeda_fb_afbc_size_check(dev, kfb, info, objs,
- file, mode_cmd);
+ if (!drm_afbc_get_superblock_wh(mode_cmd->modifier[0], &alignment_w, &alignment_h)) {
+ ret = -EINVAL;
+ goto err_cleanup;
+ }
+
+ /* tiled header afbc */
+ if (mode_cmd->modifier[0] & AFBC_FORMAT_MOD_TILED) {
+ alignment_w *= AFBC_TH_LAYOUT_ALIGNMENT;
+ alignment_h *= AFBC_TH_LAYOUT_ALIGNMENT;
+ alignment_header = AFBC_TH_BODY_START_ALIGNMENT;
+ } else {
+ alignment_header = AFBC_BODY_START_ALIGNMENT;
+ }
+
+ kfb->aligned_w = ALIGN(mode_cmd->width, alignment_w);
+ kfb->aligned_h = ALIGN(mode_cmd->height, alignment_h);
+
+ if (mode_cmd->offsets[0] % alignment_header) {
+ DRM_DEBUG_KMS("afbc offset alignment check failed.\n");
+ ret = -EINVAL;
+ goto err_cleanup;
+ }
+
+ n_blocks = (kfb->aligned_w * kfb->aligned_h) / AFBC_SUPERBLK_PIXELS;
+ kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE, alignment_header);
+
+ bpp = komeda_get_afbc_format_bpp(info, mode_cmd->modifier[0]);
+ kfb->afbc_size = kfb->offset_payload
+ + n_blocks * ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8, AFBC_SUPERBLK_ALIGNMENT);
+ check.min_size[0] = kfb->afbc_size + mode_cmd->offsets[0];
+ check.use_min_size = true;
+
+ ret = drm_gem_fb_size_check2(dev, mode_cmd, &check, objs);
} else {
struct drm_size_check check = { 0 };
Prepare for unification with non-afbc case. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> --- .../arm/display/komeda/komeda_framebuffer.c | 84 ++++++++----------- 1 file changed, 37 insertions(+), 47 deletions(-)