Re: drm/mgag200: Fix big-endian support
Thomas Zimmermann <[email protected]>
| Newsgroups | gmane.linux.ports.ppc.embedded |
|---|---|
| Message-ID | <6c265d1e-c301-4095-83e2-0e669222469a__36124.523640477$1787735239$gmane$org@suse.de> |
Hi Am 02.08.26 um 20:06 schrieb Christian Zigotzky: > Hello René, > > Many thanks for your patch. [1] > > I have bought the PCI graphics card Matrox G200 G2+/QUADP-PL/7 32MB with 4x DVI. It is an AGP card connected via PCI. > > We use the new DRM driver MGAG200 since the kernel 7.2.0-rc4 and the old DRM legacy driver for Matrox g200/g400 graphics cards since the stable long-term kernel 5.10.260. > > I tested it with the RC5 of kernel 7.2 in my PowerPC machine (e5500) today. Unfortunately, the DRM driver mgag200 can't read the PCI ROM. Maybe only an x86 ROM? > > xrandr detects the ports but reports that they are not connected, even though the cables are plugged in. > > I also tested it with the stable long-term kernel 5.10.261 with the old legacy DRM drivers for Matrox graphics cards. > I installed the Xorg MGA server xf86-video-mga-2.0.0_3 for the old legacy DRM driver but unfortunately I get only a black screen. > > Is it possible to use this card with PPC Linux? Attached is the patch I promised. Please apply it and test it on your machine. Does it make the card work? Best regards Thomas > > More information: > > lspci -vvv > > 0001:05:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200 AGP (rev 03) (prog-if 00 [VGA controller]) > Subsystem: Matrox Electronics Systems Ltd. G200 Multi-Monitor > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- > Latency: 128 (4000ns min, 8000ns max), Cache Line Size: 32 bytes > Interrupt: pin A routed to IRQ 18 > Region 0: Memory at c20000000 (32-bit, prefetchable) [size=16M] > Region 1: Memory at c21000000 (32-bit, non-prefetchable) [size=16K] > Region 2: Memory at c21800000 (32-bit, non-prefetchable) [size=8M] > Expansion ROM at c21010000 [disabled] [size=64K] > Capabilities: [dc] Power Management version 1 > Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [f0] AGP version 1.0 > Status: RQ=32 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW- AGP3- Rate=x1,x2 > Command: RQ=1 ArqSz=0 Cal=0 SBA- AGP- GART64- 64bit- FW- Rate=<none> > Kernel driver in use: mgag200 > > 0001:05:04.0 Display controller: Matrox Electronics Systems Ltd. MGA G200 AGP (rev 03) > Subsystem: Matrox Electronics Systems Ltd. G200 Multi-Monitor > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- > Latency: 128 (4000ns min, 8000ns max), Cache Line Size: 32 bytes > Interrupt: pin A routed to IRQ 18 > Region 0: Memory at c22000000 (32-bit, prefetchable) [size=16M] > Region 1: Memory at c23000000 (32-bit, non-prefetchable) [size=16K] > Region 2: Memory at c23800000 (32-bit, non-prefetchable) [size=8M] > Expansion ROM at c21020000 [disabled] [size=64K] > Capabilities: [dc] Power Management version 1 > Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [f0] AGP version 1.0 > Status: RQ=32 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW- AGP3- Rate=x1,x2 > Command: RQ=1 ArqSz=0 Cal=0 SBA- AGP- GART64- 64bit- FW- Rate=<none> > Kernel driver in use: mgag200 > > 0001:05:08.0 Display controller: Matrox Electronics Systems Ltd. MGA G200 AGP (rev 03) > Subsystem: Matrox Electronics Systems Ltd. G200 Multi-Monitor > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- > Latency: 128 (4000ns min, 8000ns max), Cache Line Size: 32 bytes > Interrupt: pin A routed to IRQ 18 > Region 0: Memory at c24000000 (32-bit, prefetchable) [size=16M] > Region 1: Memory at c25000000 (32-bit, non-prefetchable) [size=16K] > Region 2: Memory at c25800000 (32-bit, non-prefetchable) [size=8M] > Expansion ROM at c21030000 [disabled] [size=64K] > Capabilities: [dc] Power Management version 1 > Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [f0] AGP version 1.0 > Status: RQ=32 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW- AGP3- Rate=x1,x2 > Command: RQ=1 ArqSz=0 Cal=0 SBA- AGP- GART64- 64bit- FW- Rate=<none> > Kernel driver in use: mgag200 > > 0001:05:0c.0 Display controller: Matrox Electronics Systems Ltd. MGA G200 AGP (rev 03) > Subsystem: Matrox Electronics Systems Ltd. G200 Multi-Monitor > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- > Latency: 128 (4000ns min, 8000ns max), Cache Line Size: 32 bytes > Interrupt: pin A routed to IRQ 18 > Region 0: Memory at c26000000 (32-bit, prefetchable) [size=16M] > Region 1: Memory at c27000000 (32-bit, non-prefetchable) [size=16K] > Region 2: Memory at c27800000 (32-bit, non-prefetchable) [size=8M] > Expansion ROM at c21040000 [disabled] [size=64K] > Capabilities: [dc] Power Management version 1 > Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [f0] AGP version 1.0 > Status: RQ=32 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 64bit- FW- AGP3- Rate=x1,x2 > Command: RQ=1 ArqSz=0 Cal=0 SBA- AGP- GART64- 64bit- FW- Rate=<none> > Kernel driver in use: mgag200 > > > dmesg | grep -i mga > > [ 2.302206] [drm] Initialized mgag200 1.0.0 for 0001:05:00.0 on minor 1 > [ 2.303761] mgag200 0001:05:00.0: [drm] Cannot find any crtc or sizes > [ 2.304697] mgag200 0001:05:04.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff > [ 2.305792] [drm] Initialized mgag200 1.0.0 for 0001:05:04.0 on minor 2 > [ 2.308281] mgag200 0001:05:04.0: [drm] Cannot find any crtc or sizes > [ 2.308802] mgag200 0001:05:08.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff > [ 2.309319] [drm] Initialized mgag200 1.0.0 for 0001:05:08.0 on minor 3 > [ 2.309785] mgag200 0001:05:00.0: [drm] Cannot find any crtc or sizes > [ 2.310900] mgag200 0001:05:08.0: [drm] Cannot find any crtc or sizes > [ 2.311895] mgag200 0001:05:0c.0: Invalid PCI ROM header signature: expecting 0xaa55, got 0xffff > [ 2.312633] [drm] Initialized mgag200 1.0.0 for 0001:05:0c.0 on minor 4 > [ 2.312844] mgag200 0001:05:04.0: [drm] Cannot find any crtc or sizes > [ 2.315512] mgag200 0001:05:0c.0: [drm] Cannot find any crtc or sizes > [ 2.317178] mgag200 0001:05:08.0: [drm] Cannot find any crtc or sizes > [ 2.323318] mgag200 0001:05:0c.0: [drm] Cannot find any crtc or sizes > > xrandr > > … > > VGA-4-4 disconnected (normal left inverted right x axis y axis) > VGA-3-3 disconnected (normal left inverted right x axis y axis) > VGA-2-2 disconnected (normal left inverted right x axis y axis) > VGA-1-1 disconnected (normal left inverted right x axis y axis) > > … > > lspci -nnk | grep VGA > > 0001:05:00.0 VGA compatible controller [0300]: Matrox Electronics Systems Ltd. MGA G200 AGP [102b:0521] (rev 03) > > Thanks, > Christian > > [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/gpu/drm/mgag200/mgag200_mode.c?id=6cb31fba137d45e682ce455b8ea364f44d5d4f98 -- -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Frankenstr. 146, 90461 Nürnberg, Germany, www.suse.com GF: Jochen Jaser, Andrew McDonald, (HRB 36809, AG Nürnberg)
0001-mgag200-go-looking-for-PInS-in-the-video-BIOS-ROM-on.patch
(text/x-patch, 1.8 KB)
From 1989e0882fe90839d2e9188f07b801259d1719ab Mon Sep 17 00:00:00 2001 From: Thomas Zimmermann <[email protected]> Date: Wed, 26 Aug 2026 11:03:11 +0200 Subject: [PATCH] mgag200: go looking for PInS in the video BIOS ROM on non-x86 --- drivers/gpu/drm/mgag200/mgag200_g200.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/mgag200/mgag200_g200.c b/drivers/gpu/drm/mgag200/mgag200_g200.c index 9e6b4618fadd..159ec58a6541 100644 --- a/drivers/gpu/drm/mgag200/mgag200_g200.c +++ b/drivers/gpu/drm/mgag200/mgag200_g200.c @@ -239,7 +239,7 @@ static void mgag200_g200_interpret_bios(struct mgag200_g200_device *g200, }; struct mga_device *mdev = &g200->base; struct drm_device *dev = &mdev->base; - const unsigned char *pins; + const unsigned char *pins = NULL; unsigned int pins_len, version; int offset; int tmp; @@ -250,16 +250,34 @@ static void mgag200_g200_interpret_bios(struct mgag200_g200_device *g200, if (memcmp(&bios[45], matrox, sizeof(matrox)) != 0) return; +#if defined(CONFIG_X86) /* Get the PInS offset. */ if (size < MGA_BIOS_OFFSET + 2) return; offset = (bios[MGA_BIOS_OFFSET + 1] << 8) | bios[MGA_BIOS_OFFSET]; + if (size < offset + 6) + return; /* Get PInS data structure. */ + pins = bios + offset; +#else + /* + * On OpenFirmware systems (PPC, MIPS, SPARC) the offset isn't stored + * at the end of the BIOS image. Look for the PInS header instead. + */ + for (offset = 0 ; offset < size - 6; ++offset) { + const unsigned char *buf = bios + offset; + + if (buf[0] == 0x2e && buf[1] == 0x41 && ((buf[2] == 64) || (buf[2] == 128))) { + pins = buf; + break; + } + } - if (size < offset + 6) + if (!pins) return; - pins = bios + offset; +#endif + if (pins[0] == 0x2e && pins[1] == 0x41) { version = pins[5]; pins_len = pins[2]; -- 2.55.0