Message ID | 20221117184039.2291937-5-thierry.reding@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/simpledrm: Support system memory framebuffers | expand |
Hi Am 17.11.22 um 19:40 schrieb Thierry Reding: > From: Thierry Reding <treding@nvidia.com> > > The majority of the driver already uses struct iosys_map to encapsulate > accesses to I/O remapped vs. system memory. Accesses via the screen base > pointer still use __iomem annotations, which can lead to inconsistencies > and conflicts with subsequent patches. > > Convert the screen base to a struct iosys_map as well for consistency > and to avoid these issues. > > Signed-off-by: Thierry Reding <treding@nvidia.com> > --- > Changes in v3: > - properly reinitialize struct iosys_map to avoid bogus increments > > drivers/gpu/drm/tiny/simpledrm.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c > index 162eb44dcba8..3673a42e4bf4 100644 > --- a/drivers/gpu/drm/tiny/simpledrm.c > +++ b/drivers/gpu/drm/tiny/simpledrm.c > @@ -208,7 +208,7 @@ struct simpledrm_device { > unsigned int pitch; > > /* memory management */ > - void __iomem *screen_base; > + struct iosys_map screen_base; > > /* modesetting */ > uint32_t formats[8]; > @@ -492,15 +492,15 @@ static void simpledrm_primary_plane_helper_atomic_update(struct drm_plane *plane > > drm_atomic_helper_damage_iter_init(&iter, old_plane_state, plane_state); > drm_atomic_for_each_plane_damage(&iter, &damage) { > - struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base); We use dst throughout the code for such destination buffers. Please keep the name. With this fixed, you can add Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> to the patch. Best regards Thomas > struct drm_rect dst_clip = plane_state->dst; > + struct iosys_map screen = sdev->screen_base; > > if (!drm_rect_intersect(&dst_clip, &damage)) > continue; > > - iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip)); > - drm_fb_blit(&dst, &sdev->pitch, sdev->format->format, shadow_plane_state->data, fb, > - &damage); > + iosys_map_incr(&screen, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip)); > + drm_fb_blit(&screen, &sdev->pitch, sdev->format->format, shadow_plane_state->data, > + fb, &damage); > } > > drm_dev_exit(idx); > @@ -519,7 +519,7 @@ static void simpledrm_primary_plane_helper_atomic_disable(struct drm_plane *plan > return; > > /* Clear screen to black if disabled */ > - memset_io(sdev->screen_base, 0, sdev->pitch * sdev->mode.vdisplay); > + iosys_map_memset(&sdev->screen_base, 0, 0, sdev->pitch * sdev->mode.vdisplay); > > drm_dev_exit(idx); > } > @@ -722,7 +722,8 @@ static struct simpledrm_device *simpledrm_device_create(struct drm_driver *drv, > screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem)); > if (!screen_base) > return ERR_PTR(-ENOMEM); > - sdev->screen_base = screen_base; > + > + iosys_map_set_vaddr_iomem(&sdev->screen_base, screen_base); > > /* > * Modesetting
diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c index 162eb44dcba8..3673a42e4bf4 100644 --- a/drivers/gpu/drm/tiny/simpledrm.c +++ b/drivers/gpu/drm/tiny/simpledrm.c @@ -208,7 +208,7 @@ struct simpledrm_device { unsigned int pitch; /* memory management */ - void __iomem *screen_base; + struct iosys_map screen_base; /* modesetting */ uint32_t formats[8]; @@ -492,15 +492,15 @@ static void simpledrm_primary_plane_helper_atomic_update(struct drm_plane *plane drm_atomic_helper_damage_iter_init(&iter, old_plane_state, plane_state); drm_atomic_for_each_plane_damage(&iter, &damage) { - struct iosys_map dst = IOSYS_MAP_INIT_VADDR(sdev->screen_base); struct drm_rect dst_clip = plane_state->dst; + struct iosys_map screen = sdev->screen_base; if (!drm_rect_intersect(&dst_clip, &damage)) continue; - iosys_map_incr(&dst, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip)); - drm_fb_blit(&dst, &sdev->pitch, sdev->format->format, shadow_plane_state->data, fb, - &damage); + iosys_map_incr(&screen, drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip)); + drm_fb_blit(&screen, &sdev->pitch, sdev->format->format, shadow_plane_state->data, + fb, &damage); } drm_dev_exit(idx); @@ -519,7 +519,7 @@ static void simpledrm_primary_plane_helper_atomic_disable(struct drm_plane *plan return; /* Clear screen to black if disabled */ - memset_io(sdev->screen_base, 0, sdev->pitch * sdev->mode.vdisplay); + iosys_map_memset(&sdev->screen_base, 0, 0, sdev->pitch * sdev->mode.vdisplay); drm_dev_exit(idx); } @@ -722,7 +722,8 @@ static struct simpledrm_device *simpledrm_device_create(struct drm_driver *drv, screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem)); if (!screen_base) return ERR_PTR(-ENOMEM); - sdev->screen_base = screen_base; + + iosys_map_set_vaddr_iomem(&sdev->screen_base, screen_base); /* * Modesetting