Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 857600c7 authored by Helge Deller's avatar Helge Deller Committed by Kyle McMartin
Browse files

[PARISC] Fix stifb with IOREMAP and a 64-bit kernel



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: default avatarHelge Deller <deller@parisc-linux.org>
Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
parent b8ce0aad
Loading
Loading
Loading
Loading
+2 −16
Original line number Diff line number Diff line
@@ -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,
+11 −26
Original line number Diff line number Diff line
@@ -34,36 +34,20 @@
 * 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 PTR_STI(p)	( phys_to_virt((unsigned 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)); \
               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 */
+6 −85
Original line number Diff line number Diff line
@@ -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;