gxt4500: enable on non-PPC architectures
PATCH RESEND 1/5 gxt4500: enable on non-PPC architectures
These chips can be present at least on x86 too - Fire GL2 AGP has GXT6000P but this driver is currently limited to PPC.
Enable it for all architectures and add chip configuration for little-endian.
Tested on x86 with Fire GL2 AGP.
--- drivers/video/fbdev/Kconfig | 5 +++-- drivers/video/fbdev/gxt4500.c | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/video/fbdev/Kconfig +3 -2
@@ -2132,7 +2132,7 @@ config FB_UDL config FB_IBM_GXT4500 tristate "Framebuffer support for IBM GXT4000P/4500P/6000P/6500P adaptors" - depends on FB && PPC + depends on FB select FB_CFB_FILLRECT select FB_CFB_COPYAREA select FB_CFB_IMAGEBLIT
@@ -2140,7 +2140,8 @@ config FB_IBM_GXT4500 Say Y here to enable support for the IBM GXT4000P/6000P and GXT4500P/6500P display adaptor based on Raster Engine RC1000, found on some IBM System P (pSeries) machines. This driver - doesn't use Geometry Engine GT1000. + doesn't use Geometry Engine GT1000. This driver also supports + AGP Fire GL2/3/4 cards on x86. config FB_PS3 tristate "PS3 GPU framebuffer driver"
drivers/video/fbdev/gxt4500.c +7 -0
@@ -670,8 +670,15 @@ static int gxt4500_probe(struct pci_dev *pdev, const struct pci_device_id *ent)pci_set_drvdata (pdev, info); +#ifdef __BIG_ENDIAN/* Set byte-swapping for DFA aperture for all pixel sizes */ pci_write_config_dword (pdev,CFG_ENDIAN0 ,0x333300 ); +#else /* __LITTLE_ENDIAN */ +/* not sure what this means but fgl23 driver does that */ +pci_write_config_dword (pdev,CFG_ENDIAN0 ,0x2300 ); +/* pci_write_config_dword(pdev, CFG_ENDIAN0 + 4, 0x400000);*/ +pci_write_config_dword (pdev,CFG_ENDIAN0 +8 ,0x98530000 ); +#endif info->fbops = &gxt4500_ops; info->flags =FBINFO_FLAG_DEFAULT ;
Signature · 1 line
Ondrej Zary
PATCH RESEND 2/5 gxt4500: fix 16bpp 565 mode
Fix wrong colors in 16bpp 565 mode.
--- drivers/video/fbdev/gxt4500.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/gxt4500.c +1 -1
@@ -525,7 +525,7 @@ static int gxt4500_setcolreg(unsigned int reg, unsigned int red,u32 val = reg;switch (par->pixfmt) {case DFA_PIX_16BIT_565 : - val |= (reg <<11 ) | (reg <<6 ); + val |= (reg <<11 ) | (reg <<5 );break ;case DFA_PIX_16BIT_1555 : val |= (reg <<10 ) | (reg <<5 );
Signature · 1 line
Ondrej Zary
PATCH RESEND 3/5 gxt4500: fix color order
In reply to Ondrej ZaryThe color order in truecolor modes is wrong. This does not affect console but is visible e.g. in X11 which has wrong colors.
Swap blue and red colors to fix the problem.
Fixes https://forums.gentoo.org/viewtopic-t-692740-start-0.html
--- drivers/video/fbdev/gxt4500.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/video/fbdev/gxt4500.c +4 -3
@@ -347,11 +347,12 @@ static void gxt4500_unpack_pixfmt(struct fb_var_screeninfo *var,break ; }if (pixfmt !=DFA_PIX_8BIT ) { - var->green.offset = var->red.length; - var->blue.offset = var->green.offset + var->green.length; + var->blue.offset =0 ; + var->green.offset = var->blue.length; + var->red.offset = var->green.offset + var->green.length;if (var->transp.length) var->transp.offset - var->blue.offset + var->blue.length; + var->red.offset + var->red.length; } } --
Ondrej Zary
PATCH RESEND 4/5 gxt4500: Use write-combining for framebuffer (PAT and MTRR)
In reply to Ondrej ZaryUse write-combining for framebuffer to greatly improve performance on x86. Add both ioremap_wc (for systems with PAT) and MTRR setup for non-PAT systems.
--- drivers/video/fbdev/gxt4500.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-)
drivers/video/fbdev/gxt4500.c +30 -2
@@ -13,6 +13,9 @@#include <linux/pci_ids.h> #include <linux/delay.h> #include <linux/string.h> +#ifdef CONFIG_MTRR +#include <asm/mtrr.h> +#endif #define PCI_DEVICE_ID_IBM_GXT4500P 0x21c#define PCI_DEVICE_ID_IBM_GXT6500P 0x21b
@@ -142,7 +145,9 @@ static const unsigned char watfmt[] = {struct gxt4500_par {void __iomem *regs; - +#ifdef CONFIG_MTRR +int mtrr_reg; +#endif int pixfmt;/* pixel format, see DFA_PIX_* values */ /* PLL parameters */
@@ -158,6 +163,10 @@ struct gxt4500_par {/* mode requested by user */ static char *mode_option; +#ifdef CONFIG_MTRR +static int mtrr =1 ; +#endif +/* default mode: 1280x1024 @ 60 Hz, 8 bpp */ static const struct fb_videomode defaultmode = { .refresh =60 ,
@@ -663,7 +672,7 @@ static int gxt4500_probe(struct pci_dev *pdev, const struct pci_device_id *ent) info->fix.smem_start = fb_phys; info->fix.smem_len =pci_resource_len (pdev,1 ); - info->screen_base =pci_ioremap_bar (pdev,1 ); + info->screen_base =ioremap_wc (fb_phys, info->fix.smem_len);if (!info->screen_base) {dev_err (&pdev->dev,"gxt4500: cannot map framebuffer\n" ); goto err_unmap_regs;
@@ -671,6 +680,14 @@ static int gxt4500_probe(struct pci_dev *pdev, const struct pci_device_id *ent)pci_set_drvdata (pdev, info); +#ifdef CONFIG_MTRR +if (mtrr) { + par->mtrr_reg =-1 ; + par->mtrr_reg =mtrr_add (info->fix.smem_start, + info->fix.smem_len,MTRR_TYPE_WRCOMB ,1 ); + } +#endif +#ifdef __BIG_ENDIAN/* Set byte-swapping for DFA aperture for all pixel sizes */ pci_write_config_dword (pdev,CFG_ENDIAN0 ,0x333300 );
@@ -735,6 +752,12 @@ static void gxt4500_remove(struct pci_dev *pdev)return ; par = info->par;unregister_framebuffer (info); +#ifdef CONFIG_MTRR +if (par->mtrr_reg >=0 ) { +mtrr_del (par->mtrr_reg,0 ,0 ); + par->mtrr_reg =-1 ; + } +#endif fb_dealloc_cmap (&info->cmap);iounmap (par->regs);iounmap (info->screen_base);
@@ -789,3 +812,8 @@ MODULE_DESCRIPTION("FBDev driver for IBM GXT4500P/6500P and GXT4000P/6000P");MODULE_LICENSE ("GPL" );module_param (mode_option, charp,0 );MODULE_PARM_DESC (mode_option,"Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\"" ); + +#ifdef CONFIG_MTRR +module_param (mtrr, int,0444 ); +MODULE_PARM_DESC (mtrr,"Enable write-combining with MTRR (1=enable, 0=disable, default=1)" ); +#endif
Signature · 1 line
Ondrej Zary
PATCH RESEND 5/5 gxt4500: enable panning
In reply to Ondrej ZaryThe driver implements pan_display but the corresponding flags are not set.
Add FBINFO_HWACCEL_XPAN and FBINFO_HWACCEL_YPAN to flags to allow HW accelerated panning (for fast scrolling).
--- drivers/video/fbdev/gxt4500.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/fbdev/gxt4500.c +2 -1
@@ -699,7 +699,8 @@ static int gxt4500_probe(struct pci_dev *pdev, const struct pci_device_id *ent)#endif info->fbops = &gxt4500_ops; - info->flags =FBINFO_FLAG_DEFAULT ; + info->flags =FBINFO_FLAG_DEFAULT |FBINFO_HWACCEL_XPAN | +FBINFO_HWACCEL_YPAN ; err =fb_alloc_cmap (&info->cmap,256 ,0 );if (err) {
Signature · 1 line
Ondrej Zary