return 0;
 }
 
+#define SST_TF_INFO_0_OFFSET   0
+#define SST_TF_INFO_1_OFFSET   8
+#define SST_TF_INFO_2_OFFSET   16
+
+#define SST_TF_MAX_LP_CLIP_RATIOS      TRL_MAX_LEVELS
+
+#define SST_TF_LP_CLIP_RATIO_0_START   16
+#define SST_TF_LP_CLIP_RATIO_0_WIDTH   8
+
+#define SST_TF_RATIO_0_START   0
+#define SST_TF_RATIO_0_WIDTH   8
+
+#define SST_TF_NUM_CORE_0_START 0
+#define SST_TF_NUM_CORE_0_WIDTH 8
+
+static int isst_if_get_turbo_freq_info(void __user *argp)
+{
+       static struct isst_turbo_freq_info turbo_freq;
+       struct tpmi_per_power_domain_info *power_domain_info;
+       int i, j;
+
+       if (copy_from_user(&turbo_freq, argp, sizeof(turbo_freq)))
+               return -EFAULT;
+
+       power_domain_info = get_instance(turbo_freq.socket_id, turbo_freq.power_domain_id);
+       if (!power_domain_info)
+               return -EINVAL;
+
+       if (turbo_freq.level > power_domain_info->max_level)
+               return -EINVAL;
+
+       turbo_freq.max_buckets = TRL_MAX_BUCKETS;
+       turbo_freq.max_trl_levels = TRL_MAX_LEVELS;
+       turbo_freq.max_clip_freqs = SST_TF_MAX_LP_CLIP_RATIOS;
+
+       for (i = 0; i < turbo_freq.max_clip_freqs; ++i)
+               _read_tf_level_info("lp_clip*", turbo_freq.lp_clip_freq_mhz[i],
+                                   turbo_freq.level, SST_TF_INFO_0_OFFSET,
+                                   SST_TF_LP_CLIP_RATIO_0_START +
+                                   (i * SST_TF_LP_CLIP_RATIO_0_WIDTH),
+                                   SST_TF_LP_CLIP_RATIO_0_WIDTH, SST_MUL_FACTOR_FREQ)
+
+       for (i = 0; i < TRL_MAX_LEVELS; ++i) {
+               for (j = 0; j < TRL_MAX_BUCKETS; ++j)
+                       _read_tf_level_info("cydn*_bucket_*_trl",
+                                           turbo_freq.trl_freq_mhz[i][j], turbo_freq.level,
+                                           SST_TF_INFO_2_OFFSET + (i * SST_TF_RATIO_0_WIDTH),
+                                           j * SST_TF_RATIO_0_WIDTH, SST_TF_RATIO_0_WIDTH,
+                                           SST_MUL_FACTOR_FREQ)
+       }
+
+       for (i = 0; i < TRL_MAX_BUCKETS; ++i)
+               _read_tf_level_info("bucket_*_core_count", turbo_freq.bucket_core_counts[i],
+                                   turbo_freq.level, SST_TF_INFO_1_OFFSET,
+                                   SST_TF_NUM_CORE_0_WIDTH * i, SST_TF_NUM_CORE_0_WIDTH,
+                                   SST_MUL_FACTOR_NONE)
+
+       if (copy_to_user(argp, &turbo_freq, sizeof(turbo_freq)))
+               return -EFAULT;
+
+       return 0;
+}
+
 static long isst_if_def_ioctl(struct file *file, unsigned int cmd,
                              unsigned long arg)
 {
        case ISST_IF_GET_BASE_FREQ_CPU_MASK:
                ret = isst_if_get_base_freq_mask(argp);
                break;
+       case ISST_IF_GET_TURBO_FREQ_INFO:
+               ret = isst_if_get_turbo_freq_info(argp);
+               break;
        default:
                break;
        }
 
        __u16 thermal_design_power_w;
 };
 
+/**
+ * struct isst_turbo_freq_info - Structure to get SST-TF frequencies
+ * @socket_id: Socket/package id
+ * @power_domain:      Power Domain id
+ * @level:     SST-PP level for which caller wants to get information
+ * @max_clip_freqs: Maximum number of low priority core clipping frequencies
+ * @lp_clip_freq_mhz: Clip frequencies per trl level
+ * @bucket_core_counts: Maximum number of cores for a bucket
+ * @trl_freq_mhz: Frequencies per trl level for each bucket
+ *
+ * Structure used to get SST-TF information using
+ * IOCTL ISST_IF_GET_TURBO_FREQ_INFO.
+ */
+struct isst_turbo_freq_info {
+       __u8 socket_id;
+       __u8 power_domain_id;
+       __u16 level;
+       __u16 max_clip_freqs;
+       __u16 max_buckets;
+       __u16 max_trl_levels;
+       __u16 lp_clip_freq_mhz[TRL_MAX_LEVELS];
+       __u16 bucket_core_counts[TRL_MAX_BUCKETS];
+       __u16 trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS];
+};
+
 #define ISST_IF_MAGIC                  0xFE
 #define ISST_IF_GET_PLATFORM_INFO      _IOR(ISST_IF_MAGIC, 0, struct isst_if_platform_info *)
 #define ISST_IF_GET_PHY_ID             _IOWR(ISST_IF_MAGIC, 1, struct isst_if_cpu_map *)
 #define ISST_IF_GET_PERF_LEVEL_CPU_MASK        _IOR(ISST_IF_MAGIC, 13, struct isst_perf_level_cpu_mask *)
 #define ISST_IF_GET_BASE_FREQ_INFO     _IOR(ISST_IF_MAGIC, 14, struct isst_base_freq_info *)
 #define ISST_IF_GET_BASE_FREQ_CPU_MASK _IOR(ISST_IF_MAGIC, 15, struct isst_perf_level_cpu_mask *)
+#define ISST_IF_GET_TURBO_FREQ_INFO    _IOR(ISST_IF_MAGIC, 16, struct isst_turbo_freq_info *)
 
 #endif