diff -Naur linux-2.5.61-fbdev/drivers/video/riva/fbdev.c linux-2.5.61-ad/drivers/video/riva/fbdev.c --- linux-2.5.61-fbdev/drivers/video/riva/fbdev.c 2003-02-16 00:55:53.000000000 +0000 +++ linux-2.5.61-ad/drivers/video/riva/fbdev.c 2003-02-16 02:52:37.000000000 +0000 @@ -286,7 +286,6 @@ /* command line data, set in rivafb_setup() */ static u32 pseudo_palette[17]; -static int noblink = 0; static int flatpanel __initdata = -1; /* Autodetect later */ static int forceCRTC __initdata = -1; #ifdef CONFIG_MTRR @@ -1380,15 +1379,16 @@ * CALLED FROM: * framebuffer hook */ -static void rivafb_imageblit(struct fb_info *info, const struct fb_image *image) +static void rivafb_imageblit(struct fb_info *info, + const struct fb_image *image) { struct riva_par *par = (struct riva_par *) info->par; u32 fgx = 0, bgx = 0, width, mod, tmp; - u8 *cdat = image->data; + u8 *cdat = (u8 *) image->data; volatile u32 *d; int i, j, k, size; - if (image->depth != 1) { + if (image->depth != 0) { wait_for_idle(par); cfb_imageblit(info, image); return; @@ -1854,8 +1854,8 @@ default_par->riva.PCRTC = default_par->riva.PCRTC0 = default_par->riva.PGRAPH; } - rivafb_fix.smem_len = default_par->riva.RamAmountKBytes * 1024; - default_par->dclk_max = default_par->riva.MaxVClockFreqKHz * 1000; + rivafb_fix.smem_len = riva_get_memlen(default_par) * 1024; + default_par->dclk_max = riva_get_maxdclk(default_par) * 1000; if (!request_mem_region(rivafb_fix.smem_start, rivafb_fix.smem_len, "rivafb")) { @@ -1976,8 +1976,6 @@ while ((this_opt = strsep(&options, ",")) != NULL) { if (!*this_opt) continue; - if (!strncmp(this_opt, "noblink", 7)) { - noblink = 1; #ifdef CONFIG_MTRR } else if (!strncmp(this_opt, "nomtrr", 6)) { nomtrr = 1; @@ -2016,7 +2014,10 @@ int __init rivafb_init(void) { - return pci_module_init(&rivafb_driver); + if (pci_register_driver(&rivafb_driver) > 0) + return 0; + pci_unregister_driver(&rivafb_driver); + return -ENODEV; } @@ -2029,8 +2030,6 @@ module_init(rivafb_init); module_exit(rivafb_exit); -MODULE_PARM(noblink, "i"); -MODULE_PARM_DESC(noblink, "Disables hardware cursor blinking (0 or 1=disabled) (default=0)"); MODULE_PARM(flatpanel, "i"); MODULE_PARM_DESC(flatpanel, "Enables experimental flat panel support for some chipsets. (0 or 1=enabled) (default=0)"); MODULE_PARM(forceCRTC, "i"); diff -Naur linux-2.5.61-fbdev/drivers/video/riva/nv_driver.c linux-2.5.61-ad/drivers/video/riva/nv_driver.c --- linux-2.5.61-fbdev/drivers/video/riva/nv_driver.c 2003-02-16 00:48:53.000000000 +0000 +++ linux-2.5.61-ad/drivers/video/riva/nv_driver.c 2003-02-16 02:52:37.000000000 +0000 @@ -35,6 +35,7 @@ 5 20:47:06 mvojkovi Exp $ */ #include +#include #include #include "nv_type.h" #include "rivafb.h" @@ -133,6 +134,159 @@ riva_override_CRTC(par); } +unsigned long riva_get_memlen(struct riva_par *par) +{ + RIVA_HW_INST *chip = &par->riva; + unsigned long memlen = 0; + unsigned int chipset = par->Chipset; + struct pci_dev* dev; + int amt; + + switch (chip->Architecture) { + case NV_ARCH_03: + if (chip->PFB[0x00000000/4] & 0x00000020) { + if (((chip->PMC[0x00000000/4] & 0xF0) == 0x20) + && ((chip->PMC[0x00000000/4] & 0x0F) >= 0x02)) { + /* + * SDRAM 128 ZX. + */ + switch (chip->PFB[0x00000000/4] & 0x03) { + case 2: + memlen = 1024 * 4; + break; + case 1: + memlen = 1024 * 2; + break; + default: + memlen = 1024 * 8; + break; + } + } else { + memlen = 1024 * 8; + } + } else { + /* + * SGRAM 128. + */ + switch (chip->PFB[0x00000000/4] & 0x00000003) { + case 0: + memlen = 1024 * 8; + break; + case 2: + memlen = 1024 * 4; + break; + default: + memlen = 1024 * 2; + break; + } + } + break; + case NV_ARCH_04: + if (chip->PFB[0x00000000/4] & 0x00000100) { + memlen = ((chip->PFB[0x00000000/4] >> 12) & 0x0F) * + 1024 * 2 + 1024 * 2; + } else { + switch (chip->PFB[0x00000000/4] & 0x00000003) { + case 0: + memlen = 1024 * 32; + break; + case 1: + memlen = 1024 * 4; + break; + case 2: + memlen = 1024 * 8; + break; + case 3: + default: + memlen = 1024 * 16; + break; + } + } + break; + case NV_ARCH_10: + case NV_ARCH_20: + if(chipset == NV_CHIP_IGEFORCE2) { + + dev = pci_find_slot(0, 1); + pci_read_config_dword(dev, 0x7C, &amt); + memlen = (((amt >> 6) & 31) + 1) * 1024; + } else if (chipset == NV_CHIP_0x01F0) { + dev = pci_find_slot(0, 1); + pci_read_config_dword(dev, 0x84, &amt); + memlen = (((amt >> 4) & 127) + 1) * 1024; + } else { + switch ((chip->PFB[0x0000020C/4] >> 20) & 0x000000FF){ + case 0x02: + memlen = 1024 * 2; + break; + case 0x04: + memlen = 1024 * 4; + break; + case 0x08: + memlen = 1024 * 8; + break; + case 0x10: + memlen = 1024 * 16; + break; + case 0x20: + memlen = 1024 * 32; + break; + case 0x40: + memlen = 1024 * 64; + break; + case 0x80: + memlen = 1024 * 128; + break; + default: + memlen = 1024 * 16; + break; + } + } + break; + } + return memlen; +} + +unsigned long riva_get_maxdclk(struct riva_par *par) +{ + RIVA_HW_INST *chip = &par->riva; + unsigned long dclk = 0; + + switch (chip->Architecture) { + case NV_ARCH_03: + if (chip->PFB[0x00000000/4] & 0x00000020) { + if (((chip->PMC[0x00000000/4] & 0xF0) == 0x20) + && ((chip->PMC[0x00000000/4] & 0x0F) >= 0x02)) { + /* + * SDRAM 128 ZX. + */ + dclk = 800000; + } else { + dclk = 1000000; + } + } else { + /* + * SGRAM 128. + */ + dclk = 1000000; + } + break; + case NV_ARCH_04: + case NV_ARCH_10: + case NV_ARCH_20: + switch ((chip->PFB[0x00000000/4] >> 3) & 0x00000003) { + case 3: + dclk = 800000; + break; + default: + dclk = 1000000; + break; + } + break; + } + return dclk; +} + void riva_common_setup(struct riva_par *par) { @@ -201,8 +355,6 @@ par->riva.PDIO = par->riva.PDIO0; } - RivaGetConfig(&par->riva, par->Chipset); - if (par->FlatPanel == -1) { /* Fix me, need x86 DDC code */ par->FlatPanel = 0; diff -Naur linux-2.5.61-fbdev/drivers/video/riva/rivafb.h linux-2.5.61-ad/drivers/video/riva/rivafb.h --- linux-2.5.61-fbdev/drivers/video/riva/rivafb.h 2003-02-16 00:48:53.000000000 +0000 +++ linux-2.5.61-ad/drivers/video/riva/rivafb.h 2003-02-16 02:52:39.000000000 +0000 @@ -55,5 +55,7 @@ }; void riva_common_setup(struct riva_par *); +unsigned long riva_get_memlen(struct riva_par *); +unsigned long riva_get_maxdclk(struct riva_par *); #endif /* __RIVAFB_H */