return ret;
 }
 
+static int sev_ioctl_do_get_id2(struct sev_issue_cmd *argp)
+{
+       struct sev_user_data_get_id2 input;
+       struct sev_data_get_id *data;
+       void *id_blob = NULL;
+       int ret;
+
+       /* SEV GET_ID is available from SEV API v0.16 and up */
+       if (!SEV_VERSION_GREATER_OR_EQUAL(0, 16))
+               return -ENOTSUPP;
+
+       if (copy_from_user(&input, (void __user *)argp->data, sizeof(input)))
+               return -EFAULT;
+
+       /* Check if we have write access to the userspace buffer */
+       if (input.address &&
+           input.length &&
+           !access_ok(input.address, input.length))
+               return -EFAULT;
+
+       data = kzalloc(sizeof(*data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       if (input.address && input.length) {
+               id_blob = kmalloc(input.length, GFP_KERNEL);
+               if (!id_blob) {
+                       kfree(data);
+                       return -ENOMEM;
+               }
+
+               data->address = __psp_pa(id_blob);
+               data->len = input.length;
+       }
+
+       ret = __sev_do_cmd_locked(SEV_CMD_GET_ID, data, &argp->error);
+
+       /*
+        * Firmware will return the length of the ID value (either the minimum
+        * required length or the actual length written), return it to the user.
+        */
+       input.length = data->len;
+
+       if (copy_to_user((void __user *)argp->data, &input, sizeof(input))) {
+               ret = -EFAULT;
+               goto e_free;
+       }
+
+       if (id_blob) {
+               if (copy_to_user((void __user *)input.address,
+                                id_blob, data->len)) {
+                       ret = -EFAULT;
+                       goto e_free;
+               }
+       }
+
+e_free:
+       kfree(id_blob);
+       kfree(data);
+
+       return ret;
+}
+
 static int sev_ioctl_do_get_id(struct sev_issue_cmd *argp)
 {
        struct sev_data_get_id *data;
                ret = sev_ioctl_do_pdh_export(&input);
                break;
        case SEV_GET_ID:
+               pr_warn_once("SEV_GET_ID command is deprecated, use SEV_GET_ID2\n");
                ret = sev_ioctl_do_get_id(&input);
                break;
+       case SEV_GET_ID2:
+               ret = sev_ioctl_do_get_id2(&input);
+               break;
        default:
                ret = -EINVAL;
                goto out;
 
  *
  * Author: Brijesh Singh <brijesh.singh@amd.com>
  *
- * SEV spec 0.14 is available at:
- * http://support.amd.com/TechDocs/55766_SEV-KM API_Specification.pdf
+ * SEV API spec is available at https://developer.amd.com/sev
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
 
  *
  * Author: Brijesh Singh <brijesh.singh@amd.com>
  *
- * SEV spec 0.14 is available at:
- * http://support.amd.com/TechDocs/55766_SEV-KM%20API_Specification.pdf
+ * SEV API specification is available at: https://developer.amd.com/sev/
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
        SEV_PDH_GEN,
        SEV_PDH_CERT_EXPORT,
        SEV_PEK_CERT_IMPORT,
-       SEV_GET_ID,
+       SEV_GET_ID,     /* This command is deprecated, use SEV_GET_ID2 */
+       SEV_GET_ID2,
 
        SEV_MAX,
 };
 } __packed;
 
 /**
- * struct sev_user_data_get_id - GET_ID command parameters
+ * struct sev_user_data_get_id - GET_ID command parameters (deprecated)
  *
  * @socket1: Buffer to pass unique ID of first socket
  * @socket2: Buffer to pass unique ID of second socket
        __u8 socket2[64];                       /* Out */
 } __packed;
 
+/**
+ * struct sev_user_data_get_id2 - GET_ID command parameters
+ * @address: Buffer to store unique ID
+ * @length: length of the unique ID
+ */
+struct sev_user_data_get_id2 {
+       __u64 address;                          /* In */
+       __u32 length;                           /* In/Out */
+} __packed;
+
 /**
  * struct sev_issue_cmd - SEV ioctl parameters
  *