[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: Helge Deller <deller@parisc-linux.org> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
parent
b8ce0aadcd
commit
857600c771
@ -373,7 +373,7 @@ sti_dump_globcfg(struct sti_glob_cfg *glob_cfg, unsigned int sti_mem_request)
|
|||||||
glob_cfg->save_addr));
|
glob_cfg->save_addr));
|
||||||
|
|
||||||
/* dump extended cfg */
|
/* dump extended cfg */
|
||||||
cfg = PTR_STI(glob_cfg->ext_ptr);
|
cfg = PTR_STI((unsigned long)glob_cfg->ext_ptr);
|
||||||
DPRINTK(( KERN_INFO
|
DPRINTK(( KERN_INFO
|
||||||
"monitor %d\n"
|
"monitor %d\n"
|
||||||
"in friendly mode: %d\n"
|
"in friendly mode: %d\n"
|
||||||
@ -453,25 +453,11 @@ sti_init_glob_cfg(struct sti_struct *sti,
|
|||||||
sti->regions_phys[i] =
|
sti->regions_phys[i] =
|
||||||
REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa);
|
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;
|
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)
|
if (len)
|
||||||
glob_cfg->region_ptrs[i] = sti->regions_phys[i];
|
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",
|
"btlb=%d, sysonly=%d, cache=%d, last=%d\n",
|
||||||
i, sti->regions_phys[i], glob_cfg->region_ptrs[i],
|
i, sti->regions_phys[i], glob_cfg->region_ptrs[i],
|
||||||
len/1024,
|
len/1024,
|
||||||
|
@ -34,36 +34,20 @@
|
|||||||
* for them to fix it and steal their solution. prumpf
|
* for them to fix it and steal their solution. prumpf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
#define STI_WAIT 1
|
#define STI_WAIT 1
|
||||||
|
|
||||||
#include <asm/io.h> /* for USE_HPPA_IOREMAP */
|
|
||||||
|
|
||||||
#if USE_HPPA_IOREMAP
|
|
||||||
|
|
||||||
#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_PTR(p) ( virt_to_phys(p) )
|
#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) \
|
#define STI_CALL(func, flags, inptr, outptr, glob_cfg) \
|
||||||
({ \
|
({ \
|
||||||
pdc_sti_call( func, (unsigned long)STI_PTR(flags), \
|
pdc_sti_call( func, STI_PTR(flags), \
|
||||||
(unsigned long)STI_PTR(inptr), \
|
STI_PTR(inptr), \
|
||||||
(unsigned long)STI_PTR(outptr), \
|
STI_PTR(outptr), \
|
||||||
(unsigned long)STI_PTR(glob_cfg)); \
|
STI_PTR(glob_cfg)); \
|
||||||
})
|
})
|
||||||
|
|
||||||
#endif /* USE_HPPA_IOREMAP */
|
|
||||||
|
|
||||||
|
|
||||||
#define sti_onscreen_x(sti) (sti->glob_cfg->onscreen_x)
|
#define sti_onscreen_x(sti) (sti->glob_cfg->onscreen_x)
|
||||||
#define sti_onscreen_y(sti) (sti->glob_cfg->onscreen_y)
|
#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 outptr; /* configuration */
|
||||||
struct sti_conf_outptr_ext outptr_ext;
|
struct sti_conf_outptr_ext outptr_ext;
|
||||||
|
|
||||||
/* PCI data structures (pg. 17ff from sti.pdf) */
|
|
||||||
struct pci_dev *pd;
|
struct pci_dev *pd;
|
||||||
|
|
||||||
|
/* PCI data structures (pg. 17ff from sti.pdf) */
|
||||||
u8 rm_entry[16]; /* pci region mapper array == pci config space offset */
|
u8 rm_entry[16]; /* pci region mapper array == pci config space offset */
|
||||||
|
|
||||||
/* pointer to the fb_info where this STI device is used */
|
/* pointer to the fb_info where this STI device is used */
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* Low level Frame buffer driver for HP workstations with
|
* Low level Frame buffer driver for HP workstations with
|
||||||
* STI (standard text interface) video firmware.
|
* 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>
|
* Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||||
*
|
*
|
||||||
* Based on:
|
* Based on:
|
||||||
@ -514,7 +514,7 @@ rattlerSetupPlanes(struct stifb_info *fb)
|
|||||||
SETUP_HW(fb);
|
SETUP_HW(fb);
|
||||||
WRITE_BYTE(1, fb, REG_16b1);
|
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);
|
fb->info.var.yres*fb->info.fix.line_length);
|
||||||
|
|
||||||
CRX24_SET_OVLY_MASK(fb);
|
CRX24_SET_OVLY_MASK(fb);
|
||||||
@ -908,83 +908,6 @@ SETUP_HCRX(struct stifb_info *fb)
|
|||||||
|
|
||||||
/* ------------------- driver specific functions --------------------------- */
|
/* ------------------- 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
|
static int
|
||||||
stifb_setcolreg(u_int regno, u_int red, u_int green,
|
stifb_setcolreg(u_int regno, u_int red, u_int green,
|
||||||
u_int blue, u_int transp, struct fb_info *info)
|
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 = {
|
static struct fb_ops stifb_ops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.fb_read = stifb_read,
|
|
||||||
.fb_write = stifb_write,
|
|
||||||
.fb_setcolreg = stifb_setcolreg,
|
.fb_setcolreg = stifb_setcolreg,
|
||||||
.fb_blank = stifb_blank,
|
.fb_blank = stifb_blank,
|
||||||
.fb_fillrect = cfb_fillrect,
|
.fb_fillrect = cfb_fillrect,
|
||||||
@ -1162,7 +1083,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
|||||||
char *dev_name;
|
char *dev_name;
|
||||||
int bpp, xres, yres;
|
int bpp, xres, yres;
|
||||||
|
|
||||||
fb = kmalloc(sizeof(*fb), GFP_ATOMIC);
|
fb = kzalloc(sizeof(*fb), GFP_ATOMIC);
|
||||||
if (!fb) {
|
if (!fb) {
|
||||||
printk(KERN_ERR "stifb: Could not allocate stifb structure\n");
|
printk(KERN_ERR "stifb: Could not allocate stifb structure\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@ -1171,7 +1092,6 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
|||||||
info = &fb->info;
|
info = &fb->info;
|
||||||
|
|
||||||
/* set struct to a known state */
|
/* set struct to a known state */
|
||||||
memset(fb, 0, sizeof(*fb));
|
|
||||||
fix = &info->fix;
|
fix = &info->fix;
|
||||||
var = &info->var;
|
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 */
|
case S9000_ID_TOMCAT: /* Dual CRX, behaves else like a CRX */
|
||||||
/* FIXME: TomCat supports two heads:
|
/* FIXME: TomCat supports two heads:
|
||||||
* fb.iobase = REGION_BASE(fb_info,3);
|
* 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 ! */
|
* for now we only support the left one ! */
|
||||||
xres = fb->ngle_rom.x_size_visible;
|
xres = fb->ngle_rom.x_size_visible;
|
||||||
yres = fb->ngle_rom.y_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");
|
strcpy(fix->id, "stifb");
|
||||||
info->fbops = &stifb_ops;
|
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->flags = FBINFO_DEFAULT;
|
||||||
info->pseudo_palette = &fb->pseudo_palette;
|
info->pseudo_palette = &fb->pseudo_palette;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user