mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
[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
3 changed files with 19 additions and 127 deletions
|
@ -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,
|
||||
|
|
|
@ -34,36 +34,20 @@
|
|||
* for them to fix it and steal their solution. prumpf
|
||||
*/
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#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 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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue