int     map_to;
 };
 
+struct stb_context {
+       uint32_t stb_buf_size;
+       bool enabled;
+       spinlock_t lock;
+};
+
 #define WORKLOAD_POLICY_MAX 7
 struct smu_context
 {
        uint16_t cpu_core_num;
 
        struct smu_user_dpm_profile user_dpm_profile;
+
+       struct stb_context stb_context;
 };
 
 struct i2c_adapter;
         * @get_ecc_table:  message SMU to get ECC INFO table.
         */
        ssize_t (*get_ecc_info)(struct smu_context *smu, void *table);
+       
+       
+       /**
+        * @stb_collect_info: Collects Smart Trace Buffers data.
+        */
+       int (*stb_collect_info)(struct smu_context *smu, void *buf, uint32_t size);
 };
 
 typedef enum {
 int smu_wait_for_event(struct amdgpu_device *adev, enum smu_event_type event,
                       uint64_t event_arg);
 int smu_get_ecc_info(struct smu_context *smu, void *umc_ecc);
+int smu_stb_collect_info(struct smu_context *smu, void *buff, uint32_t size);
 
 #endif
 #endif
 
 
        return ret;
 }
+
+int smu_stb_collect_info(struct smu_context *smu, void *buf, uint32_t size)
+{
+
+       if (!smu->ppt_funcs->stb_collect_info || !smu->stb_context.enabled)
+               return -EOPNOTSUPP;
+
+       /* Confirm the buffer allocated is of correct size */
+       if (size != smu->stb_context.stb_buf_size)
+               return -EINVAL;
+
+       /*
+        * No need to lock smu mutex as we access STB directly through MMIO
+        * and not going through SMU messaging route (for now at least).
+        * For registers access rely on implementation internal locking.
+        */
+       return smu->ppt_funcs->stb_collect_info(smu, buf, size);
+}