psb_HDMIExtMode.c revision 54752e65b02b1a84c491e3f9c964046faeea306e
1#include "psb_HDMIExtMode.h" 2#include "pvr2d.h" 3#include "psb_drv_video.h" 4 5/* Global variable for HDMIExt. */ 6psb_HDMIExt_info_p psb_HDMIExt_info; 7 8#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData 9 10VAStatus psb_HDMIExt_get_prop(unsigned short *xres, unsigned short *yres, 11 short *xoffset, short *yoffset) 12{ 13 if (!psb_HDMIExt_info || !psb_HDMIExt_info->hdmi_extvideo_prop || 14 (psb_HDMIExt_info->hdmi_extvideo_prop->ExtVideoMode == OFF)) { 15 psb__error_message("%s : Failed to get HDMI prop\n", __FUNCTION__); 16 return VA_STATUS_ERROR_UNKNOWN; 17 } 18 *xres = psb_HDMIExt_info->hdmi_extvideo_prop->ExtVideoMode_XRes; 19 *yres = psb_HDMIExt_info->hdmi_extvideo_prop->ExtVideoMode_YRes; 20 *xoffset = 0; 21 *yoffset = 0; 22 return VA_STATUS_SUCCESS; 23} 24 25psb_hdmi_mode psb_HDMIExt_get_mode() 26{ 27 if (!psb_HDMIExt_info) { 28 psb__error_message("%s : Failed to get HDMI mode\n", __FUNCTION__); 29 return VA_STATUS_ERROR_UNKNOWN; 30 } 31 return psb_HDMIExt_info->hdmi_mode; 32} 33 34VAStatus psb_HDMIExt_update(VADriverContextP ctx) 35{ 36 INIT_DRIVER_DATA; 37 drmModeCrtc *hdmi_crtc = NULL; 38 drmModeConnector *hdmi_connector = NULL; 39 drmModeEncoder *hdmi_encoder = NULL; 40 int width = 0, height = 0; 41 char *strHeight = NULL; 42 43 hdmi_connector = drmModeGetConnector(driver_data->drm_fd, psb_HDMIExt_info->hdmi_connector_id); 44 if ((!hdmi_connector->encoder_id) || (hdmi_connector->connection == DRM_MODE_DISCONNECTED)) { 45 psb__information_message("%s : HDMI : DISCONNECTED.\n", __FUNCTION__); 46 psb_HDMIExt_info->hdmi_connection = DRM_MODE_DISCONNECTED; 47 } else { 48 hdmi_encoder = drmModeGetEncoder(driver_data->drm_fd, hdmi_connector->encoder_id); 49 psb_HDMIExt_info->hdmi_crtc_id = hdmi_encoder->crtc_id; 50 if (!psb_HDMIExt_info->hdmi_crtc_id) { 51 psb__information_message("%s : hdmi_crtc_id = 0. HDMI : no crtc attached.\n", __FUNCTION__); 52 psb_HDMIExt_info->hdmi_connection = DRM_MODE_DISCONNECTED; 53 } else { 54 psb_extvideo_prop_p hdmi_extvideo_prop = psb_HDMIExt_info->hdmi_extvideo_prop; 55 56 psb__information_message("%s : psb_HDMIExt_info->hdmi_crtc_id= %d.\n", __FUNCTION__, 57 psb_HDMIExt_info->hdmi_crtc_id); 58 /*Update HDMI fb id*/ 59 hdmi_crtc = drmModeGetCrtc(driver_data->drm_fd, psb_HDMIExt_info->hdmi_crtc_id); 60 if (!hdmi_crtc) { 61 /* No CRTC attached to HDMI. */ 62 psb__information_message("%s : Failed to get hdmi crtc. HDMI : OFF\n", __FUNCTION__); 63 psb_HDMIExt_info->hdmi_connection = DRM_MODE_DISCONNECTED; 64 } else { 65 psb_HDMIExt_info->hdmi_connection = DRM_MODE_CONNECTED; 66 strHeight = strstr(hdmi_crtc->mode.name, "x"); 67 hdmi_extvideo_prop->ExtVideoMode_XRes = (unsigned short)atoi(hdmi_crtc->mode.name); 68 hdmi_extvideo_prop->ExtVideoMode_YRes = (unsigned short)atoi(strHeight + 1); 69 psb_HDMIExt_info->hdmi_fb_id = hdmi_crtc->buffer_id; 70 psb__information_message("%s : psb_HDMIExt_info->hdmi_fb_id = %d, size = %d x %d\n", __FUNCTION__, 71 psb_HDMIExt_info->hdmi_fb_id, hdmi_extvideo_prop->ExtVideoMode_XRes, hdmi_extvideo_prop->ExtVideoMode_YRes); 72 drmModeFreeCrtc(hdmi_crtc); 73 } 74 } 75 drmModeFreeEncoder(hdmi_encoder); 76 } 77 drmModeFreeConnector(hdmi_connector); 78 79 /*Update hdmi mode and hdmi ExtVideo prop*/ 80 if (psb_HDMIExt_info->hdmi_connection == DRM_MODE_DISCONNECTED) { 81 psb_HDMIExt_info->hdmi_extvideo_prop->ExtVideoMode = OFF; 82 psb_HDMIExt_info->hdmi_mode = OFF; 83 } else if (psb_HDMIExt_info->hdmi_fb_id == psb_HDMIExt_info->mipi_fb_id) { 84 psb_HDMIExt_info->hdmi_extvideo_prop->ExtVideoMode = CLONE; 85 psb_HDMIExt_info->hdmi_mode = CLONE; 86 } else { 87 psb_HDMIExt_info->hdmi_extvideo_prop->ExtVideoMode = EXTENDED_VIDEO; 88 psb_HDMIExt_info->hdmi_mode = EXTENDED_VIDEO; 89 } 90 return VA_STATUS_SUCCESS; 91} 92 93VAStatus psb_HDMIExt_init(VADriverContextP ctx) 94{ 95 INIT_DRIVER_DATA; 96 drmModeConnector *connector = NULL; 97 drmModeEncoder *mipi_encoder = NULL; 98 drmModeCrtc *mipi_crtc = NULL; 99 int mipi_connector_id = 0, mipi_encoder_id = 0, mipi_crtc_id = 0, i; 100 101 psb_HDMIExt_info = (psb_HDMIExt_info_p)calloc(1, sizeof(psb_HDMIExt_info_s)); 102 if (!psb_HDMIExt_info) { 103 psb__error_message("%s : Failed to create psb_HDMIExt_info.\n", __FUNCTION__); 104 return VA_STATUS_ERROR_UNKNOWN; 105 } 106 memset(psb_HDMIExt_info, 0, sizeof(psb_HDMIExt_info_s)); 107 108 psb_HDMIExt_info->hdmi_extvideo_prop = (psb_extvideo_prop_p)calloc(1, sizeof(psb_extvideo_prop_s)); 109 if (!psb_HDMIExt_info->hdmi_extvideo_prop) { 110 psb__error_message("%s : Failed to create hdmi_extvideo_prop.\n", __FUNCTION__); 111 return VA_STATUS_ERROR_UNKNOWN; 112 } 113 memset(psb_HDMIExt_info->hdmi_extvideo_prop, 0, sizeof(psb_extvideo_prop_s)); 114 115 /*Get Resources.*/ 116 psb_HDMIExt_info->resources = drmModeGetResources(driver_data->drm_fd); 117 if (!psb_HDMIExt_info->resources) { 118 psb__error_message("%s : drmModeGetResources failed.\n", __FUNCTION__); 119 goto exit; 120 } 121 122 /*Get MIPI and HDMI connector id.*/ 123 for (i = 0; i < psb_HDMIExt_info->resources->count_connectors; i++) { 124 connector = drmModeGetConnector(driver_data->drm_fd, psb_HDMIExt_info->resources->connectors[i]); 125 126 if (!connector) { 127 psb__error_message("%s : Failed to get connector %i\n", __FUNCTION__, 128 psb_HDMIExt_info->resources->connectors[i]); 129 continue; 130 } 131 132 if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) 133 psb_HDMIExt_info->hdmi_connector_id = connector->connector_id; 134 135 if ((connector->connector_type == /*DRM_MODE_CONNECTOR_MIPI*/15) && 136 (!mipi_connector_id)) { 137 mipi_connector_id = connector->connector_id; 138 mipi_encoder_id = connector->encoder_id; 139 } 140 141 drmModeFreeConnector(connector); 142 } 143 144 if (!mipi_connector_id || 145 !psb_HDMIExt_info->hdmi_connector_id || 146 !mipi_encoder_id) { 147 psb__error_message("%s : Failed to get connector id or mipi encoder id. mipi_connector_id=%d, hdmi_connector_id=%d, mipi_encoder_id=%d\n", __FUNCTION__, 148 mipi_connector_id, psb_HDMIExt_info->hdmi_connector_id, mipi_encoder_id); 149 goto exit; 150 } 151 152 mipi_encoder = drmModeGetEncoder(driver_data->drm_fd, mipi_encoder_id); 153 if (!mipi_encoder) { 154 psb__error_message("%s : Failed to get mipi encoder %i\n", __FUNCTION__); 155 goto exit; 156 } 157 158 mipi_crtc_id = mipi_encoder->crtc_id; 159 psb__information_message("%s : mipi_crtc_id = %d\n", __FUNCTION__, 160 mipi_crtc_id); 161 162 drmModeFreeEncoder(mipi_encoder); 163 164 /*Update MIPI fb id*/ 165 mipi_crtc = drmModeGetCrtc(driver_data->drm_fd, mipi_crtc_id); 166 if (!mipi_crtc) { 167 /* No CRTC attached to MIPI. */ 168 psb__error_message("%s : MIPI : OFF\n", __FUNCTION__); 169 goto exit; 170 } 171 psb_HDMIExt_info->mipi_fb_id = mipi_crtc->buffer_id; 172 psb__information_message("%s : psb_HDMIExt_info->mipi_fb_id = %d\n", __FUNCTION__, 173 psb_HDMIExt_info->mipi_fb_id); 174 drmModeFreeCrtc(mipi_crtc); 175 176 if (psb_HDMIExt_update(ctx)) 177 goto exit; 178 179 return VA_STATUS_SUCCESS; 180 181exit: 182 if (psb_HDMIExt_info->resources) 183 drmModeFreeResources(psb_HDMIExt_info->resources); 184 185 if (connector) 186 drmModeFreeConnector(connector); 187 188 free(psb_HDMIExt_info); 189 190 return VA_STATUS_ERROR_UNKNOWN; 191} 192 193VAStatus psb_HDMIExt_deinit() 194{ 195 if (psb_HDMIExt_info->resources) 196 drmModeFreeResources(psb_HDMIExt_info->resources); 197 198 if (psb_HDMIExt_info->hdmi_extvideo_prop) 199 free(psb_HDMIExt_info->hdmi_extvideo_prop); 200 if (psb_HDMIExt_info) 201 free(psb_HDMIExt_info); 202 203 return VA_STATUS_SUCCESS; 204} 205 206