#define INT3400_KEEP_ALIVE 0xA0
 
 enum int3400_thermal_uuid {
+       INT3400_THERMAL_ACTIVE = 0,
        INT3400_THERMAL_PASSIVE_1,
-       INT3400_THERMAL_ACTIVE,
        INT3400_THERMAL_CRITICAL,
        INT3400_THERMAL_ADAPTIVE_PERFORMANCE,
        INT3400_THERMAL_EMERGENCY_CALL_MODE,
 };
 
 static char *int3400_thermal_uuids[INT3400_THERMAL_MAXIMUM_UUID] = {
-       "42A441D6-AE6A-462b-A84B-4A8CE79027D3",
        "3A95C389-E4B8-4629-A526-C52C88626BAE",
+       "42A441D6-AE6A-462b-A84B-4A8CE79027D3",
        "97C68AE7-15FA-499c-B8C9-5DA81D606E0A",
        "63BE270F-1C11-48FD-A6F7-3AF253FF3E2D",
        "5349962F-71E6-431D-9AE8-0A635B710AEE",
        char *data_vault;
        int odvp_count;
        int *odvp;
+       u32 os_uuid_mask;
        struct odvp_attr *odvp_attrs;
 };
 
                                 struct device_attribute *devattr, char *buf)
 {
        struct int3400_thermal_priv *priv = dev_get_drvdata(dev);
+       int i, length = 0;
+
+       if (priv->current_uuid_index > 0)
+               return sprintf(buf, "%s\n",
+                              int3400_thermal_uuids[priv->current_uuid_index]);
+
+       for (i = 0; i <= INT3400_THERMAL_CRITICAL; i++) {
+               if (priv->os_uuid_mask & BIT(i))
+                       length += scnprintf(&buf[length],
+                                           PAGE_SIZE - length,
+                                           "%s\n",
+                                           int3400_thermal_uuids[i]);
+       }
 
-       if (priv->current_uuid_index == -1)
-               return sprintf(buf, "INVALID\n");
+       if (length)
+               return length;
 
-       return sprintf(buf, "%s\n",
-                      int3400_thermal_uuids[priv->current_uuid_index]);
+       return sprintf(buf, "INVALID\n");
+}
+
+static int int3400_thermal_run_osc(acpi_handle handle, char *uuid_str, int *enable)
+{
+       u32 ret, buf[2];
+       acpi_status status;
+       int result = 0;
+       struct acpi_osc_context context = {
+               .uuid_str = NULL,
+               .rev = 1,
+               .cap.length = 8,
+       };
+
+       context.uuid_str = uuid_str;
+
+       buf[OSC_QUERY_DWORD] = 0;
+       buf[OSC_SUPPORT_DWORD] = *enable;
+
+       context.cap.pointer = buf;
+
+       status = acpi_run_osc(handle, &context);
+       if (ACPI_SUCCESS(status)) {
+               ret = *((u32 *)(context.ret.pointer + 4));
+               if (ret != *enable)
+                       result = -EPERM;
+       } else
+               result = -EPERM;
+
+       kfree(context.ret.pointer);
+
+       return result;
 }
 
 static ssize_t current_uuid_store(struct device *dev,
                         * If we have a list of supported UUIDs, make sure
                         * this one is supported.
                         */
-                       if (priv->uuid_bitmap &&
-                           !(priv->uuid_bitmap & (1 << i)))
+                       if (priv->uuid_bitmap & BIT(i)) {
+                               priv->current_uuid_index = i;
+                               return count;
+                       }
+
+                       /*
+                        * There is support of only 3 policies via the new
+                        * _OSC to inform OS capability:
+                        * INT3400_THERMAL_ACTIVE
+                        * INT3400_THERMAL_PASSIVE_1
+                        * INT3400_THERMAL_CRITICAL
+                        */
+
+                       if (i > INT3400_THERMAL_CRITICAL)
                                return -EINVAL;
 
-                       priv->current_uuid_index = i;
-                       return count;
+                       priv->os_uuid_mask |= BIT(i);
+
+                       break;
                }
        }
 
-       return -EINVAL;
+       if (priv->os_uuid_mask) {
+               int cap, ret;
+
+               /*
+                * Capability bits:
+                * Bit 0: set to 1 to indicate DPTF is active
+                * Bi1 1: set to 1 to active cooling is supported by user space daemon
+                * Bit 2: set to 1 to passive cooling is supported by user space daemon
+                * Bit 3: set to 1 to critical trip is handled by user space daemon
+                */
+               cap = ((priv->os_uuid_mask << 1) | 0x01);
+               ret = int3400_thermal_run_osc(priv->adev->handle,
+                                             "b23ba85d-c8b7-3542-88de-8de2ffcfd698",
+                                             &cap);
+               if (ret)
+                       return ret;
+       }
+
+       return count;
 }
 
 static DEVICE_ATTR_RW(current_uuid);
        return result;
 }
 
-static int int3400_thermal_run_osc(acpi_handle handle,
-                               enum int3400_thermal_uuid uuid, bool enable)
-{
-       u32 ret, buf[2];
-       acpi_status status;
-       int result = 0;
-       struct acpi_osc_context context = {
-               .uuid_str = NULL,
-               .rev = 1,
-               .cap.length = 8,
-       };
-
-       if (uuid < 0 || uuid >= INT3400_THERMAL_MAXIMUM_UUID)
-               return -EINVAL;
-
-       context.uuid_str = int3400_thermal_uuids[uuid];
-
-       buf[OSC_QUERY_DWORD] = 0;
-       buf[OSC_SUPPORT_DWORD] = enable;
-
-       context.cap.pointer = buf;
-
-       status = acpi_run_osc(handle, &context);
-       if (ACPI_SUCCESS(status)) {
-               ret = *((u32 *)(context.ret.pointer + 4));
-               if (ret != enable)
-                       result = -EPERM;
-       } else
-               result = -EPERM;
-
-       kfree(context.ret.pointer);
-
-       return result;
-}
-
 static ssize_t odvp_show(struct kobject *kobj, struct kobj_attribute *attr,
                         char *buf)
 {
        if (!priv)
                return -EINVAL;
 
-       if (mode != thermal->mode)
+       if (mode != thermal->mode) {
+               int enabled;
+
+               if (priv->current_uuid_index < 0 ||
+                   priv->current_uuid_index >= INT3400_THERMAL_MAXIMUM_UUID)
+                       return -EINVAL;
+
+               enabled = (mode == THERMAL_DEVICE_ENABLED);
                result = int3400_thermal_run_osc(priv->adev->handle,
-                                               priv->current_uuid_index,
-                                               mode == THERMAL_DEVICE_ENABLED);
+                                                int3400_thermal_uuids[priv->current_uuid_index],
+                                                &enabled);
+       }
 
 
        evaluate_odvp(priv);