From: Thomas Zimmermann Date: Wed, 15 Apr 2026 15:23:37 +0000 (+0200) Subject: drm/mgag200: Simplify offset calculation X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0bfc9fbd8e51184fe845a14d2f7357090f294568;p=thirdparty%2Fkernel%2Flinux.git drm/mgag200: Simplify offset calculation The offset value sets the distance in bytes between two consecutive scanlines. Reduce the calculation to the minimum. According to the Matrox programming manual, Sec 4.6.5, the offset is the scanline pitch in bits divided by 128. The field pitches[0] in struct drm_framebuffer stores the scanline pitch in bytes, so we have to divide by 16 only. Reducing the existing bpp-shift look-up and offset calculations also returns exactly this for all formats. Signed-off-by: Thomas Zimmermann Co-developed-by: Jocelyn Falempe Reviewed-by: Jocelyn Falempe Link: https://patch.msgid.link/20260415152625.101710-4-tzimmermann@suse.de --- diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 5b526aebaeb84..57c9f731a4bf1 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -298,37 +298,11 @@ void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mod WREG8(MGA_MISC_OUT, misc); } -static u8 mgag200_get_bpp_shift(const struct drm_format_info *format) -{ - static const u8 bpp_shift[] = {0, 1, 0, 2}; - - return bpp_shift[format->cpp[0] - 1]; -} - -/* - * Calculates the HW offset value from the framebuffer's pitch. The - * offset is a multiple of the pixel size and depends on the display - * format. - */ -static u32 mgag200_calculate_offset(struct mga_device *mdev, - const struct drm_framebuffer *fb) -{ - u32 offset = fb->pitches[0] / fb->format->cpp[0]; - u8 bppshift = mgag200_get_bpp_shift(fb->format); - - if (fb->format->cpp[0] * 8 == 24) - offset = (offset * 3) >> (4 - bppshift); - else - offset = offset >> (4 - bppshift); - - return offset; -} - static void mgag200_set_offset(struct mga_device *mdev, const struct drm_framebuffer *fb) { u8 crtc13, crtcext0; - u32 offset = mgag200_calculate_offset(mdev, fb); + u32 offset = fb->pitches[0] / 16; RREG_ECRT(0, crtcext0);