return status;
 }
 
+/**
+ * ice_sched_get_psm_clk_freq - determine the PSM clock frequency
+ * @hw: pointer to the HW struct
+ *
+ * Determine the PSM clock frequency and store in HW struct
+ */
+void ice_sched_get_psm_clk_freq(struct ice_hw *hw)
+{
+       u32 val, clk_src;
+
+       val = rd32(hw, GLGEN_CLKSTAT_SRC);
+       clk_src = (val & GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_M) >>
+               GLGEN_CLKSTAT_SRC_PSM_CLK_SRC_S;
+
+#define PSM_CLK_SRC_367_MHZ 0x0
+#define PSM_CLK_SRC_416_MHZ 0x1
+#define PSM_CLK_SRC_446_MHZ 0x2
+#define PSM_CLK_SRC_390_MHZ 0x3
+
+       switch (clk_src) {
+       case PSM_CLK_SRC_367_MHZ:
+               hw->psm_clk_freq = ICE_PSM_CLK_367MHZ_IN_HZ;
+               break;
+       case PSM_CLK_SRC_416_MHZ:
+               hw->psm_clk_freq = ICE_PSM_CLK_416MHZ_IN_HZ;
+               break;
+       case PSM_CLK_SRC_446_MHZ:
+               hw->psm_clk_freq = ICE_PSM_CLK_446MHZ_IN_HZ;
+               break;
+       case PSM_CLK_SRC_390_MHZ:
+               hw->psm_clk_freq = ICE_PSM_CLK_390MHZ_IN_HZ;
+               break;
+       default:
+               ice_debug(hw, ICE_DBG_SCHED, "PSM clk_src unexpected %u\n",
+                         clk_src);
+               /* fall back to a safe default */
+               hw->psm_clk_freq = ICE_PSM_CLK_446MHZ_IN_HZ;
+       }
+}
+
 /**
  * ice_sched_find_node_in_subtree - Find node in part of base node subtree
  * @hw: pointer to the HW struct
 
 /**
  * ice_sched_calc_wakeup - calculate RL profile wakeup parameter
+ * @hw: pointer to the HW struct
  * @bw: bandwidth in Kbps
  *
  * This function calculates the wakeup parameter of RL profile.
  */
-static u16 ice_sched_calc_wakeup(s32 bw)
+static u16 ice_sched_calc_wakeup(struct ice_hw *hw, s32 bw)
 {
        s64 bytes_per_sec, wakeup_int, wakeup_a, wakeup_b, wakeup_f;
        s32 wakeup_f_int;
 
        /* Get the wakeup integer value */
        bytes_per_sec = div64_long(((s64)bw * 1000), BITS_PER_BYTE);
-       wakeup_int = div64_long(ICE_RL_PROF_FREQUENCY, bytes_per_sec);
+       wakeup_int = div64_long(hw->psm_clk_freq, bytes_per_sec);
        if (wakeup_int > 63) {
                wakeup = (u16)((1 << 15) | wakeup_int);
        } else {
                 */
                wakeup_b = (s64)ICE_RL_PROF_MULTIPLIER * wakeup_int;
                wakeup_a = div64_long((s64)ICE_RL_PROF_MULTIPLIER *
-                                          ICE_RL_PROF_FREQUENCY,
-                                     bytes_per_sec);
+                                          hw->psm_clk_freq, bytes_per_sec);
 
                /* Get Fraction value */
                wakeup_f = wakeup_a - wakeup_b;
 
 /**
  * ice_sched_bw_to_rl_profile - convert BW to profile parameters
+ * @hw: pointer to the HW struct
  * @bw: bandwidth in Kbps
  * @profile: profile parameters to return
  *
  * This function converts the BW to profile structure format.
  */
 static enum ice_status
-ice_sched_bw_to_rl_profile(u32 bw, struct ice_aqc_rl_profile_elem *profile)
+ice_sched_bw_to_rl_profile(struct ice_hw *hw, u32 bw,
+                          struct ice_aqc_rl_profile_elem *profile)
 {
        enum ice_status status = ICE_ERR_PARAM;
        s64 bytes_per_sec, ts_rate, mv_tmp;
        for (i = 0; i < 64; i++) {
                u64 pow_result = BIT_ULL(i);
 
-               ts_rate = div64_long((s64)ICE_RL_PROF_FREQUENCY,
+               ts_rate = div64_long((s64)hw->psm_clk_freq,
                                     pow_result * ICE_RL_PROF_TS_MULTIPLIER);
                if (ts_rate <= 0)
                        continue;
        if (found) {
                u16 wm;
 
-               wm = ice_sched_calc_wakeup(bw);
+               wm = ice_sched_calc_wakeup(hw, bw);
                profile->rl_multiply = cpu_to_le16(mv);
                profile->wake_up_calc = cpu_to_le16(wm);
                profile->rl_encode = cpu_to_le16(encode);
        if (!rl_prof_elem)
                return NULL;
 
-       status = ice_sched_bw_to_rl_profile(bw, &rl_prof_elem->profile);
+       status = ice_sched_bw_to_rl_profile(hw, bw, &rl_prof_elem->profile);
        if (status)
                goto exit_add_rl_prof;
 
 
        ((BIT(11) - 1) * 64) /* In Bytes */
 #define ICE_MAX_BURST_SIZE_KBYTE_GRANULARITY   ICE_MAX_BURST_SIZE_ALLOWED
 
-#define ICE_RL_PROF_FREQUENCY 446000000
 #define ICE_RL_PROF_ACCURACY_BYTES 128
 #define ICE_RL_PROF_MULTIPLIER 10000
 #define ICE_RL_PROF_TS_MULTIPLIER 32
 #define ICE_RL_PROF_FRACTION 512
 
+#define ICE_PSM_CLK_367MHZ_IN_HZ 367647059
+#define ICE_PSM_CLK_416MHZ_IN_HZ 416666667
+#define ICE_PSM_CLK_446MHZ_IN_HZ 446428571
+#define ICE_PSM_CLK_390MHZ_IN_HZ 390625000
+
 /* BW rate limit profile parameters list entry along
  * with bandwidth maintained per layer in port info
  */
                         u16 *elems_ret, struct ice_sq_cd *cd);
 enum ice_status ice_sched_init_port(struct ice_port_info *pi);
 enum ice_status ice_sched_query_res_alloc(struct ice_hw *hw);
+void ice_sched_get_psm_clk_freq(struct ice_hw *hw);
+
 void ice_sched_clear_port(struct ice_port_info *pi);
 void ice_sched_cleanup_all(struct ice_hw *hw);
 void ice_sched_clear_agg(struct ice_hw *hw);