Starting from linux kernel 6.0, the ability to write to the NVRAM has been lost on T2 Macs.
This has been observed especially during installation of boot loaders like GRUB, causing errors as shown :-
Installing for x86_64-efi platform.
grub-install: warning: Cannot set EFI variable Boot0001.
grub-install: warning: efivarfs_set_variable: writing to fd 7 failed: Invalid argument.
grub-install: warning: _efi_set_variable_mode: ops->set_variable() failed: Invalid argument.
grub-install: error: failed to register the EFI boot entry: Invalid argument.
I couldn't find any relevant error in journalctl though, but I still am posting my journalctl just in case I missed any error.
https://gist.github.com/AdityaGarg8/da7a9a2c891f5b2f68f71dc0d0e77f9a
Regards
Aditya
Hello Aditya
On Wed, 19 Oct 2022 at 21:26, Aditya Garg <[email protected]> wrote:
>
> Starting from linux kernel 6.0, the ability to write to the NVRAM has been lost on T2 Macs.
>
> This has been observed especially during installation of boot loaders like GRUB, causing errors as shown :-
>
> Installing for x86_64-efi platform.
> grub-install: warning: Cannot set EFI variable Boot0001.
> grub-install: warning: efivarfs_set_variable: writing to fd 7 failed: Invalid argument.
> grub-install: warning: _efi_set_variable_mode: ops->set_variable() failed: Invalid argument.
> grub-install: error: failed to register the EFI boot entry: Invalid argument.
>
Thanks for the report. I did identify an issue in some refactoring
work of the efivars layer that went into 6.0
Can you please check whether the change below fixes the issue for you?
diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
index dd74d2ad3184..35edba93cf14 100644
--- a/drivers/firmware/efi/vars.c
+++ b/drivers/firmware/efi/vars.c
@@ -209,7 +209,7 @@ efivar_set_variable_blocking(efi_char16_t *name,
efi_guid_t *vendor,
if (data_size > 0) {
status = check_var_size(attr, data_size +
ucs2_strsize(name, 1024));
- if (status != EFI_SUCCESS)
+ if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
return status;
}
return __efivars->ops->set_variable(name, vendor, attr,
data_size, data);
@@ -242,7 +242,7 @@ efi_status_t
efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
if (data_size > 0) {
status = check_var_size_nonblocking(attr, data_size +
ucs2_strsize(name, 1024));
- if (status != EFI_SUCCESS)
+ if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
return status;
}
return setvar(name, vendor, attr, data_size, data);
Hi Ard
> On 20-Oct-2022, at 2:53 AM, Ard Biesheuvel <[email protected]> wrote:
>
> Hello Aditya
>
> Thanks for the report. I did identify an issue in some refactoring
> work of the efivars layer that went into 6.0
>
> Can you please check whether the change below fixes the issue for you?
The patch given below fixes the issue for me.
>
> diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
> index dd74d2ad3184..35edba93cf14 100644
> --- a/drivers/firmware/efi/vars.c
> +++ b/drivers/firmware/efi/vars.c
> @@ -209,7 +209,7 @@ efivar_set_variable_blocking(efi_char16_t *name,
> efi_guid_t *vendor,
> if (data_size > 0) {
> status = check_var_size(attr, data_size +
> ucs2_strsize(name, 1024));
> - if (status != EFI_SUCCESS)
> + if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
> return status;
> }
> return __efivars->ops->set_variable(name, vendor, attr,
> data_size, data);
> @@ -242,7 +242,7 @@ efi_status_t
> efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
> if (data_size > 0) {
> status = check_var_size_nonblocking(attr, data_size +
>
> ucs2_strsize(name, 1024));
> - if (status != EFI_SUCCESS)
> + if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
> return status;
> }
> return setvar(name, vendor, attr, data_size, data);
Thanks
Aditya
On Wed, 26 Oct 2022 at 23:18, Aditya Garg <[email protected]> wrote:
>
> Hi Ard
>
> Just a friendly reminder to get updates on the patch you asked me to test, as it seems to fix my issue.
>
This should be fixed now in v6.1-rc2
> > Thanks for the report. I did identify an issue in some refactoring
> > work of the efivars layer that went into 6.0
> >
> > Can you please check whether the change below fixes the issue for you?
> >
> > diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
> > index dd74d2ad3184..35edba93cf14 100644
> > --- a/drivers/firmware/efi/vars.c
> > +++ b/drivers/firmware/efi/vars.c
> > @@ -209,7 +209,7 @@ efivar_set_variable_blocking(efi_char16_t *name,
> > efi_guid_t *vendor,
> > if (data_size > 0) {
> > status = check_var_size(attr, data_size +
> > ucs2_strsize(name, 1024));
> > - if (status != EFI_SUCCESS)
> > + if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
> > return status;
> > }
> > return __efivars->ops->set_variable(name, vendor, attr,
> > data_size, data);
> > @@ -242,7 +242,7 @@ efi_status_t
> > efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
> > if (data_size > 0) {
> > status = check_var_size_nonblocking(attr, data_size +
> >
> > ucs2_strsize(name, 1024));
> > - if (status != EFI_SUCCESS)
> > + if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
> > return status;
> > }
> > return setvar(name, vendor, attr, data_size, data);
>
> Regards
> Aditya
Hi Ard
Just a friendly reminder to get updates on the patch you asked me to test, as it seems to fix my issue.
> Thanks for the report. I did identify an issue in some refactoring
> work of the efivars layer that went into 6.0
>
> Can you please check whether the change below fixes the issue for you?
>
> diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
> index dd74d2ad3184..35edba93cf14 100644
> --- a/drivers/firmware/efi/vars.c
> +++ b/drivers/firmware/efi/vars.c
> @@ -209,7 +209,7 @@ efivar_set_variable_blocking(efi_char16_t *name,
> efi_guid_t *vendor,
> if (data_size > 0) {
> status = check_var_size(attr, data_size +
> ucs2_strsize(name, 1024));
> - if (status != EFI_SUCCESS)
> + if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
> return status;
> }
> return __efivars->ops->set_variable(name, vendor, attr,
> data_size, data);
> @@ -242,7 +242,7 @@ efi_status_t
> efivar_set_variable_locked(efi_char16_t *name, efi_guid_t *vendor,
> if (data_size > 0) {
> status = check_var_size_nonblocking(attr, data_size +
>
> ucs2_strsize(name, 1024));
> - if (status != EFI_SUCCESS)
> + if (status != EFI_SUCCESS && status != EFI_UNSUPPORTED)
> return status;
> }
> return setvar(name, vendor, attr, data_size, data);
Regards
Aditya
Hi Ard
>
> This should be fixed now in v6.1-rc2
I tested 6.1-rc2 but the issue isn’t fixed yet.
I guess you had applied the patch in the link below to fix the issue right?
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/firmware/efi?h=v6.1-rc2&id=8a254d90a77580244ec57e82bca7eb65656cc167
Here is the build log of the kernel I compiled, just in case you need :-
https://github.com/t2linux/T2-Ubuntu-Kernel/actions/runs/3319113145/jobs/5483863180
Although if I apply the patch you sent me on 6.1-rc2, the issue gets fixed again.