linux/drivers/video
Thomas Schlichter 803a4e14a7 uvesafb,vesafb: create WC or WB PAT-entries
with an PAT-enabled kernel, when using uvesafb or vesafb, these drivers will
create uncached-minus PAT entries for the framebuffer memory because they use
ioremap() (not the *_cache or *_wc variants). When the framebuffer memory
intersects with the video RAM used by Xorg, the complete video RAM will be
mapped uncached-minus what results in a serve performance penalty.

Here are the correct MTRR entries created by uvesafb:
schlicht@netbook:~$ cat /proc/mtrr
reg00: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back
reg01: base=0x06ff00000 ( 1791MB), size= 1MB, count=1: uncachable
reg02: base=0x070000000 ( 1792MB), size= 256MB, count=1: uncachable
reg03: base=0x0d0000000 ( 3328MB), size= 16MB, count=1: write-combining

And here are the problematic PAT entries:
schlicht@netbook:~$ sudo cat /sys/kernel/debug/x86/pat_memtype_list
PAT memtype list:
write-back @ 0x0-0x1000
uncached-minus @ 0x6fedd000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0xd0000000-0xe0000000 <-- created by xserver-xorg
uncached-minus @ 0xd0000000-0xd1194000 <-- created by uvesafb
uncached-minus @ 0xf4000000-0xf4009000
uncached-minus @ 0xf4200000-0xf4400000
uncached-minus @ 0xf5000000-0xf5010000
uncached-minus @ 0xf5100000-0xf5104000
uncached-minus @ 0xf5400000-0xf5404000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xfed00000-0xfed01000

Therefore I created the attached patch for uvesafb which uses ioremap_wc() to
create the correct PAT entries, as shown below:
schlicht@netbook:~$ sudo cat /sys/kernel/debug/x86/pat_memtype_list
PAT memtype list:
write-back @ 0x0-0x1000
uncached-minus @ 0x6fedd000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee2000-0x6fee3000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
uncached-minus @ 0x6fee3000-0x6fee4000
write-combining @ 0xd0000000-0xe0000000
write-combining @ 0xd0000000-0xd1194000
uncached-minus @ 0xf4000000-0xf4009000
uncached-minus @ 0xf4200000-0xf4400000
uncached-minus @ 0xf5000000-0xf5010000
uncached-minus @ 0xf5100000-0xf5104000
uncached-minus @ 0xf5400000-0xf5404000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xf5404000-0xf5405000
uncached-minus @ 0xfed00000-0xfed01000

This results in a performance gain, objectively measurable with e.g.
x11perf -comppixwin10 -comppixwin100 -comppixwin500:
1: x11perf_xaa.log
2: x11perf_xaa_patched.log

       1                2 Operation
-------- ---------------- -----------------
124000.0 202000.0 ( 1.63) Composite 10x10 from pixmap to window
  3340.0  24400.0 ( 7.31) Composite 100x100 from pixmap to window
   131.0   1150.0 ( 8.78) Composite 500x500 from pixmap to window

You can see the serve performance gain when composing larger pixmaps to window.

The patches replace the ioremap() function with the variant matching the mtrr-
parameter. To create "write-back" PAT entries, the ioremap_cache() function
must be called after creating the MTRR entries, and the ioremap_cache() region
must completely fit into the MTRR region, this is why the MTRR region size is
now rounded up to the next power-of-two.

Signed-off-by: Thomas Schlichter <thomas.schlichter@web.de>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
2011-03-22 16:20:44 +09:00
..
aty radeonfb: Let hwmon driver probe the "monid" I2C bus 2011-03-22 16:17:48 +09:00
backlight drivers/video/backlight/ltv350qv.c: fix a memory leak 2011-03-04 17:53:38 -08:00
console console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
display include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
geode console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
i810 console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
intelfb video: change to new flag variable 2011-03-17 14:05:35 +01:00
kyro
logo fbdev: move logo externs to header file 2009-06-16 19:47:57 -07:00
matrox matroxfb: remove incorrect Matrox G200eV support 2011-03-21 15:50:30 -07:00
mb862xx dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
mbx llseek: automatically add .llseek fop 2010-10-15 15:53:27 +02:00
msm msm: mdp: Set the correct pack pattern for XRGB/ARGB 2011-03-08 11:54:46 -08:00
nvidia console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
omap omap: use list_move() instead of list_del()/list_add() combination 2011-03-22 15:13:35 +09:00
omap2 OMAP: DSS2: Implement OMAP4 DSS fclk support 2011-03-18 09:31:03 +05:30
pnx4008 include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
riva Merge branch 'master' into for-next 2010-12-22 18:57:02 +01:00
savage console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
sis sisfb: add support for XGI Z9 DDR2 POST 2011-03-22 15:21:01 +09:00
vermilion vmlfb: use list_move() instead of list_del()/list_add() combination 2011-03-22 15:13:38 +09:00
via Merge branch 'viafb-pll' into viafb-next 2011-03-12 21:54:56 +00:00
68328fb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
acornfb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
acornfb.h
amba-clcd.c ARM: amba: make probe() functions take const id tables 2011-02-23 16:24:14 +00:00
amifb.c m68k: amiga - Frame buffer platform device conversion 2010-05-17 21:37:43 +02:00
arcfb.c Update broken web addresses in the kernel. 2010-10-18 11:03:14 +02:00
arkfb.c arkfb: Compute VGA base iomem pointer explicitly. 2011-03-22 15:47:55 +09:00
asiliantfb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
atafb_iplan2p2.c
atafb_iplan2p4.c
atafb_iplan2p8.c
atafb_mfb.c
atafb_utils.h
atafb.c fbdev: atafb - Remove undead ifdef ATAFB_FALCON 2010-10-22 09:43:25 +02:00
atafb.h
atmel_lcdfb.c backlight: constify backlight_ops 2010-11-16 14:14:02 +01:00
au1100fb.c VIDEO: Au1100fb: Fix section mismatch 2010-07-26 19:08:15 +01:00
au1100fb.h
au1200fb.c replace nested max/min macros with {max,min}3 macro 2010-10-26 16:52:12 -07:00
au1200fb.h
bf54x-lq043fb.c fix printk typo 'faild' 2010-08-09 11:25:17 +02:00
bf537-lq035.c drivers/video/bf537-lq035.c: Add missing IS_ERR test 2011-01-25 15:09:24 +09:00
bfin_adv7393fb.c fbdev: bfin_adv7393fb: new Blackfin ADV7393 driver 2010-11-26 15:06:39 +09:00
bfin_adv7393fb.h fbdev: bfin_adv7393fb: new Blackfin ADV7393 driver 2010-11-26 15:06:39 +09:00
bfin-lq035q1-fb.c fbdev: bfin-lq035q1-fb: respect new PPI mode platform field 2010-05-25 08:07:08 -07:00
bfin-t350mcqb-fb.c fix printk typo 'faild' 2010-08-09 11:25:17 +02:00
broadsheetfb.c broadsheetfb: support storing waveform 2010-03-12 15:52:34 -08:00
bt431.h
bt455.h
bw2.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
c2p_core.h
c2p_iplan2.c
c2p_planar.c
c2p.h
carminefb_regs.h
carminefb.c drivers/video/carminefb.c: improve error handling 2011-01-06 15:46:56 +09:00
carminefb.h
cfbcopyarea.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
cfbfillrect.c fbdev: fix fillrect for 24bpp modes 2009-05-06 16:36:10 -07:00
cfbimgblt.c
cg3.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
cg6.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
cg14.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
chipsfb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
cirrusfb.c m68k: amiga - Zorro bus modalias support 2010-05-17 21:37:41 +02:00
clps711xfb.c clps711xfb: convert to proc_fops 2009-12-16 07:20:04 -08:00
cobalt_lcdfb.c cocbalt_lcdfb: correct sections 2010-05-03 15:42:58 +02:00
controlfb.c of/address: Clean up function declarations 2010-08-01 01:42:42 -06:00
controlfb.h
cyber2000fb.c VIDEO: cyberpro: remove unused cyber2000fb_get_fb_var() 2011-02-11 10:16:07 +00:00
cyber2000fb.h VIDEO: cyberpro: remove unused cyber2000fb_get_fb_var() 2011-02-11 10:16:07 +00:00
da8xx-fb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
dnfb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
edid.h
efifb.c efifb: support the EFI framebuffer on more Apple hardware 2010-09-22 17:22:39 -07:00
ep93xx-fb.c ARM: 6616/1: Fix ep93xx-fb init/exit annotations 2011-01-11 12:26:58 +00:00
epson1355fb.c Update broken web addresses in the kernel. 2010-10-18 11:03:14 +02:00
fb_ddc.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
fb_defio.c workqueue: convert cancel_rearming_delayed_work[queue]() users to cancel_delayed_work_sync() 2010-12-15 10:56:11 +01:00
fb_draw.h fbdev: fix fillrect for 24bpp modes 2009-05-06 16:36:10 -07:00
fb_notify.c
fb_sys_fops.c
fb-puv3.c unicore32 machine related: add frame buffer driver for pkunity-v3 soc 2011-03-17 09:19:20 +08:00
fbcmap.c framebuffer: fix fbcmap.c kernel-doc warning 2010-11-26 15:05:08 +09:00
fbcvt.c Update broken web addresses in the kernel. 2010-10-18 11:03:14 +02:00
fbmem.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
fbmon.c fbdev: when parsing E-EDID blocks, also use SVD entries 2010-11-15 14:52:23 +09:00
fbsysfs.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
ffb.c video: ffb: fix ffb_probe error path 2011-03-22 16:18:51 +09:00
fm2fb.c m68k: amiga - Zorro bus modalias support 2010-05-17 21:37:41 +02:00
fsl-diu-fb.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
g364fb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
gbefb.c drivers/video/gbefb.c: eliminate memory leak 2010-10-27 18:03:08 -07:00
gxt4500.c
hecubafb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
hgafb.c video: Fix the HGA framebuffer driver 2011-01-06 15:48:13 +09:00
hitfb.c hitfb: fix sections 2010-05-25 08:07:09 -07:00
hpfb.c video: hpfb: use resource_size() 2011-03-22 16:07:32 +09:00
igafb.c drivers/video/igafb.c: make igafb_setup() and igafb_init() static 2010-08-11 08:59:12 -07:00
imsttfb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
imxfb.c video: imx: Update the manufacturer's name 2011-01-12 15:06:59 +09:00
jz4740_fb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
Kconfig Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-03-17 19:08:06 -07:00
leo.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
macfb.c macfb: fix 24-bit visual and stuff 2010-02-27 18:31:16 +01:00
macmodes.c fbdev: add some missing mac modes 2010-02-27 18:31:14 +01:00
macmodes.h
Makefile Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-03-17 19:08:06 -07:00
maxinefb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
metronomefb.c Update broken web addresses in the kernel. 2010-10-18 11:03:14 +02:00
modedb.c video: tidy up modedb formatting. 2011-01-12 14:57:52 +09:00
mx3fb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
mxsfb.c video: Add i.MX23/28 framebuffer driver 2011-03-07 19:29:30 +01:00
n411.c
neofb.c
nuc900fb.c video: nuc900fb: properly free resources in nuc900fb_remove 2011-01-18 13:38:06 +09:00
nuc900fb.h NUC900 LCD Controller Driver 2010-03-12 15:52:34 -08:00
offb.c of/address: Clean up function declarations 2010-08-01 01:42:42 -06:00
output.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
p9100.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
platinumfb.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
platinumfb.h
pm2fb.c tree-wide: s/widht/width/g typo in comments 2010-02-05 12:22:42 +01:00
pm3fb.c
pmag-aa-fb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
pmag-ba-fb.c VIDEO: PMAG-BA: Fix section mismatch 2010-07-26 19:08:14 +01:00
pmagb-b-fb.c VIDEO: PMAGB-B: Fix section mismatch 2010-07-26 19:08:15 +01:00
ps3fb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
pvr2fb.c sh: Fix up more 64-bit pgprot truncation on SH-X2 TLB. 2010-02-17 13:23:00 +09:00
pxa3xx-gcu.c video: pxa3xx-gcu: Return -EFAULT when copy_from_user() fails 2011-01-18 13:40:34 +09:00
pxa3xx-gcu.h video: add driver for PXA3xx 2D graphics accelerator 2010-12-16 14:31:18 +08:00
pxa168fb.c video: pxa168fb: remove a redundant pxa168fb_check_var call 2011-01-25 15:09:19 +09:00
pxa168fb.h fb: add support of LCD display controller on pxa168/910 (base layer) 2009-06-13 00:09:09 +08:00
pxafb.c [ARM] pxafb: fix building issue of incorrect reference 2009-12-29 14:11:27 +08:00
pxafb.h
q40fb.c fbdev/m68k: Fix section mismatches in q40fb.c 2010-10-22 09:43:25 +02:00
s1d13xxxfb.c s1d13xxxfb: drop unused code 2010-12-21 01:05:43 +09:00
s3c2410fb.c s3c2410fb: don't treat NULL clk as an error 2011-01-12 15:00:31 +09:00
s3c2410fb.h s3c-fb: CPUFREQ frequency scaling support 2009-06-16 19:47:59 -07:00
s3c-fb.c s3c-fb: add support for runtime pm 2010-12-21 01:05:43 +09:00
s3fb.c s3fb: use new start address register 2011-03-22 15:50:00 +09:00
sa1100fb.c platform-drivers: move probe to .devinit.text in drivers/video 2010-03-07 17:04:50 -08:00
sa1100fb.h sa1100fb: fix color component length for pseudocolor modes 2009-04-13 15:04:29 -07:00
sbuslib.c
sbuslib.h
sgivwfb.c sgivwfb: fix sections 2010-05-25 08:07:09 -07:00
sh7760fb.c video: sh7760fb: use resource_size() 2011-03-22 16:07:35 +09:00
sh_mipi_dsi.c fbdev: sh_mipi_dsi: use platform provided register layout and values 2011-01-05 17:22:32 +09:00
sh_mobile_hdmi.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
sh_mobile_lcdcfb.c fbdev: sh_mobile_lcdc: checking NULL instead of IS_ERR() 2011-03-22 16:08:48 +09:00
sh_mobile_lcdcfb.h fbdev: sh_mobile_lcdc: Add YUV framebuffer support 2011-03-16 17:27:10 +09:00
skeletonfb.c
sm501fb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
sstfb.c tree-wide: fix comment/printk typos 2010-11-01 15:38:34 -04:00
sticore.h
stifb.c tree-wide: fix assorted typos all over the place 2009-12-04 15:39:55 +01:00
sunxvr500.c Merge branch 'master' into export-slabh 2010-04-05 11:37:28 +09:00
sunxvr1000.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
sunxvr2500.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
svgalib.c svga: Make svga_set_timings() take an iomem regbase pointer. 2011-03-22 15:47:22 +09:00
syscopyarea.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
sysfillrect.c fbdev: fix fillrect for 24bpp modes 2009-05-06 16:36:10 -07:00
sysimgblt.c
tcx.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
tdfxfb.c VIDEO: Correct use of request_region/request_mem_region 2010-08-05 13:25:38 +01:00
tgafb.c fix typos concerning "initiali[zs]e" 2010-06-16 18:05:05 +02:00
tmiofb.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
tridentfb.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
udlfb.c Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6 2011-01-10 16:04:53 -08:00
uvesafb.c uvesafb,vesafb: create WC or WB PAT-entries 2011-03-22 16:20:44 +09:00
valkyriefb.c valkyriefb: various fixes 2010-02-27 18:31:13 +01:00
valkyriefb.h valkyriefb: various fixes 2010-02-27 18:31:13 +01:00
vesafb.c uvesafb,vesafb: create WC or WB PAT-entries 2011-03-22 16:20:44 +09:00
vfb.c fbdev: section cleanup in vfb 2010-05-25 08:07:08 -07:00
vga16fb.c fbdev: section cleanup in vga16fb 2010-05-25 08:07:08 -07:00
vgastate.c
vt8500lcdfb.c fbdev: Implement simple blanking in pseudocolor modes for vt8500lcdfb 2011-01-13 13:07:41 +09:00
vt8500lcdfb.h ARM: Add support for the display controllers in VT8500 and WM8505 2010-11-09 18:52:07 +09:00
vt8623fb.c vt8623fb: Compute VGA base iomem pointer explicitly. 2011-03-22 15:47:59 +09:00
w100fb.c drivers/video/w100fb.c: ignore void return value / fix build failure 2010-08-09 20:44:53 -07:00
w100fb.h
wm8505fb_regs.h ARM: Add support for the display controllers in VT8500 and WM8505 2010-11-09 18:52:07 +09:00
wm8505fb.c fbdev: Modify vsync timing calculation in wm8505fb 2010-12-21 01:05:48 +09:00
wmt_ge_rops.c fbdev: Minor cleanup in WM8505-related code 2010-12-21 01:05:43 +09:00
wmt_ge_rops.h ARM: Add support for the display controllers in VT8500 and WM8505 2010-11-09 18:52:07 +09:00
xen-fbfront.c console: rename acquire/release_console_sem() to console_lock/unlock() 2011-01-26 10:50:06 +10:00
xilinxfb.c dt/video: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00