diff options
Diffstat (limited to 'target/linux/brcm2708/patches-4.19/950-0746-drm-vc4-Added-calls-for-firmware-display-blank-unbla.patch')
-rw-r--r-- | target/linux/brcm2708/patches-4.19/950-0746-drm-vc4-Added-calls-for-firmware-display-blank-unbla.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/target/linux/brcm2708/patches-4.19/950-0746-drm-vc4-Added-calls-for-firmware-display-blank-unbla.patch b/target/linux/brcm2708/patches-4.19/950-0746-drm-vc4-Added-calls-for-firmware-display-blank-unbla.patch new file mode 100644 index 0000000000..fbfcd747cd --- /dev/null +++ b/target/linux/brcm2708/patches-4.19/950-0746-drm-vc4-Added-calls-for-firmware-display-blank-unbla.patch @@ -0,0 +1,87 @@ +From ebb8a4e93e242311d319098ea56e4ef4d92c4d19 Mon Sep 17 00:00:00 2001 +From: James Hughes <james.hughes@raspberrypi.org> +Date: Wed, 16 Oct 2019 14:49:23 +0100 +Subject: [PATCH] drm:vc4 Added calls for firmware display + blank/unblank + +Requires new display power mailbox call to be present. + +Signed-off-by: James Hughes <james.hughes@raspberrypi.org> +--- + drivers/gpu/drm/vc4/vc4_firmware_kms.c | 25 ++++++++++++++++++++++ + include/soc/bcm2835/raspberrypi-firmware.h | 2 +- + 2 files changed, 26 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c ++++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c +@@ -91,6 +91,12 @@ struct mailbox_blank_display { + u32 blank; + }; + ++struct mailbox_display_pwr { ++ struct rpi_firmware_property_tag_header tag1; ++ u32 display; ++ u32 state; ++}; ++ + struct mailbox_get_edid { + struct rpi_firmware_property_tag_header tag1; + u32 block; +@@ -272,6 +278,7 @@ struct vc4_fkms_encoder { + struct drm_encoder base; + bool hdmi_monitor; + bool rgb_range_selectable; ++ int display_num; + }; + + static inline struct vc4_fkms_encoder * +@@ -1613,13 +1620,29 @@ static const struct drm_encoder_funcs vc + .destroy = vc4_fkms_encoder_destroy, + }; + ++static void vc4_fkms_display_power(struct drm_encoder *encoder, bool power) ++{ ++ struct vc4_fkms_encoder *vc4_encoder = to_vc4_fkms_encoder(encoder); ++ struct vc4_dev *vc4 = to_vc4_dev(encoder->dev); ++ ++ struct mailbox_display_pwr pwr = { ++ .tag1 = {RPI_FIRMWARE_SET_DISPLAY_POWER, 8, 0, }, ++ .display = vc4_encoder->display_num, ++ .state = power ? 1 : 0, ++ }; ++ ++ rpi_firmware_property_list(vc4->firmware, &pwr, sizeof(pwr)); ++} ++ + static void vc4_fkms_encoder_enable(struct drm_encoder *encoder) + { ++ vc4_fkms_display_power(encoder, true); + DRM_DEBUG_KMS("Encoder_enable\n"); + } + + static void vc4_fkms_encoder_disable(struct drm_encoder *encoder) + { ++ vc4_fkms_display_power(encoder, false); + DRM_DEBUG_KMS("Encoder_disable\n"); + } + +@@ -1695,6 +1718,8 @@ static int vc4_fkms_create_screen(struct + if (!vc4_encoder) + return -ENOMEM; + vc4_crtc->encoder = &vc4_encoder->base; ++ ++ vc4_encoder->display_num = display_ref; + vc4_encoder->base.possible_crtcs |= drm_crtc_mask(crtc) ; + + drm_encoder_init(drm, &vc4_encoder->base, &vc4_fkms_encoder_funcs, +--- a/include/soc/bcm2835/raspberrypi-firmware.h ++++ b/include/soc/bcm2835/raspberrypi-firmware.h +@@ -155,7 +155,7 @@ enum rpi_firmware_property_tag { + 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, + }; |