1409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan/*
2409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Copyright (c) 2012 Intel Corporation. All Rights Reserved.
3409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan *
4409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Permission is hereby granted, free of charge, to any person obtaining a
5409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * copy of this software and associated documentation files (the
6409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * "Software"), to deal in the Software without restriction, including
7409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * without limitation the rights to use, copy, modify, merge, publish,
8409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * distribute, sub license, and/or sell copies of the Software, and to
9409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * permit persons to whom the Software is furnished to do so, subject to
10409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * the following conditions:
11409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan *
12409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * The above copyright notice and this permission notice (including the
13409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * next paragraph) shall be included in all copies or substantial portions
14409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * of the Software.
15409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan *
16409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan */
24409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
25409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "sysdeps.h"
26409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include <xf86drm.h>
27409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_drm.h"
28409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_backend.h"
29409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_drmcommon.h"
30409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_drm_auth.h"
31409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include "va_drm_utils.h"
32409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
33409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic int
34409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanva_DisplayContextIsValid(VADisplayContextP pDisplayContext)
35409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{
36409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    VADriverContextP const pDriverContext = pDisplayContext->pDriverContext;
37409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
38409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    return (pDriverContext &&
39409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan            pDriverContext->display_type == VA_DISPLAY_DRM);
40409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}
41409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
42409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic void
43409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanva_DisplayContextDestroy(VADisplayContextP pDisplayContext)
44409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{
45409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (!pDisplayContext)
46409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        return;
47409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
48409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    free(pDisplayContext->pDriverContext->drm_state);
49409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    free(pDisplayContext->pDriverContext);
50409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    free(pDisplayContext);
51409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}
52409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
53409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstatic VAStatus
54409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanva_DisplayContextGetDriverName(
55409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    VADisplayContextP pDisplayContext,
56409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    char            **driver_name_ptr
57409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan)
58409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{
59409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
60409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    VADriverContextP const ctx = pDisplayContext->pDriverContext;
61409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    struct drm_state * const drm_state = ctx->drm_state;
62409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    drm_magic_t magic;
63409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    VAStatus status;
64409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    int ret;
65409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
66409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    status = VA_DRM_GetDriverName(ctx, driver_name_ptr);
67409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (status != VA_STATUS_SUCCESS)
68409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        return status;
69409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
70409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    ret = drmGetMagic(drm_state->fd, &magic);
71409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (ret < 0)
72409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        return VA_STATUS_ERROR_OPERATION_FAILED;
73409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
74409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (!va_drm_is_authenticated(drm_state->fd)) {
75409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        if (!va_drm_authenticate(drm_state->fd, magic))
76409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan            return VA_STATUS_ERROR_OPERATION_FAILED;
77409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        if (!va_drm_is_authenticated(drm_state->fd))
78409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan            return VA_STATUS_ERROR_OPERATION_FAILED;
79409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    }
80409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
81409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    drm_state->auth_type = VA_DRM_AUTH_CUSTOM;
82409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
83409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    return VA_STATUS_SUCCESS;
84409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}
85409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
86409de6acb4473c973ed2532e340831dc582e5e0eAustin YuanVADisplay
87409de6acb4473c973ed2532e340831dc582e5e0eAustin YuanvaGetDisplayDRM(int fd)
88409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{
89409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    VADisplayContextP pDisplayContext = NULL;
90409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    VADriverContextP  pDriverContext  = NULL;
91409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    struct drm_state *drm_state       = NULL;
92409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
93409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (fd < 0)
94409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        return NULL;
95409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
96409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    /* Create new entry */
97409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    /* XXX: handle cache? */
98409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    drm_state = calloc(1, sizeof(*drm_state));
99409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (!drm_state)
100409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        goto error;
101409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    drm_state->fd = fd;
102409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
103409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDriverContext = calloc(1, sizeof(*pDriverContext));
104409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (!pDriverContext)
105409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        goto error;
106409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDriverContext->native_dpy   = NULL;
107409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDriverContext->display_type = VA_DISPLAY_DRM;
108409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDriverContext->drm_state    = drm_state;
109409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
110409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDisplayContext = calloc(1, sizeof(*pDisplayContext));
111409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    if (!pDisplayContext)
112409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan        goto error;
113409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
114409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDisplayContext->vadpy_magic     = VA_DISPLAY_MAGIC;
115409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDisplayContext->pDriverContext  = pDriverContext;
116409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDisplayContext->vaIsValid       = va_DisplayContextIsValid;
117409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDisplayContext->vaDestroy       = va_DisplayContextDestroy;
118409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
119409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    return pDisplayContext;
120409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan
121409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanerror:
122409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    free(pDisplayContext);
123409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    free(pDriverContext);
124409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    free(drm_state);
125409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan    return NULL;
126409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}
127