From nobody Wed Apr 8 01:18:01 2026 Received: from cstnet.cn (smtp25.cstnet.cn [159.226.251.25]) (using TLSv1.2 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5A8122A4E9 for ; Wed, 11 Mar 2026 06:48:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=159.226.251.25 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773211716; cv=none; b=W3hZjuOa8tfQI+tLfkYvnZRqq5rpUNBMzemXtviLfALVYOCOE3x3yL9eGoRuHDwncymoAcpbjtLGgHb/oEJAv5mOrKb8sWpgpFPNIl7TbjUbTR09Ty2mQsBzixPwL4fEtM+05CkhdYSYtTllRGkyRVJuFZQJ0NLV5sw1PBXeIPI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773211716; c=relaxed/simple; bh=RTImDiJttdTco8TQoMYw7vpHWAbdlOAwaT3dapNastM=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=Un29fi8/6f3N1eqDrohU6GbkGPgKjRNqMTGRH8lhMBVjkOQfsolG/B8gOLgt433/wPVMs2u414CNWb2ENV4e7fvZC0Ib0nhtRHn0D2YL03QRc5+I+MoGkeXqG7bjfJVujIkPkg9gELnN8ze7QaOL/FwFQT1W/fdglzdd4RBs5zY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn; spf=pass smtp.mailfrom=iscas.ac.cn; arc=none smtp.client-ip=159.226.251.25 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iscas.ac.cn Received: from localhost (unknown [124.16.138.129]) by APP-05 (Coremail) with SMTP id zQCowACXKQ01ELFpBkgjCg--.33642S2; Wed, 11 Mar 2026 14:48:21 +0800 (CST) From: Chen Ni To: tzimmermann@suse.de Cc: javierm@redhat.com, maarten.lankhorst@linux.intel.com, mripard@kernel.org, airlied@gmail.com, simona@ffwll.ch, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Chen Ni Subject: [PATCH v2] drm/sysfb: Fix efidrm error handling and memory type mismatch Date: Wed, 11 Mar 2026 14:46:52 +0800 Message-Id: <20260311064652.2903449-1-nichen@iscas.ac.cn> X-Mailer: git-send-email 2.25.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: zQCowACXKQ01ELFpBkgjCg--.33642S2 X-Coremail-Antispam: 1UD129KBjvJXoWxGrWrAry5ArWDWrW7Zr15XFb_yoW5uFW5pr 1fAFWSkr45JFsxXr4xAr1DuaySywn5KrW09Fy3uwnagr1fJryUZF4rCFyq9ryfJFWDC3y3 Xr13AayIyFyUCrJanT9S1TB71UUUUjUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBm14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4j 6F4UM28EF7xvwVC2z280aVAFwI0_Cr1j6rxdM28EF7xvwVC2z280aVCY1x0267AKxVW0oV Cq3wAaw2AFwI0_Jrv_JF1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE 5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r4UJVWxJr1lOx 8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIF xwCY1x0262kKe7AKxVWUtVW8ZwCY02Avz4vE14v_GF1l42xK82IYc2Ij64vIr41l4I8I3I 0E4IkC6x0Yz7v_Jr0_Gr1l4IxYO2xFxVAFwI0_Jrv_JF1lx2IqxVAqx4xG67AKxVWUJVWU GwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MIIYrxkI7VAKI4 8JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4U MIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I 8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfU0ID2UUUUU X-CM-SenderInfo: xqlfxv3q6l2u1dvotugofq/ Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Thomas Zimmermann --- 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(struc= t drm_driver *drv, struct drm_sysfb_device *sysfb; struct drm_device *dev; struct resource *mem =3D NULL; - void __iomem *screen_base =3D 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(str= uct drm_driver *drv, =20 mem_flags =3D efidrm_get_mem_flags(dev, res->start, vsize); =20 - if (mem_flags & EFI_MEMORY_WC) - screen_base =3D devm_ioremap_wc(&pdev->dev, mem->start, resource_size(me= m)); - else if (mem_flags & EFI_MEMORY_UC) - screen_base =3D devm_ioremap(&pdev->dev, mem->start, resource_size(mem)); - else if (mem_flags & EFI_MEMORY_WT) - screen_base =3D devm_memremap(&pdev->dev, mem->start, resource_size(mem), - MEMREMAP_WT); - else if (mem_flags & EFI_MEMORY_WB) - screen_base =3D devm_memremap(&pdev->dev, mem->start, resource_size(mem), - MEMREMAP_WB); - else + if (mem_flags & EFI_MEMORY_WC) { + void __iomem *screen_base =3D 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 =3D 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 =3D 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 =3D 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); + } =20 /* * Modesetting --=20 2.25.1