[PARISC] Fix stifb with IOREMAP and a 64-bit kernel
Helge Deller [Wed, 22 Mar 2006 22:19:46 +0000 (15:19 -0700)]
Kill various warnings when built using ioremap.
Remove stifb_{read,write} functions, which are now obsolete (and stack abusers!)
Disable stifb mmap() functionality on a 64-bit kernel, it will crash the
machine.

Signed-off-by: Helge Deller <deller@parisc-linux.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>

drivers/video/console/sticore.c
drivers/video/sticore.h
drivers/video/stifb.c

index 0339f56..d6041e7 100644 (file)
@@ -373,7 +373,7 @@ sti_dump_globcfg(struct sti_glob_cfg *glob_cfg, unsigned int sti_mem_request)
                glob_cfg->save_addr));
 
        /* dump extended cfg */ 
-       cfg = PTR_STI(glob_cfg->ext_ptr);
+       cfg = PTR_STI((unsigned long)glob_cfg->ext_ptr);
        DPRINTK(( KERN_INFO
                "monitor %d\n"
                "in friendly mode: %d\n"
@@ -453,25 +453,11 @@ sti_init_glob_cfg(struct sti_struct *sti,
                sti->regions_phys[i] =
                        REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa);
                
-               /* remap virtually */
-               /* FIXME: add BTLB support if btlb==1 */
                len = sti->regions[i].region_desc.length * 4096;
-
-/* XXX: Enabling IOREMAP debugging causes a crash, so we must be passing
- * a virtual address to something expecting a physical address that doesn't
- * go through a readX macro */
-#if 0
-               if (len)
-                  glob_cfg->region_ptrs[i] = (unsigned long) (
-                       sti->regions[i].region_desc.cache ?
-                       ioremap(sti->regions_phys[i], len) :
-                       ioremap_nocache(sti->regions_phys[i], len) );
-#else
                if (len)
                        glob_cfg->region_ptrs[i] = sti->regions_phys[i];
-#endif
                
-               DPRINTK(("region #%d: phys %08lx, virt %08x, len=%lukB, "
+               DPRINTK(("region #%d: phys %08lx, region_ptr %08x, len=%lukB, "
                         "btlb=%d, sysonly=%d, cache=%d, last=%d\n",
                        i, sti->regions_phys[i], glob_cfg->region_ptrs[i],
                        len/1024,
index dc93336..1a9a60c 100644 (file)
  * for them to fix it and steal their solution.   prumpf
  */
  
-#define STI_WAIT 1
-
-#include <asm/io.h> /* for USE_HPPA_IOREMAP */
-
-#if USE_HPPA_IOREMAP
+#include <asm/io.h>
 
-#define STI_PTR(p)     (p)
-#define PTR_STI(p)     (p)
-static inline int STI_CALL( unsigned long func, 
-               void *flags, void *inptr, void *outptr, void *glob_cfg )
-{
-       int (*f)(void *,void *,void *,void *);
-       f = (void*)func;
-       return f(flags, inptr, outptr, glob_cfg);
-}
-
-#else /* !USE_HPPA_IOREMAP */
+#define STI_WAIT 1
 
 #define STI_PTR(p)     ( virt_to_phys(p) )
-#define PTR_STI(p)     ( phys_to_virt((long)p) )
-#define STI_CALL(func, flags, inptr, outptr, glob_cfg) \
-       ({                                                      \
-               pdc_sti_call( func, (unsigned long)STI_PTR(flags), \
-                                   (unsigned long)STI_PTR(inptr), \
-                                   (unsigned long)STI_PTR(outptr), \
-                                   (unsigned long)STI_PTR(glob_cfg)); \
+#define PTR_STI(p)     ( phys_to_virt((unsigned long)p) )
+#define STI_CALL(func, flags, inptr, outptr, glob_cfg) \
+       ({                                              \
+               pdc_sti_call( func, STI_PTR(flags),     \
+                                  STI_PTR(inptr),      \
+                                  STI_PTR(outptr),     \
+                                  STI_PTR(glob_cfg));  \
        })
 
-#endif /* USE_HPPA_IOREMAP */
-
 
 #define sti_onscreen_x(sti) (sti->glob_cfg->onscreen_x)
 #define sti_onscreen_y(sti) (sti->glob_cfg->onscreen_y)
@@ -352,8 +336,9 @@ struct sti_struct {
        struct sti_conf_outptr outptr; /* configuration */
        struct sti_conf_outptr_ext outptr_ext;
 
-       /* PCI data structures (pg. 17ff from sti.pdf) */
        struct pci_dev *pd;
+
+       /* PCI data structures (pg. 17ff from sti.pdf) */
        u8 rm_entry[16]; /* pci region mapper array == pci config space offset */
 
        /* pointer to the fb_info where this STI device is used */
index 56d71d6..8d5f356 100644 (file)
@@ -3,7 +3,7 @@
  * Low level Frame buffer driver for HP workstations with 
  * STI (standard text interface) video firmware.
  *
- * Copyright (C) 2001-2005 Helge Deller <deller@gmx.de>
+ * Copyright (C) 2001-2006 Helge Deller <deller@gmx.de>
  * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
  * 
  * Based on:
@@ -514,7 +514,7 @@ rattlerSetupPlanes(struct stifb_info *fb)
        SETUP_HW(fb);
        WRITE_BYTE(1, fb, REG_16b1);
 
-       fb_memset(fb->info.fix.smem_start, 0xff,
+       fb_memset((void*)fb->info.fix.smem_start, 0xff,
                fb->info.var.yres*fb->info.fix.line_length);
     
        CRX24_SET_OVLY_MASK(fb);
@@ -908,83 +908,6 @@ SETUP_HCRX(struct stifb_info *fb)
 
 /* ------------------- driver specific functions --------------------------- */
 
-#define TMPBUFLEN 2048
-
-static ssize_t
-stifb_read(struct file *file, char *buf, size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       struct inode *inode = file->f_dentry->d_inode;
-       int fbidx = iminor(inode);
-       struct fb_info *info = registered_fb[fbidx];
-       char tmpbuf[TMPBUFLEN];
-
-       if (!info || ! info->screen_base)
-               return -ENODEV;
-
-       if (p >= info->fix.smem_len)
-           return 0;
-       if (count >= info->fix.smem_len)
-           count = info->fix.smem_len;
-       if (count + p > info->fix.smem_len)
-               count = info->fix.smem_len - p;
-       if (count > sizeof(tmpbuf))
-               count = sizeof(tmpbuf);
-       if (count) {
-           char *base_addr;
-
-           base_addr = info->screen_base;
-           memcpy_fromio(&tmpbuf, base_addr+p, count);
-           count -= copy_to_user(buf, &tmpbuf, count);
-           if (!count)
-               return -EFAULT;
-           *ppos += count;
-       }
-       return count;
-}
-
-static ssize_t
-stifb_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
-{
-       struct inode *inode = file->f_dentry->d_inode;
-       int fbidx = iminor(inode);
-       struct fb_info *info = registered_fb[fbidx];
-       unsigned long p = *ppos;
-       size_t c;
-       int err;
-       char tmpbuf[TMPBUFLEN];
-
-       if (!info || !info->screen_base)
-               return -ENODEV;
-
-       if (p > info->fix.smem_len)
-           return -ENOSPC;
-       if (count >= info->fix.smem_len)
-           count = info->fix.smem_len;
-       err = 0;
-       if (count + p > info->fix.smem_len) {
-           count = info->fix.smem_len - p;
-           err = -ENOSPC;
-       }
-
-       p += (unsigned long)info->screen_base;
-       c = count;
-       while (c) {
-           int len = c > sizeof(tmpbuf) ? sizeof(tmpbuf) : c;
-           err = -EFAULT;
-           if (copy_from_user(&tmpbuf, buf, len))
-                   break;
-           memcpy_toio(p, &tmpbuf, len);
-           c -= len;
-           p += len;
-           buf += len;
-           *ppos += len;
-       }
-       if (count-c)
-               return (count-c);
-       return err;
-}
-
 static int
 stifb_setcolreg(u_int regno, u_int red, u_int green,
              u_int blue, u_int transp, struct fb_info *info)
@@ -1137,8 +1060,6 @@ stifb_init_display(struct stifb_info *fb)
 
 static struct fb_ops stifb_ops = {
        .owner          = THIS_MODULE,
-       .fb_read        = stifb_read,
-       .fb_write       = stifb_write,
        .fb_setcolreg   = stifb_setcolreg,
        .fb_blank       = stifb_blank,
        .fb_fillrect    = cfb_fillrect,
@@ -1162,7 +1083,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
        char *dev_name;
        int bpp, xres, yres;
 
-       fb = kmalloc(sizeof(*fb), GFP_ATOMIC);
+       fb = kzalloc(sizeof(*fb), GFP_ATOMIC);
        if (!fb) {
                printk(KERN_ERR "stifb: Could not allocate stifb structure\n");
                return -ENODEV;
@@ -1171,7 +1092,6 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
        info = &fb->info;
 
        /* set struct to a known state */
-       memset(fb, 0, sizeof(*fb));
        fix = &info->fix;
        var = &info->var;
 
@@ -1234,7 +1154,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
        case S9000_ID_TOMCAT:   /* Dual CRX, behaves else like a CRX */
                /* FIXME: TomCat supports two heads:
                 * fb.iobase = REGION_BASE(fb_info,3);
-                * fb.screen_base = (void*) REGION_BASE(fb_info,2);
+                * fb.screen_base = ioremap_nocache(REGION_BASE(fb_info,2),xxx);
                 * for now we only support the left one ! */
                xres = fb->ngle_rom.x_size_visible;
                yres = fb->ngle_rom.y_size_visible;
@@ -1327,7 +1247,8 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
 
        strcpy(fix->id, "stifb");
        info->fbops = &stifb_ops;
-       info->screen_base = (void*) REGION_BASE(fb,1);
+       info->screen_base = ioremap_nocache(REGION_BASE(fb,1), fix->smem_len);
+       info->screen_size = fix->smem_len;
        info->flags = FBINFO_DEFAULT;
        info->pseudo_palette = &fb->pseudo_palette;