* [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch
@ 2026-03-11 6:46 Chen Ni
2026-03-11 7:44 ` Thomas Zimmermann
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Chen Ni @ 2026-03-11 6:46 UTC (permalink / raw)
To: tzimmermann
Cc: javierm, maarten.lankhorst, mripard, airlied, simona, dri-devel,
linux-kernel, Chen Ni
Fix incorrect error checking and memory type confusion in
efidrm_device_create(). devm_memremap() returns error pointers, not
NULL, and returns system memory while devm_ioremap() returns I/O memory.
The code incorrectly passes system memory to iosys_map_set_vaddr_iomem().
Restructure to handle each memory type separately. Use devm_ioremap*()
with ERR_PTR(-ENXIO) for WC/UC, and devm_memremap() with ERR_CAST() for
WT/WB.
Fixes: 32ae90c66fb6 ("drm/sysfb: Add efidrm for EFI displays")
Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
---
Changes in v2:
- Split mapping logic per memory type
- Remove is_iomem flag
- Use correct error handling (ERR_PTR/ERR_CAST)
---
drivers/gpu/drm/sysfb/efidrm.c | 42 ++++++++++++++++++++++------------
1 file changed, 27 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/sysfb/efidrm.c b/drivers/gpu/drm/sysfb/efidrm.c
index 1114359a1e62..b183256cfcd0 100644
--- a/drivers/gpu/drm/sysfb/efidrm.c
+++ b/drivers/gpu/drm/sysfb/efidrm.c
@@ -157,7 +157,6 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
struct drm_sysfb_device *sysfb;
struct drm_device *dev;
struct resource *mem = NULL;
- void __iomem *screen_base = NULL;
struct drm_plane *primary_plane;
struct drm_crtc *crtc;
struct drm_encoder *encoder;
@@ -244,21 +243,34 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
mem_flags = efidrm_get_mem_flags(dev, res->start, vsize);
- if (mem_flags & EFI_MEMORY_WC)
- screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem));
- else if (mem_flags & EFI_MEMORY_UC)
- screen_base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
- else if (mem_flags & EFI_MEMORY_WT)
- screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
- MEMREMAP_WT);
- else if (mem_flags & EFI_MEMORY_WB)
- screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
- MEMREMAP_WB);
- else
+ if (mem_flags & EFI_MEMORY_WC) {
+ void __iomem *screen_base = devm_ioremap_wc(&pdev->dev, mem->start,
+ resource_size(mem));
+ if (!screen_base)
+ return ERR_PTR(-ENXIO);
+ iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
+ } else if (mem_flags & EFI_MEMORY_UC) {
+ void __iomem *screen_base = devm_ioremap(&pdev->dev, mem->start,
+ resource_size(mem));
+ if (!screen_base)
+ return ERR_PTR(-ENXIO);
+ iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
+ } else if (mem_flags & EFI_MEMORY_WT) {
+ void *screen_base = devm_memremap(&pdev->dev, mem->start,
+ resource_size(mem), MEMREMAP_WT);
+ if (IS_ERR(screen_base))
+ return ERR_CAST(screen_base);
+ iosys_map_set_vaddr(&sysfb->fb_addr, screen_base);
+ } else if (mem_flags & EFI_MEMORY_WB) {
+ void *screen_base = devm_memremap(&pdev->dev, mem->start,
+ resource_size(mem), MEMREMAP_WB);
+ if (IS_ERR(screen_base))
+ return ERR_CAST(screen_base);
+ iosys_map_set_vaddr(&sysfb->fb_addr, screen_base);
+ } else {
drm_err(dev, "invalid mem_flags: 0x%llx\n", mem_flags);
- if (!screen_base)
- return ERR_PTR(-ENOMEM);
- iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
+ return ERR_PTR(-EINVAL);
+ }
/*
* Modesetting
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch
2026-03-11 6:46 [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch Chen Ni
@ 2026-03-11 7:44 ` Thomas Zimmermann
2026-03-11 21:16 ` Claude review: " Claude Code Review Bot
2026-03-11 21:16 ` Claude Code Review Bot
2 siblings, 0 replies; 4+ messages in thread
From: Thomas Zimmermann @ 2026-03-11 7:44 UTC (permalink / raw)
To: Chen Ni
Cc: javierm, maarten.lankhorst, mripard, airlied, simona, dri-devel,
linux-kernel
Hi
Am 11.03.26 um 07:46 schrieb Chen Ni:
> Fix incorrect error checking and memory type confusion in
> efidrm_device_create(). devm_memremap() returns error pointers, not
> NULL, and returns system memory while devm_ioremap() returns I/O memory.
> The code incorrectly passes system memory to iosys_map_set_vaddr_iomem().
>
> Restructure to handle each memory type separately. Use devm_ioremap*()
> with ERR_PTR(-ENXIO) for WC/UC, and devm_memremap() with ERR_CAST() for
> WT/WB.
>
> Fixes: 32ae90c66fb6 ("drm/sysfb: Add efidrm for EFI displays")
> Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Thanks a lot for the fix.
> ---
> Changes in v2:
> - Split mapping logic per memory type
> - Remove is_iomem flag
> - Use correct error handling (ERR_PTR/ERR_CAST)
> ---
> drivers/gpu/drm/sysfb/efidrm.c | 42 ++++++++++++++++++++++------------
> 1 file changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/sysfb/efidrm.c b/drivers/gpu/drm/sysfb/efidrm.c
> index 1114359a1e62..b183256cfcd0 100644
> --- a/drivers/gpu/drm/sysfb/efidrm.c
> +++ b/drivers/gpu/drm/sysfb/efidrm.c
> @@ -157,7 +157,6 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
> struct drm_sysfb_device *sysfb;
> struct drm_device *dev;
> struct resource *mem = NULL;
> - void __iomem *screen_base = NULL;
> struct drm_plane *primary_plane;
> struct drm_crtc *crtc;
> struct drm_encoder *encoder;
> @@ -244,21 +243,34 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
>
> mem_flags = efidrm_get_mem_flags(dev, res->start, vsize);
>
> - if (mem_flags & EFI_MEMORY_WC)
> - screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem));
> - else if (mem_flags & EFI_MEMORY_UC)
> - screen_base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
> - else if (mem_flags & EFI_MEMORY_WT)
> - screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
> - MEMREMAP_WT);
> - else if (mem_flags & EFI_MEMORY_WB)
> - screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
> - MEMREMAP_WB);
> - else
> + if (mem_flags & EFI_MEMORY_WC) {
> + void __iomem *screen_base = devm_ioremap_wc(&pdev->dev, mem->start,
> + resource_size(mem));
IIRC coding style requires that there's an empty line after the
declarations. I'll fix that when I merge the patch. No need to send
another revision.
Best regards
Thomas
> + if (!screen_base)
> + return ERR_PTR(-ENXIO);
> + iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
> + } else if (mem_flags & EFI_MEMORY_UC) {
> + void __iomem *screen_base = devm_ioremap(&pdev->dev, mem->start,
> + resource_size(mem));
> + if (!screen_base)
> + return ERR_PTR(-ENXIO);
> + iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
> + } else if (mem_flags & EFI_MEMORY_WT) {
> + void *screen_base = devm_memremap(&pdev->dev, mem->start,
> + resource_size(mem), MEMREMAP_WT);
> + if (IS_ERR(screen_base))
> + return ERR_CAST(screen_base);
> + iosys_map_set_vaddr(&sysfb->fb_addr, screen_base);
> + } else if (mem_flags & EFI_MEMORY_WB) {
> + void *screen_base = devm_memremap(&pdev->dev, mem->start,
> + resource_size(mem), MEMREMAP_WB);
> + if (IS_ERR(screen_base))
> + return ERR_CAST(screen_base);
> + iosys_map_set_vaddr(&sysfb->fb_addr, screen_base);
> + } else {
> drm_err(dev, "invalid mem_flags: 0x%llx\n", mem_flags);
> - if (!screen_base)
> - return ERR_PTR(-ENOMEM);
> - iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
> + return ERR_PTR(-EINVAL);
> + }
>
> /*
> * Modesetting
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich, (HRB 36809, AG Nürnberg)
^ permalink raw reply [flat|nested] 4+ messages in thread
* Claude review: drm/sysfb: Fix efidrm error handling and memory type mismatch
2026-03-11 6:46 [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch Chen Ni
2026-03-11 7:44 ` Thomas Zimmermann
2026-03-11 21:16 ` Claude review: " Claude Code Review Bot
@ 2026-03-11 21:16 ` Claude Code Review Bot
2 siblings, 0 replies; 4+ messages in thread
From: Claude Code Review Bot @ 2026-03-11 21:16 UTC (permalink / raw)
To: dri-devel-reviews
Overall Series Review
Subject: drm/sysfb: Fix efidrm error handling and memory type mismatch
Author: Chen Ni <nichen@iscas.ac.cn>
Patches: 2
Reviewed: 2026-03-12T07:16:10.625324
---
This is a single-patch series fixing two real bugs in `efidrm_device_create()`:
1. **Incorrect error checking for `devm_memremap()`**: The original code checks `if (!screen_base)`, but `devm_memremap()` returns `ERR_PTR()` on failure, not `NULL`. So the error path was never triggered for the WT/WB cases.
2. **`iosys_map` type mismatch**: `devm_memremap()` returns `void *` (system memory), but the original code unconditionally calls `iosys_map_set_vaddr_iomem()` which sets `is_iomem = true`. For WT/WB memory, `iosys_map_set_vaddr()` (which sets `is_iomem = false`) should be used instead.
Both are legitimate bugs. The fix is correct in approach and addresses both issues properly.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 4+ messages in thread
* Claude review: drm/sysfb: Fix efidrm error handling and memory type mismatch
2026-03-11 6:46 [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch Chen Ni
2026-03-11 7:44 ` Thomas Zimmermann
@ 2026-03-11 21:16 ` Claude Code Review Bot
2026-03-11 21:16 ` Claude Code Review Bot
2 siblings, 0 replies; 4+ messages in thread
From: Claude Code Review Bot @ 2026-03-11 21:16 UTC (permalink / raw)
To: dri-devel-reviews
Patch Review
**Correctness of the fix:**
The restructuring is sound. Each branch now:
- Declares `screen_base` with the correct type (`void __iomem *` for WC/UC, `void *` for WT/WB)
- Uses the correct error check (`!screen_base` for `devm_ioremap*()` which returns NULL on failure, `IS_ERR()` for `devm_memremap()` which returns ERR_PTR)
- Calls the correct `iosys_map` setter (`iosys_map_set_vaddr_iomem` for iomem, `iosys_map_set_vaddr` for system memory)
**Minor issues:**
1. **Error code change for WC/UC paths**: The original code returned `-ENOMEM` when `devm_ioremap*()` failed. The patch changes this to `-ENXIO`:
```c
+ if (!screen_base)
+ return ERR_PTR(-ENXIO);
```
This is arguably fine (`-ENXIO` = "no such device or address" is reasonable for a failed ioremap), but the commit message doesn't mention or justify this change. `-ENOMEM` was also defensible since `ioremap` failures are typically due to resource exhaustion. This is a minor nit — either error code is acceptable.
2. **Missing `else` fall-through error for invalid `mem_flags`**: In the original code, when `mem_flags` matched none of the branches, it printed an error but then fell through to `if (!screen_base)` which returned `-ENOMEM`. The patch now explicitly returns `-EINVAL` for this case:
```c
+ } else {
+ drm_err(dev, "invalid mem_flags: 0x%llx\n", mem_flags);
+ return ERR_PTR(-EINVAL);
+ }
```
This is a good improvement — the error code is now more meaningful and the flow is explicit.
3. **Code duplication**: The WC and UC branches are nearly identical, as are the WT and WB branches. This could be slightly reduced, but given the small number of lines and clarity of the current structure, it's acceptable.
**Commit message quality**: The commit message clearly explains both bugs and the fix approach. The `Fixes:` tag is present and correct.
**Overall**: This is a correct and well-structured fix for real bugs. The patch looks good to merge. The only suggestion would be to briefly note in the commit message why `-ENXIO` was chosen over `-ENOMEM` for the ioremap failure paths, or simply keep `-ENOMEM` to minimize the behavioral change.
---
Generated by Claude Code Patch Reviewer
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-03-11 21:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-11 6:46 [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch Chen Ni
2026-03-11 7:44 ` Thomas Zimmermann
2026-03-11 21:16 ` Claude review: " Claude Code Review Bot
2026-03-11 21:16 ` Claude Code Review Bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox