You are not logged in.
Hi
I need to patch every kernel with no framebuffer patch. Is there a solution in view?
I did a bug report on kernel.org but no impact still 3 months.
commit 07186778cf645cc79e6913a28dadf445cd3e2439
Author: Javier Martinez Canillas <javierm@redhat.com>
Date: Tue Jun 7 20:23:36 2022 +0200
fbdev: Disable sysfb device registration when removing conflicting FBs
[ Upstream commit ee7a69aa38d87a3bbced7b8245c732c05ed0c6ec ]
The platform devices registered by sysfb match with firmware-based DRM or
fbdev drivers, that are used to have early graphics using a framebuffer
provided by the system firmware.
DRM or fbdev drivers later are probed and remove conflicting framebuffers,
leading to these platform devices for generic drivers to be unregistered.
But the current solution has a race, since the sysfb_init() function could
be called after a DRM or fbdev driver is probed and request to unregister
the devices for drivers with conflicting framebuffes.
To prevent this, disable any future sysfb platform device registration by
calling sysfb_disable(), if a driver requests to remove the conflicting
framebuffers.
Suggested-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20220607182338.344270-4-javierm@redhat.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
diff --git b/drivers/video/fbdev/core/fbmem.c a/drivers/video/fbdev/core/fbmem.c
index 643383d74edc..85de02d0d3aa 100644
--- b/drivers/video/fbdev/core/fbmem.c
+++ a/drivers/video/fbdev/core/fbmem.c
@@ -19,7 +19,6 @@
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/slab.h>
-#include <linux/sysfb.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <linux/vt.h>
@@ -1788,17 +1787,6 @@ int remove_conflicting_framebuffers(struct apertures_struct *a,
do_free = true;
}
- /*
- * If a driver asked to unregister a platform device registered by
- * sysfb, then can be assumed that this is a driver for a display
- * that is set up by the system firmware and has a generic driver.
- *
- * Drivers for devices that don't have a generic driver will never
- * ask for this, so let's assume that a real driver for the display
- * was already probed and prevent sysfb to register devices later.
- */
- sysfb_disable();
-
mutex_lock(®istration_lock);
do_remove_conflicting_framebuffers(a, name, primary);
mutex_unlock(®istration_lock);
@logs @seth ?
Thx
Offline
Offline
Ok. I never ranted a Kernelcoder or Supplier. What can I for that a not so friendly person crash my thread on kernel.org?
I patch my kernel wit a nofb.patch so and It's working but is a lot of work!
So I ask you nicely what I can do to change the patch to mainline kernel or that fixing this issue?
Offline
For kernel.org you need to reproduce the issue using the current mainline or stable with an untainted kernel meaning no out of tree modules such as nvidia.
From the nvidia side there is https://github.com/NVIDIA/open-gpu-kern … s/pull/356 or https://github.com/NVIDIA/open-gpu-kern … s/pull/342
Offline
For kernel.org you need to reproduce the issue using the current mainline or stable with an untainted kernel meaning no out of tree modules such as nvidia.
From the nvidia side there is https://github.com/NVIDIA/open-gpu-kern … s/pull/356 or https://github.com/NVIDIA/open-gpu-kern … s/pull/342
Thanks for reply!
If I use nvidia-open-dkms-git (515.57.r0.g94eaea972-1)
or nvidia-open-git (515.57.r0.g94eaea972-1)
the patch is in it?
So I can use the stable kernel without no framebuffer patch and also doesn’t need a dkms version of the nvidia driver because I didn‘t need to build the kernel anymore.
Offline
No they are both pull requests so need to be added as additional patches. Extra issue they no longer apply cleanly due to other changes in the repo.
Try applying the patch below to https://aur.archlinux.org/pkgbase/nvidia-open-git then try either of the packages it produced.
diff --git a/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch b/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch
new file mode 100644
index 0000000..f9695d1
--- /dev/null
+++ b/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch
@@ -0,0 +1,57 @@
+diff --git a/kernel-open/Kbuild b/kernel-open/Kbuild
+index 42c14d686..ca08333da 100644
+--- a/kernel-open/Kbuild
++++ b/kernel-open/Kbuild
+@@ -229,6 +229,7 @@ NV_HEADER_PRESENCE_TESTS = \
+ drm/drm_ioctl.h \
+ drm/drm_device.h \
+ drm/drm_mode_config.h \
++ drm/drm_aperture.h \
+ dt-bindings/interconnect/tegra_icc_id.h \
+ generated/autoconf.h \
+ generated/compile.h \
+@@ -246,6 +247,7 @@ NV_HEADER_PRESENCE_TESTS = \
+ linux/sched/signal.h \
+ linux/sched/task.h \
+ linux/sched/task_stack.h \
++ linux/aperture.h \
+ xen/ioemu.h \
+ linux/fence.h \
+ linux/dma-resv.h \
+diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c
+index cf2080db3..b4abcb4dd 100644
+--- a/kernel-open/nvidia-drm/nvidia-drm-drv.c
++++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c
+@@ -84,6 +84,14 @@
+ #include <drm/drm_atomic_helper.h>
+ #endif
+
++#if defined(NV_DRM_DRM_AERTURE_H_PRESENT)
++#include <drm/drm_aperture.h>
++#endif
++
++#if defined(NV_LINUX_APERTURE_H_PRESENT)
++#include <linux/aperture.h>
++#endif
++
+ static struct nv_drm_device *dev_list = NULL;
+
+ #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE)
+@@ -941,6 +949,17 @@ static void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info)
+ NV_DRM_DEV_LOG_ERR(nv_dev, "Failed to register device");
+ goto failed_drm_register;
+ }
++/*
++ * Remove conflicting framebuffers, some framebuffers might interfere
++ * with the operation of nvidia-drm(eg. nouveau) so remove all that
++ * might.
++ */
++#if defined(NV_LINUX_APERTURE_H_PRESENT)
++ /* Linux 6.0-rc1 has this, the drm apreture func wraps this */
++ aperture_remove_conflicting_pci_devices(to_pci_dev(device), "nvidia-drm");
++#elif defined(NV_DRM_DRM_AERTURE_H_PRESENT)
++ drm_aperture_remove_conflicting_pci_framebuffers(to_pci_dev(device), dev);
++#endif
+
+ /* Add NVIDIA-DRM device into list */
+
diff --git a/PKGBUILD b/PKGBUILD
index 64879c0..85e6c99 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -2,7 +2,7 @@
pkgbase=nvidia-open-git
pkgname=('nvidia-open-git' 'nvidia-open-dkms-git')
-pkgver=515.57.r0.g94eaea972
+pkgver=515.76.r0.gfe0728787
pkgrel=1
pkgdesc='NVIDIA open GPU kernel modules (git version)'
arch=('x86_64')
@@ -14,18 +14,21 @@ source=('git+https://github.com/NVIDIA/open-gpu-kernel-modules.git'
'110-nvidia-open-change-dkms-conf.patch'
'120-nvidia-open-linux-rt-gift.patch'
'130-nvidia-open-reproducible-build.patch'
- '140-nvidia-open-gcc-ibt-sls.patch')
+ '140-nvidia-open-gcc-ibt-sls.patch'
+ '150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch')
sha256sums=('SKIP'
'009724e2e07b7be589ba455f225a9742d88a3a29383f2f220cb830ef4c8b7aea'
'b0f62a78f749ff3a104197c12b6d885352adcf35fb5ecf00c4cd4c51b4195e45'
'b7ac1ca4d72fc8392e6682df616d53ba4e9d4e761217ac6339d32c377990cf64'
- 'b9cb1715caa3431c32d9a1b11bda4dd10986747214a2a952a01da913433c421f')
+ 'b9cb1715caa3431c32d9a1b11bda4dd10986747214a2a952a01da913433c421f'
+ '03380ce49cd16fd60df389b7ed2906d8a0ee44b8b409ad5f774e0a987dd91b31')
prepare() {
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/110-nvidia-open-change-dkms-conf.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/120-nvidia-open-linux-rt-gift.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/130-nvidia-open-reproducible-build.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/140-nvidia-open-gcc-ibt-sls.patch"
+ patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch"
[ -d dkms-src ] && rm -rf dkms-src
cp -af open-gpu-kernel-modules/kernel-open dkms-src
Offline
If I make a file with name 150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch and a PKGBUILD.patch with content above it's says
The next patch would create the file 150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch,
which already exists! Skipping patch.
What I'm doing wrong?
# Maintainer : Daniel Bermond <dbermond@archlinux.org>
pkgbase=nvidia-open-git
pkgname=('nvidia-open-git' 'nvidia-open-dkms-git')
pkgver=515.76.r0.gfe0728787
pkgrel=1
pkgdesc='NVIDIA open GPU kernel modules (git version)'
arch=('x86_64')
url='https://github.com/NVIDIA/open-gpu-kernel-modules/'
license=('MIT' 'GPL2')
makedepends=('git' 'linux-headers')
options=('!buildflags' '!lto' '!strip')
source=('git+https://github.com/NVIDIA/open-gpu-kernel-modules.git'
'110-nvidia-open-change-dkms-conf.patch'
'120-nvidia-open-linux-rt-gift.patch'
'130-nvidia-open-reproducible-build.patch'
'140-nvidia-open-gcc-ibt-sls.patch'
'150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch')
sha256sums=('SKIP'
'009724e2e07b7be589ba455f225a9742d88a3a29383f2f220cb830ef4c8b7aea'
'b0f62a78f749ff3a104197c12b6d885352adcf35fb5ecf00c4cd4c51b4195e45'
'b7ac1ca4d72fc8392e6682df616d53ba4e9d4e761217ac6339d32c377990cf64'
'b9cb1715caa3431c32d9a1b11bda4dd10986747214a2a952a01da913433c421f'
'c70d46048a94d4635d65b92f833d976c28f66e5320965685e7c13ff1a7594855')
prepare() {
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/110-nvidia-open-change-dkms-conf.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/120-nvidia-open-linux-rt-gift.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/130-nvidia-open-reproducible-build.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/140-nvidia-open-gcc-ibt-sls.patch"
patch -d open-gpu-kernel-modules -Np1 -i "${srcdir}/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch"
[ -d dkms-src ] && rm -rf dkms-src
cp -af open-gpu-kernel-modules/kernel-open dkms-src
}
pkgver() {
git -C open-gpu-kernel-modules describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g;s/^v//'
}
build() {
sed -i "s/__VERSION_STRING/${pkgver}/" {open-gpu-kernel-modules/kernel-open,dkms-src}/dkms.conf
local -x KERNEL_UNAME
# allow usage of custom kernel and building in a chroot
if [ -d "/usr/lib/modules/$(uname -r)" ]
then
KERNEL_UNAME="$(uname -r)"
else
KERNEL_UNAME="$(find /usr/lib/modules -mindepth 1 -maxdepth 1 -type d | sed -n 's|.*/||;1p')"
fi
unset -v SYSSRC
make -C open-gpu-kernel-modules modules
}
package_nvidia-open-git() {
depends=('linux' "nvidia-utils=${pkgver/.r*/}" 'libglvnd')
provides=("nvidia-open=${pkgver}" 'NVIDIA-MODULE')
conflicts=('nvidia-open' 'NVIDIA-MODULE')
local _kernver
if [ -d "/usr/lib/modules/$(uname -r)" ]
then
_kernver="$(<"/usr/lib/modules/$(uname -r)/build/version")"
else
_kernver="$(find /usr/lib/modules -mindepth 1 -maxdepth 1 -type d | head -n1)"
_kernver="$(<"/usr/lib/modules/${_kernver##*/}/build/version")"
fi
install -D -m644 open-gpu-kernel-modules/kernel-open/*.ko -t "${pkgdir}/usr/lib/modules/${_kernver}/extramodules"
install -D -m644 open-gpu-kernel-modules/COPYING "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
find "$pkgdir" -name '*.ko' -exec strip --strip-debug {} +
find "$pkgdir" -name '*.ko' -exec xz -T1 {} +
install -D -m644 <(printf '%s\n' 'options nvidia NVreg_OpenRmEnableUnsupportedGpus=1') "${pkgdir}/usr/lib/modprobe.d/nvidia-open.conf"
}
package_nvidia-open-dkms-git() {
pkgdesc="$(sed 's/(\(git[[:space:]]version\)/(sources; \1/' <<< "$pkgdesc")"
depends=('dkms' "nvidia-utils=${pkgver/.r*/}" 'libglvnd')
provides=("nvidia-open=${pkgver}" 'NVIDIA-MODULE')
conflicts=('nvidia-open' 'NVIDIA-MODULE')
install -D -m644 open-gpu-kernel-modules/src/nvidia/_out/Linux_x86_64/nv-kernel.o \
dkms-src/nvidia/nv-kernel.o_binary
install -D -m644 open-gpu-kernel-modules/src/nvidia-modeset/_out/Linux_x86_64/nv-modeset-kernel.o \
dkms-src/nvidia-modeset/nv-modeset-kernel.o_binary
install -d -m755 "${pkgdir}/usr/src"
cp -dr --no-preserve='ownership' dkms-src "${pkgdir}/usr/src/nvidia-${pkgver}"
install -D -m644 open-gpu-kernel-modules/COPYING "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
install -D -m644 <(printf '%s\n' 'options nvidia NVreg_OpenRmEnableUnsupportedGpus=1') "${pkgdir}/usr/lib/modprobe.d/nvidia-open.conf"
}
sha256sums=('SKIP'
'009724e2e07b7be589ba455f225a9742d88a3a29383f2f220cb830ef4c8b7aea'
'b0f62a78f749ff3a104197c12b6d885352adcf35fb5ecf00c4cd4c51b4195e45'
'b7ac1ca4d72fc8392e6682df616d53ba4e9d4e761217ac6339d32c377990cf64'
'b9cb1715caa3431c32d9a1b11bda4dd10986747214a2a952a01da913433c421f'
'a887817c78fd8dcbcbb29f468d69707027c7b7cb79af8ca25b75f3b2d4a11a36')
My 150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch looks
diff --git a/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch b/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch
new file mode 100644
index 0000000..f9695d1
--- /dev/null
+++ b/150-nvidia-remove-drivers-trying-to-take-the-framebuffer.patch
@@ -0,0 +1,57 @@
+diff --git a/kernel-open/Kbuild b/kernel-open/Kbuild
+index 42c14d686..ca08333da 100644
+--- a/kernel-open/Kbuild
++++ b/kernel-open/Kbuild
+@@ -229,6 +229,7 @@ NV_HEADER_PRESENCE_TESTS = \
+ drm/drm_ioctl.h \
+ drm/drm_device.h \
+ drm/drm_mode_config.h \
++ drm/drm_aperture.h \
+ dt-bindings/interconnect/tegra_icc_id.h \
+ generated/autoconf.h \
+ generated/compile.h \
+@@ -246,6 +247,7 @@ NV_HEADER_PRESENCE_TESTS = \
+ linux/sched/signal.h \
+ linux/sched/task.h \
+ linux/sched/task_stack.h \
++ linux/aperture.h \
+ xen/ioemu.h \
+ linux/fence.h \
+ linux/dma-resv.h \
+diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c
+index cf2080db3..b4abcb4dd 100644
+--- a/kernel-open/nvidia-drm/nvidia-drm-drv.c
++++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c
+@@ -84,6 +84,14 @@
+ #include <drm/drm_atomic_helper.h>
+ #endif
+
++#if defined(NV_DRM_DRM_AERTURE_H_PRESENT)
++#include <drm/drm_aperture.h>
++#endif
++
++#if defined(NV_LINUX_APERTURE_H_PRESENT)
++#include <linux/aperture.h>
++#endif
++
+ static struct nv_drm_device *dev_list = NULL;
+
+ #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE)
+@@ -941,6 +949,17 @@ static void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info)
+ NV_DRM_DEV_LOG_ERR(nv_dev, "Failed to register device");
+ goto failed_drm_register;
+ }
++/*
++ * Remove conflicting framebuffers, some framebuffers might interfere
++ * with the operation of nvidia-drm(eg. nouveau) so remove all that
++ * might.
++ */
++#if defined(NV_LINUX_APERTURE_H_PRESENT)
++ /* Linux 6.0-rc1 has this, the drm apreture func wraps this */
++ aperture_remove_conflicting_pci_devices(to_pci_dev(device), "nvidia-drm");
++#elif defined(NV_DRM_DRM_AERTURE_H_PRESENT)
++ drm_aperture_remove_conflicting_pci_framebuffers(to_pci_dev(device), dev);
++#endif
+
+ /* Add NVIDIA-DRM device into list */
+
Offline
git clean -f #remove files not tracked by git
git reset --hard #undo any changes
curl -o PKGBUILD.diff http://ix.io/4br9 #get the diff from pastebin
git apply PKGBUILD.diff # apply the diff
makepkg -C # clean $srcdir then build package
Offline
Thanks Dude.
Offline
I have a question about nvidia-open-git driver. When I generate new initramfs ndvid nvidia_drm and nvidia_uvm modules are not found. Why?
Offline
Use nvidia-open-git-dkms instead of nvidia-open-git fix this issue!
Offline
Ok this patches doesn't fix my issue but worth to try
Last edited by Morta (2022-09-27 15:39:11)
Offline
Can you please report that on https://github.com/NVIDIA/open-gpu-kern … s/pull/356 so the author is made aware their fix is not working as expected.
Offline
Yes sir ;-) (I did it)
Offline
If I understand the cause of the issue correctly. Your system has two GPUs one integrated into the BMC and the discrete nividia GPU. The GPU for the BMC loads its framebuffer driver and that blocks the generic EFI framebuffer driver from being loaded which the nvidia driver would use. If you block the driver for the BMC does that then allow the generic FB to load on the nvidia GPU?
Offline
How can I block the BMC GPU? I believe would worth to try you idea
Offline
Blacklist "ast"
Use the kernel commandline https://wiki.archlinux.org/title/Kernel … and_line_2 and edit it at the bootloader.
If you write those changes onto the disk and the boot fails, you then won't have to fix it offline.
Online
Thx I know how but I didn’t know the name of the bmc kernel module
Offline
You are f*king magicians. Thx! It's boot properly! Next step is to fix this issue the https://bbs.archlinux.org/viewtopic.php?pid=2055230
Is there a way without edit config file and compile the kernel by self?
Offline
If you wanted the ast module back you could change the blacklist to something like
install ast /usr/bin/modprobe nvidia; /usr/bin/modprobe --ignore-install ast
Which would load the nvidia module first which would hopefully be enough to also avoid the issue.
Last edited by loqs (2022-09-28 16:30:46)
Offline
I don‘t need BMC (ast) and never used but thanks for the hint!
Offline
Is the BMC(ast) module the driver for all VGA ports?
I would to like to buy a PCIe Asus 4xM2 Nvme Card and remove the NVIDIA Graphic card...
I have also a PCI Port so I could buy a old PCI Graphic card but is this supported by the mainline kernel?
Offline
If I understand the cause of the issue correctly. Your system has two GPUs one integrated into the BMC and the discrete nividia GPU. The GPU for the BMC loads its framebuffer driver and that blocks the generic EFI framebuffer driver from being loaded which the nvidia driver would use.
Your problem is teh collision of the two GPUs - if you remove the nvidia one and un-blacklist ast, you should™ be able to just use the BMC.
I could buy a old PCI Graphic card but is this supported by the mainline kernel
That depends on the actual GPU, not the bus.
For nvidia PCI cards you'd certainly be left w/ nouveau, though.
Online
Ok. Thx for reply.
Offline