/* v4.0 introduces an escape buffer for prefetch.  We use it
         * on all but the AP command channel.
         */
-       if (gsi->version != IPA_VERSION_3_5_1 && !channel->command)
-               val |= USE_ESCAPE_BUF_ONLY_FMASK;
+       if (gsi->version != IPA_VERSION_3_5_1 && !channel->command) {
+               /* If not otherwise set, prefetch buffers are used */
+               if (gsi->version < IPA_VERSION_4_5)
+                       val |= USE_ESCAPE_BUF_ONLY_FMASK;
+               else
+                       val |= u32_encode_bits(GSI_ESCAPE_BUF_ONLY,
+                                              PREFETCH_MODE_FMASK);
+       }
 
        iowrite32(val, gsi->virt + GSI_CH_C_QOS_OFFSET(channel_id));
 
 
 #define USE_DB_ENG_FMASK               GENMASK(9, 9)
 /* The next field is only present for IPA v4.0, v4.1, and v4.2 */
 #define USE_ESCAPE_BUF_ONLY_FMASK      GENMASK(10, 10)
+/* The next two fields are present for IPA v4.5 and above */
+#define PREFETCH_MODE_FMASK            GENMASK(13, 10)
+#define EMPTY_LVL_THRSHOLD_FMASK       GENMASK(23, 16)
+/** enum gsi_prefetch_mode - PREFETCH_MODE field in CH_C_QOS */
+enum gsi_prefetch_mode {
+       GSI_USE_PREFETCH_BUFS                   = 0x0,
+       GSI_ESCAPE_BUF_ONLY                     = 0x1,
+       GSI_SMART_PREFETCH                      = 0x2,
+       GSI_FREE_PREFETCH                       = 0x3,
+};
 
 #define GSI_CH_C_SCRATCH_0_OFFSET(ch) \
                GSI_EE_N_CH_C_SCRATCH_0_OFFSET((ch), GSI_EE_AP)
 /* The next two values are available for IPA v4.0 and above */
        IRAM_SIZE_TWO_N_HALF_KB                 = 0x2,
        IRAM_SIZE_THREE_KB                      = 0x3,
+       /* The next two values are available for IPA v4.5 and above */
+       IRAM_SIZE_THREE_N_HALF_KB               = 0x4,
+       IRAM_SIZE_FOUR_KB                       = 0x5,
 };
 
 /* IRQ condition for each type is cleared by writing type-specific register */