* this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <linux/ascii85.h>
 #include <linux/pm_opp.h>
 #include "adreno_gpu.h"
 #include "msm_gem.h"
        do_gettimeofday(&state->time);
 
        for (i = 0; i < gpu->nr_rings; i++) {
+               int size = 0, j;
+
                state->ring[i].fence = gpu->rb[i]->memptrs->fence;
                state->ring[i].iova = gpu->rb[i]->iova;
                state->ring[i].seqno = gpu->rb[i]->seqno;
                state->ring[i].rptr = get_rptr(adreno_gpu, gpu->rb[i]);
                state->ring[i].wptr = get_wptr(gpu->rb[i]);
+
+               /* Copy at least 'wptr' dwords of the data */
+               size = state->ring[i].wptr;
+
+               /* After wptr find the last non zero dword to save space */
+               for (j = state->ring[i].wptr; j < MSM_GPU_RINGBUFFER_SZ >> 2; j++)
+                       if (gpu->rb[i]->start[j])
+                               size = j + 1;
+
+               if (size) {
+                       state->ring[i].data = kmalloc(size << 2, GFP_KERNEL);
+                       if (state->ring[i].data) {
+                               memcpy(state->ring[i].data, gpu->rb[i]->start, size << 2);
+                               state->ring[i].data_size = size << 2;
+                       }
+               }
        }
 
        /* Count the number of registers */
 
 static void adreno_gpu_state_destroy(struct kref *kref)
 {
+       int i;
        struct msm_gpu_state *state = container_of(kref,
                struct msm_gpu_state, ref);
 
+       for (i = 0; i < ARRAY_SIZE(state->ring); i++)
+               kfree(state->ring[i].data);
+
        kfree(state->comm);
        kfree(state->cmd);
        kfree(state->registers);
                drm_printf(p, "    retired-fence: %d\n", state->ring[i].fence);
                drm_printf(p, "    rptr: %d\n", state->ring[i].rptr);
                drm_printf(p, "    wptr: %d\n", state->ring[i].wptr);
+               drm_printf(p, "    size: %d\n", MSM_GPU_RINGBUFFER_SZ);
+
+               if (state->ring[i].data && state->ring[i].data_size) {
+                       u32 *ptr = (u32 *) state->ring[i].data;
+                       char out[ASCII85_BUFSZ];
+                       long len = ascii85_encode_len(state->ring[i].data_size);
+                       int j;
+
+                       drm_printf(p, "    data: !!ascii85 |\n");
+                       drm_printf(p, "     ");
+
+                       for (j = 0; j < len; j++)
+                               drm_printf(p, ascii85_encode(ptr[j], out));
+
+                       drm_printf(p, "\n");
+               }
        }
 
        drm_puts(p, "registers:\n");