diff --git a/linux-ramdump-parser-v2/qdss.py b/linux-ramdump-parser-v2/qdss.py
index 22c3586ba45c7525ac9641ef783e9233202095f2..1cfff7003660402918a23289bd464679259b4117 100644
--- a/linux-ramdump-parser-v2/qdss.py
+++ b/linux-ramdump-parser-v2/qdss.py
@@ -10,6 +10,7 @@
 # GNU General Public License for more details.
 
 import struct
+import itertools
 from print_out import print_out_str
 
 tmc_registers = {
@@ -292,6 +293,71 @@ class QDSSDump():
 
         tmc_etf.close()
 
+    def read_sg_data(self, dbaddr, sts, rwpval, ram_dump, tmc_etr):
+        start = dbaddr
+        continue_looping = True
+        if (sts & 0x1) == 1:
+            bottom_delta_read = False
+            while continue_looping:
+                entry = ram_dump.read_u32(start, False)
+                blk = (entry >> 4) << 12
+                if (entry & 0x3) == 3:
+                    start = blk
+                    continue
+                elif (entry & 0x2) == 2:
+                    if blk < rwpval and rwpval < (blk + 4096):
+                        if not bottom_delta_read:
+                            it = range(rwpval, blk + 4096)
+                            bottom_delta_read = True
+                        else:
+                            it = range(blk, blk + (rwpval - blk))
+                            continue_looping = False
+                    elif bottom_delta_read:
+                        it = range(blk, blk + 4096)
+                    else:
+                        start += 4
+                        continue
+                    start += 4
+                elif (entry & 0x1) == 1:
+                    if blk < rwpval and rwpval < (blk + 4096):
+                        if not bottom_delta_read:
+                            it = range(rwpval, blk + 4096)
+                            bottom_delta_read = True
+                        else:
+                            it = range(blk, blk + (rwpval - blk))
+                            continue_looping = False
+                    elif bottom_delta_read:
+                        it = range(blk, blk + 4096)
+                    else:
+                        start = dbaddr
+                        continue
+                    start = dbaddr
+                else:
+                    break
+
+                for i in it:
+                    val = ram_dump.read_byte(i, False)
+                    tmc_etr.write(struct.pack("<B",val))
+        else:
+            while continue_looping:
+                entry = ram_dump.read_u32(start, False)
+                blk = (entry >> 4) << 12
+                if (entry & 0x3) == 3:
+                    start = blk
+                    continue
+                elif (entry & 0x2) == 2:
+                    it = range(blk, blk + 4096)
+                    start += 4
+                elif (entry & 0x1) == 1:
+                    it = range(blk, blk + 4096)
+                    continue_looping = False
+                else:
+                    break
+
+                for i in it:
+                    val = ram_dump.read_byte(i, False)
+                    tmc_etr.write(struct.pack("<B",val))
+
     def save_etr_bin(self, ram_dump):
         tmc_etr = ram_dump.open_file('tmc-etr.bin')
         if self.tmc_etr_start is None:
@@ -328,21 +394,24 @@ class QDSSDump():
             rwphi = ram_dump.read_u32(self.tmc_etr_start + rwphi_offset, False)
             rwpval = (rwphi << 32) + rwp
 
-            if (sts & 0x1) == 1:
-                for i in range(rwpval, dbaddr + rsz):
-                    val = ram_dump.read_byte(i, False)
-                    tmc_etr.write(struct.pack('<B', val))
-
-                for i in range(dbaddr, rwpval):
-                    val = ram_dump.read_byte(i, False)
-                    tmc_etr.write(struct.pack('<B', val))
+            axictl_offset, axictl_desc = tmc_registers["AXICTL"]
+            axictl = ram_dump.read_u32(self.tmc_etr_start + axictl_offset, False)
 
+            if ((axictl >> 7) & 0x1) == 1:
+                print_out_str('Scatter gather memory type was selected for TMC ETR')
+                self.read_sg_data(dbaddr, sts, rwpval, ram_dump, tmc_etr)
             else:
-                for i in range(dbaddr, dbaddr + rsz):
+                print_out_str('Contiguous memory type was selected for TMC ETR')
+                if (sts & 0x1) == 1:
+                    it = itertools.chain(range(rwpval, dbaddr+rsz), range(dbaddr, rwpval))
+                else:
+                    it = range(dbaddr, dbaddr+rsz)
+
+                for i in it:
                     val = ram_dump.read_byte(i, False)
-                    tmc_etr.write(struct.pack('<B', val))
+                    tmc_etr.write(struct.pack("<B",val))
         else:
-            print_out_str('!!! ETR was not the current sink!')
+            print_out_str ('!!! ETR was not the current sink!')
 
         tmc_etr.close()