aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/matrox/matroxfb_misc.c
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2005-09-09 16:04:42 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-09-09 16:58:01 -0400
commit5c06e2aa6339112befdc87b350b8bf712890d7a7 (patch)
tree13a3b008a6a64f051b75f59d194d32e290be5fbc /drivers/video/matrox/matroxfb_misc.c
parentf510a3c3d48fd5aaa7757aebbc37e9ee417913a3 (diff)
[PATCH] matroxfb: read MGA PInS data on PowerPC
This updates the matroxfb code so that it can find the PInS data embedded in the BIOS on PowerPC cards. The process for finding the data is different on OpenFirmware cards than on x86 cards, and the code for doing so was missing. After patching, building, installing, and booting a kernel, you should grep for "PInS" in /var/log/messages. You should see two messages in the log: PInS data found at offset XXXXX PInS memtype = X On the GXT135p card I get "31168" and "5". The first value is irrelevant, but it's presence lets me know that the PInS data was actually found. On a GXT130p, the second value should be 3. Since I don't have access to that hardware, if someone can verify that, I will submit a follow-on patch that rips out all the memtype parameter stuff. Signed-off-by: Ian Romanick <idr@us.ibm.com> Signed-off-by: Petr Vandrovec <vandrove@vc.cvut.cz> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/video/matrox/matroxfb_misc.c')
-rw-r--r--drivers/video/matrox/matroxfb_misc.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/video/matrox/matroxfb_misc.c b/drivers/video/matrox/matroxfb_misc.c
index a18dd024fc86..d9d3e9f6c08e 100644
--- a/drivers/video/matrox/matroxfb_misc.c
+++ b/drivers/video/matrox/matroxfb_misc.c
@@ -68,6 +68,9 @@
68 * "David C. Hansen" <haveblue@us.ibm.com> 68 * "David C. Hansen" <haveblue@us.ibm.com>
69 * Fixes 69 * Fixes
70 * 70 *
71 * "Ian Romanick" <idr@us.ibm.com>
72 * Find PInS data in BIOS on PowerPC systems.
73 *
71 * (following author is not in any relation with this code, but his code 74 * (following author is not in any relation with this code, but his code
72 * is included in this driver) 75 * is included in this driver)
73 * 76 *
@@ -496,10 +499,35 @@ static void parse_bios(unsigned char __iomem* vbios, struct matrox_bios* bd) {
496 get_bios_version(vbios, bd); 499 get_bios_version(vbios, bd);
497 get_bios_output(vbios, bd); 500 get_bios_output(vbios, bd);
498 get_bios_tvout(vbios, bd); 501 get_bios_tvout(vbios, bd);
502#if defined(__powerpc__)
503 /* On PowerPC cards, the PInS offset isn't stored at the end of the
504 * BIOS image. Instead, you must search the entire BIOS image for
505 * the magic PInS signature.
506 *
507 * This actually applies to all OpenFirmware base cards. Since these
508 * cards could be put in a MIPS or SPARC system, should the condition
509 * be something different?
510 */
511 for ( pins_offset = 0 ; pins_offset <= 0xFF80 ; pins_offset++ ) {
512 unsigned char header[3];
513
514 header[0] = readb(vbios + pins_offset);
515 header[1] = readb(vbios + pins_offset + 1);
516 header[2] = readb(vbios + pins_offset + 2);
517 if ( (header[0] == 0x2E) && (header[1] == 0x41)
518 && ((header[2] == 0x40) || (header[2] == 0x80)) ) {
519 printk(KERN_INFO "PInS data found at offset %u\n",
520 pins_offset);
521 get_pins(vbios + pins_offset, bd);
522 break;
523 }
524 }
525#else
499 pins_offset = readb(vbios + 0x7FFC) | (readb(vbios + 0x7FFD) << 8); 526 pins_offset = readb(vbios + 0x7FFC) | (readb(vbios + 0x7FFD) << 8);
500 if (pins_offset <= 0xFF80) { 527 if (pins_offset <= 0xFF80) {
501 get_pins(vbios + pins_offset, bd); 528 get_pins(vbios + pins_offset, bd);
502 } 529 }
530#endif
503} 531}
504 532
505#define get_u16(x) (le16_to_cpu(get_unaligned((__u16*)(x)))) 533#define get_u16(x) (le16_to_cpu(get_unaligned((__u16*)(x))))
@@ -755,6 +783,8 @@ void matroxfb_read_pins(WPMINFO2) {
755 } 783 }
756#endif 784#endif
757 matroxfb_set_limits(PMINFO &ACCESS_FBINFO(bios)); 785 matroxfb_set_limits(PMINFO &ACCESS_FBINFO(bios));
786 printk(KERN_INFO "PInS memtype = %u\n",
787 (ACCESS_FBINFO(values).reg.opt & 0x1C00) >> 10);
758} 788}
759 789
760EXPORT_SYMBOL(matroxfb_DAC_in); 790EXPORT_SYMBOL(matroxfb_DAC_in);