From ebb8a4e93e242311d319098ea56e4ef4d92c4d19 Mon Sep 17 00:00:00 2001 From: James Hughes 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 --- 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, };