While I was at UDS I learnt some useful X debugging tricks for Intel based chipsets. One can debug the driver using debugfs as follows:
1. ssh into the machine with locked-up X and then mount debugfs:
$ sudo mount -t debugfs none /sys/kernel/debug
2. Find the dri debug directory:
$ cd /sys/kernel/debug/dri/0
3. Check for a system lock up by looking to see if sequence numbers are advancing or not:
$ cat i915_gem_seqno
Current sequence: 1732368
Waiter sequence: 0
IRQ sequence: 1732364
If the sequence numbers are not increasing then we know that the GPU has locked up for some reason.
4. If that's working, then check to see what the X server is doing:
$ cat /proc/pid-of-X-server/wchan
(where 'pid-of-X-server' is the process id of the X server)
This will show you what it is waiting for. If you see it changing then it's not an X hang.
5. Look at the interrupt activity
$ cat i915_gem_interrupt
Check that the masks are restored correctly after a resume - interrupts may be masked and hence not able to respond to interrupts.
The IRQ sequence generally is a little behind Waiter sequence - if IRQ sequence does not increment it's a GPU hang. The Current Sequence *SHOULD NOT* be zero. Waiter Sequence is zero when there is nothing queued up to process.
Also, check out http://intellinuxgraphics.org/documentation.html