diff options
| -rw-r--r-- | drivers/video/console/sticore.c | 18 | ||||
| -rw-r--r-- | drivers/video/sticore.h | 37 | ||||
| -rw-r--r-- | drivers/video/stifb.c | 91 |
3 files changed, 19 insertions, 127 deletions
diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c index 0339f5640a78..d6041e781aca 100644 --- a/drivers/video/console/sticore.c +++ b/drivers/video/console/sticore.c | |||
| @@ -373,7 +373,7 @@ sti_dump_globcfg(struct sti_glob_cfg *glob_cfg, unsigned int sti_mem_request) | |||
| 373 | glob_cfg->save_addr)); | 373 | glob_cfg->save_addr)); |
| 374 | 374 | ||
| 375 | /* dump extended cfg */ | 375 | /* dump extended cfg */ |
| 376 | cfg = PTR_STI(glob_cfg->ext_ptr); | 376 | cfg = PTR_STI((unsigned long)glob_cfg->ext_ptr); |
| 377 | DPRINTK(( KERN_INFO | 377 | DPRINTK(( KERN_INFO |
| 378 | "monitor %d\n" | 378 | "monitor %d\n" |
| 379 | "in friendly mode: %d\n" | 379 | "in friendly mode: %d\n" |
| @@ -453,25 +453,11 @@ sti_init_glob_cfg(struct sti_struct *sti, | |||
| 453 | sti->regions_phys[i] = | 453 | sti->regions_phys[i] = |
| 454 | REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa); | 454 | REGION_OFFSET_TO_PHYS(sti->regions[i], newhpa); |
| 455 | 455 | ||
| 456 | /* remap virtually */ | ||
| 457 | /* FIXME: add BTLB support if btlb==1 */ | ||
| 458 | len = sti->regions[i].region_desc.length * 4096; | 456 | len = sti->regions[i].region_desc.length * 4096; |
| 459 | |||
| 460 | /* XXX: Enabling IOREMAP debugging causes a crash, so we must be passing | ||
| 461 | * a virtual address to something expecting a physical address that doesn't | ||
| 462 | * go through a readX macro */ | ||
| 463 | #if 0 | ||
| 464 | if (len) | ||
| 465 | glob_cfg->region_ptrs[i] = (unsigned long) ( | ||
| 466 | sti->regions[i].region_desc.cache ? | ||
| 467 | ioremap(sti->regions_phys[i], len) : | ||
| 468 | ioremap_nocache(sti->regions_phys[i], len) ); | ||
| 469 | #else | ||
| 470 | if (len) | 457 | if (len) |
| 471 | glob_cfg->region_ptrs[i] = sti->regions_phys[i]; | 458 | glob_cfg->region_ptrs[i] = sti->regions_phys[i]; |
| 472 | #endif | ||
| 473 | 459 | ||
| 474 | DPRINTK(("region #%d: phys %08lx, virt %08x, len=%lukB, " | 460 | DPRINTK(("region #%d: phys %08lx, region_ptr %08x, len=%lukB, " |
| 475 | "btlb=%d, sysonly=%d, cache=%d, last=%d\n", | 461 | "btlb=%d, sysonly=%d, cache=%d, last=%d\n", |
| 476 | i, sti->regions_phys[i], glob_cfg->region_ptrs[i], | 462 | i, sti->regions_phys[i], glob_cfg->region_ptrs[i], |
| 477 | len/1024, | 463 | len/1024, |
diff --git a/drivers/video/sticore.h b/drivers/video/sticore.h index dc93336af557..1a9a60c74be3 100644 --- a/drivers/video/sticore.h +++ b/drivers/video/sticore.h | |||
| @@ -34,36 +34,20 @@ | |||
| 34 | * for them to fix it and steal their solution. prumpf | 34 | * for them to fix it and steal their solution. prumpf |
| 35 | */ | 35 | */ |
| 36 | 36 | ||
| 37 | #define STI_WAIT 1 | 37 | #include <asm/io.h> |
| 38 | |||
| 39 | #include <asm/io.h> /* for USE_HPPA_IOREMAP */ | ||
| 40 | |||
| 41 | #if USE_HPPA_IOREMAP | ||
| 42 | 38 | ||
| 43 | #define STI_PTR(p) (p) | 39 | #define STI_WAIT 1 |
| 44 | #define PTR_STI(p) (p) | ||
| 45 | static inline int STI_CALL( unsigned long func, | ||
| 46 | void *flags, void *inptr, void *outptr, void *glob_cfg ) | ||
| 47 | { | ||
| 48 | int (*f)(void *,void *,void *,void *); | ||
| 49 | f = (void*)func; | ||
| 50 | return f(flags, inptr, outptr, glob_cfg); | ||
| 51 | } | ||
| 52 | |||
| 53 | #else /* !USE_HPPA_IOREMAP */ | ||
| 54 | 40 | ||
| 55 | #define STI_PTR(p) ( virt_to_phys(p) ) | 41 | #define STI_PTR(p) ( virt_to_phys(p) ) |
| 56 | #define PTR_STI(p) ( phys_to_virt((long)p) ) | 42 | #define PTR_STI(p) ( phys_to_virt((unsigned long)p) ) |
| 57 | #define STI_CALL(func, flags, inptr, outptr, glob_cfg) \ | 43 | #define STI_CALL(func, flags, inptr, outptr, glob_cfg) \ |
| 58 | ({ \ | 44 | ({ \ |
| 59 | pdc_sti_call( func, (unsigned long)STI_PTR(flags), \ | 45 | pdc_sti_call( func, STI_PTR(flags), \ |
| 60 | (unsigned long)STI_PTR(inptr), \ | 46 | STI_PTR(inptr), \ |
| 61 | (unsigned long)STI_PTR(outptr), \ | 47 | STI_PTR(outptr), \ |
| 62 | (unsigned long)STI_PTR(glob_cfg)); \ | 48 | STI_PTR(glob_cfg)); \ |
| 63 | }) | 49 | }) |
| 64 | 50 | ||
| 65 | #endif /* USE_HPPA_IOREMAP */ | ||
| 66 | |||
| 67 | 51 | ||
| 68 | #define sti_onscreen_x(sti) (sti->glob_cfg->onscreen_x) | 52 | #define sti_onscreen_x(sti) (sti->glob_cfg->onscreen_x) |
| 69 | #define sti_onscreen_y(sti) (sti->glob_cfg->onscreen_y) | 53 | #define sti_onscreen_y(sti) (sti->glob_cfg->onscreen_y) |
| @@ -352,8 +336,9 @@ struct sti_struct { | |||
| 352 | struct sti_conf_outptr outptr; /* configuration */ | 336 | struct sti_conf_outptr outptr; /* configuration */ |
| 353 | struct sti_conf_outptr_ext outptr_ext; | 337 | struct sti_conf_outptr_ext outptr_ext; |
| 354 | 338 | ||
| 355 | /* PCI data structures (pg. 17ff from sti.pdf) */ | ||
| 356 | struct pci_dev *pd; | 339 | struct pci_dev *pd; |
| 340 | |||
| 341 | /* PCI data structures (pg. 17ff from sti.pdf) */ | ||
| 357 | u8 rm_entry[16]; /* pci region mapper array == pci config space offset */ | 342 | u8 rm_entry[16]; /* pci region mapper array == pci config space offset */ |
| 358 | 343 | ||
| 359 | /* pointer to the fb_info where this STI device is used */ | 344 | /* pointer to the fb_info where this STI device is used */ |
diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c index 56d71d6e9a72..8d5f35676f9a 100644 --- a/drivers/video/stifb.c +++ b/drivers/video/stifb.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * Low level Frame buffer driver for HP workstations with | 3 | * Low level Frame buffer driver for HP workstations with |
| 4 | * STI (standard text interface) video firmware. | 4 | * STI (standard text interface) video firmware. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2001-2005 Helge Deller <deller@gmx.de> | 6 | * Copyright (C) 2001-2006 Helge Deller <deller@gmx.de> |
| 7 | * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de> | 7 | * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de> |
| 8 | * | 8 | * |
| 9 | * Based on: | 9 | * Based on: |
| @@ -514,7 +514,7 @@ rattlerSetupPlanes(struct stifb_info *fb) | |||
| 514 | SETUP_HW(fb); | 514 | SETUP_HW(fb); |
| 515 | WRITE_BYTE(1, fb, REG_16b1); | 515 | WRITE_BYTE(1, fb, REG_16b1); |
| 516 | 516 | ||
| 517 | fb_memset(fb->info.fix.smem_start, 0xff, | 517 | fb_memset((void*)fb->info.fix.smem_start, 0xff, |
| 518 | fb->info.var.yres*fb->info.fix.line_length); | 518 | fb->info.var.yres*fb->info.fix.line_length); |
| 519 | 519 | ||
| 520 | CRX24_SET_OVLY_MASK(fb); | 520 | CRX24_SET_OVLY_MASK(fb); |
| @@ -908,83 +908,6 @@ SETUP_HCRX(struct stifb_info *fb) | |||
| 908 | 908 | ||
| 909 | /* ------------------- driver specific functions --------------------------- */ | 909 | /* ------------------- driver specific functions --------------------------- */ |
| 910 | 910 | ||
| 911 | #define TMPBUFLEN 2048 | ||
| 912 | |||
| 913 | static ssize_t | ||
| 914 | stifb_read(struct file *file, char *buf, size_t count, loff_t *ppos) | ||
| 915 | { | ||
| 916 | unsigned long p = *ppos; | ||
| 917 | struct inode *inode = file->f_dentry->d_inode; | ||
| 918 | int fbidx = iminor(inode); | ||
| 919 | struct fb_info *info = registered_fb[fbidx]; | ||
| 920 | char tmpbuf[TMPBUFLEN]; | ||
| 921 | |||
| 922 | if (!info || ! info->screen_base) | ||
| 923 | return -ENODEV; | ||
| 924 | |||
| 925 | if (p >= info->fix.smem_len) | ||
| 926 | return 0; | ||
| 927 | if (count >= info->fix.smem_len) | ||
| 928 | count = info->fix.smem_len; | ||
| 929 | if (count + p > info->fix.smem_len) | ||
| 930 | count = info->fix.smem_len - p; | ||
| 931 | if (count > sizeof(tmpbuf)) | ||
| 932 | count = sizeof(tmpbuf); | ||
| 933 | if (count) { | ||
| 934 | char *base_addr; | ||
| 935 | |||
| 936 | base_addr = info->screen_base; | ||
| 937 | memcpy_fromio(&tmpbuf, base_addr+p, count); | ||
| 938 | count -= copy_to_user(buf, &tmpbuf, count); | ||
| 939 | if (!count) | ||
| 940 | return -EFAULT; | ||
| 941 | *ppos += count; | ||
| 942 | } | ||
| 943 | return count; | ||
| 944 | } | ||
| 945 | |||
| 946 | static ssize_t | ||
| 947 | stifb_write(struct file *file, const char *buf, size_t count, loff_t *ppos) | ||
| 948 | { | ||
| 949 | struct inode *inode = file->f_dentry->d_inode; | ||
| 950 | int fbidx = iminor(inode); | ||
| 951 | struct fb_info *info = registered_fb[fbidx]; | ||
| 952 | unsigned long p = *ppos; | ||
| 953 | size_t c; | ||
| 954 | int err; | ||
| 955 | char tmpbuf[TMPBUFLEN]; | ||
| 956 | |||
| 957 | if (!info || !info->screen_base) | ||
| 958 | return -ENODEV; | ||
| 959 | |||
| 960 | if (p > info->fix.smem_len) | ||
| 961 | return -ENOSPC; | ||
| 962 | if (count >= info->fix.smem_len) | ||
| 963 | count = info->fix.smem_len; | ||
| 964 | err = 0; | ||
| 965 | if (count + p > info->fix.smem_len) { | ||
| 966 | count = info->fix.smem_len - p; | ||
| 967 | err = -ENOSPC; | ||
| 968 | } | ||
| 969 | |||
| 970 | p += (unsigned long)info->screen_base; | ||
| 971 | c = count; | ||
| 972 | while (c) { | ||
| 973 | int len = c > sizeof(tmpbuf) ? sizeof(tmpbuf) : c; | ||
| 974 | err = -EFAULT; | ||
| 975 | if (copy_from_user(&tmpbuf, buf, len)) | ||
| 976 | break; | ||
| 977 | memcpy_toio(p, &tmpbuf, len); | ||
| 978 | c -= len; | ||
| 979 | p += len; | ||
| 980 | buf += len; | ||
| 981 | *ppos += len; | ||
| 982 | } | ||
| 983 | if (count-c) | ||
| 984 | return (count-c); | ||
| 985 | return err; | ||
| 986 | } | ||
| 987 | |||
| 988 | static int | 911 | static int |
| 989 | stifb_setcolreg(u_int regno, u_int red, u_int green, | 912 | stifb_setcolreg(u_int regno, u_int red, u_int green, |
| 990 | u_int blue, u_int transp, struct fb_info *info) | 913 | u_int blue, u_int transp, struct fb_info *info) |
| @@ -1137,8 +1060,6 @@ stifb_init_display(struct stifb_info *fb) | |||
| 1137 | 1060 | ||
| 1138 | static struct fb_ops stifb_ops = { | 1061 | static struct fb_ops stifb_ops = { |
| 1139 | .owner = THIS_MODULE, | 1062 | .owner = THIS_MODULE, |
| 1140 | .fb_read = stifb_read, | ||
| 1141 | .fb_write = stifb_write, | ||
| 1142 | .fb_setcolreg = stifb_setcolreg, | 1063 | .fb_setcolreg = stifb_setcolreg, |
| 1143 | .fb_blank = stifb_blank, | 1064 | .fb_blank = stifb_blank, |
| 1144 | .fb_fillrect = cfb_fillrect, | 1065 | .fb_fillrect = cfb_fillrect, |
| @@ -1162,7 +1083,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
| 1162 | char *dev_name; | 1083 | char *dev_name; |
| 1163 | int bpp, xres, yres; | 1084 | int bpp, xres, yres; |
| 1164 | 1085 | ||
| 1165 | fb = kmalloc(sizeof(*fb), GFP_ATOMIC); | 1086 | fb = kzalloc(sizeof(*fb), GFP_ATOMIC); |
| 1166 | if (!fb) { | 1087 | if (!fb) { |
| 1167 | printk(KERN_ERR "stifb: Could not allocate stifb structure\n"); | 1088 | printk(KERN_ERR "stifb: Could not allocate stifb structure\n"); |
| 1168 | return -ENODEV; | 1089 | return -ENODEV; |
| @@ -1171,7 +1092,6 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
| 1171 | info = &fb->info; | 1092 | info = &fb->info; |
| 1172 | 1093 | ||
| 1173 | /* set struct to a known state */ | 1094 | /* set struct to a known state */ |
| 1174 | memset(fb, 0, sizeof(*fb)); | ||
| 1175 | fix = &info->fix; | 1095 | fix = &info->fix; |
| 1176 | var = &info->var; | 1096 | var = &info->var; |
| 1177 | 1097 | ||
| @@ -1234,7 +1154,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
| 1234 | case S9000_ID_TOMCAT: /* Dual CRX, behaves else like a CRX */ | 1154 | case S9000_ID_TOMCAT: /* Dual CRX, behaves else like a CRX */ |
| 1235 | /* FIXME: TomCat supports two heads: | 1155 | /* FIXME: TomCat supports two heads: |
| 1236 | * fb.iobase = REGION_BASE(fb_info,3); | 1156 | * fb.iobase = REGION_BASE(fb_info,3); |
| 1237 | * fb.screen_base = (void*) REGION_BASE(fb_info,2); | 1157 | * fb.screen_base = ioremap_nocache(REGION_BASE(fb_info,2),xxx); |
| 1238 | * for now we only support the left one ! */ | 1158 | * for now we only support the left one ! */ |
| 1239 | xres = fb->ngle_rom.x_size_visible; | 1159 | xres = fb->ngle_rom.x_size_visible; |
| 1240 | yres = fb->ngle_rom.y_size_visible; | 1160 | yres = fb->ngle_rom.y_size_visible; |
| @@ -1327,7 +1247,8 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
| 1327 | 1247 | ||
| 1328 | strcpy(fix->id, "stifb"); | 1248 | strcpy(fix->id, "stifb"); |
| 1329 | info->fbops = &stifb_ops; | 1249 | info->fbops = &stifb_ops; |
| 1330 | info->screen_base = (void*) REGION_BASE(fb,1); | 1250 | info->screen_base = ioremap_nocache(REGION_BASE(fb,1), fix->smem_len); |
| 1251 | info->screen_size = fix->smem_len; | ||
| 1331 | info->flags = FBINFO_DEFAULT; | 1252 | info->flags = FBINFO_DEFAULT; |
| 1332 | info->pseudo_palette = &fb->pseudo_palette; | 1253 | info->pseudo_palette = &fb->pseudo_palette; |
| 1333 | 1254 | ||
