diff --git a/linux-ramdump-parser-v2/mmu.py b/linux-ramdump-parser-v2/mmu.py
index fe21488621b601e1632fd22dca4804033209c84e..4444cd2dd4eaf067f90120688b0d3c7a5bd014ad 100644
--- a/linux-ramdump-parser-v2/mmu.py
+++ b/linux-ramdump-parser-v2/mmu.py
@@ -506,7 +506,7 @@ class Armv8MMU(MMU):
         else:
             raise Exception(
                 'Invalid stage 1 first- or second-level translation\ndescriptor: (%s)\naddr: (%s)'
-                % (str(descriptor), str(addr))
+               % (str(descriptor), str(addr))
             )
         return descriptor
 
@@ -589,7 +589,10 @@ class Armv8MMU(MMU):
             tl_index=(20,12),
             page_index=(11,0))
 
-        fl_desc = self.do_fl_sl_level_lookup(self.ttbr, virt_r.fl_index, 12, 30)
+        try:
+          fl_desc = self.do_fl_sl_level_lookup(self.ttbr, virt_r.fl_index, 12, 30)
+        except:
+          return None
 
         if fl_desc.dtype == Armv8MMU.DESCRIPTOR_BLOCK:
             return self.fl_block_desc_2_phys(fl_desc, virt_r)
diff --git a/linux-ramdump-parser-v2/parsers/cpr3_info.py b/linux-ramdump-parser-v2/parsers/cpr3_info.py
index 49a166642b5d7dd263b62bb4529f17d9390e8ae4..ca5d9ddf472c73945a904408f1bb9ad753790d20 100644
--- a/linux-ramdump-parser-v2/parsers/cpr3_info.py
+++ b/linux-ramdump-parser-v2/parsers/cpr3_info.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015, The Linux Foundation. All rights reserved.
+# Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License version 2 and
@@ -14,7 +14,7 @@ from print_out import print_out_str
 from parser_util import register_parser, RamParser
 from collections import defaultdict
 
-
+CPRH_CTRL_TYPE = 2
 @register_parser('--cpr3-info', 'Print CPR3 information')
 class CPR3Info(RamParser):
     def __init__(self, *args):
@@ -264,7 +264,7 @@ class CPR3Info(RamParser):
                                          "not yet executed")
         self.output.append(tmp)
 
-    def dump_cpr3_regulator_state(self, vreg_addr):
+    def dump_cpr3_regulator_state(self, vreg_addr, ctrl_type):
         tmp = ""
         if vreg_addr is None:
             return
@@ -318,13 +318,14 @@ class CPR3Info(RamParser):
                 'speed_bin_fuse'))
         tmp += "%-30s = %d\n" % ("Speed-bin fuse", speed_bin_fuse)
 
-        tmp += "\n%-30s = %d/%d\n" % ("CPR corner", current_corner + 1,
-                                      corner_count)
-        if vreg_enabled is True:
-            vreg_enabled = 1
-        else:
-            vreg_enabled = 0
-        tmp += "%-30s = %d\n" % ("Enabled", vreg_enabled)
+        if ctrl_type != CPRH_CTRL_TYPE:
+            tmp += "\n%-30s = %d/%d\n" % ("CPR corner", current_corner + 1,
+                                          corner_count)
+            if vreg_enabled is True:
+                vreg_enabled = 1
+            else:
+                vreg_enabled = 0
+            tmp += "%-30s = %d\n" % ("Enabled", vreg_enabled)
 
         if ldo_regulator_addr != 0:
             if ldo_mode_allowed is True:
@@ -340,8 +341,10 @@ class CPR3Info(RamParser):
             vreg_addr + self.ramdump.field_offset(
                 'struct cpr3_regulator', 'corner'))
         size = self.ramdump.sizeof("struct cpr3_corner")
-        corner_addr = corner_addr + current_corner * size
-        self.dump_cpr3_corner_info(corner_addr, 0, 1, 0)
+
+        if ctrl_type != CPRH_CTRL_TYPE:
+            corner_addr = corner_addr + current_corner * size
+            self.dump_cpr3_corner_info(corner_addr, 0, 1, 0)
         self.dump_cpr3_regulator_voltages(vreg_addr)
 
         rdev_addr = self.ramdump.read_word(
@@ -349,9 +352,10 @@ class CPR3Info(RamParser):
                                                   'rdev'))
         offset = self.ramdump.field_offset('struct regulator_dev',
                                            'consumer_list')
-        self.dump_consumer(rdev_addr + offset)
+        if ctrl_type != CPRH_CTRL_TYPE:
+            self.dump_consumer(rdev_addr + offset)
 
-    def dump_cpr3_thread_state(self, thread_addr):
+    def dump_cpr3_thread_state(self, thread_addr, ctrl_type):
         tmp = ""
         thread_id = self.ramdump.read_u32(
             thread_addr + self.ramdump.field_offset(
@@ -361,10 +365,12 @@ class CPR3Info(RamParser):
         tmp += "-" * 80 + "\n"
         tmp += "Thread: %d\n" % thread_id
         tmp += "-" * 80 + "\n"
-        tmp += "CPR aggregated voltages:\n"
+        if ctrl_type != CPRH_CTRL_TYPE:
+            tmp += "CPR aggregated voltages:\n"
         self.output.append(tmp)
+        if ctrl_type != CPRH_CTRL_TYPE:
+            self.dump_cpr3_corner_info(aggr_corner_addr, 0, 1, 0)
 
-        self.dump_cpr3_corner_info(aggr_corner_addr, 0, 1, 0)
         vreg_addr = self.ramdump.read_word(
             thread_addr +
             self.ramdump.field_offset('struct cpr3_thread', 'vreg'))
@@ -375,7 +381,7 @@ class CPR3Info(RamParser):
 
         size_reg = self.ramdump.sizeof('struct cpr3_regulator')
         for i in range(vreg_count):
-            self.dump_cpr3_regulator_state(vreg_addr + i * size_reg)
+            self.dump_cpr3_regulator_state(vreg_addr + i * size_reg, ctrl_type)
 
     def cpr_walker(self, ctrl_addr):
         if ctrl_addr == self.head:
@@ -397,21 +403,33 @@ class CPR3Info(RamParser):
             ctrl_addr + self.ramdump.field_offset(
                 'struct cpr3_controller',
                 'cpr_allowed_sw'))
+        cpr_allowed_hw = self.ramdump.read_bool(
+            ctrl_addr + self.ramdump.field_offset(
+                'struct cpr3_controller',
+                'cpr_allowed_hw'))
         cpr_enabled = self.ramdump.read_bool(
             ctrl_addr + self.ramdump.field_offset(
                 'struct cpr3_controller', 'cpr_enabled'))
-        if supports_hw_closed_loop == 1:
-            if cpr_allowed_sw == 0:
+        ctrl_type = self.ramdump.read_int(
+            ctrl_addr + self.ramdump.field_offset(
+                'struct cpr3_controller',
+                'ctrl_type'))
+
+        if cpr_allowed_sw == 0 or cpr_allowed_hw == 0:
                 cpr_mode = "open-loop"
-            elif use_hw_closed_loop == 0:
+        elif supports_hw_closed_loop == 1 and ctrl_type != CPRH_CTRL_TYPE:
+            if use_hw_closed_loop == 0:
                 cpr_mode = "SW closed-loop"
             else:
                 cpr_mode = "HW closed-loop"
-        else:
-            if cpr_allowed_sw == 0:
+        elif supports_hw_closed_loop == 1 and ctrl_type == CPRH_CTRL_TYPE:
+            if use_hw_closed_loop == 0:
                 cpr_mode = "open-loop"
             else:
-                cpr_mode = "closed-loop"
+                cpr_mode = "full HW closed-loop"
+        else:
+            cpr_mode = "closed-loop"
+
         tmp = ""
         if cpr_controller_name is None:
             return
@@ -425,17 +443,27 @@ class CPR3Info(RamParser):
         tmp = ""
         self.get_apm_threshold(ctrl_addr)
         self.get_aging_info(ctrl_addr)
-        self.dump_vdd_regulator(ctrl_addr)
-        if cpr_allowed_sw == 1 and use_hw_closed_loop == 1:
+        if ctrl_type != CPRH_CTRL_TYPE:
+            self.dump_vdd_regulator(ctrl_addr)
+
+        if cpr_allowed_sw == 1 and use_hw_closed_loop == 1 and ctrl_type != CPRH_CTRL_TYPE:
             tmp = "* The actual voltage at the PMIC may be anywhere " \
                   "between the aggregated ceiling and floor voltage when"\
                   " using CPR HW closed-loop mode.\n"
-            self.output.append(tmp)
-            tmp = ""
-        aggr_corner_addr = ctrl_addr + self.ramdump.field_offset(
-            'struct cpr3_controller', 'aggr_corner')
-        self.output.append("\nCPR aggregated voltages:\n")
-        self.dump_cpr3_corner_info(aggr_corner_addr, 0, 0, 0)
+        elif ctrl_type == CPRH_CTRL_TYPE:
+            tmp = "* With full HW closed-loop operation, the expected PMIC " \
+                  "voltage can be checked via the CPRH_STATUS and " \
+                  "L2_SAW4_PMIC_STS registers in the DCC register dump.\n"
+
+        self.output.append(tmp)
+        tmp = ""
+
+        if ctrl_type != CPRH_CTRL_TYPE:
+            aggr_corner_addr = ctrl_addr + self.ramdump.field_offset(
+                'struct cpr3_controller', 'aggr_corner')
+            self.output.append("\nCPR aggregated voltages:\n")
+            self.dump_cpr3_corner_info(aggr_corner_addr, 0, 0, 0)
+
         thread_addr = self.ramdump.read_word(
             ctrl_addr +
             self.ramdump.field_offset(
@@ -446,7 +474,7 @@ class CPR3Info(RamParser):
                 'struct cpr3_controller', 'thread_count'))
         size_thr = self.ramdump.sizeof('struct cpr3_thread')
         for i in range(thread_count):
-            self.dump_cpr3_thread_state(thread_addr + i * size_thr)
+            self.dump_cpr3_thread_state(thread_addr + i * size_thr, ctrl_type)
         # print new line for each regulator struct
         tmp += '\n'
         self.output.append(tmp)