* [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager
@ 2024-04-19 8:28 Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 01/43] drm/fbdev-generic: Do not set physical framebuffer address Thomas Zimmermann
` (42 more replies)
0 siblings, 43 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
DRM provides 3 different memory managers with slightly different
characteristics: DMA-based, SHMEM-based and TTM. This affects fbdev
emulation as each requires different handling of mmap(). This series
reworks fbdev emulation to provide an optimized emulation for each
of the memory managers.
Patch 1 fixes a minor bug in fbdev-generic.
Patches 2 to 8 implement fbdev-shmem, which is optimized for drivers
with SHMEM-based allocation. Patches 2 to 7 prepare deferred I/O to
support driver-custom page lookups. When the mmap'ed framebuffer sees
a pagefault, the deferred-I/O code can ask the graphics driver of the
page (instead of trying to detect it by itself). Using this hook,
patch 8 implements fbdev-shmem. The code is similar to fbdev-generic,
but does not require an additional shadow buffer for mmap(). Mmap'ed
pages are instead provided from the GEM buffer object. That saves a
few MiB of framebuffer memory and copying between the internal buffers.
Patches 9 to 20 convert SHMEM-based drivers to fbdev-shmem.
Patch 21 adds damage handling and deferred I/O to fbdev-dma. Such
code has been tested on the DMA-based omapdrm and can be adopted for
all drivers.
Patches 22 to 41 convert DMA-based drivers to fbdev-dma. These drivers
could not use it because of the missing support for damage handling.
Patch 42 renames fbdev-generic to fbdev-ttm. Only TTM-based drivers
still use it, so building it can be linked to TTM as well.
Patch 43 cleans up the documentation.
Tested with simpledrm, vc4 and amdgpu.
v3:
- fbdev-dma: init fb_ops with DMAMEM initializer (Javier)
- fbdev-shmem: clarify get_page usage (Javier)
v2:
- fbdev-shmem: use drm_driver_legacy_fb_format() (Geert)
- fix a few typos
Thomas Zimmermann (43):
drm/fbdev-generic: Do not set physical framebuffer address
fbdev/deferred-io: Move pageref setup into separate helper
fbdev/deferred-io: Clean up pageref on lastclose
fbdev/deferred-io: Test screen_buffer for vmalloc'ed memory
fbdev/deferred-io: Test smem_start for I/O memory
fbdev/deferred-io: Always call get_page() for framebuffer pages
fbdev/deferred-io: Provide get_page hook in struct fb_deferred_io
drm/fbdev: Add fbdev-shmem
drm/ast: Use fbdev-shmem
drm/gud: Use fbdev-shmem
drm/hyperv: Use fbdev-shmem
drm/mgag200: Use fbdev-shmem
drm/solomon: Use fbdev-shmem
drm/tiny/cirrus: Use fbdev-shmem
drm/tiny/gm12u320: Use fbdev-shmem
drm/tiny/ofdrm: Use fbdev-shmem
drm/tiny/simpledrm: Use fbdev-shmem
drm/udl: Use fbdev-shmem
drm/virtio: Use fbdev-shmem
drm/vkms: Use fbdev-shmem
drm/fbdev-dma: Implement damage handling and deferred I/O
drm/arm/komeda: Use fbdev-dma
drm/hisilicon/kirin: Use fbdev-dma
drm/imx/lcdc: Use fbdev-dma
drm/ingenic: Use fbdev-dma
drm/mediatek: Use fbdev-dma
drm/panel/panel-ilitek-9341: Use fbdev-dma
drm/renesas/rcar-du: Use fbdev-dma
drm/renesas/rz-du: Use fbdev-dma
drm/renesas/shmobile: Use fbdev-dma
drm/rockchip: Use fbdev-dma
drm/tiny/hx8357d: Use fbdev-dma
drm/tiny/ili9163: Use fbdev-dma
drm/tiny/ili9225: Use fbdev-dma
drm/tiny/ili9341: Use fbdev-dma
drm/tiny/ili9486: Use fbdev-dma
drm/tiny/mi0283qt: Use fbdev-dma
drm/tiny/panel-mipi-dbi: Use fbdev-dma
drm/tiny/repaper: Use fbdev-dma
drm/tiny/st7586: Use fbdev-dma
drm/tiny/st7735r: Use fbdev-dma
drm/fbdev-generic: Convert to fbdev-ttm
drm/fbdev: Clean up fbdev documentation
Documentation/gpu/drm-kms-helpers.rst | 12 +-
Documentation/gpu/todo.rst | 13 -
drivers/gpu/drm/Makefile | 6 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 6 +-
.../gpu/drm/arm/display/komeda/komeda_drv.c | 4 +-
drivers/gpu/drm/ast/ast_drv.c | 4 +-
drivers/gpu/drm/drm_drv.c | 2 +-
drivers/gpu/drm/drm_fb_helper.c | 11 +-
drivers/gpu/drm/drm_fbdev_dma.c | 65 +++-
drivers/gpu/drm/drm_fbdev_shmem.c | 316 ++++++++++++++++++
.../{drm_fbdev_generic.c => drm_fbdev_ttm.c} | 81 +++--
drivers/gpu/drm/gud/gud_drv.c | 4 +-
.../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 4 +-
.../gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 4 +-
drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 4 +-
drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 4 +-
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 +-
drivers/gpu/drm/loongson/Kconfig | 1 +
drivers/gpu/drm/loongson/lsdc_drv.c | 4 +-
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 +-
drivers/gpu/drm/mgag200/mgag200_drv.c | 4 +-
drivers/gpu/drm/nouveau/nouveau_drm.c | 6 +-
drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 +-
drivers/gpu/drm/qxl/qxl_drv.c | 4 +-
drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 +-
drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 4 +-
.../gpu/drm/renesas/shmobile/shmob_drm_drv.c | 4 +-
drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 4 +-
drivers/gpu/drm/solomon/ssd130x.c | 4 +-
drivers/gpu/drm/tiny/bochs.c | 4 +-
drivers/gpu/drm/tiny/cirrus.c | 4 +-
drivers/gpu/drm/tiny/gm12u320.c | 4 +-
drivers/gpu/drm/tiny/hx8357d.c | 4 +-
drivers/gpu/drm/tiny/ili9163.c | 4 +-
drivers/gpu/drm/tiny/ili9225.c | 4 +-
drivers/gpu/drm/tiny/ili9341.c | 4 +-
drivers/gpu/drm/tiny/ili9486.c | 4 +-
drivers/gpu/drm/tiny/mi0283qt.c | 4 +-
drivers/gpu/drm/tiny/ofdrm.c | 4 +-
drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 +-
drivers/gpu/drm/tiny/repaper.c | 4 +-
drivers/gpu/drm/tiny/simpledrm.c | 4 +-
drivers/gpu/drm/tiny/st7586.c | 4 +-
drivers/gpu/drm/tiny/st7735r.c | 4 +-
drivers/gpu/drm/udl/udl_drv.c | 4 +-
drivers/gpu/drm/vboxvideo/vbox_drv.c | 4 +-
drivers/gpu/drm/virtio/virtgpu_drv.c | 4 +-
drivers/gpu/drm/vkms/vkms_drv.c | 4 +-
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 4 +-
drivers/video/fbdev/core/fb_defio.c | 82 +++--
include/drm/drm_fbdev_generic.h | 15 -
include/drm/drm_fbdev_shmem.h | 15 +
include/drm/drm_fbdev_ttm.h | 15 +
include/drm/drm_mode_config.h | 4 +-
include/linux/fb.h | 1 +
55 files changed, 593 insertions(+), 210 deletions(-)
create mode 100644 drivers/gpu/drm/drm_fbdev_shmem.c
rename drivers/gpu/drm/{drm_fbdev_generic.c => drm_fbdev_ttm.c} (76%)
delete mode 100644 include/drm/drm_fbdev_generic.h
create mode 100644 include/drm/drm_fbdev_shmem.h
create mode 100644 include/drm/drm_fbdev_ttm.h
--
2.44.0
^ permalink raw reply [flat|nested] 55+ messages in thread
* [PATCH v3 01/43] drm/fbdev-generic: Do not set physical framebuffer address
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
@ 2024-04-19 8:28 ` Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 02/43] fbdev/deferred-io: Move pageref setup into separate helper Thomas Zimmermann
` (41 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Zack Rusin,
Maarten Lankhorst, Maxime Ripard, stable, Zack Rusin,
Sui Jingfeng
Framebuffer memory is allocated via vzalloc() from non-contiguous
physical pages. The physical framebuffer start address is therefore
meaningless. Do not set it.
The value is not used within the kernel and only exported to userspace
on dedicated ARM configs. No functional change is expected.
v2:
- refer to vzalloc() in commit message (Javier)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: a5b44c4adb16 ("drm/fbdev-generic: Always use shadow buffering")
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Cc: Zack Rusin <zackr@vmware.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: <stable@vger.kernel.org> # v6.4+
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Zack Rusin <zack.rusin@broadcom.com>
Reviewed-by: Sui Jingfeng <sui.jingfeng@linux.dev>
Tested-by: Sui Jingfeng <sui.jingfeng@linux.dev>
Acked-by: Maxime Ripard <mripard@kernel.org>
---
drivers/gpu/drm/drm_fbdev_generic.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_fbdev_generic.c b/drivers/gpu/drm/drm_fbdev_generic.c
index be357f926faec..97e579c33d84a 100644
--- a/drivers/gpu/drm/drm_fbdev_generic.c
+++ b/drivers/gpu/drm/drm_fbdev_generic.c
@@ -113,7 +113,6 @@ static int drm_fbdev_generic_helper_fb_probe(struct drm_fb_helper *fb_helper,
/* screen */
info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
info->screen_buffer = screen_buffer;
- info->fix.smem_start = page_to_phys(vmalloc_to_page(info->screen_buffer));
info->fix.smem_len = screen_size;
/* deferred I/O */
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 02/43] fbdev/deferred-io: Move pageref setup into separate helper
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 01/43] drm/fbdev-generic: Do not set physical framebuffer address Thomas Zimmermann
@ 2024-04-19 8:28 ` Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 03/43] fbdev/deferred-io: Clean up pageref on lastclose Thomas Zimmermann
` (40 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Set up struct fb_deferred_io_pageref in the new helper function
fb_deferred_io_pageref_lookup(), which runs when the pageref is first
taken. Remove the setup code from the rest of the code.
At first, the code allocates the memory of all pageref structs. The
setup of the various fields happens when the pageref is required.
v2:
- fix typo in commit message (Javier)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/video/fbdev/core/fb_defio.c | 42 ++++++++++++++++++++---------
1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index dae96c9f61cf8..bff1e300ed6bb 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -36,20 +36,43 @@ static struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs
return page;
}
+static struct fb_deferred_io_pageref *fb_deferred_io_pageref_lookup(struct fb_info *info,
+ unsigned long offset,
+ struct page *page)
+{
+ unsigned long pgoff = offset >> PAGE_SHIFT;
+ struct fb_deferred_io_pageref *pageref;
+
+ if (fb_WARN_ON_ONCE(info, pgoff >= info->npagerefs))
+ return NULL; /* incorrect allocation size */
+
+ /* 1:1 mapping between pageref and page offset */
+ pageref = &info->pagerefs[pgoff];
+
+ if (pageref->page)
+ goto out;
+
+ pageref->page = page;
+ pageref->offset = pgoff << PAGE_SHIFT;
+ INIT_LIST_HEAD(&pageref->list);
+
+out:
+ if (fb_WARN_ON_ONCE(info, pageref->page != page))
+ return NULL; /* inconsistent state */
+ return pageref;
+}
+
static struct fb_deferred_io_pageref *fb_deferred_io_pageref_get(struct fb_info *info,
unsigned long offset,
struct page *page)
{
struct fb_deferred_io *fbdefio = info->fbdefio;
struct list_head *pos = &fbdefio->pagereflist;
- unsigned long pgoff = offset >> PAGE_SHIFT;
struct fb_deferred_io_pageref *pageref, *cur;
- if (WARN_ON_ONCE(pgoff >= info->npagerefs))
- return NULL; /* incorrect allocation size */
-
- /* 1:1 mapping between pageref and page offset */
- pageref = &info->pagerefs[pgoff];
+ pageref = fb_deferred_io_pageref_lookup(info, offset, page);
+ if (!pageref)
+ return NULL;
/*
* This check is to catch the case where a new process could start
@@ -60,9 +83,6 @@ static struct fb_deferred_io_pageref *fb_deferred_io_pageref_get(struct fb_info
if (!list_empty(&pageref->list))
goto pageref_already_added;
- pageref->page = page;
- pageref->offset = pgoff << PAGE_SHIFT;
-
if (unlikely(fbdefio->sort_pagereflist)) {
/*
* We loop through the list of pagerefs before adding in
@@ -264,7 +284,7 @@ int fb_deferred_io_init(struct fb_info *info)
{
struct fb_deferred_io *fbdefio = info->fbdefio;
struct fb_deferred_io_pageref *pagerefs;
- unsigned long npagerefs, i;
+ unsigned long npagerefs;
int ret;
BUG_ON(!fbdefio);
@@ -286,8 +306,6 @@ int fb_deferred_io_init(struct fb_info *info)
ret = -ENOMEM;
goto err;
}
- for (i = 0; i < npagerefs; ++i)
- INIT_LIST_HEAD(&pagerefs[i].list);
info->npagerefs = npagerefs;
info->pagerefs = pagerefs;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 03/43] fbdev/deferred-io: Clean up pageref on lastclose
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 01/43] drm/fbdev-generic: Do not set physical framebuffer address Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 02/43] fbdev/deferred-io: Move pageref setup into separate helper Thomas Zimmermann
@ 2024-04-19 8:28 ` Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 04/43] fbdev/deferred-io: Test screen_buffer for vmalloc'ed memory Thomas Zimmermann
` (39 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Clean up the pageref state as part of the lastclose helper. This
only requires to clear the page's mapping field. The pageref and
page can stay in place for the next opened instance of the frame-
buffer file.
With the change in the clean-up logic, there's no further need
to look up pages during the lastclose cleanup. The code instead
uses the existing pagerefs in its look-up table. It also avoids
using smem_len, which some driver might not set correctly.
v2:
- fix typos in commit message (Javier)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/video/fbdev/core/fb_defio.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index bff1e300ed6bb..f23b1cbe67192 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -62,6 +62,14 @@ static struct fb_deferred_io_pageref *fb_deferred_io_pageref_lookup(struct fb_in
return pageref;
}
+static void fb_deferred_io_pageref_clear(struct fb_deferred_io_pageref *pageref)
+{
+ struct page *page = pageref->page;
+
+ if (page)
+ page->mapping = NULL;
+}
+
static struct fb_deferred_io_pageref *fb_deferred_io_pageref_get(struct fb_info *info,
unsigned long offset,
struct page *page)
@@ -330,16 +338,13 @@ EXPORT_SYMBOL_GPL(fb_deferred_io_open);
static void fb_deferred_io_lastclose(struct fb_info *info)
{
- struct page *page;
- int i;
+ unsigned long i;
flush_delayed_work(&info->deferred_work);
/* clear out the mapping that we setup */
- for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) {
- page = fb_deferred_io_page(info, i);
- page->mapping = NULL;
- }
+ for (i = 0; i < info->npagerefs; ++i)
+ fb_deferred_io_pageref_clear(&info->pagerefs[i]);
}
void fb_deferred_io_release(struct fb_info *info)
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 04/43] fbdev/deferred-io: Test screen_buffer for vmalloc'ed memory
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (2 preceding siblings ...)
2024-04-19 8:28 ` [PATCH v3 03/43] fbdev/deferred-io: Clean up pageref on lastclose Thomas Zimmermann
@ 2024-04-19 8:28 ` Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 05/43] fbdev/deferred-io: Test smem_start for I/O memory Thomas Zimmermann
` (38 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Framebuffers in virtual memory are available via screen_buffer. Use
it instead of screen_base and avoid the type casting.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/video/fbdev/core/fb_defio.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index f23b1cbe67192..b38f775cd39dd 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -25,11 +25,11 @@
static struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs)
{
- void *screen_base = (void __force *) info->screen_base;
+ const void *screen_buffer = info->screen_buffer;
struct page *page;
- if (is_vmalloc_addr(screen_base + offs))
- page = vmalloc_to_page(screen_base + offs);
+ if (is_vmalloc_addr(screen_buffer + offs))
+ page = vmalloc_to_page(screen_buffer + offs);
else
page = pfn_to_page((info->fix.smem_start + offs) >> PAGE_SHIFT);
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 05/43] fbdev/deferred-io: Test smem_start for I/O memory
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (3 preceding siblings ...)
2024-04-19 8:28 ` [PATCH v3 04/43] fbdev/deferred-io: Test screen_buffer for vmalloc'ed memory Thomas Zimmermann
@ 2024-04-19 8:28 ` Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 06/43] fbdev/deferred-io: Always call get_page() for framebuffer pages Thomas Zimmermann
` (37 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Test smem_start before looking up pages from its value. Return
NULL if it is unset. This will result in a SIGBUS signal.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/video/fbdev/core/fb_defio.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index b38f775cd39dd..fe84218ded457 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -26,11 +26,11 @@
static struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs)
{
const void *screen_buffer = info->screen_buffer;
- struct page *page;
+ struct page *page = NULL;
if (is_vmalloc_addr(screen_buffer + offs))
page = vmalloc_to_page(screen_buffer + offs);
- else
+ else if (info->fix.smem_start)
page = pfn_to_page((info->fix.smem_start + offs) >> PAGE_SHIFT);
return page;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 06/43] fbdev/deferred-io: Always call get_page() for framebuffer pages
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (4 preceding siblings ...)
2024-04-19 8:28 ` [PATCH v3 05/43] fbdev/deferred-io: Test smem_start for I/O memory Thomas Zimmermann
@ 2024-04-19 8:28 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 07/43] fbdev/deferred-io: Provide get_page hook in struct fb_deferred_io Thomas Zimmermann
` (36 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:28 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Unconditionally call get_page() after looking up a page from the
framebuffer memory. Guarantees that we always hold a reference.
This change also refactors the code such that it can support a
driver-supplied get_page helper. This will be useful for DRM's
fbdev emulation.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/video/fbdev/core/fb_defio.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index fe84218ded457..6e0bbcfdb01b5 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -23,7 +23,7 @@
#include <linux/rmap.h>
#include <linux/pagemap.h>
-static struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs)
+static struct page *fb_deferred_io_get_page(struct fb_info *info, unsigned long offs)
{
const void *screen_buffer = info->screen_buffer;
struct page *page = NULL;
@@ -33,6 +33,9 @@ static struct page *fb_deferred_io_page(struct fb_info *info, unsigned long offs
else if (info->fix.smem_start)
page = pfn_to_page((info->fix.smem_start + offs) >> PAGE_SHIFT);
+ if (page)
+ get_page(page);
+
return page;
}
@@ -129,12 +132,10 @@ static vm_fault_t fb_deferred_io_fault(struct vm_fault *vmf)
if (offset >= info->fix.smem_len)
return VM_FAULT_SIGBUS;
- page = fb_deferred_io_page(info, offset);
+ page = fb_deferred_io_get_page(info, offset);
if (!page)
return VM_FAULT_SIGBUS;
- get_page(page);
-
if (vmf->vma->vm_file)
page->mapping = vmf->vma->vm_file->f_mapping;
else
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 07/43] fbdev/deferred-io: Provide get_page hook in struct fb_deferred_io
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (5 preceding siblings ...)
2024-04-19 8:28 ` [PATCH v3 06/43] fbdev/deferred-io: Always call get_page() for framebuffer pages Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 08/43] drm/fbdev: Add fbdev-shmem Thomas Zimmermann
` (35 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Add a callback for drivers to provide framebuffer pages to fbdev's
deferred-I/O helpers. Implementations need to acquire a reference on
the page before returning it. Returning NULL generates a SIGBUS
signal.
This will be useful for DRM's fbdev emulation with GEM-shmem buffer
objects.
v2:
- fix typo in commit message (Javier)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/video/fbdev/core/fb_defio.c | 4 ++++
include/linux/fb.h | 1 +
2 files changed, 5 insertions(+)
diff --git a/drivers/video/fbdev/core/fb_defio.c b/drivers/video/fbdev/core/fb_defio.c
index 6e0bbcfdb01b5..51928ff7961a5 100644
--- a/drivers/video/fbdev/core/fb_defio.c
+++ b/drivers/video/fbdev/core/fb_defio.c
@@ -25,9 +25,13 @@
static struct page *fb_deferred_io_get_page(struct fb_info *info, unsigned long offs)
{
+ struct fb_deferred_io *fbdefio = info->fbdefio;
const void *screen_buffer = info->screen_buffer;
struct page *page = NULL;
+ if (fbdefio->get_page)
+ return fbdefio->get_page(info, offs);
+
if (is_vmalloc_addr(screen_buffer + offs))
page = vmalloc_to_page(screen_buffer + offs);
else if (info->fix.smem_start)
diff --git a/include/linux/fb.h b/include/linux/fb.h
index 3417103885e27..4eb6afa93737c 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -225,6 +225,7 @@ struct fb_deferred_io {
struct mutex lock; /* mutex that protects the pageref list */
struct list_head pagereflist; /* list of pagerefs for touched pages */
/* callback */
+ struct page *(*get_page)(struct fb_info *info, unsigned long offset);
void (*deferred_io)(struct fb_info *info, struct list_head *pagelist);
};
#endif
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 08/43] drm/fbdev: Add fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (6 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 07/43] fbdev/deferred-io: Provide get_page hook in struct fb_deferred_io Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 09/43] drm/ast: Use fbdev-shmem Thomas Zimmermann
` (34 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Add an fbdev emulation for SHMEM-based memory managers. The code is
similar to fbdev-generic, but does not require an additional shadow
buffer for mmap(). Fbdev-shmem operates directly on the buffer object's
SHMEM pages. Fbdev's deferred-I/O mechanism updates the hardware state
on write operations.
The memory pages of GEM SHMEM cannot be detected by fbdefio. Therefore
fbdev-shmem implements the .get_page() hook in struct fb_deferred_io.
The fbdefio helpers call this hook to retrieve the page directly from
fbdev-shmem instead of trying to detect it internally.
v3:
- clarify on get_page mechanism in commit description (Javier)
v2:
- use drm_driver_legacy_fb_format() (Geert)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/drm_fbdev_shmem.c | 316 ++++++++++++++++++++++++++++++
include/drm/drm_fbdev_shmem.h | 15 ++
3 files changed, 332 insertions(+)
create mode 100644 drivers/gpu/drm/drm_fbdev_shmem.c
create mode 100644 include/drm/drm_fbdev_shmem.h
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index a73c04d2d7a39..50a2f0cffdac2 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -107,6 +107,7 @@ drm_dma_helper-$(CONFIG_DRM_KMS_HELPER) += drm_fb_dma_helper.o
obj-$(CONFIG_DRM_GEM_DMA_HELPER) += drm_dma_helper.o
drm_shmem_helper-y := drm_gem_shmem_helper.o
+drm_shmem_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fbdev_shmem.o
obj-$(CONFIG_DRM_GEM_SHMEM_HELPER) += drm_shmem_helper.o
drm_suballoc_helper-y := drm_suballoc.o
diff --git a/drivers/gpu/drm/drm_fbdev_shmem.c b/drivers/gpu/drm/drm_fbdev_shmem.c
new file mode 100644
index 0000000000000..a85a8a8e2eb8b
--- /dev/null
+++ b/drivers/gpu/drm/drm_fbdev_shmem.c
@@ -0,0 +1,316 @@
+// SPDX-License-Identifier: MIT
+
+#include <linux/fb.h>
+
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_framebuffer.h>
+#include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_gem_shmem_helper.h>
+
+#include <drm/drm_fbdev_shmem.h>
+
+/*
+ * struct fb_ops
+ */
+
+static int drm_fbdev_shmem_fb_open(struct fb_info *info, int user)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+
+ /* No need to take a ref for fbcon because it unbinds on unregister */
+ if (user && !try_module_get(fb_helper->dev->driver->fops->owner))
+ return -ENODEV;
+
+ return 0;
+}
+
+static int drm_fbdev_shmem_fb_release(struct fb_info *info, int user)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+
+ if (user)
+ module_put(fb_helper->dev->driver->fops->owner);
+
+ return 0;
+}
+
+FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_shmem,
+ drm_fb_helper_damage_range,
+ drm_fb_helper_damage_area);
+
+static int drm_fbdev_shmem_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+ struct drm_framebuffer *fb = fb_helper->fb;
+ struct drm_gem_object *obj = drm_gem_fb_get_obj(fb, 0);
+ struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+
+ if (shmem->map_wc)
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ return fb_deferred_io_mmap(info, vma);
+}
+
+static void drm_fbdev_shmem_fb_destroy(struct fb_info *info)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+
+ if (!fb_helper->dev)
+ return;
+
+ drm_fb_helper_fini(fb_helper);
+
+ drm_client_buffer_vunmap(fb_helper->buffer);
+ drm_client_framebuffer_delete(fb_helper->buffer);
+ drm_client_release(&fb_helper->client);
+ drm_fb_helper_unprepare(fb_helper);
+ kfree(fb_helper);
+}
+
+static const struct fb_ops drm_fbdev_shmem_fb_ops = {
+ .owner = THIS_MODULE,
+ .fb_open = drm_fbdev_shmem_fb_open,
+ .fb_release = drm_fbdev_shmem_fb_release,
+ __FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_shmem),
+ DRM_FB_HELPER_DEFAULT_OPS,
+ __FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_shmem),
+ .fb_mmap = drm_fbdev_shmem_fb_mmap,
+ .fb_destroy = drm_fbdev_shmem_fb_destroy,
+};
+
+static struct page *drm_fbdev_shmem_get_page(struct fb_info *info, unsigned long offset)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+ struct drm_framebuffer *fb = fb_helper->fb;
+ struct drm_gem_object *obj = drm_gem_fb_get_obj(fb, 0);
+ struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj);
+ unsigned int i = offset >> PAGE_SHIFT;
+ struct page *page;
+
+ if (fb_WARN_ON_ONCE(info, offset > obj->size))
+ return NULL;
+
+ page = shmem->pages[i]; // protected by active vmap
+ if (page)
+ get_page(page);
+ fb_WARN_ON_ONCE(info, !page);
+
+ return page;
+}
+
+/*
+ * struct drm_fb_helper
+ */
+
+static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper,
+ struct drm_fb_helper_surface_size *sizes)
+{
+ struct drm_client_dev *client = &fb_helper->client;
+ struct drm_device *dev = fb_helper->dev;
+ struct drm_client_buffer *buffer;
+ struct drm_gem_shmem_object *shmem;
+ struct drm_framebuffer *fb;
+ struct fb_info *info;
+ u32 format;
+ struct iosys_map map;
+ int ret;
+
+ drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
+ sizes->surface_width, sizes->surface_height,
+ sizes->surface_bpp);
+
+ format = drm_driver_legacy_fb_format(dev, sizes->surface_bpp, sizes->surface_depth);
+ buffer = drm_client_framebuffer_create(client, sizes->surface_width,
+ sizes->surface_height, format);
+ if (IS_ERR(buffer))
+ return PTR_ERR(buffer);
+ shmem = to_drm_gem_shmem_obj(buffer->gem);
+
+ fb = buffer->fb;
+
+ ret = drm_client_buffer_vmap(buffer, &map);
+ if (ret) {
+ goto err_drm_client_buffer_delete;
+ } else if (drm_WARN_ON(dev, map.is_iomem)) {
+ ret = -ENODEV; /* I/O memory not supported; use generic emulation */
+ goto err_drm_client_buffer_delete;
+ }
+
+ fb_helper->buffer = buffer;
+ fb_helper->fb = fb;
+
+ info = drm_fb_helper_alloc_info(fb_helper);
+ if (IS_ERR(info)) {
+ ret = PTR_ERR(info);
+ goto err_drm_client_buffer_vunmap;
+ }
+
+ drm_fb_helper_fill_info(info, fb_helper, sizes);
+
+ info->fbops = &drm_fbdev_shmem_fb_ops;
+
+ /* screen */
+ info->flags |= FBINFO_VIRTFB; /* system memory */
+ if (!shmem->map_wc)
+ info->flags |= FBINFO_READS_FAST; /* signal caching */
+ info->screen_size = sizes->surface_height * fb->pitches[0];
+ info->screen_buffer = map.vaddr;
+ info->fix.smem_len = info->screen_size;
+
+ /* deferred I/O */
+ fb_helper->fbdefio.delay = HZ / 20;
+ fb_helper->fbdefio.get_page = drm_fbdev_shmem_get_page;
+ fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
+
+ info->fbdefio = &fb_helper->fbdefio;
+ ret = fb_deferred_io_init(info);
+ if (ret)
+ goto err_drm_fb_helper_release_info;
+
+ return 0;
+
+err_drm_fb_helper_release_info:
+ drm_fb_helper_release_info(fb_helper);
+err_drm_client_buffer_vunmap:
+ fb_helper->fb = NULL;
+ fb_helper->buffer = NULL;
+ drm_client_buffer_vunmap(buffer);
+err_drm_client_buffer_delete:
+ drm_client_framebuffer_delete(buffer);
+ return ret;
+}
+
+static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper,
+ struct drm_clip_rect *clip)
+{
+ struct drm_device *dev = helper->dev;
+ int ret;
+
+ /* Call damage handlers only if necessary */
+ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+ return 0;
+
+ if (helper->fb->funcs->dirty) {
+ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = {
+ .fb_probe = drm_fbdev_shmem_helper_fb_probe,
+ .fb_dirty = drm_fbdev_shmem_helper_fb_dirty,
+};
+
+/*
+ * struct drm_client_funcs
+ */
+
+static void drm_fbdev_shmem_client_unregister(struct drm_client_dev *client)
+{
+ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+ if (fb_helper->info) {
+ drm_fb_helper_unregister_info(fb_helper);
+ } else {
+ drm_client_release(&fb_helper->client);
+ drm_fb_helper_unprepare(fb_helper);
+ kfree(fb_helper);
+ }
+}
+
+static int drm_fbdev_shmem_client_restore(struct drm_client_dev *client)
+{
+ drm_fb_helper_lastclose(client->dev);
+
+ return 0;
+}
+
+static int drm_fbdev_shmem_client_hotplug(struct drm_client_dev *client)
+{
+ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+ struct drm_device *dev = client->dev;
+ int ret;
+
+ if (dev->fb_helper)
+ return drm_fb_helper_hotplug_event(dev->fb_helper);
+
+ ret = drm_fb_helper_init(dev, fb_helper);
+ if (ret)
+ goto err_drm_err;
+
+ if (!drm_drv_uses_atomic_modeset(dev))
+ drm_helper_disable_unused_functions(dev);
+
+ ret = drm_fb_helper_initial_config(fb_helper);
+ if (ret)
+ goto err_drm_fb_helper_fini;
+
+ return 0;
+
+err_drm_fb_helper_fini:
+ drm_fb_helper_fini(fb_helper);
+err_drm_err:
+ drm_err(dev, "fbdev-shmem: Failed to setup emulation (ret=%d)\n", ret);
+ return ret;
+}
+
+static const struct drm_client_funcs drm_fbdev_shmem_client_funcs = {
+ .owner = THIS_MODULE,
+ .unregister = drm_fbdev_shmem_client_unregister,
+ .restore = drm_fbdev_shmem_client_restore,
+ .hotplug = drm_fbdev_shmem_client_hotplug,
+};
+
+/**
+ * drm_fbdev_shmem_setup() - Setup fbdev emulation for GEM SHMEM helpers
+ * @dev: DRM device
+ * @preferred_bpp: Preferred bits per pixel for the device.
+ * 32 is used if this is zero.
+ *
+ * This function sets up fbdev emulation for GEM DMA drivers that support
+ * dumb buffers with a virtual address and that can be mmap'ed.
+ * drm_fbdev_shmem_setup() shall be called after the DRM driver registered
+ * the new DRM device with drm_dev_register().
+ *
+ * Restore, hotplug events and teardown are all taken care of. Drivers that do
+ * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
+ * Simple drivers might use drm_mode_config_helper_suspend().
+ *
+ * This function is safe to call even when there are no connectors present.
+ * Setup will be retried on the next hotplug event.
+ *
+ * The fbdev is destroyed by drm_dev_unregister().
+ */
+void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
+{
+ struct drm_fb_helper *fb_helper;
+ int ret;
+
+ drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
+ drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
+
+ fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
+ if (!fb_helper)
+ return;
+ drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_shmem_helper_funcs);
+
+ ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_shmem_client_funcs);
+ if (ret) {
+ drm_err(dev, "Failed to register client: %d\n", ret);
+ goto err_drm_client_init;
+ }
+
+ drm_client_register(&fb_helper->client);
+
+ return;
+
+err_drm_client_init:
+ drm_fb_helper_unprepare(fb_helper);
+ kfree(fb_helper);
+}
+EXPORT_SYMBOL(drm_fbdev_shmem_setup);
diff --git a/include/drm/drm_fbdev_shmem.h b/include/drm/drm_fbdev_shmem.h
new file mode 100644
index 0000000000000..fb43cadd1950c
--- /dev/null
+++ b/include/drm/drm_fbdev_shmem.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_FBDEV_SHMEM_H
+#define DRM_FBDEV_SHMEM_H
+
+struct drm_device;
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp);
+#else
+static inline void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp)
+{ }
+#endif
+
+#endif
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 09/43] drm/ast: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (7 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 08/43] drm/fbdev: Add fbdev-shmem Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 10/43] drm/gud: " Thomas Zimmermann
` (33 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Dave Airlie,
Jocelyn Falempe
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jocelyn Falempe <jfalempe@redhat.com>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
---
drivers/gpu/drm/ast/ast_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c
index f8c49ba68e789..aae019e79bda8 100644
--- a/drivers/gpu/drm/ast/ast_drv.c
+++ b/drivers/gpu/drm/ast/ast_drv.c
@@ -33,7 +33,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_module.h>
#include <drm/drm_probe_helper.h>
@@ -360,7 +360,7 @@ static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (ret)
return ret;
- drm_fbdev_generic_setup(drm, 32);
+ drm_fbdev_shmem_setup(drm, 32);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 10/43] drm/gud: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (8 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 09/43] drm/ast: Use fbdev-shmem Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 11/43] drm/hyperv: " Thomas Zimmermann
` (32 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Noralf Trønnes
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
---
drivers/gpu/drm/gud/gud_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c
index 9d7bf8ee45f13..4f5aa2e5cb890 100644
--- a/drivers/gpu/drm/gud/gud_drv.c
+++ b/drivers/gpu/drm/gud/gud_drv.c
@@ -18,7 +18,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_debugfs.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
@@ -622,7 +622,7 @@ static int gud_probe(struct usb_interface *intf, const struct usb_device_id *id)
drm_kms_helper_poll_init(drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_shmem_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 11/43] drm/hyperv: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (9 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 10/43] drm/gud: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 12/43] drm/mgag200: " Thomas Zimmermann
` (31 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Deepak Rawat
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Deepak Rawat <drawat.floss@gmail.com>
Reviewed-by: Deepak Rawat <drawat.floss@gmail.com>
---
drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
index cff85086f2d66..ff93e08d5036d 100644
--- a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
+++ b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c
@@ -11,7 +11,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_simple_kms_helper.h>
@@ -149,7 +149,7 @@ static int hyperv_vmbus_probe(struct hv_device *hdev,
goto err_free_mmio;
}
- drm_fbdev_generic_setup(dev, 0);
+ drm_fbdev_shmem_setup(dev, 0);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 12/43] drm/mgag200: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (10 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 11/43] drm/hyperv: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 13/43] drm/solomon: " Thomas Zimmermann
` (30 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Dave Airlie,
Jocelyn Falempe
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jocelyn Falempe <jfalempe@redhat.com>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
---
drivers/gpu/drm/mgag200/mgag200_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c
index 573dbe256aa8b..65f2ed18b31c5 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.c
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.c
@@ -12,7 +12,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_file.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_managed.h>
@@ -285,7 +285,7 @@ mgag200_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
* FIXME: A 24-bit color depth does not work with 24 bpp on
* G200ER. Force 32 bpp.
*/
- drm_fbdev_generic_setup(dev, 32);
+ drm_fbdev_shmem_setup(dev, 32);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 13/43] drm/solomon: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (11 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 12/43] drm/mgag200: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 14/43] drm/tiny/cirrus: " Thomas Zimmermann
` (29 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/solomon/ssd130x.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/solomon/ssd130x.c b/drivers/gpu/drm/solomon/ssd130x.c
index ebd943b9e357b..6f51bcf774e27 100644
--- a/drivers/gpu/drm/solomon/ssd130x.c
+++ b/drivers/gpu/drm/solomon/ssd130x.c
@@ -23,7 +23,7 @@
#include <drm/drm_crtc_helper.h>
#include <drm/drm_damage_helper.h>
#include <drm/drm_edid.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -2029,7 +2029,7 @@ struct ssd130x_device *ssd130x_probe(struct device *dev, struct regmap *regmap)
if (ret)
return ERR_PTR(dev_err_probe(dev, ret, "DRM device register failed\n"));
- drm_fbdev_generic_setup(drm, 32);
+ drm_fbdev_shmem_setup(drm, 32);
return ssd130x;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 14/43] drm/tiny/cirrus: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (12 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 13/43] drm/solomon: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 15/43] drm/tiny/gm12u320: " Thomas Zimmermann
` (28 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/cirrus.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/cirrus.c b/drivers/gpu/drm/tiny/cirrus.c
index 4e3a152f897ac..3ac4f310aa2ad 100644
--- a/drivers/gpu/drm/tiny/cirrus.c
+++ b/drivers/gpu/drm/tiny/cirrus.c
@@ -31,7 +31,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_drv.h>
#include <drm/drm_edid.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_file.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_fourcc.h>
@@ -716,7 +716,7 @@ static int cirrus_pci_probe(struct pci_dev *pdev,
if (ret)
return ret;
- drm_fbdev_generic_setup(dev, 16);
+ drm_fbdev_shmem_setup(dev, 16);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 15/43] drm/tiny/gm12u320: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (13 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 14/43] drm/tiny/cirrus: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 16/43] drm/tiny/ofdrm: " Thomas Zimmermann
` (27 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Hans de Goede
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/gpu/drm/tiny/gm12u320.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/gm12u320.c b/drivers/gpu/drm/tiny/gm12u320.c
index 0187539ff5eaa..8b4efd39d7c41 100644
--- a/drivers/gpu/drm/tiny/gm12u320.c
+++ b/drivers/gpu/drm/tiny/gm12u320.c
@@ -13,7 +13,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_drv.h>
#include <drm/drm_edid.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_file.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_fourcc.h>
@@ -699,7 +699,7 @@ static int gm12u320_usb_probe(struct usb_interface *interface,
if (ret)
goto err_put_device;
- drm_fbdev_generic_setup(dev, 0);
+ drm_fbdev_shmem_setup(dev, 0);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 16/43] drm/tiny/ofdrm: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (14 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 15/43] drm/tiny/gm12u320: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 17/43] drm/tiny/simpledrm: " Thomas Zimmermann
` (26 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/ofdrm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/ofdrm.c b/drivers/gpu/drm/tiny/ofdrm.c
index ab89b7fc7bf61..35996f7eedac0 100644
--- a/drivers/gpu/drm/tiny/ofdrm.c
+++ b/drivers/gpu/drm/tiny/ofdrm.c
@@ -11,7 +11,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_device.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -1377,7 +1377,7 @@ static int ofdrm_probe(struct platform_device *pdev)
if (color_mode == 16)
color_mode = odev->format->depth; // can be 15 or 16
- drm_fbdev_generic_setup(dev, color_mode);
+ drm_fbdev_shmem_setup(dev, color_mode);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 17/43] drm/tiny/simpledrm: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (15 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 16/43] drm/tiny/ofdrm: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 18/43] drm/udl: " Thomas Zimmermann
` (25 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/simpledrm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
index 7ce1c46176750..3cb09ad5f7537 100644
--- a/drivers/gpu/drm/tiny/simpledrm.c
+++ b/drivers/gpu/drm/tiny/simpledrm.c
@@ -17,7 +17,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_device.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -1026,7 +1026,7 @@ static int simpledrm_probe(struct platform_device *pdev)
if (color_mode == 16)
color_mode = sdev->format->depth; // can be 15 or 16
- drm_fbdev_generic_setup(dev, color_mode);
+ drm_fbdev_shmem_setup(dev, color_mode);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 18/43] drm/udl: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (16 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 17/43] drm/tiny/simpledrm: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 19/43] drm/virtio: " Thomas Zimmermann
` (24 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Dave Airlie, Sean Paul
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Sean Paul <sean@poorly.run>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/udl/udl_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c
index 1506094a80098..9612e9af27a47 100644
--- a/drivers/gpu/drm/udl/udl_drv.c
+++ b/drivers/gpu/drm/udl/udl_drv.c
@@ -6,7 +6,7 @@
#include <linux/module.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_file.h>
#include <drm/drm_gem_shmem_helper.h>
#include <drm/drm_managed.h>
@@ -117,7 +117,7 @@ static int udl_usb_probe(struct usb_interface *interface,
DRM_INFO("Initialized udl on minor %d\n", udl->drm.primary->index);
- drm_fbdev_generic_setup(&udl->drm, 0);
+ drm_fbdev_shmem_setup(&udl->drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 19/43] drm/virtio: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (17 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 18/43] drm/udl: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 20/43] drm/vkms: " Thomas Zimmermann
` (23 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, David Airlie,
Gerd Hoffmann, Gurchetan Singh, Chia-I Wu, Dmitry Osipenko
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Airlie <airlied@redhat.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/virtio/virtgpu_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c
index 9539aa28937fa..3d626bbaab9e4 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.c
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.c
@@ -35,7 +35,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_file.h>
#include "virtgpu_drv.h"
@@ -103,7 +103,7 @@ static int virtio_gpu_probe(struct virtio_device *vdev)
if (ret)
goto err_deinit;
- drm_fbdev_generic_setup(vdev->priv, 32);
+ drm_fbdev_shmem_setup(vdev->priv, 32);
return 0;
err_deinit:
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 20/43] drm/vkms: Use fbdev-shmem
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (18 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 19/43] drm/virtio: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O Thomas Zimmermann
` (22 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Rodrigo Siqueira,
Melissa Wen, Maíra Canal, Haneen Mohammed, Maíra Canal
Implement fbdev emulation with fbdev-shmem. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Cc: Melissa Wen <melissa.srw@gmail.com>
Cc: "Maíra Canal" <mairacanal@riseup.net>
Cc: Haneen Mohammed <hamohammed.sa@gmail.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Maíra Canal <mcanal@igalia.com>
---
drivers/gpu/drm/vkms/vkms_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index dd0af086e7fa9..8dc9dc13896e9 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -17,7 +17,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_shmem.h>
#include <drm/drm_file.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_ioctl.h>
@@ -223,7 +223,7 @@ static int vkms_create(struct vkms_config *config)
if (ret)
goto out_devres;
- drm_fbdev_generic_setup(&vkms_device->drm, 0);
+ drm_fbdev_shmem_setup(&vkms_device->drm, 0);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (19 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 20/43] drm/vkms: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-09-03 22:53 ` Linus Walleij
2024-04-19 8:29 ` [PATCH v3 22/43] drm/arm/komeda: Use fbdev-dma Thomas Zimmermann
` (21 subsequent siblings)
42 siblings, 1 reply; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Add support for damage handling and deferred I/O to fbdev-dma. This
enables fbdev-dma to support all DMA-memory-based DRM drivers, even
such with a dirty callback in their framebuffers.
The patch adds the code for deferred I/O and also sets a dedicated
helper for struct fb_ops.fb_mmap that support coherent mappings.
v3:
- init fb_ops with FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS() (Javier)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/drm_fbdev_dma.c | 65 ++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 6c9427bb4053b..5eeb5164e9e2b 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -4,6 +4,7 @@
#include <drm/drm_crtc_helper.h>
#include <drm/drm_drv.h>
+#include <drm/drm_fb_dma_helper.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_dma_helper.h>
@@ -35,6 +36,22 @@ static int drm_fbdev_dma_fb_release(struct fb_info *info, int user)
return 0;
}
+FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma,
+ drm_fb_helper_damage_range,
+ drm_fb_helper_damage_area);
+
+static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+ struct drm_framebuffer *fb = fb_helper->fb;
+ struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
+
+ if (!dma->map_noncoherent)
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ return fb_deferred_io_mmap(info, vma);
+}
+
static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
{
struct drm_fb_helper *fb_helper = info->par;
@@ -51,20 +68,13 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
kfree(fb_helper);
}
-static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
-{
- struct drm_fb_helper *fb_helper = info->par;
-
- return drm_gem_prime_mmap(fb_helper->buffer->gem, vma);
-}
-
static const struct fb_ops drm_fbdev_dma_fb_ops = {
.owner = THIS_MODULE,
.fb_open = drm_fbdev_dma_fb_open,
.fb_release = drm_fbdev_dma_fb_release,
- __FB_DEFAULT_DMAMEM_OPS_RDWR,
+ __FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_dma),
DRM_FB_HELPER_DEFAULT_OPS,
- __FB_DEFAULT_DMAMEM_OPS_DRAW,
+ __FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_dma),
.fb_mmap = drm_fbdev_dma_fb_mmap,
.fb_destroy = drm_fbdev_dma_fb_destroy,
};
@@ -98,10 +108,6 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
dma_obj = to_drm_gem_dma_obj(buffer->gem);
fb = buffer->fb;
- if (drm_WARN_ON(dev, fb->funcs->dirty)) {
- ret = -ENODEV; /* damage handling not supported; use generic emulation */
- goto err_drm_client_buffer_delete;
- }
ret = drm_client_buffer_vmap(buffer, &map);
if (ret) {
@@ -112,7 +118,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
}
fb_helper->buffer = buffer;
- fb_helper->fb = buffer->fb;
+ fb_helper->fb = fb;
info = drm_fb_helper_alloc_info(fb_helper);
if (IS_ERR(info)) {
@@ -133,8 +139,19 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer));
info->fix.smem_len = info->screen_size;
+ /* deferred I/O */
+ fb_helper->fbdefio.delay = HZ / 20;
+ fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
+
+ info->fbdefio = &fb_helper->fbdefio;
+ ret = fb_deferred_io_init(info);
+ if (ret)
+ goto err_drm_fb_helper_release_info;
+
return 0;
+err_drm_fb_helper_release_info:
+ drm_fb_helper_release_info(fb_helper);
err_drm_client_buffer_vunmap:
fb_helper->fb = NULL;
fb_helper->buffer = NULL;
@@ -144,8 +161,28 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
return ret;
}
+static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
+ struct drm_clip_rect *clip)
+{
+ struct drm_device *dev = helper->dev;
+ int ret;
+
+ /* Call damage handlers only if necessary */
+ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+ return 0;
+
+ if (helper->fb->funcs->dirty) {
+ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
+ return ret;
+ }
+
+ return 0;
+}
+
static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
.fb_probe = drm_fbdev_dma_helper_fb_probe,
+ .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
};
/*
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 22/43] drm/arm/komeda: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (20 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 23/43] drm/hisilicon/kirin: " Thomas Zimmermann
` (20 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Liviu Dudau
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by komeda. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
---
drivers/gpu/drm/arm/display/komeda/komeda_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index cc57ea4e13ae6..ffdeec3b3f2ea 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -9,7 +9,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_module.h>
#include <drm/drm_of.h>
#include "komeda_dev.h"
@@ -80,7 +80,7 @@ static int komeda_platform_probe(struct platform_device *pdev)
}
dev_set_drvdata(dev, mdrv);
- drm_fbdev_generic_setup(&mdrv->kms->base, 32);
+ drm_fbdev_dma_setup(&mdrv->kms->base, 32);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 23/43] drm/hisilicon/kirin: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (21 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 22/43] drm/arm/komeda: Use fbdev-dma Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 24/43] drm/imx/lcdc: " Thomas Zimmermann
` (19 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Xinliang Liu, Tian Tao,
Xinwei Kong, Sumit Semwal, Yongqin Liu, John Stultz
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by kirin. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Xinliang Liu <xinliang.liu@linaro.org>
Cc: Tian Tao <tiantao6@hisilicon.com>
Cc: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Cc: Yongqin Liu <yongqin.liu@linaro.org>
Cc: John Stultz <jstultz@google.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
index 75292a2f46445..12666985686b9 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
@@ -19,7 +19,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_module.h>
@@ -237,7 +237,7 @@ static int kirin_drm_bind(struct device *dev)
if (ret)
goto err_kms_cleanup;
- drm_fbdev_generic_setup(drm_dev, 32);
+ drm_fbdev_dma_setup(drm_dev, 32);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 24/43] drm/imx/lcdc: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (22 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 23/43] drm/hisilicon/kirin: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 25/43] drm/ingenic: " Thomas Zimmermann
` (18 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
NXP Linux Team
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by lcdc. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Pengutronix Kernel Team <kernel@pengutronix.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: NXP Linux Team <linux-imx@nxp.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
index 43ddf3a9810b6..36668455aee8c 100644
--- a/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
+++ b/drivers/gpu/drm/imx/lcdc/imx-lcdc.c
@@ -5,7 +5,7 @@
#include <drm/drm_bridge_connector.h>
#include <drm/drm_damage_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_fb_dma_helper.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_framebuffer.h>
@@ -501,7 +501,7 @@ static int imx_lcdc_probe(struct platform_device *pdev)
if (ret)
return dev_err_probe(dev, ret, "Cannot register device\n");
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 25/43] drm/ingenic: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (23 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 24/43] drm/imx/lcdc: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 26/43] drm/mediatek: " Thomas Zimmermann
` (17 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Paul Cercueil
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by ingenic. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Paul Cercueil <paul@crapouillou.net>
Acked-by: Paul Cercueil <paul@crapouillou.net>
---
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 0751235007a7e..39fa291f43dd1 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -31,7 +31,7 @@
#include <drm/drm_encoder.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -1399,7 +1399,7 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)
goto err_clk_notifier_unregister;
}
- drm_fbdev_generic_setup(drm, 32);
+ drm_fbdev_dma_setup(drm, 32);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 26/43] drm/mediatek: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (24 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 25/43] drm/ingenic: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 27/43] drm/panel/panel-ilitek-9341: " Thomas Zimmermann
` (16 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Chun-Kuang Hu,
Philipp Zabel
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by ingenic. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Chun-Kuang Hu <chunkuang.hu@kernel.org>
Cc: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 74832c2130921..5dcedf0fc4467 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -15,7 +15,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_gem.h>
#include <drm/drm_gem_framebuffer_helper.h>
@@ -644,7 +644,7 @@ static int mtk_drm_bind(struct device *dev)
if (ret < 0)
goto err_deinit;
- drm_fbdev_generic_setup(drm, 32);
+ drm_fbdev_dma_setup(drm, 32);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 27/43] drm/panel/panel-ilitek-9341: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (25 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 26/43] drm/mediatek: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 28/43] drm/renesas/rcar-du: " Thomas Zimmermann
` (15 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Neil Armstrong,
Jessica Zhang, Sam Ravnborg
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by panel-ilitek-9341. Avoids
the overhead of fbdev-generic's additional shadow buffering. No
functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Neil Armstrong <neil.armstrong@linaro.org>
Cc: Jessica Zhang <quic_jesszhan@quicinc.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
index 3574681891e81..89830582b5d79 100644
--- a/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
+++ b/drivers/gpu/drm/panel/panel-ilitek-ili9341.c
@@ -31,7 +31,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_gem_framebuffer_helper.h>
@@ -650,7 +650,7 @@ static int ili9341_dbi_probe(struct spi_device *spi, struct gpio_desc *dc,
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 28/43] drm/renesas/rcar-du: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (26 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 27/43] drm/panel/panel-ilitek-9341: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 9:48 ` Kieran Bingham
2024-06-17 17:33 ` Geert Uytterhoeven
2024-04-19 8:29 ` [PATCH v3 29/43] drm/renesas/rz-du: " Thomas Zimmermann
` (14 subsequent siblings)
42 siblings, 2 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Laurent Pinchart,
Kieran Bingham, Laurent Pinchart
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by rcar-du. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
index dee530e4c8b27..fb719d9aff10d 100644
--- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
+++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
@@ -20,7 +20,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
#include <drm/drm_probe_helper.h>
@@ -716,7 +716,7 @@ static int rcar_du_probe(struct platform_device *pdev)
drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
- drm_fbdev_generic_setup(&rcdu->ddev, 32);
+ drm_fbdev_dma_setup(&rcdu->ddev, 32);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 29/43] drm/renesas/rz-du: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (27 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 28/43] drm/renesas/rcar-du: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 30/43] drm/renesas/shmobile: " Thomas Zimmermann
` (13 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Biju Das
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by rz-du. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Biju Das <biju.das.jz@bp.renesas.com>
Tested-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
index 470d34da1d6c4..e5eca8691a331 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
@@ -14,7 +14,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_probe_helper.h>
@@ -149,7 +149,7 @@ static int rzg2l_du_probe(struct platform_device *pdev)
drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
- drm_fbdev_generic_setup(&rcdu->ddev, 32);
+ drm_fbdev_dma_setup(&rcdu->ddev, 32);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 30/43] drm/renesas/shmobile: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (28 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 29/43] drm/renesas/rz-du: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 31/43] drm/rockchip: " Thomas Zimmermann
` (12 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Laurent Pinchart,
Geert Uytterhoeven, Laurent Pinchart
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by shmobile. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
index e83c3e52251de..890cc2f6408d6 100644
--- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
+++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c
@@ -19,7 +19,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_modeset_helper.h>
#include <drm/drm_module.h>
@@ -250,7 +250,7 @@ static int shmob_drm_probe(struct platform_device *pdev)
if (ret < 0)
goto err_modeset_cleanup;
- drm_fbdev_generic_setup(ddev, 16);
+ drm_fbdev_dma_setup(ddev, 16);
return 0;
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 31/43] drm/rockchip: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (29 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 30/43] drm/renesas/shmobile: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 11:10 ` Heiko Stuebner
2024-04-19 8:29 ` [PATCH v3 32/43] drm/tiny/hx8357d: " Thomas Zimmermann
` (11 subsequent siblings)
42 siblings, 1 reply; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Sandy Huang,
Heiko Stübner, Andy Yan
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by rockchip. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Sandy Huang <hjc@rock-chips.com>
Cc: "Heiko Stübner" <heiko@sntech.de>
Cc: Andy Yan <andy.yan@rock-chips.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index ab55d71325500..44d769d9234d6 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -18,7 +18,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_of.h>
#include <drm/drm_probe_helper.h>
@@ -191,7 +191,7 @@ static int rockchip_drm_bind(struct device *dev)
if (ret)
goto err_kms_helper_poll_fini;
- drm_fbdev_generic_setup(drm_dev, 0);
+ drm_fbdev_dma_setup(drm_dev, 0);
return 0;
err_kms_helper_poll_fini:
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 32/43] drm/tiny/hx8357d: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (30 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 31/43] drm/rockchip: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 33/43] drm/tiny/ili9163: " Thomas Zimmermann
` (10 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by hx8357d. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/hx8357d.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/hx8357d.c b/drivers/gpu/drm/tiny/hx8357d.c
index cdc4486e059b5..2e631282edeb4 100644
--- a/drivers/gpu/drm/tiny/hx8357d.c
+++ b/drivers/gpu/drm/tiny/hx8357d.c
@@ -18,7 +18,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
@@ -256,7 +256,7 @@ static int hx8357d_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 33/43] drm/tiny/ili9163: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (31 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 32/43] drm/tiny/hx8357d: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 34/43] drm/tiny/ili9225: " Thomas Zimmermann
` (9 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by ili9163. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/ili9163.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/ili9163.c b/drivers/gpu/drm/tiny/ili9163.c
index bc4384d410fcc..86f9d88349015 100644
--- a/drivers/gpu/drm/tiny/ili9163.c
+++ b/drivers/gpu/drm/tiny/ili9163.c
@@ -9,7 +9,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_mipi_dbi.h>
@@ -185,7 +185,7 @@ static int ili9163_probe(struct spi_device *spi)
if (ret)
return ret;
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 34/43] drm/tiny/ili9225: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (32 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 33/43] drm/tiny/ili9163: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 35/43] drm/tiny/ili9341: " Thomas Zimmermann
` (8 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, David Lechner
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by ili9225. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Lechner <david@lechnology.com>
Acked-by: David Lechner <david@lechnology.com>
---
drivers/gpu/drm/tiny/ili9225.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/ili9225.c b/drivers/gpu/drm/tiny/ili9225.c
index dd8b0a181be94..537df5f5b8a6e 100644
--- a/drivers/gpu/drm/tiny/ili9225.c
+++ b/drivers/gpu/drm/tiny/ili9225.c
@@ -20,7 +20,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_drv.h>
#include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -426,7 +426,7 @@ static int ili9225_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 35/43] drm/tiny/ili9341: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (33 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 34/43] drm/tiny/ili9225: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 36/43] drm/tiny/ili9486: " Thomas Zimmermann
` (7 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Kamlesh Gurudasani
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by ili9341. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Kamlesh Gurudasani <kamlesh.gurudasani@gmail.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/ili9341.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/ili9341.c b/drivers/gpu/drm/tiny/ili9341.c
index 47b61c3bf1457..8bcada30af717 100644
--- a/drivers/gpu/drm/tiny/ili9341.c
+++ b/drivers/gpu/drm/tiny/ili9341.c
@@ -17,7 +17,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
@@ -218,7 +218,7 @@ static int ili9341_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 36/43] drm/tiny/ili9486: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (34 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 35/43] drm/tiny/ili9341: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 37/43] drm/tiny/mi0283qt: " Thomas Zimmermann
` (6 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by ili9486. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
drivers/gpu/drm/tiny/ili9486.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/ili9486.c b/drivers/gpu/drm/tiny/ili9486.c
index 938bceed59998..70d3662600410 100644
--- a/drivers/gpu/drm/tiny/ili9486.c
+++ b/drivers/gpu/drm/tiny/ili9486.c
@@ -16,7 +16,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
@@ -247,7 +247,7 @@ static int ili9486_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 37/43] drm/tiny/mi0283qt: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (35 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 36/43] drm/tiny/ili9486: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 38/43] drm/tiny/panel-mipi-dbi: " Thomas Zimmermann
` (5 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Noralf Trønnes
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by mi0283qt. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
---
drivers/gpu/drm/tiny/mi0283qt.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/mi0283qt.c b/drivers/gpu/drm/tiny/mi0283qt.c
index 01ff43c8ac3ff..e46581d74c257 100644
--- a/drivers/gpu/drm/tiny/mi0283qt.c
+++ b/drivers/gpu/drm/tiny/mi0283qt.c
@@ -15,7 +15,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
@@ -226,7 +226,7 @@ static int mi0283qt_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 38/43] drm/tiny/panel-mipi-dbi: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (36 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 37/43] drm/tiny/mi0283qt: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 39/43] drm/tiny/repaper: " Thomas Zimmermann
` (4 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Noralf Trønnes
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by panel-mipi-dbi. Avoids the
overhead of fbdev-generic's additional shadow buffering. No functional
changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
---
drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/panel-mipi-dbi.c b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
index f80a141fcf365..4cc4ca787c7d1 100644
--- a/drivers/gpu/drm/tiny/panel-mipi-dbi.c
+++ b/drivers/gpu/drm/tiny/panel-mipi-dbi.c
@@ -16,7 +16,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
@@ -335,7 +335,7 @@ static int panel_mipi_dbi_spi_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 39/43] drm/tiny/repaper: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (37 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 38/43] drm/tiny/panel-mipi-dbi: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 40/43] drm/tiny/st7586: " Thomas Zimmermann
` (3 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Noralf Trønnes
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by repaper. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Noralf Trønnes" <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
---
drivers/gpu/drm/tiny/repaper.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/repaper.c b/drivers/gpu/drm/tiny/repaper.c
index 8fd6758f5725f..1f78aa3d26bbd 100644
--- a/drivers/gpu/drm/tiny/repaper.c
+++ b/drivers/gpu/drm/tiny/repaper.c
@@ -26,7 +26,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_drv.h>
#include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -1118,7 +1118,7 @@ static int repaper_probe(struct spi_device *spi)
DRM_DEBUG_DRIVER("SPI speed: %uMHz\n", spi->max_speed_hz / 1000000);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 40/43] drm/tiny/st7586: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (38 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 39/43] drm/tiny/repaper: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 41/43] drm/tiny/st7735r: " Thomas Zimmermann
` (2 subsequent siblings)
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, David Lechner
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by st7586. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Lechner <david@lechnology.com>
Acked-by: David Lechner <david@lechnology.com>
---
drivers/gpu/drm/tiny/st7586.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/st7586.c b/drivers/gpu/drm/tiny/st7586.c
index 7336fa1ddaed1..9e080d3b084c5 100644
--- a/drivers/gpu/drm/tiny/st7586.c
+++ b/drivers/gpu/drm/tiny/st7586.c
@@ -16,7 +16,7 @@
#include <drm/drm_damage_helper.h>
#include <drm/drm_drv.h>
#include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_format_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_atomic_helper.h>
@@ -371,7 +371,7 @@ static int st7586_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 41/43] drm/tiny/st7735r: Use fbdev-dma
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (39 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 40/43] drm/tiny/st7586: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 42/43] drm/fbdev-generic: Convert to fbdev-ttm Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 43/43] drm/fbdev: Clean up fbdev documentation Thomas Zimmermann
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, David Lechner
Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
damage handling, which is required by st7735r. Avoids the overhead of
fbdev-generic's additional shadow buffering. No functional changes.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Lechner <david@lechnology.com>
Acked-by: David Lechner <david@lechnology.com>
---
drivers/gpu/drm/tiny/st7735r.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/tiny/st7735r.c b/drivers/gpu/drm/tiny/st7735r.c
index 477eb36fbb70d..1676da00883d3 100644
--- a/drivers/gpu/drm/tiny/st7735r.c
+++ b/drivers/gpu/drm/tiny/st7735r.c
@@ -18,7 +18,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_dma.h>
#include <drm/drm_gem_atomic_helper.h>
#include <drm/drm_gem_dma_helper.h>
#include <drm/drm_managed.h>
@@ -241,7 +241,7 @@ static int st7735r_probe(struct spi_device *spi)
spi_set_drvdata(spi, drm);
- drm_fbdev_generic_setup(drm, 0);
+ drm_fbdev_dma_setup(drm, 0);
return 0;
}
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 42/43] drm/fbdev-generic: Convert to fbdev-ttm
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (40 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 41/43] drm/tiny/st7735r: " Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 43/43] drm/fbdev: Clean up fbdev documentation Thomas Zimmermann
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann
Only TTM-based drivers use fbdev-generic. Rename it to fbdev-ttm and
change the symbol infix from _generic_ to _ttm_. Link the source file
into TTM helpers, so that it is only build if TTM-based drivers have
been selected. Select DRM_TTM_HELPER for loongson.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
Documentation/gpu/drm-kms-helpers.rst | 2 +-
drivers/gpu/drm/Makefile | 5 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 6 +-
.../{drm_fbdev_generic.c => drm_fbdev_ttm.c} | 80 +++++++++----------
.../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 4 +-
drivers/gpu/drm/loongson/Kconfig | 1 +
drivers/gpu/drm/loongson/lsdc_drv.c | 4 +-
drivers/gpu/drm/nouveau/nouveau_drm.c | 6 +-
drivers/gpu/drm/qxl/qxl_drv.c | 4 +-
drivers/gpu/drm/tiny/bochs.c | 4 +-
drivers/gpu/drm/vboxvideo/vbox_drv.c | 4 +-
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 4 +-
include/drm/drm_fbdev_generic.h | 15 ----
include/drm/drm_fbdev_ttm.h | 15 ++++
14 files changed, 77 insertions(+), 77 deletions(-)
rename drivers/gpu/drm/{drm_fbdev_generic.c => drm_fbdev_ttm.c} (76%)
delete mode 100644 include/drm/drm_fbdev_generic.h
create mode 100644 include/drm/drm_fbdev_ttm.h
diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst
index 59cfe8a7a8bac..e46ab9b670acd 100644
--- a/Documentation/gpu/drm-kms-helpers.rst
+++ b/Documentation/gpu/drm-kms-helpers.rst
@@ -116,7 +116,7 @@ fbdev Helper Functions Reference
.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
:export:
-.. kernel-doc:: drivers/gpu/drm/drm_fbdev_generic.c
+.. kernel-doc:: drivers/gpu/drm/drm_fbdev_ttm.c
:export:
format Helper Functions Reference
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 50a2f0cffdac2..7bd4c525fd825 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -117,6 +117,7 @@ drm_vram_helper-y := drm_gem_vram_helper.o
obj-$(CONFIG_DRM_VRAM_HELPER) += drm_vram_helper.o
drm_ttm_helper-y := drm_gem_ttm_helper.o
+drm_ttm_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fbdev_ttm.o
obj-$(CONFIG_DRM_TTM_HELPER) += drm_ttm_helper.o
#
@@ -142,9 +143,7 @@ drm_kms_helper-y := \
drm_self_refresh_helper.o \
drm_simple_kms_helper.o
drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
-drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
- drm_fbdev_generic.o \
- drm_fb_helper.o
+drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
#
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index e4277298cf1aa..a4a63daab9e10 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -24,7 +24,7 @@
#include <drm/amdgpu_drm.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_gem.h>
#include <drm/drm_managed.h>
#include <drm/drm_pciids.h>
@@ -2318,9 +2318,9 @@ static int amdgpu_pci_probe(struct pci_dev *pdev,
!list_empty(&adev_to_drm(adev)->mode_config.connector_list)) {
/* select 8 bpp console on low vram cards */
if (adev->gmc.real_vram_size <= (32*1024*1024))
- drm_fbdev_generic_setup(adev_to_drm(adev), 8);
+ drm_fbdev_ttm_setup(adev_to_drm(adev), 8);
else
- drm_fbdev_generic_setup(adev_to_drm(adev), 32);
+ drm_fbdev_ttm_setup(adev_to_drm(adev), 32);
}
ret = amdgpu_debugfs_init(adev);
diff --git a/drivers/gpu/drm/drm_fbdev_generic.c b/drivers/gpu/drm/drm_fbdev_ttm.c
similarity index 76%
rename from drivers/gpu/drm/drm_fbdev_generic.c
rename to drivers/gpu/drm/drm_fbdev_ttm.c
index 97e579c33d84a..bb7898cd7dc63 100644
--- a/drivers/gpu/drm/drm_fbdev_generic.c
+++ b/drivers/gpu/drm/drm_fbdev_ttm.c
@@ -10,10 +10,10 @@
#include <drm/drm_gem.h>
#include <drm/drm_print.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
/* @user: 1=userspace, 0=fbcon */
-static int drm_fbdev_generic_fb_open(struct fb_info *info, int user)
+static int drm_fbdev_ttm_fb_open(struct fb_info *info, int user)
{
struct drm_fb_helper *fb_helper = info->par;
@@ -24,7 +24,7 @@ static int drm_fbdev_generic_fb_open(struct fb_info *info, int user)
return 0;
}
-static int drm_fbdev_generic_fb_release(struct fb_info *info, int user)
+static int drm_fbdev_ttm_fb_release(struct fb_info *info, int user)
{
struct drm_fb_helper *fb_helper = info->par;
@@ -34,11 +34,11 @@ static int drm_fbdev_generic_fb_release(struct fb_info *info, int user)
return 0;
}
-FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_generic,
+FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_ttm,
drm_fb_helper_damage_range,
drm_fb_helper_damage_area);
-static void drm_fbdev_generic_fb_destroy(struct fb_info *info)
+static void drm_fbdev_ttm_fb_destroy(struct fb_info *info)
{
struct drm_fb_helper *fb_helper = info->par;
void *shadow = info->screen_buffer;
@@ -56,19 +56,19 @@ static void drm_fbdev_generic_fb_destroy(struct fb_info *info)
kfree(fb_helper);
}
-static const struct fb_ops drm_fbdev_generic_fb_ops = {
+static const struct fb_ops drm_fbdev_ttm_fb_ops = {
.owner = THIS_MODULE,
- .fb_open = drm_fbdev_generic_fb_open,
- .fb_release = drm_fbdev_generic_fb_release,
- FB_DEFAULT_DEFERRED_OPS(drm_fbdev_generic),
+ .fb_open = drm_fbdev_ttm_fb_open,
+ .fb_release = drm_fbdev_ttm_fb_release,
+ FB_DEFAULT_DEFERRED_OPS(drm_fbdev_ttm),
DRM_FB_HELPER_DEFAULT_OPS,
- .fb_destroy = drm_fbdev_generic_fb_destroy,
+ .fb_destroy = drm_fbdev_ttm_fb_destroy,
};
/*
* This function uses the client API to create a framebuffer backed by a dumb buffer.
*/
-static int drm_fbdev_generic_helper_fb_probe(struct drm_fb_helper *fb_helper,
+static int drm_fbdev_ttm_helper_fb_probe(struct drm_fb_helper *fb_helper,
struct drm_fb_helper_surface_size *sizes)
{
struct drm_client_dev *client = &fb_helper->client;
@@ -108,7 +108,7 @@ static int drm_fbdev_generic_helper_fb_probe(struct drm_fb_helper *fb_helper,
drm_fb_helper_fill_info(info, fb_helper, sizes);
- info->fbops = &drm_fbdev_generic_fb_ops;
+ info->fbops = &drm_fbdev_ttm_fb_ops;
/* screen */
info->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
@@ -137,9 +137,9 @@ static int drm_fbdev_generic_helper_fb_probe(struct drm_fb_helper *fb_helper,
return ret;
}
-static void drm_fbdev_generic_damage_blit_real(struct drm_fb_helper *fb_helper,
- struct drm_clip_rect *clip,
- struct iosys_map *dst)
+static void drm_fbdev_ttm_damage_blit_real(struct drm_fb_helper *fb_helper,
+ struct drm_clip_rect *clip,
+ struct iosys_map *dst)
{
struct drm_framebuffer *fb = fb_helper->fb;
size_t offset = clip->y1 * fb->pitches[0];
@@ -176,8 +176,8 @@ static void drm_fbdev_generic_damage_blit_real(struct drm_fb_helper *fb_helper,
}
}
-static int drm_fbdev_generic_damage_blit(struct drm_fb_helper *fb_helper,
- struct drm_clip_rect *clip)
+static int drm_fbdev_ttm_damage_blit(struct drm_fb_helper *fb_helper,
+ struct drm_clip_rect *clip)
{
struct drm_client_buffer *buffer = fb_helper->buffer;
struct iosys_map map, dst;
@@ -201,7 +201,7 @@ static int drm_fbdev_generic_damage_blit(struct drm_fb_helper *fb_helper,
goto out;
dst = map;
- drm_fbdev_generic_damage_blit_real(fb_helper, clip, &dst);
+ drm_fbdev_ttm_damage_blit_real(fb_helper, clip, &dst);
drm_client_buffer_vunmap_local(buffer);
@@ -211,8 +211,8 @@ static int drm_fbdev_generic_damage_blit(struct drm_fb_helper *fb_helper,
return ret;
}
-static int drm_fbdev_generic_helper_fb_dirty(struct drm_fb_helper *helper,
- struct drm_clip_rect *clip)
+static int drm_fbdev_ttm_helper_fb_dirty(struct drm_fb_helper *helper,
+ struct drm_clip_rect *clip)
{
struct drm_device *dev = helper->dev;
int ret;
@@ -221,7 +221,7 @@ static int drm_fbdev_generic_helper_fb_dirty(struct drm_fb_helper *helper,
if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
return 0;
- ret = drm_fbdev_generic_damage_blit(helper, clip);
+ ret = drm_fbdev_ttm_damage_blit(helper, clip);
if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret))
return ret;
@@ -234,12 +234,12 @@ static int drm_fbdev_generic_helper_fb_dirty(struct drm_fb_helper *helper,
return 0;
}
-static const struct drm_fb_helper_funcs drm_fbdev_generic_helper_funcs = {
- .fb_probe = drm_fbdev_generic_helper_fb_probe,
- .fb_dirty = drm_fbdev_generic_helper_fb_dirty,
+static const struct drm_fb_helper_funcs drm_fbdev_ttm_helper_funcs = {
+ .fb_probe = drm_fbdev_ttm_helper_fb_probe,
+ .fb_dirty = drm_fbdev_ttm_helper_fb_dirty,
};
-static void drm_fbdev_generic_client_unregister(struct drm_client_dev *client)
+static void drm_fbdev_ttm_client_unregister(struct drm_client_dev *client)
{
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
@@ -252,14 +252,14 @@ static void drm_fbdev_generic_client_unregister(struct drm_client_dev *client)
}
}
-static int drm_fbdev_generic_client_restore(struct drm_client_dev *client)
+static int drm_fbdev_ttm_client_restore(struct drm_client_dev *client)
{
drm_fb_helper_lastclose(client->dev);
return 0;
}
-static int drm_fbdev_generic_client_hotplug(struct drm_client_dev *client)
+static int drm_fbdev_ttm_client_hotplug(struct drm_client_dev *client)
{
struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
struct drm_device *dev = client->dev;
@@ -284,32 +284,32 @@ static int drm_fbdev_generic_client_hotplug(struct drm_client_dev *client)
err_drm_fb_helper_fini:
drm_fb_helper_fini(fb_helper);
err_drm_err:
- drm_err(dev, "fbdev: Failed to setup generic emulation (ret=%d)\n", ret);
+ drm_err(dev, "fbdev: Failed to setup emulation (ret=%d)\n", ret);
return ret;
}
-static const struct drm_client_funcs drm_fbdev_generic_client_funcs = {
+static const struct drm_client_funcs drm_fbdev_ttm_client_funcs = {
.owner = THIS_MODULE,
- .unregister = drm_fbdev_generic_client_unregister,
- .restore = drm_fbdev_generic_client_restore,
- .hotplug = drm_fbdev_generic_client_hotplug,
+ .unregister = drm_fbdev_ttm_client_unregister,
+ .restore = drm_fbdev_ttm_client_restore,
+ .hotplug = drm_fbdev_ttm_client_hotplug,
};
/**
- * drm_fbdev_generic_setup() - Setup generic fbdev emulation
+ * drm_fbdev_ttm_setup() - Setup fbdev emulation for TTM-based drivers
* @dev: DRM device
* @preferred_bpp: Preferred bits per pixel for the device.
*
- * This function sets up generic fbdev emulation for drivers that supports
+ * This function sets up fbdev emulation for TTM-based drivers that support
* dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_generic_setup() shall be called after the DRM driver registered
+ * drm_fbdev_ttm_setup() shall be called after the DRM driver registered
* the new DRM device with drm_dev_register().
*
* Restore, hotplug events and teardown are all taken care of. Drivers that do
* suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
* Simple drivers might use drm_mode_config_helper_suspend().
*
- * In order to provide fixed mmap-able memory ranges, generic fbdev emulation
+ * In order to provide fixed mmap-able memory ranges, fbdev emulation
* uses a shadow buffer in system memory. The implementation blits the shadow
* fbdev buffer onto the real buffer in regular intervals.
*
@@ -318,7 +318,7 @@ static const struct drm_client_funcs drm_fbdev_generic_client_funcs = {
*
* The fbdev is destroyed by drm_dev_unregister().
*/
-void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
+void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
{
struct drm_fb_helper *fb_helper;
int ret;
@@ -329,9 +329,9 @@ void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
if (!fb_helper)
return;
- drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_generic_helper_funcs);
+ drm_fb_helper_prepare(dev, fb_helper, preferred_bpp, &drm_fbdev_ttm_helper_funcs);
- ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_generic_client_funcs);
+ ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_ttm_client_funcs);
if (ret) {
drm_err(dev, "Failed to register client: %d\n", ret);
goto err_drm_client_init;
@@ -346,4 +346,4 @@ void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
kfree(fb_helper);
return;
}
-EXPORT_SYMBOL(drm_fbdev_generic_setup);
+EXPORT_SYMBOL(drm_fbdev_ttm_setup);
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index 57c21ec452b70..9f9b19ea05879 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -17,7 +17,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_gem_vram_helper.h>
#include <drm/drm_managed.h>
@@ -339,7 +339,7 @@ static int hibmc_pci_probe(struct pci_dev *pdev,
goto err_unload;
}
- drm_fbdev_generic_setup(dev, 32);
+ drm_fbdev_ttm_setup(dev, 32);
return 0;
diff --git a/drivers/gpu/drm/loongson/Kconfig b/drivers/gpu/drm/loongson/Kconfig
index 8e59753e532de..9ed463a76ae29 100644
--- a/drivers/gpu/drm/loongson/Kconfig
+++ b/drivers/gpu/drm/loongson/Kconfig
@@ -6,6 +6,7 @@ config DRM_LOONGSON
depends on LOONGARCH || MIPS || COMPILE_TEST
select DRM_KMS_HELPER
select DRM_TTM
+ select DRM_TTM_HELPER
select I2C
select I2C_ALGOBIT
help
diff --git a/drivers/gpu/drm/loongson/lsdc_drv.c b/drivers/gpu/drm/loongson/lsdc_drv.c
index d8ff60b46abe6..adc7344d2f807 100644
--- a/drivers/gpu/drm/loongson/lsdc_drv.c
+++ b/drivers/gpu/drm/loongson/lsdc_drv.c
@@ -10,7 +10,7 @@
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_modeset_helper.h>
@@ -314,7 +314,7 @@ static int lsdc_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (ret)
return ret;
- drm_fbdev_generic_setup(ddev, 32);
+ drm_fbdev_ttm_setup(ddev, 32);
return 0;
}
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index a947e1d5f309a..a58c31089613e 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -32,7 +32,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_gem_ttm_helper.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_vblank.h>
@@ -846,9 +846,9 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
goto fail_drm_dev_init;
if (nouveau_drm(drm_dev)->client.device.info.ram_size <= 32 * 1024 * 1024)
- drm_fbdev_generic_setup(drm_dev, 8);
+ drm_fbdev_ttm_setup(drm_dev, 8);
else
- drm_fbdev_generic_setup(drm_dev, 32);
+ drm_fbdev_ttm_setup(drm_dev, 32);
quirk_broken_nv_runpm(pdev);
return 0;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
index beee5563031aa..5eb3f5719fdf3 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.c
+++ b/drivers/gpu/drm/qxl/qxl_drv.c
@@ -37,7 +37,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_file.h>
#include <drm/drm_gem_ttm_helper.h>
#include <drm/drm_module.h>
@@ -118,7 +118,7 @@ qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (ret)
goto modeset_cleanup;
- drm_fbdev_generic_setup(&qdev->ddev, 32);
+ drm_fbdev_ttm_setup(&qdev->ddev, 32);
return 0;
modeset_cleanup:
diff --git a/drivers/gpu/drm/tiny/bochs.c b/drivers/gpu/drm/tiny/bochs.c
index c23c9f0cf49cb..2d7ad808cc0e2 100644
--- a/drivers/gpu/drm/tiny/bochs.c
+++ b/drivers/gpu/drm/tiny/bochs.c
@@ -7,7 +7,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
#include <drm/drm_edid.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_fourcc.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_framebuffer_helper.h>
@@ -670,7 +670,7 @@ static int bochs_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent
if (ret)
goto err_hw_fini;
- drm_fbdev_generic_setup(dev, 32);
+ drm_fbdev_ttm_setup(dev, 32);
return ret;
err_hw_fini:
diff --git a/drivers/gpu/drm/vboxvideo/vbox_drv.c b/drivers/gpu/drm/vboxvideo/vbox_drv.c
index cd9e66a06596a..ef36834c8673c 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_drv.c
+++ b/drivers/gpu/drm/vboxvideo/vbox_drv.c
@@ -14,7 +14,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_file.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_managed.h>
@@ -80,7 +80,7 @@ static int vbox_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (ret)
goto err_irq_fini;
- drm_fbdev_generic_setup(&vbox->ddev, 32);
+ drm_fbdev_ttm_setup(&vbox->ddev, 32);
return 0;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 0a304706e0132..1e5dd0507d312 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -36,7 +36,7 @@
#include <drm/drm_aperture.h>
#include <drm/drm_drv.h>
-#include <drm/drm_fbdev_generic.h>
+#include <drm/drm_fbdev_ttm.h>
#include <drm/drm_gem_ttm_helper.h>
#include <drm/drm_ioctl.h>
#include <drm/drm_module.h>
@@ -1680,7 +1680,7 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
vmw_fifo_resource_inc(vmw);
vmw_svga_enable(vmw);
- drm_fbdev_generic_setup(&vmw->drm, 0);
+ drm_fbdev_ttm_setup(&vmw->drm, 0);
vmw_debugfs_gem_init(vmw);
vmw_debugfs_resource_managers_init(vmw);
diff --git a/include/drm/drm_fbdev_generic.h b/include/drm/drm_fbdev_generic.h
deleted file mode 100644
index 75799342098dc..0000000000000
--- a/include/drm/drm_fbdev_generic.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-
-#ifndef DRM_FBDEV_GENERIC_H
-#define DRM_FBDEV_GENERIC_H
-
-struct drm_device;
-
-#ifdef CONFIG_DRM_FBDEV_EMULATION
-void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp);
-#else
-static inline void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{ }
-#endif
-
-#endif
diff --git a/include/drm/drm_fbdev_ttm.h b/include/drm/drm_fbdev_ttm.h
new file mode 100644
index 0000000000000..9e6c3bdf35376
--- /dev/null
+++ b/include/drm/drm_fbdev_ttm.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_FBDEV_TTM_H
+#define DRM_FBDEV_TTM_H
+
+struct drm_device;
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp);
+#else
+static inline void drm_fbdev_ttm_setup(struct drm_device *dev, unsigned int preferred_bpp)
+{ }
+#endif
+
+#endif
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* [PATCH v3 43/43] drm/fbdev: Clean up fbdev documentation
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
` (41 preceding siblings ...)
2024-04-19 8:29 ` [PATCH v3 42/43] drm/fbdev-generic: Convert to fbdev-ttm Thomas Zimmermann
@ 2024-04-19 8:29 ` Thomas Zimmermann
42 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-04-19 8:29 UTC (permalink / raw)
To: javierm, deller, airlied, daniel
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Jonathan Corbet
Rewrite some docs that are not up-to-date any longer. Remove the TODO
item for fbdev-generic conversion, as the helper has been replaced. Make
documentation for DMA, SHMEM and TTM emulation available.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Jonathan Corbet <corbet@lwn.net>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
Documentation/gpu/drm-kms-helpers.rst | 12 +++++++++---
Documentation/gpu/todo.rst | 13 -------------
drivers/gpu/drm/drm_drv.c | 2 +-
drivers/gpu/drm/drm_fb_helper.c | 11 ++---------
include/drm/drm_mode_config.h | 4 ++--
5 files changed, 14 insertions(+), 28 deletions(-)
diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst
index e46ab9b670acd..8435e8621cc08 100644
--- a/Documentation/gpu/drm-kms-helpers.rst
+++ b/Documentation/gpu/drm-kms-helpers.rst
@@ -110,15 +110,21 @@ fbdev Helper Functions Reference
.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
:doc: fbdev helpers
-.. kernel-doc:: include/drm/drm_fb_helper.h
- :internal:
+.. kernel-doc:: drivers/gpu/drm/drm_fbdev_dma.c
+ :export:
-.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
+.. kernel-doc:: drivers/gpu/drm/drm_fbdev_shmem.c
:export:
.. kernel-doc:: drivers/gpu/drm/drm_fbdev_ttm.c
:export:
+.. kernel-doc:: include/drm/drm_fb_helper.h
+ :internal:
+
+.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
+ :export:
+
format Helper Functions Reference
=================================
diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
index fb9ad120b1414..e2a0585915b32 100644
--- a/Documentation/gpu/todo.rst
+++ b/Documentation/gpu/todo.rst
@@ -243,19 +243,6 @@ Contact: Maintainer of the driver you plan to convert
Level: Intermediate
-Convert drivers to use drm_fbdev_generic_setup()
-------------------------------------------------
-
-Most drivers can use drm_fbdev_generic_setup(). Driver have to implement
-atomic modesetting and GEM vmap support. Historically, generic fbdev emulation
-expected the framebuffer in system memory or system-like memory. By employing
-struct iosys_map, drivers with frambuffers in I/O memory can be supported
-as well.
-
-Contact: Maintainer of the driver you plan to convert
-
-Level: Intermediate
-
Reimplement functions in drm_fbdev_fb_ops without fbdev
-------------------------------------------------------
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 243cacb3575c0..cfcd45480d326 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -345,7 +345,7 @@ void drm_minor_release(struct drm_minor *minor)
* if (ret)
* return ret;
*
- * drm_fbdev_generic_setup(drm, 32);
+ * drm_fbdev_{...}_setup(drm, 32);
*
* return 0;
* }
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index d612133e2cf7e..e2e19f49342e1 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -85,12 +85,8 @@ static DEFINE_MUTEX(kernel_fb_helper_lock);
* The fb helper functions are useful to provide an fbdev on top of a drm kernel
* mode setting driver. They can be used mostly independently from the crtc
* helper functions used by many drivers to implement the kernel mode setting
- * interfaces.
- *
- * Drivers that support a dumb buffer with a virtual address and mmap support,
- * should try out the generic fbdev emulation using drm_fbdev_generic_setup().
- * It will automatically set up deferred I/O if the driver requires a shadow
- * buffer.
+ * interfaces. Drivers that use one of the shared memory managers, TTM, SHMEM,
+ * DMA, should instead use the corresponding fbdev emulation.
*
* Existing fbdev implementations should restore the fbdev console by using
* drm_fb_helper_lastclose() as their &drm_driver.lastclose callback.
@@ -126,9 +122,6 @@ static DEFINE_MUTEX(kernel_fb_helper_lock);
* atomic context. If drm_fb_helper_deferred_io() is used as the deferred_io
* callback it will also schedule dirty_work with the damage collected from the
* mmap page writes.
- *
- * Deferred I/O is not compatible with SHMEM. Such drivers should request an
- * fbdev shadow buffer and call drm_fbdev_generic_setup() instead.
*/
static void drm_fb_helper_restore_lut_atomic(struct drm_crtc *crtc)
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index 9d8acf7a10eb8..77b8429e7b2b2 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -106,8 +106,8 @@ struct drm_mode_config_funcs {
* Drivers implementing fbdev emulation use drm_kms_helper_hotplug_event()
* to call this hook to inform the fbdev helper of output changes.
*
- * This hook is deprecated, drivers should instead use
- * drm_fbdev_generic_setup() which takes care of any necessary
+ * This hook is deprecated, drivers should instead implement fbdev
+ * support with struct drm_client, which takes care of any necessary
* hotplug event forwarding already without further involvement by
* the driver.
*/
--
2.44.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* Re: [PATCH v3 28/43] drm/renesas/rcar-du: Use fbdev-dma
2024-04-19 8:29 ` [PATCH v3 28/43] drm/renesas/rcar-du: " Thomas Zimmermann
@ 2024-04-19 9:48 ` Kieran Bingham
2024-06-17 17:33 ` Geert Uytterhoeven
1 sibling, 0 replies; 55+ messages in thread
From: Kieran Bingham @ 2024-04-19 9:48 UTC (permalink / raw)
To: Thomas Zimmermann, airlied, daniel, deller, javierm
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Laurent Pinchart,
Laurent Pinchart
Quoting Thomas Zimmermann (2024-04-19 09:29:21)
> Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
> damage handling, which is required by rcar-du. Avoids the overhead of
> fbdev-generic's additional shadow buffering. No functional changes.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
As I'm on Cc, I'm fine with this too.
Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
> ---
> drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
> index dee530e4c8b27..fb719d9aff10d 100644
> --- a/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
> +++ b/drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c
> @@ -20,7 +20,7 @@
>
> #include <drm/drm_atomic_helper.h>
> #include <drm/drm_drv.h>
> -#include <drm/drm_fbdev_generic.h>
> +#include <drm/drm_fbdev_dma.h>
> #include <drm/drm_gem_dma_helper.h>
> #include <drm/drm_managed.h>
> #include <drm/drm_probe_helper.h>
> @@ -716,7 +716,7 @@ static int rcar_du_probe(struct platform_device *pdev)
>
> drm_info(&rcdu->ddev, "Device %s probed\n", dev_name(&pdev->dev));
>
> - drm_fbdev_generic_setup(&rcdu->ddev, 32);
> + drm_fbdev_dma_setup(&rcdu->ddev, 32);
>
> return 0;
>
> --
> 2.44.0
>
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 31/43] drm/rockchip: Use fbdev-dma
2024-04-19 8:29 ` [PATCH v3 31/43] drm/rockchip: " Thomas Zimmermann
@ 2024-04-19 11:10 ` Heiko Stuebner
0 siblings, 0 replies; 55+ messages in thread
From: Heiko Stuebner @ 2024-04-19 11:10 UTC (permalink / raw)
To: javierm, deller, airlied, daniel, Thomas Zimmermann
Cc: dri-devel, linux-fbdev, Thomas Zimmermann, Sandy Huang, Andy Yan
Am Freitag, 19. April 2024, 10:29:24 CEST schrieb Thomas Zimmermann:
> Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
> damage handling, which is required by rockchip. Avoids the overhead of
> fbdev-generic's additional shadow buffering. No functional changes.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Sandy Huang <hjc@rock-chips.com>
> Cc: "Heiko Stübner" <heiko@sntech.de>
> Cc: Andy Yan <andy.yan@rock-chips.com>
> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Heiko Stuebner <heiko@sntech.de>
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 28/43] drm/renesas/rcar-du: Use fbdev-dma
2024-04-19 8:29 ` [PATCH v3 28/43] drm/renesas/rcar-du: " Thomas Zimmermann
2024-04-19 9:48 ` Kieran Bingham
@ 2024-06-17 17:33 ` Geert Uytterhoeven
1 sibling, 0 replies; 55+ messages in thread
From: Geert Uytterhoeven @ 2024-06-17 17:33 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: javierm, deller, airlied, daniel, dri-devel, linux-fbdev,
Laurent Pinchart, Kieran Bingham, Laurent Pinchart, Linux-Renesas
Hi Thomas,
On Fri, Apr 19, 2024 at 10:34 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Implement fbdev emulation with fbdev-dma. Fbdev-dma now supports
> damage handling, which is required by rcar-du. Avoids the overhead of
> fbdev-generic's additional shadow buffering. No functional changes.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Thanks for your patch, which is now commit b3fdbd60d35ce340
("drm/renesas/rcar-du: Use fbdev-dma") in drm-misc/drm-misc-next.
Probably this doesn't come as a surprise, but with CONFIG_DEBUG_VIRTUAL=y,
this triggers the following warning on R-Car Gen3/Gen4 (arm64),
e.g. on White-Hawk:
virt_to_phys used for non-linear address: (____ptrval____)
(0xffffffc088001000)
WARNING: CPU: 0 PID: 44 at arch/arm64/mm/physaddr.c:12
__virt_to_phys+0x38/0x70
Modules linked in:
CPU: 0 PID: 44 Comm: kworker/u17:2 Not tainted
6.9.0-rc6-white-hawk-01422-gb3fdbd60d35c-dirty #283
Hardware name: Renesas White Hawk CPU and Breakout boards based on
r8a779g0 (DT)
Workqueue: events_unbound deferred_probe_work_func
pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : __virt_to_phys+0x38/0x70
lr : __virt_to_phys+0x38/0x70
sp : ffffffc08297b930
x29: ffffffc08297b930 x28: ffffff844527c000 x27: ffffffc080cb6a47
x26: ffffffc0810c0000 x25: ffffff84452a7800 x24: ffffff8445370018
x23: ffffff8443d34480 x22: ffffff8443d32c00 x21: ffffffc08297ba30
x20: ffffff84452a5800 x19: ffffffc088001000 x18: 0000000000000000
x17: 666678302820295f x16: 5f5f5f6c61767274 x15: 0720072007200720
x14: 0720072007200720 x13: 0720072007200720 x12: 0720072007200720
x11: 0000000000000180 x10: ffffffc0810e9aa0 x9 : ffffffc0813a9c80
x8 : ffffffc08297b638 x7 : ffffffc08297b640 x6 : 00000000ffff7fff
x5 : c0000000ffff7fff x4 : 0000000000000000 x3 : 0000000000000001
x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffffff8441ba2940
Call trace:
__virt_to_phys+0x38/0x70
drm_fbdev_dma_helper_fb_probe+0x178/0x1e8
__drm_fb_helper_initial_config_and_unlock+0x26c/0x4b8
drm_fb_helper_initial_config+0x30/0x44
drm_fbdev_dma_client_hotplug+0x84/0xb4
drm_client_register+0x74/0xb8
drm_fbdev_dma_setup+0x118/0x11c
rcar_du_probe+0x160/0x174
platform_probe+0x64/0xb0
really_probe+0x130/0x260
__driver_probe_device+0xec/0x104
driver_probe_device+0x4c/0xf8
__device_attach_driver+0xa8/0xc8
bus_for_each_drv+0xa4/0xc8
__device_attach+0xe4/0x144
device_initial_probe+0x10/0x18
bus_probe_device+0x38/0xa0
deferred_probe_work_func+0xb8/0xd0
process_scheduled_works+0x314/0x4d4
worker_thread+0x1b8/0x20c
kthread+0xd8/0xe8
ret_from_fork+0x10/0x20
irq event stamp: 7568
hardirqs last enabled at (7567): [<ffffffc080928828>]
_raw_spin_unlock_irq+0x2c/0x40
hardirqs last disabled at (7568): [<ffffffc080922b20>]
__schedule+0x1cc/0x868
softirqs last enabled at (5004): [<ffffffc0800102fc>]
__do_softirq+0x1ac/0x3a8
softirqs last disabled at (4999): [<ffffffc080015624>]
____do_softirq+0xc/0x14
Interestingly, the warning is not triggered on R-Car Gen2 (arm32),
although arch/arm/mm/physaddr.c has a similar check.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-04-19 8:29 ` [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O Thomas Zimmermann
@ 2024-09-03 22:53 ` Linus Walleij
2024-09-04 6:09 ` Alexander Stein
` (2 more replies)
0 siblings, 3 replies; 55+ messages in thread
From: Linus Walleij @ 2024-09-03 22:53 UTC (permalink / raw)
To: Thomas Zimmermann
Cc: javierm, deller, airlied, daniel, dri-devel, linux-fbdev
On Fri, Apr 19, 2024 at 10:35 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Add support for damage handling and deferred I/O to fbdev-dma. This
> enables fbdev-dma to support all DMA-memory-based DRM drivers, even
> such with a dirty callback in their framebuffers.
>
> The patch adds the code for deferred I/O and also sets a dedicated
> helper for struct fb_ops.fb_mmap that support coherent mappings.
>
> v3:
> - init fb_ops with FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS() (Javier)
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
For some reason this makes the Versatile Express crash in QEMU
(I can retest on real hardware if necessary):
8<--- cut here ---
Unable to handle kernel paging request at virtual address 18095000 when write
[18095000] *pgd=00000000
Internal error: Oops: 805 [#1] SMP ARM
CPU: 0 PID: 75 Comm: S08_ledflash Not tainted 6.9.0-rc6+ #44
Hardware name: ARM-Versatile Express
PC is at mmioset+0x34/0xac
LR is at 0x0
pc : [<809c2a54>] lr : [<00000000>] psr: 20000013
sp : f8dddc38 ip : 18095000 fp : 00000000
r10: 81109a18 r9 : 81238b04 r8 : 00000000
r7 : 00440dc0 r6 : ed4f32a0 r5 : ed4f32a0 r4 : 00000001
r3 : 00000000 r2 : 00000fc0 r1 : 00000000 r0 : 18095000
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
Control: 10c5387d Table: 81d6406a DAC: 00000051
Register r0 information: non-paged memory
Register r1 information: NULL pointer
Register r2 information: non-paged memory
Register r3 information: NULL pointer
Register r4 information: non-paged memory
Register r5 information: non-slab/vmalloc memory
Register r6 information: non-slab/vmalloc memory
Register r7 information: non-paged memory
Register r8 information: NULL pointer
Register r9 information: non-slab/vmalloc memory
Register r10 information: non-slab/vmalloc memory
Register r11 information: NULL pointer
Register r12 information: non-paged memory
Process S08_ledflash (pid: 75, stack limit = 0x(ptrval))
Stack: (0xf8dddc38 to 0xf8dde000)
dc20: 00000801 802af888
dc40: 80a0fb80 00440dc0 00000801 811fad80 00000000 f8dddd28 ed4f32a0 811fa680
dc60: 00000000 802b0c30 ee1d2140 ee1d215c 95ff4385 00000001 00000001 00000001
dc80: 00000000 00000000 ffffffff 8196a70b 000000b0 00000064 0000006c 00000000
dca0: 00000001 00000002 00000001 811fa798 00000801 811fa940 80a0fb80 00000cc0
dcc0: 00000001 00000001 00000000 f8dddd28 811fa93c 811fa680 00000002 802b0c30
dce0: ee1d2140 00440dc0 00000000 00000000 00000001 00000000 811fad80 00440dc0
dd00: 00000001 00000000 00000000 83201100 00440dc0 00000000 00000000 802afa18
dd20: 00000bdc 00000bd8 811fad80 00000000 811fad80 00000000 00000000 00000000
dd40: adf00ec5 816d5fa8 816d5fa8 821c3c00 00000000 7ebc2000 7ebe3000 00000000
dd60: f8ddde44 8028cfa0 816d5fa8 8288df50 8169cf00 821c3c00 7ebc2000 7ebe3000
dd80: f8ddde44 8028e1e8 00000001 80bbe932 f8ddde44 f8dddde8 f8ddde44 8288df50
dda0: 83201100 809cf474 f8ddde44 8169cf00 00000020 8169cf94 821c3c94 7ebe3000
ddc0: 7ebe2fff fffffff4 00000000 816d5fa8 821c3c00 8169cf00 81d65fa8 809cdbb0
dde0: 8288df50 81ffa910 7ebe3000 82890b00 00000000 00000000 00000000 00000000
de00: 00000000 00000000 adf00ec5 00000000 00000000 8169cf00 8288df50 83201100
de20: 821c3c00 81ffa910 f8ddde44 8011f6e4 00000000 00000000 821c3c7c 8169cf7c
de40: 83200880 821c3c40 7ebc2000 7ebe2fff 82890b0c 76ea4000 ffffffff 00000000
de60: 00000000 0f000a01 f8ddde68 f8ddde68 adf00ec5 00000000 00000000 00000000
de80: 00000000 01200000 83201100 00000000 00000000 8011e2ac 00000000 83200d7c
dea0: 83201020 83200e70 83200e80 00000000 f8dddf30 83200880 00000000 00000000
dec0: 00000000 00000000 00000000 82182f38 adf00ec5 00000000 01200000 f8dddf30
dee0: 00000000 00000000 00000000 00000078 000cb21c 8011fe24 00000020 00000000
df00: 828a5d80 80a10140 adf00ec5 01200011 00000000 00000000 00000000 f8dddf30
df20: 00000000 00000078 000cb21c 801203d4 01200000 00000000 00000000 76f46468
df40: 00000000 00000000 00000011 00000000 00000000 00000000 00000000 00000000
df60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
df80: 00000003 adf00ec5 76f46468 00000000 76f468c0 00000078 80100290 83201100
dfa0: 000cb21c 80100060 76f46468 00000000 01200011 00000000 00000000 00000000
dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
dfe0: 00000078 7ebe2938 76e0854d 76dae7e6 20000030 01200011 00000000 00000000
Call trace:
mmioset from prep_new_page+0x160/0x194
prep_new_page from get_page_from_freelist+0x10f4/0x110c
get_page_from_freelist from __alloc_pages+0x15c/0x280
__alloc_pages from __pte_alloc+0x28/0x1bc
__pte_alloc from copy_page_range+0xc10/0xd28
copy_page_range from copy_mm+0x5cc/0x850
copy_mm from copy_process+0x508/0xd8c
copy_process from kernel_clone+0x94/0x338
kernel_clone from sys_clone+0x94/0xb0
sys_clone from ret_fast_syscall+0x0/0x1c
Exception stack(0xf8dddfa8 to 0xf8dddff0)
dfa0: 76f46468 00000000 01200011 00000000 00000000 00000000
dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
dfe0: 00000078 7ebe2938 76e0854d 76dae7e6
Code: e92d4100 e1a08001 e1a0e003 e2522040 (a8ac410a)
---[ end trace 0000000000000000 ]---
I bisected down to this commit and reverting the commit solves the issue.
What is special about the Versatile Express graphics is that it uses a special
dedicated video RAM, looks like this in the device tree
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
/* Chipselect 3 is physically at 0x4c000000 */
vram: vram@4c000000 {
/* 8 MB of designated video RAM */
compatible = "shared-dma-pool";
reg = <0x4c000000 0x00800000>;
no-map;
};
};
(...)
clcd@1f000 {
compatible = "arm,pl111", "arm,primecell";
(...)
memory-region = <&vram>;
This gets picked up in the driver
drivers/gpu/drm/pl111/pl111_drv.c
like this:
ret = of_reserved_mem_device_init(dev);
if (!ret) {
dev_info(dev, "using device-specific reserved memory\n");
priv->use_device_memory = true;
}
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-03 22:53 ` Linus Walleij
@ 2024-09-04 6:09 ` Alexander Stein
2024-09-04 6:36 ` Linus Walleij
2024-09-04 7:04 ` Thomas Zimmermann
2024-09-04 7:41 ` Thomas Zimmermann
2 siblings, 1 reply; 55+ messages in thread
From: Alexander Stein @ 2024-09-04 6:09 UTC (permalink / raw)
To: Thomas Zimmermann, dri-devel
Cc: javierm, deller, airlied, daniel, dri-devel, linux-fbdev,
Linus Walleij
Hi Linus,
Am Mittwoch, 4. September 2024, 00:53:42 CEST schrieb Linus Walleij:
> On Fri, Apr 19, 2024 at 10:35 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
>
> > Add support for damage handling and deferred I/O to fbdev-dma. This
> > enables fbdev-dma to support all DMA-memory-based DRM drivers, even
> > such with a dirty callback in their framebuffers.
> >
> > The patch adds the code for deferred I/O and also sets a dedicated
> > helper for struct fb_ops.fb_mmap that support coherent mappings.
> >
> > v3:
> > - init fb_ops with FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS() (Javier)
> >
> > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> > Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
>
> For some reason this makes the Versatile Express crash in QEMU
> (I can retest on real hardware if necessary):
This commit also breaks i.MX6 on actual hardware, see [1].
[1] https://lore.kernel.org/all/23636953.6Emhk5qWAg@steina-w/
> 8<--- cut here ---
> Unable to handle kernel paging request at virtual address 18095000 when write
> [18095000] *pgd=00000000
> Internal error: Oops: 805 [#1] SMP ARM
> CPU: 0 PID: 75 Comm: S08_ledflash Not tainted 6.9.0-rc6+ #44
> Hardware name: ARM-Versatile Express
> PC is at mmioset+0x34/0xac
> LR is at 0x0
> pc : [<809c2a54>] lr : [<00000000>] psr: 20000013
> sp : f8dddc38 ip : 18095000 fp : 00000000
> r10: 81109a18 r9 : 81238b04 r8 : 00000000
> r7 : 00440dc0 r6 : ed4f32a0 r5 : ed4f32a0 r4 : 00000001
> r3 : 00000000 r2 : 00000fc0 r1 : 00000000 r0 : 18095000
> Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
> Control: 10c5387d Table: 81d6406a DAC: 00000051
> Register r0 information: non-paged memory
> Register r1 information: NULL pointer
> Register r2 information: non-paged memory
> Register r3 information: NULL pointer
> Register r4 information: non-paged memory
> Register r5 information: non-slab/vmalloc memory
> Register r6 information: non-slab/vmalloc memory
> Register r7 information: non-paged memory
> Register r8 information: NULL pointer
> Register r9 information: non-slab/vmalloc memory
> Register r10 information: non-slab/vmalloc memory
> Register r11 information: NULL pointer
> Register r12 information: non-paged memory
> Process S08_ledflash (pid: 75, stack limit = 0x(ptrval))
> Stack: (0xf8dddc38 to 0xf8dde000)
> dc20: 00000801 802af888
> dc40: 80a0fb80 00440dc0 00000801 811fad80 00000000 f8dddd28 ed4f32a0 811fa680
> dc60: 00000000 802b0c30 ee1d2140 ee1d215c 95ff4385 00000001 00000001 00000001
> dc80: 00000000 00000000 ffffffff 8196a70b 000000b0 00000064 0000006c 00000000
> dca0: 00000001 00000002 00000001 811fa798 00000801 811fa940 80a0fb80 00000cc0
> dcc0: 00000001 00000001 00000000 f8dddd28 811fa93c 811fa680 00000002 802b0c30
> dce0: ee1d2140 00440dc0 00000000 00000000 00000001 00000000 811fad80 00440dc0
> dd00: 00000001 00000000 00000000 83201100 00440dc0 00000000 00000000 802afa18
> dd20: 00000bdc 00000bd8 811fad80 00000000 811fad80 00000000 00000000 00000000
> dd40: adf00ec5 816d5fa8 816d5fa8 821c3c00 00000000 7ebc2000 7ebe3000 00000000
> dd60: f8ddde44 8028cfa0 816d5fa8 8288df50 8169cf00 821c3c00 7ebc2000 7ebe3000
> dd80: f8ddde44 8028e1e8 00000001 80bbe932 f8ddde44 f8dddde8 f8ddde44 8288df50
> dda0: 83201100 809cf474 f8ddde44 8169cf00 00000020 8169cf94 821c3c94 7ebe3000
> ddc0: 7ebe2fff fffffff4 00000000 816d5fa8 821c3c00 8169cf00 81d65fa8 809cdbb0
> dde0: 8288df50 81ffa910 7ebe3000 82890b00 00000000 00000000 00000000 00000000
> de00: 00000000 00000000 adf00ec5 00000000 00000000 8169cf00 8288df50 83201100
> de20: 821c3c00 81ffa910 f8ddde44 8011f6e4 00000000 00000000 821c3c7c 8169cf7c
> de40: 83200880 821c3c40 7ebc2000 7ebe2fff 82890b0c 76ea4000 ffffffff 00000000
> de60: 00000000 0f000a01 f8ddde68 f8ddde68 adf00ec5 00000000 00000000 00000000
> de80: 00000000 01200000 83201100 00000000 00000000 8011e2ac 00000000 83200d7c
> dea0: 83201020 83200e70 83200e80 00000000 f8dddf30 83200880 00000000 00000000
> dec0: 00000000 00000000 00000000 82182f38 adf00ec5 00000000 01200000 f8dddf30
> dee0: 00000000 00000000 00000000 00000078 000cb21c 8011fe24 00000020 00000000
> df00: 828a5d80 80a10140 adf00ec5 01200011 00000000 00000000 00000000 f8dddf30
> df20: 00000000 00000078 000cb21c 801203d4 01200000 00000000 00000000 76f46468
> df40: 00000000 00000000 00000011 00000000 00000000 00000000 00000000 00000000
> df60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> df80: 00000003 adf00ec5 76f46468 00000000 76f468c0 00000078 80100290 83201100
> dfa0: 000cb21c 80100060 76f46468 00000000 01200011 00000000 00000000 00000000
> dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> dfe0: 00000078 7ebe2938 76e0854d 76dae7e6 20000030 01200011 00000000 00000000
> Call trace:
> mmioset from prep_new_page+0x160/0x194
> prep_new_page from get_page_from_freelist+0x10f4/0x110c
> get_page_from_freelist from __alloc_pages+0x15c/0x280
> __alloc_pages from __pte_alloc+0x28/0x1bc
> __pte_alloc from copy_page_range+0xc10/0xd28
> copy_page_range from copy_mm+0x5cc/0x850
> copy_mm from copy_process+0x508/0xd8c
> copy_process from kernel_clone+0x94/0x338
> kernel_clone from sys_clone+0x94/0xb0
> sys_clone from ret_fast_syscall+0x0/0x1c
> Exception stack(0xf8dddfa8 to 0xf8dddff0)
> dfa0: 76f46468 00000000 01200011 00000000 00000000 00000000
> dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> dfe0: 00000078 7ebe2938 76e0854d 76dae7e6
> Code: e92d4100 e1a08001 e1a0e003 e2522040 (a8ac410a)
> ---[ end trace 0000000000000000 ]---
>
> I bisected down to this commit and reverting the commit solves the issue.
>
> What is special about the Versatile Express graphics is that it uses a special
> dedicated video RAM, looks like this in the device tree
>
>
> reserved-memory {
> #address-cells = <1>;
> #size-cells = <1>;
> ranges;
>
> /* Chipselect 3 is physically at 0x4c000000 */
> vram: vram@4c000000 {
> /* 8 MB of designated video RAM */
> compatible = "shared-dma-pool";
> reg = <0x4c000000 0x00800000>;
Can you please check in which memory zone this VRAM is located. In my case
it's important CMA is located in Normal zone to trigger this problem.
Best regards,
Alexander
> no-map;
> };
> };
> (...)
> clcd@1f000 {
> compatible = "arm,pl111", "arm,primecell";
> (...)
> memory-region = <&vram>;
>
> This gets picked up in the driver
> drivers/gpu/drm/pl111/pl111_drv.c
> like this:
>
> ret = of_reserved_mem_device_init(dev);
> if (!ret) {
> dev_info(dev, "using device-specific reserved memory\n");
> priv->use_device_memory = true;
> }
>
> Yours,
> Linus Walleij
>
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-04 6:09 ` Alexander Stein
@ 2024-09-04 6:36 ` Linus Walleij
2024-09-04 6:43 ` Alexander Stein
0 siblings, 1 reply; 55+ messages in thread
From: Linus Walleij @ 2024-09-04 6:36 UTC (permalink / raw)
To: Alexander Stein
Cc: Thomas Zimmermann, dri-devel, javierm, deller, airlied, daniel,
linux-fbdev
On Wed, Sep 4, 2024 at 8:09 AM Alexander Stein
<alexander.stein@ew.tq-group.com> wrote:
> Can you please check in which memory zone this VRAM is located. In my case
> it's important CMA is located in Normal zone to trigger this problem.
dmesg says this:
Reserved memory: created DMA memory pool at 0x18000000, size 8 MiB
OF: reserved mem: initialized node vram@18000000, compatible id shared-dma-pool
OF: reserved mem: 0x18000000..0x187fffff (8192 KiB) nomap non-reusable
vram@18000000
cma: Reserved 16 MiB at 0xef000000 on node -1
Zone ranges:
Normal [mem 0x0000000080000000-0x00000000efffffff]
Movable zone start for each node
Early memory node ranges
node 0: [mem 0x0000000080000000-0x00000000efffffff]
Initmem setup node 0 [mem 0x0000000080000000-0x00000000efffffff]
percpu: Embedded 15 pages/cpu s39052 r0 d22388 u61440
So at the top of the normal zone at 0xef000000 as I read it.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-04 6:36 ` Linus Walleij
@ 2024-09-04 6:43 ` Alexander Stein
2024-09-04 7:08 ` Thomas Zimmermann
0 siblings, 1 reply; 55+ messages in thread
From: Alexander Stein @ 2024-09-04 6:43 UTC (permalink / raw)
To: Linus Walleij
Cc: Thomas Zimmermann, dri-devel, javierm, deller, airlied, daniel,
linux-fbdev
Hi Linus,
Am Mittwoch, 4. September 2024, 08:36:46 CEST schrieb Linus Walleij:
> On Wed, Sep 4, 2024 at 8:09 AM Alexander Stein
> <alexander.stein@ew.tq-group.com> wrote:
>
> > Can you please check in which memory zone this VRAM is located. In my case
> > it's important CMA is located in Normal zone to trigger this problem.
>
> dmesg says this:
>
> Reserved memory: created DMA memory pool at 0x18000000, size 8 MiB
> OF: reserved mem: initialized node vram@18000000, compatible id shared-dma-pool
> OF: reserved mem: 0x18000000..0x187fffff (8192 KiB) nomap non-reusable
> vram@18000000
> cma: Reserved 16 MiB at 0xef000000 on node -1
> Zone ranges:
> Normal [mem 0x0000000080000000-0x00000000efffffff]
> Movable zone start for each node
> Early memory node ranges
> node 0: [mem 0x0000000080000000-0x00000000efffffff]
> Initmem setup node 0 [mem 0x0000000080000000-0x00000000efffffff]
> percpu: Embedded 15 pages/cpu s39052 r0 d22388 u61440
>
> So at the top of the normal zone at 0xef000000 as I read it.
Okay, so it is the same as for me. It seems you don't have any HighMem.
On a different model having more memory there is also HighMem available:
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x0000000010000000-0x000000003fffffff]
[ 0.000000] HighMem [mem 0x0000000040000000-0x000000004fffffff]
If I explicitly configure CMA in HighMem I don't have any issues.
But the 512MiB models don't have enough memory for fixed allocation in HighMem.
I was about to send a revert myself as I didn't get any feedback yet.
Best regards,
Alexander
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-03 22:53 ` Linus Walleij
2024-09-04 6:09 ` Alexander Stein
@ 2024-09-04 7:04 ` Thomas Zimmermann
2024-09-04 7:41 ` Thomas Zimmermann
2 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-09-04 7:04 UTC (permalink / raw)
To: Linus Walleij; +Cc: javierm, deller, airlied, daniel, dri-devel, linux-fbdev
Hi Linus
Am 04.09.24 um 00:53 schrieb Linus Walleij:
> On Fri, Apr 19, 2024 at 10:35 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
>
>> Add support for damage handling and deferred I/O to fbdev-dma. This
>> enables fbdev-dma to support all DMA-memory-based DRM drivers, even
>> such with a dirty callback in their framebuffers.
>>
>> The patch adds the code for deferred I/O and also sets a dedicated
>> helper for struct fb_ops.fb_mmap that support coherent mappings.
>>
>> v3:
>> - init fb_ops with FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS() (Javier)
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
> For some reason this makes the Versatile Express crash in QEMU
> (I can retest on real hardware if necessary):
>
> 8<--- cut here ---
> Unable to handle kernel paging request at virtual address 18095000 when write
> [18095000] *pgd=00000000
> Internal error: Oops: 805 [#1] SMP ARM
> CPU: 0 PID: 75 Comm: S08_ledflash Not tainted 6.9.0-rc6+ #44
> Hardware name: ARM-Versatile Express
> PC is at mmioset+0x34/0xac
> LR is at 0x0
> pc : [<809c2a54>] lr : [<00000000>] psr: 20000013
> sp : f8dddc38 ip : 18095000 fp : 00000000
> r10: 81109a18 r9 : 81238b04 r8 : 00000000
> r7 : 00440dc0 r6 : ed4f32a0 r5 : ed4f32a0 r4 : 00000001
> r3 : 00000000 r2 : 00000fc0 r1 : 00000000 r0 : 18095000
> Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
> Control: 10c5387d Table: 81d6406a DAC: 00000051
> Register r0 information: non-paged memory
> Register r1 information: NULL pointer
> Register r2 information: non-paged memory
> Register r3 information: NULL pointer
> Register r4 information: non-paged memory
> Register r5 information: non-slab/vmalloc memory
> Register r6 information: non-slab/vmalloc memory
> Register r7 information: non-paged memory
> Register r8 information: NULL pointer
> Register r9 information: non-slab/vmalloc memory
> Register r10 information: non-slab/vmalloc memory
> Register r11 information: NULL pointer
> Register r12 information: non-paged memory
> Process S08_ledflash (pid: 75, stack limit = 0x(ptrval))
> Stack: (0xf8dddc38 to 0xf8dde000)
> dc20: 00000801 802af888
> dc40: 80a0fb80 00440dc0 00000801 811fad80 00000000 f8dddd28 ed4f32a0 811fa680
> dc60: 00000000 802b0c30 ee1d2140 ee1d215c 95ff4385 00000001 00000001 00000001
> dc80: 00000000 00000000 ffffffff 8196a70b 000000b0 00000064 0000006c 00000000
> dca0: 00000001 00000002 00000001 811fa798 00000801 811fa940 80a0fb80 00000cc0
> dcc0: 00000001 00000001 00000000 f8dddd28 811fa93c 811fa680 00000002 802b0c30
> dce0: ee1d2140 00440dc0 00000000 00000000 00000001 00000000 811fad80 00440dc0
> dd00: 00000001 00000000 00000000 83201100 00440dc0 00000000 00000000 802afa18
> dd20: 00000bdc 00000bd8 811fad80 00000000 811fad80 00000000 00000000 00000000
> dd40: adf00ec5 816d5fa8 816d5fa8 821c3c00 00000000 7ebc2000 7ebe3000 00000000
> dd60: f8ddde44 8028cfa0 816d5fa8 8288df50 8169cf00 821c3c00 7ebc2000 7ebe3000
> dd80: f8ddde44 8028e1e8 00000001 80bbe932 f8ddde44 f8dddde8 f8ddde44 8288df50
> dda0: 83201100 809cf474 f8ddde44 8169cf00 00000020 8169cf94 821c3c94 7ebe3000
> ddc0: 7ebe2fff fffffff4 00000000 816d5fa8 821c3c00 8169cf00 81d65fa8 809cdbb0
> dde0: 8288df50 81ffa910 7ebe3000 82890b00 00000000 00000000 00000000 00000000
> de00: 00000000 00000000 adf00ec5 00000000 00000000 8169cf00 8288df50 83201100
> de20: 821c3c00 81ffa910 f8ddde44 8011f6e4 00000000 00000000 821c3c7c 8169cf7c
> de40: 83200880 821c3c40 7ebc2000 7ebe2fff 82890b0c 76ea4000 ffffffff 00000000
> de60: 00000000 0f000a01 f8ddde68 f8ddde68 adf00ec5 00000000 00000000 00000000
> de80: 00000000 01200000 83201100 00000000 00000000 8011e2ac 00000000 83200d7c
> dea0: 83201020 83200e70 83200e80 00000000 f8dddf30 83200880 00000000 00000000
> dec0: 00000000 00000000 00000000 82182f38 adf00ec5 00000000 01200000 f8dddf30
> dee0: 00000000 00000000 00000000 00000078 000cb21c 8011fe24 00000020 00000000
> df00: 828a5d80 80a10140 adf00ec5 01200011 00000000 00000000 00000000 f8dddf30
> df20: 00000000 00000078 000cb21c 801203d4 01200000 00000000 00000000 76f46468
> df40: 00000000 00000000 00000011 00000000 00000000 00000000 00000000 00000000
> df60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> df80: 00000003 adf00ec5 76f46468 00000000 76f468c0 00000078 80100290 83201100
> dfa0: 000cb21c 80100060 76f46468 00000000 01200011 00000000 00000000 00000000
> dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> dfe0: 00000078 7ebe2938 76e0854d 76dae7e6 20000030 01200011 00000000 00000000
> Call trace:
> mmioset from prep_new_page+0x160/0x194
> prep_new_page from get_page_from_freelist+0x10f4/0x110c
> get_page_from_freelist from __alloc_pages+0x15c/0x280
> __alloc_pages from __pte_alloc+0x28/0x1bc
> __pte_alloc from copy_page_range+0xc10/0xd28
> copy_page_range from copy_mm+0x5cc/0x850
> copy_mm from copy_process+0x508/0xd8c
> copy_process from kernel_clone+0x94/0x338
> kernel_clone from sys_clone+0x94/0xb0
> sys_clone from ret_fast_syscall+0x0/0x1c
> Exception stack(0xf8dddfa8 to 0xf8dddff0)
> dfa0: 76f46468 00000000 01200011 00000000 00000000 00000000
> dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> dfe0: 00000078 7ebe2938 76e0854d 76dae7e6
> Code: e92d4100 e1a08001 e1a0e003 e2522040 (a8ac410a)
> ---[ end trace 0000000000000000 ]---
>
> I bisected down to this commit and reverting the commit solves the issue.
Thanks for bisecting. Simply reverting isn't an option as that would
break many other drivers.
Is it only the pl111 driver? If nothing else works, we could give it a
dedicated fbdev emulation.
Best regards
Thomas
>
> What is special about the Versatile Express graphics is that it uses a special
> dedicated video RAM, looks like this in the device tree
>
>
> reserved-memory {
> #address-cells = <1>;
> #size-cells = <1>;
> ranges;
>
> /* Chipselect 3 is physically at 0x4c000000 */
> vram: vram@4c000000 {
> /* 8 MB of designated video RAM */
> compatible = "shared-dma-pool";
> reg = <0x4c000000 0x00800000>;
> no-map;
> };
> };
> (...)
> clcd@1f000 {
> compatible = "arm,pl111", "arm,primecell";
> (...)
> memory-region = <&vram>;
>
> This gets picked up in the driver
> drivers/gpu/drm/pl111/pl111_drv.c
> like this:
>
> ret = of_reserved_mem_device_init(dev);
> if (!ret) {
> dev_info(dev, "using device-specific reserved memory\n");
> priv->use_device_memory = true;
> }
>
> Yours,
> Linus Walleij
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-04 6:43 ` Alexander Stein
@ 2024-09-04 7:08 ` Thomas Zimmermann
0 siblings, 0 replies; 55+ messages in thread
From: Thomas Zimmermann @ 2024-09-04 7:08 UTC (permalink / raw)
To: Alexander Stein, Linus Walleij
Cc: dri-devel, javierm, deller, airlied, daniel, linux-fbdev
Hi
Am 04.09.24 um 08:43 schrieb Alexander Stein:
> Hi Linus,
>
> Am Mittwoch, 4. September 2024, 08:36:46 CEST schrieb Linus Walleij:
>> On Wed, Sep 4, 2024 at 8:09 AM Alexander Stein
>> <alexander.stein@ew.tq-group.com> wrote:
>>
>>> Can you please check in which memory zone this VRAM is located. In my case
>>> it's important CMA is located in Normal zone to trigger this problem.
>> dmesg says this:
>>
>> Reserved memory: created DMA memory pool at 0x18000000, size 8 MiB
>> OF: reserved mem: initialized node vram@18000000, compatible id shared-dma-pool
>> OF: reserved mem: 0x18000000..0x187fffff (8192 KiB) nomap non-reusable
>> vram@18000000
>> cma: Reserved 16 MiB at 0xef000000 on node -1
>> Zone ranges:
>> Normal [mem 0x0000000080000000-0x00000000efffffff]
>> Movable zone start for each node
>> Early memory node ranges
>> node 0: [mem 0x0000000080000000-0x00000000efffffff]
>> Initmem setup node 0 [mem 0x0000000080000000-0x00000000efffffff]
>> percpu: Embedded 15 pages/cpu s39052 r0 d22388 u61440
>>
>> So at the top of the normal zone at 0xef000000 as I read it.
> Okay, so it is the same as for me. It seems you don't have any HighMem.
> On a different model having more memory there is also HighMem available:
>
> [ 0.000000] Zone ranges:
> [ 0.000000] Normal [mem 0x0000000010000000-0x000000003fffffff]
> [ 0.000000] HighMem [mem 0x0000000040000000-0x000000004fffffff]
IIRC vram needs to be located in HighMem for the code to work. What is
the difference between these zones?
Best regards
Thomas
>
> If I explicitly configure CMA in HighMem I don't have any issues.
> But the 512MiB models don't have enough memory for fixed allocation in HighMem.
>
> I was about to send a revert myself as I didn't get any feedback yet.
>
> Best regards,
> Alexander
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
^ permalink raw reply [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-03 22:53 ` Linus Walleij
2024-09-04 6:09 ` Alexander Stein
2024-09-04 7:04 ` Thomas Zimmermann
@ 2024-09-04 7:41 ` Thomas Zimmermann
2024-09-04 8:29 ` Alexander Stein
2 siblings, 1 reply; 55+ messages in thread
From: Thomas Zimmermann @ 2024-09-04 7:41 UTC (permalink / raw)
To: Linus Walleij; +Cc: javierm, deller, airlied, daniel, dri-devel, linux-fbdev
[-- Attachment #1: Type: text/plain, Size: 7126 bytes --]
Hi Linus, Alexander,
Attached is a patch to mitigate the problem and go back to the old
behavior for pl111. Can you please test it on affected and unaffected
systems and report the results?
Best regards
Thomas
Am 04.09.24 um 00:53 schrieb Linus Walleij:
> On Fri, Apr 19, 2024 at 10:35 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
>
>> Add support for damage handling and deferred I/O to fbdev-dma. This
>> enables fbdev-dma to support all DMA-memory-based DRM drivers, even
>> such with a dirty callback in their framebuffers.
>>
>> The patch adds the code for deferred I/O and also sets a dedicated
>> helper for struct fb_ops.fb_mmap that support coherent mappings.
>>
>> v3:
>> - init fb_ops with FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS() (Javier)
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
>> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
> For some reason this makes the Versatile Express crash in QEMU
> (I can retest on real hardware if necessary):
>
> 8<--- cut here ---
> Unable to handle kernel paging request at virtual address 18095000 when write
> [18095000] *pgd=00000000
> Internal error: Oops: 805 [#1] SMP ARM
> CPU: 0 PID: 75 Comm: S08_ledflash Not tainted 6.9.0-rc6+ #44
> Hardware name: ARM-Versatile Express
> PC is at mmioset+0x34/0xac
> LR is at 0x0
> pc : [<809c2a54>] lr : [<00000000>] psr: 20000013
> sp : f8dddc38 ip : 18095000 fp : 00000000
> r10: 81109a18 r9 : 81238b04 r8 : 00000000
> r7 : 00440dc0 r6 : ed4f32a0 r5 : ed4f32a0 r4 : 00000001
> r3 : 00000000 r2 : 00000fc0 r1 : 00000000 r0 : 18095000
> Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
> Control: 10c5387d Table: 81d6406a DAC: 00000051
> Register r0 information: non-paged memory
> Register r1 information: NULL pointer
> Register r2 information: non-paged memory
> Register r3 information: NULL pointer
> Register r4 information: non-paged memory
> Register r5 information: non-slab/vmalloc memory
> Register r6 information: non-slab/vmalloc memory
> Register r7 information: non-paged memory
> Register r8 information: NULL pointer
> Register r9 information: non-slab/vmalloc memory
> Register r10 information: non-slab/vmalloc memory
> Register r11 information: NULL pointer
> Register r12 information: non-paged memory
> Process S08_ledflash (pid: 75, stack limit = 0x(ptrval))
> Stack: (0xf8dddc38 to 0xf8dde000)
> dc20: 00000801 802af888
> dc40: 80a0fb80 00440dc0 00000801 811fad80 00000000 f8dddd28 ed4f32a0 811fa680
> dc60: 00000000 802b0c30 ee1d2140 ee1d215c 95ff4385 00000001 00000001 00000001
> dc80: 00000000 00000000 ffffffff 8196a70b 000000b0 00000064 0000006c 00000000
> dca0: 00000001 00000002 00000001 811fa798 00000801 811fa940 80a0fb80 00000cc0
> dcc0: 00000001 00000001 00000000 f8dddd28 811fa93c 811fa680 00000002 802b0c30
> dce0: ee1d2140 00440dc0 00000000 00000000 00000001 00000000 811fad80 00440dc0
> dd00: 00000001 00000000 00000000 83201100 00440dc0 00000000 00000000 802afa18
> dd20: 00000bdc 00000bd8 811fad80 00000000 811fad80 00000000 00000000 00000000
> dd40: adf00ec5 816d5fa8 816d5fa8 821c3c00 00000000 7ebc2000 7ebe3000 00000000
> dd60: f8ddde44 8028cfa0 816d5fa8 8288df50 8169cf00 821c3c00 7ebc2000 7ebe3000
> dd80: f8ddde44 8028e1e8 00000001 80bbe932 f8ddde44 f8dddde8 f8ddde44 8288df50
> dda0: 83201100 809cf474 f8ddde44 8169cf00 00000020 8169cf94 821c3c94 7ebe3000
> ddc0: 7ebe2fff fffffff4 00000000 816d5fa8 821c3c00 8169cf00 81d65fa8 809cdbb0
> dde0: 8288df50 81ffa910 7ebe3000 82890b00 00000000 00000000 00000000 00000000
> de00: 00000000 00000000 adf00ec5 00000000 00000000 8169cf00 8288df50 83201100
> de20: 821c3c00 81ffa910 f8ddde44 8011f6e4 00000000 00000000 821c3c7c 8169cf7c
> de40: 83200880 821c3c40 7ebc2000 7ebe2fff 82890b0c 76ea4000 ffffffff 00000000
> de60: 00000000 0f000a01 f8ddde68 f8ddde68 adf00ec5 00000000 00000000 00000000
> de80: 00000000 01200000 83201100 00000000 00000000 8011e2ac 00000000 83200d7c
> dea0: 83201020 83200e70 83200e80 00000000 f8dddf30 83200880 00000000 00000000
> dec0: 00000000 00000000 00000000 82182f38 adf00ec5 00000000 01200000 f8dddf30
> dee0: 00000000 00000000 00000000 00000078 000cb21c 8011fe24 00000020 00000000
> df00: 828a5d80 80a10140 adf00ec5 01200011 00000000 00000000 00000000 f8dddf30
> df20: 00000000 00000078 000cb21c 801203d4 01200000 00000000 00000000 76f46468
> df40: 00000000 00000000 00000011 00000000 00000000 00000000 00000000 00000000
> df60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> df80: 00000003 adf00ec5 76f46468 00000000 76f468c0 00000078 80100290 83201100
> dfa0: 000cb21c 80100060 76f46468 00000000 01200011 00000000 00000000 00000000
> dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> dfe0: 00000078 7ebe2938 76e0854d 76dae7e6 20000030 01200011 00000000 00000000
> Call trace:
> mmioset from prep_new_page+0x160/0x194
> prep_new_page from get_page_from_freelist+0x10f4/0x110c
> get_page_from_freelist from __alloc_pages+0x15c/0x280
> __alloc_pages from __pte_alloc+0x28/0x1bc
> __pte_alloc from copy_page_range+0xc10/0xd28
> copy_page_range from copy_mm+0x5cc/0x850
> copy_mm from copy_process+0x508/0xd8c
> copy_process from kernel_clone+0x94/0x338
> kernel_clone from sys_clone+0x94/0xb0
> sys_clone from ret_fast_syscall+0x0/0x1c
> Exception stack(0xf8dddfa8 to 0xf8dddff0)
> dfa0: 76f46468 00000000 01200011 00000000 00000000 00000000
> dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> dfe0: 00000078 7ebe2938 76e0854d 76dae7e6
> Code: e92d4100 e1a08001 e1a0e003 e2522040 (a8ac410a)
> ---[ end trace 0000000000000000 ]---
>
> I bisected down to this commit and reverting the commit solves the issue.
>
> What is special about the Versatile Express graphics is that it uses a special
> dedicated video RAM, looks like this in the device tree
>
>
> reserved-memory {
> #address-cells = <1>;
> #size-cells = <1>;
> ranges;
>
> /* Chipselect 3 is physically at 0x4c000000 */
> vram: vram@4c000000 {
> /* 8 MB of designated video RAM */
> compatible = "shared-dma-pool";
> reg = <0x4c000000 0x00800000>;
> no-map;
> };
> };
> (...)
> clcd@1f000 {
> compatible = "arm,pl111", "arm,primecell";
> (...)
> memory-region = <&vram>;
>
> This gets picked up in the driver
> drivers/gpu/drm/pl111/pl111_drv.c
> like this:
>
> ret = of_reserved_mem_device_init(dev);
> if (!ret) {
> dev_info(dev, "using device-specific reserved memory\n");
> priv->use_device_memory = true;
> }
>
> Yours,
> Linus Walleij
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
[-- Attachment #2: 0001-drm-fbdev-dma-Only-install-deferred-I-O-if-necessary.patch --]
[-- Type: text/x-patch, Size: 5668 bytes --]
From 64de70dc23a66de8b7fd3e341136ac274da01e65 Mon Sep 17 00:00:00 2001
From: Thomas Zimmermann <tzimmermann@suse.de>
Date: Wed, 4 Sep 2024 09:29:41 +0200
Subject: [PATCH] drm/fbdev-dma: Only install deferred I/O if necessary
Deferred I/O requires struct page for framebuffer memory, which is
not guaranteed for all DMA ranges. We thus only install deferred I/O
if we have a framebuffer that requires it.
A reported bug affected the pl111 drivers, which has video memory in
either Normal or HighMem zones
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x0000000010000000-0x000000003fffffff]
[ 0.000000] HighMem [mem 0x0000000040000000-0x000000004fffffff]
where deferred I/O only works correctly with HighMem. See the Closes
tags for bug reports.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 808a40b69468 ("drm/fbdev-dma: Implement damage handling and deferred I/O")
Reported-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Closes: https://lore.kernel.org/all/23636953.6Emhk5qWAg@steina-w/
Reported-by: Linus Walleij <linus.walleij@linaro.org>
Closes: https://lore.kernel.org/dri-devel/CACRpkdb+hb9AGavbWpY-=uQQ0apY9en_tWJioPKf_fAbXMP4Hg@mail.gmail.com/
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
---
drivers/gpu/drm/drm_fbdev_dma.c | 71 ++++++++++++++++++++++++---------
1 file changed, 52 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 7ef5a48c8029..455dc48d17a7 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -36,20 +36,11 @@ static int drm_fbdev_dma_fb_release(struct fb_info *info, int user)
return 0;
}
-FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma,
- drm_fb_helper_damage_range,
- drm_fb_helper_damage_area);
-
static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
{
struct drm_fb_helper *fb_helper = info->par;
- struct drm_framebuffer *fb = fb_helper->fb;
- struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
- if (!dma->map_noncoherent)
- vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
-
- return fb_deferred_io_mmap(info, vma);
+ return drm_gem_prime_mmap(fb_helper->buffer->gem, vma);
}
static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
@@ -70,13 +61,40 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
}
static const struct fb_ops drm_fbdev_dma_fb_ops = {
+ .owner = THIS_MODULE,
+ .fb_open = drm_fbdev_dma_fb_open,
+ .fb_release = drm_fbdev_dma_fb_release,
+ __FB_DEFAULT_DMAMEM_OPS_RDWR,
+ DRM_FB_HELPER_DEFAULT_OPS,
+ __FB_DEFAULT_DMAMEM_OPS_DRAW,
+ .fb_mmap = drm_fbdev_dma_fb_mmap,
+ .fb_destroy = drm_fbdev_dma_fb_destroy,
+};
+
+FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(drm_fbdev_dma,
+ drm_fb_helper_damage_range,
+ drm_fb_helper_damage_area);
+
+static int drm_fbdev_dma_deferred_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+ struct drm_framebuffer *fb = fb_helper->fb;
+ struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
+
+ if (!dma->map_noncoherent)
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ return fb_deferred_io_mmap(info, vma);
+}
+
+static const struct fb_ops drm_fbdev_dma_deferred_fb_ops = {
.owner = THIS_MODULE,
.fb_open = drm_fbdev_dma_fb_open,
.fb_release = drm_fbdev_dma_fb_release,
__FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_dma),
DRM_FB_HELPER_DEFAULT_OPS,
__FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_dma),
- .fb_mmap = drm_fbdev_dma_fb_mmap,
+ .fb_mmap = drm_fbdev_dma_deferred_fb_mmap,
.fb_destroy = drm_fbdev_dma_fb_destroy,
};
@@ -89,6 +107,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
{
struct drm_client_dev *client = &fb_helper->client;
struct drm_device *dev = fb_helper->dev;
+ bool use_deferred_io = false;
struct drm_client_buffer *buffer;
struct drm_gem_dma_object *dma_obj;
struct drm_framebuffer *fb;
@@ -111,6 +130,15 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
fb = buffer->fb;
+ /*
+ * Deferred I/O requires struct page for framebuffer memory,
+ * which is not guaranteed for all DMA ranges. We thus only
+ * install deferred I/O if we have a framebuffer that requires
+ * it.
+ */
+ if (fb->funcs->dirty)
+ use_deferred_io = true;
+
ret = drm_client_buffer_vmap(buffer, &map);
if (ret) {
goto err_drm_client_buffer_delete;
@@ -130,7 +158,10 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
drm_fb_helper_fill_info(info, fb_helper, sizes);
- info->fbops = &drm_fbdev_dma_fb_ops;
+ if (use_deferred_io)
+ info->fbops = &drm_fbdev_dma_deferred_fb_ops;
+ else
+ info->fbops = &drm_fbdev_dma_fb_ops;
/* screen */
info->flags |= FBINFO_VIRTFB; /* system memory */
@@ -145,13 +176,15 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
info->fix.smem_len = info->screen_size;
/* deferred I/O */
- fb_helper->fbdefio.delay = HZ / 20;
- fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
-
- info->fbdefio = &fb_helper->fbdefio;
- ret = fb_deferred_io_init(info);
- if (ret)
- goto err_drm_fb_helper_release_info;
+ if (use_deferred_io) {
+ fb_helper->fbdefio.delay = HZ / 20;
+ fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
+
+ info->fbdefio = &fb_helper->fbdefio;
+ ret = fb_deferred_io_init(info);
+ if (ret)
+ goto err_drm_fb_helper_release_info;
+ }
return 0;
--
2.46.0
^ permalink raw reply related [flat|nested] 55+ messages in thread
* Re: [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
2024-09-04 7:41 ` Thomas Zimmermann
@ 2024-09-04 8:29 ` Alexander Stein
0 siblings, 0 replies; 55+ messages in thread
From: Alexander Stein @ 2024-09-04 8:29 UTC (permalink / raw)
To: Linus Walleij, dri-devel
Cc: javierm, deller, airlied, daniel, dri-devel, linux-fbdev,
Thomas Zimmermann
Hi Thomas,
Am Mittwoch, 4. September 2024, 09:41:12 CEST schrieb Thomas Zimmermann:
> Hi Linus, Alexander,
>
> Attached is a patch to mitigate the problem and go back to the old
> behavior for pl111. Can you please test it on affected and unaffected
> systems and report the results?
Thank you for the patch. This indeed fixes the mmap problem on my i.MX6
platform which only has Normal memory:
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x0000000010000000-0x000000002fffffff]
[ 0.000000] HighMem empty
But please note this is not pl111 based but IPUv3 (drivers/gpu/ipu-v3).
You might want to adjust the commit message.
Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com>
Best regards,
Alexander
> Am 04.09.24 um 00:53 schrieb Linus Walleij:
> > On Fri, Apr 19, 2024 at 10:35 AM Thomas Zimmermann <tzimmermann@suse.de> wrote:
> >
> >> Add support for damage handling and deferred I/O to fbdev-dma. This
> >> enables fbdev-dma to support all DMA-memory-based DRM drivers, even
> >> such with a dirty callback in their framebuffers.
> >>
> >> The patch adds the code for deferred I/O and also sets a dedicated
> >> helper for struct fb_ops.fb_mmap that support coherent mappings.
> >>
> >> v3:
> >> - init fb_ops with FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS() (Javier)
> >>
> >> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> >> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
> > For some reason this makes the Versatile Express crash in QEMU
> > (I can retest on real hardware if necessary):
> >
> > 8<--- cut here ---
> > Unable to handle kernel paging request at virtual address 18095000 when write
> > [18095000] *pgd=00000000
> > Internal error: Oops: 805 [#1] SMP ARM
> > CPU: 0 PID: 75 Comm: S08_ledflash Not tainted 6.9.0-rc6+ #44
> > Hardware name: ARM-Versatile Express
> > PC is at mmioset+0x34/0xac
> > LR is at 0x0
> > pc : [<809c2a54>] lr : [<00000000>] psr: 20000013
> > sp : f8dddc38 ip : 18095000 fp : 00000000
> > r10: 81109a18 r9 : 81238b04 r8 : 00000000
> > r7 : 00440dc0 r6 : ed4f32a0 r5 : ed4f32a0 r4 : 00000001
> > r3 : 00000000 r2 : 00000fc0 r1 : 00000000 r0 : 18095000
> > Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
> > Control: 10c5387d Table: 81d6406a DAC: 00000051
> > Register r0 information: non-paged memory
> > Register r1 information: NULL pointer
> > Register r2 information: non-paged memory
> > Register r3 information: NULL pointer
> > Register r4 information: non-paged memory
> > Register r5 information: non-slab/vmalloc memory
> > Register r6 information: non-slab/vmalloc memory
> > Register r7 information: non-paged memory
> > Register r8 information: NULL pointer
> > Register r9 information: non-slab/vmalloc memory
> > Register r10 information: non-slab/vmalloc memory
> > Register r11 information: NULL pointer
> > Register r12 information: non-paged memory
> > Process S08_ledflash (pid: 75, stack limit = 0x(ptrval))
> > Stack: (0xf8dddc38 to 0xf8dde000)
> > dc20: 00000801 802af888
> > dc40: 80a0fb80 00440dc0 00000801 811fad80 00000000 f8dddd28 ed4f32a0 811fa680
> > dc60: 00000000 802b0c30 ee1d2140 ee1d215c 95ff4385 00000001 00000001 00000001
> > dc80: 00000000 00000000 ffffffff 8196a70b 000000b0 00000064 0000006c 00000000
> > dca0: 00000001 00000002 00000001 811fa798 00000801 811fa940 80a0fb80 00000cc0
> > dcc0: 00000001 00000001 00000000 f8dddd28 811fa93c 811fa680 00000002 802b0c30
> > dce0: ee1d2140 00440dc0 00000000 00000000 00000001 00000000 811fad80 00440dc0
> > dd00: 00000001 00000000 00000000 83201100 00440dc0 00000000 00000000 802afa18
> > dd20: 00000bdc 00000bd8 811fad80 00000000 811fad80 00000000 00000000 00000000
> > dd40: adf00ec5 816d5fa8 816d5fa8 821c3c00 00000000 7ebc2000 7ebe3000 00000000
> > dd60: f8ddde44 8028cfa0 816d5fa8 8288df50 8169cf00 821c3c00 7ebc2000 7ebe3000
> > dd80: f8ddde44 8028e1e8 00000001 80bbe932 f8ddde44 f8dddde8 f8ddde44 8288df50
> > dda0: 83201100 809cf474 f8ddde44 8169cf00 00000020 8169cf94 821c3c94 7ebe3000
> > ddc0: 7ebe2fff fffffff4 00000000 816d5fa8 821c3c00 8169cf00 81d65fa8 809cdbb0
> > dde0: 8288df50 81ffa910 7ebe3000 82890b00 00000000 00000000 00000000 00000000
> > de00: 00000000 00000000 adf00ec5 00000000 00000000 8169cf00 8288df50 83201100
> > de20: 821c3c00 81ffa910 f8ddde44 8011f6e4 00000000 00000000 821c3c7c 8169cf7c
> > de40: 83200880 821c3c40 7ebc2000 7ebe2fff 82890b0c 76ea4000 ffffffff 00000000
> > de60: 00000000 0f000a01 f8ddde68 f8ddde68 adf00ec5 00000000 00000000 00000000
> > de80: 00000000 01200000 83201100 00000000 00000000 8011e2ac 00000000 83200d7c
> > dea0: 83201020 83200e70 83200e80 00000000 f8dddf30 83200880 00000000 00000000
> > dec0: 00000000 00000000 00000000 82182f38 adf00ec5 00000000 01200000 f8dddf30
> > dee0: 00000000 00000000 00000000 00000078 000cb21c 8011fe24 00000020 00000000
> > df00: 828a5d80 80a10140 adf00ec5 01200011 00000000 00000000 00000000 f8dddf30
> > df20: 00000000 00000078 000cb21c 801203d4 01200000 00000000 00000000 76f46468
> > df40: 00000000 00000000 00000011 00000000 00000000 00000000 00000000 00000000
> > df60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
> > df80: 00000003 adf00ec5 76f46468 00000000 76f468c0 00000078 80100290 83201100
> > dfa0: 000cb21c 80100060 76f46468 00000000 01200011 00000000 00000000 00000000
> > dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> > dfe0: 00000078 7ebe2938 76e0854d 76dae7e6 20000030 01200011 00000000 00000000
> > Call trace:
> > mmioset from prep_new_page+0x160/0x194
> > prep_new_page from get_page_from_freelist+0x10f4/0x110c
> > get_page_from_freelist from __alloc_pages+0x15c/0x280
> > __alloc_pages from __pte_alloc+0x28/0x1bc
> > __pte_alloc from copy_page_range+0xc10/0xd28
> > copy_page_range from copy_mm+0x5cc/0x850
> > copy_mm from copy_process+0x508/0xd8c
> > copy_process from kernel_clone+0x94/0x338
> > kernel_clone from sys_clone+0x94/0xb0
> > sys_clone from ret_fast_syscall+0x0/0x1c
> > Exception stack(0xf8dddfa8 to 0xf8dddff0)
> > dfa0: 76f46468 00000000 01200011 00000000 00000000 00000000
> > dfc0: 76f46468 00000000 76f468c0 00000078 00000000 76e81000 76f46400 000cb21c
> > dfe0: 00000078 7ebe2938 76e0854d 76dae7e6
> > Code: e92d4100 e1a08001 e1a0e003 e2522040 (a8ac410a)
> > ---[ end trace 0000000000000000 ]---
> >
> > I bisected down to this commit and reverting the commit solves the issue.
> >
> > What is special about the Versatile Express graphics is that it uses a special
> > dedicated video RAM, looks like this in the device tree
> >
> >
> > reserved-memory {
> > #address-cells = <1>;
> > #size-cells = <1>;
> > ranges;
> >
> > /* Chipselect 3 is physically at 0x4c000000 */
> > vram: vram@4c000000 {
> > /* 8 MB of designated video RAM */
> > compatible = "shared-dma-pool";
> > reg = <0x4c000000 0x00800000>;
> > no-map;
> > };
> > };
> > (...)
> > clcd@1f000 {
> > compatible = "arm,pl111", "arm,primecell";
> > (...)
> > memory-region = <&vram>;
> >
> > This gets picked up in the driver
> > drivers/gpu/drm/pl111/pl111_drv.c
> > like this:
> >
> > ret = of_reserved_mem_device_init(dev);
> > if (!ret) {
> > dev_info(dev, "using device-specific reserved memory\n");
> > priv->use_device_memory = true;
> > }
> >
> > Yours,
> > Linus Walleij
>
>
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
^ permalink raw reply [flat|nested] 55+ messages in thread
end of thread, other threads:[~2024-09-04 8:29 UTC | newest]
Thread overview: 55+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-04-19 8:28 [PATCH v3 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 01/43] drm/fbdev-generic: Do not set physical framebuffer address Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 02/43] fbdev/deferred-io: Move pageref setup into separate helper Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 03/43] fbdev/deferred-io: Clean up pageref on lastclose Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 04/43] fbdev/deferred-io: Test screen_buffer for vmalloc'ed memory Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 05/43] fbdev/deferred-io: Test smem_start for I/O memory Thomas Zimmermann
2024-04-19 8:28 ` [PATCH v3 06/43] fbdev/deferred-io: Always call get_page() for framebuffer pages Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 07/43] fbdev/deferred-io: Provide get_page hook in struct fb_deferred_io Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 08/43] drm/fbdev: Add fbdev-shmem Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 09/43] drm/ast: Use fbdev-shmem Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 10/43] drm/gud: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 11/43] drm/hyperv: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 12/43] drm/mgag200: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 13/43] drm/solomon: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 14/43] drm/tiny/cirrus: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 15/43] drm/tiny/gm12u320: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 16/43] drm/tiny/ofdrm: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 17/43] drm/tiny/simpledrm: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 18/43] drm/udl: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 19/43] drm/virtio: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 20/43] drm/vkms: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O Thomas Zimmermann
2024-09-03 22:53 ` Linus Walleij
2024-09-04 6:09 ` Alexander Stein
2024-09-04 6:36 ` Linus Walleij
2024-09-04 6:43 ` Alexander Stein
2024-09-04 7:08 ` Thomas Zimmermann
2024-09-04 7:04 ` Thomas Zimmermann
2024-09-04 7:41 ` Thomas Zimmermann
2024-09-04 8:29 ` Alexander Stein
2024-04-19 8:29 ` [PATCH v3 22/43] drm/arm/komeda: Use fbdev-dma Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 23/43] drm/hisilicon/kirin: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 24/43] drm/imx/lcdc: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 25/43] drm/ingenic: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 26/43] drm/mediatek: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 27/43] drm/panel/panel-ilitek-9341: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 28/43] drm/renesas/rcar-du: " Thomas Zimmermann
2024-04-19 9:48 ` Kieran Bingham
2024-06-17 17:33 ` Geert Uytterhoeven
2024-04-19 8:29 ` [PATCH v3 29/43] drm/renesas/rz-du: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 30/43] drm/renesas/shmobile: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 31/43] drm/rockchip: " Thomas Zimmermann
2024-04-19 11:10 ` Heiko Stuebner
2024-04-19 8:29 ` [PATCH v3 32/43] drm/tiny/hx8357d: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 33/43] drm/tiny/ili9163: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 34/43] drm/tiny/ili9225: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 35/43] drm/tiny/ili9341: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 36/43] drm/tiny/ili9486: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 37/43] drm/tiny/mi0283qt: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 38/43] drm/tiny/panel-mipi-dbi: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 39/43] drm/tiny/repaper: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 40/43] drm/tiny/st7586: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 41/43] drm/tiny/st7735r: " Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 42/43] drm/fbdev-generic: Convert to fbdev-ttm Thomas Zimmermann
2024-04-19 8:29 ` [PATCH v3 43/43] drm/fbdev: Clean up fbdev documentation Thomas Zimmermann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).