📄 matroxfb_base.c
字号:
if (ACCESS_FBINFO(dead)) return 1; switch (blank) { case 1: seq = 0x20; crtc = 0x00; break; /* works ??? */ case 2: seq = 0x20; crtc = 0x10; break; case 3: seq = 0x20; crtc = 0x20; break; case 4: seq = 0x20; crtc = 0x30; break; default: seq = 0x00; crtc = 0x00; break; } CRITBEGIN mga_outb(M_SEQ_INDEX, 1); mga_outb(M_SEQ_DATA, (mga_inb(M_SEQ_DATA) & ~0x20) | seq); mga_outb(M_EXTVGA_INDEX, 1); mga_outb(M_EXTVGA_DATA, (mga_inb(M_EXTVGA_DATA) & ~0x30) | crtc); CRITEND return 0;#undef minfo}static void matroxfb_blank24(int blank, struct fb_info *info){ matroxfb_blank(blank, info);}static struct fb_ops matroxfb_ops = { owner: THIS_MODULE, fb_open: matroxfb_open, fb_release: matroxfb_release, fb_get_fix: matroxfb_get_fix, fb_get_var: matroxfb_get_var, fb_set_var: matroxfb_set_var, fb_get_cmap: matroxfb_get_cmap, fb_set_cmap: matroxfb_set_cmap, fb_pan_display: matroxfb_pan_display, fb_ioctl: matroxfb_ioctl,};int matroxfb_switch(int con, struct fb_info *info){#define minfo (list_entry(info, struct matrox_fb_info, fbcon)) struct fb_cmap* cmap; struct display *p; DBG("matroxfb_switch"); if (ACCESS_FBINFO(currcon) >= 0) { /* Do we have to save the colormap? */ cmap = &(ACCESS_FBINFO(currcon_display)->cmap); dprintk(KERN_DEBUG "switch1: con = %d, cmap.len = %d\n", ACCESS_FBINFO(currcon), cmap->len); if (cmap->len) { dprintk(KERN_DEBUG "switch1a: %p %p %p %p\n", cmap->red, cmap->green, cmap->blue, cmap->transp); fb_get_cmap(cmap, 1, matrox_getcolreg, info);#ifdef DEBUG if (cmap->red) { dprintk(KERN_DEBUG "switch1r: %X\n", cmap->red[0]); }#endif } } ACCESS_FBINFO(currcon) = con; if (con < 0) p = ACCESS_FBINFO(fbcon.disp); else p = fb_display + con; ACCESS_FBINFO(currcon_display) = p; p->var.activate = FB_ACTIVATE_NOW;#ifdef DEBUG cmap = &p->cmap; dprintk(KERN_DEBUG "switch2: con = %d, cmap.len = %d\n", con, cmap->len); dprintk(KERN_DEBUG "switch2a: %p %p %p %p\n", cmap->red, cmap->green, cmap->blue, cmap->transp); if (p->cmap.red) { dprintk(KERN_DEBUG "switch2r: %X\n", cmap->red[0]); }#endif matroxfb_set_var(&p->var, con, info);#ifdef DEBUG dprintk(KERN_DEBUG "switch3: con = %d, cmap.len = %d\n", con, cmap->len); dprintk(KERN_DEBUG "switch3a: %p %p %p %p\n", cmap->red, cmap->green, cmap->blue, cmap->transp); if (p->cmap.red) { dprintk(KERN_DEBUG "switch3r: %X\n", cmap->red[0]); }#endif return 0;#undef minfo}#define RSDepth(X) (((X) >> 8) & 0x0F)#define RS8bpp 0x1#define RS15bpp 0x2#define RS16bpp 0x3#define RS32bpp 0x4#define RS4bpp 0x5#define RS24bpp 0x6#define RSText 0x7#define RSText8 0x8/* 9-F */static struct { struct fb_bitfield red, green, blue, transp; int bits_per_pixel; } colors[] = { { { 0, 8, 0}, { 0, 8, 0}, { 0, 8, 0}, { 0, 0, 0}, 8 }, { { 10, 5, 0}, { 5, 5, 0}, { 0, 5, 0}, { 15, 1, 0}, 16 }, { { 11, 5, 0}, { 5, 6, 0}, { 0, 5, 0}, { 0, 0, 0}, 16 }, { { 16, 8, 0}, { 8, 8, 0}, { 0, 8, 0}, { 24, 8, 0}, 32 }, { { 0, 8, 0}, { 0, 8, 0}, { 0, 8, 0}, { 0, 0, 0}, 4 }, { { 16, 8, 0}, { 8, 8, 0}, { 0, 8, 0}, { 0, 0, 0}, 24 }, { { 0, 6, 0}, { 0, 6, 0}, { 0, 6, 0}, { 0, 0, 0}, 0 }, /* textmode with (default) VGA8x16 */ { { 0, 6, 0}, { 0, 6, 0}, { 0, 6, 0}, { 0, 0, 0}, 0 }, /* textmode hardwired to VGA8x8 */};/* initialized by setup, see explanation at end of file (search for MODULE_PARM_DESC) */static unsigned int mem; /* "matrox:mem:xxxxxM" */static int option_precise_width = 1; /* cannot be changed, option_precise_width==0 must imply noaccel */static int inv24; /* "matrox:inv24" */static int cross4MB = -1; /* "matrox:cross4MB" */static int disabled; /* "matrox:disabled" */static int noaccel; /* "matrox:noaccel" */static int nopan; /* "matrox:nopan" */static int no_pci_retry; /* "matrox:nopciretry" */static int novga; /* "matrox:novga" */static int nobios; /* "matrox:nobios" */static int noinit = 1; /* "matrox:init" */static int inverse; /* "matrox:inverse" */static int hwcursor = 1; /* "matrox:nohwcursor" */static int blink = 1; /* "matrox:noblink" */static int sgram; /* "matrox:sgram" */#ifdef CONFIG_MTRRstatic int mtrr = 1; /* "matrox:nomtrr" */#endifstatic int grayscale; /* "matrox:grayscale" */static unsigned int fastfont; /* "matrox:fastfont:xxxxx" */static int dev = -1; /* "matrox:dev:xxxxx" */static unsigned int vesa = ~0; /* "matrox:vesa:xxxxx" */static int depth = -1; /* "matrox:depth:xxxxx" */static unsigned int xres; /* "matrox:xres:xxxxx" */static unsigned int yres; /* "matrox:yres:xxxxx" */static unsigned int upper = ~0; /* "matrox:upper:xxxxx" */static unsigned int lower = ~0; /* "matrox:lower:xxxxx" */static unsigned int vslen; /* "matrox:vslen:xxxxx" */static unsigned int left = ~0; /* "matrox:left:xxxxx" */static unsigned int right = ~0; /* "matrox:right:xxxxx" */static unsigned int hslen; /* "matrox:hslen:xxxxx" */static unsigned int pixclock; /* "matrox:pixclock:xxxxx" */static int sync = -1; /* "matrox:sync:xxxxx" */static unsigned int fv; /* "matrox:fv:xxxxx" */static unsigned int fh; /* "matrox:fh:xxxxxk" */static unsigned int maxclk; /* "matrox:maxclk:xxxxM" */static int dfp; /* "matrox:dfp */static int dfp_type = -1; /* "matrox:dfp:xxx */static int memtype = -1; /* "matrox:memtype:xxx" */static char fontname[64]; /* "matrox:font:xxxxx" */#ifndef MODULEstatic char videomode[64]; /* "matrox:mode:xxxxx" or "matrox:xxxxx" */#endifstatic int matroxfb_getmemory(WPMINFO unsigned int maxSize, unsigned int *realSize){ vaddr_t vm; unsigned int offs; unsigned int offs2; unsigned char store; unsigned char bytes[32]; unsigned char* tmp; DBG("matroxfb_getmemory") vm = ACCESS_FBINFO(video.vbase); maxSize &= ~0x1FFFFF; /* must be X*2MB (really it must be 2 or X*4MB) */ /* at least 2MB */ if (maxSize < 0x0200000) return 0; if (maxSize > 0x2000000) maxSize = 0x2000000; mga_outb(M_EXTVGA_INDEX, 0x03); mga_outb(M_EXTVGA_DATA, mga_inb(M_EXTVGA_DATA) | 0x80); store = mga_readb(vm, 0x1234); tmp = bytes; for (offs = 0x100000; offs < maxSize; offs += 0x200000) *tmp++ = mga_readb(vm, offs); for (offs = 0x100000; offs < maxSize; offs += 0x200000) mga_writeb(vm, offs, 0x02); if (ACCESS_FBINFO(features.accel.has_cacheflush)) mga_outb(M_CACHEFLUSH, 0x00); else mga_writeb(vm, 0x1234, 0x99); for (offs = 0x100000; offs < maxSize; offs += 0x200000) { if (mga_readb(vm, offs) != 0x02) break; mga_writeb(vm, offs, mga_readb(vm, offs) - 0x02); if (mga_readb(vm, offs)) break; } tmp = bytes; for (offs2 = 0x100000; offs2 < maxSize; offs2 += 0x200000) mga_writeb(vm, offs2, *tmp++); mga_writeb(vm, 0x1234, store); mga_outb(M_EXTVGA_INDEX, 0x03); mga_outb(M_EXTVGA_DATA, mga_inb(M_EXTVGA_DATA) & ~0x80); *realSize = offs - 0x100000;#ifdef CONFIG_FB_MATROX_MILLENIUM ACCESS_FBINFO(interleave) = !(!isMillenium(MINFO) || ((offs - 0x100000) & 0x3FFFFF));#endif return 1;}struct video_board { int maxvram; int maxdisplayable; int accelID; struct matrox_switch* lowlevel; };#ifdef CONFIG_FB_MATROX_MILLENIUMstatic struct video_board vbMillennium = {0x0800000, 0x0800000, FB_ACCEL_MATROX_MGA2064W, &matrox_millennium};static struct video_board vbMillennium2 = {0x1000000, 0x0800000, FB_ACCEL_MATROX_MGA2164W, &matrox_millennium};static struct video_board vbMillennium2A = {0x1000000, 0x0800000, FB_ACCEL_MATROX_MGA2164W_AGP, &matrox_millennium};#endif /* CONFIG_FB_MATROX_MILLENIUM */#ifdef CONFIG_FB_MATROX_MYSTIQUEstatic struct video_board vbMystique = {0x0800000, 0x0800000, FB_ACCEL_MATROX_MGA1064SG, &matrox_mystique};#endif /* CONFIG_FB_MATROX_MYSTIQUE */#ifdef CONFIG_FB_MATROX_G100static struct video_board vbG100 = {0x0800000, 0x0800000, FB_ACCEL_MATROX_MGAG100, &matrox_G100};static struct video_board vbG200 = {0x1000000, 0x1000000, FB_ACCEL_MATROX_MGAG200, &matrox_G100};#ifdef CONFIG_FB_MATROX_32MB/* from doc it looks like that accelerator can draw only to low 16MB :-( Direct accesses & displaying are OK for whole 32MB */static struct video_board vbG400 = {0x2000000, 0x1000000, FB_ACCEL_MATROX_MGAG400, &matrox_G100};#elsestatic struct video_board vbG400 = {0x2000000, 0x1000000, FB_ACCEL_MATROX_MGAG400, &matrox_G100};#endif#endif#define DEVF_VIDEO64BIT 0x0001#define DEVF_SWAPS 0x0002#define DEVF_SRCORG 0x0004#define DEVF_DUALHEAD 0x0008#define DEVF_CROSS4MB 0x0010#define DEVF_TEXT4B 0x0020/* #define DEVF_recycled 0x0040 *//* #define DEVF_recycled 0x0080 */#define DEVF_SUPPORT32MB 0x0100#define DEVF_ANY_VXRES 0x0200#define DEVF_TEXT16B 0x0400#define DEVF_CRTC2 0x0800#define DEVF_MAVEN_CAPABLE 0x1000#define DEVF_PANELLINK_CAPABLE 0x2000#define DEVF_G450DAC 0x4000#define DEVF_GCORE (DEVF_VIDEO64BIT | DEVF_SWAPS | DEVF_CROSS4MB)#define DEVF_G2CORE (DEVF_GCORE | DEVF_ANY_VXRES | DEVF_MAVEN_CAPABLE | DEVF_PANELLINK_CAPABLE | DEVF_SRCORG | DEVF_DUALHEAD)#define DEVF_G100 (DEVF_GCORE) /* no doc, no vxres... */#define DEVF_G200 (DEVF_G2CORE)#define DEVF_G400 (DEVF_G2CORE | DEVF_SUPPORT32MB | DEVF_TEXT16B | DEVF_CRTC2)/* if you'll find how to drive DFP... */#define DEVF_G450 (DEVF_GCORE | DEVF_ANY_VXRES | DEVF_SUPPORT32MB | DEVF_TEXT16B | DEVF_CRTC2 | DEVF_G450DAC | DEVF_SRCORG | DEVF_DUALHEAD)#define DEVF_G550 (DEVF_G450)static struct board { unsigned short vendor, device, rev, svid, sid; unsigned int flags; unsigned int maxclk; enum mga_chip chip; struct video_board* base; const char* name; } dev_list[] = {#ifdef CONFIG_FB_MATROX_MILLENIUM {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_MIL, 0xFF, 0, 0, DEVF_TEXT4B, 230000, MGA_2064, &vbMillennium, "Millennium (PCI)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_MIL_2, 0xFF, 0, 0, DEVF_SWAPS, 220000, MGA_2164, &vbMillennium2, "Millennium II (PCI)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_MIL_2_AGP, 0xFF, 0, 0, DEVF_SWAPS, 250000, MGA_2164, &vbMillennium2A, "Millennium II (AGP)"},#endif#ifdef CONFIG_FB_MATROX_MYSTIQUE {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_MYS, 0x02, 0, 0, DEVF_VIDEO64BIT | DEVF_CROSS4MB, 180000, MGA_1064, &vbMystique, "Mystique (PCI)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_MYS, 0xFF, 0, 0, DEVF_VIDEO64BIT | DEVF_SWAPS | DEVF_CROSS4MB, 220000, MGA_1164, &vbMystique, "Mystique 220 (PCI)"},#endif#ifdef CONFIG_FB_MATROX_G100 {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G100_MM, 0xFF, 0, 0, DEVF_G100, 230000, MGA_G100, &vbG100, "MGA-G100 (PCI)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G100_AGP, 0xFF, 0, 0, DEVF_G100, 230000, MGA_G100, &vbG100, "MGA-G100 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_PCI, 0xFF, 0, 0, DEVF_G200, 250000, MGA_G200, &vbG200, "MGA-G200 (PCI)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_AGP, 0xFF, PCI_SS_VENDOR_ID_MATROX, PCI_SS_ID_MATROX_GENERIC, DEVF_G200, 220000, MGA_G200, &vbG200, "MGA-G200 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_AGP, 0xFF, PCI_SS_VENDOR_ID_MATROX, PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP, DEVF_G200, 230000, MGA_G200, &vbG200, "Mystique G200 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_AGP, 0xFF, PCI_SS_VENDOR_ID_MATROX, PCI_SS_ID_MATROX_MILLENIUM_G200_AGP, DEVF_G200, 250000, MGA_G200, &vbG200, "Millennium G200 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_AGP, 0xFF, PCI_SS_VENDOR_ID_MATROX, PCI_SS_ID_MATROX_MARVEL_G200_AGP, DEVF_G200, 230000, MGA_G200, &vbG200, "Marvel G200 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_AGP, 0xFF, PCI_SS_VENDOR_ID_SIEMENS_NIXDORF, PCI_SS_ID_SIEMENS_MGA_G200_AGP, DEVF_G200, 230000, MGA_G200, &vbG200, "MGA-G200 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G200_AGP, 0xFF, 0, 0, DEVF_G200, 230000, MGA_G200, &vbG200, "G200 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400, 0x80, PCI_SS_VENDOR_ID_MATROX, PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP, DEVF_G400, 360000, MGA_G400, &vbG400, "Millennium G400 MAX (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400, 0x80, 0, 0, DEVF_G400, 300000, MGA_G400, &vbG400, "G400 (AGP)"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G400, 0xFF, 0, 0, DEVF_G450, 360000, MGA_G450, &vbG400, "G450"}, {PCI_VENDOR_ID_MATROX, PCI_DEVICE_ID_MATROX_G550, 0xFF, 0, 0, DEVF_G550, 360000, MGA_G550, &vbG400, "G550"},#endif {0, 0, 0xFF, 0, 0, 0, 0, 0, NULL, NULL}};#ifndef MODULEstatic struct fb_videomode defaultmode = { /* 640x480 @ 60Hz, 31.5 kHz */ NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2, 0, FB_VMODE_NONINTERLACED};#endif /* !MODULE */static int hotplug = 0;static int initMatrox2(WPMINFO struct display* d, struct board* b){ unsigned long ctrlptr_phys = 0; unsigned long video_base_phys = 0; unsigned int memsize; int err; DBG("initMatrox2") /* set default values... */ vesafb_defined.accel_flags = FB_ACCELF_TEXT; ACCESS_FBINFO(hw_switch) = b->base->lowlevel; ACCESS_FBINFO(devflags.accelerator) = b->base->accelID; ACCESS_FBINFO(max_pixel_clock) = b->maxclk; printk(KERN_INFO "matroxfb: Matrox %s detected\n", b->name); ACCESS_FBINFO(capable.plnwt) = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -