From: Thomas Zimmermann <tzimmermann@suse.de>
To: Christian Zigotzky <chzigotzky@xenosoft.de>, rene@exactco.de
Cc: linuxppc-dev <linuxppc-dev@lists.ozlabs.org>,
Trevor Dickinson <rtd2@xtra.co.nz>,
hypexed@yahoo.com.au, mad skateman <madskateman@gmail.com>,
Christian Zigotzky <info@xenosoft.de>
Subject: Re: drm/mgag200: Fix big-endian support
Date: Wed, 26 Aug 2026 11:06:54 +0200 [thread overview]
Message-ID: <6c265d1e-c301-4095-83e2-0e669222469a@suse.de> (raw)
In-Reply-To: <4ACA9FCA-683C-44D0-B31F-CE70C40070BB@xenosoft.de>
[-- Attachment #1: Type: text/plain, Size: 7890 bytes --]
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)
[-- Attachment #2: 0001-mgag200-go-looking-for-PInS-in-the-video-BIOS-ROM-on.patch --]
[-- Type: text/x-patch, Size: 1874 bytes --]
From 1989e0882fe90839d2e9188f07b801259d1719ab Mon Sep 17 00:00:00 2001
From: Thomas Zimmermann <tzimmermann@suse.de>
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
next prev parent reply other threads:[~2026-08-26 9:07 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-02 18:06 drm/mgag200: Fix big-endian support Christian Zigotzky
2026-08-26 7:17 ` Christian Zigotzky
2026-08-26 7:48 ` Thomas Zimmermann
2026-08-26 9:06 ` Thomas Zimmermann [this message]
2026-08-26 15:07 ` Christian Zigotzky
2026-08-26 15:22 ` Thomas Zimmermann
2026-08-26 17:30 ` Christian Zigotzky
2026-08-27 6:36 ` Thomas Zimmermann
2026-08-27 16:38 ` Christian Zigotzky
2026-08-28 5:57 ` Thomas Zimmermann
2026-08-28 10:19 ` Christian Zigotzky
2026-08-31 8:20 ` Thomas Zimmermann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6c265d1e-c301-4095-83e2-0e669222469a@suse.de \
--to=tzimmermann@suse.de \
--cc=chzigotzky@xenosoft.de \
--cc=hypexed@yahoo.com.au \
--cc=info@xenosoft.de \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=madskateman@gmail.com \
--cc=rene@exactco.de \
--cc=rtd2@xtra.co.nz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox