提交 8c6c6766 编写于 作者: D Dave Stevenson 提交者: Zheng Zengkai

drm/vc4: Add firmware-kms mode

raspberrypi inclusion
category: feature
bugzilla: 50432

--------------------------------

This is a squash of all firmware-kms related patches from previous
branches, up to and including
"drm/vc4: Set the possible crtcs mask correctly for planes with FKMS"
plus a couple of minor fixups for the 5.9 branch.
Please refer to earlier branches for full history.

This patch includes work by Eric Anholt, James Hughes, Phil Elwell,
Dave Stevenson, Dom Cobley, and Jonathon Bell.
Signed-off-by: NDave Stevenson <dave.stevenson@raspberrypi.com>

drm/vc4: Fixup firmware-kms after "drm/atomic: Pass the full state to CRTC atomic enable/disable"

Prototype for those calls changed, so amend fkms (which isn't
upstream) to match.
Signed-off-by: NDave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: NFang Yafen <yafen@iscas.ac.cn>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 ebcc368b
......@@ -9,6 +9,7 @@ vc4-y := \
vc4_dpi.o \
vc4_dsi.o \
vc4_fence.o \
vc4_firmware_kms.o \
vc4_kms.o \
vc4_gem.o \
vc4_hdmi.o \
......
......@@ -307,9 +307,11 @@ static int vc4_drm_bind(struct device *dev)
if (ret)
return ret;
ret = vc4_plane_create_additional_planes(drm);
if (ret)
goto unbind_all;
if (!vc4->firmware_kms) {
ret = vc4_plane_create_additional_planes(drm);
if (ret)
goto unbind_all;
}
drm_fb_helper_remove_conflicting_framebuffers(NULL, "vc4drmfb", false);
......@@ -317,8 +319,10 @@ static int vc4_drm_bind(struct device *dev)
if (ret < 0)
goto unbind_all;
drm_for_each_crtc(crtc, drm)
vc4_crtc_disable_at_boot(crtc);
if (!vc4->firmware_kms) {
drm_for_each_crtc(crtc, drm)
vc4_crtc_disable_at_boot(crtc);
}
ret = drm_dev_register(drm, 0);
if (ret < 0)
......@@ -356,6 +360,7 @@ static struct platform_driver *const component_drivers[] = {
&vc4_hvs_driver,
&vc4_txp_driver,
&vc4_crtc_driver,
&vc4_firmware_kms_driver,
&vc4_v3d_driver,
};
......
......@@ -74,12 +74,17 @@ struct vc4_perfmon {
struct vc4_dev {
struct drm_device base;
bool firmware_kms;
struct rpi_firmware *firmware;
struct vc4_hdmi *hdmi;
struct vc4_hvs *hvs;
struct vc4_v3d *v3d;
struct vc4_dpi *dpi;
struct vc4_dsi *dsi1;
struct vc4_vec *vec;
struct vc4_txp *txp;
struct vc4_fkms *fkms;
struct vc4_hang_state *hang_state;
......@@ -877,6 +882,9 @@ extern struct platform_driver vc4_dsi_driver;
/* vc4_fence.c */
extern const struct dma_fence_ops vc4_fence_ops;
/* vc4_firmware_kms.c */
extern struct platform_driver vc4_firmware_kms_driver;
/* vc4_gem.c */
int vc4_gem_init(struct drm_device *dev);
int vc4_submit_cl_ioctl(struct drm_device *dev, void *data,
......
此差异已折叠。
......@@ -154,6 +154,9 @@ vc4_ctm_commit(struct vc4_dev *vc4, struct drm_atomic_state *state)
struct vc4_ctm_state *ctm_state = to_vc4_ctm_state(vc4->ctm_manager.state);
struct drm_color_ctm *ctm = ctm_state->ctm;
if (vc4->firmware_kms)
return;
if (ctm_state->fifo) {
HVS_WRITE(SCALER_OLEDCOEF2,
VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[0]),
......@@ -315,14 +318,14 @@ vc4_atomic_complete_commit(struct drm_atomic_state *state)
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
struct vc4_crtc_state *vc4_crtc_state;
if (!new_crtc_state->commit)
if (!new_crtc_state->commit || vc4->firmware_kms)
continue;
vc4_crtc_state = to_vc4_crtc_state(new_crtc_state);
vc4_hvs_mask_underrun(dev, vc4_crtc_state->assigned_channel);
}
if (vc4->hvs->hvs5)
if (vc4->hvs && vc4->hvs->hvs5)
clk_set_min_rate(hvs->core_clk, 500000000);
drm_atomic_helper_wait_for_fences(dev, state, false);
......@@ -333,10 +336,12 @@ vc4_atomic_complete_commit(struct drm_atomic_state *state)
vc4_ctm_commit(vc4, state);
if (vc4->hvs->hvs5)
vc5_hvs_pv_muxing_commit(vc4, state);
else
vc4_hvs_pv_muxing_commit(vc4, state);
if (!vc4->firmware_kms) {
if (vc4->hvs->hvs5)
vc5_hvs_pv_muxing_commit(vc4, state);
else
vc4_hvs_pv_muxing_commit(vc4, state);
}
drm_atomic_helper_commit_planes(dev, state, 0);
......@@ -352,7 +357,7 @@ vc4_atomic_complete_commit(struct drm_atomic_state *state)
drm_atomic_helper_commit_cleanup_done(state);
if (vc4->hvs->hvs5)
if (vc4->hvs && vc4->hvs->hvs5)
clk_set_min_rate(hvs->core_clk, 0);
drm_atomic_state_put(state);
......@@ -413,7 +418,8 @@ static int vc4_atomic_commit(struct drm_device *dev,
* drm_atomic_helper_setup_commit() from auto-completing
* commit->flip_done.
*/
state->legacy_cursor_update = false;
if (!vc4->firmware_kms)
state->legacy_cursor_update = false;
ret = drm_atomic_helper_setup_commit(state, nonblock);
if (ret)
return ret;
......@@ -778,6 +784,7 @@ static int vc4_hvs_channels_obj_init(struct vc4_dev *vc4)
static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
struct drm_atomic_state *state)
{
struct vc4_dev *vc4 = to_vc4_dev(state->dev);
struct vc4_hvs_state *hvs_new_state;
struct drm_crtc_state *old_crtc_state, *new_crtc_state;
struct drm_crtc *crtc;
......@@ -795,6 +802,9 @@ static int vc4_pv_muxing_atomic_check(struct drm_device *dev,
struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
unsigned int matching_channels;
if (vc4->firmware_kms)
continue;
/* Nothing to do here, let's skip it */
if (old_crtc_state->enable == new_crtc_state->enable)
continue;
......@@ -913,6 +923,7 @@ int vc4_kms_load(struct drm_device *dev)
dev->mode_config.preferred_depth = 24;
dev->mode_config.async_page_flip = true;
dev->mode_config.allow_fb_modifiers = true;
dev->mode_config.normalize_zpos = true;
ret = vc4_ctm_obj_init(vc4);
if (ret)
......
/*
* Copyright (c) 2012, Broadcom Europe Ltd
*
* Values taken from vc_image_types.h released by Broadcom at
* https://github.com/raspberrypi/userland/blob/master/interface/vctypes/vc_image_types.h
* and vc_image_structs.h at
* https://github.com/raspberrypi/userland/blob/master/interface/vctypes/vc_image_structs.h
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
enum {
VC_IMAGE_MIN = 0, //bounds for error checking
VC_IMAGE_RGB565 = 1,
VC_IMAGE_1BPP,
VC_IMAGE_YUV420,
VC_IMAGE_48BPP,
VC_IMAGE_RGB888,
VC_IMAGE_8BPP,
/* 4bpp palettised image */
VC_IMAGE_4BPP,
/* A separated format of 16 colour/light shorts followed by 16 z
* values
*/
VC_IMAGE_3D32,
/* 16 colours followed by 16 z values */
VC_IMAGE_3D32B,
/* A separated format of 16 material/colour/light shorts followed by
* 16 z values
*/
VC_IMAGE_3D32MAT,
/* 32 bit format containing 18 bits of 6.6.6 RGB, 9 bits per short */
VC_IMAGE_RGB2X9,
/* 32-bit format holding 18 bits of 6.6.6 RGB */
VC_IMAGE_RGB666,
/* 4bpp palettised image with embedded palette */
VC_IMAGE_PAL4_OBSOLETE,
/* 8bpp palettised image with embedded palette */
VC_IMAGE_PAL8_OBSOLETE,
/* RGB888 with an alpha byte after each pixel */
VC_IMAGE_RGBA32,
/* a line of Y (32-byte padded), a line of U (16-byte padded), and a
* line of V (16-byte padded)
*/
VC_IMAGE_YUV422,
/* RGB565 with a transparent patch */
VC_IMAGE_RGBA565,
/* Compressed (4444) version of RGBA32 */
VC_IMAGE_RGBA16,
/* VCIII codec format */
VC_IMAGE_YUV_UV,
/* VCIII T-format RGBA8888 */
VC_IMAGE_TF_RGBA32,
/* VCIII T-format RGBx8888 */
VC_IMAGE_TF_RGBX32,
/* VCIII T-format float */
VC_IMAGE_TF_FLOAT,
/* VCIII T-format RGBA4444 */
VC_IMAGE_TF_RGBA16,
/* VCIII T-format RGB5551 */
VC_IMAGE_TF_RGBA5551,
/* VCIII T-format RGB565 */
VC_IMAGE_TF_RGB565,
/* VCIII T-format 8-bit luma and 8-bit alpha */
VC_IMAGE_TF_YA88,
/* VCIII T-format 8 bit generic sample */
VC_IMAGE_TF_BYTE,
/* VCIII T-format 8-bit palette */
VC_IMAGE_TF_PAL8,
/* VCIII T-format 4-bit palette */
VC_IMAGE_TF_PAL4,
/* VCIII T-format Ericsson Texture Compressed */
VC_IMAGE_TF_ETC1,
/* RGB888 with R & B swapped */
VC_IMAGE_BGR888,
/* RGB888 with R & B swapped, but with no pitch, i.e. no padding after
* each row of pixels
*/
VC_IMAGE_BGR888_NP,
/* Bayer image, extra defines which variant is being used */
VC_IMAGE_BAYER,
/* General wrapper for codec images e.g. JPEG from camera */
VC_IMAGE_CODEC,
/* VCIII codec format */
VC_IMAGE_YUV_UV32,
/* VCIII T-format 8-bit luma */
VC_IMAGE_TF_Y8,
/* VCIII T-format 8-bit alpha */
VC_IMAGE_TF_A8,
/* VCIII T-format 16-bit generic sample */
VC_IMAGE_TF_SHORT,
/* VCIII T-format 1bpp black/white */
VC_IMAGE_TF_1BPP,
VC_IMAGE_OPENGL,
/* VCIII-B0 HVS YUV 4:4:4 interleaved samples */
VC_IMAGE_YUV444I,
/* Y, U, & V planes separately (VC_IMAGE_YUV422 has them interleaved on
* a per line basis)
*/
VC_IMAGE_YUV422PLANAR,
/* 32bpp with 8bit alpha at MS byte, with R, G, B (LS byte) */
VC_IMAGE_ARGB8888,
/* 32bpp with 8bit unused at MS byte, with R, G, B (LS byte) */
VC_IMAGE_XRGB8888,
/* interleaved 8 bit samples of Y, U, Y, V (4 flavours) */
VC_IMAGE_YUV422YUYV,
VC_IMAGE_YUV422YVYU,
VC_IMAGE_YUV422UYVY,
VC_IMAGE_YUV422VYUY,
/* 32bpp like RGBA32 but with unused alpha */
VC_IMAGE_RGBX32,
/* 32bpp, corresponding to RGBA with unused alpha */
VC_IMAGE_RGBX8888,
/* 32bpp, corresponding to BGRA with unused alpha */
VC_IMAGE_BGRX8888,
/* Y as a plane, then UV byte interleaved in plane with same pitch,
* half height
*/
VC_IMAGE_YUV420SP,
/* Y, U, & V planes separately 4:4:4 */
VC_IMAGE_YUV444PLANAR,
/* T-format 8-bit U - same as TF_Y8 buf from U plane */
VC_IMAGE_TF_U8,
/* T-format 8-bit U - same as TF_Y8 buf from V plane */
VC_IMAGE_TF_V8,
/* YUV4:2:0 planar, 16bit values */
VC_IMAGE_YUV420_16,
/* YUV4:2:0 codec format, 16bit values */
VC_IMAGE_YUV_UV_16,
/* YUV4:2:0 with U,V in side-by-side format */
VC_IMAGE_YUV420_S,
/* 10-bit YUV 420 column image format */
VC_IMAGE_YUV10COL,
/* 32-bpp, 10-bit R/G/B, 2-bit Alpha */
VC_IMAGE_RGBA1010102,
VC_IMAGE_MAX, /* bounds for error checking */
VC_IMAGE_FORCE_ENUM_16BIT = 0xffff,
};
enum {
/* Unknown or unset - defaults to BT601 interstitial */
VC_IMAGE_YUVINFO_UNSPECIFIED = 0,
/* colour-space conversions data [4 bits] */
/* ITU-R BT.601-5 [SDTV] (compatible with VideoCore-II) */
VC_IMAGE_YUVINFO_CSC_ITUR_BT601 = 1,
/* ITU-R BT.709-3 [HDTV] */
VC_IMAGE_YUVINFO_CSC_ITUR_BT709 = 2,
/* JPEG JFIF */
VC_IMAGE_YUVINFO_CSC_JPEG_JFIF = 3,
/* Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) */
VC_IMAGE_YUVINFO_CSC_FCC = 4,
/* Society of Motion Picture and Television Engineers 240M (1999) */
VC_IMAGE_YUVINFO_CSC_SMPTE_240M = 5,
/* ITU-R BT.470-2 System M */
VC_IMAGE_YUVINFO_CSC_ITUR_BT470_2_M = 6,
/* ITU-R BT.470-2 System B,G */
VC_IMAGE_YUVINFO_CSC_ITUR_BT470_2_BG = 7,
/* JPEG JFIF, but with 16..255 luma */
VC_IMAGE_YUVINFO_CSC_JPEG_JFIF_Y16_255 = 8,
/* Rec 2020 */
VC_IMAGE_YUVINFO_CSC_REC_2020 = 9,
};
......@@ -75,6 +75,7 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 0x00030014,
RPI_FIRMWARE_GET_EDID_BLOCK = 0x00030020,
RPI_FIRMWARE_GET_CUSTOMER_OTP = 0x00030021,
RPI_FIRMWARE_GET_EDID_BLOCK_DISPLAY = 0x00030023,
RPI_FIRMWARE_GET_DOMAIN_STATE = 0x00030030,
RPI_FIRMWARE_GET_THROTTLED = 0x00030046,
RPI_FIRMWARE_GET_CLOCK_MEASURED = 0x00030047,
......@@ -148,6 +149,11 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_VCHIQ_INIT = 0x00048010,
RPI_FIRMWARE_SET_PLANE = 0x00048015,
RPI_FIRMWARE_GET_DISPLAY_TIMING = 0x00040017,
RPI_FIRMWARE_SET_TIMING = 0x00048017,
RPI_FIRMWARE_GET_DISPLAY_CFG = 0x00040018,
RPI_FIRMWARE_SET_DISPLAY_POWER = 0x00048019,
RPI_FIRMWARE_GET_COMMAND_LINE = 0x00050001,
RPI_FIRMWARE_GET_DMA_CHANNELS = 0x00060001,
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册