Bug 98240 - Kernel module fails to load on HP Pavilion V3A33AV laptop.
Summary: Kernel module fails to load on HP Pavilion V3A33AV laptop.
Status: NEW
Alias: None
Product: xorg
Classification: Unclassified
Component: Driver/nouveau (show other bugs)
Version: unspecified
Hardware: x86-64 (AMD64) Linux (All)
: medium normal
Assignee: Nouveau Project
QA Contact: Xorg Project Team
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-10-13 23:02 UTC by Sergey Okhapkin
Modified: 2016-11-15 07:32 UTC (History)
2 users (show)

See Also:
i915 platform:
i915 features:


Attachments
acpidump output (1000.57 KB, text/plain)
2016-10-13 23:38 UTC, Sergey Okhapkin
no flags Details
_ROM method (2.55 KB, text/plain)
2016-10-14 01:33 UTC, Ilia Mirkin
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey Okhapkin 2016-10-13 23:02:35 UTC
The laptop has NVIDIA® GeForce® GTX 960M discrete chip at PCI:01:00.0

01:00.0 3D controller: NVIDIA Corporation GM107M [GeForce GTX 960M] (rev a2)

Using 4.8.1 kernel, here is dmesg of "modprobe nouveau debug=spam":

[ 4620.345670] ACPI Warning: \_SB.PCI0.GFX0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 4620.345756] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 4620.345862] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 4620.346999] pci 0000:01:00.0: optimus capabilities: enabled, status dynamic power, 
[ 4620.347006] VGA switcheroo: detected Optimus DSM method \_SB_.PCI0.PEG0.PEGP handle
[ 4620.347007] nouveau: detected PR support, will not use DSM
[ 4620.347890] nouveau 0000:01:00.0: NVIDIA GM107 (1171b0a2)
[ 4620.347968] nouveau 0000:01:00.0: pci: MSI enabled
[ 4620.347973] nouveau 0000:01:00.0: bios: trying PRAMIN...
[ 4620.347986] nouveau 0000:01:00.0: bios: ... not enabled
[ 4620.347989] nouveau 0000:01:00.0: bios: trying PROM...
[ 4620.353937] nouveau 0000:01:00.0: bios: 00000000: ROM signature (0000) unknown
[ 4620.353939] nouveau 0000:01:00.0: bios: image 0 invalid
[ 4620.353946] nouveau 0000:01:00.0: bios: scored 0
[ 4620.353947] nouveau 0000:01:00.0: bios: trying ACPI...
[ 4620.354437] nouveau 0000:01:00.0: bios: 00000000: type 00, 65536 bytes
[ 4620.354784] nouveau 0000:01:00.0: bios: 00000000: checksum failed
[ 4620.355094] nouveau 0000:01:00.0: bios: 00010000: type e0, 37376 bytes
[ 4620.355513] nouveau 0000:01:00.0: bios: 00019200: ROM signature (0000) unknown
[ 4620.355513] nouveau 0000:01:00.0: bios: image 2 invalid
[ 4620.355514] nouveau 0000:01:00.0: bios: scored 6
[ 4620.355515] nouveau 0000:01:00.0: bios: using image from ACPI
[ 4620.355588] nouveau 0000:01:00.0: bios: BIT signature found
[ 4620.355589] nouveau 0000:01:00.0: bios: version 82.07.9b.00.69
[ 4620.355592] nouveau 0000:01:00.0: bios: DCB contains no useful data
[ 4620.355592] nouveau 0000:01:00.0: bios: DCB contains no useful data
[ 4620.355593] nouveau 0000:01:00.0: mxm: no VBIOS data, nothing to do
[ 4620.355603] nouveau 0000:01:00.0: bios: DCB contains no useful data
[ 4620.355995] nouveau: DRM:00000000:00000000: ioctl: size 32
[ 4620.355996] nouveau: DRM:00000000:00000000: ioctl: vers 0 type 00 object 0000000000000000 owner 00
[ 4620.355997] nouveau: DRM:00000000:00000000: ioctl: nop size 8
[ 4620.355997] nouveau: DRM:00000000:00000000: ioctl: nop vers 0
[ 4620.355998] nouveau: DRM:00000000:00000000: ioctl: return 0
[ 4620.356001] nouveau: DRM:00000000:00000000: ioctl: size 72
[ 4620.356002] nouveau: DRM:00000000:00000000: ioctl: vers 0 type 02 object 0000000000000000 owner ff
[ 4620.356002] nouveau: DRM:00000000:00000000: ioctl: new size 48
[ 4620.356003] nouveau: DRM:00000000:00000000: ioctl: new vers 0 handle 00000000 class 00000080 route 00 token ffff8802591e50d8 object ffff8802591e50d8
[ 4620.356004] nouveau: DRM:00000000:00000000: ioctl: create device size 16
[ 4620.356004] nouveau: DRM:00000000:00000000: ioctl: create device v0 device ffffffffffffffff
[ 4620.356005] nouveau: DRM:00000000:00000080: init running...
[ 4620.356006] nouveau 0000:01:00.0: preinit running...
[ 4620.356006] nouveau 0000:01:00.0: pci: preinit running...
[ 4620.356007] nouveau 0000:01:00.0: pci: preinit completed in 0us
[ 4620.356008] nouveau 0000:01:00.0: bios: preinit running...
[ 4620.356008] nouveau 0000:01:00.0: bios: preinit completed in 0us
[ 4620.356009] nouveau 0000:01:00.0: devinit: preinit running...
[ 4620.356024] nouveau 0000:01:00.0: devinit: preinit completed in 14us
[ 4620.356024] nouveau 0000:01:00.0: top: preinit running...
[ 4620.356025] nouveau 0000:01:00.0: top: preinit completed in 0us
[ 4620.356025] nouveau 0000:01:00.0: priv: preinit running...
[ 4620.356058] nouveau 0000:01:00.0: priv: preinit completed in 33us
[ 4620.356059] nouveau 0000:01:00.0: gpio: preinit running...
[ 4620.356060] nouveau 0000:01:00.0: gpio: preinit completed in 0us
[ 4620.356060] nouveau 0000:01:00.0: i2c: preinit running...
[ 4620.356061] nouveau 0000:01:00.0: i2c: preinit completed in 0us
[ 4620.356061] nouveau 0000:01:00.0: fuse: preinit running...
[ 4620.356062] nouveau 0000:01:00.0: fuse: preinit completed in 0us
[ 4620.356062] nouveau 0000:01:00.0: mxm: preinit running...
[ 4620.356063] nouveau 0000:01:00.0: mxm: preinit completed in 1us
[ 4620.356063] nouveau 0000:01:00.0: mc: preinit running...
[ 4620.356064] nouveau 0000:01:00.0: mc: preinit completed in 0us
[ 4620.356064] nouveau 0000:01:00.0: bus: preinit running...
[ 4620.356065] nouveau 0000:01:00.0: bus: preinit completed in 0us
[ 4620.356065] nouveau 0000:01:00.0: tmr: preinit running...
[ 4620.356066] nouveau 0000:01:00.0: tmr: preinit completed in 0us
[ 4620.356066] nouveau 0000:01:00.0: imem: preinit running...
[ 4620.356067] nouveau 0000:01:00.0: imem: preinit completed in 0us
[ 4620.356067] nouveau 0000:01:00.0: fb: preinit running...
[ 4620.356068] nouveau 0000:01:00.0: fb: preinit completed in 0us
[ 4620.356069] nouveau 0000:01:00.0: ltc: preinit running...
[ 4620.356069] nouveau 0000:01:00.0: ltc: preinit completed in 0us
[ 4620.356070] nouveau 0000:01:00.0: mmu: preinit running...
[ 4620.356070] nouveau 0000:01:00.0: mmu: preinit completed in 0us
[ 4620.356071] nouveau 0000:01:00.0: bar: preinit running...
[ 4620.356071] nouveau 0000:01:00.0: bar: preinit completed in 0us
[ 4620.356072] nouveau 0000:01:00.0: pmu: preinit running...
[ 4620.356072] nouveau 0000:01:00.0: pmu: preinit completed in 0us
[ 4620.356073] nouveau 0000:01:00.0: iccsense: preinit running...
[ 4620.356073] nouveau 0000:01:00.0: iccsense: preinit completed in 0us
[ 4620.356074] nouveau 0000:01:00.0: therm: preinit running...
[ 4620.356074] nouveau 0000:01:00.0: therm: preinit completed in 0us
[ 4620.356075] nouveau 0000:01:00.0: clk: preinit running...
[ 4620.356075] nouveau 0000:01:00.0: clk: preinit completed in 0us
[ 4620.356076] nouveau 0000:01:00.0: ce0: preinit running...
[ 4620.356077] nouveau 0000:01:00.0: ce0: preinit completed in 0us
[ 4620.356077] nouveau 0000:01:00.0: ce2: preinit running...
[ 4620.356078] nouveau 0000:01:00.0: ce2: preinit completed in 0us
[ 4620.356078] nouveau 0000:01:00.0: disp: preinit running...
[ 4620.356079] nouveau 0000:01:00.0: disp: preinit completed in 0us
[ 4620.356079] nouveau 0000:01:00.0: dma: preinit running...
[ 4620.356080] nouveau 0000:01:00.0: dma: preinit completed in 0us
[ 4620.356080] nouveau 0000:01:00.0: fifo: preinit running...
[ 4620.356081] nouveau 0000:01:00.0: fifo: preinit completed in 0us
[ 4620.356081] nouveau 0000:01:00.0: gr: preinit running...
[ 4620.356082] nouveau 0000:01:00.0: gr: preinit completed in 0us
[ 4620.356083] nouveau 0000:01:00.0: sw: preinit running...
[ 4620.356083] nouveau 0000:01:00.0: sw: preinit completed in 0us
[ 4620.356097] nouveau 0000:01:00.0: devinit: running init tables
[ 4620.356099] nouveau 0000:01:00.0: devinit: 0xf152[0]: unknown opcode 0x00
[ 4620.356109] nouveau 0000:01:00.0: preinit failed with -22
[ 4620.356109] nouveau: DRM:00000000:00000080: init failed with -22                                                          
[ 4620.356110] nouveau: DRM:00000000:00000080: fini children...
[ 4620.356110] nouveau: DRM:00000000:00000080: fini running...
[ 4620.356111] nouveau: DRM:00000000:00000080: fini completed in 0us
[ 4620.356111] nouveau: DRM:00000000:00000080: destroy children...
[ 4620.356111] nouveau: DRM:00000000:00000080: destroy running...
[ 4620.356112] nouveau: DRM:00000000:00000080: destroy completed in 1us...
[ 4620.356112] nouveau: DRM:00000000:00000000: ioctl: return -22
[ 4620.356113] nouveau: DRM:00000000:00000000: fini notify
[ 4620.356114] nouveau: DRM:00000000:00000000: fini children...
[ 4620.356114] nouveau: DRM:00000000:00000000: fini running...
[ 4620.356115] nouveau: DRM:00000000:00000000: fini completed in 0us
[ 4620.356115] nouveau: DRM:00000000:00000000: destroy children...
[ 4620.356115] nouveau: DRM:00000000:00000000: destroy running...
[ 4620.356116] nouveau: DRM:00000000:00000000: destroy completed in 1us...
[ 4620.356264] nouveau 0000:01:00.0: sw: destroy running...
[ 4620.356265] nouveau 0000:01:00.0: sw: destroy completed in 1us
[ 4620.356267] nouveau 0000:01:00.0: gr: destroy running...
[ 4620.356268] nouveau 0000:01:00.0: gr: destroy completed in 0us
[ 4620.356269] nouveau 0000:01:00.0: fifo: destroy running...
[ 4620.356270] nouveau 0000:01:00.0: fifo: destroy completed in 1us
[ 4620.356271] nouveau 0000:01:00.0: dma: destroy running...
[ 4620.356272] nouveau 0000:01:00.0: dma: destroy completed in 0us
[ 4620.356273] nouveau 0000:01:00.0: disp: destroy running...
[ 4620.356274] nouveau 0000:01:00.0: disp: destroy completed in 1us
[ 4620.356275] nouveau 0000:01:00.0: ce2: destroy running...
[ 4620.356276] nouveau 0000:01:00.0: ce2: destroy completed in 0us
[ 4620.356277] nouveau 0000:01:00.0: ce0: destroy running...
[ 4620.356277] nouveau 0000:01:00.0: ce0: destroy completed in 0us
[ 4620.356278] nouveau 0000:01:00.0: clk: destroy running...
[ 4620.356279] nouveau 0000:01:00.0: clk: destroy completed in 0us
[ 4620.356280] nouveau 0000:01:00.0: therm: destroy running...
[ 4620.356281] nouveau 0000:01:00.0: therm: destroy completed in 0us
[ 4620.356282] nouveau 0000:01:00.0: iccsense: destroy running...
[ 4620.356283] nouveau 0000:01:00.0: iccsense: destroy completed in 0us
[ 4620.356284] nouveau 0000:01:00.0: pmu: destroy running...
[ 4620.356285] nouveau 0000:01:00.0: pmu: destroy completed in 0us
[ 4620.356285] nouveau 0000:01:00.0: bar: destroy running...
[ 4620.356286] nouveau 0000:01:00.0: bar: destroy completed in 0us
[ 4620.356287] nouveau 0000:01:00.0: mmu: destroy running...
[ 4620.356288] nouveau 0000:01:00.0: mmu: destroy completed in 0us
[ 4620.356289] nouveau 0000:01:00.0: ltc: destroy running...
[ 4620.356290] nouveau 0000:01:00.0: ltc: destroy completed in 1us
[ 4620.356291] nouveau 0000:01:00.0: fb: destroy running...
[ 4620.356293] nouveau 0000:01:00.0: fb: destroy completed in 2us
[ 4620.356294] nouveau 0000:01:00.0: imem: destroy running...
[ 4620.356295] nouveau 0000:01:00.0: imem: destroy completed in 0us
[ 4620.356295] nouveau 0000:01:00.0: tmr: destroy running...
[ 4620.356296] nouveau 0000:01:00.0: tmr: destroy completed in 0us
[ 4620.356297] nouveau 0000:01:00.0: bus: destroy running...
[ 4620.356298] nouveau 0000:01:00.0: bus: destroy completed in 0us
[ 4620.356299] nouveau 0000:01:00.0: mc: destroy running...
[ 4620.356299] nouveau 0000:01:00.0: mc: destroy completed in 0us
[ 4620.356300] nouveau 0000:01:00.0: mxm: destroy running...
[ 4620.356301] nouveau 0000:01:00.0: mxm: destroy completed in 0us
[ 4620.356302] nouveau 0000:01:00.0: fuse: destroy running...
[ 4620.356303] nouveau 0000:01:00.0: fuse: destroy completed in 0us
[ 4620.356304] nouveau 0000:01:00.0: i2c: destroy running...
[ 4620.356305] nouveau 0000:01:00.0: i2c: destroy completed in 0us
[ 4620.356305] nouveau 0000:01:00.0: gpio: destroy running...
[ 4620.356306] nouveau 0000:01:00.0: gpio: destroy completed in 0us
[ 4620.356307] nouveau 0000:01:00.0: priv: destroy running...
[ 4620.356308] nouveau 0000:01:00.0: priv: destroy completed in 0us
[ 4620.356309] nouveau 0000:01:00.0: top: destroy running...
[ 4620.356309] nouveau 0000:01:00.0: top: destroy completed in 0us
[ 4620.356310] nouveau 0000:01:00.0: devinit: destroy running...
[ 4620.356321] nouveau 0000:01:00.0: devinit: destroy completed in 9us
[ 4620.356322] nouveau 0000:01:00.0: bios: destroy running...
[ 4620.356323] nouveau 0000:01:00.0: bios: destroy completed in 1us
[ 4620.356324] nouveau 0000:01:00.0: pci: destroy running...
[ 4620.356332] nouveau 0000:01:00.0: pci: destroy completed in 7us
[ 4620.356480] nouveau: probe of 0000:01:00.0 failed with error -22
Comment 1 Ilia Mirkin 2016-10-13 23:17:56 UTC
Looks like we process your vbios incorrectly. Please attach an acpidump.
Comment 2 Sergey Okhapkin 2016-10-13 23:38:26 UTC
Created attachment 127287 [details]
acpidump output

acpidump attached
Comment 3 Ilia Mirkin 2016-10-14 01:33:55 UTC
Created attachment 127289 [details]
_ROM method

Interesting, so it looks like

(a) the _ROM method only returns 0x1000 chunks at a time
(b) stores the VBIOS in 8 32K chunks (the chunks themselves do not appear to be in the ACPI data dump)

I wonder if this is running up against our "fast" ACPI method reading logic again.

Can you try to edit drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c and comment out (or remove) the line

"{ 0, &nvbios_acpi_fast },"

And see if that helps?
Comment 4 Sergey Okhapkin 2016-10-14 02:06:27 UTC
The patch works:

[ 1175.989212] ACPI Warning: \_SB.PCI0.GFX0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 1175.989299] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 1175.989407] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 1175.990458] pci 0000:01:00.0: optimus capabilities: enabled, status dynamic power, 
[ 1175.990465] VGA switcheroo: detected Optimus DSM method \_SB_.PCI0.PEG0.PEGP handle
[ 1175.990466] nouveau: detected PR support, will not use DSM
[ 1175.990559] nouveau 0000:01:00.0: NVIDIA GM107 (1171b0a2)
[ 1176.003295] nouveau 0000:01:00.0: bios: version 82.07.9b.00.69
[ 1176.004237] nouveau 0000:01:00.0: fb: 2048 MiB GDDR5
[ 1176.666189] vga_switcheroo: enabled
[ 1176.666415] [TTM] Zone  kernel: Available graphics memory: 4032186 kiB
[ 1176.666435] [TTM] Zone   dma32: Available graphics memory: 2097152 kiB
[ 1176.666435] [TTM] Initializing pool allocator
[ 1176.666438] [TTM] Initializing DMA pool allocator
[ 1176.666444] nouveau 0000:01:00.0: DRM: VRAM: 2048 MiB
[ 1176.666445] nouveau 0000:01:00.0: DRM: GART: 1048576 MiB
[ 1176.666447] nouveau 0000:01:00.0: DRM: TMDS table version 2.0
[ 1176.666448] nouveau 0000:01:00.0: DRM: DCB version 4.0
[ 1176.666449] nouveau 0000:01:00.0: DRM: DCB outp 00: 08000f82 00020030
[ 1176.666450] nouveau 0000:01:00.0: DRM: DCB conn 00: 01000061
[ 1176.666474] nouveau 0000:01:00.0: DRM: BIOS FP mode: 1024x768 (65000kHz pixel clock)
[ 1176.683565] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 1176.683566] [drm] Driver supports precise vblank timestamp query.
[ 1176.817465] nouveau 0000:01:00.0: DRM: MM: using COPY for buffer copies
[ 1176.817469] [drm] Initialized nouveau 1.3.1 20120801 for 0000:01:00.0 on minor 1
[ 1182.560206] nouveau 0000:01:00.0: DRM: suspending console...
[ 1182.560207] nouveau 0000:01:00.0: DRM: suspending display...
[ 1182.560213] nouveau 0000:01:00.0: DRM: evicting buffers...
[ 1182.560214] nouveau 0000:01:00.0: DRM: waiting for kernel channels to go idle...
[ 1182.560228] nouveau 0000:01:00.0: DRM: suspending client object trees...
[ 1182.563009] nouveau 0000:01:00.0: DRM: suspending kernel object tree...
Comment 5 Sergey Okhapkin 2016-10-14 02:26:16 UTC
Xorg driver (xf86-video-nouveau-1.0.12) fails:

[  1596.906] (II) NOUVEAU driver
[  1596.906] (II) NOUVEAU driver for NVIDIA chipset families :
[  1596.906]    RIVA TNT        (NV04)
[  1596.906]    RIVA TNT2       (NV05)
[  1596.906]    GeForce 256     (NV10)
[  1596.906]    GeForce 2       (NV11, NV15)
[  1596.906]    GeForce 4MX     (NV17, NV18)
[  1596.906]    GeForce 3       (NV20)
[  1596.906]    GeForce 4Ti     (NV25, NV28)
[  1596.906]    GeForce FX      (NV3x)
[  1596.906]    GeForce 6       (NV4x)
[  1596.906]    GeForce 7       (G7x)
[  1596.906]    GeForce 8       (G8x)
[  1596.906]    GeForce GTX 200 (NVA0)
[  1596.906]    GeForce GTX 400 (NVC0)
[  1596.906] (II) modesetting: Driver for Modesetting Kernel Drivers: kms
[  1596.906] (++) using VT number 7

[  1596.907] (II) intel(0): Using Kernel Mode Setting driver: i915, version 1.6.0 20160711
[  1596.907] (II) [drm] nouveau interface version: 1.3.1
[  1596.907] (EE) Unknown chipset: NV117
Comment 6 Ilia Mirkin 2016-10-14 02:27:55 UTC
I'm looking over the fast logic and it seems like it should have worked. This debug patch should provide more info on what's going wrong. Mind reinstating the line in shadowacpi.c and applying the below?


diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
--- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
+++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
@@ -423,7 +423,9 @@ bool nouveau_acpi_rom_supported(struct device *dev)
 
 int nouveau_acpi_get_bios_chunk(uint8_t *bios, int offset, int len)
 {
-       return nouveau_rom_call(nouveau_dsm_priv.rom_handle, bios, offset, len);
+       int ret = nouveau_rom_call(nouveau_dsm_priv.rom_handle, bios, offset, len);
+       printk(KERN_INFO "retrieving _ROM off: 0x%x, len: 0x%x, ret: 0x%x", offset, len, ret);
+       return ret;
 }
 
 void *
Comment 7 Ilia Mirkin 2016-10-14 02:28:45 UTC
(In reply to Sergey Okhapkin from comment #5)
> Xorg driver (xf86-video-nouveau-1.0.12) fails:
> [  1596.907] (EE) Unknown chipset: NV117

That's expected. You can use the modesetting DDX if you have screens hanging off the NVIDIA gpu. Otherwise I recommend enabling DRI3 and using that for offloading.
Comment 8 Sergey Okhapkin 2016-10-14 02:31:47 UTC
Should I uncomment in shadow.c first?

"{ 0, &nvbios_acpi_fast },"
Comment 9 Ilia Mirkin 2016-10-14 02:32:26 UTC
(In reply to Sergey Okhapkin from comment #8)
> Should I uncomment in shadow.c first?
> 
> "{ 0, &nvbios_acpi_fast },"

Please do, yes.
Comment 10 Ilia Mirkin 2016-10-14 02:33:31 UTC
(In reply to Ilia Mirkin from comment #6)
> I'm looking over the fast logic and it seems like it should have worked.
> This debug patch should provide more info on what's going wrong. Mind
> reinstating the line in shadowacpi.c and applying the below?
> 
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c
> b/drivers/gpu/drm/nouveau/nouveau_acpi.c
> --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
> @@ -423,7 +423,9 @@ bool nouveau_acpi_rom_supported(struct device *dev)
>  
>  int nouveau_acpi_get_bios_chunk(uint8_t *bios, int offset, int len)
>  {
> -       return nouveau_rom_call(nouveau_dsm_priv.rom_handle, bios, offset,
> len);
> +       int ret = nouveau_rom_call(nouveau_dsm_priv.rom_handle, bios,
> offset, len);
> +       printk(KERN_INFO "retrieving _ROM off: 0x%x, len: 0x%x, ret: 0x%x",
> offset, len, ret);

Er, that should probably have a \n at the end of the string. My bad.

> +       return ret;
>  }
>  
>  void *
Comment 11 Sergey Okhapkin 2016-10-14 02:39:39 UTC
[ 3234.532656] ACPI Warning: \_SB.PCI0.GFX0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 3234.532743] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 3234.532849] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[ 3234.533890] pci 0000:01:00.0: optimus capabilities: enabled, status dynamic power, 
[ 3234.533897] VGA switcheroo: detected Optimus DSM method \_SB_.PCI0.PEG0.PEGP handle
[ 3234.533898] nouveau: detected PR support, will not use DSM
[ 3234.534005] nouveau 0000:01:00.0: NVIDIA GM107 (1171b0a2)
[ 3234.538042] retrieving _ROM off: 0x0, len: 0x1000, ret: 0x1000
[ 3234.539278] retrieving _ROM off: 0x1000, len: 0xf000, ret: 0xf000
[ 3234.539616] retrieving _ROM off: 0x10000, len: 0x1000, ret: 0x1000
[ 3234.539953] retrieving _ROM off: 0x11000, len: 0xa000, ret: 0xa000
[ 3234.540028] nouveau 0000:01:00.0: bios: version 82.07.9b.00.69
[ 3234.540294] nouveau 0000:01:00.0: devinit: 0xf152[ ]: unknown opcode 0x00
[ 3234.540315] nouveau 0000:01:00.0: preinit failed with -22
[ 3234.540316] nouveau: DRM:00000000:00000080: init failed with -22
[ 3234.540472] nouveau: probe of 0000:01:00.0 failed with error -22
Comment 12 Ilia Mirkin 2016-10-14 02:58:19 UTC
(In reply to Sergey Okhapkin from comment #11)
> [ 3234.532656] ACPI Warning: \_SB.PCI0.GFX0._DSM: Argument #4 type mismatch
> - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
> [ 3234.532743] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type
> mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
> [ 3234.532849] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type
> mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
> [ 3234.533890] pci 0000:01:00.0: optimus capabilities: enabled, status
> dynamic power, 
> [ 3234.533897] VGA switcheroo: detected Optimus DSM method
> \_SB_.PCI0.PEG0.PEGP handle
> [ 3234.533898] nouveau: detected PR support, will not use DSM
> [ 3234.534005] nouveau 0000:01:00.0: NVIDIA GM107 (1171b0a2)
> [ 3234.538042] retrieving _ROM off: 0x0, len: 0x1000, ret: 0x1000
> [ 3234.539278] retrieving _ROM off: 0x1000, len: 0xf000, ret: 0xf000

Grrr. Well, that's the issue. It only returns 0x1000 worth of data, but claims to return a buffer sized to 0xf000. And I think I see why:

            Name (VROM, Buffer (Local1)
            {
                 0x00                                             /* . */
            })

Which allocates the VROM buffer to be 0xf000 sized. At the end, that buffer is filled with

            Mid (Local5, Local0, Local1, VROM) /* \_SB_.PCI0.PEG0.PEGP._ROM.VROM */
            Return (VROM) /* \_SB_.PCI0.PEG0.PEGP._ROM.VROM */

However I suspect that Mid() doesn't actually *replace* the object. And this is what acpi_ex_store_buffer_to_buffer() does on Linux - as long as less data is stored, the length of the object appears untouched.

So ... given this implementation, I'm not sure how we can reliably skip the "fast" ACPI read. Ben, thoughts?
Comment 13 Ben Skeggs 2016-10-14 03:17:30 UTC
Give this (completely untested) patch a try:

https://github.com/skeggsb/nouveau/commit/0e7660d0dd8e4758f1da402fc24dd8d77c39d716
Comment 14 Sergey Okhapkin 2016-10-14 14:00:49 UTC
Seems working.

[  637.158783] ACPI Warning: \_SB.PCI0.GFX0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[  637.158870] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[  637.158978] ACPI Warning: \_SB.PCI0.PEG0.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20160422/nsarguments-95)
[  637.160088] pci 0000:01:00.0: optimus capabilities: enabled, status dynamic power, 
[  637.160095] VGA switcheroo: detected Optimus DSM method \_SB_.PCI0.PEG0.PEGP handle
[  637.160096] nouveau: detected PR support, will not use DSM
[  637.160955] nouveau 0000:01:00.0: NVIDIA GM107 (1171b0a2)
[  637.167300] retrieving _ROM off: 0x0, len: 0x1000, ret: 0x1000
[  637.167614] retrieving _ROM off: 0x1000, len: 0xf000, ret: 0xf000
[  637.167941] retrieving _ROM off: 0x0, len: 0x1000, ret: 0x1000
[  637.168326] retrieving _ROM off: 0x1000, len: 0x1000, ret: 0x1000
[  637.168643] retrieving _ROM off: 0x2000, len: 0x1000, ret: 0x1000
[  637.168948] retrieving _ROM off: 0x3000, len: 0x1000, ret: 0x1000
[  637.169330] retrieving _ROM off: 0x4000, len: 0x1000, ret: 0x1000
[  637.169647] retrieving _ROM off: 0x5000, len: 0x1000, ret: 0x1000
[  637.169949] retrieving _ROM off: 0x6000, len: 0x1000, ret: 0x1000
[  637.170388] retrieving _ROM off: 0x7000, len: 0x1000, ret: 0x1000
[  637.170691] retrieving _ROM off: 0x8000, len: 0x1000, ret: 0x1000
[  637.170993] retrieving _ROM off: 0x9000, len: 0x1000, ret: 0x1000
[  637.171398] retrieving _ROM off: 0xa000, len: 0x1000, ret: 0x1000
[  637.171734] retrieving _ROM off: 0xb000, len: 0x1000, ret: 0x1000
[  637.172065] retrieving _ROM off: 0xc000, len: 0x1000, ret: 0x1000
[  637.172461] retrieving _ROM off: 0xd000, len: 0x1000, ret: 0x1000
[  637.172789] retrieving _ROM off: 0xe000, len: 0x1000, ret: 0x1000
[  637.173106] retrieving _ROM off: 0xf000, len: 0x1000, ret: 0x1000
[  637.173559] retrieving _ROM off: 0x10000, len: 0x1000, ret: 0x1000
[  637.173900] retrieving _ROM off: 0x11000, len: 0x1000, ret: 0x1000
[  637.174403] retrieving _ROM off: 0x12000, len: 0x1000, ret: 0x1000
[  637.174739] retrieving _ROM off: 0x13000, len: 0x1000, ret: 0x1000
[  637.175070] retrieving _ROM off: 0x14000, len: 0x1000, ret: 0x1000
[  637.175514] retrieving _ROM off: 0x15000, len: 0x1000, ret: 0x1000
[  637.175841] retrieving _ROM off: 0x16000, len: 0x1000, ret: 0x1000
[  637.176169] retrieving _ROM off: 0x17000, len: 0x1000, ret: 0x1000
[  637.176580] retrieving _ROM off: 0x18000, len: 0x1000, ret: 0x1000
[  637.176908] retrieving _ROM off: 0x19000, len: 0x1000, ret: 0x1000
[  637.176921] retrieving _ROM off: 0x1a000, len: 0x1000, ret: 0x1000
[  637.177021] nouveau 0000:01:00.0: bios: version 82.07.9b.00.69
[  637.323115] nouveau 0000:01:00.0: fb: 2048 MiB GDDR5
[  637.323120] nouveau 0000:01:00.0: priv: HUB0: 614900 00800000 (1c408200)
[  637.987352] vga_switcheroo: enabled
[  637.987641] [TTM] Zone  kernel: Available graphics memory: 4032186 kiB
[  637.987642] [TTM] Zone   dma32: Available graphics memory: 2097152 kiB
[  637.987643] [TTM] Initializing pool allocator
[  637.987647] [TTM] Initializing DMA pool allocator
[  637.987659] nouveau 0000:01:00.0: DRM: VRAM: 2048 MiB
[  637.987661] nouveau 0000:01:00.0: DRM: GART: 1048576 MiB
[  637.987664] nouveau 0000:01:00.0: DRM: TMDS table version 2.0
[  637.987666] nouveau 0000:01:00.0: DRM: DCB version 4.0
[  637.987668] nouveau 0000:01:00.0: DRM: DCB outp 00: 08000f82 00020030
[  637.987669] nouveau 0000:01:00.0: DRM: DCB conn 00: 01000061
[  637.987674] nouveau 0000:01:00.0: DRM: BIOS FP mode: 1024x768 (65000kHz pixel clock)
[  638.016774] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[  638.016775] [drm] Driver supports precise vblank timestamp query.
[  638.196517] nouveau 0000:01:00.0: DRM: MM: using COPY for buffer copies
[  638.196525] [drm] Initialized nouveau 1.3.1 20120801 for 0000:01:00.0 on minor 1


Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.