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