]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/solomon: Fix page start when updating rectangle in page addressing mode
authorFrancesco Lavra <flavra@baylibre.com>
Tue, 10 Feb 2026 18:09:32 +0000 (19:09 +0100)
committerJavier Martinez Canillas <javierm@redhat.com>
Thu, 26 Feb 2026 12:42:09 +0000 (13:42 +0100)
In page addressing mode, the pixel values of a dirty rectangle must be sent
to the display controller one page at a time. The range of pages
corresponding to a given rectangle is being incorrectly calculated as if
the Y value of the top left coordinate of the rectangle was 0. This can
result in rectangle updates being displayed on wrong parts of the screen.

Fix the above issue by consolidating the start page calculation in a single
place at the beginning of the update_rect function, and using the
calculated value for all addressing modes.

Fixes: b0daaa5cfaa5 ("drm/ssd130x: Support page addressing mode")
Signed-off-by: Francesco Lavra <flavra@baylibre.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patch.msgid.link/20260210180932.736502-1-flavra@baylibre.com
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
drivers/gpu/drm/solomon/ssd130x.c

index 6ecf9e2ff61b81bb172810840514b1bc5ffed0e5..c77455b1834dde3ef1d274c65244bf1a8219c4ac 100644 (file)
@@ -737,6 +737,7 @@ static int ssd130x_update_rect(struct ssd130x_device *ssd130x,
        unsigned int height = drm_rect_height(rect);
        unsigned int line_length = DIV_ROUND_UP(width, 8);
        unsigned int page_height = SSD130X_PAGE_HEIGHT;
+       u8 page_start = ssd130x->page_offset + y / page_height;
        unsigned int pages = DIV_ROUND_UP(height, page_height);
        struct drm_device *drm = &ssd130x->drm;
        u32 array_idx = 0;
@@ -774,14 +775,11 @@ static int ssd130x_update_rect(struct ssd130x_device *ssd130x,
         */
 
        if (!ssd130x->page_address_mode) {
-               u8 page_start;
-
                /* Set address range for horizontal addressing mode */
                ret = ssd130x_set_col_range(ssd130x, ssd130x->col_offset + x, width);
                if (ret < 0)
                        return ret;
 
-               page_start = ssd130x->page_offset + y / page_height;
                ret = ssd130x_set_page_range(ssd130x, page_start, pages);
                if (ret < 0)
                        return ret;
@@ -813,7 +811,7 @@ static int ssd130x_update_rect(struct ssd130x_device *ssd130x,
                 */
                if (ssd130x->page_address_mode) {
                        ret = ssd130x_set_page_pos(ssd130x,
-                                                  ssd130x->page_offset + i,
+                                                  page_start + i,
                                                   ssd130x->col_offset + x);
                        if (ret < 0)
                                return ret;