/*
// Copyright (c) 2014 Intel Corporation 
//
// 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.
*/
#include <common/utils/HwcTrace.h>
#include <ips/common/Wsbm.h>

Wsbm::Wsbm(int drmFD)
    : mInitialized(false)
{
    CTRACE();
    mDrmFD = drmFD;
}

Wsbm::~Wsbm()
{
    WARN_IF_NOT_DEINIT();
}

bool Wsbm::initialize()
{
    if (mInitialized) {
        WLOGTRACE("object is initialized");
        return true;
    }

    int ret = psbWsbmInitialize(mDrmFD);
    if (ret) {
        ELOGTRACE("failed to initialize Wsbm");
        return false;
    }

    mInitialized = true;
    return true;
}

void Wsbm::deinitialize()
{
    if (!mInitialized) {
        return;
    }
    psbWsbmTakedown();
    mInitialized = false;
}

bool Wsbm::allocateTTMBuffer(uint32_t size, uint32_t align, void ** buf)
{
    int ret = psbWsbmAllocateTTMBuffer(size, align, buf);
    if (ret) {
        ELOGTRACE("failed to allocate buffer");
        return false;
    }

    return true;
}

bool Wsbm::allocateTTMBufferUB(uint32_t size, uint32_t align, void ** buf, void *user_pt)
{
    int ret = psbWsbmAllocateFromUB(size, align, buf, user_pt);
    if (ret) {
        ELOGTRACE("failed to allocate UB buffer");
        return false;
    }

    return true;
}

bool Wsbm::destroyTTMBuffer(void * buf)
{
    int ret = psbWsbmDestroyTTMBuffer(buf);
    if (ret) {
        ELOGTRACE("failed to destroy buffer");
        return false;
    }

    return true;
}

void * Wsbm::getCPUAddress(void * buf)
{
    return psbWsbmGetCPUAddress(buf);
}

uint32_t Wsbm::getGttOffset(void * buf)
{
    return psbWsbmGetGttOffset(buf);
}

bool Wsbm::wrapTTMBuffer(uint32_t handle, void **buf)
{
    int ret = psbWsbmWrapTTMBuffer(handle, buf);
    if (ret) {
        ELOGTRACE("failed to wrap buffer");
        return false;
    }

    return true;
}

bool Wsbm::unreferenceTTMBuffer(void *buf)
{
    int ret = psbWsbmUnReference(buf);
    if (ret) {
        ELOGTRACE("failed to unreference buffer");
        return false;
    }

    return true;
}

uint32_t Wsbm::getKBufHandle(void *buf)
{
    return psbWsbmGetKBufHandle(buf);
}

bool Wsbm::waitIdleTTMBuffer(void *buf)
{
    int ret = psbWsbmWaitIdle(buf);
    if (ret) {
        ELOGTRACE("failed to wait ttm buffer for idle");
        return false;
    }

    return true;
}