1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include "Context.h"
18*4d7e907cSAndroid Build Coastguard Worker #include "Device.h"
19*4d7e907cSAndroid Build Coastguard Worker
20*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <android/dlext.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <dlfcn.h>
23*4d7e907cSAndroid Build Coastguard Worker
24*4d7e907cSAndroid Build Coastguard Worker namespace android {
25*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
26*4d7e907cSAndroid Build Coastguard Worker namespace renderscript {
27*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
28*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
29*4d7e907cSAndroid Build Coastguard Worker
30*4d7e907cSAndroid Build Coastguard Worker
31*4d7e907cSAndroid Build Coastguard Worker static dispatchTable loadHAL();
32*4d7e907cSAndroid Build Coastguard Worker dispatchTable Device::mDispatchHal = loadHAL();
33*4d7e907cSAndroid Build Coastguard Worker
Device()34*4d7e907cSAndroid Build Coastguard Worker Device::Device() {
35*4d7e907cSAndroid Build Coastguard Worker }
36*4d7e907cSAndroid Build Coastguard Worker
getHal()37*4d7e907cSAndroid Build Coastguard Worker dispatchTable& Device::getHal() {
38*4d7e907cSAndroid Build Coastguard Worker return mDispatchHal;
39*4d7e907cSAndroid Build Coastguard Worker }
40*4d7e907cSAndroid Build Coastguard Worker
41*4d7e907cSAndroid Build Coastguard Worker
42*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::renderscript::V1_0::IDevice follow.
43*4d7e907cSAndroid Build Coastguard Worker
contextCreate(uint32_t sdkVersion,ContextType ct,int32_t flags)44*4d7e907cSAndroid Build Coastguard Worker Return<sp<IContext>> Device::contextCreate(uint32_t sdkVersion, ContextType ct, int32_t flags) {
45*4d7e907cSAndroid Build Coastguard Worker return new Context(sdkVersion, ct, flags);
46*4d7e907cSAndroid Build Coastguard Worker }
47*4d7e907cSAndroid Build Coastguard Worker
48*4d7e907cSAndroid Build Coastguard Worker
49*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hidl::base::V1_0::IBase follow.
50*4d7e907cSAndroid Build Coastguard Worker
HIDL_FETCH_IDevice(const char *)51*4d7e907cSAndroid Build Coastguard Worker IDevice* HIDL_FETCH_IDevice(const char* /* name */) {
52*4d7e907cSAndroid Build Coastguard Worker return new Device();
53*4d7e907cSAndroid Build Coastguard Worker }
54*4d7e907cSAndroid Build Coastguard Worker
55*4d7e907cSAndroid Build Coastguard Worker // Helper function
loadHAL()56*4d7e907cSAndroid Build Coastguard Worker dispatchTable loadHAL() {
57*4d7e907cSAndroid Build Coastguard Worker
58*4d7e907cSAndroid Build Coastguard Worker static_assert(sizeof(void*) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(void*) > sizeof(uint64_t)");
59*4d7e907cSAndroid Build Coastguard Worker static_assert(sizeof(size_t) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(size_t) > sizeof(uint64_t)");
60*4d7e907cSAndroid Build Coastguard Worker
61*4d7e907cSAndroid Build Coastguard Worker const char* filename = "libRS_internal.so";
62*4d7e907cSAndroid Build Coastguard Worker // Try to load libRS_internal.so from the "rs" namespace directly.
63*4d7e907cSAndroid Build Coastguard Worker typedef struct android_namespace_t* (*GetExportedNamespaceFnPtr)(const char*);
64*4d7e907cSAndroid Build Coastguard Worker GetExportedNamespaceFnPtr getExportedNamespace = reinterpret_cast<GetExportedNamespaceFnPtr>(
65*4d7e907cSAndroid Build Coastguard Worker dlsym(RTLD_DEFAULT, "android_get_exported_namespace"));
66*4d7e907cSAndroid Build Coastguard Worker void* handle = nullptr;
67*4d7e907cSAndroid Build Coastguard Worker if (getExportedNamespace != nullptr) {
68*4d7e907cSAndroid Build Coastguard Worker android_namespace_t* rsNamespace = getExportedNamespace("rs");
69*4d7e907cSAndroid Build Coastguard Worker if (rsNamespace != nullptr) {
70*4d7e907cSAndroid Build Coastguard Worker const android_dlextinfo dlextinfo = {
71*4d7e907cSAndroid Build Coastguard Worker .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = rsNamespace,
72*4d7e907cSAndroid Build Coastguard Worker };
73*4d7e907cSAndroid Build Coastguard Worker handle = android_dlopen_ext(filename, RTLD_LAZY | RTLD_LOCAL, &dlextinfo);
74*4d7e907cSAndroid Build Coastguard Worker if (handle == nullptr) {
75*4d7e907cSAndroid Build Coastguard Worker LOG(WARNING) << "android_dlopen_ext(" << filename << ") failed: " << dlerror();
76*4d7e907cSAndroid Build Coastguard Worker }
77*4d7e907cSAndroid Build Coastguard Worker }
78*4d7e907cSAndroid Build Coastguard Worker }
79*4d7e907cSAndroid Build Coastguard Worker if (handle == nullptr) {
80*4d7e907cSAndroid Build Coastguard Worker // if there is no "rs" namespace (in case when this HAL impl is loaded
81*4d7e907cSAndroid Build Coastguard Worker // into a vendor process), then use the plain dlopen.
82*4d7e907cSAndroid Build Coastguard Worker handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
83*4d7e907cSAndroid Build Coastguard Worker if (handle == nullptr) {
84*4d7e907cSAndroid Build Coastguard Worker LOG(FATAL) << "dlopen(" << filename << ") failed: " << dlerror();
85*4d7e907cSAndroid Build Coastguard Worker }
86*4d7e907cSAndroid Build Coastguard Worker }
87*4d7e907cSAndroid Build Coastguard Worker
88*4d7e907cSAndroid Build Coastguard Worker dispatchTable dispatchHal = {
89*4d7e907cSAndroid Build Coastguard Worker .SetNativeLibDir = (SetNativeLibDirFnPtr) nullptr,
90*4d7e907cSAndroid Build Coastguard Worker
91*4d7e907cSAndroid Build Coastguard Worker .Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData"),
92*4d7e907cSAndroid Build Coastguard Worker .Allocation1DElementData = (Allocation1DElementDataFnPtr) nullptr,
93*4d7e907cSAndroid Build Coastguard Worker .Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead"),
94*4d7e907cSAndroid Build Coastguard Worker .Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData"),
95*4d7e907cSAndroid Build Coastguard Worker .Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead"),
96*4d7e907cSAndroid Build Coastguard Worker .Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData"),
97*4d7e907cSAndroid Build Coastguard Worker .Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead"),
98*4d7e907cSAndroid Build Coastguard Worker .AllocationAdapterCreate =
99*4d7e907cSAndroid Build Coastguard Worker (AllocationAdapterCreateFnPtr)dlsym(handle, "rsAllocationAdapterCreate"),
100*4d7e907cSAndroid Build Coastguard Worker .AllocationAdapterOffset =
101*4d7e907cSAndroid Build Coastguard Worker (AllocationAdapterOffsetFnPtr)dlsym(handle, "rsAllocationAdapterOffset"),
102*4d7e907cSAndroid Build Coastguard Worker .AllocationCopy2DRange =
103*4d7e907cSAndroid Build Coastguard Worker (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange"),
104*4d7e907cSAndroid Build Coastguard Worker .AllocationCopy3DRange =
105*4d7e907cSAndroid Build Coastguard Worker (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange"),
106*4d7e907cSAndroid Build Coastguard Worker .AllocationCopyToBitmap =
107*4d7e907cSAndroid Build Coastguard Worker (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap"),
108*4d7e907cSAndroid Build Coastguard Worker .AllocationCreateFromBitmap =
109*4d7e907cSAndroid Build Coastguard Worker (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap"),
110*4d7e907cSAndroid Build Coastguard Worker .AllocationCreateStrided =
111*4d7e907cSAndroid Build Coastguard Worker (AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided"),
112*4d7e907cSAndroid Build Coastguard Worker .AllocationCreateTyped =
113*4d7e907cSAndroid Build Coastguard Worker (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped"),
114*4d7e907cSAndroid Build Coastguard Worker .AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(
115*4d7e907cSAndroid Build Coastguard Worker handle, "rsAllocationCubeCreateFromBitmap"),
116*4d7e907cSAndroid Build Coastguard Worker .AllocationElementData =
117*4d7e907cSAndroid Build Coastguard Worker (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData"),
118*4d7e907cSAndroid Build Coastguard Worker .AllocationElementRead =
119*4d7e907cSAndroid Build Coastguard Worker (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead"),
120*4d7e907cSAndroid Build Coastguard Worker .AllocationGenerateMipmaps =
121*4d7e907cSAndroid Build Coastguard Worker (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps"),
122*4d7e907cSAndroid Build Coastguard Worker .AllocationGetPointer =
123*4d7e907cSAndroid Build Coastguard Worker (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer"),
124*4d7e907cSAndroid Build Coastguard Worker .AllocationGetSurface =
125*4d7e907cSAndroid Build Coastguard Worker (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface"),
126*4d7e907cSAndroid Build Coastguard Worker .AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType"),
127*4d7e907cSAndroid Build Coastguard Worker .AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive"),
128*4d7e907cSAndroid Build Coastguard Worker .AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend"),
129*4d7e907cSAndroid Build Coastguard Worker .AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead"),
130*4d7e907cSAndroid Build Coastguard Worker .AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D"),
131*4d7e907cSAndroid Build Coastguard Worker .AllocationSetSurface =
132*4d7e907cSAndroid Build Coastguard Worker (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface"),
133*4d7e907cSAndroid Build Coastguard Worker .AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll"),
134*4d7e907cSAndroid Build Coastguard Worker .AllocationSetupBufferQueue =
135*4d7e907cSAndroid Build Coastguard Worker (AllocationSetupBufferQueueFnPtr)dlsym(handle, "rsAllocationSetupBufferQueue"),
136*4d7e907cSAndroid Build Coastguard Worker .AllocationShareBufferQueue =
137*4d7e907cSAndroid Build Coastguard Worker (AllocationShareBufferQueueFnPtr)dlsym(handle, "rsAllocationShareBufferQueue"),
138*4d7e907cSAndroid Build Coastguard Worker .AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName"),
139*4d7e907cSAndroid Build Coastguard Worker .ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate"),
140*4d7e907cSAndroid Build Coastguard Worker .ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg"),
141*4d7e907cSAndroid Build Coastguard Worker .ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal"),
142*4d7e907cSAndroid Build Coastguard Worker .ContextCreateVendor = (ContextCreateVendorFnPtr)dlsym(handle, "rsContextCreateVendor"),
143*4d7e907cSAndroid Build Coastguard Worker .ContextDeinitToClient =
144*4d7e907cSAndroid Build Coastguard Worker (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient"),
145*4d7e907cSAndroid Build Coastguard Worker .ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy"),
146*4d7e907cSAndroid Build Coastguard Worker .ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump"),
147*4d7e907cSAndroid Build Coastguard Worker .ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish"),
148*4d7e907cSAndroid Build Coastguard Worker .ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage"),
149*4d7e907cSAndroid Build Coastguard Worker .ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient"),
150*4d7e907cSAndroid Build Coastguard Worker .ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage"),
151*4d7e907cSAndroid Build Coastguard Worker .ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage"),
152*4d7e907cSAndroid Build Coastguard Worker .ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority"),
153*4d7e907cSAndroid Build Coastguard Worker .ContextSetCacheDir = (ContextSetCacheDirFnPtr)dlsym(handle, "rsContextSetCacheDir"),
154*4d7e907cSAndroid Build Coastguard Worker .DeviceCreate = (DeviceCreateFnPtr) nullptr,
155*4d7e907cSAndroid Build Coastguard Worker .DeviceDestroy = (DeviceDestroyFnPtr) nullptr,
156*4d7e907cSAndroid Build Coastguard Worker .DeviceSetConfig = (DeviceSetConfigFnPtr) nullptr,
157*4d7e907cSAndroid Build Coastguard Worker .ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2"),
158*4d7e907cSAndroid Build Coastguard Worker .ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate"),
159*4d7e907cSAndroid Build Coastguard Worker .ElementGetNativeData =
160*4d7e907cSAndroid Build Coastguard Worker (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData"),
161*4d7e907cSAndroid Build Coastguard Worker .ElementGetSubElements =
162*4d7e907cSAndroid Build Coastguard Worker (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements"),
163*4d7e907cSAndroid Build Coastguard Worker .GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName"),
164*4d7e907cSAndroid Build Coastguard Worker .InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate"),
165*4d7e907cSAndroid Build Coastguard Worker .ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy"),
166*4d7e907cSAndroid Build Coastguard Worker .SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate"),
167*4d7e907cSAndroid Build Coastguard Worker .ScriptBindAllocation =
168*4d7e907cSAndroid Build Coastguard Worker (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation"),
169*4d7e907cSAndroid Build Coastguard Worker .ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate"),
170*4d7e907cSAndroid Build Coastguard Worker .ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate"),
171*4d7e907cSAndroid Build Coastguard Worker .ScriptForEach = (ScriptForEachFnPtr) nullptr,
172*4d7e907cSAndroid Build Coastguard Worker .ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti"),
173*4d7e907cSAndroid Build Coastguard Worker .ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV"),
174*4d7e907cSAndroid Build Coastguard Worker .ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create"),
175*4d7e907cSAndroid Build Coastguard Worker .ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate"),
176*4d7e907cSAndroid Build Coastguard Worker .ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute"),
177*4d7e907cSAndroid Build Coastguard Worker .ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput"),
178*4d7e907cSAndroid Build Coastguard Worker .ScriptGroupSetOutput =
179*4d7e907cSAndroid Build Coastguard Worker (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput"),
180*4d7e907cSAndroid Build Coastguard Worker .ScriptIntrinsicCreate =
181*4d7e907cSAndroid Build Coastguard Worker (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate"),
182*4d7e907cSAndroid Build Coastguard Worker .ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke"),
183*4d7e907cSAndroid Build Coastguard Worker .ScriptInvokeIDCreate =
184*4d7e907cSAndroid Build Coastguard Worker (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate"),
185*4d7e907cSAndroid Build Coastguard Worker .ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV"),
186*4d7e907cSAndroid Build Coastguard Worker .ScriptKernelIDCreate =
187*4d7e907cSAndroid Build Coastguard Worker (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate"),
188*4d7e907cSAndroid Build Coastguard Worker .ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce"),
189*4d7e907cSAndroid Build Coastguard Worker .ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone"),
190*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD"),
191*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF"),
192*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI"),
193*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ"),
194*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj"),
195*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE"),
196*4d7e907cSAndroid Build Coastguard Worker .ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV"),
197*4d7e907cSAndroid Build Coastguard Worker .TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate"),
198*4d7e907cSAndroid Build Coastguard Worker .TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData"),
199*4d7e907cSAndroid Build Coastguard Worker };
200*4d7e907cSAndroid Build Coastguard Worker
201*4d7e907cSAndroid Build Coastguard Worker return dispatchHal;
202*4d7e907cSAndroid Build Coastguard Worker }
203*4d7e907cSAndroid Build Coastguard Worker
204*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation
205*4d7e907cSAndroid Build Coastguard Worker } // namespace V1_0
206*4d7e907cSAndroid Build Coastguard Worker } // namespace renderscript
207*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware
208*4d7e907cSAndroid Build Coastguard Worker } // namespace android
209