aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/via/viafbdev.c
diff options
context:
space:
mode:
authorFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>2009-09-22 19:47:31 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-09-23 10:39:53 -0400
commit31de59d5e1cd6968ea9d1a19cceefb7a037e46bf (patch)
treef9a081a1c850cfc931af25c6d40fb3b55efb24b5 /drivers/video/via/viafbdev.c
parent2d6e8851f608bd0c811f2df83eeff4ad8631e723 (diff)
viafb: hardware acceleration initialization cleanup
The main motivation of this patch was to merge the three initialization functions in one and clean it up. However as some changes in other code areas where needed to do it right some small other changes were made. Changes to viafb_par: io_virt renamed as engine_mmio and moved to shared VQ_start renamed as vq_vram_addr and moved to shared VQ_end removed as it is easily recalculatable vq_vram_addr is not strictly needed but keep it to track where we allocated video memory. The memory allocated for the virtual queue was shrunk to VQ_SIZE as VQ_SIZE+CURSOR_SIZE looked like a bug to me. But to be honest I don't have the faintest idea what virtual queues are for in the graphic hardware and whether the driver needs them in any way. I only know that they aren't directly accessed by the driver and so the only potential current use would be as hardware internal buffers. For now keep them to avoid regressions and only remove the double cursor allocation. The most changes were caused by renames and the mentioned structure changes so the chance of regressions is pretty low. The meaning of viafb_accel changed slightly as previously it was changed back and forth in the code and allowed to enable the hardware acceleration by software if previously disabled. The new behaviour is that viafb_accel=0 always prevents hardware acceleration. With viafb_accel!=0 the acceleration can be freely choosen by set_var. This means viafb_accel is a diagnostic tool and if someone has to use viafb_accel=0 the driver needs to be fixed. As this is mostly a code cleanup no regressions beside the slightly change of viafb_accel is expected. Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> Cc: Scott Fang <ScottFang@viatech.com.cn> Cc: Joseph Chan <JosephChan@via.com.tw> Cc: Harald Welte <laforge@gnumonks.org> Cc: Jonathan Corbet <corbet@lwn.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video/via/viafbdev.c')
-rw-r--r--drivers/video/via/viafbdev.c80
1 files changed, 36 insertions, 44 deletions
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
index e9c9f0ec842a..8e43759a0b8d 100644
--- a/drivers/video/via/viafbdev.c
+++ b/drivers/video/via/viafbdev.c
@@ -33,6 +33,8 @@ static u32 pseudo_pal[17];
33static char *viafb_mode = "640x480"; 33static char *viafb_mode = "640x480";
34static char *viafb_mode1 = "640x480"; 34static char *viafb_mode1 = "640x480";
35 35
36static int viafb_accel = 1;
37
36/* Added for specifying active devices.*/ 38/* Added for specifying active devices.*/
37char *viafb_active_dev = ""; 39char *viafb_active_dev = "";
38 40
@@ -140,6 +142,9 @@ static int viafb_check_var(struct fb_var_screeninfo *var,
140 142
141 /* Adjust var according to our driver's own table */ 143 /* Adjust var according to our driver's own table */
142 viafb_fill_var_timing_info(var, viafb_refresh, vmode_index); 144 viafb_fill_var_timing_info(var, viafb_refresh, vmode_index);
145 if (info->var.accel_flags & FB_ACCELF_TEXT &&
146 !ppar->shared->engine_mmio)
147 info->var.accel_flags = 0;
143 148
144 return 0; 149 return 0;
145} 150}
@@ -177,8 +182,10 @@ static int viafb_set_par(struct fb_info *info)
177 182
178 viafb_update_fix(info); 183 viafb_update_fix(info);
179 viafb_bpp = info->var.bits_per_pixel; 184 viafb_bpp = info->var.bits_per_pixel;
180 /* Update viafb_accel, it is necessary to our 2D accelerate */ 185 if (info->var.accel_flags & FB_ACCELF_TEXT)
181 viafb_accel = info->var.accel_flags; 186 info->flags &= ~FBINFO_HWACCEL_DISABLED;
187 else
188 info->flags |= FBINFO_HWACCEL_DISABLED;
182 } 189 }
183 190
184 return 0; 191 return 0;
@@ -764,10 +771,11 @@ static void viafb_fillrect(struct fb_info *info,
764 const struct fb_fillrect *rect) 771 const struct fb_fillrect *rect)
765{ 772{
766 struct viafb_par *viapar = info->par; 773 struct viafb_par *viapar = info->par;
774 struct viafb_shared *shared = viapar->shared;
767 u32 fg_color; 775 u32 fg_color;
768 u8 rop; 776 u8 rop;
769 777
770 if (!viapar->shared->hw_bitblt) { 778 if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt) {
771 cfb_fillrect(info, rect); 779 cfb_fillrect(info, rect);
772 return; 780 return;
773 } 781 }
@@ -786,7 +794,7 @@ static void viafb_fillrect(struct fb_info *info,
786 rop = 0xF0; 794 rop = 0xF0;
787 795
788 DEBUG_MSG(KERN_DEBUG "viafb 2D engine: fillrect\n"); 796 DEBUG_MSG(KERN_DEBUG "viafb 2D engine: fillrect\n");
789 if (viapar->shared->hw_bitblt(viapar->io_virt, VIA_BITBLT_FILL, 797 if (shared->hw_bitblt(shared->engine_mmio, VIA_BITBLT_FILL,
790 rect->width, rect->height, info->var.bits_per_pixel, 798 rect->width, rect->height, info->var.bits_per_pixel,
791 viapar->vram_addr, info->fix.line_length, rect->dx, rect->dy, 799 viapar->vram_addr, info->fix.line_length, rect->dx, rect->dy,
792 NULL, 0, 0, 0, 0, fg_color, 0, rop)) 800 NULL, 0, 0, 0, 0, fg_color, 0, rop))
@@ -797,8 +805,9 @@ static void viafb_copyarea(struct fb_info *info,
797 const struct fb_copyarea *area) 805 const struct fb_copyarea *area)
798{ 806{
799 struct viafb_par *viapar = info->par; 807 struct viafb_par *viapar = info->par;
808 struct viafb_shared *shared = viapar->shared;
800 809
801 if (!viapar->shared->hw_bitblt) { 810 if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt) {
802 cfb_copyarea(info, area); 811 cfb_copyarea(info, area);
803 return; 812 return;
804 } 813 }
@@ -807,7 +816,7 @@ static void viafb_copyarea(struct fb_info *info,
807 return; 816 return;
808 817
809 DEBUG_MSG(KERN_DEBUG "viafb 2D engine: copyarea\n"); 818 DEBUG_MSG(KERN_DEBUG "viafb 2D engine: copyarea\n");
810 if (viapar->shared->hw_bitblt(viapar->io_virt, VIA_BITBLT_COLOR, 819 if (shared->hw_bitblt(shared->engine_mmio, VIA_BITBLT_COLOR,
811 area->width, area->height, info->var.bits_per_pixel, 820 area->width, area->height, info->var.bits_per_pixel,
812 viapar->vram_addr, info->fix.line_length, area->dx, area->dy, 821 viapar->vram_addr, info->fix.line_length, area->dx, area->dy,
813 NULL, viapar->vram_addr, info->fix.line_length, 822 NULL, viapar->vram_addr, info->fix.line_length,
@@ -819,10 +828,11 @@ static void viafb_imageblit(struct fb_info *info,
819 const struct fb_image *image) 828 const struct fb_image *image)
820{ 829{
821 struct viafb_par *viapar = info->par; 830 struct viafb_par *viapar = info->par;
831 struct viafb_shared *shared = viapar->shared;
822 u32 fg_color = 0, bg_color = 0; 832 u32 fg_color = 0, bg_color = 0;
823 u8 op; 833 u8 op;
824 834
825 if (!viapar->shared->hw_bitblt || 835 if (info->flags & FBINFO_HWACCEL_DISABLED || !shared->hw_bitblt ||
826 (image->depth != 1 && image->depth != viapar->depth)) { 836 (image->depth != 1 && image->depth != viapar->depth)) {
827 cfb_imageblit(info, image); 837 cfb_imageblit(info, image);
828 return; 838 return;
@@ -843,7 +853,7 @@ static void viafb_imageblit(struct fb_info *info,
843 op = VIA_BITBLT_COLOR; 853 op = VIA_BITBLT_COLOR;
844 854
845 DEBUG_MSG(KERN_DEBUG "viafb 2D engine: imageblit\n"); 855 DEBUG_MSG(KERN_DEBUG "viafb 2D engine: imageblit\n");
846 if (viapar->shared->hw_bitblt(viapar->io_virt, op, 856 if (shared->hw_bitblt(shared->engine_mmio, op,
847 image->width, image->height, info->var.bits_per_pixel, 857 image->width, image->height, info->var.bits_per_pixel,
848 viapar->vram_addr, info->fix.line_length, image->dx, image->dy, 858 viapar->vram_addr, info->fix.line_length, image->dx, image->dy,
849 (u32 *)image->data, 0, 0, 0, 0, fg_color, bg_color, 0)) 859 (u32 *)image->data, 0, 0, 0, 0, fg_color, bg_color, 0))
@@ -853,6 +863,7 @@ static void viafb_imageblit(struct fb_info *info,
853static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor) 863static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
854{ 864{
855 struct viafb_par *viapar = info->par; 865 struct viafb_par *viapar = info->par;
866 void __iomem *engine = viapar->shared->engine_mmio;
856 u32 temp, xx, yy, bg_color = 0, fg_color = 0, 867 u32 temp, xx, yy, bg_color = 0, fg_color = 0,
857 chip_name = viapar->shared->chip_info.gfx_chip_name; 868 chip_name = viapar->shared->chip_info.gfx_chip_name;
858 int i, j = 0, cur_size = 64; 869 int i, j = 0, cur_size = 64;
@@ -867,7 +878,7 @@ static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
867 878
868 if (cursor->set & FB_CUR_SETHOT) { 879 if (cursor->set & FB_CUR_SETHOT) {
869 temp = (cursor->hot.x << 16) + cursor->hot.y; 880 temp = (cursor->hot.x << 16) + cursor->hot.y;
870 writel(temp, viapar->io_virt + VIA_REG_CURSOR_ORG); 881 writel(temp, engine + VIA_REG_CURSOR_ORG);
871 } 882 }
872 883
873 if (cursor->set & FB_CUR_SETPOS) { 884 if (cursor->set & FB_CUR_SETPOS) {
@@ -875,7 +886,7 @@ static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
875 xx = cursor->image.dx - info->var.xoffset; 886 xx = cursor->image.dx - info->var.xoffset;
876 temp = yy & 0xFFFF; 887 temp = yy & 0xFFFF;
877 temp |= (xx << 16); 888 temp |= (xx << 16);
878 writel(temp, viapar->io_virt + VIA_REG_CURSOR_POS); 889 writel(temp, engine + VIA_REG_CURSOR_POS);
879 } 890 }
880 891
881 if (cursor->image.width <= 32 && cursor->image.height <= 32) 892 if (cursor->image.width <= 32 && cursor->image.height <= 32)
@@ -889,13 +900,13 @@ static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
889 } 900 }
890 901
891 if (cursor->set & FB_CUR_SETSIZE) { 902 if (cursor->set & FB_CUR_SETSIZE) {
892 temp = readl(viapar->io_virt + VIA_REG_CURSOR_MODE); 903 temp = readl(engine + VIA_REG_CURSOR_MODE);
893 if (cur_size == 32) 904 if (cur_size == 32)
894 temp |= 0x2; 905 temp |= 0x2;
895 else 906 else
896 temp &= ~0x2; 907 temp &= ~0x2;
897 908
898 writel(temp, viapar->io_virt + VIA_REG_CURSOR_MODE); 909 writel(temp, engine + VIA_REG_CURSOR_MODE);
899 } 910 }
900 911
901 if (cursor->set & FB_CUR_SETCMAP) { 912 if (cursor->set & FB_CUR_SETCMAP) {
@@ -922,8 +933,8 @@ static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
922 ((info->cmap.blue[bg_color] & 0xFF00) >> 8); 933 ((info->cmap.blue[bg_color] & 0xFF00) >> 8);
923 } 934 }
924 935
925 writel(bg_color, viapar->io_virt + VIA_REG_CURSOR_BG); 936 writel(bg_color, engine + VIA_REG_CURSOR_BG);
926 writel(fg_color, viapar->io_virt + VIA_REG_CURSOR_FG); 937 writel(fg_color, engine + VIA_REG_CURSOR_FG);
927 } 938 }
928 939
929 if (cursor->set & FB_CUR_SETSHAPE) { 940 if (cursor->set & FB_CUR_SETSHAPE) {
@@ -996,8 +1007,8 @@ static int viafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
996 1007
997static int viafb_sync(struct fb_info *info) 1008static int viafb_sync(struct fb_info *info)
998{ 1009{
999 if (viafb_accel) 1010 if (!(info->flags & FBINFO_HWACCEL_DISABLED))
1000 viafb_wait_engine_idle(); 1011 viafb_wait_engine_idle(info);
1001 return 0; 1012 return 0;
1002} 1013}
1003 1014
@@ -1867,22 +1878,18 @@ static int __devinit via_pci_probe(void)
1867 1878
1868 viafb_get_mmio_info(&viafbinfo->fix.mmio_start, 1879 viafb_get_mmio_info(&viafbinfo->fix.mmio_start,
1869 &viafbinfo->fix.mmio_len); 1880 &viafbinfo->fix.mmio_len);
1870 viaparinfo->io_virt = ioremap_nocache(viafbinfo->fix.mmio_start,
1871 viafbinfo->fix.mmio_len);
1872 if (!viaparinfo->io_virt) {
1873 printk(KERN_WARNING "ioremap failed: hardware acceleration disabled\n");
1874 viafb_accel = 0;
1875 }
1876
1877 viafbinfo->node = 0; 1881 viafbinfo->node = 0;
1878 viafbinfo->fbops = &viafb_ops; 1882 viafbinfo->fbops = &viafb_ops;
1879 viafbinfo->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; 1883 viafbinfo->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
1880 1884
1881 viafbinfo->pseudo_palette = pseudo_pal; 1885 viafbinfo->pseudo_palette = pseudo_pal;
1882 if (viafb_accel) { 1886 if (viafb_accel && !viafb_init_engine(viafbinfo)) {
1883 viafb_init_accel(viaparinfo->shared); 1887 viafbinfo->flags |= FBINFO_HWACCEL_COPYAREA |
1884 viafb_init_2d_engine(); 1888 FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_IMAGEBLIT;
1885 viafb_hw_cursor_init(); 1889 default_var.accel_flags = FB_ACCELF_TEXT;
1890 } else {
1891 viafbinfo->flags |= FBINFO_HWACCEL_DISABLED;
1892 default_var.accel_flags = 0;
1886 } 1893 }
1887 1894
1888 if (viafb_second_size && (viafb_second_size < 8)) { 1895 if (viafb_second_size && (viafb_second_size < 8)) {
@@ -1963,15 +1970,6 @@ static int __devinit via_pci_probe(void)
1963 default_var.lower_margin = 4; 1970 default_var.lower_margin = 4;
1964 default_var.hsync_len = default_var.left_margin; 1971 default_var.hsync_len = default_var.left_margin;
1965 default_var.vsync_len = 4; 1972 default_var.vsync_len = 4;
1966 default_var.accel_flags = 0;
1967
1968 if (viafb_accel) {
1969 viafbinfo->flags |=
1970 (FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
1971 FBINFO_HWACCEL_IMAGEBLIT);
1972 default_var.accel_flags |= FB_ACCELF_TEXT;
1973 } else
1974 viafbinfo->flags |= FBINFO_HWACCEL_DISABLED;
1975 1973
1976 if (viafb_dual_fb) { 1974 if (viafb_dual_fb) {
1977 viafbinfo1 = framebuffer_alloc(viafb_par_length, NULL); 1975 viafbinfo1 = framebuffer_alloc(viafb_par_length, NULL);
@@ -1994,12 +1992,6 @@ static int __devinit via_pci_probe(void)
1994 viaparinfo1->fbmem_used; 1992 viaparinfo1->fbmem_used;
1995 viaparinfo->fbmem_free = viaparinfo->memsize; 1993 viaparinfo->fbmem_free = viaparinfo->memsize;
1996 viaparinfo->fbmem_used = 0; 1994 viaparinfo->fbmem_used = 0;
1997 if (viafb_accel) {
1998 viaparinfo1->VQ_start = viaparinfo->VQ_start -
1999 viafb_second_offset;
2000 viaparinfo1->VQ_end = viaparinfo->VQ_end -
2001 viafb_second_offset;
2002 }
2003 1995
2004 viaparinfo->iga_path = IGA1; 1996 viaparinfo->iga_path = IGA1;
2005 viaparinfo1->iga_path = IGA2; 1997 viaparinfo1->iga_path = IGA2;
@@ -2073,7 +2065,7 @@ static void __devexit via_pci_remove(void)
2073 if (viafb_dual_fb) 2065 if (viafb_dual_fb)
2074 unregister_framebuffer(viafbinfo1); 2066 unregister_framebuffer(viafbinfo1);
2075 iounmap((void *)viafbinfo->screen_base); 2067 iounmap((void *)viafbinfo->screen_base);
2076 iounmap(viaparinfo->io_virt); 2068 iounmap(viaparinfo->shared->engine_mmio);
2077 2069
2078 viafb_delete_i2c_buss(viaparinfo); 2070 viafb_delete_i2c_buss(viaparinfo);
2079 2071
@@ -2235,7 +2227,7 @@ MODULE_PARM_DESC(viafb_SAMM_ON,
2235 2227
2236module_param(viafb_accel, int, 0); 2228module_param(viafb_accel, int, 0);
2237MODULE_PARM_DESC(viafb_accel, 2229MODULE_PARM_DESC(viafb_accel,
2238 "Set 2D Hardware Acceleration.(Default = OFF)"); 2230 "Set 2D Hardware Acceleration: 0 = OFF, 1 = ON (default)");
2239 2231
2240module_param(viafb_active_dev, charp, 0); 2232module_param(viafb_active_dev, charp, 0);
2241MODULE_PARM_DESC(viafb_active_dev, "Specify active devices."); 2233MODULE_PARM_DESC(viafb_active_dev, "Specify active devices.");