Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

m68k/atari - atafb: convert allocation of fb ram to new interface

The new atari_stram_alloc interface returns kernel virtual addresses
even if the kernel runs in FastRAM. These addresses are not
guaranteed to be identical with the physical addresses. Since ST-RAM
mappings have not been set up by mem_init, virt_to_phys() and its
cousin do not work and the atari_stram_to_phys() etc. helpers must
be used to determine physical addresses.

fb.fix->smem_start needs physical addresses, fb.par->screen_base
needs virtual addresses. Take care of the virt-to-phys conversion
both on fb init and par changes.

Signed-off-by: Michael Schmitz <schmitz@debian.org>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>

authored by

Michael Schmitz and committed by
Geert Uytterhoeven
cf8c8781 fded332b

+26 -23
+26 -23
drivers/video/fbdev/atafb.c
··· 191 191 }; 192 192 193 193 static void *screen_base; /* base address of screen */ 194 - static void *real_screen_base; /* (only for Overscan) */ 194 + static unsigned long phys_screen_base; /* (only for Overscan) */ 195 195 196 196 static int screen_len; 197 197 ··· 213 213 */ 214 214 static unsigned int external_depth; 215 215 static int external_pmode; 216 - static void *external_addr; 216 + static void *external_screen_base; 217 + static unsigned long external_addr; 217 218 static unsigned long external_len; 218 219 static unsigned long external_vgaiobase; 219 220 static unsigned int external_bitspercol = 6; ··· 593 592 int mode; 594 593 595 594 strcpy(fix->id, "Atari Builtin"); 596 - fix->smem_start = (unsigned long)real_screen_base; 595 + fix->smem_start = phys_screen_base; 597 596 fix->smem_len = screen_len; 598 597 fix->type = FB_TYPE_INTERLEAVED_PLANES; 599 598 fix->type_aux = 2; ··· 791 790 addr = ((shifter.bas_hi & 0xff) << 16) | 792 791 ((shifter.bas_md & 0xff) << 8) | 793 792 ((shifter.bas_lo & 0xff)); 794 - par->screen_base = phys_to_virt(addr); 793 + par->screen_base = atari_stram_to_virt(addr); 795 794 } 796 795 797 796 static void tt_set_par(struct atafb_par *par) ··· 889 888 struct atafb_par *par) 890 889 { 891 890 strcpy(fix->id, "Atari Builtin"); 892 - fix->smem_start = (unsigned long)real_screen_base; 891 + fix->smem_start = phys_screen_base; 893 892 fix->smem_len = screen_len; 894 893 fix->type = FB_TYPE_INTERLEAVED_PLANES; 895 894 fix->type_aux = 2; ··· 1585 1584 addr = (shifter.bas_hi & 0xff) << 16 | 1586 1585 (shifter.bas_md & 0xff) << 8 | 1587 1586 (shifter.bas_lo & 0xff); 1588 - par->screen_base = phys_to_virt(addr); 1587 + par->screen_base = atari_stram_to_virt(addr); 1589 1588 1590 1589 /* derived parameters */ 1591 1590 hw->ste_mode = (hw->f_shift & 0x510) == 0 && hw->st_shift == 0x100; ··· 1815 1814 int mode; 1816 1815 1817 1816 strcpy(fix->id, "Atari Builtin"); 1818 - fix->smem_start = (unsigned long)real_screen_base; 1817 + fix->smem_start = phys_screen_base; 1819 1818 fix->smem_len = screen_len; 1820 1819 fix->type = FB_TYPE_INTERLEAVED_PLANES; 1821 1820 fix->type_aux = 2; ··· 1981 1980 ((shifter.bas_md & 0xff) << 8); 1982 1981 if (ATARIHW_PRESENT(EXTD_SHIFTER)) 1983 1982 addr |= (shifter.bas_lo & 0xff); 1984 - par->screen_base = phys_to_virt(addr); 1983 + par->screen_base = atari_stram_to_virt(addr); 1985 1984 } 1986 1985 1987 1986 static void stste_set_par(struct atafb_par *par) ··· 2040 2039 static void stste_set_screen_base(void *s_base) 2041 2040 { 2042 2041 unsigned long addr; 2043 - addr = virt_to_phys(s_base); 2042 + addr = atari_stram_to_phys(s_base); 2044 2043 /* Setup Screen Memory */ 2045 2044 shifter.bas_hi = (unsigned char)((addr & 0xff0000) >> 16); 2046 2045 shifter.bas_md = (unsigned char)((addr & 0x00ff00) >> 8); ··· 2114 2113 static int ext_encode_fix(struct fb_fix_screeninfo *fix, struct atafb_par *par) 2115 2114 { 2116 2115 strcpy(fix->id, "Unknown Extern"); 2117 - fix->smem_start = (unsigned long)external_addr; 2116 + fix->smem_start = external_addr; 2118 2117 fix->smem_len = PAGE_ALIGN(external_len); 2119 2118 if (external_depth == 1) { 2120 2119 fix->type = FB_TYPE_PACKED_PIXELS; ··· 2214 2213 2215 2214 static void ext_get_par(struct atafb_par *par) 2216 2215 { 2217 - par->screen_base = external_addr; 2216 + par->screen_base = external_screen_base; 2218 2217 } 2219 2218 2220 2219 static void ext_set_par(struct atafb_par *par) ··· 2287 2286 { 2288 2287 unsigned long addr; 2289 2288 2290 - addr = virt_to_phys(s_base); 2289 + addr = atari_stram_to_phys(s_base); 2291 2290 /* Setup Screen Memory */ 2292 2291 shifter.bas_hi = (unsigned char)((addr & 0xff0000) >> 16); 2293 2292 shifter.bas_md = (unsigned char)((addr & 0x00ff00) >> 8); ··· 2434 2433 atafb_get_var(&info->var, info); 2435 2434 atafb_get_fix(&info->fix, info); 2436 2435 2437 - info->screen_base = (void *)info->fix.smem_start; 2436 + /* Note: smem_start derives from phys_screen_base, not screen_base! */ 2437 + info->screen_base = (external_addr ? external_screen_base : 2438 + atari_stram_to_virt(info->fix.smem_start)); 2438 2439 } 2439 2440 2440 2441 static int atafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ··· 2907 2904 external_yres = yres; 2908 2905 external_depth = depth; 2909 2906 external_pmode = planes; 2910 - external_addr = (void *)addr; 2907 + external_addr = addr; 2911 2908 external_len = len; 2912 2909 2913 2910 if (external_card_type == IS_MV300) { ··· 3169 3166 memset(screen_base, 0, mem_req); 3170 3167 pad = -(unsigned long)screen_base & (PAGE_SIZE - 1); 3171 3168 screen_base += pad; 3172 - real_screen_base = screen_base + ovsc_offset; 3169 + phys_screen_base = atari_stram_to_phys(screen_base + ovsc_offset); 3173 3170 screen_len = (mem_req - pad - ovsc_offset) & PAGE_MASK; 3174 3171 st_ovsc_switch(); 3175 3172 if (CPU_IS_040_OR_060) { 3176 3173 /* On a '040+, the cache mode of video RAM must be set to 3177 3174 * write-through also for internal video hardware! */ 3178 - cache_push(virt_to_phys(screen_base), screen_len); 3175 + cache_push(atari_stram_to_phys(screen_base), screen_len); 3179 3176 kernel_set_cachemode(screen_base, screen_len, 3180 3177 IOMAP_WRITETHROUGH); 3181 3178 } 3182 - printk("atafb: screen_base %p real_screen_base %p screen_len %d\n", 3183 - screen_base, real_screen_base, screen_len); 3179 + printk("atafb: screen_base %p phys_screen_base %lx screen_len %d\n", 3180 + screen_base, phys_screen_base, screen_len); 3184 3181 #ifdef ATAFB_EXT 3185 3182 } else { 3186 3183 /* Map the video memory (physical address given) to somewhere 3187 3184 * in the kernel address space. 3188 3185 */ 3189 - external_addr = ioremap_writethrough((unsigned long)external_addr, 3186 + external_screen_base = ioremap_writethrough(external_addr, 3190 3187 external_len); 3191 3188 if (external_vgaiobase) 3192 3189 external_vgaiobase = 3193 3190 (unsigned long)ioremap(external_vgaiobase, 0x10000); 3194 - screen_base = 3195 - real_screen_base = external_addr; 3191 + screen_base = external_screen_base; 3192 + phys_screen_base = external_addr; 3196 3193 screen_len = external_len & PAGE_MASK; 3197 3194 memset (screen_base, 0, external_len); 3198 3195 } ··· 3238 3235 if (register_framebuffer(&fb_info) < 0) { 3239 3236 #ifdef ATAFB_EXT 3240 3237 if (external_addr) { 3241 - iounmap(external_addr); 3242 - external_addr = NULL; 3238 + iounmap(external_screen_base); 3239 + external_addr = 0; 3243 3240 } 3244 3241 if (external_vgaiobase) { 3245 3242 iounmap((void*)external_vgaiobase);