LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
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


  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