diff mbox

nfit: add Microsoft NVDIMM DSM command set to white list

Message ID 5cff32b5-7849-4e9d-0ba8-1f12e21814a9@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Stuart Hayes May 26, 2016, 4:38 p.m. UTC
Add the Microsoft _DSM command set to the white list of NVDIMM command sets.

This command set is documented at https://msdn.microsoft.com/library/windows/hardware/mt604741.

Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
---
  drivers/acpi/nfit.c        | 9 ++++++---
  drivers/acpi/nfit.h        | 4 ++++
  include/uapi/linux/ndctl.h | 1 +
  3 files changed, 11 insertions(+), 3 deletions(-)

Comments

Stuart Hayes June 8, 2016, 9:47 p.m. UTC | #1
On 5/26/2016 11:38 AM, Stuart Hayes wrote:
> Add the Microsoft _DSM command set to the white list of NVDIMM command sets.
>
> This command set is documented at https://msdn.microsoft.com/library/windows/hardware/mt604741.
>
> Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
> ---
>  drivers/acpi/nfit.c        | 9 ++++++---
>  drivers/acpi/nfit.h        | 4 ++++
>  include/uapi/linux/ndctl.h | 1 +
>  3 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
> index 2215fc8..48fc575 100644
> --- a/drivers/acpi/nfit.c
> +++ b/drivers/acpi/nfit.c
> @@ -1130,11 +1130,11 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
>      }
>
>      /*
> -     * Until standardization materializes we need to consider up to 3
> +     * Until standardization materializes we need to consider several
>       * different command sets.  Note, that checking for function0 (bit0)
>       * tells us if any commands are reachable through this uuid.
>       */
> -    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
> +    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_MSFT; i++)
>          if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
>              break;
>
> @@ -1150,7 +1150,9 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
>          dsm_mask = 0x1fe;
>          if (disable_vendor_specific)
>              dsm_mask &= ~(1 << 8);
> -    } else {
> +    } else if (nfit_mem->family == NVDIMM_FAMILY_MSFT)
> +        dsm_mask = 0xffffffff;
> +    else {
>          dev_err(dev, "unknown dimm command family\n");
>          nfit_mem->family = -1;
>          return force_enable_dimms ? 0 : -ENODEV;
> @@ -2692,6 +2694,7 @@ static __init int nfit_init(void)
>      acpi_str_to_uuid(UUID_NFIT_DIMM, nfit_uuid[NFIT_DEV_DIMM]);
>      acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE1, nfit_uuid[NFIT_DEV_DIMM_N_HPE1]);
>      acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE2, nfit_uuid[NFIT_DEV_DIMM_N_HPE2]);
> +    acpi_str_to_uuid(UUID_NFIT_DIMM_N_MSFT, nfit_uuid[NFIT_DEV_DIMM_N_MSFT]);
>
>      nfit_wq = create_singlethread_workqueue("nfit");
>      if (!nfit_wq)
> diff --git a/drivers/acpi/nfit.h b/drivers/acpi/nfit.h
> index 11cb383..f06fa91 100644
> --- a/drivers/acpi/nfit.h
> +++ b/drivers/acpi/nfit.h
> @@ -31,6 +31,9 @@
>  #define UUID_NFIT_DIMM_N_HPE1 "9002c334-acf3-4c0e-9642-a235f0d53bc6"
>  #define UUID_NFIT_DIMM_N_HPE2 "5008664b-b758-41a0-a03c-27c2f2d04f7e"
>
> +/* https://msdn.microsoft.com/library/windows/hardware/mt604741 */
> +#define UUID_NFIT_DIMM_N_MSFT "1ee68b36-d4bd-4a1a-9a16-4f8e53d46e05"
> +
>  #define ACPI_NFIT_MEM_FAILED_MASK (ACPI_NFIT_MEM_SAVE_FAILED \
>          | ACPI_NFIT_MEM_RESTORE_FAILED | ACPI_NFIT_MEM_FLUSH_FAILED \
>          | ACPI_NFIT_MEM_NOT_ARMED)
> @@ -40,6 +43,7 @@ enum nfit_uuids {
>      NFIT_DEV_DIMM = NVDIMM_FAMILY_INTEL,
>      NFIT_DEV_DIMM_N_HPE1 = NVDIMM_FAMILY_HPE1,
>      NFIT_DEV_DIMM_N_HPE2 = NVDIMM_FAMILY_HPE2,
> +    NFIT_DEV_DIMM_N_MSFT = NVDIMM_FAMILY_MSFT,
>      NFIT_SPA_VOLATILE,
>      NFIT_SPA_PM,
>      NFIT_SPA_DCR,
> diff --git a/include/uapi/linux/ndctl.h b/include/uapi/linux/ndctl.h
> index 309915f..ba5a8c7 100644
> --- a/include/uapi/linux/ndctl.h
> +++ b/include/uapi/linux/ndctl.h
> @@ -298,6 +298,7 @@ struct nd_cmd_pkg {
>  #define NVDIMM_FAMILY_INTEL 0
>  #define NVDIMM_FAMILY_HPE1 1
>  #define NVDIMM_FAMILY_HPE2 2
> +#define NVDIMM_FAMILY_MSFT 3
>
>  #define ND_IOCTL_CALL            _IOWR(ND_IOCTL, ND_CMD_CALL,\
>                      struct nd_cmd_pkg)

Is there a problem with this patch?  I never saw any responses, and wasn't sure if maybe I goofed.  Thanks!
Dan Williams June 8, 2016, 11:13 p.m. UTC | #2
On Wed, Jun 8, 2016 at 2:47 PM, Stuart Hayes <stuart.w.hayes@gmail.com> wrote:
>
>
> On 5/26/2016 11:38 AM, Stuart Hayes wrote:
>>
>> Add the Microsoft _DSM command set to the white list of NVDIMM command
>> sets.
>>
>> This command set is documented at
>> https://msdn.microsoft.com/library/windows/hardware/mt604741.
>>
>> Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
>> ---
>>  drivers/acpi/nfit.c        | 9 ++++++---
>>  drivers/acpi/nfit.h        | 4 ++++
>>  include/uapi/linux/ndctl.h | 1 +
>>  3 files changed, 11 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
>> index 2215fc8..48fc575 100644
>> --- a/drivers/acpi/nfit.c
>> +++ b/drivers/acpi/nfit.c
>> @@ -1130,11 +1130,11 @@ static int acpi_nfit_add_dimm(struct
>> acpi_nfit_desc *acpi_desc,
>>      }
>>
>>      /*
>> -     * Until standardization materializes we need to consider up to 3
>> +     * Until standardization materializes we need to consider several
>>       * different command sets.  Note, that checking for function0 (bit0)
>>       * tells us if any commands are reachable through this uuid.
>>       */
>> -    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
>> +    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_MSFT; i++)
>>          if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
>>              break;
>>
>> @@ -1150,7 +1150,9 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc
>> *acpi_desc,
>>          dsm_mask = 0x1fe;
>>          if (disable_vendor_specific)
>>              dsm_mask &= ~(1 << 8);
>> -    } else {
>> +    } else if (nfit_mem->family == NVDIMM_FAMILY_MSFT)
>> +        dsm_mask = 0xffffffff;
>> +    else {
>>          dev_err(dev, "unknown dimm command family\n");
>>          nfit_mem->family = -1;
>>          return force_enable_dimms ? 0 : -ENODEV;
>> @@ -2692,6 +2694,7 @@ static __init int nfit_init(void)
>>      acpi_str_to_uuid(UUID_NFIT_DIMM, nfit_uuid[NFIT_DEV_DIMM]);
>>      acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE1,
>> nfit_uuid[NFIT_DEV_DIMM_N_HPE1]);
>>      acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE2,
>> nfit_uuid[NFIT_DEV_DIMM_N_HPE2]);
>> +    acpi_str_to_uuid(UUID_NFIT_DIMM_N_MSFT,
>> nfit_uuid[NFIT_DEV_DIMM_N_MSFT]);
>>
>>      nfit_wq = create_singlethread_workqueue("nfit");
>>      if (!nfit_wq)
>> diff --git a/drivers/acpi/nfit.h b/drivers/acpi/nfit.h
>> index 11cb383..f06fa91 100644
>> --- a/drivers/acpi/nfit.h
>> +++ b/drivers/acpi/nfit.h
>> @@ -31,6 +31,9 @@
>>  #define UUID_NFIT_DIMM_N_HPE1 "9002c334-acf3-4c0e-9642-a235f0d53bc6"
>>  #define UUID_NFIT_DIMM_N_HPE2 "5008664b-b758-41a0-a03c-27c2f2d04f7e"
>>
>> +/* https://msdn.microsoft.com/library/windows/hardware/mt604741 */
>> +#define UUID_NFIT_DIMM_N_MSFT "1ee68b36-d4bd-4a1a-9a16-4f8e53d46e05"
>> +
>>  #define ACPI_NFIT_MEM_FAILED_MASK (ACPI_NFIT_MEM_SAVE_FAILED \
>>          | ACPI_NFIT_MEM_RESTORE_FAILED | ACPI_NFIT_MEM_FLUSH_FAILED \
>>          | ACPI_NFIT_MEM_NOT_ARMED)
>> @@ -40,6 +43,7 @@ enum nfit_uuids {
>>      NFIT_DEV_DIMM = NVDIMM_FAMILY_INTEL,
>>      NFIT_DEV_DIMM_N_HPE1 = NVDIMM_FAMILY_HPE1,
>>      NFIT_DEV_DIMM_N_HPE2 = NVDIMM_FAMILY_HPE2,
>> +    NFIT_DEV_DIMM_N_MSFT = NVDIMM_FAMILY_MSFT,
>>      NFIT_SPA_VOLATILE,
>>      NFIT_SPA_PM,
>>      NFIT_SPA_DCR,
>> diff --git a/include/uapi/linux/ndctl.h b/include/uapi/linux/ndctl.h
>> index 309915f..ba5a8c7 100644
>> --- a/include/uapi/linux/ndctl.h
>> +++ b/include/uapi/linux/ndctl.h
>> @@ -298,6 +298,7 @@ struct nd_cmd_pkg {
>>  #define NVDIMM_FAMILY_INTEL 0
>>  #define NVDIMM_FAMILY_HPE1 1
>>  #define NVDIMM_FAMILY_HPE2 2
>> +#define NVDIMM_FAMILY_MSFT 3
>>
>>  #define ND_IOCTL_CALL            _IOWR(ND_IOCTL, ND_CMD_CALL,\
>>                      struct nd_cmd_pkg)
>
>
> Is there a problem with this patch?  I never saw any responses, and wasn't
> sure if maybe I goofed.  Thanks!

Nope, looks ok.  I'll put it through unit testing and get it applied.
Pavel Machek June 19, 2016, 5:59 p.m. UTC | #3
Hi!

> >Add the Microsoft _DSM command set to the white list of NVDIMM command sets.
> >
> >This command set is documented at https://msdn.microsoft.com/library/windows/hardware/mt604741.
> >
> >Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
> >---
> > drivers/acpi/nfit.c        | 9 ++++++---
> > drivers/acpi/nfit.h        | 4 ++++
> > include/uapi/linux/ndctl.h | 1 +
> > 3 files changed, 11 insertions(+), 3 deletions(-)
> >
> >diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
> >index 2215fc8..48fc575 100644
> >--- a/drivers/acpi/nfit.c
> >+++ b/drivers/acpi/nfit.c
> >@@ -1130,11 +1130,11 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
> >     }
> >
> >     /*
> >-     * Until standardization materializes we need to consider up to 3
> >+     * Until standardization materializes we need to consider several
> >      * different command sets.  Note, that checking for function0 (bit0)
> >      * tells us if any commands are reachable through this uuid.
> >      */
> >-    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
> >+    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_MSFT; i++)
> >         if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))

Time to introduce NVDIMM_FAMILY_MAX?

> >@@ -1150,7 +1150,9 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
> >         dsm_mask = 0x1fe;
> >         if (disable_vendor_specific)
> >             dsm_mask &= ~(1 << 8);
> >-    } else {
> >+    } else if (nfit_mem->family == NVDIMM_FAMILY_MSFT)
> >+        dsm_mask = 0xffffffff;
> >+    else {
> >         dev_err(dev, "unknown dimm command family\n");
> >         nfit_mem->family = -1;
> >         return force_enable_dimms ? 0 : -ENODEV;

I'd really use {} around the if (), so that it is clear what the else belongs to.

									Pavel
Dan Williams June 20, 2016, 5:21 p.m. UTC | #4
On Sun, Jun 19, 2016 at 10:59 AM, Pavel Machek <pavel@ucw.cz> wrote:
> Hi!
>
>> >Add the Microsoft _DSM command set to the white list of NVDIMM command sets.
>> >
>> >This command set is documented at https://msdn.microsoft.com/library/windows/hardware/mt604741.
>> >
>> >Signed-off-by: Stuart Hayes <stuart.w.hayes@gmail.com>
>> >---
>> > drivers/acpi/nfit.c        | 9 ++++++---
>> > drivers/acpi/nfit.h        | 4 ++++
>> > include/uapi/linux/ndctl.h | 1 +
>> > 3 files changed, 11 insertions(+), 3 deletions(-)
>> >
>> >diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
>> >index 2215fc8..48fc575 100644
>> >--- a/drivers/acpi/nfit.c
>> >+++ b/drivers/acpi/nfit.c
>> >@@ -1130,11 +1130,11 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
>> >     }
>> >
>> >     /*
>> >-     * Until standardization materializes we need to consider up to 3
>> >+     * Until standardization materializes we need to consider several
>> >      * different command sets.  Note, that checking for function0 (bit0)
>> >      * tells us if any commands are reachable through this uuid.
>> >      */
>> >-    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
>> >+    for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_MSFT; i++)
>> >         if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
>
> Time to introduce NVDIMM_FAMILY_MAX?

I hope not.  This is the last of what can be considered "first
generation" DSM support, everything else should wait for
standardization.  I.e. no ongoing need to keep changing this line.

>
>> >@@ -1150,7 +1150,9 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
>> >         dsm_mask = 0x1fe;
>> >         if (disable_vendor_specific)
>> >             dsm_mask &= ~(1 << 8);
>> >-    } else {
>> >+    } else if (nfit_mem->family == NVDIMM_FAMILY_MSFT)
>> >+        dsm_mask = 0xffffffff;
>> >+    else {
>> >         dev_err(dev, "unknown dimm command family\n");
>> >         nfit_mem->family = -1;
>> >         return force_enable_dimms ? 0 : -ENODEV;
>
> I'd really use {} around the if (), so that it is clear what the else belongs to.

Sure, I can fix this up.  Stuart, no need to re-send.
diff mbox

Patch

diff --git a/drivers/acpi/nfit.c b/drivers/acpi/nfit.c
index 2215fc8..48fc575 100644
--- a/drivers/acpi/nfit.c
+++ b/drivers/acpi/nfit.c
@@ -1130,11 +1130,11 @@  static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
  	}
  
  	/*
-	 * Until standardization materializes we need to consider up to 3
+	 * Until standardization materializes we need to consider several
  	 * different command sets.  Note, that checking for function0 (bit0)
  	 * tells us if any commands are reachable through this uuid.
  	 */
-	for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
+	for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_MSFT; i++)
  		if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
  			break;
  
@@ -1150,7 +1150,9 @@  static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
  		dsm_mask = 0x1fe;
  		if (disable_vendor_specific)
  			dsm_mask &= ~(1 << 8);
-	} else {
+	} else if (nfit_mem->family == NVDIMM_FAMILY_MSFT)
+		dsm_mask = 0xffffffff;
+	else {
  		dev_err(dev, "unknown dimm command family\n");
  		nfit_mem->family = -1;
  		return force_enable_dimms ? 0 : -ENODEV;
@@ -2692,6 +2694,7 @@  static __init int nfit_init(void)
  	acpi_str_to_uuid(UUID_NFIT_DIMM, nfit_uuid[NFIT_DEV_DIMM]);
  	acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE1, nfit_uuid[NFIT_DEV_DIMM_N_HPE1]);
  	acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE2, nfit_uuid[NFIT_DEV_DIMM_N_HPE2]);
+	acpi_str_to_uuid(UUID_NFIT_DIMM_N_MSFT, nfit_uuid[NFIT_DEV_DIMM_N_MSFT]);
  
  	nfit_wq = create_singlethread_workqueue("nfit");
  	if (!nfit_wq)
diff --git a/drivers/acpi/nfit.h b/drivers/acpi/nfit.h
index 11cb383..f06fa91 100644
--- a/drivers/acpi/nfit.h
+++ b/drivers/acpi/nfit.h
@@ -31,6 +31,9 @@ 
  #define UUID_NFIT_DIMM_N_HPE1 "9002c334-acf3-4c0e-9642-a235f0d53bc6"
  #define UUID_NFIT_DIMM_N_HPE2 "5008664b-b758-41a0-a03c-27c2f2d04f7e"
  
+/* https://msdn.microsoft.com/library/windows/hardware/mt604741 */
+#define UUID_NFIT_DIMM_N_MSFT "1ee68b36-d4bd-4a1a-9a16-4f8e53d46e05"
+
  #define ACPI_NFIT_MEM_FAILED_MASK (ACPI_NFIT_MEM_SAVE_FAILED \
  		| ACPI_NFIT_MEM_RESTORE_FAILED | ACPI_NFIT_MEM_FLUSH_FAILED \
  		| ACPI_NFIT_MEM_NOT_ARMED)
@@ -40,6 +43,7 @@  enum nfit_uuids {
  	NFIT_DEV_DIMM = NVDIMM_FAMILY_INTEL,
  	NFIT_DEV_DIMM_N_HPE1 = NVDIMM_FAMILY_HPE1,
  	NFIT_DEV_DIMM_N_HPE2 = NVDIMM_FAMILY_HPE2,
+	NFIT_DEV_DIMM_N_MSFT = NVDIMM_FAMILY_MSFT,
  	NFIT_SPA_VOLATILE,
  	NFIT_SPA_PM,
  	NFIT_SPA_DCR,
diff --git a/include/uapi/linux/ndctl.h b/include/uapi/linux/ndctl.h
index 309915f..ba5a8c7 100644
--- a/include/uapi/linux/ndctl.h
+++ b/include/uapi/linux/ndctl.h
@@ -298,6 +298,7 @@  struct nd_cmd_pkg {
  #define NVDIMM_FAMILY_INTEL 0
  #define NVDIMM_FAMILY_HPE1 1
  #define NVDIMM_FAMILY_HPE2 2
+#define NVDIMM_FAMILY_MSFT 3
  
  #define ND_IOCTL_CALL			_IOWR(ND_IOCTL, ND_CMD_CALL,\
  					struct nd_cmd_pkg)