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