/*
 * Copyright (C) 2014 Intel Corporation. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __DRM_COMMON_API_H__
#define __DRM_COMMON_API_H__

#include <inttypes.h>

/*
 * Maximum number of bytes for an audio or video data DMA.
 */
#define MAX_DMA_DATA_SIZE_IN_BYTES (4 * 1024 * 1024)

/*
 * The size of an AES Initialization Vector counter in bytes.
 */
#define AES_IV_COUNTER_SIZE_IN_BYTES 16

#define DRM_PLATCAP_IED         0x01
#define DRM_PLATCAP_IMR         0x02
#define DRM_PLATCAP_EPID        0x04
#define DRM_PLATCAP_HDCP        0x08

// Secure clock transaction ID (TID) size in bytes.
#define DRM_TID_SIZE 16

#define MAX_RNG_SIZE_IN_BYTES (4 * 1024)

//
// Secure clock time of day data type.
// day_of_month: starts with 1.
// month: 0 = January.
// year: Epoch is 70 (i.e., 1970). Maximum value is 138 (i.e., 2038).
//
struct time_of_day
{
    uint8_t sec;
    uint8_t min;
    uint8_t hour;
    uint8_t day_of_week;
    uint8_t day_of_month;
    uint8_t month;
    uint8_t year;
    uint8_t padding;
};


//
// Secure clock server response data type.
//
struct drm_secureclock_server_response
{
    uint8_t tid[DRM_TID_SIZE];
    struct time_of_day current_time;
    struct time_of_day refresh_time;
    uint8_t signature[256];
};


/*
 * DRM Schemes
 */
/*
   typedef enum {
        DRM_SCHEME_Netflix,
        DRM_SCHEME_Widevine,
        DRM_SCHEME_WidevineHLS,
   } drm_scheme_t;
 */


struct drm_platform_caps
{
    uint32_t imr_size;
    uint32_t reserved[15];
};


/*
 * DRM Library Initialization
 * Description:
 *  Initializes the security engine driver for DRM library use.
 */
uint32_t drm_library_init(void);

/*
 * @brief Writes random bytes into buffer
 */
uint32_t drm_get_random(
    uint8_t *rand_num_buf,
    uint32_t buf_size);

/*!
 * Create a DRM session
 */
uint32_t drm_create_session(
    uint32_t drm_scheme,
    uint32_t *sessionid_ptr);

/*!
 * Destroy the specified DRM session
 */
uint32_t drm_destroy_session(
    uint32_t session_id);


/*
 * Keeps an active DRM session from timing out
 */
uint32_t drm_keep_alive(
    uint32_t session_id,
    uint32_t *timeout);

/*
 * Query secure platform capabilities
 */
uint32_t drm_query_platformcapabilities(
    uint32_t *plat_cap,
    struct drm_platform_caps *cap_array);


/*
 * @brief Pauses the playback of a video decryption session.
 * @param session_id The ID number of the session to pause playback.
 * @return DRM_SUCCESSFUL The video decryption session was paused.
 */
uint32_t drm_playback_pause(
    uint32_t session_id);


/*
 * @brief Resumes the playback of a paused video decryption session.
 * @param session_id The ID number of the session to resume playback.
 * @return DRM_SUCCESSFUL The video decryption session was resumed.
 */
uint32_t drm_playback_resume(
    uint32_t session_id);


/*!
 * @brief Enables protected video path for DRM playback
 */
uint32_t drm_start_playback(void);


/*!
 * @brief - Disables protected video path for DRM
 */
uint32_t drm_stop_playback(void);

#endif