blob: 129cb4f5b7f3f4679b0c8478a0d04b2662221d5c [file] [log] [blame]
/*
// 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 <HwcTrace.h>
#include <common/TTMBufferMapper.h>
namespace android {
namespace intel {
TTMBufferMapper::TTMBufferMapper(Wsbm& wsbm, DataBuffer& buffer)
: BufferMapper(buffer),
mWsbm(wsbm),
mBufferObject(0),
mGttOffsetInPage(0),
mCpuAddress(0),
mSize(0)
{
CTRACE();
}
TTMBufferMapper::~TTMBufferMapper()
{
CTRACE();
}
bool TTMBufferMapper::map()
{
void *wsbmBufferObject = 0;
buffer_handle_t handle;
void *virtAddr;
uint32_t gttOffsetInPage;
CTRACE();
handle = getHandle();
bool ret = mWsbm.wrapTTMBuffer((int64_t)handle, &wsbmBufferObject);
if (ret == false) {
ETRACE("failed to map TTM buffer");
return false;
}
// TODO: review this later
ret = mWsbm.waitIdleTTMBuffer(wsbmBufferObject);
if (ret == false) {
ETRACE("failed to wait ttm buffer idle");
return false;
}
virtAddr = mWsbm.getCPUAddress(wsbmBufferObject);
gttOffsetInPage = mWsbm.getGttOffset(wsbmBufferObject);
if (!gttOffsetInPage || !virtAddr) {
WTRACE("offset = %#x, addr = %p.", gttOffsetInPage, virtAddr);
return false;
}
// update parameters
mBufferObject = wsbmBufferObject;
mGttOffsetInPage = gttOffsetInPage;
mCpuAddress = virtAddr;
mSize = 0;
return true;
}
bool TTMBufferMapper::unmap()
{
CTRACE();
if (!mBufferObject)
return false;
mWsbm.unreferenceTTMBuffer(mBufferObject);
mGttOffsetInPage = 0;
mCpuAddress = 0;
mSize = 0;
mBufferObject = 0;
return true;
}
bool TTMBufferMapper::waitIdle()
{
return mWsbm.waitIdleTTMBuffer(mBufferObject);
}
} // namespace intel
} // namespace android