| 1 | /* |
| 2 | * Copyright (c) 2020 Intel Corporation. All Rights Reserved. |
| 3 | * |
| 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 5 | * copy of this software and associated documentation files (the |
| 6 | * "Software"), to deal in the Software without restriction, including |
| 7 | * without limitation the rights to use, copy, modify, merge, publish, |
| 8 | * distribute, sub license, and/or sell copies of the Software, and to |
| 9 | * permit persons to whom the Software is furnished to do so, subject to |
| 10 | * the following conditions: |
| 11 | * |
| 12 | * The above copyright notice and this permission notice (including the |
| 13 | * next paragraph) shall be included in all copies or substantial portions |
| 14 | * of the Software. |
| 15 | * |
| 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| 17 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 18 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
| 19 | * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR |
| 20 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| 21 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| 22 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 23 | */ |
| 24 | |
| 25 | /** |
| 26 | * \file va_prot.h |
| 27 | * \brief Protected content API. |
| 28 | * |
| 29 | * This file contains the \ref api_prot "Protected content API". |
| 30 | */ |
| 31 | |
| 32 | #ifndef VA_PROT_H |
| 33 | #define VA_PROT_H |
| 34 | |
| 35 | #ifdef __cplusplus |
| 36 | extern "C" { |
| 37 | #endif |
| 38 | |
| 39 | /** |
| 40 | * \defgroup api_prot Protected content API |
| 41 | * |
| 42 | * @{ |
| 43 | * \section prolouge Prolouge |
| 44 | * Video streaming is ubiquitous and the support for video streaming is widely |
| 45 | * available across client open systems such as PCs, MACs, Chromebooks etc. and |
| 46 | * closed systems such as settop box, smart TVs, DVDs etc. By default, |
| 47 | * video streaming is not considered premium due to various constraints such as |
| 48 | * resolution, quality, production cost etc. but recently streaming of premium |
| 49 | * video(1080p+) has become norm. The streaming of premium video in open systems |
| 50 | * such as PCs, MACs, Chromebooks etc. makes video particularly susceptible to |
| 51 | * piracy (due to non-video playback usages of such systems) resulting in |
| 52 | * millions of dollars of loss to content creators. |
| 53 | * |
| 54 | * Digital Rights Management(DRM) has been proposed to stop piracy of premium |
| 55 | * video streams across a wide spectrum. There are some known open/closed DRM |
| 56 | * standards such as [Widevine by Google](https://www.widevine.com/), |
| 57 | * [PlayReady by Microsoft](https://www.microsoft.com/playready/), |
| 58 | * [FairPlay by Apple](https://developer.apple.com/streaming/fps/), |
| 59 | * [Merlin by Sony](https://www.marlin-community.com/), etc... Each DRM |
| 60 | * standard has its properties but all DRM standards support a common |
| 61 | * mechanism. This common mechanism involves cryptographical method for |
| 62 | * authenticating the client system, delivering bitstream and required |
| 63 | * cryptographic assets to client system and then cryptographically processing |
| 64 | * bitstream in client system. The cryptographic methods used in these steps |
| 65 | * are asymmetric such as RSA, DH etc. and symmetric such as AES CTR, CBC etc. |
| 66 | * encryption mechanisms. The authentication of client system, delivery of |
| 67 | * bitstream and cryptographic assets to client system is performed using |
| 68 | * asymmetric cryptographic mechanism while bitstream is encrypted and processed |
| 69 | * using symmetric cryptographic. In DRM world, authentication of client system, |
| 70 | * delivery of bitstream and required cryptographic assets to client system is |
| 71 | * loosely called provisioning and license acquisition while the processing of |
| 72 | * cryptographically secure bitstream is divided as video decryption/decoding, |
| 73 | * audio decryption/playback, video display. Besides DRM standards, Video/Audio |
| 74 | * bitstream encryption standard such as |
| 75 | * [Common Encryption Standard(CENC)](https://www.iso.org/standard/76597.html) |
| 76 | * provides a mechanism to normalize bitstream encryption methods across vendors |
| 77 | * while providing flexibility. |
| 78 | * |
| 79 | * \section DRM Pipeline |
| 80 | * Most DRM standards execute the following deep pipeline to playback |
| 81 | * contents on client systems from streaming servers - provisioning uses |
| 82 | * provisioning servers, licence aquisition uses license servers, video |
| 83 | * bitstream delivery uses content servers and decryption/decoding, audio |
| 84 | * bitstream delivery uses content servers and decyption/playback, |
| 85 | * display/playback. The system level HWDRM sequence diagram is following - |
| 86 | *  |
| 87 | * and HWDRM pipeline view is following - |
| 88 | *  |
| 89 | * |
| 90 | * \section LibVA Protected Content APIs |
| 91 | * The LibVA Protected APIs are designed to enable DRM capabilities or |
| 92 | * facilitate isolated communicaiton with TEE. |
| 93 | * The VAEntrypointProtectedTEEComm is to define interfaces for Application |
| 94 | * to TEE direct communication to perform various TEE centric operations |
| 95 | * such as standalone provisioning of platform at factory or provisioning |
| 96 | * TEE for other usages, providing TEE capabilities etc. |
| 97 | * The VAEntrypointProtectedContent is to define interfaces for protected |
| 98 | * video playback using HWDRM. This entry point co-ordinates assets across |
| 99 | * TEE/GPU/Display for HWDRM playback. |
| 100 | * |
| 101 | * The difference between Protected Content and Protected TEE Communication |
| 102 | * is that Protected Content Entrypoint does not provide isolated entry |
| 103 | * point for TEE and invokes TEE only from HWDRM perspective. |
| 104 | * |
| 105 | * Protected Content Entrypoint |
| 106 | * The most of DRM standards execute following deep pipeline to playback |
| 107 | * contents on client systems from streaming servers - provisioning uses |
| 108 | * provisioning servers, licence aquisition uses license servers, video |
| 109 | * bitstream delivery uses content servers and decryption/decoding, audio |
| 110 | * bitstream delivery uses content servers and decyption/playback, |
| 111 | * display/playback. |
| 112 | * |
| 113 | * The Provisioning and License aquisition implementations are Independent |
| 114 | * Hardware Vendor (IHV) specific but most IHVs use some form of Trusted |
| 115 | * Execution Environment (TEE) to prepare client platform or system for DRM |
| 116 | * content playback. The provisioning operations use provisioning servers (as |
| 117 | * instructed in DRM standard) and client system TEE. The communication between |
| 118 | * provisioning servers and client system TEE uses asymmetic cryptographic |
| 119 | * mechanism. This step provides a way to establish root-of-trust between |
| 120 | * client system and streaming servers. Once root-of-trust is established then |
| 121 | * client system requests for license aquisition for a particular streaming |
| 122 | * title. The license aquisition involves communication between licensing |
| 123 | * servers and TEE using asymmetic cryptographic mechanism. At end of this step, |
| 124 | * client system TEE has required assets to decrypt/decode. Although these |
| 125 | * communication does not direcly involve video aspect of GPU but **facilitate |
| 126 | * GPU required assets to playback premium contents**. |
| 127 | * |
| 128 | * To support DRM standard requirements in playback pipeline, OSes and HWs |
| 129 | * incorporate various methods to protect full playback pipeline. These |
| 130 | * methods of protection could be SW based or HW based. The SW based protection |
| 131 | * mechanism of DRMs is called SWDRM while HW based protection mechanism is |
| 132 | * called HWDRM. There is no previous support in LibVA to support either DRM |
| 133 | * mechanism. |
| 134 | * |
| 135 | * For DRM capabilities, APIs inolve creation of protected session to |
| 136 | * communicate with TEE and then using these protected sessions to process |
| 137 | * video/audio data. The philophashy behind these API is to leverage existing |
| 138 | * LibVA infrastructure as much as possible. |
| 139 | * |
| 140 | * Note: TEE could be any secure HW device such as ME-FW or FPGA Secure |
| 141 | * Enclave or NPU Secure Enclave. There are 2 concepts here – TEE Type such |
| 142 | * as ME-FW or FPGA or NPU; TEE Type Client such as for AMT or HDCP or |
| 143 | * something else etc. |
| 144 | * |
| 145 | * \section description Detailed Description |
| 146 | * The Protected content API provides a general mechanism for opening |
| 147 | * protected session with TEE and if required then \ref priming GPU/Display. |
| 148 | * The behavior of protected session API depends on parameterization/ |
| 149 | * configuration of protected session. Just for TEE tasks, protected |
| 150 | * session is parameterized/configured as TEE Communication while for |
| 151 | * HWDRM, protected session is parameterized/confgured as Protected |
| 152 | * Content. |
| 153 | * |
| 154 | * TEE Communication Entrypoint |
| 155 | * With TEE Communication parameterization/configuration, client |
| 156 | * executes TEE workloads in TEE with TEE Communication protected |
| 157 | * session. |
| 158 | * |
| 159 | * Protected Content Entrypoint |
| 160 | * With Protected Content parameterization/configuration, client |
| 161 | * executes HWDRM playback workloads HW accelerating protected video |
| 162 | * content decryption/decoding with protected content session. |
| 163 | * |
| 164 | * Before calling vaCreateProtectedSession, VAConfigID is obtained using |
| 165 | * existing libva mechanism to determine configuration parameters of |
| 166 | * protected session. The VAConfigID is determined in this way so that |
| 167 | * Protected Session implementation aligns with existing libva implementation. |
| 168 | * After obtaining VAConfigID, Protected Session needs to be created but |
| 169 | * note this is a session and not a context. Refer VAProtectedSessionID |
| 170 | * for more details. |
| 171 | * |
| 172 | * Note:- Protected session represents session object that has all security |
| 173 | * information needed for Secure Enclave to operate certain operations. |
| 174 | * |
| 175 | * \subsection priming Priming |
| 176 | * Priming is used to refer various types of initializations. For example, |
| 177 | * if license acquisition is being performed then priming means that TEE is |
| 178 | * already provisioned aka TEE has some sort of "cryptographic" whitelist of |
| 179 | * servers that TEE will use to do license acquisition for video playback. If |
| 180 | * HWDRM video playback is being performed then priming means that HWDRM |
| 181 | * eco-system TEE/GPU/Display has proper keys to do proper video playback etc. |
| 182 | * |
| 183 | * Protected content API uses the following paradigm for protected content |
| 184 | * session: |
| 185 | * - \ref api_pc_caps |
| 186 | * - \ref api_pc_setup |
| 187 | * - \ref api_pc_exec |
| 188 | * - \ref api_pc_attach |
| 189 | * |
| 190 | * \subsection api_pc_caps Query for supported cipher mode, block size, mode |
| 191 | * |
| 192 | * Checking whether protected content is supported can be performed with |
| 193 | * vaQueryConfigEntrypoints() and the profile argument set to |
| 194 | * #VAProfileProtected. If protected content is supported, then the list of |
| 195 | * returned entry-points will include #VAEntrypointProtectedContent |
| 196 | * |
| 197 | * \code |
| 198 | * VAEntrypoint *entrypoints; |
| 199 | * int i, num_entrypoints, supportsProtectedContent = 0; |
| 200 | * |
| 201 | * num_entrypoints = vaMaxNumEntrypoints(); |
| 202 | * entrypoints = malloc(num_entrypoints * sizeof(entrypoints[0]); |
| 203 | * vaQueryConfigEntrypoints(va_dpy, VAProfileProtected, entrypoints, |
| 204 | * &num_entrypoints); |
| 205 | * |
| 206 | * for (i = 0; !supportsProtectedContent && i < num_entrypoints; i++) { |
| 207 | * if (entrypoints[i] == VAEntrypointProtectedContent) |
| 208 | * supportsProtectedContent = 1; |
| 209 | * } |
| 210 | * \endcode |
| 211 | * |
| 212 | * Then, the vaGetConfigAttributes() function is used to query the protected |
| 213 | * session capabilities. |
| 214 | * |
| 215 | * \code |
| 216 | * VAConfigAttrib attribs; |
| 217 | * attribs[0].type = VAConfigAttribProtectedContentCipherAlgorithm; |
| 218 | * attribs[1].type = VAConfigAttribProtectedContentCipherBlockSize; |
| 219 | * attribs[2].type = VAConfigAttribProtectedContentCipherMode; |
| 220 | * attribs[3].type = VAConfigAttribProtectedContentCipherSampleType; |
| 221 | * attribs[4].type = VAConfigAttribProtectedContentUsage; |
| 222 | * vaGetConfigAttributes(va_dpy, VAProfileProtected, |
| 223 | * VAEntrypointProtectedContent, attribs, 5); |
| 224 | * if ((attribs[1].value & VA_PC_CIPHER_AES) == 0) { |
| 225 | * // not find desired cipher algorithm |
| 226 | * assert(0); |
| 227 | * } |
| 228 | * if ((attribs[2].value & VA_PC_BLOCK_SIZE_128) == 0) { |
| 229 | * // not find desired block size |
| 230 | * assert(0); |
| 231 | * } |
| 232 | * if ((attribs[3].value & VA_PC_CIPHER_MODE_CBC) == 0) { |
| 233 | * // not find desired counter mode |
| 234 | * assert(0); |
| 235 | * } |
| 236 | * if ((attribs[4].value & VA_PC_SAMPLE_TYPE_SUBSAMPLE) == 0) { |
| 237 | * // not find desired sample type |
| 238 | * assert(0); |
| 239 | * } |
| 240 | * if ((attribs[5].value & VA_PC_USAGE_WIDEVINE) == 0) { |
| 241 | * // not find desired usage |
| 242 | * assert(0); |
| 243 | * } |
| 244 | * \endcode |
| 245 | * |
| 246 | * \subsection api_pc_setup Set up a protected content session |
| 247 | * |
| 248 | * TEE Communication Entrypoint |
| 249 | * The protected content session provides a TEE session that is used to extract |
| 250 | * TEE information. This information could be used to peform TEE operations. |
| 251 | * |
| 252 | * Protected Content Entrypoint |
| 253 | * The protected content session can be attached to VA decode/encode/vp context |
| 254 | * to do decryption/protection in the pipeline. |
| 255 | * Before creating a protected content session, it needs to create a config |
| 256 | * first via vaCreateConfig(). Then using this config id to create a protected |
| 257 | * content session via vaCreateProtectedSession(). |
| 258 | * |
| 259 | * The general control flow is demonstrated by the following pseudo-code: |
| 260 | * \code |
| 261 | * // Create config |
| 262 | * VAConfigID config_id; |
| 263 | * |
| 264 | * attribs[0].value = VA_PC_CIPHER_AES; |
| 265 | * attribs[1].value = VA_PC_BLOCK_SIZE_128; |
| 266 | * attribs[2].value = VA_PC_CIPHER_MODE_CBC; |
| 267 | * attribs[3].value = VA_PC_SAMPLE_TYPE_SUBSAMPLE; |
| 268 | * attribs[4].value = VA_PC_USAGE_WIDEVINE; |
| 269 | * va_status = vaCreateConfig(va_dpy, VAProfileProtected, |
| 270 | * VAEntrypointProtectedContent, attribs, 5, &config_id); |
| 271 | * CHECK_VASTATUS(va_status, "vaCreateConfig"); |
| 272 | * \endcode |
| 273 | * |
| 274 | * Once the config is set up, we can create protected content session via |
| 275 | vaCreateProtectedSession(). |
| 276 | * \code |
| 277 | * // Create a protected session |
| 278 | * VAProtectedSessionID crypto_session; |
| 279 | * |
| 280 | * va_status = vaCreateProtectedSession(va_dpy, config_id, &crypto_session); |
| 281 | * CHECK_VASTATUS(va_status, "vaCreateProtectedSession"); |
| 282 | * \endcode |
| 283 | * |
| 284 | * \subsection api_pc_exec TEE communication via vaProtectedSessionExecute() |
| 285 | * |
| 286 | * TEE Communication Entrypoint |
| 287 | * App needs to communicate with TEE to get TEE information or \ref priming |
| 288 | * "prime" TEE with information that will be utilized for future TEE |
| 289 | * operations/tasks. |
| 290 | * |
| 291 | * Protected Content Entrypoint |
| 292 | * Before starting decryption/encryption operation in GPU, app may need to |
| 293 | * communicate with TEE to get encrypted assets for \ref priming HWDRM pipeline |
| 294 | * for decryption. App need to call vaProtectedSessionExecute() to get this |
| 295 | * asset. The following pseudo-code demonstrates getting session assets via |
| 296 | * vaProtectedSessionExecute() as an example. |
| 297 | * |
| 298 | * In this example, the vaCreateBuffer is called with exec_buffer mainly becasue TEE |
| 299 | * Communication Entrypoint buffers are CPU bound and buffer size is small enough to |
| 300 | * have extra copy operation without impacting performance. |
| 301 | * |
| 302 | * \code |
| 303 | * uint32_t app_id = 0xFF; |
| 304 | * VABufferID buffer; |
| 305 | * VAProtectedSessionExecuteBuffer exec_buff = {0}; |
| 306 | * |
| 307 | * exec_buff.function_id = GET_SESSION_ID; |
| 308 | * exec_buff.input.data = nullptr; |
| 309 | * exec_buff.input.data_size = 0; |
| 310 | * exec_buff.output.data = &app_id; |
| 311 | * exec_buff.output.max_data_size = sizeof(app_id); |
| 312 | * va_status = vaCreateBuffer( |
| 313 | * va_dpy, |
| 314 | * crypto_session, |
| 315 | * (VABufferType) VAProtectedSessionExecuteBufferType, |
| 316 | * sizeof(exec_buff), |
| 317 | * 1, |
| 318 | * &exec_buff, |
| 319 | * &buffer); |
| 320 | * |
| 321 | * va_status = vaProtectedSessionExecute(va_dpy, crypto_session, buffer); |
| 322 | * |
| 323 | * vaDestroyBuffer(va_dpy, buffer); |
| 324 | * \endcode |
| 325 | * |
| 326 | * \subsection api_pc_attach Attach/Detach protected content session to the VA |
| 327 | * context which want to enable/disable decryption/protection |
| 328 | * |
| 329 | * Protected content session is attached to VA decode/encode/vp context to |
| 330 | * enable protected decoding/encoding/video processing per frame or entire |
| 331 | * stream. If protected session attached per frame then application has 2 |
| 332 | * options for decoding/encoding skip processing i.e. accomodating clear |
| 333 | * frames - 1. Application could do detach after each frame is processed |
| 334 | * to process clear frame 2. Application could remains attached to decode/ |
| 335 | * encode session but specify enryption byte length to 0. |
| 336 | * The video processing does not has option #2 mainly because API does |
| 337 | * not provide skip processing. |
| 338 | * |
| 339 | * \code |
| 340 | * vaAttachProtectedSession(va_dpy, decode_ctx, crypto_session); |
| 341 | * foreach (iteration) { |
| 342 | * vaBeginPicture(va_dpy, decode_ctx, surface); |
| 343 | * ... |
| 344 | * vaRenderPicture(va_dpy, decode_ctx, &buf_id1, 1); |
| 345 | * vaRenderPicture(va_dpy, decode_ctx, &buf_id2, 1); |
| 346 | * // Buffer holding encryption parameters, i.e. VAEncryptionParameterBufferType buffer |
| 347 | * vaRenderPicture(va_dpy, decode_ctx, &buf_id_enc_param, 1); |
| 348 | * ... |
| 349 | * vaEndPicture(va_dpy, decode_ctx); |
| 350 | * } |
| 351 | * vaDetachProtectedSession(va_dpy, decode_ctx); |
| 352 | * \endcode |
| 353 | * |
| 354 | * or it could be frame-by-frame attaching/detaching as following: |
| 355 | * |
| 356 | * \code |
| 357 | * foreach (iteration) { |
| 358 | * if (encrypted) |
| 359 | * vaAttachProtectedSession(va_dpy, decode_ctx, crypto_session); |
| 360 | |
| 361 | * vaBeginPicture(va_dpy, decode_ctx, surface); |
| 362 | * ... |
| 363 | * vaRenderPicture(va_dpy, decode_ctx, &buf_id1, 1); |
| 364 | * vaRenderPicture(va_dpy, decode_ctx, &buf_id2, 1); |
| 365 | * // Buffer holding encryption parameters, i.e. VAEncryptionParameterBufferType buffer |
| 366 | * vaRenderPicture(va_dpy, decode_ctx, &buf_id_enc_param, 1); |
| 367 | * ... |
| 368 | * vaEndPicture(va_dpy, decode_ctx); |
| 369 | * |
| 370 | * if (encrypted) |
| 371 | * vaDetachProtectedSession(va_dpy, decode_ctx); |
| 372 | |
| 373 | * // check encrypted variable for next frame |
| 374 | * } |
| 375 | * \endcode |
| 376 | */ |
| 377 | |
| 378 | /** |
| 379 | * ProtectedSessions and Contexts |
| 380 | * |
| 381 | * According to #VAContextID, Context represents a "virtual" video decode, |
| 382 | * encode or video processing pipeline. Surfaces are render targets for a given |
| 383 | * context. The data in the surfaces are not accessible to the client except if |
| 384 | * derived image is supported and the internal data format of the surface is |
| 385 | * implementation specific. Application can create a video decode, encode or |
| 386 | * processing context which represents a "virtualized" hardware device. |
| 387 | * |
| 388 | * Since Protected Session does not virtualize any HW device or build any |
| 389 | * pipeline but rather accessorize existing virtualized HW device or pipeline |
| 390 | * to operate in protected mode so we decided to create separate function. |
| 391 | * Beside this, a virtualized HW device or pipeline could own several protected |
| 392 | * sessions and operate in those protected modes without ever re-creating |
| 393 | * virtualization of HW device or re-building HW pipeline (an unique protected |
| 394 | * environment multiplexing capability in Intel HW). |
| 395 | * |
| 396 | * The returned protected_session represents a notion of Host and TEE clients |
| 397 | * while representing protection status in GPU and Display. |
| 398 | * |
| 399 | * Both contexts and protected sessions are identified by unique IDs and its |
| 400 | * implementation specific internals are kept opaque to the clients |
| 401 | */ |
| 402 | typedef VAGenericID VAProtectedSessionID; |
| 403 | |
| 404 | /** \brief TEE Execucte Function ID. */ |
| 405 | typedef enum _VA_TEE_EXEC_FUNCTION_ID { |
| 406 | VA_TEE_EXECUTE_FUNCTION_ID_PASS_THROUGH = 0x00000001, |
| 407 | VA_TEE_EXECUTE_FUNCTION_ID_GET_FIRMWARE_VERSION = 0x00000002, |
| 408 | |
| 409 | } VA_TEE_EXECUTE_FUNCTION_ID; |
| 410 | |
| 411 | /** \brief Input/Output buffer of VAProtectedSessionExecuteBuffer */ |
| 412 | typedef struct _VAProtectedSessionBuffer { |
| 413 | /* |
| 414 | * This is used when this buffer refer to output buffer. The maximum size of |
| 415 | * data that the driver can return in the output buffer. It is not used for |
| 416 | * input buffer. |
| 417 | */ |
| 418 | uint32_t max_data_size; |
| 419 | /* |
| 420 | * If it is used for input buffer, it is the size of the input data. If it is |
| 421 | * used for output buffer, it is the returns size of the output data written |
| 422 | * by the driver. |
| 423 | */ |
| 424 | uint32_t data_size; |
| 425 | /* |
| 426 | * data pointer of this buffer |
| 427 | */ |
| 428 | void *data; |
| 429 | uint32_t va_reserved[VA_PADDING_LOW]; |
| 430 | } VAProtectedSessionBuffer; |
| 431 | |
| 432 | /** \brief Buffer for vaProtectedSessionExecute() */ |
| 433 | typedef struct _VAProtectedSessionExecuteBuffer { |
| 434 | /** \brief Specify the function to execute. It is IHV's implementation |
| 435 | * specific */ |
| 436 | uint32_t function_id; |
| 437 | /** \brief Input buffer */ |
| 438 | VAProtectedSessionBuffer input; |
| 439 | /** \brief Output buffer */ |
| 440 | VAProtectedSessionBuffer output; |
| 441 | /** \brief Return the result of this function. The status result is IHV's |
| 442 | * implementation specific */ |
| 443 | uint32_t status; |
| 444 | uint32_t va_reserved[VA_PADDING_LOW]; |
| 445 | } VAProtectedSessionExecuteBuffer; |
| 446 | |
| 447 | /** |
| 448 | * \brief Create a protected session |
| 449 | * |
| 450 | * Create a protected session |
| 451 | * |
| 452 | * @param[in] dpy the VA display |
| 453 | * @param[in] config_id configuration for the protected session |
| 454 | * @param[out] protected_session created protected session id upon return |
| 455 | */ |
| 456 | VAStatus vaCreateProtectedSession(VADisplay dpy, VAConfigID config_id, |
| 457 | VAProtectedSessionID *protected_session); |
| 458 | |
| 459 | /** |
| 460 | * \brief Destroy a protected session |
| 461 | * |
| 462 | * Destroy a protected session |
| 463 | * |
| 464 | * @param[in] dpy the VA display |
| 465 | * @param[in] protected_session protected session to be destroyed |
| 466 | */ |
| 467 | VAStatus vaDestroyProtectedSession(VADisplay dpy, |
| 468 | VAProtectedSessionID protected_session); |
| 469 | |
| 470 | /** |
| 471 | * \brief Attach a protected content session to VA context |
| 472 | * |
| 473 | * Attach a protected content session to the context to enable |
| 474 | * decryption/protection |
| 475 | * |
| 476 | * @param[in] dpy the VA display |
| 477 | * @param[in] id the VA decode/encode/vp context |
| 478 | * @param[in] protected_session the protected session to attach |
| 479 | */ |
| 480 | VAStatus vaAttachProtectedSession(VADisplay dpy, VAGenericID id, |
| 481 | VAProtectedSessionID protected_session); |
| 482 | |
| 483 | /** |
| 484 | * \brief Detach the protected content session from the VA context |
| 485 | * |
| 486 | * Detach protected content session of the context to disable |
| 487 | * decryption/protection |
| 488 | * |
| 489 | * @param[in] dpy the VA display |
| 490 | * @param[in] id TEE client id to be detached |
| 491 | */ |
| 492 | VAStatus vaDetachProtectedSession(VADisplay dpy, VAGenericID id); |
| 493 | |
| 494 | /** |
| 495 | * \brief Execute provides a general mechanism for TEE client tasks execution. |
| 496 | * |
| 497 | * vaProtectedSessionExecute provides a mechanism for TEE clients to execute |
| 498 | * specific tasks. The implementation may differ between IHVs. |
| 499 | * This is a synchronous API. |
| 500 | * |
| 501 | * @param[in] dpy the VA display |
| 502 | * @param[in] protected_session the protected session |
| 503 | * @param[in,out] buf_id the VA buffer |
| 504 | */ |
| 505 | VAStatus vaProtectedSessionExecute(VADisplay dpy, |
| 506 | VAProtectedSessionID protected_session, |
| 507 | VABufferID buf_id); |
| 508 | |
| 509 | /**@}*/ |
| 510 | |
| 511 | #ifdef __cplusplus |
| 512 | } |
| 513 | #endif |
| 514 | |
| 515 | #endif /* VA_PROT_H */ |
| 516 | |