changeset 4272:68a40de07167

cleaned some parts, tested and working with g400/450, g200 is buggy :(
author alex
date Sat, 19 Jan 2002 22:46:28 +0000
parents 2c7e6c87fb6f
children dca74cbbe70c
files vidix/drivers/mga_vid.c
diffstat 1 files changed, 60 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/vidix/drivers/mga_vid.c	Sat Jan 19 22:43:19 2002 +0000
+++ b/vidix/drivers/mga_vid.c	Sat Jan 19 22:46:28 2002 +0000
@@ -5,6 +5,14 @@
 
     YUY2 support (see config.format) added by A'rpi/ESP-team
     double buffering added by A'rpi/ESP-team
+
+    Brightness/contrast support by Nick Kurshev
+
+    TODO:
+	* fix doublebuffering for vidix
+	* fix pci_config_read for option word (memory size detection)
+	* fix/complete brightness/contrast handling (Nick)
+	* translate all non-english comments to english
 */
 
 /*
@@ -35,6 +43,7 @@
 
 #define MGA_VSYNC_POS 2
 
+#undef MGA_EQUALIZER
 
 #include <errno.h>
 #include <stdio.h>
@@ -43,6 +52,8 @@
 #include <math.h>
 #include <inttypes.h>
 
+//#include "../../libvo/fastmemcpy.h"
+
 #include "../vidix.h"
 #include "../fourcc.h"
 #include "../../libdha/libdha.h"
@@ -62,7 +73,7 @@
 #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;
+static int mga_verbose = 0;
 
 /* for device detection */
 static int probed = 0;
@@ -85,8 +96,8 @@
 /* Graphic keys */
 static vidix_grkey_t mga_grkey;
 
-static int colkey_saved=0;
-static int colkey_on=0;
+static int colkey_saved = 0;
+static int colkey_on = 0;
 static unsigned char colkey_color[4];
 static unsigned char colkey_mask[4];
 
@@ -105,7 +116,11 @@
     4,
     4,
     -1,
-    FLAG_UPSCALER | FLAG_DOWNSCALER,
+    FLAG_UPSCALER | FLAG_DOWNSCALER
+#ifdef MGA_EQUALIZER
+    | FLAG_EQUALIZER
+#endif
+    ,
     VENDOR_MATROX,
     0,
     { 0, 0, 0, 0}
@@ -177,8 +192,8 @@
 	uint32_t besv2wght;
 
 } bes_registers_t;
+static bes_registers_t regs;
 
-static bes_registers_t regs;
 #ifdef CRTC2
 typedef struct crtc2_registers_s
 {
@@ -205,7 +220,6 @@
 static crtc2_registers_t cregs;
 #endif
 
-
 //All register offsets are converted to word aligned offsets (32 bit)
 //because we want all our register accesses to be 32 bits
 #define VCOUNT      0x1e20
@@ -232,7 +246,6 @@
 #define XCOLKEY0BLUE  0x57
 
 #ifdef CRTC2
-
 /*CRTC2 registers*/
 #define XMISCCTRL  0x1e
 #define C2CTL       0x3c10 
@@ -254,8 +267,7 @@
 #define C2VCOUNT    0x3c48
 #define C2VPARAM    0x3c1c
 #define C2VSYNC     0x3c20
-
-#endif
+#endif /* CRTC2 */
 
 // Backend Scaler registers
 #define BESCTL      0x3d20
@@ -332,6 +344,7 @@
 
 int vixPlaybackFrameSelect(unsigned int frame)
 {
+    printf("[mga] frameselect: %d\n", frame);
 #if MGA_ALLOW_IRQ
     if (mga_irq != -1)
     {
@@ -679,7 +692,6 @@
 {
 	int x, y, sw, sh, dw, dh;
 	int besleft, bestop, ifactor, ofsleft, ofstop, baseadrofs, weight, weights;
-	int frame_size;
 #ifdef CRTC2
 #define right_margin 0
 #define left_margin 18
@@ -697,16 +709,13 @@
 	unsigned int vsyncend = vsyncstart + vsync_len;
 	unsigned int vtotal = vsyncend + upper_margin;
 #endif 
-    int frame;
 
     if ((config->num_frames < 1) || (config->num_frames > 4))
     {
-	printf("[mga] illegal num_frames: %d, setting to 2\n", config->num_frames);
-	config->num_frames = 2;
+	printf("[mga] illegal num_frames: %d, setting to 1\n", config->num_frames);
+	config->num_frames = 1;
 //        return(EINVAL);
     }
-    
-    config->num_frames = 2; /* let it be for now */
 
     x = config->dest.x;
     y = config->dest.y;
@@ -716,8 +725,7 @@
     dh = config->dest.h;
     
     config->dest.pitch.y=32;
-    config->dest.pitch.u=
-    config->dest.pitch.v=16;
+    config->dest.pitch.u=config->dest.pitch.v=16;
 
     printf("[mga] Setting up a %dx%d+%d+%d video window (src %dx%d) format %X\n",
            dw, dh, x, y, sw, sh, config->fourcc);
@@ -733,6 +741,15 @@
 //    printf("[mga] vcount = %d\n", readl(mga_mmio_base + VCOUNT));
     printf("[mga] mga_mmio_base = %p\n",mga_mmio_base);
     printf("[mga] mga_mem_base = %08x\n",mga_mem_base);
+    
+    config->offsets[0] = 0;
+    config->offsets[1] = config->frame_size;
+    config->offsets[2] = 2*config->frame_size;
+    config->offsets[3] = 3*config->frame_size;
+    
+    config->offset.y=0;
+    config->offset.v=((sw + 31) & ~31) * sh;
+    config->offset.u=config->offset.v+((sw + 31) & ~31) * sh /4;
 
     switch(config->fourcc)
     {
@@ -749,14 +766,10 @@
 
 //    config->frame_size = config->src.h*config->src.w+(config->src.w*config->src.h)/2;
 
-    frame_size = config->frame_size;
-    
-    config->offsets[0] = 0;
-    config->offsets[1] = config->frame_size; /* ?? */
-    
-    config->offset.y=0;
-    config->offset.v=((sw + 31) & ~31) * sh;
-    config->offset.u=config->offset.v+((sw + 31) & ~31) * sh /4;
+    //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;
+    //mga_src_base = (MGA_VIDMEM_SIZE-3) * 0x100000;
 
     mga_src_base = (mga_ram_size*0x100000-config->num_frames*config->frame_size);
     if (mga_src_base < 0)
@@ -769,15 +782,6 @@
 
     config->dga_addr = mga_mem_base + mga_src_base;
 
-//    config->offset.y = config->dga_addr;
-//    config->offset.u = config->offset.y+config->frame_size;
-//    config->offset.v = config->offset.u+2*config->frame_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;
-    //mga_src_base = (MGA_VIDMEM_SIZE-3) * 0x100000;
-
 	
     //Setup the BES registers for a three plane 4:2:0 video source 
 
@@ -873,9 +877,9 @@
 	baseadrofs = ((ofstop*regs.besviscal)>>16)*regs.bespitch;
 	//frame_size = ((sw + 31) & ~31) * sh + (((sw + 31) & ~31) * sh) / 2;
 	regs.besa1org = (uint32_t) mga_src_base + baseadrofs;
-	regs.besa2org = (uint32_t) mga_src_base + baseadrofs + 1*frame_size;
-	regs.besb1org = (uint32_t) mga_src_base + baseadrofs + 2*frame_size;
-	regs.besb2org = (uint32_t) mga_src_base + baseadrofs + 3*frame_size;
+	regs.besa2org = (uint32_t) mga_src_base + baseadrofs + 1*config->frame_size;
+	regs.besb1org = (uint32_t) mga_src_base + baseadrofs + 2*config->frame_size;
+	regs.besb2org = (uint32_t) mga_src_base + baseadrofs + 3*config->frame_size;
 
 if(config->fourcc==IMGFMT_YV12
  ||config->fourcc==IMGFMT_IYUV
@@ -889,18 +893,18 @@
 
     if(config->fourcc==IMGFMT_YV12){
 	regs.besa1corg = (uint32_t) mga_src_base + baseadrofs + regs.bespitch * sh ;
-	regs.besa2corg = (uint32_t) mga_src_base + baseadrofs + 1*frame_size + regs.bespitch * sh;
-	regs.besb1corg = (uint32_t) mga_src_base + baseadrofs + 2*frame_size + regs.bespitch * sh;
-	regs.besb2corg = (uint32_t) mga_src_base + baseadrofs + 3*frame_size + regs.bespitch * sh;
+	regs.besa2corg = (uint32_t) mga_src_base + baseadrofs + 1*config->frame_size + regs.bespitch * sh;
+	regs.besb1corg = (uint32_t) mga_src_base + baseadrofs + 2*config->frame_size + regs.bespitch * sh;
+	regs.besb2corg = (uint32_t) mga_src_base + baseadrofs + 3*config->frame_size + regs.bespitch * sh;
 	regs.besa1c3org = regs.besa1corg + ((regs.bespitch * sh) / 4);
 	regs.besa2c3org = regs.besa2corg + ((regs.bespitch * sh) / 4);
 	regs.besb1c3org = regs.besb1corg + ((regs.bespitch * sh) / 4);
 	regs.besb2c3org = regs.besb2corg + ((regs.bespitch * sh) / 4);
     } else {
 	regs.besa1c3org = (uint32_t) mga_src_base + baseadrofs + regs.bespitch * sh ;
-	regs.besa2c3org = (uint32_t) mga_src_base + baseadrofs + 1*frame_size + regs.bespitch * sh;
-	regs.besb1c3org = (uint32_t) mga_src_base + baseadrofs + 2*frame_size + regs.bespitch * sh;
-	regs.besb2c3org = (uint32_t) mga_src_base + baseadrofs + 3*frame_size + regs.bespitch * sh;
+	regs.besa2c3org = (uint32_t) mga_src_base + baseadrofs + 1*config->frame_size + regs.bespitch * sh;
+	regs.besb1c3org = (uint32_t) mga_src_base + baseadrofs + 2*config->frame_size + regs.bespitch * sh;
+	regs.besb2c3org = (uint32_t) mga_src_base + baseadrofs + 3*config->frame_size + regs.bespitch * sh;
 	regs.besa1corg = regs.besa1c3org + ((regs.bespitch * sh) / 4);
 	regs.besa2corg = regs.besa2c3org + ((regs.bespitch * sh) / 4);
 	regs.besb1corg = regs.besb1c3org + ((regs.bespitch * sh) / 4);
@@ -1128,7 +1132,7 @@
 	
     cregs.c2vparam=((vdispend - 1) << 16) | (vtotal - 1);
     cregs.c2vsync=((vsyncend - 1) << 16) | (vsyncstart - 1);
-#endif
+#endif /* CRTC2 */
 
     mga_vid_write_regs(0);
     return(0);
@@ -1169,22 +1173,6 @@
     return(0);
 }
 
-static int mga_vid_release(/*struct inode *inode, struct file *file*/)
-{
-	//Close the window just in case
-	printf("[mga] Video OFF (release)\n");
-
-	vid_src_ready = 0;   
-	regs.besctl &= ~1;
-        regs.besglobctl &= ~(1<<6);  // UYVY format selected
-//	mga_config.colkey_on=0; //!!!
-	mga_vid_write_regs(1);
-	mga_vid_in_use = 0;
-
-//	MOD_DEC_USE_COUNT;
-	return 0;
-}
-
 int vixProbe(int verbose,int force)
 {
 	pciinfo_t lst[MAX_PCI_DEVICES];
@@ -1267,22 +1255,14 @@
 	return(EINTR);
     }
 
-#if 0	
-#if LINUX_VERSION_CODE >= 0x020300
-    mga_mmio_base = ioremap_nocache(dev->resource[1].start,0x4000);
-    mga_mem_base =  dev->resource[0].start;
-#else
-    mga_mmio_base = ioremap_nocache(dev->base_address[1] & PCI_BASE_ADDRESS_MEM_MASK,0x4000);
-    mga_mem_base =  dev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK;
-#endif
-#endif
-
 #warning "FIXME: implement pciconfig_read! (or enable syscall)\n"
 #if 0
 /* from linux/pci.h */
 #define PCI_DEVFN(slot, func) ((((slot) & 0x1f) << 3) | ((func) & 0x07))
 
-    pci_config_read(pci_info.bus, PCI_DEVFN(pci_info.card, pci_info.func),
+//    pci_config_read(pci_info.bus, PCI_DEVFN(pci_info.card, pci_info.func),
+//        0x40, 4, &card_option);
+    pci_config_read(pci_info.bus, pci_info.card, pci_info.func,
         0x40, 4, &card_option);
 //    pci_read_config_dword(dev,  0x40, &card_option);
     printf("[mga] OPTION word: 0x%08X  mem: 0x%02X  %s\n", card_option,
@@ -1396,6 +1376,13 @@
 {
     printf("[mga] destroy\n");
 
+    vid_src_ready = 0;   
+    regs.besctl &= ~1;
+    regs.besglobctl &= ~(1<<6);  // UYVY format selected
+//    mga_config.colkey_on=0; //!!!
+    mga_vid_write_regs(1);
+    mga_vid_in_use = 0;
+
 #ifdef MGA_ALLOW_IRQ
     if (mga_irq != -1)
     	free_irq(mga_irq, &mga_irq);
@@ -1458,8 +1445,8 @@
     return(0);
 }
 
-#ifdef TEST_ME_PLEASE
-vidix_video_eq_t equal = { 0, 0, 0, 0, 0, 0, 0, 0 };
+#ifdef MGA_EQUALIZER
+static vidix_video_eq_t equal = { 0, 0, 0, 0, 0, 0, 0, 0 };
 int 	vixPlaybackSetEq( const vidix_video_eq_t * eq)
 {
    uint32_t beslumactl;