am e84bc637: fix gralloc qsd8k. we actually don\'t need to use /pmem/gpu1, since the gpu is now able to use regular PMEM.

Merge commit 'e84bc637603d34b11a35658a7dbb511bc76aebda'

* commit 'e84bc637603d34b11a35658a7dbb511bc76aebda':
  fix gralloc qsd8k. we actually don't need to use /pmem/gpu1, since the gpu is now able to use regular PMEM.
This commit is contained in:
Mathias Agopian
2009-08-20 16:56:10 -07:00
committed by Android Git Automerger
3 changed files with 16 additions and 108 deletions

View File

@@ -43,10 +43,7 @@
/*****************************************************************************/
#define ALLOCATORREGION_RESERVED_SIZE (3<<20)
static SimpleBestFitAllocator sAllocator;
static SimpleBestFitAllocator sAllocatorGPU(ALLOCATORREGION_RESERVED_SIZE);
/*****************************************************************************/
@@ -110,9 +107,7 @@ struct private_module_t HAL_MODULE_INFO_SYM = {
currentBuffer: 0,
pmem_master: -1,
pmem_master_base: 0,
master_phys: 0,
gpu: -1,
gpu_base: 0
master_phys: 0
};
/*****************************************************************************/
@@ -166,6 +161,7 @@ static int gralloc_alloc_framebuffer_locked(alloc_device_t* dev,
hnd->base = vaddr;
hnd->offset = vaddr - intptr_t(m->framebuffer->base);
hnd->phys = intptr_t(m->framebuffer->phys) + hnd->offset;
*pHandle = hnd;
return 0;
@@ -188,7 +184,6 @@ static int init_pmem_area_locked(private_module_t* m)
int err = 0;
int master_fd = open("/dev/pmem", O_RDWR, 0);
if (master_fd >= 0) {
size_t size;
pmem_region region;
if (ioctl(master_fd, PMEM_GET_TOTAL_SIZE, &region) < 0) {
@@ -206,6 +201,15 @@ static int init_pmem_area_locked(private_module_t* m)
base = 0;
close(master_fd);
master_fd = -1;
} else {
// FIXME: get physical address, eventually this will have to go away
pmem_region region;
err = ioctl(master_fd, PMEM_GET_PHYS, &region);
if (err < 0) {
LOGE("PMEM_GET_PHYS failed (%s)", strerror(-errno));
} else {
m->master_phys = (unsigned long)region.offset;
}
}
m->pmem_master = master_fd;
m->pmem_master_base = base;
@@ -235,63 +239,6 @@ static int init_pmem_area(private_module_t* m)
return err;
}
static int init_gpu_area_locked(private_module_t* m)
{
int err = 0;
int gpu = open("/dev/pmem_gpu1", O_RDWR, 0);
LOGE_IF(gpu<0, "could not open /dev/pmem_gpu1 (%s)", strerror(errno));
if (gpu >= 0) {
size_t size = sAllocatorGPU.size();
void* base = mmap(0, size,
PROT_READ|PROT_WRITE, MAP_SHARED, gpu, 0);
if (base == MAP_FAILED) {
LOGE("mmap /dev/pmem_gpu1 (%s)", strerror(errno));
err = -errno;
base = 0;
close(gpu);
gpu = -1;
} else {
pmem_region region;
err = ioctl(gpu, PMEM_GET_PHYS, &region);
if(err < 0) {
LOGE("init pmem: master ioctl failed %d", -errno);
} else {
m->master_phys = (unsigned long)region.offset;
}
}
m->gpu = gpu;
m->gpu_base = base;
} else {
err = -errno;
m->gpu = 0;
m->gpu_base = 0;
}
return err;
}
static int init_gpu_area(private_module_t* m)
{
pthread_mutex_lock(&m->lock);
int err = m->gpu;
if (err == -1) {
// first time, try to initialize gpu
err = init_gpu_area_locked(m);
if (err) {
m->gpu = err;
}
} else if (err < 0) {
// gpu couldn't be initialized, never use it
} else {
// gpu OK
err = 0;
}
pthread_mutex_unlock(&m->lock);
return err;
}
static int gralloc_alloc_buffer(alloc_device_t* dev,
size_t size, int usage, buffer_handle_t* pHandle)
{
@@ -299,7 +246,6 @@ static int gralloc_alloc_buffer(alloc_device_t* dev,
int flags = 0;
int fd = -1;
int gpu_fd = -1;
void* base = 0;
int offset = 0;
int lockState = 0;
@@ -323,7 +269,7 @@ try_ashmem:
LOGE("couldn't create ashmem (%s)", strerror(errno));
err = -errno;
}
} else if ((usage & GRALLOC_USAGE_HW_RENDER) == 0) {
} else {
private_module_t* m = reinterpret_cast<private_module_t*>(
dev->common.module);
@@ -371,35 +317,6 @@ try_ashmem:
LOGE("couldn't open pmem (%s)", strerror(errno));
}
}
} else {
// looks like we want 3D...
flags &= ~private_handle_t::PRIV_FLAGS_USES_PMEM;
flags |= private_handle_t::PRIV_FLAGS_USES_GPU;
private_module_t* m = reinterpret_cast<private_module_t*>(
dev->common.module);
err = init_gpu_area(m);
if (err == 0) {
// GPU buffers are always mmapped
base = m->gpu_base;
lockState |= private_handle_t::LOCK_STATE_MAPPED;
offset = sAllocatorGPU.allocate(size);
if (offset < 0) {
// no more pmem memory
err = -ENOMEM;
} else {
LOGD("allocating GPU size=%d, offset=%d", size, offset);
fd = open("/dev/null", O_RDONLY); // just so marshalling doesn't fail
gpu_fd = m->gpu;
memset((char*)base + offset, 0, size);
}
} else {
// not enough memory, try ashmem
flags &= ~private_handle_t::PRIV_FLAGS_USES_GPU;
err = 0;
goto try_ashmem;
}
}
if (err == 0) {
@@ -407,8 +324,7 @@ try_ashmem:
hnd->offset = offset;
hnd->base = int(base)+offset;
hnd->lockState = lockState;
hnd->gpu_fd = gpu_fd;
if (flags & private_handle_t::PRIV_FLAGS_USES_GPU) {
if (flags & private_handle_t::PRIV_FLAGS_USES_PMEM) {
private_module_t* m = reinterpret_cast<private_module_t*>(
dev->common.module);
hnd->phys = m->master_phys + offset;
@@ -517,9 +433,6 @@ static int gralloc_free(alloc_device_t* dev,
sAllocator.deallocate(hnd->offset);
}
}
} else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_GPU) {
LOGD("freeing GPU buffer at %d", hnd->offset);
sAllocatorGPU.deallocate(hnd->offset);
}
gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(

View File

@@ -46,8 +46,6 @@ struct private_module_t {
int pmem_master;
void* pmem_master_base;
unsigned long master_phys;
int gpu;
void* gpu_base;
struct fb_var_screeninfo info;
struct fb_fix_screeninfo finfo;
@@ -73,7 +71,6 @@ struct private_handle_t {
enum {
PRIV_FLAGS_FRAMEBUFFER = 0x00000001,
PRIV_FLAGS_USES_PMEM = 0x00000002,
PRIV_FLAGS_USES_GPU = 0x00000004,
};
enum {
@@ -104,8 +101,8 @@ struct private_handle_t {
static const int sMagic = 'gmsm';
private_handle_t(int fd, int size, int flags) :
fd(fd), magic(sMagic), flags(flags), size(size), offset(0),
base(0), lockState(0), writeOwner(0), pid(getpid())
fd(fd), magic(sMagic), flags(flags), size(size), offset(0), gpu_fd(-1),
base(0), lockState(0), writeOwner(0), phys(0), pid(getpid())
{
version = sizeof(native_handle);
numInts = sNumInts;
@@ -116,7 +113,7 @@ struct private_handle_t {
}
bool usesPhysicallyContiguousMemory() {
return (flags & (PRIV_FLAGS_USES_PMEM|PRIV_FLAGS_USES_GPU)) != 0;
return (flags & PRIV_FLAGS_USES_PMEM) != 0;
}
static int validate(const native_handle* h) {

View File

@@ -174,8 +174,6 @@ int terminateBuffer(gralloc_module_t const* module,
// (see gralloc_alloc_buffer())
gralloc_unmap(module, hnd);
}
} else if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_GPU) {
// XXX: for now do nothing here
} else {
gralloc_unmap(module, hnd);
}