From: Antonino Daplas <adaplas@pol.net>
To: James Simmons <jsimmons@infradead.org>,
Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Linux Fbdev development list <linux-fbdev-devel@lists.sourceforge.net>
Subject: [PATCH 3/5]: rivafb fixes
Date: 16 Feb 2003 14:08:51 +0800 [thread overview]
Message-ID: <1045375693.1823.75.camel@localhost.localdomain> (raw)
[-- Attachment #1: Type: text/plain, Size: 141 bytes --]
Attached is a patch (linux-2.5.61 + James' fbdev.diff) to fix the "green screen" problem on module load,
and compilation warnings.
Tony
[-- Attachment #2: rivafb4.diff --]
[-- Type: text/x-patch, Size: 6957 bytes --]
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 <linux/delay.h>
+#include <linux/pci.h>
#include <linux/pci_ids.h>
#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 */
next reply other threads:[~2003-02-16 6:10 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-02-16 6:08 Antonino Daplas [this message]
2003-02-16 16:38 ` [PATCH 3/5]: rivafb fixes James Simmons
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1045375693.1823.75.camel@localhost.localdomain \
--to=adaplas@pol.net \
--cc=geert@linux-m68k.org \
--cc=jsimmons@infradead.org \
--cc=linux-fbdev-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).