static int adf_interface_init(struct adf_pdata *pdata)
{
    struct adf_interface_data intf_data;
    int ret = 0;
    int err;

    err = adf_get_interface_data(pdata->intf_fd, &intf_data);
    if (err < 0)
        return err;

    err = adf_surface_init(pdata, &intf_data.current_mode, &pdata->surfaces[0]);
    if (err < 0) {
        fprintf(stderr, "allocating surface 0 failed: %s\n", strerror(-err));
        ret = err;
        goto done;
    }

    err = adf_surface_init(pdata, &intf_data.current_mode,
            &pdata->surfaces[1]);
    if (err < 0) {
        fprintf(stderr, "allocating surface 1 failed: %s\n", strerror(-err));
        memset(&pdata->surfaces[1], 0, sizeof(pdata->surfaces[1]));
        pdata->n_surfaces = 1;
    } else {
        pdata->n_surfaces = 2;
    }

done:
    adf_free_interface_data(&intf_data);
    return ret;
}
int MinuiBackendAdf::InterfaceInit() {
  adf_interface_data intf_data;
  int err = adf_get_interface_data(intf_fd, &intf_data);
  if (err < 0) return err;

  int ret = 0;
  err = SurfaceInit(&intf_data.current_mode, &surfaces[0]);
  if (err < 0) {
    fprintf(stderr, "allocating surface 0 failed: %s\n", strerror(-err));
    ret = err;
    goto done;
  }

  err = SurfaceInit(&intf_data.current_mode, &surfaces[1]);
  if (err < 0) {
    fprintf(stderr, "allocating surface 1 failed: %s\n", strerror(-err));
    surfaces[1] = {};
    n_surfaces = 1;
  } else {
    n_surfaces = 2;
  }

done:
  adf_free_interface_data(&intf_data);
  return ret;
}
 void getCurrentMode(uint32_t &w, uint32_t &h) {
     adf_interface_data data;
     ASSERT_NO_FATAL_FAILURE(getInterfaceData(data));
     w = data.current_mode.hdisplay;
     h = data.current_mode.vdisplay;
     adf_free_interface_data(&data);
 }
TEST_F(AdfTest, interface_data) {
    adf_interface_data data;
    ASSERT_NO_FATAL_FAILURE(getInterfaceData(data));

    EXPECT_LT(data.type, ADF_INTF_TYPE_MAX);
    EXPECT_LE(data.dpms_state, DRM_MODE_DPMS_OFF);
    EXPECT_EQ(1, data.hotplug_detect);
    EXPECT_GT(data.n_available_modes, 0);
    EXPECT_LT(data.custom_data_size, ADF_MAX_CUSTOM_DATA_SIZE);
    adf_free_interface_data(&data);
}
static int adf_interface_init(adf_pdata *pdata)
{
    adf_interface_data intf_data;
    int ret = 0;
    int err;
    unsigned char* framebuffer_data = nullptr;

    err = adf_get_interface_data(pdata->intf_fd, &intf_data);
    if (err < 0) {
        return err;
    }

    err = adf_surface_init(pdata, &intf_data.current_mode, &pdata->surfaces[0]);
    if (err < 0) {
        fprintf(stderr, "allocating surface 0 failed: %s\n", strerror(-err));
        ret = err;
        goto done;
    }

    /* Allocate a single buffer for drawing. graphics.cpp will draw to
     * this buffer which will later be copied to the mmapped adf buffer.
     * Using a regular memory buffer improves performance by about 10x. */
    framebuffer_data = (unsigned char*) calloc(pdata->surfaces[0].pitch * pdata->surfaces[0].base.height, 1);
    if (framebuffer_data == nullptr) {
        printf("failed to calloc surface data\n");
        close(pdata->surfaces[0].fd);
        munmap(pdata->surfaces[0].adf_data, pdata->surfaces[0].pitch * pdata->surfaces[0].base.height);
        ret = -1;
        goto done;
    }
    pdata->surfaces[0].base.data = framebuffer_data;

    err = adf_surface_init(pdata, &intf_data.current_mode,
            &pdata->surfaces[1]);
    if (err < 0) {
        fprintf(stderr, "allocating surface 1 failed: %s\n", strerror(-err));
        memset(&pdata->surfaces[1], 0, sizeof(pdata->surfaces[1]));
        pdata->n_surfaces = 1;
    } else {
        pdata->n_surfaces = 2;
        pdata->surfaces[1].base.data = framebuffer_data;
    }

done:
    adf_free_interface_data(&intf_data);
    return ret;
}
TEST_F(AdfTest, blank) {
    int err = adf_interface_blank(intf, (uint8_t)-1);
    EXPECT_EQ(-EINVAL, err) << "setting bogus DPMS mode should have failed";

    err = adf_interface_blank(eng, DRM_MODE_DPMS_OFF);
    EXPECT_EQ(-EINVAL, err) << "blanking overlay engine should have failed";

    ASSERT_NO_FATAL_FAILURE(blank(DRM_MODE_DPMS_OFF));
    err = adf_interface_blank(intf, DRM_MODE_DPMS_OFF);
    EXPECT_EQ(-EBUSY, err) << "blanking interface twice should have failed";

    ASSERT_NO_FATAL_FAILURE(blank(DRM_MODE_DPMS_ON));
    err = adf_interface_blank(intf, DRM_MODE_DPMS_ON);
    EXPECT_EQ(-EBUSY, err) << "unblanking interface twice should have failed";

    adf_interface_data data;
    ASSERT_NO_FATAL_FAILURE(getInterfaceData(data));
    EXPECT_EQ(DRM_MODE_DPMS_ON, data.dpms_state);
    adf_free_interface_data(&data);
}