exynos3: libs3cjpeg: read memory configuration from kernel

This improves the flexibility (not all devices have the same FFC
resolution) and also allows optimization of memory usage.

We currently allocate 4 MB to the hardware JPEG encoder, but only
1 MB is actually needed if it's only used for encoding VGA images.
Note that the thumbnail encoding function of the kernel driver is
not used.

This patch is backward compatible with older kernels, but patching
is recommended. Cherry-pick the following commits:

	http://review.cyanogenmod.org/56791
	http://review.cyanogenmod.org/56792

Change-Id: I0e89b24e56b99e8e27f5a38d5c158b23021ed035
diff --git a/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp b/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp
index d2b6a6f..96cee3d 100644
--- a/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp
+++ b/exynos3/s5pc110/libs3cjpeg/JpegEncoder.cpp
@@ -44,8 +44,28 @@
         return;
     }
 
+    // Must be exactly 0, legacy kernel will return 1 despite
+    // the IOCTL being invalid
+    if (ioctl(mDevFd, IOCTL_JPG_GET_INFO, &mInfo) != 0) {
+#ifdef LEGACY_SUPPORT
+        ALOGW("Unable to read driver info. Using legacy values.");
+        mInfo.frame_buf_size = JPG_FRAME_BUF_SIZE;
+        mInfo.thumb_frame_buf_size = JPG_FRAME_THUMB_BUF_SIZE;
+        mInfo.stream_buf_size = JPG_STREAM_BUF_SIZE;
+        mInfo.thumb_stream_buf_size = JPG_STREAM_THUMB_BUF_SIZE;
+        mInfo.total_buf_size = JPG_TOTAL_BUF_SIZE;
+        mInfo.max_width = MAX_JPG_WIDTH;
+        mInfo.max_height = MAX_JPG_HEIGHT;
+        mInfo.max_thumb_width = MAX_JPG_THUMBNAIL_WIDTH;
+        mInfo.max_thumb_height = MAX_JPG_THUMBNAIL_HEIGHT;
+#else
+        ALOGE("Unable to read driver info.");
+        return;
+#endif
+    }
+
     mArgs.mmapped_addr = (char *)mmap(0,
-                                      JPG_TOTAL_BUF_SIZE,
+                                      mInfo.total_buf_size,
                                       PROT_READ | PROT_WRITE,
                                       MAP_SHARED,
                                       mDevFd,
@@ -82,7 +102,7 @@
 JpegEncoder::~JpegEncoder()
 {
     if (mArgs.mmapped_addr != (char*)MAP_FAILED)
-        munmap(mArgs.mmapped_addr, JPG_TOTAL_BUF_SIZE);
+        munmap(mArgs.mmapped_addr, mInfo.total_buf_size);
 
     delete mArgs.enc_param;
 
@@ -101,14 +121,14 @@
 
     switch (type) {
     case JPEG_SET_ENCODE_WIDTH:
-        if (value < 0 || value > MAX_JPG_WIDTH)
+        if (value < 0 || value > mInfo.max_width)
             ret = JPG_FAIL;
         else
             mArgs.enc_param->width = value;
         break;
 
     case JPEG_SET_ENCODE_HEIGHT:
-        if (value < 0 || value > MAX_JPG_HEIGHT)
+        if (value < 0 || value > mInfo.max_height)
             ret = JPG_FAIL;
         else
             mArgs.enc_param->height = value;
@@ -140,14 +160,14 @@
         break;
 
     case JPEG_SET_THUMBNAIL_WIDTH:
-        if (value < 0 || value > MAX_JPG_THUMBNAIL_WIDTH)
+        if (value < 0 || value > mInfo.max_thumb_width)
             ret = JPG_FAIL;
         else
             mArgs.thumb_enc_param->width = value;
         break;
 
     case JPEG_SET_THUMBNAIL_HEIGHT:
-        if (value < 0 || value > MAX_JPG_THUMBNAIL_HEIGHT)
+        if (value < 0 || value > mInfo.max_thumb_height)
             ret = JPG_FAIL;
         else
             mArgs.thumb_enc_param->height = value;
@@ -169,7 +189,7 @@
     if (!available)
         return NULL;
 
-    if (size > JPG_FRAME_BUF_SIZE) {
+    if (size > mInfo.frame_buf_size) {
         ALOGE("The buffer size requested is too large");
         return NULL;
     }
@@ -196,7 +216,7 @@
     if (!available)
         return NULL;
 
-    if (size > JPG_FRAME_THUMB_BUF_SIZE) {
+    if (size > mInfo.thumb_frame_buf_size) {
         ALOGE("The buffer size requested is too large");
         return NULL;
     }
@@ -259,7 +279,7 @@
             bufSize = EXIF_FILE_SIZE;
         }
 
-        if (mArgs.enc_param->file_size + bufSize > JPG_TOTAL_BUF_SIZE)
+        if (mArgs.enc_param->file_size + bufSize > mInfo.total_buf_size)
             return ret;
 
         exifOut = new unsigned char[bufSize];