Skip to content

Commit 5e77923

Browse files
Chen Nitdz
authored andcommitted
drm/sysfb: Fix efidrm error handling and memory type mismatch
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: 32ae90c ("drm/sysfb: Add efidrm for EFI displays") Signed-off-by: Chen Ni <nichen@iscas.ac.cn> Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patch.msgid.link/20260311064652.2903449-1-nichen@iscas.ac.cn
1 parent 2f42c1a commit 5e77923

1 file changed

Lines changed: 31 additions & 15 deletions

File tree

drivers/gpu/drm/sysfb/efidrm.c

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
151151
struct drm_sysfb_device *sysfb;
152152
struct drm_device *dev;
153153
struct resource *mem = NULL;
154-
void __iomem *screen_base = NULL;
155154
struct drm_plane *primary_plane;
156155
struct drm_crtc *crtc;
157156
struct drm_encoder *encoder;
@@ -238,21 +237,38 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
238237

239238
mem_flags = efidrm_get_mem_flags(dev, res->start, vsize);
240239

241-
if (mem_flags & EFI_MEMORY_WC)
242-
screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem));
243-
else if (mem_flags & EFI_MEMORY_UC)
244-
screen_base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem));
245-
else if (mem_flags & EFI_MEMORY_WT)
246-
screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
247-
MEMREMAP_WT);
248-
else if (mem_flags & EFI_MEMORY_WB)
249-
screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem),
250-
MEMREMAP_WB);
251-
else
240+
if (mem_flags & EFI_MEMORY_WC) {
241+
void __iomem *screen_base = devm_ioremap_wc(&pdev->dev, mem->start,
242+
resource_size(mem));
243+
244+
if (!screen_base)
245+
return ERR_PTR(-ENXIO);
246+
iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
247+
} else if (mem_flags & EFI_MEMORY_UC) {
248+
void __iomem *screen_base = devm_ioremap(&pdev->dev, mem->start,
249+
resource_size(mem));
250+
251+
if (!screen_base)
252+
return ERR_PTR(-ENXIO);
253+
iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
254+
} else if (mem_flags & EFI_MEMORY_WT) {
255+
void *screen_base = devm_memremap(&pdev->dev, mem->start,
256+
resource_size(mem), MEMREMAP_WT);
257+
258+
if (IS_ERR(screen_base))
259+
return ERR_CAST(screen_base);
260+
iosys_map_set_vaddr(&sysfb->fb_addr, screen_base);
261+
} else if (mem_flags & EFI_MEMORY_WB) {
262+
void *screen_base = devm_memremap(&pdev->dev, mem->start,
263+
resource_size(mem), MEMREMAP_WB);
264+
265+
if (IS_ERR(screen_base))
266+
return ERR_CAST(screen_base);
267+
iosys_map_set_vaddr(&sysfb->fb_addr, screen_base);
268+
} else {
252269
drm_err(dev, "invalid mem_flags: 0x%llx\n", mem_flags);
253-
if (!screen_base)
254-
return ERR_PTR(-ENOMEM);
255-
iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base);
270+
return ERR_PTR(-EINVAL);
271+
}
256272

257273
/*
258274
* Modesetting

0 commit comments

Comments
 (0)