diff options
author | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-04-12 10:56:17 +0000 |
---|---|---|
committer | diego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-04-12 10:56:17 +0000 |
commit | 7573c29480850d715e2f06cae70f252573098123 (patch) | |
tree | a5a2f498ad3a19806957e1d7e01f913c1650b33d /drivers/mga_vid.c | |
parent | 86ea8d4f4abf23672516fa0ca3378aa19c44bf2c (diff) | |
download | mpv-7573c29480850d715e2f06cae70f252573098123.tar.bz2 mpv-7573c29480850d715e2f06cae70f252573098123.tar.xz |
the great MPlayer tab removal: part I
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31032 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'drivers/mga_vid.c')
-rw-r--r-- | drivers/mga_vid.c | 2324 |
1 files changed, 1157 insertions, 1167 deletions
diff --git a/drivers/mga_vid.c b/drivers/mga_vid.c index 8330be29d6..de96aa1b0a 100644 --- a/drivers/mga_vid.c +++ b/drivers/mga_vid.c @@ -131,130 +131,130 @@ MODULE_LICENSE("GPL"); static unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base) { - unsigned long result = 0,value; - - if (!base) { - base = 10; - if (*cp == '0') { - base = 8; - cp++; - if ((*cp == 'x') && isxdigit(cp[1])) { - cp++; - base = 16; - } - } - } - while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) - ? toupper(*cp) : *cp)-'A'+10) < base) { - result = result*base + value; + unsigned long result = 0,value; + + if (!base) { + base = 10; + if (*cp == '0') { + base = 8; + cp++; + if ((*cp == 'x') && isxdigit(cp[1])) { cp++; + base = 16; + } } - if (endp) - *endp = (char *)cp; - return result; + } + while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) + ? toupper(*cp) : *cp)-'A'+10) < base) { + result = result*base + value; + cp++; + } + if (endp) + *endp = (char *)cp; + return result; } static long simple_strtol(const char *cp,char **endp,unsigned int base) { - if(*cp=='-') - return -simple_strtoul(cp+1,endp,base); - return simple_strtoul(cp,endp,base); + if(*cp=='-') + return -simple_strtoul(cp+1,endp,base); + return simple_strtoul(cp,endp,base); } #endif typedef struct bes_registers_s { - //BES Control - uint32_t besctl; - //BES Global control - uint32_t besglobctl; - //Luma control (brightness and contrast) - uint32_t beslumactl; - //Line pitch - uint32_t bespitch; - - //Buffer A-1 Chroma 3 plane org - uint32_t besa1c3org; - //Buffer A-1 Chroma org - uint32_t besa1corg; - //Buffer A-1 Luma org - uint32_t besa1org; - - //Buffer A-2 Chroma 3 plane org - uint32_t besa2c3org; - //Buffer A-2 Chroma org - uint32_t besa2corg; - //Buffer A-2 Luma org - uint32_t besa2org; - - //Buffer B-1 Chroma 3 plane org - uint32_t besb1c3org; - //Buffer B-1 Chroma org - uint32_t besb1corg; - //Buffer B-1 Luma org - uint32_t besb1org; - - //Buffer B-2 Chroma 3 plane org - uint32_t besb2c3org; - //Buffer B-2 Chroma org - uint32_t besb2corg; - //Buffer B-2 Luma org - uint32_t besb2org; - - //BES Horizontal coord - uint32_t beshcoord; - //BES Horizontal inverse scaling [5.14] - uint32_t beshiscal; - //BES Horizontal source start [10.14] (for scaling) - uint32_t beshsrcst; - //BES Horizontal source ending [10.14] (for scaling) - uint32_t beshsrcend; - //BES Horizontal source last - uint32_t beshsrclst; - - - //BES Vertical coord - uint32_t besvcoord; - //BES Vertical inverse scaling [5.14] - uint32_t besviscal; - //BES Field 1 vertical source last position - uint32_t besv1srclst; - //BES Field 1 weight start - uint32_t besv1wght; - //BES Field 2 vertical source last position - uint32_t besv2srclst; - //BES Field 2 weight start - uint32_t besv2wght; - - - //configurable stuff - int blackie; + //BES Control + uint32_t besctl; + //BES Global control + uint32_t besglobctl; + //Luma control (brightness and contrast) + uint32_t beslumactl; + //Line pitch + uint32_t bespitch; + + //Buffer A-1 Chroma 3 plane org + uint32_t besa1c3org; + //Buffer A-1 Chroma org + uint32_t besa1corg; + //Buffer A-1 Luma org + uint32_t besa1org; + + //Buffer A-2 Chroma 3 plane org + uint32_t besa2c3org; + //Buffer A-2 Chroma org + uint32_t besa2corg; + //Buffer A-2 Luma org + uint32_t besa2org; + + //Buffer B-1 Chroma 3 plane org + uint32_t besb1c3org; + //Buffer B-1 Chroma org + uint32_t besb1corg; + //Buffer B-1 Luma org + uint32_t besb1org; + + //Buffer B-2 Chroma 3 plane org + uint32_t besb2c3org; + //Buffer B-2 Chroma org + uint32_t besb2corg; + //Buffer B-2 Luma org + uint32_t besb2org; + + //BES Horizontal coord + uint32_t beshcoord; + //BES Horizontal inverse scaling [5.14] + uint32_t beshiscal; + //BES Horizontal source start [10.14] (for scaling) + uint32_t beshsrcst; + //BES Horizontal source ending [10.14] (for scaling) + uint32_t beshsrcend; + //BES Horizontal source last + uint32_t beshsrclst; + + + //BES Vertical coord + uint32_t besvcoord; + //BES Vertical inverse scaling [5.14] + uint32_t besviscal; + //BES Field 1 vertical source last position + uint32_t besv1srclst; + //BES Field 1 weight start + uint32_t besv1wght; + //BES Field 2 vertical source last position + uint32_t besv2srclst; + //BES Field 2 weight start + uint32_t besv2wght; + + + //configurable stuff + int blackie; } bes_registers_t; #ifdef CRTC2 typedef struct crtc2_registers_s { - uint32_t c2ctl; - uint32_t c2datactl; - uint32_t c2misc; - uint32_t c2hparam; - uint32_t c2hsync; - uint32_t c2offset; - uint32_t c2pl2startadd0; - uint32_t c2pl2startadd1; - uint32_t c2pl3startadd0; - uint32_t c2pl3startadd1; - uint32_t c2preload; - uint32_t c2spicstartadd0; - uint32_t c2spicstartadd1; - uint32_t c2startadd0; - uint32_t c2startadd1; - uint32_t c2subpiclut; - uint32_t c2vcount; - uint32_t c2vparam; - uint32_t c2vsync; + uint32_t c2ctl; + uint32_t c2datactl; + uint32_t c2misc; + uint32_t c2hparam; + uint32_t c2hsync; + uint32_t c2offset; + uint32_t c2pl2startadd0; + uint32_t c2pl2startadd1; + uint32_t c2pl3startadd0; + uint32_t c2pl3startadd1; + uint32_t c2preload; + uint32_t c2spicstartadd0; + uint32_t c2spicstartadd1; + uint32_t c2startadd0; + uint32_t c2startadd1; + uint32_t c2subpiclut; + uint32_t c2vcount; + uint32_t c2vparam; + uint32_t c2vsync; } crtc2_registers_t; #endif @@ -348,10 +348,10 @@ typedef struct crtc2_registers_s #define BESVCOORD 0x3d2c #define BESSTATUS 0x3dc4 -#define CRTCX 0x1fd4 -#define CRTCD 0x1fd5 -#define IEN 0x1e1c -#define ICLEAR 0x1e18 +#define CRTCX 0x1fd4 +#define CRTCD 0x1fd5 +#define IEN 0x1e1c +#define ICLEAR 0x1e18 #define STATUS 0x1e14 @@ -365,42 +365,42 @@ typedef struct mga_card_s { // local devfs handle for /dev/mga_vidX #ifdef CONFIG_DEVFS_FS - devfs_handle_t dev_handle; + devfs_handle_t dev_handle; #endif - uint8_t *param_buff; // buffer for read() - uint32_t param_buff_size; - uint32_t param_buff_len; - bes_registers_t regs; + uint8_t *param_buff; // buffer for read() + uint32_t param_buff_size; + uint32_t param_buff_len; + bes_registers_t regs; #ifdef CRTC2 - crtc2_registers_t cregs; + crtc2_registers_t cregs; #endif - uint32_t vid_in_use; - uint32_t is_g400; - uint32_t vid_src_ready; - uint32_t vid_overlay_on; + uint32_t vid_in_use; + uint32_t is_g400; + uint32_t vid_src_ready; + uint32_t vid_overlay_on; - uint8_t *mmio_base; - uint32_t mem_base; - int src_base; // YUV buffer position in video memory - uint32_t ram_size; // how much megabytes videoram we have - uint32_t top_reserved; // reserved space for console font (matroxfb + fastfont) + uint8_t *mmio_base; + uint32_t mem_base; + int src_base; // YUV buffer position in video memory + uint32_t ram_size; // how much megabytes videoram we have + uint32_t top_reserved; // reserved space for console font (matroxfb + fastfont) - int brightness; // initial brightness - int contrast; // initial contrast + int brightness; // initial brightness + int contrast; // initial contrast - struct pci_dev *pci_dev; + struct pci_dev *pci_dev; - mga_vid_config_t config; - int configured; // set to 1 when the card is configured over ioctl + mga_vid_config_t config; + int configured; // set to 1 when the card is configured over ioctl - int colkey_saved; - int colkey_on; - unsigned char colkey_color[4]; - unsigned char colkey_mask[4]; + int colkey_saved; + int colkey_on; + unsigned char colkey_color[4]; + unsigned char colkey_mask[4]; - int irq; // = -1 - int next_frame; + int irq; // = -1 + int next_frame; } mga_card_t; #define MGA_MAX_CARDS 16 @@ -428,48 +428,48 @@ static void crtc2_frame_sel(mga_card_t * card, int frame) { switch(frame) { case 0: - card->cregs.c2pl2startadd0=card->regs.besa1corg; - card->cregs.c2pl3startadd0=card->regs.besa1c3org; - card->cregs.c2startadd0=card->regs.besa1org; - break; + card->cregs.c2pl2startadd0=card->regs.besa1corg; + card->cregs.c2pl3startadd0=card->regs.besa1c3org; + card->cregs.c2startadd0=card->regs.besa1org; + break; case 1: - card->cregs.c2pl2startadd0=card->regs.besa2corg; - card->cregs.c2pl3startadd0=card->regs.besa2c3org; - card->cregs.c2startadd0=card->regs.besa2org; - break; + card->cregs.c2pl2startadd0=card->regs.besa2corg; + card->cregs.c2pl3startadd0=card->regs.besa2c3org; + card->cregs.c2startadd0=card->regs.besa2org; + break; case 2: - card->cregs.c2pl2startadd0=card->regs.besb1corg; - card->cregs.c2pl3startadd0=card->regs.besb1c3org; - card->cregs.c2startadd0=card->regs.besb1org; - break; + card->cregs.c2pl2startadd0=card->regs.besb1corg; + card->cregs.c2pl3startadd0=card->regs.besb1c3org; + card->cregs.c2startadd0=card->regs.besb1org; + break; case 3: - card->cregs.c2pl2startadd0=card->regs.besb2corg; - card->cregs.c2pl3startadd0=card->regs.besb2c3org; - card->cregs.c2startadd0=card->regs.besb2org; - break; + card->cregs.c2pl2startadd0=card->regs.besb2corg; + card->cregs.c2pl3startadd0=card->regs.besb2c3org; + card->cregs.c2startadd0=card->regs.besb2org; + break; } - writel(card->cregs.c2startadd0, card->mmio_base + C2STARTADD0); - writel(card->cregs.c2pl2startadd0, card->mmio_base + C2PL2STARTADD0); - writel(card->cregs.c2pl3startadd0, card->mmio_base + C2PL3STARTADD0); + writel(card->cregs.c2startadd0, card->mmio_base + C2STARTADD0); + writel(card->cregs.c2pl2startadd0, card->mmio_base + C2PL2STARTADD0); + writel(card->cregs.c2pl3startadd0, card->mmio_base + C2PL3STARTADD0); } #endif static void mga_vid_frame_sel(mga_card_t * card, int frame) { if ( card->irq != -1 ) { - card->next_frame=frame; + card->next_frame=frame; } else { - //we don't need the vcount protection as we're only hitting - //one register (and it doesn't seem to be double buffered) - card->regs.besctl = (card->regs.besctl & ~0x07000000) + (frame << 25); - writel( card->regs.besctl, card->mmio_base + BESCTL ); + //we don't need the vcount protection as we're only hitting + //one register (and it doesn't seem to be double buffered) + card->regs.besctl = (card->regs.besctl & ~0x07000000) + (frame << 25); + writel( card->regs.besctl, card->mmio_base + BESCTL ); -// writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), - writel( card->regs.besglobctl + (MGA_VSYNC_POS<<16), - card->mmio_base + BESGLOBCTL); +// writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), + writel( card->regs.besglobctl + (MGA_VSYNC_POS<<16), + card->mmio_base + BESGLOBCTL); #ifdef CRTC2 - crtc2_frame_sel(card, frame); + crtc2_frame_sel(card, frame); #endif } @@ -478,236 +478,235 @@ static void mga_vid_frame_sel(mga_card_t * card, int frame) static void mga_vid_write_regs(mga_card_t * card, int restore) { - //Make sure internal registers don't get updated until we're done - writel( (readl(card->mmio_base + VCOUNT)-1)<<16, - card->mmio_base + BESGLOBCTL); + //Make sure internal registers don't get updated until we're done + writel( (readl(card->mmio_base + VCOUNT)-1)<<16, + card->mmio_base + BESGLOBCTL); - // color or coordinate keying + // color or coordinate keying - if(restore && card->colkey_saved){ - // restore it - card->colkey_saved=0; + if(restore && card->colkey_saved){ + // restore it + card->colkey_saved=0; #ifdef MP_DEBUG - printk("mga_vid: Restoring colorkey (ON: %d %02X:%02X:%02X)\n", - card->colkey_on,card->colkey_color[0],card->colkey_color[1],card->colkey_color[2]); + printk("mga_vid: Restoring colorkey (ON: %d %02X:%02X:%02X)\n", + card->colkey_on,card->colkey_color[0],card->colkey_color[1],card->colkey_color[2]); #endif - // Set color key registers: - writeb( XKEYOPMODE, card->mmio_base + PALWTADD); - writeb( card->colkey_on, card->mmio_base + X_DATAREG); - - writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); - writeb( card->colkey_color[0], card->mmio_base + X_DATAREG); - writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); - writeb( card->colkey_color[1], card->mmio_base + X_DATAREG); - writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); - writeb( card->colkey_color[2], card->mmio_base + X_DATAREG); - writeb( X_COLKEY, card->mmio_base + PALWTADD); - writeb( card->colkey_color[3], card->mmio_base + X_DATAREG); - - writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); - writeb( card->colkey_mask[0], card->mmio_base + X_DATAREG); - writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); - writeb( card->colkey_mask[1], card->mmio_base + X_DATAREG); - writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); - writeb( card->colkey_mask[2], card->mmio_base + X_DATAREG); - writeb( XCOLMSK, card->mmio_base + PALWTADD); - writeb( card->colkey_mask[3], card->mmio_base + X_DATAREG); - - } else if(!card->colkey_saved){ - // save it - card->colkey_saved=1; - // Get color key registers: - writeb( XKEYOPMODE, card->mmio_base + PALWTADD); - card->colkey_on=(unsigned char)readb(card->mmio_base + X_DATAREG) & 1; - - writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); - card->colkey_color[0]=(unsigned char)readb(card->mmio_base + X_DATAREG); - writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); - card->colkey_color[1]=(unsigned char)readb(card->mmio_base + X_DATAREG); - writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); - card->colkey_color[2]=(unsigned char)readb(card->mmio_base + X_DATAREG); - writeb( X_COLKEY, card->mmio_base + PALWTADD); - card->colkey_color[3]=(unsigned char)readb(card->mmio_base + X_DATAREG); - - writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); - card->colkey_mask[0]=(unsigned char)readb(card->mmio_base + X_DATAREG); - writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); - card->colkey_mask[1]=(unsigned char)readb(card->mmio_base + X_DATAREG); - writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); - card->colkey_mask[2]=(unsigned char)readb(card->mmio_base + X_DATAREG); - writeb( XCOLMSK, card->mmio_base + PALWTADD); - card->colkey_mask[3]=(unsigned char)readb(card->mmio_base + X_DATAREG); + // Set color key registers: + writeb( XKEYOPMODE, card->mmio_base + PALWTADD); + writeb( card->colkey_on, card->mmio_base + X_DATAREG); + + writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); + writeb( card->colkey_color[0], card->mmio_base + X_DATAREG); + writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); + writeb( card->colkey_color[1], card->mmio_base + X_DATAREG); + writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); + writeb( card->colkey_color[2], card->mmio_base + X_DATAREG); + writeb( X_COLKEY, card->mmio_base + PALWTADD); + writeb( card->colkey_color[3], card->mmio_base + X_DATAREG); + + writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); + writeb( card->colkey_mask[0], card->mmio_base + X_DATAREG); + writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); + writeb( card->colkey_mask[1], card->mmio_base + X_DATAREG); + writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); + writeb( card->colkey_mask[2], card->mmio_base + X_DATAREG); + writeb( XCOLMSK, card->mmio_base + PALWTADD); + writeb( card->colkey_mask[3], card->mmio_base + X_DATAREG); + + } else if(!card->colkey_saved){ + // save it + card->colkey_saved=1; + // Get color key registers: + writeb( XKEYOPMODE, card->mmio_base + PALWTADD); + card->colkey_on=(unsigned char)readb(card->mmio_base + X_DATAREG) & 1; + + writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); + card->colkey_color[0]=(unsigned char)readb(card->mmio_base + X_DATAREG); + writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); + card->colkey_color[1]=(unsigned char)readb(card->mmio_base + X_DATAREG); + writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); + card->colkey_color[2]=(unsigned char)readb(card->mmio_base + X_DATAREG); + writeb( X_COLKEY, card->mmio_base + PALWTADD); + card->colkey_color[3]=(unsigned char)readb(card->mmio_base + X_DATAREG); + + writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); + card->colkey_mask[0]=(unsigned char)readb(card->mmio_base + X_DATAREG); + writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); + card->colkey_mask[1]=(unsigned char)readb(card->mmio_base + X_DATAREG); + writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); + card->colkey_mask[2]=(unsigned char)readb(card->mmio_base + X_DATAREG); + writeb( XCOLMSK, card->mmio_base + PALWTADD); + card->colkey_mask[3]=(unsigned char)readb(card->mmio_base + X_DATAREG); #ifdef MP_DEBUG - printk("mga_vid: Saved colorkey (ON: %d %02X:%02X:%02X)\n", - card->colkey_on, card->colkey_color[0], card->colkey_color[1], card->colkey_color[2]); + printk("mga_vid: Saved colorkey (ON: %d %02X:%02X:%02X)\n", + card->colkey_on, card->colkey_color[0], card->colkey_color[1], card->colkey_color[2]); #endif - } - -if(!restore){ - writeb( XKEYOPMODE, card->mmio_base + PALWTADD); - writeb( card->config.colkey_on, card->mmio_base + X_DATAREG); - if ( card->config.colkey_on ) - { - uint32_t r=0, g=0, b=0; - - writeb( XMULCTRL, card->mmio_base + PALWTADD); - switch (readb (card->mmio_base + X_DATAREG)) - { - case BPP_8: - /* Need to look up the color index, just using color 0 for now. */ - break; - - case BPP_15: - r = card->config.colkey_red >> 3; - g = card->config.colkey_green >> 3; - b = card->config.colkey_blue >> 3; - break; - - case BPP_16: - r = card->config.colkey_red >> 3; - g = card->config.colkey_green >> 2; - b = card->config.colkey_blue >> 3; - break; - - case BPP_24: - case BPP_32_DIR: - case BPP_32_PAL: - r = card->config.colkey_red; - g = card->config.colkey_green; - b = card->config.colkey_blue; - break; - } - - // Disable color keying on alpha channel - writeb( XCOLMSK, card->mmio_base + PALWTADD); - writeb( 0x00, card->mmio_base + X_DATAREG); - writeb( X_COLKEY, card->mmio_base + PALWTADD); - writeb( 0x00, card->mmio_base + X_DATAREG); - - - // Set up color key registers - writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); - writeb( r, card->mmio_base + X_DATAREG); - writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); - writeb( g, card->mmio_base + X_DATAREG); - writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); - writeb( b, card->mmio_base + X_DATAREG); - - // Set up color key mask registers - writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); - writeb( 0xff, card->mmio_base + X_DATAREG); - writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); - writeb( 0xff, card->mmio_base + X_DATAREG); - writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); - writeb( 0xff, card->mmio_base + X_DATAREG); - } + } -} + if(!restore){ + writeb( XKEYOPMODE, card->mmio_base + PALWTADD); + writeb( card->config.colkey_on, card->mmio_base + X_DATAREG); + if ( card->config.colkey_on ) + { + uint32_t r=0, g=0, b=0; + + writeb( XMULCTRL, card->mmio_base + PALWTADD); + switch (readb (card->mmio_base + X_DATAREG)) + { + case BPP_8: + /* Need to look up the color index, just using color 0 for now. */ + break; + + case BPP_15: + r = card->config.colkey_red >> 3; + g = card->config.colkey_green >> 3; + b = card->config.colkey_blue >> 3; + break; + + case BPP_16: + r = card->config.colkey_red >> 3; + g = card->config.colkey_green >> 2; + b = card->config.colkey_blue >> 3; + break; + + case BPP_24: + case BPP_32_DIR: + case BPP_32_PAL: + r = card->config.colkey_red; + g = card->config.colkey_green; + b = card->config.colkey_blue; + break; + } + + // Disable color keying on alpha channel + writeb( XCOLMSK, card->mmio_base + PALWTADD); + writeb( 0x00, card->mmio_base + X_DATAREG); + writeb( X_COLKEY, card->mmio_base + PALWTADD); + writeb( 0x00, card->mmio_base + X_DATAREG); + + + // Set up color key registers + writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); + writeb( r, card->mmio_base + X_DATAREG); + writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); + writeb( g, card->mmio_base + X_DATAREG); + writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); + writeb( b, card->mmio_base + X_DATAREG); + + // Set up color key mask registers + writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); + writeb( 0xff, card->mmio_base + X_DATAREG); + writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); + writeb( 0xff, card->mmio_base + X_DATAREG); + writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); + writeb( 0xff, card->mmio_base + X_DATAREG); + } + } + + // Backend Scaler + writel( card->regs.besctl, card->mmio_base + BESCTL); + if(card->is_g400) + writel( card->regs.beslumactl, card->mmio_base + BESLUMACTL); + writel( card->regs.bespitch, card->mmio_base + BESPITCH); + + writel( card->regs.besa1org, card->mmio_base + BESA1ORG); + writel( card->regs.besa1corg, card->mmio_base + BESA1CORG); + writel( card->regs.besa2org, card->mmio_base + BESA2ORG); + writel( card->regs.besa2corg, card->mmio_base + BESA2CORG); + writel( card->regs.besb1org, card->mmio_base + BESB1ORG); + writel( card->regs.besb1corg, card->mmio_base + BESB1CORG); + writel( card->regs.besb2org, card->mmio_base + BESB2ORG); + writel( card->regs.besb2corg, card->mmio_base + BESB2CORG); + if(card->is_g400) + { + writel( card->regs.besa1c3org, card->mmio_base + BESA1C3ORG); + writel( card->regs.besa2c3org, card->mmio_base + BESA2C3ORG); + writel( card->regs.besb1c3org, card->mmio_base + BESB1C3ORG); + writel( card->regs.besb2c3org, card->mmio_base + BESB2C3ORG); + } + + writel( card->regs.beshcoord, card->mmio_base + BESHCOORD); + writel( card->regs.beshiscal, card->mmio_base + BESHISCAL); + writel( card->regs.beshsrcst, card->mmio_base + BESHSRCST); + writel( card->regs.beshsrcend, card->mmio_base + BESHSRCEND); + writel( card->regs.beshsrclst, card->mmio_base + BESHSRCLST); + + writel( card->regs.besvcoord, card->mmio_base + BESVCOORD); + writel( card->regs.besviscal, card->mmio_base + BESVISCAL); - // Backend Scaler - writel( card->regs.besctl, card->mmio_base + BESCTL); - if(card->is_g400) - writel( card->regs.beslumactl, card->mmio_base + BESLUMACTL); - writel( card->regs.bespitch, card->mmio_base + BESPITCH); - - writel( card->regs.besa1org, card->mmio_base + BESA1ORG); - writel( card->regs.besa1corg, card->mmio_base + BESA1CORG); - writel( card->regs.besa2org, card->mmio_base + BESA2ORG); - writel( card->regs.besa2corg, card->mmio_base + BESA2CORG); - writel( card->regs.besb1org, card->mmio_base + BESB1ORG); - writel( card->regs.besb1corg, card->mmio_base + BESB1CORG); - writel( card->regs.besb2org, card->mmio_base + BESB2ORG); - writel( card->regs.besb2corg, card->mmio_base + BESB2CORG); - if(card->is_g400) - { - writel( card->regs.besa1c3org, card->mmio_base + BESA1C3ORG); - writel( card->regs.besa2c3org, card->mmio_base + BESA2C3ORG); - writel( card->regs.besb1c3org, card->mmio_base + BESB1C3ORG); - writel( card->regs.besb2c3org, card->mmio_base + BESB2C3ORG); - } - - writel( card->regs.beshcoord, card->mmio_base + BESHCOORD); - writel( card->regs.beshiscal, card->mmio_base + BESHISCAL); - writel( card->regs.beshsrcst, card->mmio_base + BESHSRCST); - writel( card->regs.beshsrcend, card->mmio_base + BESHSRCEND); - writel( card->regs.beshsrclst, card->mmio_base + BESHSRCLST); - - writel( card->regs.besvcoord, card->mmio_base + BESVCOORD); - writel( card->regs.besviscal, card->mmio_base + BESVISCAL); - - writel( card->regs.besv1srclst, card->mmio_base + BESV1SRCLST); - writel( card->regs.besv1wght, card->mmio_base + BESV1WGHT); - writel( card->regs.besv2srclst, card->mmio_base + BESV2SRCLST); - writel( card->regs.besv2wght, card->mmio_base + BESV2WGHT); - - //update the registers somewhere between 1 and 2 frames from now. - writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), - card->mmio_base + BESGLOBCTL); + writel( card->regs.besv1srclst, card->mmio_base + BESV1SRCLST); + writel( card->regs.besv1wght, card->mmio_base + BESV1WGHT); + writel( card->regs.besv2srclst, card->mmio_base + BESV2SRCLST); + writel( card->regs.besv2wght, card->mmio_base + BESV2WGHT); + + //update the registers somewhere between 1 and 2 frames from now. + writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), + card->mmio_base + BESGLOBCTL); #if 0 - printk(KERN_DEBUG "mga_vid: wrote BES registers\n"); - printk(KERN_DEBUG "mga_vid: BESCTL = 0x%08x\n", - readl(card->mmio_base + BESCTL)); - printk(KERN_DEBUG "mga_vid: BESGLOBCTL = 0x%08x\n", - readl(card->mmio_base + BESGLOBCTL)); - printk(KERN_DEBUG "mga_vid: BESSTATUS= 0x%08x\n", - readl(card->mmio_base + BESSTATUS)); + printk(KERN_DEBUG "mga_vid: wrote BES registers\n"); + printk(KERN_DEBUG "mga_vid: BESCTL = 0x%08x\n", + readl(card->mmio_base + BESCTL)); + printk(KERN_DEBUG "mga_vid: BESGLOBCTL = 0x%08x\n", + readl(card->mmio_base + BESGLOBCTL)); + printk(KERN_DEBUG "mga_vid: BESSTATUS= 0x%08x\n", + readl(card->mmio_base + BESSTATUS)); #endif #ifdef CRTC2 -// printk("c2ctl:0x%08x c2datactl:0x%08x\n", readl(card->mmio_base + C2CTL), readl(card->mmio_base + C2DATACTL)); -// printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); -// printk("c2ctl:0x%08x c2datactl:0x%08x\n", card->cregs.c2ctl, card->cregs.c2datactl); +// printk("c2ctl:0x%08x c2datactl:0x%08x\n", readl(card->mmio_base + C2CTL), readl(card->mmio_base + C2DATACTL)); +// printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); +// printk("c2ctl:0x%08x c2datactl:0x%08x\n", card->cregs.c2ctl, card->cregs.c2datactl); -// writel(card->cregs.c2ctl, card->mmio_base + C2CTL); +// writel(card->cregs.c2ctl, card->mmio_base + C2CTL); - writel(((readl(card->mmio_base + C2CTL) & ~0x03e00000) + (card->cregs.c2ctl & 0x03e00000)), card->mmio_base + C2CTL); - writel(((readl(card->mmio_base + C2DATACTL) & ~0x000000ff) + (card->cregs.c2datactl & 0x000000ff)), card->mmio_base + C2DATACTL); - // ctrc2 - // disable CRTC2 acording to specs -// writel(card->cregs.c2ctl & 0xfffffff0, card->mmio_base + C2CTL); + writel(((readl(card->mmio_base + C2CTL) & ~0x03e00000) + (card->cregs.c2ctl & 0x03e00000)), card->mmio_base + C2CTL); + writel(((readl(card->mmio_base + C2DATACTL) & ~0x000000ff) + (card->cregs.c2datactl & 0x000000ff)), card->mmio_base + C2DATACTL); + // ctrc2 + // disable CRTC2 acording to specs +// writel(card->cregs.c2ctl & 0xfffffff0, card->mmio_base + C2CTL); // je to treba ??? -// writeb((readb(card->mmio_base + XMISCCTRL) & 0x19) | 0xa2, card->mmio_base + XMISCCTRL); // MAFC - mfcsel & vdoutsel -// writeb((readb(card->mmio_base + XMISCCTRL) & 0x19) | 0x92, card->mmio_base + XMISCCTRL); -// writeb((readb(card->mmio_base + XMISCCTRL) & ~0xe9) + 0xa2, card->mmio_base + XMISCCTRL); -// writel(card->cregs.c2datactl, card->mmio_base + C2DATACTL); -// writel(card->cregs.c2hparam, card->mmio_base + C2HPARAM); -// writel(card->cregs.c2hsync, card->mmio_base + C2HSYNC); -// writel(card->cregs.c2vparam, card->mmio_base + C2VPARAM); -// writel(card->cregs.c2vsync, card->mmio_base + C2VSYNC); - writel(card->cregs.c2misc, card->mmio_base + C2MISC); +// writeb((readb(card->mmio_base + XMISCCTRL) & 0x19) | 0xa2, card->mmio_base + XMISCCTRL); // MAFC - mfcsel & vdoutsel +// writeb((readb(card->mmio_base + XMISCCTRL) & 0x19) | 0x92, card->mmio_base + XMISCCTRL); +// writeb((readb(card->mmio_base + XMISCCTRL) & ~0xe9) + 0xa2, card->mmio_base + XMISCCTRL); +// writel(card->cregs.c2datactl, card->mmio_base + C2DATACTL); +// writel(card->cregs.c2hparam, card->mmio_base + C2HPARAM); +// writel(card->cregs.c2hsync, card->mmio_base + C2HSYNC); +// writel(card->cregs.c2vparam, card->mmio_base + C2VPARAM); +// writel(card->cregs.c2vsync, card->mmio_base + C2VSYNC); + writel(card->cregs.c2misc, card->mmio_base + C2MISC); #ifdef MP_DEBUG - printk("c2offset = %d\n",card->cregs.c2offset); + printk("c2offset = %d\n",card->cregs.c2offset); #endif - writel(card->cregs.c2offset, card->mmio_base + C2OFFSET); - writel(card->cregs.c2startadd0, card->mmio_base + C2STARTADD0); -// writel(card->cregs.c2startadd1, card->mmio_base + C2STARTADD1); - writel(card->cregs.c2pl2startadd0, card->mmio_base + C2PL2STARTADD0); -// writel(card->cregs.c2pl2startadd1, card->mmio_base + C2PL2STARTADD1); - writel(card->cregs.c2pl3startadd0, card->mmio_base + C2PL3STARTADD0); -// writel(card->cregs.c2pl3startadd1, card->mmio_base + C2PL3STARTADD1); - writel(card->cregs.c2spicstartadd0, card->mmio_base + C2SPICSTARTADD0); -// writel(card->cregs.c2spicstartadd1, card->mmio_base + C2SPICSTARTADD1); -// writel(card->cregs.c2subpiclut, card->mmio_base + C2SUBPICLUT); -// writel(card->cregs.c2preload, card->mmio_base + C2PRELOAD); - // finaly enable everything -// writel(card->cregs.c2ctl, card->mmio_base + C2CTL); -// printk("c2ctl:0x%08x c2datactl:0x%08x\n",readl(card->mmio_base + C2CTL),readl(card->mmio_base + C2DATACTL)); -// printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); + writel(card->cregs.c2offset, card->mmio_base + C2OFFSET); + writel(card->cregs.c2startadd0, card->mmio_base + C2STARTADD0); +// writel(card->cregs.c2startadd1, card->mmio_base + C2STARTADD1); + writel(card->cregs.c2pl2startadd0, card->mmio_base + C2PL2STARTADD0); +// writel(card->cregs.c2pl2startadd1, card->mmio_base + C2PL2STARTADD1); + writel(card->cregs.c2pl3startadd0, card->mmio_base + C2PL3STARTADD0); +// writel(card->cregs.c2pl3startadd1, card->mmio_base + C2PL3STARTADD1); + writel(card->cregs.c2spicstartadd0, card->mmio_base + C2SPICSTARTADD0); +// writel(card->cregs.c2spicstartadd1, card->mmio_base + C2SPICSTARTADD1); +// writel(card->cregs.c2subpiclut, card->mmio_base + C2SUBPICLUT); +// writel(card->cregs.c2preload, card->mmio_base + C2PRELOAD); + // finaly enable everything +// writel(card->cregs.c2ctl, card->mmio_base + C2CTL); +// printk("c2ctl:0x%08x c2datactl:0x%08x\n",readl(card->mmio_base + C2CTL),readl(card->mmio_base + C2DATACTL)); +// printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); #endif } static int mga_vid_set_config(mga_card_t * card) { - int x, y, sw, sh, dw, dh; - int besleft, bestop, ifactor, ofsleft, ofstop, baseadrofs, weight, weights; - mga_vid_config_t *config = &card->config; - int frame_size = card->config.frame_size; + int x, y, sw, sh, dw, dh; + int besleft, bestop, ifactor, ofsleft, ofstop, baseadrofs, weight, weights; + mga_vid_config_t *config = &card->config; + int frame_size = card->config.frame_size; #ifdef CRTC2 #define right_margin 0 @@ -717,615 +716,609 @@ static int mga_vid_set_config(mga_card_t * card) #define vsync_len 4 #define upper_margin 39 - unsigned int hdispend = (config->src_width + 31) & ~31; - unsigned int hsyncstart = hdispend + (right_margin & ~7); - unsigned int hsyncend = hsyncstart + (hsync_len & ~7); - unsigned int htotal = hsyncend + (left_margin & ~7); - unsigned int vdispend = config->src_height; - unsigned int vsyncstart = vdispend + lower_margin; - unsigned int vsyncend = vsyncstart + vsync_len; - unsigned int vtotal = vsyncend + upper_margin; + unsigned int hdispend = (config->src_width + 31) & ~31; + unsigned int hsyncstart = hdispend + (right_margin & ~7); + unsigned int hsyncend = hsyncstart + (hsync_len & ~7); + unsigned int htotal = hsyncend + (left_margin & ~7); + unsigned int vdispend = config->src_height; + unsigned int vsyncstart = vdispend + lower_margin; + unsigned int vsyncend = vsyncstart + vsync_len; + unsigned int vtotal = vsyncend + upper_margin; #endif - x = config->x_org; - y = config->y_org; - sw = config->src_width; - sh = config->src_height; - dw = config->dest_width; - dh = config->dest_height; + x = config->x_org; + y = config->y_org; + sw = config->src_width; + sh = config->src_height; + dw = config->dest_width; + dh = config->dest_height; #ifdef MP_DEBUG - printk(KERN_DEBUG "mga_vid: Setting up a %dx%d+%d+%d video window (src %dx%d) format %X\n", - dw, dh, x, y, sw, sh, config->format); + printk(KERN_DEBUG "mga_vid: Setting up a %dx%d+%d+%d video window (src %dx%d) format %X\n", + dw, dh, x, y, sw, sh, config->format); #endif - if(sw<4 || sh<4 || dw<4 || dh<4){ - printk(KERN_ERR "mga_vid: Invalid src/dest dimenstions\n"); - return -1; - } + if(sw<4 || sh<4 || dw<4 || dh<4){ + printk(KERN_ERR "mga_vid: Invalid src/dest dimenstions\n"); + return -1; + } - //FIXME check that window is valid and inside desktop + //FIXME check that window is valid and inside desktop - //Setup the BES registers for a three plane 4:2:0 video source + //Setup the BES registers for a three plane 4:2:0 video source - card->regs.besglobctl = 0; + card->regs.besglobctl = 0; -switch(config->format){ + switch(config->format){ case MGA_VID_FORMAT_YV12: case MGA_VID_ |