bool IntelHDMIDisplayDevice::dump(char *buff,
                           int buff_len, int *cur_len)
{
    IntelDisplayPlane *plane = NULL;
    bool ret = true;
    int i;

    mDumpBuf = buff;
    mDumpBuflen = buff_len;
    mDumpLen = (int)(*cur_len);

    if (mLayerList) {
       dumpPrintf("------------ HDMI Totally %d layers -------------\n",
                                     mLayerList->getLayersCount());
       for (i = 0; i < mLayerList->getLayersCount(); i++) {
           plane = mLayerList->getPlane(i);

           if (plane) {
               int planeType = plane->getPlaneType();
               dumpPrintf("   # layer %d attached to %s plane \n", i,
                            (planeType == 3) ? "overlay" : "sprite");
           } else
               dumpPrintf("   # layer %d goes through eglswapbuffer\n ", i);
       }
       dumpPrintf("-------------HDMI runtime parameters -------------\n");
       dumpPrintf("  + mHotplugEvent: %d \n", mHotplugEvent);

    }

    *cur_len = mDumpLen;
    return ret;
}
bool IntelHWComposer::dumpDisplayStat()
{
    struct drm_psb_register_rw_arg arg;
    struct drm_psb_vsync_set_arg vsync_arg;
    int ret;

    // dump vsync info
    memset(&vsync_arg, 0, sizeof(struct drm_psb_vsync_set_arg));
    vsync_arg.vsync_operation_mask = GET_VSYNC_COUNT;
    vsync_arg.vsync.pipe = 0;

    ret = drmCommandWriteRead(mDrm->getDrmFd(), DRM_PSB_VSYNC_SET,
                               &vsync_arg, sizeof(vsync_arg));
    if (ret) {
        ALOGW("%s: failed to dump vsync info %d\n", __func__, ret);
        goto out;
    }

    dumpPrintf("-------------Display Stat -------------------\n");
    dumpPrintf("  + last vsync count: %d, timestamp %d ms \n",
                     mVsyncsCount, mVsyncsTimestamp/1000000);
    dumpPrintf("  + current vsync count: %d, timestamp %d ms \n",
                     vsync_arg.vsync.vsync_count,
                     vsync_arg.vsync.timestamp/1000000);

    // Read pipe stat register
    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
    arg.display_read_mask = REGRWBITS_PIPEASTAT;

    ret = drmCommandWriteRead(mDrm->getDrmFd(), DRM_PSB_REGISTER_RW,
                              &arg, sizeof(arg));
    if (ret) {
        ALOGW("%s: failed to dump display registers %d\n", __func__, ret);
        goto out;
    }

    dumpPrintf("  + PIPEA STAT: 0x%x \n", arg.display.pipestat_a);

    // Read interrupt mask register
    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
    arg.display_read_mask = REGRWBITS_INT_MASK;

    ret = drmCommandWriteRead(mDrm->getDrmFd(), DRM_PSB_REGISTER_RW,
                              &arg, sizeof(arg));
    if (ret) {
        ALOGW("%s: failed to dump display registers %d\n", __func__, ret);
        goto out;
    }

    dumpPrintf("  + INT_MASK_REG: 0x%x \n", arg.display.int_mask);

    // Read interrupt enable register
    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
    arg.display_read_mask = REGRWBITS_INT_ENABLE;

    ret = drmCommandWriteRead(mDrm->getDrmFd(), DRM_PSB_REGISTER_RW,
                              &arg, sizeof(arg));
    if (ret) {
        ALOGW("%s: failed to dump display registers %d\n", __func__, ret);
        goto out;
    }

    dumpPrintf("  + INT_ENABLE_REG: 0x%x \n", arg.display.int_enable);

    // open this if need to dump all display registers.
#if 1
    // dump all display regs in driver
    memset(&arg, 0, sizeof(struct drm_psb_register_rw_arg));
    arg.display_read_mask = REGRWBITS_DISPLAY_ALL;

    ret = drmCommandWriteRead(mDrm->getDrmFd(), DRM_PSB_REGISTER_RW,
                              &arg, sizeof(arg));
    if (ret) {
        ALOGW("%s: failed to dump display registers %d\n", __func__, ret);
        goto out;
    }
#endif

out:
    return (ret == 0) ? true : false;
}