diff options
author | attila <attila@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-08-31 20:57:34 +0000 |
---|---|---|
committer | attila <attila@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2003-08-31 20:57:34 +0000 |
commit | afe36fd0a5e648b19d0a8c8728e9bd99fee62bb3 (patch) | |
tree | 974c375da548c69d4246624c9c664771649779d9 /drivers/mga_vid.c | |
parent | d169756b83ab07b13602f87054d7e99095dfc34b (diff) | |
download | mpv-afe36fd0a5e648b19d0a8c8728e9bd99fee62bb3.tar.bz2 mpv-afe36fd0a5e648b19d0a8c8728e9bd99fee62bb3.tar.xz |
* Add multi device support.
For the moment up to 16 cards are supported.
More can be added easily by changing 2 defines.
This makes 90% of the patch (mostly stupid s/$var/card->$var/)
The different devices can be accessed by different minor
numbers (0-15):
mknod /dev/mga_vid0 c 178 0
mknod /dev/mga_vid1 c 178 1
mknod /dev/mga_vid2 c 178 2
mknod /dev/mga_vid3 c 178 3
...
ln -s mga_vid /dev/mga_vid
* Change the devfs code to let the kernel assign us
a major and a minor number (what is the sense behind
using devfs anyways if we dont do that ?)
Subdevices for the different cards are created.
mga_vid uses the first card (for compatibility)
* Fix a possible error when mmap() is called before
the card is configured by a ioctl().
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10744 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'drivers/mga_vid.c')
-rw-r--r-- | drivers/mga_vid.c | 1207 |
1 files changed, 650 insertions, 557 deletions
diff --git a/drivers/mga_vid.c b/drivers/mga_vid.c index e24a164267..e187c3c18d 100644 --- a/drivers/mga_vid.c +++ b/drivers/mga_vid.c @@ -3,6 +3,7 @@ // YUY2 support (see config.format) added by A'rpi/ESP-team // double buffering added by A'rpi/ESP-team // brightness/contrast introduced by eyck +// multiple card support by Attila Kinali <attila@kinali.ch> // Set this value, if autodetection fails! (video ram size in megabytes) // #define MGA_MEMORY_SIZE 16 @@ -71,8 +72,6 @@ #define DEFAULT_MGA_VID_MAJOR 178 -//#define MGA_VIDMEM_SIZE mga_ram_size - #ifndef PCI_DEVICE_ID_MATROX_G200_PCI #define PCI_DEVICE_ID_MATROX_G200_PCI 0x0520 #endif @@ -110,10 +109,10 @@ MODULE_LICENSE("GPL"); #define PARAM_CONTRAST "contrast=" #define PARAM_BLACKIE "blackie=" -#define PARAM_BUFF_SIZE 4096 -static uint8_t *mga_param_buff = NULL; -static uint32_t mga_param_buff_size=0; -static uint32_t mga_param_buff_len=0; +// set PARAM_BUFF_SIZE to just below 4k because some kernel versions +// store additional information in the memory page which leads to +// the allocation of an additional page if exactly 4k is used +#define PARAM_BUFF_SIZE 4000 #ifndef min #define min(x,y) (((x)<(y))?(x):(y)) @@ -228,7 +227,6 @@ typedef struct bes_registers_s } bes_registers_t; -static bes_registers_t regs; #ifdef CRTC2 typedef struct crtc2_registers_s { @@ -252,51 +250,11 @@ typedef struct crtc2_registers_s uint32_t c2vparam; uint32_t c2vsync; } crtc2_registers_t; -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 uint32_t mga_top_reserved = 0; // reserved space for console font (matroxfb + fastfont) -static int mga_brightness = 0; // initial brightness -static int mga_contrast = 0; // initial contrast -static int mga_number = 0; // which device/card is taken -static int major = DEFAULT_MGA_VID_MAJOR; - -//static int mga_force_memsize = 0; - -MODULE_PARM(mga_ram_size, "i"); -MODULE_PARM(mga_top_reserved, "i"); -MODULE_PARM(mga_brightness, "i"); -MODULE_PARM(mga_contrast, "i"); -MODULE_PARM(mga_number, "i"); -MODULE_PARM_DESC(mga_number, "selects matrox device/card (0=first)"); -MODULE_PARM(major, "i"); -static struct pci_dev *pci_dev; -static mga_vid_config_t mga_config; - -#ifdef CONFIG_DEVFS_FS -static devfs_handle_t dev_handle = NULL; -#endif - -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; //All register offsets are converted to word aligned offsets (32 bit) //because we want all our register accesses to be 32 bits @@ -390,293 +348,361 @@ static int mga_irq = -1; #define ICLEAR 0x1e18 #define STATUS 0x1e14 -static int mga_next_frame=0; +// global devfs handle for /dev/mga_vid +#ifdef CONFIG_DEVFS_FS +static devfs_handle_t dev_handle = NULL; +#endif + +// card local config +typedef struct mga_card_s { + +// local devfs handle for /dev/mga_vidX +#ifdef CONFIG_DEVFS_FS + 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; #ifdef CRTC2 -static void crtc2_frame_sel(int frame) + crtc2_registers_t cregs; +#endif + 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) + + int brightness; // initial brightness + int contrast; // initial contrast + + struct pci_dev *pci_dev; + + 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 irq; // = -1 + int next_frame; +} mga_card_t; + +#define MGA_MAX_CARDS 16 +// this is used as init value for the parameter arrays +// it should have exactly MGA_MAX_CARDS elements +#define MGA_MAX_CARDS_INIT_ARRAY {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} +static unsigned int mga_cards_num=0; +static mga_card_t * mga_cards[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; + +// module parameters +static int major = DEFAULT_MGA_VID_MAJOR; +static int mga_ram_size[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; +static int mga_brightness[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; +static int mga_contrast[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; +static int mga_top_reserved[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; + +MODULE_PARM(mga_ram_size, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); +MODULE_PARM(mga_top_reserved, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); +MODULE_PARM(mga_brightness, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); +MODULE_PARM(mga_contrast, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); +MODULE_PARM(major, "i"); + +#ifdef CRTC2 +static void crtc2_frame_sel(mga_card_t * card, int frame) { switch(frame) { case 0: - cregs.c2pl2startadd0=regs.besa1corg; - cregs.c2pl3startadd0=regs.besa1c3org; - cregs.c2startadd0=regs.besa1org; + card->cregs.c2pl2startadd0=card->regs.besa1corg; + card->cregs.c2pl3startadd0=card->regs.besa1c3org; + card->cregs.c2startadd0=card->regs.besa1org; break; case 1: - cregs.c2pl2startadd0=regs.besa2corg; - cregs.c2pl3startadd0=regs.besa2c3org; - cregs.c2startadd0=regs.besa2org; + card->cregs.c2pl2startadd0=card->regs.besa2corg; + card->cregs.c2pl3startadd0=card->regs.besa2c3org; + card->cregs.c2startadd0=card->regs.besa2org; break; case 2: - cregs.c2pl2startadd0=regs.besb1corg; - cregs.c2pl3startadd0=regs.besb1c3org; - cregs.c2startadd0=regs.besb1org; + card->cregs.c2pl2startadd0=card->regs.besb1corg; + card->cregs.c2pl3startadd0=card->regs.besb1c3org; + card->cregs.c2startadd0=card->regs.besb1org; break; case 3: - cregs.c2pl2startadd0=regs.besb2corg; - cregs.c2pl3startadd0=regs.besb2c3org; - cregs.c2startadd0=regs.besb2org; + card->cregs.c2pl2startadd0=card->regs.besb2corg; + card->cregs.c2pl3startadd0=card->regs.besb2c3org; + card->cregs.c2startadd0=card->regs.besb2org; break; } - writel(cregs.c2startadd0, mga_mmio_base + C2STARTADD0); - writel(cregs.c2pl2startadd0, mga_mmio_base + C2PL2STARTADD0); - writel(cregs.c2pl3startadd0, mga_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(int frame) +static void mga_vid_frame_sel(mga_card_t * card, int frame) { - if ( mga_irq != -1 ) { - mga_next_frame=frame; + if ( card->irq != -1 ) { + 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) - regs.besctl = (regs.besctl & ~0x07000000) + (frame << 25); - writel( regs.besctl, mga_mmio_base + BESCTL ); + card->regs.besctl = (card->regs.besctl & ~0x07000000) + (frame << 25); + writel( card->regs.besctl, card->mmio_base + BESCTL ); -// writel( regs.besglobctl + ((readl(mga_mmio_base + VCOUNT)+2)<<16), - writel( regs.besglobctl + (MGA_VSYNC_POS<<16), - mga_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(frame); + crtc2_frame_sel(card, frame); #endif } } -static void mga_vid_write_regs(int restore) +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(mga_mmio_base + VCOUNT)-1)<<16, - mga_mmio_base + BESGLOBCTL); + writel( (readl(card->mmio_base + VCOUNT)-1)<<16, + card->mmio_base + BESGLOBCTL); // color or coordinate keying - if(restore && colkey_saved){ + if(restore && card->colkey_saved){ // restore it - colkey_saved=0; + card->colkey_saved=0; #ifdef MP_DEBUG printk("mga_vid: Restoring colorkey (ON: %d %02X:%02X:%02X)\n", - colkey_on,colkey_color[0],colkey_color[1],colkey_color[2]); + card->colkey_on,card->colkey_color[0],card->colkey_color[1],card->colkey_color[2]); #endif // Set color key registers: - writeb( XKEYOPMODE, mga_mmio_base + PALWTADD); - writeb( colkey_on, mga_mmio_base + X_DATAREG); + writeb( XKEYOPMODE, card->mmio_base + PALWTADD); + writeb( card->colkey_on, card->mmio_base + X_DATAREG); - writeb( XCOLKEY0RED, mga_mmio_base + PALWTADD); - writeb( colkey_color[0], mga_mmio_base + X_DATAREG); - writeb( XCOLKEY0GREEN, mga_mmio_base + PALWTADD); - writeb( colkey_color[1], mga_mmio_base + X_DATAREG); - writeb( XCOLKEY0BLUE, mga_mmio_base + PALWTADD); - writeb( colkey_color[2], mga_mmio_base + X_DATAREG); - writeb( X_COLKEY, mga_mmio_base + PALWTADD); - writeb( colkey_color[3], mga_mmio_base + X_DATAREG); - - writeb( XCOLMSK0RED, mga_mmio_base + PALWTADD); - writeb( colkey_mask[0], mga_mmio_base + X_DATAREG); - writeb( XCOLMSK0GREEN, mga_mmio_base + PALWTADD); - writeb( colkey_mask[1], mga_mmio_base + X_DATAREG); - writeb( XCOLMSK0BLUE, mga_mmio_base + PALWTADD); - writeb( colkey_mask[2], mga_mmio_base + X_DATAREG); - writeb( XCOLMSK, mga_mmio_base + PALWTADD); - writeb( colkey_mask[3], mga_mmio_base + X_DATAREG); - - } else if(!colkey_saved){ + 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 - colkey_saved=1; + card->colkey_saved=1; // Get color key registers: - writeb( XKEYOPMODE, mga_mmio_base + PALWTADD); - colkey_on=(unsigned char)readb(mga_mmio_base + X_DATAREG) & 1; + writeb( XKEYOPMODE, card->mmio_base + PALWTADD); + card->colkey_on=(unsigned char)readb(card->mmio_base + X_DATAREG) & 1; - writeb( XCOLKEY0RED, mga_mmio_base + PALWTADD); - colkey_color[0]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - writeb( XCOLKEY0GREEN, mga_mmio_base + PALWTADD); - colkey_color[1]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - writeb( XCOLKEY0BLUE, mga_mmio_base + PALWTADD); - colkey_color[2]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - writeb( X_COLKEY, mga_mmio_base + PALWTADD); - colkey_color[3]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - - writeb( XCOLMSK0RED, mga_mmio_base + PALWTADD); - colkey_mask[0]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - writeb( XCOLMSK0GREEN, mga_mmio_base + PALWTADD); - colkey_mask[1]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - writeb( XCOLMSK0BLUE, mga_mmio_base + PALWTADD); - colkey_mask[2]=(unsigned char)readb(mga_mmio_base + X_DATAREG); - writeb( XCOLMSK, mga_mmio_base + PALWTADD); - colkey_mask[3]=(unsigned char)readb(mga_mmio_base + X_DATAREG); + 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", - colkey_on,colkey_color[0],colkey_color[1],colkey_color[2]); + card->colkey_on, card->colkey_color[0], card->colkey_color[1], card->colkey_color[2]); #endif } if(!restore){ - writeb( XKEYOPMODE, mga_mmio_base + PALWTADD); - writeb( mga_config.colkey_on, mga_mmio_base + X_DATAREG); - if ( mga_config.colkey_on ) + 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, mga_mmio_base + PALWTADD); - switch (readb (mga_mmio_base + X_DATAREG)) + 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. */ + /* Need to look up the color index, just using color 0 for now. */ break; case BPP_15: - r = mga_config.colkey_red >> 3; - g = mga_config.colkey_green >> 3; - b = mga_config.colkey_blue >> 3; + r = card->config.colkey_red >> 3; + g = card->config.colkey_green >> 3; + b = card->config.colkey_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 = 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 = mga_config.colkey_red; - g = mga_config.colkey_green; - b = mga_config.colkey_blue; + r = card->config.colkey_red; + g = card->config.colkey_green; + b = card->config.colkey_blue; break; } // Disable color keying on alpha channel - writeb( XCOLMSK, mga_mmio_base + PALWTADD); - writeb( 0x00, mga_mmio_base + X_DATAREG); - writeb( X_COLKEY, mga_mmio_base + PALWTADD); - writeb( 0x00, mga_mmio_base + X_DATAREG); + 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, mga_mmio_base + PALWTADD); - writeb( r, mga_mmio_base + X_DATAREG); - writeb( XCOLKEY0GREEN, mga_mmio_base + PALWTADD); - writeb( g, mga_mmio_base + X_DATAREG); - writeb( XCOLKEY0BLUE, mga_mmio_base + PALWTADD); - writeb( b, mga_mmio_base + X_DATAREG); + 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, mga_mmio_base + PALWTADD); - writeb( 0xff, mga_mmio_base + X_DATAREG); - writeb( XCOLMSK0GREEN, mga_mmio_base + PALWTADD); - writeb( 0xff, mga_mmio_base + X_DATAREG); - writeb( XCOLMSK0BLUE, mga_mmio_base + PALWTADD); - writeb( 0xff, mga_mmio_base + X_DATAREG); + 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( regs.besctl, mga_mmio_base + BESCTL); - if(is_g400) - writel( regs.beslumactl, mga_mmio_base + BESLUMACTL); - writel( regs.bespitch, mga_mmio_base + BESPITCH); - - writel( regs.besa1org, mga_mmio_base + BESA1ORG); - writel( regs.besa1corg, mga_mmio_base + BESA1CORG); - writel( regs.besa2org, mga_mmio_base + BESA2ORG); - writel( regs.besa2corg, mga_mmio_base + BESA2CORG); - writel( regs.besb1org, mga_mmio_base + BESB1ORG); - writel( regs.besb1corg, mga_mmio_base + BESB1CORG); - writel( regs.besb2org, mga_mmio_base + BESB2ORG); - writel( regs.besb2corg, mga_mmio_base + BESB2CORG); - if(is_g400) + 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( regs.besa1c3org, mga_mmio_base + BESA1C3ORG); - writel( regs.besa2c3org, mga_mmio_base + BESA2C3ORG); - writel( regs.besb1c3org, mga_mmio_base + BESB1C3ORG); - writel( regs.besb2c3org, mga_mmio_base + BESB2C3ORG); + 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( regs.beshcoord, mga_mmio_base + BESHCOORD); - writel( regs.beshiscal, mga_mmio_base + BESHISCAL); - writel( regs.beshsrcst, mga_mmio_base + BESHSRCST); - writel( regs.beshsrcend, mga_mmio_base + BESHSRCEND); - writel( regs.beshsrclst, mga_mmio_base + BESHSRCLST); + 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( regs.besvcoord, mga_mmio_base + BESVCOORD); - writel( regs.besviscal, mga_mmio_base + BESVISCAL); + writel( card->regs.besvcoord, card->mmio_base + BESVCOORD); + writel( card->regs.besviscal, card->mmio_base + BESVISCAL); - writel( regs.besv1srclst, mga_mmio_base + BESV1SRCLST); - writel( regs.besv1wght, mga_mmio_base + BESV1WGHT); - writel( regs.besv2srclst, mga_mmio_base + BESV2SRCLST); - writel( regs.besv2wght, mga_mmio_base + BESV2WGHT); + 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( regs.besglobctl + ((readl(mga_mmio_base + VCOUNT)+2)<<16), - mga_mmio_base + BESGLOBCTL); + 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(mga_mmio_base + BESCTL)); + readl(card->mmio_base + BESCTL)); printk(KERN_DEBUG "mga_vid: BESGLOBCTL = 0x%08x\n", - readl(mga_mmio_base + BESGLOBCTL)); + readl(card->mmio_base + BESGLOBCTL)); printk(KERN_DEBUG "mga_vid: BESSTATUS= 0x%08x\n", - readl(mga_mmio_base + BESSTATUS)); + readl(card->mmio_base + BESSTATUS)); #endif #ifdef CRTC2 -// printk("c2ctl:0x%08x c2datactl:0x%08x\n",readl(mga_mmio_base + C2CTL),readl(mga_mmio_base + C2DATACTL)); -// printk("c2misc:0x%08x\n",readl(mga_mmio_base + C2MISC)); -// printk("c2ctl:0x%08x c2datactl:0x%08x\n",cregs.c2ctl,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(cregs.c2ctl, mga_mmio_base + C2CTL); +// writel(card->cregs.c2ctl, card->mmio_base + C2CTL); - writel(((readl(mga_mmio_base + C2CTL) & ~0x03e00000) + (cregs.c2ctl & 0x03e00000)), mga_mmio_base + C2CTL); - writel(((readl(mga_mmio_base + C2DATACTL) & ~0x000000ff) + (cregs.c2datactl & 0x000000ff)), mga_mmio_base + C2DATACTL); + 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(cregs.c2ctl & 0xfffffff0, mga_mmio_base + C2CTL); +// writel(card->cregs.c2ctl & 0xfffffff0, card->mmio_base + C2CTL); // je to treba ??? -// writeb((readb(mga_mmio_base + XMISCCTRL) & 0x19) | 0xa2, mga_mmio_base + XMISCCTRL); // MAFC - mfcsel & vdoutsel -// writeb((readb(mga_mmio_base + XMISCCTRL) & 0x19) | 0x92, mga_mmio_base + XMISCCTRL); -// writeb((readb(mga_mmio_base + XMISCCTRL) & ~0xe9) + 0xa2, mga_mmio_base + XMISCCTRL); -// writel(cregs.c2datactl, mga_mmio_base + C2DATACTL); -// writel(cregs.c2hparam, mga_mmio_base + C2HPARAM); -// writel(cregs.c2hsync, mga_mmio_base + C2HSYNC); -// writel(cregs.c2vparam, mga_mmio_base + C2VPARAM); -// writel(cregs.c2vsync, mga_mmio_base + C2VSYNC); - writel(cregs.c2misc, mga_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",cregs.c2offset); + printk("c2offset = %d\n",card->cregs.c2offset); #endif - writel(cregs.c2offset, mga_mmio_base + C2OFFSET); - writel(cregs.c2startadd0, mga_mmio_base + C2STARTADD0); -// writel(cregs.c2startadd1, mga_mmio_base + C2STARTADD1); - writel(cregs.c2pl2startadd0, mga_mmio_base + C2PL2STARTADD0); -// writel(cregs.c2pl2startadd1, mga_mmio_base + C2PL2STARTADD1); - writel(cregs.c2pl3startadd0, mga_mmio_base + C2PL3STARTADD0); -// writel(cregs.c2pl3startadd1, mga_mmio_base + C2PL3STARTADD1); - writel(cregs.c2spicstartadd0, mga_mmio_base + C2SPICSTARTADD0); -// writel(cregs.c2spicstartadd1, mga_mmio_base + C2SPICSTARTADD1); -// writel(cregs.c2subpiclut, mga_mmio_base + C2SUBPICLUT); -// writel(cregs.c2preload, mga_mmio_base + C2PRELOAD); + 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(cregs.c2ctl, mga_mmio_base + C2CTL); -// printk("c2ctl:0x%08x c2datactl:0x%08x\n",readl(mga_mmio_base + C2CTL),readl(mga_mmio_base + C2DATACTL)); -// printk("c2misc:0x%08x\n", readl(mga_mmio_base + C2MISC)); +// 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_vid_config_t *config) +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; - int frame_size=config->frame_size; + mga_vid_config_t *config = &card->config; + int frame_size = card->config.frame_size; + #ifdef CRTC2 #define right_margin 0 #define left_margin 18 @@ -713,21 +739,15 @@ static int mga_vid_set_config(mga_vid_config_t *config) //FIXME check that window is valid and inside desktop - //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 - regs.besglobctl = 0; + card->regs.besglobctl = 0; switch(config->format){ case MGA_VID_FORMAT_YV12: case MGA_VID_FORMAT_I420: case MGA_VID_FORMAT_IYUV: - regs.besctl = 1 // BES enabled + card->regs.besctl = 1 // BES enabled + (0<<6) // even start polarity + (1<<10) // x filtering enabled + (1<<11) // y filtering enabled @@ -735,23 +755,23 @@ switch(config->format){ + (1<<17) // 4:2:0 mode + (1<<18); // dither enabled #if 0 - if(is_g400) + if(card->is_g400) { //zoom disabled, zoom filter disabled, 420 3 plane format, proc amp //disabled, rgb mode disabled - regs.besglobctl = (1<<5); + card->regs.besglobctl = (1<<5); } else { //zoom disabled, zoom filter disabled, Cb samples in 0246, Cr //in 1357, BES register update on besvcnt - regs.besglobctl = 0; + card->regs.besglobctl = 0; } #endif break; case MGA_VID_FORMAT_YUY2: - regs.besctl = 1 // BES enabled + card->regs.besctl = 1 // BES enabled + (0<<6) // even start polarity + (1<<10) // x filtering enabled + (1<<11) // y filtering enabled @@ -759,11 +779,11 @@ switch(config->format){ + (0<<17) // 4:2:2 mode + (1<<18); // dither enabled - regs.besglobctl = 0; // YUY2 format selected + card->regs.besglobctl = 0; // YUY2 format selected break; case MGA_VID_FORMAT_UYVY: - regs.besctl = 1 // BES enabled + card->regs.besctl = 1 // BES enabled + (0<<6) // even start polarity + (1<<10) // x filtering enabled + (1<<11) // y filtering enabled @@ -771,7 +791,7 @@ switch(config->format){ + (0<<17) // 4:2:2 mode + (1<<18); // dither enabled - regs.besglobctl = 1<<6; // UYVY format selected + card->regs.besglobctl = 1<<6; // UYVY format selected break; default: @@ -780,81 +800,81 @@ switch(config->format){ } // setting black&white mode - regs.besctl|=(regs.blackie<<20); + card->regs.besctl|=(card->regs.blackie<<20); //Enable contrast and brightness control - regs.besglobctl |= (1<<5) + (1<<7); + card->regs.besglobctl |= (1<<5) + (1<<7); // brightness (-128..127) && contrast (0..255) - regs.beslumactl = (mga_brightness << 16) | ((mga_contrast+0x80)&0xFFFF); + card->regs.beslumactl = (card->brightness << 16) | ((card->contrast+0x80)&0xFFFF); //Setup destination window boundaries besleft = x > 0 ? x : 0; bestop = y > 0 ? y : 0; - regs.beshcoord = (besleft<<16) + (x + dw-1); - regs.besvcoord = (bestop<<16) + (y + dh-1); + card->regs.beshcoord = (besleft<<16) + (x + dw-1); + card->regs.besvcoord = (bestop<<16) + (y + dh-1); //Setup source dimensions - regs.beshsrclst = (sw - 1) << 16; - regs.bespitch = (sw + 31) & ~31 ; + card->regs.beshsrclst = (sw - 1) << 16; + card->regs.bespitch = (sw + 31) & ~31 ; //Setup horizontal scaling ifactor = ((sw-1)<<14)/(dw-1); ofsleft = besleft - x; - regs.beshiscal = ifactor<<2; - regs.beshsrcst = (ofsleft*ifactor)<<2; - regs.beshsrcend = regs.beshsrcst + (((dw - ofsleft - 1) * ifactor) << 2); + card->regs.beshiscal = ifactor<<2; + card->regs.beshsrcst = (ofsleft*ifactor)<<2; + card->regs.beshsrcend = card->regs.beshsrcst + (((dw - ofsleft - 1) * ifactor) << 2); //Setup vertical scaling ifactor = ((sh-1)<<14)/(dh-1); ofstop = bestop - y; - regs.besviscal = ifactor<<2; + card->regs.besviscal = ifactor<<2; - baseadrofs = ((ofstop*regs.besviscal)>>16)*regs.bespitch; + baseadrofs = ( (ofstop * card->regs.besviscal) >>16) * card->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; + card->regs.besa1org = (uint32_t) card->src_base + baseadrofs; + card->regs.besa2org = (uint32_t) card->src_base + baseadrofs + 1*frame_size; + card->regs.besb1org = (uint32_t) card->src_base + baseadrofs + 2*frame_size; + card->regs.besb2org = (uint32_t) card->src_base + baseadrofs + 3*frame_size; if(config->format==MGA_VID_FORMAT_YV12 ||config->format==MGA_VID_FORMAT_IYUV ||config->format==MGA_VID_FORMAT_I420 ){ // planar YUV frames: - if (is_g400) - baseadrofs = (((ofstop*regs.besviscal)/4)>>16)*regs.bespitch; + if (card->is_g400) + baseadrofs = ( ( (ofstop * card->regs.besviscal ) / 4 ) >> 16 ) * card->regs.bespitch; else - baseadrofs = (((ofstop*regs.besviscal)/2)>>16)*regs.bespitch; - - if(config->format==MGA_VID_FORMAT_YV12 || !is_g400){ - 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.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); + baseadrofs = ( ( ( ofstop * card->regs.besviscal ) / 2 ) >> 16 ) * card->regs.bespitch; + + if(config->format==MGA_VID_FORMAT_YV12 || !card->is_g400){ + card->regs.besa1corg = (uint32_t) card->src_base + baseadrofs + card->regs.bespitch * sh ; + card->regs.besa2corg = (uint32_t) card->src_base + baseadrofs + 1*frame_size + card->regs.bespitch * sh; + card->regs.besb1corg = (uint32_t) card->src_base + baseadrofs + 2*frame_size + card->regs.bespitch * sh; + card->regs.besb2corg = (uint32_t) card->src_base + baseadrofs + 3*frame_size + card->regs.bespitch * sh; + card->regs.besa1c3org = card->regs.besa1corg + ( (card->regs.bespitch * sh) / 4); + card->regs.besa2c3org = card->regs.besa2corg + ( (card->regs.bespitch * sh) / 4); + card->regs.besb1c3org = card->regs.besb1corg + ( (card->regs.bespitch * sh) / 4); + card->regs.besb2c3org = card->regs.besb2corg + ( (card->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.besa1corg = regs.besa1c3org + ((regs.bespitch * sh) / 4); - regs.besa2corg = regs.besa2c3org + ((regs.bespitch * sh) / 4); - regs.besb1corg = regs.besb1c3org + ((regs.bespitch * sh) / 4); - regs.besb2corg = regs.besb2c3org + ((regs.bespitch * sh) / 4); + card->regs.besa1c3org = (uint32_t) card->src_base + baseadrofs + card->regs.bespitch * sh ; + card->regs.besa2c3org = (uint32_t) card->src_base + baseadrofs + 1*frame_size + card->regs.bespitch * sh; + card->regs.besb1c3org = (uint32_t) card->src_base + baseadrofs + 2*frame_size + card->regs.bespitch * sh; + card->regs.besb2c3org = (uint32_t) card->src_base + baseadrofs + 3*frame_size + card->regs.bespitch * sh; + card->regs.besa1corg = card->regs.besa1c3org + ((card->regs.bespitch * sh) / 4); + card->regs.besa2corg = card->regs.besa2c3org + ((card->regs.bespitch * sh) / 4); + card->regs.besb1corg = card->regs.besb1c3org + ((card->regs.bespitch * sh) / 4); + card->regs.besb2corg = card->regs.besb2c3org + ((card->regs.bespitch * sh) / 4); } } - weight = ofstop * (regs.besviscal >> 2); + weight = ofstop * (card->regs.besviscal >> 2); weights = weight < 0 ? 1 : 0; - regs.besv2wght = regs.besv1wght = (weights << 16) + ((weight & 0x3FFF) << 2); - regs.besv2srclst = regs.besv1srclst = sh - 1 - (((ofstop * regs.besviscal) >> 16) & 0x03FF); + card->regs.besv2wght = card->regs.besv1wght = (weights << 16) + ((weight & 0x3FFF) << 2); + card->regs.besv2srclst = card->regs.besv1srclst = sh - 1 - (((ofstop * card->regs.besviscal) >> 16) & 0x03FF); #ifdef CRTC2 // pridat hlavni registry - tj. casovani ... @@ -864,7 +884,7 @@ switch(config->format){ case MGA_VID_FORMAT_YV12: case MGA_VID_FORMAT_I420: case MGA_VID_FORMAT_IYUV: - cregs.c2ctl = 1 // CRTC2 enabled + card->cregs.c2ctl = 1 // CRTC2 enabled + (1<<1) // external clock + (0<<2) // external clock + (1<<3) // pixel clock enable - not needed ??? @@ -887,7 +907,7 @@ switch(config->format){ + (1<<30) // Horizontal counter preload + (1<<31) // Vertical counter preload ; - cregs.c2datactl = 1 // disable dither - propably not needed, we are already in YUV mode + card->cregs.c2datactl = 1 // disable dither - propably not needed, we are already in YUV mode + (1<<1) // Y filter enable + (1<<2) // CbCr filter enable + (0<<3) // subpicture enable (disabled) |