[Nouveau] Resource map sanity check fails after GRUB "keeps" the gfx mode
Pavel Roskin
proski at gnu.org
Thu Sep 26 15:37:43 PDT 2013
Hello!
I have spent some time on the issue. I'm not sure it's a nouveau bug.
I have a fix that changes arch/x86/kernel/sysfb_simplefb.c only.
GRUB actually uses graphic mode on my card. That mode is supported by
simplefb. However, the resource conflict happens regardless of whether
simplefb is enabled. It's sysfb_simplefb that causes it, a completely
different driver.
If GRUB keeps the graphic mode, I have this entry in /proc/iomem:
f1000000-f112bfff : BOOTFB
It is reserved by sysfb_simplefb. Nouveau tries to map an area at
0xf0000000-0xf1ffffff, so it includes the existing resource without
being equivalent to it.
Nouveau correctly calls remove_conflicting_framebuffers() before trying
to map that resource. However, sysfb_simplefb is not a real
framebuffer, so it doesn't free its resources.
iomem_map_sanity_check() doesn't check regions with IORESOURCE_BUSY
set. That's the comment from the code:
/*
* if a resource is "BUSY", it's not a hardware resource
* but a driver mapping of such a resource; we don't want
* to warn for those; some drivers legitimately map only
* partial hardware resources. (example: vesafb)
*/
So I added IORESOURCE_BUSY to sysfb_simplefb.c and the problem is fixed
now. Actually, it prevents nvidiafb from claiming the device:
nvidiafb 0000:01:00.0: BAR 3: can't reserve [mem 0xf0000000-0xf1ffffff
64bit pref]
But maybe that's the point of sysfb_simplefb? Anyway, here's the
patch/hack, signed off in case it's correct :)
sysfb_simplefb: mark BOOTFB resource as busy
From: Pavel Roskin <proski at gnu.org>
This fixes a warning when nouveau tries to allocate a larger iomem area:
resource map sanity check conflict: 0xf0000000 0xf1ffffff 0xf1000000
0xf112bfff BOOTFB
iomem_map_sanity_check() specifically excludes busy regions from
checking.
---
arch/x86/kernel/sysfb_simplefb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/kernel/sysfb_simplefb.c b/arch/x86/kernel/sysfb_simplefb.c
index 22513e9..b7bb615 100644
--- a/arch/x86/kernel/sysfb_simplefb.c
+++ b/arch/x86/kernel/sysfb_simplefb.c
@@ -79,7 +79,7 @@ __init int create_simplefb(const struct screen_info *si,
/* setup IORESOURCE_MEM as framebuffer memory */
memset(&res, 0, sizeof(res));
- res.flags = IORESOURCE_MEM;
+ res.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
res.name = simplefb_resname;
res.start = si->lfb_base;
res.end = si->lfb_base + len - 1;
--
Regards,
Pavel Roskin
More information about the Nouveau
mailing list