diff --git a/extensions/qcom/cl_qcom_android_native_buffer_host_ptr.txt b/extensions/qcom/cl_qcom_android_native_buffer_host_ptr.txt
index 82a1c5d..2b0cc2a 100644
--- a/extensions/qcom/cl_qcom_android_native_buffer_host_ptr.txt
+++ b/extensions/qcom/cl_qcom_android_native_buffer_host_ptr.txt
@@ -1,31 +1,29 @@
-Name
-
-    CL_QCOM_ANDROID_NATIVE_BUFFER_HOST_PTR
-
 Name Strings
 
     cl_qcom_android_native_buffer_host_ptr
 
-Contact
-
-    hosseins at quicinc dot com
-    ssusheel at quicinc dot com
-
-
 Contributors
 
-    Hossein Mohtasham, QUALCOMM Innovation Center Inc.
-    Sushmita Susheelendra, QUALCOMM Innovation Center Inc.
-    Balaji Calidas, QUALCOMM
+    Hossein Mohtasham, Qualcomm Technologies, Inc.
+    Sushmita Susheelendra, Qualcomm Innovation Center, Inc.
+    Balaji Calidas, Qualcomm Technologies, Inc.
 
-Status
+Contact
 
-    ?
+    bcalidas at qti dot qualcomm dot com
+
+Version
+
+    Version 6, 2018/01/19
 
 Number
 
     OpenCL Extension #32
 
+Status
+
+    Shipping
+
 Extension Type
 
     OpenCL device extension
@@ -36,23 +34,28 @@
     cl_qcom_ext_host_ptr is required.
     Android OS is required.
 
-    This extension is written against the OpenCL 1.1 specification. This extension provides
-    functionality, beyond and above the cl_qcom_ion_host_ptr extension, to create buffer/image
-    directly from Android native buffers.
+    This extension is written against the OpenCL 1.1 specification. This
+    extension provides functionality, beyond and above the cl_qcom_ion_host_ptr
+    extension, to create buffers and images directly from Android native
+    buffers.
+
+    If present, cl_qcom_ext_host_ptr_iocoherent extends the functionality
+    of this extension.
 
 Overview
 
-    This extension extends the functionality provided by clCreateBuffer, clCreateImage2D,
-    and clCreateImage. It allows applications to pass an Android ANativeWindowBuffer (ANB),
-    aka graphics buffer, that is based on ION memory allocator to these functions so that
-    it can be mapped to the device's address space. Using this extension, we can avoid having
-    to copy data back and forth between the graphic buffer and the device. This extension is
-    for 2D images only; clCreateImage will fail out with CL_INVALID_VALUE if anything other
-    than a 2D image is specified.
+    This extension extends the functionality provided by clCreateBuffer,
+    clCreateImage2D, and clCreateImage. It allows applications to pass an
+    Android ANativeWindowBuffer (ANB), aka graphics buffer, that is based on
+    ION memory allocator to these functions so that it can be mapped to the
+    device's address space. Using this extension, we can avoid having to copy
+    data back and forth between the graphic buffer and the device. This
+    extension is for 2D images only; clCreateImage will fail out with
+    CL_INVALID_VALUE if anything other than a 2D image is specified.
 
-IP Status
+Header File
 
-    No known IP claims.
+    cl_ext.h
 
 New Tokens
 
@@ -76,74 +79,102 @@
 Additions to Chapter 5.2.1 of the OpenCL 1.1 Specification
 (Creating Buffer Objects)
 
-        When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then <host_ptr> is
-        interpreted as a pointer to cl_mem_ext_host_ptr. When <host_ptr>->allocation_type is
-        equal to CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM then <host_ptr> can also be
+        When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then
+        <host_ptr> is interpreted as a pointer to cl_mem_ext_host_ptr. When
+        <host_ptr>->allocation_type is equal to
+        CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM then <host_ptr> can also be
         interpreted as a pointer to cl_mem_android_native_buffer_host_ptr.
 
-        In addition to that, the application must also initialize the following struct fields:
-        * <host_ptr>->host_cache_policy can be equal to CL_MEM_HOST_UNCACHED_QCOM or
-        CL_MEM_HOST_WRITEBACK_QCOM.
-        * <host_ptr>->anb_ptr must be the host virtual pointer associated with the ANativeBuffer.
+        In addition to that, the application must also initialize the following
+        struct fields:
 
-        The caching policy provided in ext_host_ptr.host_cache_policy must be the same policy
-        the GraphicBuffer is created with. Any mismatch will result in undefined behavior.
+        * <host_ptr>->host_cache_policy should be set as follows - If the
+          Graphic Buffer was created as cached and
+          cl_mem_ext_host_ptr_iocoherent is present,
+          <host_ptr>->host_cache_policy can be set to either
+          CL_MEM_HOST_WRITEBACK_QCOM or CL_MEM_HOST_IOCOHERENT_QCOM. If the
+          Graphic Buffer was created as cached and
+          cl_mem_ext_host_ptr_iocoherent is not present,
+          <host_ptr>->host_cache_policy should be set to
+          CL_MEM_HOST_WRITEBACK_QCOM. It must be equal to
+          CL_MEM_HOST_UNCACHED_QCOM otherwise.
 
-        Only Buffers and 2D images are supported. Use of other image types will result in undefined behavior.
+        * <host_ptr>->anb_ptr must be the host virtual pointer associated with
+          the ANativeBuffer.
 
-        The application is responsible for maintaining the consistency of image attributes,
-        i.e. format, width, height, and pitch, between the OpenCL image and the Android native buffer
-        (aka graphics buffer). Also, if an OpenCL buffer is created from a native buffer, the
-        application is responsible for making sure that the size of the buffer matches the actual
-        linear size of the native buffer; creating a buffer with a size different than the passed-in
-        native buffer will result in undefined behavior.
+        The caching policy provided in ext_host_ptr.host_cache_policy must be
+        the same policy the GraphicBuffer is created with. Any mismatch will
+        result in undefined behavior.
 
-        The application is responsible for ensuring that the underlying native buffer is not released
-        while the cl object is in use. Proper synchronization between different APIs that share the
-        underlying buffer is to be handled by the application.
+        Only Buffers and 2D images are supported. Use of other image types will
+        result in undefined behavior.
 
+        The application is responsible for maintaining the consistency of image
+        attributes, i.e. format, width, height, and pitch, between the OpenCL
+        image and the Android native buffer (aka graphics buffer). Also, if an
+        OpenCL buffer is created from a native buffer, the application is
+        responsible for making sure that the size of the buffer matches the
+        actual linear size of the native buffer; creating a buffer with a size
+        different than the passed-in native buffer will result in undefined
+        behavior.
+
+        The application is responsible for ensuring that the underlying native
+        buffer is not released while the cl object is in use. Proper
+        synchronization between different APIs that share the underlying buffer
+        is to be handled by the application.
 
 Sample Code
 
-    /*    Using the extension for CL buffer objects   */
+    1) Using the extension for CL buffer objects
 
-    cl_mem                                 buffer_object            = NULL;
-    size_t                                 buffer_size_in_bytes     = 0;
-    cl_mem_android_native_buffer_host_ptr  myANBmem                 = {0};
+        cl_mem                                buffer_object        = NULL;
+        size_t                                buffer_size_in_bytes = 0;
+        cl_mem_android_native_buffer_host_ptr myANBmem             = {0};
 
+        // Create an OpenCL buffer object that uses myANBmem as its data store.
+        myANBmem.ext_host_ptr.allocation_type =
+            CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM;
+        myANBmem.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
+        myANBmem.anb_ptr = gb->getNativeBuffer(); // gb is Android GraphicBuffer
 
-    // Create an OpenCL buffer object that uses myANBmem as its data store.
-    myANBmem.ext_host_ptr.allocation_type    = CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM;
-    myANBmem.ext_host_ptr.host_cache_policy  = CL_MEM_HOST_CACHED_QCOM;
-    myANBmem.ion_hostptr                     = gb->getNativeBuffer(); // the hostptr to a native buffer and gb is an Android GraphicBuffer
+        // The stride returned is in pixels, so we have to factor in pixel_size
+        // (4 for RGBA) when calculating buffer_size_in_bytes
+        buffer_size_in_bytes = gb->getHeight() * gb->getStride() * 4;
 
-    buffer_size_in_bytes = gb->getHeight() * gb->getStride();
+        buffer_object = clCreateBuffer(context,
+            CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM,
+            buffer_size_in_bytes, &myANBmem, &errcode);
 
-    buffer_object = clCreateBuffer(context, CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM, buffer_size_in_bytes, &myANBmem, &errcode);
+    2) Using the extension for CL image objects
 
+        cl_mem                                image_object = NULL;
+        cl_mem_android_native_buffer_host_ptr myANBmem     = {0};
 
-    /*    Using the extension for CL image objects   */
+        // Create an OpenCL image object that uses myANBmem as its data store.
+        myANBmem.ext_host_ptr.allocation_type =
+            CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM;
+        myANBmem.ext_host_ptr.host_cache_policy = CL_MEM_HOST_WRITEBACK_QCOM;
+        myANBmem.anb_ptr = gb->getNativeBuffer(); // gb is Android GraphicBuffer
 
-    cl_mem                                 image_object             = NULL;
-    cl_mem_android_native_buffer_host_ptr  myANBmem                 = {0};
+        imgw = gb->getWidth();
+        imgh = gb->getHeight();
+        // The stride returned is in pixels, so we have to factor in pixel_size
+        // (4 for RGBA) when calculating row_pitch
+        row_pitch = gb->getStride() * 4;
+        // pick any CL format as long as it is consistent with graphic buffer
+        // width and stride.
+        image_format = {CL_RGBA, CL_UNSIGNED_INT8};
 
-
-    // Create an OpenCL image object that uses myANBmem as its data store.
-    myANBmem.ext_host_ptr.allocation_type    = CL_MEM_ANDROID_NATIVE_BUFFER_HOST_PTR_QCOM;
-    myANBmem.ext_host_ptr.host_cache_policy  = CL_MEM_HOST_WRITEBACK_QCOM;
-    myANBmem.anb_ptr                     = gb->getNativeBuffer(); // the hostptr to a native buffer and gb is an Android GraphicBuffer
-
-    imgw = gb->getWidth();
-    imgh = gb->getHeight();
-    row_pitch = gb->getStride();
-    image_format = {CL_RGBA, CL_UNSIGNED_INT8}; // pick any CL format as long as it is consistent with the graphics buffer width and stride.
-
-    image_object = clCreateImage2D(context, CL_MEM_USE_HOST_PTR|CL_MEM_EXT_HOST_PTR_QCOM, &image_fmt, imgw, imgh, row_pitch, &myANBmem, &errcode);
-
-Issues
-
-    None.
+        image_object = clCreateImage2D(context,
+            CL_MEM_USE_HOST_PTR|CL_MEM_EXT_HOST_PTR_QCOM, &image_fmt, imgw,
+            imgh, row_pitch, &myANBmem, &errcode);
 
 Revision History
 
     Revision 1, 2014/06/05: Initial version.
+    Revision 2, 2017/06/16: Clean up. No functional changes.
+    Revision 3, 2017/10/24: Updated sample code.
+    Revision 4, 2017/11/13: Clean up. No functional changes.
+    Revision 5, 2018/01/03: Add reference to cl_qcom_ext_host_ptr_iocoherent.
+    Revision 6, 2018/01/19: Formatting and misc changes. No functional changes.
+
diff --git a/extensions/qcom/cl_qcom_ext_host_ptr.txt b/extensions/qcom/cl_qcom_ext_host_ptr.txt
index 4a741ad..6112c5e 100644
--- a/extensions/qcom/cl_qcom_ext_host_ptr.txt
+++ b/extensions/qcom/cl_qcom_ext_host_ptr.txt
@@ -1,61 +1,64 @@
-Name
-
-    CL_QCOM_EXT_HOST_PTR
-
 Name Strings
 
     cl_qcom_ext_host_ptr
 
-Contact
-
-    ssusheel at quicinc dot com
-    dgarcia at qti dot qualcomm dot com
-
 Contributors
 
-    Balaji Calidas, QUALCOMM
-    David Garcia, QUALCOMM
-    Rajeev Rao, QUALCOMM
-    Sushmita Susheelendra, QUALCOMM Innovation Center Inc.
+    Balaji Calidas, Qualcomm Technologies, Inc.
+    David Garcia, Qualcomm Technologies, Inc.
+    Rajeev Rao, Qualcomm Technologies, Inc.
+    Sushmita Susheelendra, Qualcomm Innovation Center, Inc.
 
-Status
+Contact
 
-    SHIPPING
+    bcalidas at qti dot qualcomm dot com
+
+Version
+
+    Version 5, 2018/01/19
 
 Number
 
     OpenCL Extension #21
 
+Status
+
+    Shipping
+
+Extension Type
+
+    OpenCL device extension
+
 Dependencies
 
-    OpenCL 1.1 is required. 
-    
+    OpenCL 1.1 is required.
+
     This extension is written against the OpenCL 1.1 specification
 
 Overview
 
-    This extension extends the functionality provided by
-    clCreateBuffer, clCreateImage2D, clCreateImage3D.
-    It allows applications to specify a new flag CL_MEM_EXT_HOST_PTR_QCOM
-    which enables the driver to map external memory allocations
-    --to be defined in future layered extensions--
-    to the device's address space and thus avoiding having to
-    copy data back and forth between the host and the device.
+    This extension extends the functionality provided by clCreateBuffer,
+    clCreateImage2D, clCreateImage3D. It allows applications to specify a new
+    flag CL_MEM_EXT_HOST_PTR_QCOM which enables the driver to map external
+    memory allocations, to be defined in layered extensions, to the device's
+    address space and thus avoiding having to copy data back and forth between
+    the host and the device.
 
-IP Status
+Header File
 
-    No known IP claims.
+    cl_ext.h
 
 New Procedures and Functions
 
-    cl_int clGetDeviceImageInfoQCOM(cl_device_id             device,
-                                    size_t                   image_width,
-                                    size_t                   image_height,
-                                    const cl_image_format   *image_format,
-                                    cl_image_pitch_info_qcom param_name,
-                                    size_t                   param_value_size,
-                                    void                    *param_value,
-                                    size_t                  *param_value_size_ret);
+    cl_int clGetDeviceImageInfoQCOM(
+        cl_device_id             device,
+        size_t                   image_width,
+        size_t                   image_height,
+        const cl_image_format    *image_format,
+        cl_image_pitch_info_qcom param_name,
+        size_t                   param_value_size,
+        void                     *param_value,
+        size_t                   *param_value_size_ret);
 
 New Types
 
@@ -65,85 +68,107 @@
 
     Accepted by the <param_name> argument of clGetDeviceInfo
 
-        CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM    0x40A0      
+        CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM    0x40A0
         CL_DEVICE_PAGE_SIZE_QCOM                   0x40A1
-        
-    Accepted by the <flags> argument of clCreateBuffer, clCreateImage2D and clCreateImage3D:
+
+    Accepted by the <flags> argument of clCreateBuffer, clCreateImage2D and
+    clCreateImage3D:
 
         CL_MEM_EXT_HOST_PTR_QCOM                   (1 << 29)
 
-    Accepted by the <host_ptr> argument of clCreateBuffer, clCreateImage2D and clCreateImage3D:
+    Accepted by the <host_ptr> argument of clCreateBuffer, clCreateImage2D and
+    clCreateImage3D:
 
         typedef struct _cl_mem_ext_host_ptr
         {
             // Type of external memory allocation.
             // Legal values will be defined in layered extensions.
             cl_uint  allocation_type;
-            
+
             // Host cache policy for this external memory allocation.
             cl_uint  host_cache_policy;
 
         } cl_mem_ext_host_ptr;
-        
+
     Accepted values for cl_mem_ext_host_ptr::host_cache_policy:
-    
+
         CL_MEM_HOST_UNCACHED_QCOM                  0x40A4
         CL_MEM_HOST_WRITEBACK_QCOM                 0x40A5
         CL_MEM_HOST_WRITETHROUGH_QCOM              0x40A6
         CL_MEM_HOST_WRITE_COMBINING_QCOM           0x40A7
 
     Accepted by the <param_name> argument of clGetDeviceImageInfoQCOM
-    
+
         CL_IMAGE_ROW_ALIGNMENT_QCOM                0x40A2
         CL_IMAGE_SLICE_ALIGNMENT_QCOM              0x40A3
 
 Additions to Chapter 5.2.1 of the OpenCL 1.1 Specification
 (Creating Buffer Objects)
 
-    Add the following token to Table 5.3 (clCreateBuffer List of supported cl_mem_flags values):
-    
-        CL_MEM_EXT_HOST_PTR_QCOM             This flag is valid only when used together with CL_MEM_USE_HOST_PTR.
-                                             If specified, it indicates that the <host_ptr> argument provided by
-                                             the application is actually a pointer to cl_mem_ext_host_ptr.
+    Add the following token to Table 5.3 (clCreateBuffer List of supported
+    cl_mem_flags values):
 
-                                             
-        When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then <host_ptr> is interpreted as a pointer to cl_mem_ext_host_ptr.
-        The application must then initialize cl_mem_ext_host_ptr::allocation_type to the allowed token values defined in future layered extensions.
-        
-        The application must also initialize cl_mem_ext_host_ptr::host_cache_policy to one of CL_MEM_HOST_UNCACHED_QCOM, CL_MEM_HOST_WRITEBACK_QCOM,
-        CL_MEM_HOST_WRITETHROUGH_QCOM, or CL_MEM_HOST_WRITE_COMBINING_QCOM according to the cache policy used in the host for this memory allocation.
-        
-    Add the following token to Table 4.3 (clGetDeviceInfo OpenCL Device Queries):
+        CL_MEM_EXT_HOST_PTR_QCOM             This flag is valid only when used
+                                             together with CL_MEM_USE_HOST_PTR.
+                                             If specified, it indicates that the
+                                             <host_ptr> argument provided by the
+                                             application is actually a pointer
+                                             to cl_mem_ext_host_ptr.
 
-        CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM    Returns the amount of memory padding that the application must add
-                                                   to the end of every external allocation that will be used in conjunction with
+
+        When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then
+        <host_ptr> is interpreted as a pointer to cl_mem_ext_host_ptr. The
+        application must then initialize cl_mem_ext_host_ptr::allocation_type to
+        the allowed token values defined in future layered extensions.
+
+        The application must also initialize
+        cl_mem_ext_host_ptr::host_cache_policy to one of
+        CL_MEM_HOST_UNCACHED_QCOM, CL_MEM_HOST_WRITEBACK_QCOM,
+        CL_MEM_HOST_WRITETHROUGH_QCOM, or CL_MEM_HOST_WRITE_COMBINING_QCOM
+        according to the cache policy used in the host for this memory
+        allocation.
+
+    Add the following token to Table 4.3 (clGetDeviceInfo OpenCL Device
+    Queries):
+
+        CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM    Returns the amount of memory
+                                                   padding that the application
+                                                   must add to the end of every
+                                                   external allocation that will
+                                                   be used in conjunction with
                                                    CL_MEM_EXT_HOST_PTR_QCOM.
 
-        CL_DEVICE_PAGE_SIZE_QCOM                   Returns the device's page size.
-                                                  
-        The application may query the row and slice pitch values using clGetDeviceImageInfoQCOM
-        and provide the queried values or any other supported value to clCreateImage2D and clCreateImage3D
-        when using CL_MEM_EXT_HOST_PTR_QCOM.
+        CL_DEVICE_PAGE_SIZE_QCOM                   Returns the device's page
+                                                   size.
 
-        A supported value for row pitch and slice pitch is defined respectively as:
-        
-        * Any value greater than or equal to CL_IMAGE_ROW_PITCH   that is also a multiple of CL_IMAGE_ROW_ALIGNMENT_QCOM
-        * Any value greater than or equal to CL_IMAGE_SLICE_PITCH that is also a multiple of CL_IMAGE_SLICE_ALIGNMENT_QCOM
-        
+        The application may query the row and slice pitch values using
+        clGetDeviceImageInfoQCOM and provide the queried values or any other
+        supported value to clCreateImage2D and clCreateImage3D when using
+        CL_MEM_EXT_HOST_PTR_QCOM.
+
+        A supported value for row pitch and slice pitch is defined respectively
+        as:
+
+        * Any value greater than or equal to CL_IMAGE_ROW_PITCH that is also a
+          multiple of CL_IMAGE_ROW_ALIGNMENT_QCOM.
+        * Any value greater than or equal to CL_IMAGE_SLICE_PITCH that is also
+          a multiple of CL_IMAGE_SLICE_ALIGNMENT_QCOM.
+
 Additions to Section 5.3 after clGetImageInfo
 
-    An application that creates OpenCL image objects with the CL_MEM_EXT_HOST_PTR_QCOM flag
-    can invoke the following function to query the required row pitch, slice pitch and
-    alignment for a particular device:
+    An application that creates OpenCL image objects with the
+    CL_MEM_EXT_HOST_PTR_QCOM flag can invoke the following function to query the
+    required row pitch, slice pitch and alignment for a particular device:
 
-    cl_int clGetDeviceImageInfoQCOM(cl_device_id             device,
-                                    size_t                   image_width,
-                                    size_t                   image_height,
-                                    const cl_image_format   *image_format,
-                                    cl_image_pitch_info_qcom param_name,
-                                    size_t                   param_value_size,
-                                    void                    *param_value,
-                                    size_t                  *param_value_size_ret);
+    cl_int clGetDeviceImageInfoQCOM(
+        cl_device_id             device,
+        size_t                   image_width,
+        size_t                   image_height,
+        const cl_image_format   *image_format,
+        cl_image_pitch_info_qcom param_name,
+        size_t                   param_value_size,
+        void                    *param_value,
+        size_t                  *param_value_size_ret);
 
     device               - is a valid device
 
@@ -151,42 +176,66 @@
 
     image_height         - height of the image in image elements (pixels)
 
-    image_row_pitch      - scan-line pitch in bytes
+    image_format         - pointer to image format descriptor structure
 
-    param_name           - specifies the information to query. The list of supported param_name types and the
-                           information returned in param_value by clGetImageInfo is described in table 5.XXX
+    param_name           - specifies the information to query. The list of
+                           supported param_name types and the information
+                           returned in param_value by clGetImageInfo is
+                           described in Table 5.XXX
 
-    param_value          - is a pointer to memory where the appropriate result being queried is returned. If
-                           param_value is NULL, it is ignored.
+    param_value          - is a pointer to memory where the appropriate result
+                           being queried is returned. If param_value is NULL, it
+                           is ignored.
 
-    param_value_size     - is used to specify the size in bytes of memory pointed to by param_value.
-                            This size must be >= size of return type as described in table 5.8.
+    param_value_size     - is used to specify the size in bytes of memory
+                           pointed to by param_value. This size must be greater
+                           than or equal to the size of return type as described
+                           in Table 5.8.
 
-    param_value_size_ret - returns the actual size in bytes of data being queried by param_value. If
-                           param_value_size_ret is NULL, it is ignored.
+    param_value_size_ret - returns the actual size in bytes of data being
+                           queried by param_value. If param_value_size_ret is
+                           NULL, it is ignored.
 
-    clGetDeviceImageInfoQCOM returns CL_SUCCESS if the function is executed successfully.
-    Otherwise, it returns one of the following errors:
+    clGetDeviceImageInfoQCOM returns CL_SUCCESS if the function is executed
+    successfully. Otherwise, it returns one of the following errors:
 
-    CL_INVALID_VALUE        - if param_name is not valid, or if size in bytes specified by param_value_size
-                              is < size of return type for that param_value and param_value is not NULL.
-    CL_INVALID_MEM_OBJECT   - if image is a not a valid image object.
-    CL_OUT_OF_RESOURCES     - if there is a failure to allocate resources required by the OpenCL implementation on the device.
-    CL_OUT_OF_HOST_MEMORY   - if there is a failure to allocate resources required by the OpenCL implementation on the host.
+    CL_INVALID_VALUE      - if param_name is not valid, or if size in bytes
+                              specified by param_value_size is less than the
+                              size of return type for that param_value and
+                              param_value is not NULL.
+
+    CL_INVALID_MEM_OBJECT - if image is a not a valid image object.
+
+    CL_OUT_OF_RESOURCES   - if there is a failure to allocate resources required
+                            by the OpenCL implementation on the device.
+
+    CL_OUT_OF_HOST_MEMORY - if there is a failure to allocate resources required
+                            by the OpenCL implementation on the host.
 
 Table 5.XXX
 
     List of supported param_names by clGetDeviceImageInfoQCOM
 
-        cl_image_pitch_info_qcom       Return Type   Info returned in param_value
-        CL_IMAGE_ROW_PITCH             cl_uint       Returns the image row pitch supported by this device
-        CL_IMAGE_ROW_ALIGNMENT_QCOM    cl_uint       Returns the image row pitch alignment supported by this device
-        CL_IMAGE_SLICE_PITCH           cl_uint       Returns the image slice pitch supported by this device
-        CL_IMAGE_SLICE_ALIGNMENT_QCOM  cl_uint       Returns the image slice pitch alignment supported by this device
+        cl_image_pitch_info_qcom       Return Type   Info returned in
+                                                     param_value
 
-    
-Additions to Section 5.3.1. (Creating Image Objects) at the end
-of the list of errors returned by clCreateImage2D and clCreateImage3D
+        CL_IMAGE_ROW_PITCH             cl_uint       Returns the image row pitch
+                                                     supported by this device
+
+        CL_IMAGE_ROW_ALIGNMENT_QCOM    cl_uint       Returns the image row pitch
+                                                     alignment supported by this
+                                                     device
+
+        CL_IMAGE_SLICE_PITCH           cl_uint       Returns the image slice
+                                                     pitch supported by this
+                                                     device
+
+        CL_IMAGE_SLICE_ALIGNMENT_QCOM  cl_uint       Returns the image slice
+                                                     pitch alignment supported
+                                                     by this device
+
+Additions to Section 5.3.1. (Creating Image Objects) at the end of the list of
+errors returned by clCreateImage2D and clCreateImage3D:
 
     CL_INVALID_VALUE if <flags> has CL_MEM_EXT_HOST_PTR_QCOM enabled and yet
     CL_MEM_USE_HOST_PTR is not enabled.
@@ -194,13 +243,16 @@
     CL_INVALID_VALUE if <flags> has CL_MEM_EXT_HOST_PTR_QCOM enabled and if
     <image_row_pitch> and/or <image_slice_pitch> fail to match the requirements
     of section 5.3
-    
-    CL_INVALID_VALUE if any of the fields in the struct pointed at by <host_ptr> are invalid.
-    
-Issues
 
-    None.
+    CL_INVALID_VALUE if any of the fields in the struct pointed at by <host_ptr>
+    are invalid.
 
 Revision History
 
     Revision 1, 2013/05/27: Initial version.
+    Revision 2, 2017/06/16: Clean up. No functional changes.
+    Revision 3, 2017/11/13: Clean up. No functional changes.
+    Revision 4, 2017/11/30: Corrected parameter description for
+                            clGetDeviceImageInfoQCOM.
+    Revision 5, 2018/01/19: Formatting and misc changes. No functional changes.
+
diff --git a/extensions/qcom/cl_qcom_ion_host_ptr.txt b/extensions/qcom/cl_qcom_ion_host_ptr.txt
index 8fe7354..d2057a2 100644
--- a/extensions/qcom/cl_qcom_ion_host_ptr.txt
+++ b/extensions/qcom/cl_qcom_ion_host_ptr.txt
@@ -1,51 +1,58 @@
-Name
-
-    CL_QCOM_ION_HOST_PTR
-
 Name Strings
 
     cl_qcom_ion_host_ptr
 
-Contact
-
-    ssusheel at quicinc dot com
-    dgarcia at qti dot qualcomm dot com
-
 Contributors
 
-    Balaji Calidas, QUALCOMM
-    David Garcia, QUALCOMM
-    Sushmita Susheelendra, QUALCOMM Innovation Center Inc.
+    Balaji Calidas, Qualcomm Technologies, Inc.
+    David Garcia, Qualcomm Technologies, Inc.
+    Sushmita Susheelendra, Qualcomm Innovation Center, Inc.
 
-Status
+Contact
 
-    SHIPPING
+    bcalidas at qti dot qualcomm dot com
+
+Version
+
+    Version 7, 2018/01/19
 
 Number
 
     OpenCL Extension #22
 
+Status
+
+    Shipping
+
+Extension Type
+
+    OpenCL device extension
+
 Dependencies
 
-    OpenCL 1.1 is required. cl_qcom_ext_host_ptr is required. Android OS is required.
-    
+    OpenCL 1.1 is required. cl_qcom_ext_host_ptr is required.
+
     This extension is written against the OpenCL 1.1 specification
 
+    If present, cl_qcom_ext_host_ptr_iocoherent extends the functionality of
+    this extension.
+
 Overview
 
-    This extension extends the functionality provided by
-    clCreateBuffer, clCreateImage2D, clCreateImage3D.
-    It allows applications to pass an Android ION memory allocation to these functions
-    so that it can be mapped to the device's address space and thus avoid having to
-    copy data back and forth between the host and the device.
+    This extension extends the functionality provided by clCreateBuffer,
+    clCreateImage2D, clCreateImage3D. It allows applications to pass an ION
+    memory allocation to these functions so that it can be mapped to the
+    device's address space and thus avoid having to copy data back and forth
+    between the host and the device.
 
-IP Status
+Header File
 
-    No known IP claims.
+    cl_ext.h
 
 New Tokens
 
-    Accepted by the <host_ptr> argument of clCreateBuffer, clCreateImage2D and clCreateImage3D:
+    Accepted by the <host_ptr> argument of clCreateBuffer, clCreateImage2D and
+    clCreateImage3D:
 
         typedef struct _cl_mem_ion_host_ptr
         {
@@ -55,141 +62,196 @@
 
             // ION file descriptor
             int                   ion_filedesc;
-            
+
             // Host pointer to the ION allocated memory
             void*                 ion_hostptr;
 
         } cl_mem_ion_host_ptr;
 
     Used together with CL_MEM_EXT_HOST_PTR_QCOM:
-    
+
         CL_MEM_ION_HOST_PTR_QCOM                   0x40A8
 
 Additions to Chapter 5.2.1 of the OpenCL 1.1 Specification
-(Creating Buffer Objects)
 
-        When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then <host_ptr> is interpreted as a pointer to cl_mem_ext_host_ptr.
-        When <host_ptr>->allocation_type is equal to CL_MEM_ION_HOST_PTR_QCOM then <host_ptr> can also be interpreted as 
-        a pointer to cl_mem_ion_host_ptr.
+    (Creating Buffer Objects)
 
-        In addition to that, the application must also initialize the following struct fields:
-        * <host_ptr>->host_cache_policy must be equal to CL_MEM_HOST_WRITEBACK_QCOM if the ion allocation was made with the flag ION_FLAG_CACHED enabled.
-        It must be equal to CL_MEM_HOST_UNCACHED_QCOM otherwise.
-        * <host_ptr>->ion_filedesc must be the file descriptor of the ION memory allocation that the application
-          wants to use as storage bits for the memory object.
-        * <host_ptr>->ion_hostptr must be the host virtual pointer associated with the same ION memory allocation.
+    When CL_MEM_EXT_HOST_PTR_QCOM is enabled in the <flags> argument, then
+    <host_ptr> is interpreted as a pointer to cl_mem_ext_host_ptr. When
+    <host_ptr>->allocation_type is equal to CL_MEM_ION_HOST_PTR_QCOM then
+    <host_ptr> can also be interpreted as a pointer to cl_mem_ion_host_ptr.
 
-        Memory specified this way must be aligned to the device's page size. The application can query the device's
-        page size by using clGetDeviceInfo(..., CL_DEVICE_PAGE_SIZE_QCOM, ...).
+    In addition to that, the application must also initialize the following
+    struct fields:
 
-        Once the memory object is created, the application must call clEnqueueMapBuffer/clEnqueueMapImage with
-        appropriate flags before reading or writing to it on the host. The host unmaps the region when accesses
-        (reads and/or writes) to this mapped region by the host are complete. As per the OpenCL 1.2 specification,
-        clEnqueueMapBuffer and clEnqueueMapImage act as synchronization points for the region of the buffer
-        object being mapped.
-       
-Issues
+    * <host_ptr>->host_cache_policy should be set as follows - If the ion
+      allocation was made with the flag ION_FLAG_CACHED enabled and
+      cl_mem_ext_host_ptr_iocoherent is present, <host_ptr>->host_cache_policy
+      can be set to either CL_MEM_HOST_WRITEBACK_QCOM or
+      CL_MEM_HOST_IOCOHERENT_QCOM. If the ION allocation was made with the
+      flag ION_FLAG_CACHED enabled and cl_mem_ext_host_ptr_iocoherent is not
+      present, <host_ptr>->host_cache_policy should be set to
+      CL_MEM_HOST_WRITEBACK_QCOM. It must be equal to
+      CL_MEM_HOST_UNCACHED_QCOM otherwise.
+
+    * <host_ptr>->ion_filedesc must be the file descriptor of the ION memory
+      allocation that the application wants to use as storage bits for the
+      memory object.
+
+    * <host_ptr>->ion_hostptr must be the host virtual pointer associated with
+      the same ION memory allocation. If the application does not need to map
+      the newly created cl memory object for host access, it can set
+      <host_ptr>->ion_hostptr to NULL. If this happens, then calls to host
+      access functions such as clEnqueueMapBuffer will fail out and return
+      an errorcode of CL_INVALID_OPERATION. Setting <host_ptr>->ion_hostptr to
+      NULL avoids the need for the application to make an extra map call for
+      acquiring the host virtual pointer.
+
+    Memory specified this way must be aligned to the device's page size. The
+    application can query the device's page size by using
+    clGetDeviceInfo(..., CL_DEVICE_PAGE_SIZE_QCOM, ...).
+
+    Once the memory object is created, the application must call
+    clEnqueueMapBuffer/clEnqueueMapImage with appropriate flags before
+    reading or writing to it on the host. The host unmaps the region when
+    accesses (reads and/or writes) to this mapped region by the host are
+    complete. As per the OpenCL 1.2 specification, clEnqueueMapBuffer and
+    clEnqueueMapImage act as synchronization points for the region of the
+    buffer object being mapped.
 
 Sample Code
 
-    /*    Using the extension for CL buffer objects   */
+    1) Using the extension for CL buffer objects
 
-    cl_mem               buffer_object            = NULL;
-    size_t               buffer_size_in_bytes     = 0;
-    size_t               buffer_size_with_padding = 0;
-    cl_mem_ion_host_ptr  myionmem                 = {0};
-    size_t               ext_mem_padding_in_bytes = 0;
-    size_t               device_page_size         = 0;
-    
-    // Query the device's page size and the amount of padding necessary at the end of the buffer.
-    clGetDeviceInfo(device, CL_DEVICE_PAGE_SIZE_QCOM, sizeof(device_page_size), &device_page_size, NULL);
-    clGetDeviceInfo(device, CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM, sizeof(ext_mem_padding_in_bytes), &ext_mem_padding_in_bytes, NULL);
-    
-    // Compute the desired size for the data in the buffer.
-    buffer_size_in_bytes = foobar();
-    
-    // Compute amount of memory that needs to be allocated for the buffer including padding.
-    buffer_size_with_padding = buffer_size_in_bytes + ext_mem_padding_in_bytes;
-    
-    // Make an ION memory allocation of size "buffer_size_with_padding" here.
-    // Notice that allocating "buffer_size_in_bytes" instead would be a mistake! It's important to allocate the extra padding.
-    // Let's say the parameters of the allocation are stored in a struct named "ion_info" that we will use below.
-    // ...
+        cl_mem               buffer_object            = NULL;
+        size_t               buffer_size_in_bytes     = 0;
+        size_t               buffer_size_with_padding = 0;
+        cl_mem_ion_host_ptr  myionmem                 = {0};
+        size_t               ext_mem_padding_in_bytes = 0;
+        size_t               device_page_size         = 0;
 
-    // Create an OpenCL buffer object that uses "ion_info" as its data store. Notice how the buffer is created with size "buffer_size_in_bytes", not "buffer_size_with_padding".
-    myionmem.ext_host_ptr.allocation_type    = CL_MEM_ION_HOST_PTR_QCOM;
-    myionmem.ext_host_ptr.host_cache_policy  = CL_MEM_HOST_UNCACHED_QCOM;
-    myionmem.ion_filedesc                    = ion_info_fd.file_descriptor;   // the file descriptor for ION
-    myionmem.ion_hostptr                     = ion_info.host_virtual_address; // the hostptr returned by ION which is device page size aligned
-    
-    if(myionmem.ion_hostptr % device_page_size)
-    {
-        error("Host pointer must be aligned to device_page_size!");
-    }
-    
-    buffer_object = clCreateBuffer(context, CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM, buffer_size_in_bytes, &myionmem, &errcode);
+        // Query the device's page size and the amount of padding necessary at
+        // the end of the buffer.
+        clGetDeviceInfo(device, CL_DEVICE_PAGE_SIZE_QCOM,
+            sizeof(device_page_size), &device_page_size, NULL);
+        clGetDeviceInfo(device, CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM,
+            sizeof(ext_mem_padding_in_bytes), &ext_mem_padding_in_bytes, NULL);
 
+        // Compute the desired size for the data in the buffer.
+        buffer_size_in_bytes = foobar();
 
-    /*    Using the extension for CL image objects   */
+        // Compute amount of memory that needs to be allocated for the buffer
+        // including padding.
+        buffer_size_with_padding = buffer_size_in_bytes +
+            ext_mem_padding_in_bytes;
 
-    cl_mem               image_object             = NULL;
-    cl_mem_ion_host_ptr  myionmem                 = {0};
-    size_t               ext_mem_padding_in_bytes = 0;
-    size_t               device_page_size         = 0;
-    size_t               row_pitch                = 0;
-    
-    // Query the device's page size and the amount of padding necessary at the end of the buffer.
-    clGetDeviceInfo(device, CL_DEVICE_PAGE_SIZE_QCOM, sizeof(device_page_size), &device_page_size, NULL);
-    clGetDeviceInfo(device, CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM, sizeof(ext_mem_padding_in_bytes), &ext_mem_padding_in_bytes, NULL);
+        // Make an ION memory allocation of size buffer_size_with_padding here.
+        // Note that allocating buffer_size_in_bytes instead would be a mistake.
+        // It's important to allocate the extra padding. Let's say the
+        // parameters of the allocation are stored in a struct named ion_info
+        // that we will use below.
 
-    // Query the device supported row and slice pitch using clGetDeviceImageInfoQCOM
-    // imgw - image width
-    // imgh - image height
-    // img_fmt - image format
-    clGetDeviceImageInfoQCOM(device, imgw, imgh, &img_fmt, CL_IMAGE_ROW_PITCH, sizeof(image_row_pitch), &image_row_pitch, NULL);
+        // Create an OpenCL buffer object that uses ion_info as its data store.
+        // Notice how the buffer is created with size buffer_size_in_bytes, not
+        // buffer_size_with_padding.
+        myionmem.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
+        myionmem.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
+        // file descriptor for ION
+        myionmem.ion_filedesc = ion_info_fd.file_descriptor;
+        // hostptr returned by ION which is device page size aligned
+        myionmem.ion_hostptr = ion_info.host_virtual_address;
 
-    // Use the image height, row pitch obtained above and element size to compute the size of the buffer
-    buffer_size_in_bytes = imgh * image_row_pitch;
+        if(myionmem.ion_hostptr % device_page_size)
+        {
+            error("Host pointer must be aligned to device_page_size!");
+        }
 
-    // Compute amount of memory that needs to be allocated for the buffer including padding.
-    buffer_size_with_padding = buffer_size_in_bytes + ext_mem_padding_in_bytes;
-    
-    // Make an ION memory allocation of size "buffer_size_with_padding" here.
-    // Notice that allocating "buffer_size_in_bytes" instead would be a mistake! It's important to allocate the extra padding.
-    // Let's say the parameters of the allocation are stored in a struct named "ion_info" that we will use below.
-    // ...
+        buffer_object = clCreateBuffer(context,
+            CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM,
+            buffer_size_in_bytes, &myionmem, &errcode);
 
-    // Create an OpenCL image object that uses "ion_info" as its data store.
-    myionmem.ext_host_ptr.allocation_type    = CL_MEM_ION_HOST_PTR_QCOM;
-    myionmem.ext_host_ptr.host_cache_policy  = CL_MEM_HOST_UNCACHED_QCOM;
-    myionmem.ion_filedesc                    = ion_info_fd.file_descriptor;   // the file descriptor for ION
-    myionmem.ion_hostptr                     = ion_info.host_virtual_address; // the hostptr returned by ION which is device page size aligned
-    
-    if(myionmem.ion_hostptr % device_page_size)
-    {
-        error("Host pointer must be aligned to device_page_size!");
-    }
-    
-    // Note that the image_row_pitch obtained by calling clGetDeviceImageInfoQCOM should be passed to clCreateImage2D
-    image_object = clCreateImage2D(context, CL_MEM_USE_HOST_PTR|CL_MEM_EXT_HOST_PTR_QCOM, &image_fmt, imgw, imgh, image_row_pitch, &myionmem, &errcode);
+    2) Using the extension for CL image objects
 
-    // Call clEnqueueMapImage before filling input image data
-    pinput = clEnqueueMapImage(command_queue, image_object, CL_TRUE, CL_MAP_WRITE, origin, region, &row_pitch, NULL,
-                                        0, NULL, NULL, &errcode);
+        cl_mem              image_object             = NULL;
+        cl_mem_ion_host_ptr myionmem                 = {0};
+        size_t              ext_mem_padding_in_bytes = 0;
+        size_t              device_page_size         = 0;
+        size_t              row_pitch                = 0;
 
-    // Fill the input image data using the hostptr and row_pitch returned by clEnqueueMapImage
-    cl_uchar* inp = pinput;
-    memset(inp, 0x0, (row_pitch * imgh));
-    for(i = 0; i < (row_pitch * imgh); i+=row_pitch)
-    {
-        memset(inp+i, 0xff, imgw * element_size);
-    }
+        // Query the device's page size and the amount of padding necessary at
+        // the end of the buffer.
+        clGetDeviceInfo(device, CL_DEVICE_PAGE_SIZE_QCOM,
+        sizeof(device_page_size), &device_page_size, NULL);
+        clGetDeviceInfo(device, CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM,
+            sizeof(ext_mem_padding_in_bytes), &ext_mem_padding_in_bytes, NULL);
 
-    errcode =  clEnqueueUnmapMemObject(command_queue, image_object, pinput, 0, NULL, NULL);
+        // Query the device supported row and slice pitch using
+        // clGetDeviceImageInfoQCOM
+        // imgw - image width
+        // imgh - image height
+        // img_fmt - image format
+        clGetDeviceImageInfoQCOM(device, imgw, imgh, &img_fmt,
+            CL_IMAGE_ROW_PITCH, sizeof(image_row_pitch), &image_row_pitch,
+            NULL);
 
+        // Use the image height, row pitch obtained above and element size to
+        // compute the size of the buffer
+        buffer_size_in_bytes = imgh * image_row_pitch;
+
+        // Compute amount of memory that needs to be allocated for the buffer
+        // including padding.
+        buffer_size_with_padding = buffer_size_in_bytes +
+            ext_mem_padding_in_bytes;
+
+        // Make an ION memory allocation of size buffer_size_with_padding here.
+        // Note that allocating buffer_size_in_bytes instead would be a mistake.
+        // It's important to allocate the extra padding. Let's say the
+        // parameters of the allocation are stored in a struct named ion_info
+        // that we will use below.
+
+        // Create an OpenCL image object that uses ion_info as its data store.
+        myionmem.ext_host_ptr.allocation_type = CL_MEM_ION_HOST_PTR_QCOM;
+        myionmem.ext_host_ptr.host_cache_policy = CL_MEM_HOST_UNCACHED_QCOM;
+        // file descriptor for ION
+        myionmem.ion_filedesc = ion_info_fd.file_descriptor;
+        // hostptr returned by ION which is device page size aligned
+        myionmem.ion_hostptr = ion_info.host_virtual_address;
+
+        if(myionmem.ion_hostptr % device_page_size)
+        {
+            error("Host pointer must be aligned to device_page_size!");
+        }
+
+        // Note that the image_row_pitch obtained by calling
+        // clGetDeviceImageInfoQCOM should be passed to clCreateImage2D
+        image_object = clCreateImage2D(context,
+            CL_MEM_USE_HOST_PTR | CL_MEM_EXT_HOST_PTR_QCOM, &image_fmt, imgw,
+            imgh, image_row_pitch, &myionmem, &errcode);
+
+        // Call clEnqueueMapImage before filling input image data
+        pinput = clEnqueueMapImage(command_queue, image_object, CL_TRUE,
+            CL_MAP_WRITE, origin, region, &row_pitch, NULL, 0, NULL, NULL,
+            &errcode);
+
+        // Fill the input image data using the hostptr and row_pitch returned by
+        // clEnqueueMapImage
+        cl_uchar* inp = pinput;
+        memset(inp, 0x0, (row_pitch * imgh));
+        for(i = 0; i < (row_pitch * imgh); i+=row_pitch)
+        {
+            memset(inp+i, 0xff, imgw * element_size);
+        }
+
+        errcode =  clEnqueueUnmapMemObject(command_queue, image_object, pinput,
+            0, NULL, NULL);
 
 Revision History
 
-    Revision 3, 2013/05/17: Generalized. Cleaned-up for Khronos. Added final token values.
-    Revision 2, 2012/11/01: Improved sample code.
     Revision 1, 2012/10/18: Initial version.
+    Revision 2, 2012/11/01: Improved sample code.
+    Revision 3, 2013/05/17: Generalized. Cleaned-up for Khronos. Added final
+                            token values.
+    Revision 4, 2017/06/16: Clean up. No functional changes.
+    Revision 5, 2017/11/13: Clean up. No functional changes.
+    Revision 6, 2018/01/03: Added reference to cl_qcom_ext_host_ptr_iocoherent.
+    Revision 7, 2018/01/19: Formatting and misc changes. No functional changes.
