alloc_controller.cpp revision 29a26818d7294055539167b2fbfdaa168bcf725c
1202a77d28ac251545f6f998a974690212309b927Iliyan Malchev/*
2202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
3202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
4202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * Redistribution and use in source and binary forms, with or without
5202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * modification, are permitted provided that the following conditions are
6202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * met:
7202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *   * Redistributions of source code must retain the above copyright
8202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *     notice, this list of conditions and the following disclaimer.
9202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *   * Redistributions in binary form must reproduce the above
10202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *     copyright notice, this list of conditions and the following
11202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *     disclaimer in the documentation and/or other materials provided
12202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *     with the distribution.
13202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *   * Neither the name of Code Aurora Forum, Inc. nor the names of its
14202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *     contributors may be used to endorse or promote products derived
15202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *     from this software without specific prior written permission.
16202a77d28ac251545f6f998a974690212309b927Iliyan Malchev *
17202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27202a77d28ac251545f6f998a974690212309b927Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28202a77d28ac251545f6f998a974690212309b927Iliyan Malchev */
29202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
30202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <cutils/log.h>
31202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <utils/RefBase.h>
32202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include <fcntl.h>
33202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "gralloc_priv.h"
34202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "alloc_controller.h"
35202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "memalloc.h"
36202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "ionalloc.h"
3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "pmemalloc.h"
38202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "ashmemalloc.h"
39202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#include "gr.h"
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include "qcomutils/comptype.h"
41202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
42202a77d28ac251545f6f998a974690212309b927Iliyan Malchevusing namespace gralloc;
43202a77d28ac251545f6f998a974690212309b927Iliyan Malchevusing android::sp;
44202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedconst int GRALLOC_HEAP_MASK  =  GRALLOC_USAGE_PRIVATE_ADSP_HEAP      |
4629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP |
4729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_SMI_HEAP       |
4829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP    |
4929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_IOMMU_HEAP     |
5029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_MM_HEAP        |
5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP |
5229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                GRALLOC_USAGE_PRIVATE_CAMERA_HEAP;
53202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
54202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
55202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//Common functions
5629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic bool canFallback(int usage, bool triedSystem)
57202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
58202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // Fallback to system heap when alloc fails unless
59202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // 1. Composition type is MDP
60202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // 2. Alloc from system heap was already tried
61202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // 3. The heap type is requsted explicitly
62202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // 4. The heap type is protected
63202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // 5. The buffer is meant for external display only
64202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(QCCompositionType::getInstance().getCompositionType() & COMPOSITION_TYPE_MDP)
66202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return false;
67202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(triedSystem)
68202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return false;
6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(usage & (GRALLOC_HEAP_MASK | GRALLOC_USAGE_PROTECTED |
7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                GRALLOC_USAGE_PRIVATE_CP_BUFFER))
71202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return false;
72202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & (GRALLOC_HEAP_MASK | GRALLOC_USAGE_EXTERNAL_ONLY))
73202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return false;
74202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    //Return true by default
75202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return true;
76202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
77202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
78202a77d28ac251545f6f998a974690212309b927Iliyan Malchevstatic bool useUncached(int usage)
79202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
80202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // System heaps cannot be uncached
81202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & (GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP |
82202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                GRALLOC_USAGE_PRIVATE_IOMMU_HEAP))
83202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return false;
84202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (usage & GRALLOC_USAGE_PRIVATE_UNCACHED)
85202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return true;
86202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return false;
87202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
88202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
89202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IAllocController> IAllocController::sController = NULL;
90202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IAllocController> IAllocController::getInstance(bool useMasterHeap)
91202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
92202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(sController == NULL) {
93202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#ifdef USE_ION
94202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        sController = new IonController();
95202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#else
96202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(useMasterHeap)
97202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            sController = new PmemAshmemController();
98202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        else
99202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            sController = new PmemKernelController();
100202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#endif
101202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
102202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return sController;
103202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
104202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
105202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
106202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//-------------- IonController-----------------------//
107202a77d28ac251545f6f998a974690212309b927Iliyan MalchevIonController::IonController()
108202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
109202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    mIonAlloc = new IonAlloc();
110202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
111202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
112202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint IonController::allocate(alloc_data& data, int usage,
11329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                            int compositionType)
114202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
115202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int ionFlags = 0;
116202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int ret;
117202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    bool noncontig = false;
118202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
119202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    data.uncached = useUncached(usage);
12029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.allocType = 0;
12129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
122202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_UI_CONTIG_HEAP)
123202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_HEAP(ION_SF_HEAP_ID);
124202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
125202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP) {
126202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_HEAP(ION_SYSTEM_HEAP_ID);
127202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        noncontig = true;
128202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
129202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
130202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_IOMMU_HEAP)
131202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_HEAP(ION_IOMMU_HEAP_ID);
132202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
133202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_MM_HEAP)
134202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_HEAP(ION_CP_MM_HEAP_ID);
135202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
136202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_WRITEBACK_HEAP)
137202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_HEAP(ION_CP_WB_HEAP_ID);
138202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
139202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_CAMERA_HEAP)
140202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_HEAP(ION_CAMERA_HEAP_ID);
141202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
14229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(usage & GRALLOC_USAGE_PRIVATE_CP_BUFFER)
143202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags |= ION_SECURE;
144202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
145202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_DO_NOT_MAP)
14629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        data.allocType  |=  private_handle_t::PRIV_FLAGS_NOT_MAPPED;
14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    else
14829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        data.allocType  &=  ~(private_handle_t::PRIV_FLAGS_NOT_MAPPED);
149202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
150202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // if no flags are set, default to
151202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // SF + IOMMU heaps, so that bypass can work
152202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // we can fall back to system heap if
153202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // we run out.
154202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(!ionFlags)
155202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ionFlags = ION_HEAP(ION_SF_HEAP_ID) | ION_HEAP(ION_IOMMU_HEAP_ID);
156202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
157202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    data.flags = ionFlags;
158202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    ret = mIonAlloc->alloc_buffer(data);
15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
160202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // Fallback
16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if(ret < 0 && canFallback(usage,
162202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                              (ionFlags & ION_SYSTEM_HEAP_ID)))
163202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    {
164202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ALOGW("Falling back to system heap");
165202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        data.flags = ION_HEAP(ION_SYSTEM_HEAP_ID);
166202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        noncontig = true;
167202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ret = mIonAlloc->alloc_buffer(data);
168202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
169202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
170202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(ret >= 0 ) {
17129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        data.allocType |= private_handle_t::PRIV_FLAGS_USES_ION;
172202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(noncontig)
173202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM;
174202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(ionFlags & ION_SECURE)
175202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType |= private_handle_t::PRIV_FLAGS_SECURE_BUFFER;
176202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
177202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
178202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return ret;
179202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
180202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
181202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IMemAlloc> IonController::getAllocator(int flags)
182202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
183202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    sp<IMemAlloc> memalloc;
184202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (flags & private_handle_t::PRIV_FLAGS_USES_ION) {
185202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = mIonAlloc;
186202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    } else {
187202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags);
188202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
189202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
190202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return memalloc;
191202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
192202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
193202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//-------------- PmemKernelController-----------------------//
19429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//XXX: Remove - we're not using pmem anymore
19529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#if 0
196202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemKernelController::PmemKernelController()
197202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
19829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    mPmemAdspAlloc = new PmemKernelAlloc(DEVICE_PMEM_ADSP);
19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    // XXX: Right now, there is no need to maintain an instance
20029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    // of the SMI allocator as we need it only in a few cases
201202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
202202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
203202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemKernelController::~PmemKernelController()
204202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
205202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
206202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
207202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint PmemKernelController::allocate(alloc_data& data, int usage,
20829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                   int compositionType)
209202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
210202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int ret = 0;
211202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    bool adspFallback = false;
212202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (!(usage & GRALLOC_USAGE_PRIVATE_SMI_HEAP))
213202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        adspFallback = true;
214202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
215202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // Try SMI first
216202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if ((usage & GRALLOC_USAGE_PRIVATE_SMI_HEAP) ||
217202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        (usage & GRALLOC_USAGE_EXTERNAL_DISP)    ||
218202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        (usage & GRALLOC_USAGE_PROTECTED))
219202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    {
220202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        int tempFd = open(DEVICE_PMEM_SMIPOOL, O_RDWR, 0);
221202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(tempFd > 0) {
222202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            close(tempFd);
223202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            sp<IMemAlloc> memalloc;
224202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            memalloc = new PmemKernelAlloc(DEVICE_PMEM_SMIPOOL);
225202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            ret = memalloc->alloc_buffer(data);
226202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            if(ret >= 0)
227202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                return ret;
228202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            else {
229202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                if(adspFallback)
230202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                    ALOGW("Allocation from SMI failed, trying ADSP");
231202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            }
232202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        }
233202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
234202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
235202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if ((usage & GRALLOC_USAGE_PRIVATE_ADSP_HEAP) || adspFallback) {
236202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ret = mPmemAdspAlloc->alloc_buffer(data);
237202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
238202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return ret;
239202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
240202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
241202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IMemAlloc> PmemKernelController::getAllocator(int flags)
242202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
243202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    sp<IMemAlloc> memalloc;
244202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP)
245202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = mPmemAdspAlloc;
246202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    else {
247202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags);
248202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = NULL;
249202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
250202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
251202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return memalloc;
252202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
253202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
254202a77d28ac251545f6f998a974690212309b927Iliyan Malchev//-------------- PmemAshmmemController-----------------------//
255202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
256202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemAshmemController::PmemAshmemController()
257202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
258202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    mPmemUserspaceAlloc = new PmemUserspaceAlloc();
259202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    mAshmemAlloc = new AshmemAlloc();
260202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    mPmemKernelCtrl = new PmemKernelController();
261202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
262202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
263202a77d28ac251545f6f998a974690212309b927Iliyan MalchevPmemAshmemController::~PmemAshmemController()
264202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
265202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
266202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
267202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint PmemAshmemController::allocate(alloc_data& data, int usage,
26829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                   int compositionType)
269202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
270202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    int ret = 0;
27129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.allocType = 0;
272202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
273202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // Make buffers cacheable by default
27429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.uncached = false;
275202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
276202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // Override if we explicitly need uncached buffers
277202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (usage & GRALLOC_USAGE_PRIVATE_UNCACHED)
278202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        data.uncached = true;
279202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
280202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // If ADSP or SMI is requested use the kernel controller
281202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & (GRALLOC_USAGE_PRIVATE_ADSP_HEAP|
282202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                GRALLOC_USAGE_PRIVATE_SMI_HEAP)) {
283202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ret = mPmemKernelCtrl->allocate(data, usage, compositionType);
284202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(ret < 0)
285202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            ALOGE("%s: Failed to allocate ADSP/SMI memory", __func__);
286202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        else
287202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType = private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP;
288202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return ret;
289202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
290202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
291202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(usage & GRALLOC_USAGE_PRIVATE_SYSTEM_HEAP) {
292202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ret = mAshmemAlloc->alloc_buffer(data);
293202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(ret >= 0) {
294202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType = private_handle_t::PRIV_FLAGS_USES_ASHMEM;
295202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM;
296202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        }
297202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        return ret;
298202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
299202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
300202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // if no memory specific flags are set,
301202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // default to EBI heap, so that bypass
302202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // can work. We can fall back to system
303202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // heap if we run out.
304202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    ret = mPmemUserspaceAlloc->alloc_buffer(data);
305202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
306202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    // Fallback
307202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(ret >= 0 ) {
308202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        data.allocType = private_handle_t::PRIV_FLAGS_USES_PMEM;
30929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    } else if(ret < 0 && canFallback(usage, false)) {
310202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ALOGW("Falling back to ashmem");
311202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ret = mAshmemAlloc->alloc_buffer(data);
312202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        if(ret >= 0) {
313202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType = private_handle_t::PRIV_FLAGS_USES_ASHMEM;
314202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            data.allocType |= private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM;
315202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        }
316202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
317202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
318202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return ret;
319202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
320202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
321202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsp<IMemAlloc> PmemAshmemController::getAllocator(int flags)
322202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
323202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    sp<IMemAlloc> memalloc;
324202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM)
325202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = mPmemUserspaceAlloc;
326202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    else if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP)
327202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = mPmemKernelCtrl->getAllocator(flags);
328202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    else if (flags & private_handle_t::PRIV_FLAGS_USES_ASHMEM)
329202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = mAshmemAlloc;
330202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    else {
331202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        ALOGE("%s: Invalid flags passed: 0x%x", __FUNCTION__, flags);
332202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc = NULL;
333202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
334202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
335202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return memalloc;
336202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
337202a77d28ac251545f6f998a974690212309b927Iliyan Malchev#endif
338202a77d28ac251545f6f998a974690212309b927Iliyan Malchevsize_t getBufferSizeAndDimensions(int width, int height, int format,
33929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                  int& alignedw, int &alignedh)
340202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
341202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    size_t size;
342202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
343202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    alignedw = ALIGN(width, 32);
344202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    alignedh = ALIGN(height, 32);
345202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    switch (format) {
346202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_RGBA_8888:
347202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_RGBX_8888:
348202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_BGRA_8888:
349202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size = alignedw * alignedh * 4;
350202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            break;
351202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_RGB_888:
352202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size = alignedw * alignedh * 3;
353202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            break;
354202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_RGB_565:
355202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_RGBA_5551:
356202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_RGBA_4444:
357202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size = alignedw * alignedh * 2;
358202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            break;
359202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
360202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            // adreno formats
361202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:  // NV21
362202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size  = ALIGN(alignedw*alignedh, 4096);
363202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size += ALIGN(2 * ALIGN(width/2, 32) * ALIGN(height/2, 32), 4096);
364202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            break;
365202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:   // NV12
366202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            // The chroma plane is subsampled,
367202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            // but the pitch in bytes is unchanged
368202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            // The GPU needs 4K alignment, but the video decoder needs 8K
369202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            alignedw = ALIGN(width, 128);
370202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size  = ALIGN( alignedw * alignedh, 8192);
371202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size += ALIGN( alignedw * ALIGN(height/2, 32), 8192);
372202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            break;
373202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_NV12_ENCODEABLE:
374202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
375202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
376202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        case HAL_PIXEL_FORMAT_YV12:
377202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            if ((format == HAL_PIXEL_FORMAT_YV12) && ((width&1) || (height&1))) {
378202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                ALOGE("w or h is odd for the YV12 format");
379202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                return -EINVAL;
380202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            }
381202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            alignedw = ALIGN(width, 16);
382202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            alignedh = height;
383202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            if (HAL_PIXEL_FORMAT_NV12_ENCODEABLE == format) {
384202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                // The encoder requires a 2K aligned chroma offset.
385202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                size = ALIGN(alignedw*alignedh, 2048) +
38629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                    (ALIGN(alignedw/2, 16) * (alignedh/2))*2;
387202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            } else {
388202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                size = alignedw*alignedh +
389202a77d28ac251545f6f998a974690212309b927Iliyan Malchev                    (ALIGN(alignedw/2, 16) * (alignedh/2))*2;
390202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            }
391202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            size = ALIGN(size, 4096);
392202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            break;
39329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
39429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        case HAL_PIXEL_FORMAT_YCrCb_422_SP:
39529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            if(width & 1) {
39629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                ALOGE("width is odd for the YUV422_SP format");
39729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                return -EINVAL;
39829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            }
39929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            alignedw = ALIGN(width, 16);
40029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            alignedh = height;
40129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            size = ALIGN(alignedw * alignedh * 2, 4096);
40229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            break;
403202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        default:
40429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed            ALOGE("unrecognized pixel format: 0x%x", format);
405202a77d28ac251545f6f998a974690212309b927Iliyan Malchev            return -EINVAL;
406202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
407202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
408202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    return size;
409202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
410202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
411202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// Allocate buffer from width, height and format into a
412202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// private_handle_t. It is the responsibility of the caller
413202a77d28ac251545f6f998a974690212309b927Iliyan Malchev// to free the buffer using the free_buffer function
414202a77d28ac251545f6f998a974690212309b927Iliyan Malchevint alloc_buffer(private_handle_t **pHnd, int w, int h, int format, int usage)
415202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
41629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    alloc_data data;
41729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int alignedw, alignedh;
41829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    android::sp<gralloc::IAllocController> sAlloc =
41929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        gralloc::IAllocController::getInstance(false);
42029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.base = 0;
42129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.fd = -1;
42229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.offset = 0;
42329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.size = getBufferSizeAndDimensions(w, h, format, alignedw, alignedh);
42429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.align = getpagesize();
42529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    data.uncached = useUncached(usage);
42629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int allocFlags = usage;
42729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
42829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    int err = sAlloc->allocate(data, allocFlags, 0);
42929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    if (0 != err) {
43029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        ALOGE("%s: allocate failed", __FUNCTION__);
43129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed        return -ENOMEM;
43229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    }
43329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
43429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    private_handle_t* hnd = new private_handle_t(data.fd, data.size,
43529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed                                                 data.allocType, 0, format, alignedw, alignedh);
43629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hnd->base = (int) data.base;
43729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hnd->offset = data.offset;
43829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    hnd->gpuaddr = 0;
43929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    *pHnd = hnd;
44029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return 0;
441202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
442202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
443202a77d28ac251545f6f998a974690212309b927Iliyan Malchevvoid free_buffer(private_handle_t *hnd)
444202a77d28ac251545f6f998a974690212309b927Iliyan Malchev{
445202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    android::sp<gralloc::IAllocController> sAlloc =
446202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        gralloc::IAllocController::getInstance(false);
447202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if (hnd && hnd->fd > 0) {
448202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        sp<IMemAlloc> memalloc = sAlloc->getAllocator(hnd->flags);
449202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        memalloc->free_buffer((void*)hnd->base, hnd->size, hnd->offset, hnd->fd);
450202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    }
451202a77d28ac251545f6f998a974690212309b927Iliyan Malchev    if(hnd)
452202a77d28ac251545f6f998a974690212309b927Iliyan Malchev        delete hnd;
453202a77d28ac251545f6f998a974690212309b927Iliyan Malchev
454202a77d28ac251545f6f998a974690212309b927Iliyan Malchev}
455