linux/drivers
David Miller 969830b2fe radeonfb: fix accel engine hangs
Some chips appear to have the 2D engine hang during screen redraw,
typically in a sequence of copyarea operations. This appear to be
solved by adding a flush of the engine destination pixel cache
and waiting for the engine to be idle before issuing the accel
operation. The performance impact seems to be fairly small.

Here is a trace on an RV370 (PCI device ID 0x5b64), it records the
RBBM_STATUS register, then the source x/y, destination x/y, and
width/height used for the copy:

----------------------------------------
radeonfb_prim_copyarea: STATUS[00000140] src[210:70] dst[210:60] wh[a0:10]
radeonfb_prim_copyarea: STATUS[00000140] src[2b8:70] dst[2b8:60] wh[88:10]
radeonfb_prim_copyarea: STATUS[00000140] src[348:70] dst[348:60] wh[40:10]
radeonfb_prim_copyarea: STATUS[80020140] src[390:70] dst[390:60] wh[88:10]
radeonfb_prim_copyarea: STATUS[8002613f] src[40:80] dst[40:70] wh[28:10]
radeonfb_prim_copyarea: STATUS[80026139] src[a8:80] dst[a8:70] wh[38:10]
radeonfb_prim_copyarea: STATUS[80026133] src[e8:80] dst[e8:70] wh[80:10]
radeonfb_prim_copyarea: STATUS[8002612d] src[170:80] dst[170:70] wh[30:10]
radeonfb_prim_copyarea: STATUS[80026127] src[1a8:80] dst[1a8:70] wh[8:10]
radeonfb_prim_copyarea: STATUS[80026121] src[1b8:80] dst[1b8:70] wh[88:10]
radeonfb_prim_copyarea: STATUS[8002611b] src[248:80] dst[248:70] wh[68:10]
----------------------------------------

When things are going fine the copies complete before the next ROP is
even issued, but all of a sudden the 2D unit becomes active (bit 17 in
RBBM_STATUS) and the FIFO retry (bit 13) and FIFO pipeline busy (bit
14) are set as well.  The FIFO begins to backup until it becomes full.

What happens next is the radeon_fifo_wait() times out, and we access
the chip illegally leading to a bus error which usually wedges the
box.  None of this makes it to the console screen, of course :-)
radeon_fifo_wait() should be modified to reset the accelerator when
this timeout happens instead of programming the chip anyways.

----------------------------------------
radeonfb: FIFO Timeout !
ERROR(0): Cheetah error trap taken afsr[0010080005000000] afar[000007f900800e40] TL1(0)
ERROR(0): TPC[595114] TNPC[595118] O7[459788] TSTATE[11009601]
ERROR(0): TPC<radeonfb_copyarea+0xfc/0x248>
ERROR(0): M_SYND(0),  E_SYND(0), Privileged
ERROR(0): Highest priority error (0000080000000000) "Bus error response from system bus"
ERROR(0): D-cache idx[0] tag[0000000000000000] utag[0000000000000000] stag[0000000000000000]
ERROR(0): D-cache data0[0000000000000000] data1[0000000000000000] data2[0000000000000000] data3[0000000000000000]
ERROR(0): I-cache idx[0] tag[0000000000000000] utag[0000000000000000] stag[0000000000000000] u[0000000000000000] l[00\

ERROR(0): I-cache INSN0[0000000000000000] INSN1[0000000000000000] INSN2[0000000000000000] INSN3[0000000000000000]
ERROR(0): I-cache INSN4[0000000000000000] INSN5[0000000000000000] INSN6[0000000000000000] INSN7[0000000000000000]
ERROR(0): E-cache idx[800e40] tag[000000000e049f4c]
ERROR(0): E-cache data0[fffff8127d300180] data1[00000000004b5384] data2[0000000000000000] data3[0000000000000000]
Ker:xnel panic - not syncing: Irrecoverable deferred error trap.
----------------------------------------

Another quirk is that these copyarea calls will not happen until the
first drivers/char/vt.c:redraw_screen() occurs.  This will only happen
if you 1) VC switch or 2) run "consolechars" or 3) unblank the screen.

This seems to happen because until a redraw_screen() the screen scrolling
method used by fbcon is not finalized yet.  I've seen this with other fb
drivers too.

So if all you do is boot straight into X you will never see this bug on
the relevant chips.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: <stable@kernel.org>		[2.6.25.x, 2.6.26.x]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-08-12 16:07:28 -07:00
..
accessibility
acpi Remove newline from the description of module parameters 2008-08-01 12:46:41 -07:00
amba
ata avr32: Use <mach/foo.h> instead of <asm/arch/foo.h> 2008-08-05 14:36:57 +02:00
atm atm: fix direct casts of pointers to u32 in the InterPhase driver 2008-07-30 16:33:05 -07:00
auxdisplay auxdisplay: small cleanups 2008-07-24 10:47:41 -07:00
base Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-08-01 11:52:39 -07:00
block xen-blkfront.c: make blkif_ioctl() static 2008-08-06 12:30:04 +02:00
bluetooth [Bluetooth] Add full quirk implementation for btusb driver 2008-08-07 22:26:56 +02:00
cdrom cdrom: don't check CDC_PLAY_AUDIO in cdrom_count_tracks() 2008-08-05 18:17:02 +02:00
char Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-08-12 08:40:19 -07:00
clocksource Fix printk format warning in clocksource/acpi_pm.c 2008-07-15 11:01:39 -07:00
connector
cpufreq [CPUFREQ] Fix -Wshadow warning in conservative governor. 2008-08-08 16:00:48 -04:00
cpuidle cpuidle: make sysfs attributes sysdev class attributes 2008-08-12 16:07:28 -07:00
crypto [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
dca Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx 2008-07-23 12:03:18 -07:00
dio dio: use dio_match_device() in dio_bus_match() 2008-07-20 17:24:40 -07:00
dma Merge branch 'for-linus-merged' of master.kernel.org:/home/rmk/linux-2.6-arm 2008-08-08 11:38:42 -07:00
edac edac: mpc85xx fix pci ofdev 2nd pass 2008-07-25 10:53:49 -07:00
eisa driver core: remove DEVICE_NAME_SIZE define 2008-07-21 21:54:53 -07:00
firewire Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6 2008-08-06 12:03:43 -07:00
firmware iscsi_ibft_find: fix modpost warning 2008-07-30 09:41:44 -07:00
gpio gpio: max732x driver 2008-07-25 10:53:30 -07:00
gpu Remove newline from the description of module parameters 2008-08-01 12:46:41 -07:00
hid Merge branches 'upstream' and 'upstream-fixes' into for-linus 2008-07-23 15:26:10 +02:00
hwmon hwmon: (lm75) Drop legacy i2c driver 2008-08-10 22:56:16 +02:00
i2c i2c: correct some size_t printk formats 2008-08-10 22:56:16 +02:00
ide [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
ieee1394 PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures 2008-07-24 10:47:21 -07:00
infiniband Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband 2008-08-07 18:14:07 -07:00
input Merge branch 'for-linus-merged' of master.kernel.org:/home/rmk/linux-2.6-arm 2008-08-08 11:38:42 -07:00
isdn Add DIP switch readout for HFC-4S IOB4ST 2008-08-02 16:40:37 +02:00
leds [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
lguest lguest: use get_user_pages_fast() instead of get_user_pages() 2008-08-12 17:52:53 +10:00
macintosh remove unnecessary <linux/hdreg.h> includes 2008-08-05 18:16:58 +02:00
mca driver core: remove DEVICE_NAME_SIZE define 2008-07-21 21:54:53 -07:00
md Merge branch 'for-linus' of git://neil.brown.name/md 2008-08-01 11:56:07 -07:00
media Merge Linus' latest into master 2008-08-08 19:18:18 +01:00
memstick memstick: use fully asynchronous request processing 2008-07-26 12:00:04 -07:00
message Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 2008-07-27 10:04:52 -07:00
mfd mfd: tc6393 cleanup and update 2008-08-10 23:32:07 +02:00
misc Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 2008-08-06 11:46:39 -07:00
mmc mfd: have TMIO drivers and subdevices depend on ARM 2008-08-10 23:30:34 +02:00
mtd mfd: have TMIO drivers and subdevices depend on ARM 2008-08-10 23:30:34 +02:00
net uninline atl1e_setup_mac_ctrl() 2008-08-09 11:15:13 -07:00
nubus
of spi: Add OF binding support for SPI busses 2008-07-25 22:34:40 -04:00
oprofile
parisc
parport make parport_cs_release() static 2008-07-26 12:00:11 -07:00
pci PCI: Limit VPD length for Broadcom 5708S 2008-08-07 17:47:37 -07:00
pcmcia [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
pnp PNP: fix formatting of dbg_pnp_show_resources() output 2008-08-01 12:46:41 -07:00
power [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
ps3
rapidio rapidio: fix device reference counting 2008-07-10 18:04:43 -07:00
regulator regulator: TI bq24022 Li-Ion Charger driver 2008-07-30 10:10:23 +01:00
rtc rtc-isl1208: fix double removal of a sysfs entry 2008-08-12 16:07:28 -07:00
s390 [S390] qeth: avoid use of include/asm-s390 2008-08-01 16:39:36 +02:00
sbus sparc64: fix up bus_id changes in sparc core code 2008-07-21 21:55:03 -07:00
scsi make struct scsi_dh_devlist's static 2008-08-11 12:20:31 -07:00
serial [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
sh sh: Fix up broken kerneldoc comments. 2008-08-04 12:51:06 +09:00
sn
spi [ARM] Move include/asm-arm/arch-* to arch/arm/*/include/mach 2008-08-07 09:55:48 +01:00
ssb
tc
telephony ixj: push BKL into driver and wrap ioctls 2008-07-25 10:53:43 -07:00
thermal
uio UIO: add generic UIO platform driver 2008-07-21 21:54:55 -07:00
usb isight_firmware: fix a leak and double kfree() 2008-08-12 16:07:28 -07:00
video radeonfb: fix accel engine hangs 2008-08-12 16:07:28 -07:00
virtio virtio: Add transport feature handling stub for virtio_ring. 2008-07-25 12:06:14 +10:00
w1 w1/ds2482: Convert to a new-style driver 2008-07-16 19:30:07 +02:00
watchdog [WATCHDOG] pcwd.c - fix open_allowed type. 2008-08-10 21:57:03 +00:00
xen sysdev: Pass the attribute to the low level sysdev show/store function 2008-07-21 21:55:02 -07:00
zorro move memory_read_from_buffer() from fs.h to string.h 2008-07-24 10:47:13 -07:00
Kconfig
Makefile regulator: core kbuild files 2008-07-30 10:10:22 +01:00