From 5ef3d566615961b75f85868b028193bb54727140 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 18 Apr 2017 21:43:46 +0100 Subject: [PATCH] vc4_fkms: Apply firmware overscan offset to hardware cursor --- drivers/gpu/drm/vc4/vc4_firmware_kms.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) --- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c +++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c @@ -42,6 +42,7 @@ struct vc4_crtc { void __iomem *regs; struct drm_pending_vblank_event *event; + u32 overscan[4]; }; static inline struct vc4_crtc *to_vc4_crtc(struct drm_crtc *crtc) @@ -191,6 +192,7 @@ static void vc4_cursor_plane_atomic_upda struct drm_plane_state *old_state) { struct vc4_dev *vc4 = to_vc4_dev(plane->dev); + struct vc4_crtc *vc4_crtc = to_vc4_crtc(plane->crtc); struct drm_plane_state *state = plane->state; struct drm_framebuffer *fb = state->fb; struct drm_gem_cma_object *bo = drm_fb_cma_get_gem_obj(fb, 0); @@ -216,6 +218,12 @@ static void vc4_cursor_plane_atomic_upda bo->paddr + fb->offsets[0], fb->pitches[0]); + /* add on the top/left offsets when overscan is active */ + if (vc4_crtc) { + packet_state[1] += vc4_crtc->overscan[0]; + packet_state[2] += vc4_crtc->overscan[1]; + } + ret = rpi_firmware_property(vc4->firmware, RPI_FIRMWARE_SET_CURSOR_STATE, &packet_state, @@ -695,6 +703,15 @@ static int vc4_fkms_bind(struct device * if (ret) goto err_destroy_connector; + ret = rpi_firmware_property(vc4->firmware, + RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN, + &vc4_crtc->overscan, + sizeof(vc4_crtc->overscan)); + if (ret) { + DRM_ERROR("Failed to get overscan state: 0x%08x\n", vc4_crtc->overscan[0]); + memset(&vc4_crtc->overscan, 0, sizeof(vc4_crtc->overscan)); + } + platform_set_drvdata(pdev, vc4_crtc); return 0;