NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/57034: On UEFI-booted NetBSD/amd64, genfb(4) freezes when WSDISPLAYIO_MODE_EMUL is set



>Number:         57034
>Category:       kern
>Synopsis:       On UEFI-booted NetBSD/amd64, genfb(4) freezes when
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Sep 29 14:00:00 +0000 2022
>Originator:     Ryo ONODERA
>Release:        NetBSD 9.99.100
>Organization:
Ryo ONODERA // ryo%tetera.org@localhost
PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB  FD1B F404 27FA C7D1 15F3
>Environment:

System: NetBSD brownie 9.99.100 NetBSD 9.99.100 (DTRACE8) #8: Tue Sep 27
23:15:54 JST 2022
ryoon@brownie:/usr/world/9.99/amd64/obj/sys/arch/amd64/compile/DTRACE8 amd64
Architecture: x86_64
Machine: amd64
>Description:
On my Dell XPS 13 9300 (Intel Ice Lake internal GPU) and HP Envy 13-ay1052AU
laptops, genfb(4) freezes forever just after the following ioctl.

mode =  WSDISPLAYIO_MODE_EMUL;
ioctl(wd, WSDISPLAYIO_SMODE, &mode);

So xf86-video-wsfb from pkgsrc/x11/xf86-video-wsfb and mlterm-wscons from
pkgsrc/x11/mlterm cause blank screen after their exits.

Keyboard works fine even when screen is frozen.
You can reboot your machine with shutdown command.

The laptops have no BIOS/CSM boot mode. And I have no laptop with both of
BIOS/CSM and UEFI boots.

>How-To-Repeat:
Boot with genfb(4), for example 'disable i915drmkms' in kernel userconf is
specified, and run the following program. Your screen will get frozen.

=== === === === === === === === === === === === === === ===
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <dev/wscons/wsconsio.h>

#define WSDISPLAYDEV "/dev/ttyE0"

int
main(void)
{
	int mode;
	int wd;

	wd=open(WSDISPLAYDEV, O_RDWR);
	if(wd < 0)
	{
		printf("Cannot open wdsiaplay device: %s\n", strerror(errno));
	}
	mode =  WSDISPLAYIO_MODE_EMUL;
	if(ioctl(wd, WSDISPLAYIO_SMODE, &mode) == -1)
	{
		printf("Cannot change mode back to EMUL: %s\n",
strerror(errno))
;
	}

	close(wd);
}
=== === === === === === === === === === === === === === ===

>Fix:
For my laptops, the following patch for genfb_pci.c fixes the problem.
However I have no idea how to detect whether current boot is BIOS/CMS or UEFI
in genfb_pci.c.

Index: sys/dev/pci/genfb_pci.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/genfb_pci.c,v
retrieving revision 1.40
diff -u -r1.40 genfb_pci.c
--- sys/dev/pci/genfb_pci.c	7 Aug 2021 16:19:14 -0000	1.40
+++ sys/dev/pci/genfb_pci.c	27 Sep 2022 13:44:38 -0000
@@ -227,7 +227,9 @@
		return wsdisplayio_busid_pci(sc->sc_gen.sc_dev, sc->sc_pc,
		    sc->sc_pcitag, data);

-	case WSDISPLAYIO_SMODE: {
+	case WSDISPLAYIO_SMODE:
+#if 0
+		{
		int new_mode = *(int*)data, i;
		if (new_mode == WSDISPLAYIO_MODE_EMUL) {
			for (i = 0; i < 9; i++)
@@ -237,6 +239,7 @@
				     sc->sc_bars[i]);
		}
		}
+#endif
		return 0;
	}

>Unformatted:
 >WSDISPLAYIO_MODE_EMUL is set
 [ 4 more citation lines. Click/Enter to show. ]
 


Home | Main Index | Thread Index | Old Index