Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: 32ae90c66fb6 ("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

authored by

Chen Ni and committed by
Thomas Zimmermann
5e77923a 2f42c1a6

+31 -15
+31 -15
drivers/gpu/drm/sysfb/efidrm.c
··· 151 151 struct drm_sysfb_device *sysfb; 152 152 struct drm_device *dev; 153 153 struct resource *mem = NULL; 154 - void __iomem *screen_base = NULL; 155 154 struct drm_plane *primary_plane; 156 155 struct drm_crtc *crtc; 157 156 struct drm_encoder *encoder; ··· 237 238 238 239 mem_flags = efidrm_get_mem_flags(dev, res->start, vsize); 239 240 240 - if (mem_flags & EFI_MEMORY_WC) 241 - screen_base = devm_ioremap_wc(&pdev->dev, mem->start, resource_size(mem)); 242 - else if (mem_flags & EFI_MEMORY_UC) 243 - screen_base = devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); 244 - else if (mem_flags & EFI_MEMORY_WT) 245 - screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem), 246 - MEMREMAP_WT); 247 - else if (mem_flags & EFI_MEMORY_WB) 248 - screen_base = devm_memremap(&pdev->dev, mem->start, resource_size(mem), 249 - MEMREMAP_WB); 250 - else 241 + if (mem_flags & EFI_MEMORY_WC) { 242 + void __iomem *screen_base = devm_ioremap_wc(&pdev->dev, mem->start, 243 + resource_size(mem)); 244 + 245 + if (!screen_base) 246 + return ERR_PTR(-ENXIO); 247 + iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base); 248 + } else if (mem_flags & EFI_MEMORY_UC) { 249 + void __iomem *screen_base = devm_ioremap(&pdev->dev, mem->start, 250 + resource_size(mem)); 251 + 252 + if (!screen_base) 253 + return ERR_PTR(-ENXIO); 254 + iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base); 255 + } else if (mem_flags & EFI_MEMORY_WT) { 256 + void *screen_base = devm_memremap(&pdev->dev, mem->start, 257 + resource_size(mem), MEMREMAP_WT); 258 + 259 + if (IS_ERR(screen_base)) 260 + return ERR_CAST(screen_base); 261 + iosys_map_set_vaddr(&sysfb->fb_addr, screen_base); 262 + } else if (mem_flags & EFI_MEMORY_WB) { 263 + void *screen_base = devm_memremap(&pdev->dev, mem->start, 264 + resource_size(mem), MEMREMAP_WB); 265 + 266 + if (IS_ERR(screen_base)) 267 + return ERR_CAST(screen_base); 268 + iosys_map_set_vaddr(&sysfb->fb_addr, screen_base); 269 + } else { 251 270 drm_err(dev, "invalid mem_flags: 0x%llx\n", mem_flags); 252 - if (!screen_base) 253 - return ERR_PTR(-ENOMEM); 254 - iosys_map_set_vaddr_iomem(&sysfb->fb_addr, screen_base); 271 + return ERR_PTR(-EINVAL); 272 + } 255 273 256 274 /* 257 275 * Modesetting