16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/*
2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 
3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License");
5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License.
6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at
7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//      http://www.apache.org/licenses/LICENSE-2.0
9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software
11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS,
12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and
14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License.
15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/
160594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h>
170594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/Wsbm.h>
186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
196a6081a46a83da606cf21548879b37695adc7e1fAndy QiuWsbm::Wsbm(int drmFD)
20eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    : mInitialized(false)
216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
22e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu    CTRACE();
236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    mDrmFD = drmFD;
246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
266a6081a46a83da606cf21548879b37695adc7e1fAndy QiuWsbm::~Wsbm()
276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
28eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    WARN_IF_NOT_DEINIT();
296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Wsbm::initialize()
326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
33eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (mInitialized) {
344157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        WLOGTRACE("object is initialized");
35eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return true;
36eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
37eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int ret = psbWsbmInitialize(mDrmFD);
39eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (ret) {
404157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to initialize Wsbm");
416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
44eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mInitialized = true;
456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
48eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid Wsbm::deinitialize()
49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
50eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!mInitialized) {
51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
52eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
53eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    psbWsbmTakedown();
54eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mInitialized = false;
55eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Wsbm::allocateTTMBuffer(uint32_t size, uint32_t align, void ** buf)
586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int ret = psbWsbmAllocateTTMBuffer(size, align, buf);
60eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (ret) {
614157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to allocate buffer");
626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
68ffaa9065cde35b7e8394788565db987f4d2705f2Li Zengbool Wsbm::allocateTTMBufferUB(uint32_t size, uint32_t align, void ** buf, void *user_pt)
69ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng{
70ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng    int ret = psbWsbmAllocateFromUB(size, align, buf, user_pt);
71ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng    if (ret) {
724157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to allocate UB buffer");
73ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng        return false;
74ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng    }
75ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng
76ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng    return true;
77ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng}
78ffaa9065cde35b7e8394788565db987f4d2705f2Li Zeng
796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Wsbm::destroyTTMBuffer(void * buf)
806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int ret = psbWsbmDestroyTTMBuffer(buf);
82eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (ret) {
834157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to destroy buffer");
846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuvoid * Wsbm::getCPUAddress(void * buf)
916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return psbWsbmGetCPUAddress(buf);
936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuuint32_t Wsbm::getGttOffset(void * buf)
966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return psbWsbmGetGttOffset(buf);
986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Wsbm::wrapTTMBuffer(uint32_t handle, void **buf)
1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int ret = psbWsbmWrapTTMBuffer(handle, buf);
1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret) {
1044157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to wrap buffer");
1056a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1066a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1076a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
1096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Wsbm::unreferenceTTMBuffer(void *buf)
1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int ret = psbWsbmUnReference(buf);
1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret) {
1154157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to unreference buffer");
1166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
1206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiuuint32_t Wsbm::getKBufHandle(void *buf)
1236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return psbWsbmGetKBufHandle(buf);
1256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
1266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool Wsbm::waitIdleTTMBuffer(void *buf)
1286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{
1296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    int ret = psbWsbmWaitIdle(buf);
1306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    if (ret) {
1314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("failed to wait ttm buffer for idle");
1326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu        return false;
1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    }
1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu
1356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu    return true;
1366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu}
137