diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp
index b65e1b3..c027a71 100644
--- a/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.cpp
@@ -30,6 +30,7 @@
 
 #include "3a/AiqResult.h"
 #include "3a/AiqResultStorage.h"
+#include "AiqInitData.h"
 #include "FormatUtils.h"
 #include "PSysDAG.h"
 #include "SyncManager.h"
@@ -45,6 +46,9 @@
 
 namespace icamera {
 
+#define STILL_TNR_THRESHOLD_GAIN_ID 722
+#define DEFAULT_TNR_THRESHOLD_GAIN 2.0f
+
 std::mutex GPUExecutor::mGPULock;
 
 GPUExecutor::GPUExecutor(int cameraId, const ExecutorPolicy& policy, vector<string> exclusivePGs,
@@ -54,8 +58,8 @@
           mIntelTNR(nullptr),
           mLastSequence(UINT32_MAX),
           mUseInternalTnrBuffer(useTnrOutBuffer),
-          mOutBufferSize(0) {
-    mStillTnrTG = PlatformData::getTnrThresholdGain(mCameraId);
+          mOutBufferSize(0),
+          mStillTnrTG(DEFAULT_TNR_THRESHOLD_GAIN) {
     LOG1("@%s %s", __func__, mName.c_str());
 }
 
@@ -103,6 +107,11 @@
 
 int GPUExecutor::start() {
     LOG1("%s executor:%s", __func__, mName.c_str());
+    if (mStreamId == STILL_STREAM_ID &&
+        getStillTnrTG(mPSysDag->getTuningMode(0), &mStillTnrTG) != OK) {
+        mStillTnrTG = DEFAULT_TNR_THRESHOLD_GAIN;
+        LOGW("%s can't get threshold gain from aiqb, use default", __func__);
+    }
 
     mProcessThread = new ProcessThread(this);
 
@@ -226,6 +235,32 @@
     return false;
 }
 
+int GPUExecutor::getStillTnrTG(TuningMode mode, float* tg) {
+    CheckError(!tg, UNKNOWN_ERROR, "invalid input");
+    ia_binary_data otherData = {nullptr, 0};
+    int ret =
+        PlatformData::getCpfAndCmc(mCameraId, nullptr, nullptr, &otherData, nullptr, mode, nullptr);
+    CheckError(ret || !otherData.data || otherData.size == 0, UNKNOWN_ERROR,
+               "Failed to get tunning data");
+
+    uint32_t offset = sizeof(ia_mkn_header);
+    ia_mkn_header* header_ptr = static_cast<ia_mkn_header*>(otherData.data);
+
+    while (offset < header_ptr->size) {
+        ia_mkn_record_header* record =
+            reinterpret_cast<ia_mkn_record_header*>(static_cast<char*>(otherData.data) + offset);
+        if (STILL_TNR_THRESHOLD_GAIN_ID == record->data_name_id) {
+            void* pStillTnr7Tigger = reinterpret_cast<char*>(record) + sizeof(ia_mkn_record_header);
+            MEMCPY_S(tg, sizeof(float), static_cast<char*>(pStillTnr7Tigger), sizeof(float));
+            return OK;
+        } else {
+            offset += record->size;
+        }
+    }
+
+    return UNKNOWN_ERROR;
+}
+
 int GPUExecutor::getTotalGain(int64_t seq, float* totalGain) {
     CheckError(!totalGain, UNKNOWN_ERROR, "Invalid input");
     AiqResult* aiqResults =
diff --git a/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h
index 4ad8781..2ba0497 100644
--- a/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/GPUExecutor.h
@@ -54,7 +54,8 @@
     int updateTnrISPConfig(Tnr7Param* pbuffer, uint32_t sequence);
     int allocTnrOutBufs(uint32_t bufSize);
     int dumpTnrParameters(uint32_t sequence);
-    int getTotalGain(int64_t seq, float *totalGain);
+    int getTotalGain(int64_t seq, float* totalGain);
+    int getStillTnrTG(TuningMode mode, float* tg);
     int runTnrFrame(const std::shared_ptr<CameraBuffer>& inBuf,
                     std::shared_ptr<CameraBuffer> outbuf);
 
diff --git a/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
index 444555c..857a586 100644
--- a/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
+++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
@@ -483,9 +483,6 @@
     } else if (strcmp(name, "tnrExtraFrameNum") == 0) {
         int val = atoi(atts[1]);
         pCurrentCam->mTnrExtraFrameNum = val > 0 ? val : DEFAULT_TNR_EXTRA_FRAME_NUM;
-    } else if (strcmp(name, "tnrThresholdGain") == 0) {
-        float val = atof(atts[1]);
-        pCurrentCam->mTnrThresholdGain = val > 0 ? val : DEFAULT_TNR_THRESHOLD_GAIN;
     }
 }
 
diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
index d534f12..13ecb1f 100644
--- a/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
@@ -1394,9 +1394,4 @@
 {
     return getInstance()->mStaticCfg.mCameras[cameraId].mTnrExtraFrameNum;
 }
-
-float PlatformData::getTnrThresholdGain(int cameraId)
-{
-    return getInstance()->mStaticCfg.mCameras[cameraId].mTnrThresholdGain;
-}
 } // namespace icamera
diff --git a/camera/hal/intel/ipu6/src/platformdata/PlatformData.h b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
index 5a2ab1c..dc1604c 100644
--- a/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
@@ -53,7 +53,6 @@
 #define FACE_ENGINE_DEFAULT_RUNNING_INTERVAL 1
 
 #define DEFAULT_TNR_EXTRA_FRAME_NUM 2
-#define DEFAULT_TNR_THRESHOLD_GAIN 2.0f
 
 /* Max number of the RAW buffer number is 32.
  * Max number size of the pipeline depth is 6.
@@ -144,8 +143,7 @@
                 mSwProcessingAlignWithIsp(false),
                 mMaxNvmDataSize(0),
                 mVideoStreamNum(DEFAULT_VIDEO_STREAM_NUM),
-                mTnrExtraFrameNum(DEFAULT_TNR_EXTRA_FRAME_NUM),
-                mTnrThresholdGain(DEFAULT_TNR_THRESHOLD_GAIN)
+                mTnrExtraFrameNum(DEFAULT_TNR_EXTRA_FRAME_NUM)
             {
             }
 
@@ -235,7 +233,6 @@
             std::vector<IGraphType::ScalerInfo> mScalerInfo;
             int mVideoStreamNum;
             int mTnrExtraFrameNum;
-            float mTnrThresholdGain;
         };
 
         std::vector<CameraInfo> mCameras;
@@ -1198,9 +1195,5 @@
      * the extra frame count for still stream
      */
      static int getTnrExtraFrameCount(int cameraId);
-     /**
-     * the threshold gain to trigger still tnr
-     */
-     static float getTnrThresholdGain(int cameraId);
 };
 } /* namespace icamera */
