4a83c26a1d
Rename "GEM CMA" helpers to "GEM DMA" helpers - considering the hierarchy of APIs (mm/cma -> dma -> gem dma) calling them "GEM DMA" seems to be more applicable. Besides that, commit e57924d4ae80 ("drm/doc: Task to rename CMA helpers") requests to rename the CMA helpers and implies that people seem to be confused about the naming. In order to do this renaming the following script was used: ``` #!/bin/bash DIRS="drivers/gpu include/drm Documentation/gpu" REGEX_SYM_UPPER="[0-9A-Z_\-]" REGEX_SYM_LOWER="[0-9a-z_\-]" REGEX_GREP_UPPER="(${REGEX_SYM_UPPER}*)(GEM)_CMA_(${REGEX_SYM_UPPER}*)" REGEX_GREP_LOWER="(${REGEX_SYM_LOWER}*)(gem)_cma_(${REGEX_SYM_LOWER}*)" REGEX_SED_UPPER="s/${REGEX_GREP_UPPER}/\1\2_DMA_\3/g" REGEX_SED_LOWER="s/${REGEX_GREP_LOWER}/\1\2_dma_\3/g" # Find all upper case 'CMA' symbols and replace them with 'DMA'. for ff in $(grep -REHl "${REGEX_GREP_UPPER}" $DIRS) do sed -i -E "$REGEX_SED_UPPER" $ff done # Find all lower case 'cma' symbols and replace them with 'dma'. for ff in $(grep -REHl "${REGEX_GREP_LOWER}" $DIRS) do sed -i -E "$REGEX_SED_LOWER" $ff done # Replace all occurrences of 'CMA' / 'cma' in comments and # documentation files with 'DMA' / 'dma'. for ff in $(grep -RiHl " cma " $DIRS) do sed -i -E "s/ cma / dma /g" $ff sed -i -E "s/ CMA / DMA /g" $ff done # Rename all 'cma_obj's to 'dma_obj'. for ff in $(grep -RiHl "cma_obj" $DIRS) do sed -i -E "s/cma_obj/dma_obj/g" $ff done ``` Only a few more manual modifications were needed, e.g. reverting the following modifications in some DRM Kconfig files - select CMA if HAVE_DMA_CONTIGUOUS + select DMA if HAVE_DMA_CONTIGUOUS as well as manually picking the occurrences of 'CMA'/'cma' in comments and documentation which relate to "GEM CMA", but not "FB CMA". Also drivers/gpu/drm/Makefile was fixed up manually after renaming drm_gem_cma_helper.c to drm_gem_dma_helper.c. This patch is compile-time tested building a x86_64 kernel with `make allyesconfig && make drivers/gpu/drm`. Acked-by: Sam Ravnborg <sam@ravnborg.org> Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Danilo Krummrich <dakr@redhat.com> Reviewed-by: Liviu Dudau <liviu.dudau@arm.com> #drivers/gpu/drm/arm Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Link: https://patchwork.freedesktop.org/patch/msgid/20220802000405.949236-4-dakr@redhat.com
151 lines
3.4 KiB
C
151 lines
3.4 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* shmob_drm_kms.c -- SH Mobile DRM Mode Setting
|
|
*
|
|
* Copyright (C) 2012 Renesas Electronics Corporation
|
|
*
|
|
* Laurent Pinchart (laurent.pinchart@ideasonboard.com)
|
|
*/
|
|
|
|
#include <drm/drm_crtc.h>
|
|
#include <drm/drm_crtc_helper.h>
|
|
#include <drm/drm_fourcc.h>
|
|
#include <drm/drm_gem_dma_helper.h>
|
|
#include <drm/drm_gem_framebuffer_helper.h>
|
|
#include <drm/drm_probe_helper.h>
|
|
|
|
#include "shmob_drm_crtc.h"
|
|
#include "shmob_drm_drv.h"
|
|
#include "shmob_drm_kms.h"
|
|
#include "shmob_drm_regs.h"
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
* Format helpers
|
|
*/
|
|
|
|
static const struct shmob_drm_format_info shmob_drm_format_infos[] = {
|
|
{
|
|
.fourcc = DRM_FORMAT_RGB565,
|
|
.bpp = 16,
|
|
.yuv = false,
|
|
.lddfr = LDDFR_PKF_RGB16,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_RGB888,
|
|
.bpp = 24,
|
|
.yuv = false,
|
|
.lddfr = LDDFR_PKF_RGB24,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_ARGB8888,
|
|
.bpp = 32,
|
|
.yuv = false,
|
|
.lddfr = LDDFR_PKF_ARGB32,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_NV12,
|
|
.bpp = 12,
|
|
.yuv = true,
|
|
.lddfr = LDDFR_CC | LDDFR_YF_420,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_NV21,
|
|
.bpp = 12,
|
|
.yuv = true,
|
|
.lddfr = LDDFR_CC | LDDFR_YF_420,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_NV16,
|
|
.bpp = 16,
|
|
.yuv = true,
|
|
.lddfr = LDDFR_CC | LDDFR_YF_422,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_NV61,
|
|
.bpp = 16,
|
|
.yuv = true,
|
|
.lddfr = LDDFR_CC | LDDFR_YF_422,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_NV24,
|
|
.bpp = 24,
|
|
.yuv = true,
|
|
.lddfr = LDDFR_CC | LDDFR_YF_444,
|
|
}, {
|
|
.fourcc = DRM_FORMAT_NV42,
|
|
.bpp = 24,
|
|
.yuv = true,
|
|
.lddfr = LDDFR_CC | LDDFR_YF_444,
|
|
},
|
|
};
|
|
|
|
const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(shmob_drm_format_infos); ++i) {
|
|
if (shmob_drm_format_infos[i].fourcc == fourcc)
|
|
return &shmob_drm_format_infos[i];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
* Frame buffer
|
|
*/
|
|
|
|
static struct drm_framebuffer *
|
|
shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
|
|
const struct drm_mode_fb_cmd2 *mode_cmd)
|
|
{
|
|
const struct shmob_drm_format_info *format;
|
|
|
|
format = shmob_drm_format_info(mode_cmd->pixel_format);
|
|
if (format == NULL) {
|
|
dev_dbg(dev->dev, "unsupported pixel format %08x\n",
|
|
mode_cmd->pixel_format);
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
if (mode_cmd->pitches[0] & 7 || mode_cmd->pitches[0] >= 65536) {
|
|
dev_dbg(dev->dev, "invalid pitch value %u\n",
|
|
mode_cmd->pitches[0]);
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
|
|
if (format->yuv) {
|
|
unsigned int chroma_cpp = format->bpp == 24 ? 2 : 1;
|
|
|
|
if (mode_cmd->pitches[1] != mode_cmd->pitches[0] * chroma_cpp) {
|
|
dev_dbg(dev->dev,
|
|
"luma and chroma pitches do not match\n");
|
|
return ERR_PTR(-EINVAL);
|
|
}
|
|
}
|
|
|
|
return drm_gem_fb_create(dev, file_priv, mode_cmd);
|
|
}
|
|
|
|
static const struct drm_mode_config_funcs shmob_drm_mode_config_funcs = {
|
|
.fb_create = shmob_drm_fb_create,
|
|
};
|
|
|
|
int shmob_drm_modeset_init(struct shmob_drm_device *sdev)
|
|
{
|
|
int ret;
|
|
|
|
ret = drmm_mode_config_init(sdev->ddev);
|
|
if (ret)
|
|
return ret;
|
|
|
|
shmob_drm_crtc_create(sdev);
|
|
shmob_drm_encoder_create(sdev);
|
|
shmob_drm_connector_create(sdev, &sdev->encoder.encoder);
|
|
|
|
drm_kms_helper_poll_init(sdev->ddev);
|
|
|
|
sdev->ddev->mode_config.min_width = 0;
|
|
sdev->ddev->mode_config.min_height = 0;
|
|
sdev->ddev->mode_config.max_width = 4095;
|
|
sdev->ddev->mode_config.max_height = 4095;
|
|
sdev->ddev->mode_config.funcs = &shmob_drm_mode_config_funcs;
|
|
|
|
drm_helper_disable_unused_functions(sdev->ddev);
|
|
|
|
return 0;
|
|
}
|