The firmware can be initialized either by using its own non-volatile storage or
 the OS can manage the NV storage for the firmware using the module parameter
-``init_ex_path``. The file specified by ``init_ex_path`` must exist. To create
-a new NV storage file allocate the file with 32KB bytes of 0xFF as required by
-the SEV spec.
+``init_ex_path``. If the file specified by ``init_ex_path`` does not exist or
+is invalid, the OS will create or override the file with output from PSP.
 
 Returns: 0 on success, -negative on error
 
 
        if (IS_ERR(fp)) {
                int ret = PTR_ERR(fp);
 
-               dev_err(sev->dev,
-                       "SEV: could not open %s for read, error %d\n",
-                       init_ex_path, ret);
+               if (ret == -ENOENT) {
+                       dev_info(sev->dev,
+                               "SEV: %s does not exist and will be created later.\n",
+                               init_ex_path);
+                       ret = 0;
+               } else {
+                       dev_err(sev->dev,
+                               "SEV: could not open %s for read, error %d\n",
+                               init_ex_path, ret);
+               }
                return ret;
        }
 
        nread = kernel_read(fp, sev_init_ex_buffer, NV_LENGTH, NULL);
        if (nread != NV_LENGTH) {
-               dev_err(sev->dev,
-                       "SEV: failed to read %u bytes to non volatile memory area, ret %ld\n",
+               dev_info(sev->dev,
+                       "SEV: could not read %u bytes to non volatile memory area, ret %ld\n",
                        NV_LENGTH, nread);
-               return -EIO;
        }
 
        dev_dbg(sev->dev, "SEV: read %ld bytes from NV file\n", nread);
 static int __sev_init_ex_locked(int *error)
 {
        struct sev_data_init_ex data;
-       int ret;
 
        memset(&data, 0, sizeof(data));
        data.length = sizeof(data);
        data.nv_address = __psp_pa(sev_init_ex_buffer);
        data.nv_len = NV_LENGTH;
 
-       ret = sev_read_init_ex_file();
-       if (ret)
-               return ret;
-
        if (sev_es_tmr) {
                /*
                 * Do not include the encryption mask on the physical
 {
        struct psp_device *psp = psp_master;
        struct sev_device *sev;
-       int rc, psp_ret = -1;
+       int rc = 0, psp_ret = -1;
        int (*init_function)(int *error);
 
        if (!psp || !psp->sev_data)
        if (sev->state == SEV_STATE_INIT)
                return 0;
 
-       init_function = sev_init_ex_buffer ? __sev_init_ex_locked :
-                       __sev_init_locked;
+       if (sev_init_ex_buffer) {
+               init_function = __sev_init_ex_locked;
+               rc = sev_read_init_ex_file();
+               if (rc)
+                       return rc;
+       } else {
+               init_function = __sev_init_locked;
+       }
+
        rc = init_function(&psp_ret);
        if (rc && psp_ret == SEV_RET_SECURE_DATA_INVALID) {
                /*