mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 01:04:41 +01:00
drm/solomon: Fix page start when updating rectangle in page addressing mode
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: b0daaa5cfa ("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>
This commit is contained in:
parent
75c151ceaa
commit
36d9579fed
1 changed files with 2 additions and 4 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue