diff --git a/common.mk b/common.mk
index 0a37200..a30c0d9 100644
--- a/common.mk
+++ b/common.mk
@@ -75,5 +75,6 @@
 # If the macro is not present, the headers are picked from hardware/qcom/msmXXXX
 # failing which, they are picked from bionic.
     common_deps += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
-    kernel_includes += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
+    kernel_includes += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
+                       $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include/display
 endif
diff --git a/gralloc/gr_buf_mgr.cpp b/gralloc/gr_buf_mgr.cpp
index 64f36e1..7e9f57f 100644
--- a/gralloc/gr_buf_mgr.cpp
+++ b/gralloc/gr_buf_mgr.cpp
@@ -303,7 +303,7 @@
   return Error::NONE;
 }
 
-static void getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp) {
+static Error getComponentSizeAndOffset(int32_t format, PlaneLayoutComponent &comp) {
   switch (format) {
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_8888):
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBX_8888):
@@ -315,8 +315,11 @@
         comp.offsetInBits = 8;
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
         comp.offsetInBits = 16;
-      } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
+      } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value &&
+                 format != HAL_PIXEL_FORMAT_RGB_888) {
         comp.offsetInBits = 24;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGB_565):
@@ -329,6 +332,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
         comp.offsetInBits = 11;
         comp.sizeInBits = 5;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGR_565):
@@ -341,6 +346,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
         comp.offsetInBits = 0;
         comp.sizeInBits = 5;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_8888):
@@ -353,8 +360,11 @@
         comp.offsetInBits = 8;
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_B.value) {
         comp.offsetInBits = 0;
-      } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
+      } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value &&
+                 format != HAL_PIXEL_FORMAT_BGR_888) {
         comp.offsetInBits = 24;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_5551):
@@ -370,6 +380,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 1;
         comp.offsetInBits = 15;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_4444):
@@ -385,6 +397,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 4;
         comp.offsetInBits = 12;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_R_8):
@@ -392,8 +406,11 @@
       comp.sizeInBits = 8;
       if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_R.value) {
         comp.offsetInBits = 0;
-      } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value) {
+      } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_G.value &&
+                 format != HAL_PIXEL_FORMAT_R_8) {
         comp.offsetInBits = 8;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_1010102):
@@ -410,6 +427,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 2;
         comp.offsetInBits = 30;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_ARGB_2101010):
@@ -426,6 +445,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 2;
         comp.offsetInBits = 0;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_BGRA_1010102):
@@ -442,6 +463,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 2;
         comp.offsetInBits = 30;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_ABGR_2101010):
@@ -458,6 +481,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 2;
         comp.offsetInBits = 0;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_RGBA_FP16):
@@ -473,6 +498,8 @@
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_A.value) {
         comp.sizeInBits = 16;
         comp.offsetInBits = 48;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_SP):
@@ -485,6 +512,8 @@
         comp.offsetInBits = 0;
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
         comp.offsetInBits = 8;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCrCb_420_SP):
@@ -498,12 +527,16 @@
         comp.offsetInBits = 0;
       } else if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_CB.value) {
         comp.offsetInBits = 8;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y16):
       if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
         comp.offsetInBits = 0;
         comp.sizeInBits = 16;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_YV12):
@@ -512,12 +545,16 @@
           comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
         comp.offsetInBits = 0;
         comp.sizeInBits = 8;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_Y8):
       if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_Y.value) {
         comp.offsetInBits = 0;
         comp.sizeInBits = 8;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     case static_cast<int32_t>(HAL_PIXEL_FORMAT_YCbCr_420_P010):
@@ -526,11 +563,40 @@
           comp.type.value == android::gralloc4::PlaneLayoutComponentType_CR.value) {
         comp.offsetInBits = 0;
         comp.sizeInBits = 10;
+      } else {
+        return Error::BAD_VALUE;
+      }
+      break;
+    case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW16):
+      if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
+        comp.offsetInBits = 0;
+        comp.sizeInBits = 16;
+      } else {
+        return Error::BAD_VALUE;
+      }
+      break;
+    case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW12):
+    case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW10):
+      if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
+        comp.offsetInBits = 0;
+        comp.sizeInBits = -1;
+      } else {
+        return Error::BAD_VALUE;
+      }
+      break;
+    case static_cast<int32_t>(HAL_PIXEL_FORMAT_RAW8):
+      if (comp.type.value == android::gralloc4::PlaneLayoutComponentType_RAW.value) {
+        comp.offsetInBits = 0;
+        comp.sizeInBits = 8;
+      } else {
+        return Error::BAD_VALUE;
       }
       break;
     default:
-      break;
+      ALOGI_IF(DEBUG, "Offset and size in bits unknown for format %d", format);
+      return Error::UNSUPPORTED;
   }
+  return Error::NONE;
 }
 
 static void grallocToStandardPlaneLayoutComponentType(uint32_t in,
@@ -542,49 +608,50 @@
 
   if (in & PLANE_COMPONENT_Y) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_Y;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_Cb) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_CB;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_Cr) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_CR;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_R) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_R;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_G) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_G;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_B) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_B;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_A) {
     comp.type = android::gralloc4::PlaneLayoutComponentType_A;
-    getComponentSizeAndOffset(format, comp);
-    components->push_back(comp);
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_RAW) {
-    comp.type = qtigralloc::PlaneLayoutComponentType_Raw;
-    components->push_back(comp);
+    comp.type = android::gralloc4::PlaneLayoutComponentType_RAW;
+    if (getComponentSizeAndOffset(format, comp) == Error::NONE)
+      components->push_back(comp);
   }
 
   if (in & PLANE_COMPONENT_META) {
@@ -620,8 +687,8 @@
     plane_info[i].sampleIncrementInBits = static_cast<int64_t>(plane_layout[i].step * 8);
     plane_info[i].strideInBytes = static_cast<int64_t>(plane_layout[i].stride_bytes);
     plane_info[i].totalSizeInBytes = static_cast<int64_t>(plane_layout[i].size);
-    plane_info[i].widthInSamples = handle->unaligned_width;
-    plane_info[i].heightInSamples = handle->unaligned_height;
+    plane_info[i].widthInSamples = handle->unaligned_width >> plane_layout[i].h_subsampling;
+    plane_info[i].heightInSamples = handle->unaligned_height >> plane_layout[i].v_subsampling;
   }
   *out = plane_info;
   return Error::NONE;
diff --git a/gralloc/gr_utils.cpp b/gralloc/gr_utils.cpp
index 3dc91d5..312058e 100644
--- a/gralloc/gr_utils.cpp
+++ b/gralloc/gr_utils.cpp
@@ -518,15 +518,10 @@
       c_size = (width * height) / 2;
       c_height = height >> 1;
       break;
-    case HAL_PIXEL_FORMAT_RAW16:
     case HAL_PIXEL_FORMAT_Y16:
       c_size = width * height;
       c_height = height;
       break;
-    case HAL_PIXEL_FORMAT_RAW10:
-      c_size = 0;
-      break;
-    case HAL_PIXEL_FORMAT_RAW8:
     case HAL_PIXEL_FORMAT_Y8:
       c_size = 0;
       break;
@@ -631,6 +626,44 @@
   return err;
 }
 
+int GetRawPlaneInfo(int32_t format, int32_t width, int32_t height, PlaneLayoutInfo *plane_info) {
+  int32_t step = 0;
+
+  switch (format) {
+    case HAL_PIXEL_FORMAT_RAW16:
+      step = 2;
+      break;
+    case HAL_PIXEL_FORMAT_RAW8:
+      step = 1;
+      break;
+    case HAL_PIXEL_FORMAT_RAW12:
+    case HAL_PIXEL_FORMAT_RAW10:
+      step = 0;
+      break;
+    default:
+      ALOGW("RawPlaneInfo is unsupported for format 0x%x", format);
+      return -EINVAL;
+  }
+
+  BufferInfo info(width, height, format);
+  uint32_t alignedWidth, alignedHeight;
+  GetAlignedWidthAndHeight(info, &alignedWidth, &alignedHeight);
+
+  uint32_t size = GetSize(info, alignedWidth, alignedHeight);
+
+  plane_info[0].component = (PlaneComponent)PLANE_COMPONENT_RAW;
+  plane_info[0].h_subsampling = 0;
+  plane_info[0].v_subsampling = 0;
+  plane_info[0].offset = 0;
+  plane_info[0].step = step;
+  plane_info[0].stride = width;
+  plane_info[0].stride_bytes = static_cast<int32_t>(alignedWidth);
+  plane_info[0].scanlines = height;
+  plane_info[0].size = size;
+
+  return 0;
+}
+
 // Explicitly defined UBWC formats
 bool IsUBwcFormat(int format) {
   switch (format) {
@@ -1326,10 +1359,7 @@
     case HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO:
     case HAL_PIXEL_FORMAT_YCrCb_420_SP_VENUS:
     case HAL_PIXEL_FORMAT_NV21_ZSL:
-    case HAL_PIXEL_FORMAT_RAW16:
     case HAL_PIXEL_FORMAT_Y16:
-    case HAL_PIXEL_FORMAT_RAW10:
-    case HAL_PIXEL_FORMAT_RAW8:
     case HAL_PIXEL_FORMAT_Y8:
       *plane_count = 2;
       GetYuvSPPlaneInfo(info, format, width, height, 1, plane_info);
@@ -1340,6 +1370,15 @@
       plane_info[1].v_subsampling = v_subsampling;
       break;
 
+    case HAL_PIXEL_FORMAT_RAW10:
+    case HAL_PIXEL_FORMAT_RAW8:
+    case HAL_PIXEL_FORMAT_RAW16:
+    case HAL_PIXEL_FORMAT_RAW12:
+      *plane_count = 1;
+      GetRawPlaneInfo(format, info.width, info.height, plane_info);
+      break;
+
+
     case HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS_UBWC:
       GetYuvSubSamplingFactor(format, &h_subsampling, &v_subsampling);
       if (flags & LAYOUT_INTERLACED_FLAG) {
@@ -1548,10 +1587,7 @@
       *h_subsampling = 1;
       *v_subsampling = 0;
       break;
-    case HAL_PIXEL_FORMAT_RAW16:
     case HAL_PIXEL_FORMAT_Y16:
-    case HAL_PIXEL_FORMAT_RAW12:
-    case HAL_PIXEL_FORMAT_RAW10:
     case HAL_PIXEL_FORMAT_Y8:
     case HAL_PIXEL_FORMAT_BLOB:
     case HAL_PIXEL_FORMAT_RAW_OPAQUE:
diff --git a/libdrmutils/Android.mk b/libdrmutils/Android.mk
index 172233f..e448d4f 100644
--- a/libdrmutils/Android.mk
+++ b/libdrmutils/Android.mk
@@ -5,7 +5,8 @@
 LOCAL_VENDOR_MODULE           := true
 LOCAL_MODULE_TAGS             := optional
 LOCAL_C_INCLUDES              := external/libdrm \
-                                 $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
+                                 $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
+                                 $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include/display
 LOCAL_HEADER_LIBRARIES        := display_headers
 LOCAL_SHARED_LIBRARIES        := libdrm libdl libdisplaydebug
 LOCAL_CFLAGS                  := -DLOG_TAG=\"DRMUTILS\" -Wall  -Werror -fno-operator-names
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 918a7fe..5d27b4e 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -40,6 +40,7 @@
 #include "xf86drmMode.h"
 #include <drm/msm_drm.h>
 #include <drm/msm_drm_pp.h>
+#include <drm/sde_drm.h>
 
 namespace sde_drm {
 
diff --git a/libdrmutils/drm_master.cpp b/libdrmutils/drm_master.cpp
old mode 100644
new mode 100755
index f0d14b1..3a8516d
--- a/libdrmutils/drm_master.cpp
+++ b/libdrmutils/drm_master.cpp
@@ -33,6 +33,8 @@
 #include <unistd.h>
 #include <xf86drm.h>
 #include <xf86drmMode.h>
+#include <drm/sde_drm.h>
+
 // Intentionally included after xf86 headers so that they in-turn include libdrm version of drm.h
 // that doesn't use keyword "virtual" for a variable name. Not doing so leads to the kernel version
 // of drm.h being included causing compilation to fail
