* Per-function locks for sequence-based RTAS functions.
  */
 static DEFINE_MUTEX(rtas_ibm_activate_firmware_lock);
-static DEFINE_MUTEX(rtas_ibm_get_dynamic_sensor_state_lock);
 static DEFINE_MUTEX(rtas_ibm_lpar_perftools_lock);
 static DEFINE_MUTEX(rtas_ibm_physical_attestation_lock);
 DEFINE_MUTEX(rtas_ibm_get_vpd_lock);
 DEFINE_MUTEX(rtas_ibm_get_indices_lock);
 DEFINE_MUTEX(rtas_ibm_set_dynamic_indicator_lock);
+DEFINE_MUTEX(rtas_ibm_get_dynamic_sensor_state_lock);
 
 static struct rtas_function rtas_function_table[] __ro_after_init = {
        [RTAS_FNIDX__CHECK_EXCEPTION] = {
 
        return ret;
 }
 
+/**
+ * papr_dynamic_sensor_ioc_get - ibm,get-dynamic-sensor-state RTAS Call
+ * PAPR 2.13 7.3.19
+ *
+ * @ubuf: Input parameters to RTAS call such as sensor token
+ *        Copies the state in user space buffer.
+ *
+ *
+ * Returns success or -errno.
+ */
+
+static long papr_dynamic_sensor_ioc_get(struct papr_indices_io_block __user *ubuf)
+{
+       struct papr_indices_io_block kbuf;
+       struct rtas_work_area *work_area;
+       s32 fwrc, token, ret;
+       u32 rets;
+
+       token = rtas_function_token(RTAS_FN_IBM_GET_DYNAMIC_SENSOR_STATE);
+       if (token == RTAS_UNKNOWN_SERVICE)
+               return -ENOENT;
+
+       mutex_lock(&rtas_ibm_get_dynamic_sensor_state_lock);
+       work_area = papr_dynamic_indice_buf_from_user(ubuf, &kbuf);
+       if (IS_ERR(work_area)) {
+               ret = PTR_ERR(work_area);
+               goto out;
+       }
+
+       do {
+               fwrc = rtas_call(token, 2, 2, &rets,
+                               kbuf.dynamic_param.token,
+                               rtas_work_area_phys(work_area));
+       } while (rtas_busy_delay(fwrc));
+
+       rtas_work_area_free(work_area);
+
+       switch (fwrc) {
+       case RTAS_SUCCESS:
+               if (put_user(rets, &ubuf->dynamic_param.state))
+                       ret = -EFAULT;
+               else
+                       ret = 0;
+               break;
+       case RTAS_IBM_DYNAMIC_INDICE_NO_INDICATOR:      /* No such indicator */
+               ret = -EOPNOTSUPP;
+               break;
+       default:
+               pr_err("unexpected ibm,get-dynamic-sensor result %d\n",
+                               fwrc);
+               fallthrough;
+       case RTAS_HARDWARE_ERROR:       /* Hardware/platform error */
+               ret = -EIO;
+               break;
+       }
+
+out:
+       mutex_unlock(&rtas_ibm_get_dynamic_sensor_state_lock);
+       return ret;
+}
+
 /*
  * Top-level ioctl handler for /dev/papr-indices.
  */
        case PAPR_INDICES_IOC_GET:
                ret = papr_indices_create_handle(argp);
                break;
+       case PAPR_DYNAMIC_SENSOR_IOC_GET:
+               ret = papr_dynamic_sensor_ioc_get(argp);
+               break;
        case PAPR_DYNAMIC_INDICATOR_IOC_SET:
                if (filp->f_mode & FMODE_WRITE)
                        ret = papr_dynamic_indicator_ioc_set(argp);
        if (!rtas_function_implemented(RTAS_FN_IBM_SET_DYNAMIC_INDICATOR))
                return -ENODEV;
 
+       if (!rtas_function_implemented(RTAS_FN_IBM_GET_DYNAMIC_SENSOR_STATE))
+               return -ENODEV;
+
        return misc_register(&papr_indices_dev);
 }
 machine_device_initcall(pseries, papr_indices_init);