12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2014 - 2015, The Linux Foundation. All rights reserved. 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* modification, are permitted provided that the following conditions are 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* met: 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions of source code must retain the above copyright 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* notice, this list of conditions and the following disclaimer. 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions in binary form must reproduce the above 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* copyright notice, this list of conditions and the following 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* disclaimer in the documentation and/or other materials provided 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* with the distribution. 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* contributors may be used to endorse or promote products derived 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* from this software without specific prior written permission. 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/ 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/locker.h> 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/constants.h> 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/debug.h> 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <core/buffer_sync_handler.h> 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "core_impl.h" 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __CLASS__ "CoreInterface" 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define GET_REVISION(version) (version >> 16) 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define GET_DATA_ALIGNMENT(version) ((version >> 8) & 0xFF) 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define GET_INSTRUCTION_SET(version) (version & 0xFF) 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm { 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Currently, we support only one client and one session for display core. So, create a global 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// singleton core object. 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelstruct CoreSingleton { 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CoreSingleton() : core_impl(NULL) { } 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CoreImpl *core_impl; 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Locker locker; 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} g_core; 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// TODO(user): Have a single structure handle carries all the interface pointers. 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CoreInterface::CreateCore(DebugHandler *debug_handler, 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel BufferAllocator *buffer_allocator, 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel BufferSyncHandler *buffer_sync_handler, 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CoreInterface **interface, uint32_t client_version) { 59b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel return CreateCore(debug_handler, buffer_allocator, buffer_sync_handler, NULL, 60b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel interface, client_version); 61b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel} 62b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel 63b06147dd70f03970c8f3b30837a82394b814cb43Thierry StrudelDisplayError CoreInterface::CreateCore(DebugHandler *debug_handler, 64b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel BufferAllocator *buffer_allocator, 65b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel BufferSyncHandler *buffer_sync_handler, 66b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel SocketHandler *socket_handler, 67b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel CoreInterface **interface, uint32_t client_version) { 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(g_core.locker); 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!debug_handler || !buffer_allocator || !buffer_sync_handler || !interface) { 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorParameters; 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Check compatibility of client and core. 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t lib_version = SDM_VERSION_TAG; 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (GET_REVISION(client_version) > GET_REVISION(lib_version)) { 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorVersion; 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else if (GET_DATA_ALIGNMENT(client_version) != GET_DATA_ALIGNMENT(lib_version)) { 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorDataAlignment; 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else if (GET_INSTRUCTION_SET(client_version) != GET_INSTRUCTION_SET(lib_version)) { 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorInstructionSet; 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CoreImpl *&core_impl = g_core.core_impl; 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (core_impl) { 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorUndefined; 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Debug::SetDebugHandler(debug_handler); 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Create appropriate CoreImpl object based on client version. 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (GET_REVISION(client_version) == CoreImpl::kRevision) { 93b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel core_impl = new CoreImpl(buffer_allocator, buffer_sync_handler, socket_handler); 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNotSupported; 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!core_impl) { 992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorMemory; 1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = core_impl->Init(); 1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete core_impl; 1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel core_impl = NULL; 1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *interface = core_impl; 1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGI("Open interface handle = %p", *interface); 1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CoreInterface::DestroyCore() { 1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(g_core.locker); 1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGI("Close handle"); 1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel CoreImpl *&core_impl = g_core.core_impl; 1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!core_impl) { 1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorUndefined; 1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel core_impl->Deinit(); 1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete core_impl; 1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel core_impl = NULL; 1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} // namespace sdm 1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 134