changeset 4239:acadddf56508

updated, colorkey support, pontscho reported it's working fine, only faulting with very-very-very big resolution
author alex
date Fri, 18 Jan 2002 18:14:10 +0000
parents 9eada2812ed3
children a7d6ea555c2e
files vidix/drivers/mga_vid.c vidix/drivers/mga_vid.h
diffstat 2 files changed, 93 insertions(+), 192 deletions(-) [+]
line wrap: on
line diff
--- a/vidix/drivers/mga_vid.c	Fri Jan 18 15:37:52 2002 +0000
+++ b/vidix/drivers/mga_vid.c	Fri Jan 18 18:14:10 2002 +0000
@@ -5,13 +5,10 @@
 
     YUY2 support (see config.format) added by A'rpi/ESP-team
     double buffering added by A'rpi/ESP-team
-
-
-    DONT USE THIS! IT'S UNDER DEVELOPEMENT! USE MGA_VID KERNELDRIVER!
 */
 
 /*
- * Original comment:
+ * Original copyright:
  *
  * mga_vid.c
  *
@@ -28,19 +25,17 @@
  * license. See http://www.gnu.org/copyleft/gpl.html for details.
  */
 
-
 //#define CRTC2
 
 // Set this value, if autodetection fails! (video ram size in megabytes)
 // #define MGA_MEMORY_SIZE 16
 
-//#define MGA_VIDMEM_SIZE mga_ram_size
-
-//#define MGA_ALLOW_IRQ
+/* disable irq */
 #undef MGA_ALLOW_IRQ
 
 #define MGA_VSYNC_POS 2
 
+
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -48,41 +43,16 @@
 #include <math.h>
 #include <inttypes.h>
 
-#include "../../libdha/pci_ids.h"
-#include "../../libdha/pci_names.h"
-
 #include "../vidix.h"
 #include "../fourcc.h"
 #include "../../libdha/libdha.h"
-#include "mga_vid.h"
+#include "../../libdha/pci_ids.h"
+#include "../../libdha/pci_names.h"
 
 #if    !defined(ENOTSUP) && defined(EOPNOTSUPP)
 #define ENOTSUP EOPNOTSUPP
 #endif
 
-#define TRUE 1
-#define FALSE 0
-
-#ifndef PCI_VENDOR_ID_MATROX
-#define PCI_VENDOR_ID_MATROX 0x102b
-#endif
-
-#ifndef PCI_DEVICE_ID_MATROX_G200_PCI 
-#define PCI_DEVICE_ID_MATROX_G200_PCI 0x0520
-#endif
-
-#ifndef PCI_DEVICE_ID_MATROX_G200_AGP 
-#define PCI_DEVICE_ID_MATROX_G200_AGP 0x0521
-#endif
-
-#ifndef PCI_DEVICE_ID_MATROX_G400 
-#define PCI_DEVICE_ID_MATROX_G400 0x0525
-#endif
-
-#ifndef PCI_DEVICE_ID_MATROX_G550 
-#define PCI_DEVICE_ID_MATROX_G550 0x2527
-#endif
-
 /* from radeon_vid */
 #define GETREG(TYPE,PTR,OFFZ)		(*((volatile TYPE*)((PTR)+(OFFZ))))
 #define SETREG(TYPE,PTR,OFFZ,VAL)	(*((volatile TYPE*)((PTR)+(OFFZ))))=VAL
@@ -92,11 +62,56 @@
 #define readl(addr)		GETREG(uint32_t,(uint32_t)(addr),0)
 #define writel(val,addr)	SETREG(uint32_t,(uint32_t)(addr),0,val)
 
+int mga_verbose = 0;
+
+/* for device detection */
+static int probed = 0;
 static pciinfo_t pci_info;
-static int probed = 0;
+
+/* internal booleans */
+static uint32_t mga_vid_in_use = 0;
+static uint32_t is_g400 = 0;
+static uint32_t vid_src_ready = 0;
+static uint32_t vid_overlay_on = 0;
+
+/* mapped physical addresses */
+static uint8_t *mga_mmio_base = 0;
+static uint32_t mga_mem_base = 0; 
+
+static int mga_src_base = 0; /* YUV buffer position in video memory */
+
+static uint32_t mga_ram_size = 0; /* how much megabytes videoram we have */
+
+/* Graphic keys */
+static vidix_grkey_t mga_grkey;
 
-static vidix_ckey_t colorkey;
+static int colkey_saved=0;
+static int colkey_on=0;
+static unsigned char colkey_color[4];
+static unsigned char colkey_mask[4];
+
+/* for IRQ */
+static int mga_irq = -1;
+
+static int mga_next_frame = 0;
 
+static vidix_capability_t mga_cap =
+{
+    "Matrox MGA G200/G400 YUV Video",
+    TYPE_OUTPUT,
+    { 0, 0, 0, 0 },
+    1024, /* 2048x2048 is supported if Pontscho is right */
+    768,
+    4,
+    4,
+    -1,
+    FLAG_UPSCALER | FLAG_DOWNSCALER,
+    VENDOR_MATROX,
+    0,
+    { 0, 0, 0, 0}
+};
+
+/* MATROX BES registers */
 typedef struct bes_registers_s
 {
 	//BES Control
@@ -190,46 +205,6 @@
 static crtc2_registers_t cregs;
 #endif
 
-static uint32_t mga_vid_in_use = 0;
-static uint32_t is_g400 = 0;
-static uint32_t vid_src_ready = 0;
-static uint32_t vid_overlay_on = 0;
-
-static uint8_t *mga_mmio_base = 0;
-static uint32_t mga_mem_base = 0; 
-
-static int mga_src_base = 0;	// YUV buffer position in video memory
-
-static uint32_t mga_ram_size = 0;	// how much megabytes videoram we have
-
-//static int mga_force_memsize = 0;
-
-int mga_verbose = 0;
-
-static mga_vid_config_t mga_config; 
-
-static int colkey_saved=0;
-static int colkey_on=0;
-static unsigned char colkey_color[4];
-static unsigned char colkey_mask[4];
-
-static int mga_irq = -1;
-
-static vidix_capability_t mga_cap =
-{
-    "Matrox MGA G200/G400 YUV Video",
-    TYPE_OUTPUT,
-    { 0, 0, 0, 0 },
-    1024,
-    768,
-    4,
-    4,
-    -1,
-    FLAG_UPSCALER | FLAG_DOWNSCALER,
-    VENDOR_MATROX,
-    0,
-    { 0, 0, 0, 0}
-};
 
 //All register offsets are converted to word aligned offsets (32 bit)
 //because we want all our register accesses to be 32 bits
@@ -323,7 +298,6 @@
 #define ICLEAR	    0x1e18
 #define STATUS      0x1e14
 
-static int mga_next_frame=0;
 
 #ifdef CRTC2
 static void crtc2_frame_sel(int frame)
@@ -358,10 +332,14 @@
 
 int vixPlaybackFrameSelect(unsigned int frame)
 {
-    if ( mga_irq != -1 ) {
-	mga_next_frame=frame;
-    } else {
-
+#if MGA_ALLOW_IRQ
+    if (mga_irq != -1)
+    {
+	mga_next_frame = frame;
+    }
+    else
+#endif
+    {
 	//we don't need the vcount protection as we're only hitting
 	//one register (and it doesn't seem to be double buffered)
 	regs.besctl = (regs.besctl & ~0x07000000) + (frame << 25);
@@ -373,7 +351,6 @@
 #ifdef CRTC2
 	crtc2_frame_sel(frame);
 #endif
-
     }
 
     return(0);
@@ -449,8 +426,8 @@
 	
 if(!restore){
 	writeb( XKEYOPMODE, mga_mmio_base + PALWTADD);
-	writeb( mga_config.colkey_on, mga_mmio_base + X_DATAREG);
-	if ( mga_config.colkey_on ) 
+	writeb( mga_grkey.ckey.op == CKEY_TRUE, mga_mmio_base + X_DATAREG);
+	if ( mga_grkey.ckey.op == CKEY_TRUE )
 	{
 		uint32_t r=0, g=0, b=0;
 
@@ -463,23 +440,23 @@
 			break;
 
 			case BPP_15:
-				r = mga_config.colkey_red   >> 3;
-				g = mga_config.colkey_green >> 3;
-				b = mga_config.colkey_blue  >> 3;
+				r = mga_grkey.ckey.red   >> 3;
+				g = mga_grkey.ckey.green >> 3;
+				b = mga_grkey.ckey.blue  >> 3;
 			break;
 
 			case BPP_16:
-				r = mga_config.colkey_red   >> 3;
-				g = mga_config.colkey_green >> 2;
-				b = mga_config.colkey_blue  >> 3;
+				r = mga_grkey.ckey.red   >> 3;
+				g = mga_grkey.ckey.green >> 2;
+				b = mga_grkey.ckey.blue  >> 3;
 			break;
 
 			case BPP_24:
 			case BPP_32_DIR:
 			case BPP_32_PAL:
-				r = mga_config.colkey_red;
-				g = mga_config.colkey_green;
-				b = mga_config.colkey_blue;
+				r = mga_grkey.ckey.red;
+				g = mga_grkey.ckey.green;
+				b = mga_grkey.ckey.blue;
 			break;
 		}
 
@@ -602,7 +579,6 @@
 }
 
 #ifdef MGA_ALLOW_IRQ
-
 static void enable_irq(){
 	long int cc;
 
@@ -616,14 +592,16 @@
 	writeb(0x10, mga_mmio_base + CRTCD );  /* clear = 1 */
 	
 	writel( regs.besglobctl , mga_mmio_base + BESGLOBCTL);
-
+	
+	return;
 }
 
-static void disable_irq(){
-
+static void disable_irq()
+{
 	writeb( 0x11, mga_mmio_base + CRTCX);
 	writeb(0x20, mga_mmio_base + CRTCD );  /* clear 0, enable off */
 
+	return;
 }
 
 void mga_handle_irq(int irq, void *dev_id/*, struct pt_regs *pregs*/) {
@@ -695,14 +673,13 @@
 	return;
 
 }
-
-#endif
+#endif /* MGA_ALLOW_IRQ */
 
 int vixConfigPlayback(vidix_playback_t *config)
 {
 	int x, y, sw, sh, dw, dh;
 	int besleft, bestop, ifactor, ofsleft, ofstop, baseadrofs, weight, weights;
-	int frame_size=config->frame_size;
+	int frame_size;
 #ifdef CRTC2
 #define right_margin 0
 #define left_margin 18
@@ -722,30 +699,6 @@
 #endif 
     int frame;
 
-#if 0	
-    switch(config->fourcc)
-    {
-        case IMGFMT_YV12:
-	    mga_config.format = MGA_VID_FORMAT_YV12;
-    	    break;
-        case IMGFMT_IYUV:
-	    mga_config.format = MGA_VID_FORMAT_IYUV;
-	    break;
-	case IMGFMT_I420:
-	    mga_config.format = MGA_VID_FORMAT_I420;
-	    break;
-	case IMGFMT_YUY2:
-	    mga_config.format = MGA_VID_FORMAT_YUY2;
-	    break;
-	case IMGFMT_UYVY:
-	    mga_config.format = MGA_VID_FORMAT_UYVY;
-	    break;
-	default:
-	    printf("[mga] unsupported video format: %x\n",
-	        config->fourcc);
-	    return(ENOTSUP);
-    }
-#endif
     if ((config->num_frames < 1) || (config->num_frames > 4))
     {
 	printf("[mga] illegal num_frames: %d, setting to 2\n", config->num_frames);
@@ -820,13 +773,6 @@
 //    config->offset.u = config->offset.y+config->frame_size;
 //    config->offset.v = config->offset.u+2*config->frame_size;
 	
-    if (is_g400) 
-      mga_config.card_type = MGA_G400;
-    else
-      mga_config.card_type = MGA_G200;
-		       
-    mga_config.ram_size = mga_ram_size;
-	
     //FIXME figure out a better way to allocate memory on card
     //allocate 2 megs
     //mga_src_base = mga_mem_base + (MGA_VIDMEM_SIZE-2) * 0x100000;
@@ -1482,8 +1428,10 @@
 	    return(ENOTSUP);
     }
     
-    to->depth = VID_DEPTH_12BPP | VID_DEPTH_16BPP | VID_DEPTH_32BPP;
-    to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK;
+    to->depth = VID_DEPTH_12BPP |
+		VID_DEPTH_15BPP | VID_DEPTH_16BPP |
+		VID_DEPTH_24BPP | VID_DEPTH_32BPP;
+    to->flags = VID_CAP_EXPAND | VID_CAP_SHRINK | VID_CAP_COLORKEY;
     return(0);
 }
 
@@ -1498,3 +1446,14 @@
     return(0);
 }
 
+int vixGetGrKeys(vidix_grkey_t *grkey)
+{
+    memcpy(grkey, &mga_grkey, sizeof(vidix_grkey_t));
+    return(0);
+}
+
+int vixSetGrKeys(const vidix_grkey_t *grkey)
+{
+    memcpy(&mga_grkey, grkey, sizeof(vidix_grkey_t));
+    return(0);
+}
--- a/vidix/drivers/mga_vid.h	Fri Jan 18 15:37:52 2002 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- *
- * mga_vid.h
- *
- * Copyright (C) 1999 Aaron Holtzman
- * 
- * Matrox MGA G200/G400 YUV Video Interface module Version 0.1.0
- * 
- * BES == Back End Scaler
- * 
- * This software has been released under the terms of the GNU Public
- * license. See http://www.gnu.org/copyleft/gpl.html for details.
- */
-
-#ifndef __LINUX_MGAVID_H
-#define __LINUX_MGAVID_H
-
-//#include <inttypes.h>
-
-typedef struct mga_vid_config_s
-{
-uint16_t version;
-uint16_t card_type;
-uint32_t ram_size;
-uint32_t src_width;
-uint32_t src_height;
-uint32_t dest_width;
-uint32_t dest_height;
-uint32_t x_org;
-uint32_t y_org;
-uint8_t  colkey_on;
-uint8_t  colkey_red;
-uint8_t  colkey_green;
-uint8_t  colkey_blue;
-uint32_t format;
-uint32_t frame_size;
-uint32_t num_frames;
-} mga_vid_config_t;
-
-#if 0
-#define MGA_VID_FORMAT_YV12 0x32315659
-#define MGA_VID_FORMAT_IYUV (('I'<<24)|('Y'<<16)|('U'<<8)|'V')
-#define MGA_VID_FORMAT_I420 (('I'<<24)|('4'<<16)|('2'<<8)|'0')
-#define MGA_VID_FORMAT_YUY2 (('Y'<<24)|('U'<<16)|('Y'<<8)|'2')
-#define MGA_VID_FORMAT_UYVY (('U'<<24)|('Y'<<16)|('V'<<8)|'Y')
-#endif
-
-#define MGA_VID_CONFIG    _IOR('J', 1, mga_vid_config_t)
-#define MGA_VID_ON        _IO ('J', 2)
-#define MGA_VID_OFF       _IO ('J', 3)
-#define MGA_VID_FSEL _IOR('J', 4, int)
-
-#define MGA_G200 0x1234
-#define MGA_G400 0x5678
-
-#define MGA_VID_VERSION 0x0201
-
-#endif