On 3/29/2017 6:26 PM, Elliott, Robert (Persistent Memory) wrote:
-----Original Message-----
From: Linux-nvdimm [mailto:[email protected]] On Behalf
Of [email protected]
Sent: Wednesday, March 29, 2017 4:41 PM
To: [email protected]; [email protected]
Subject: RE: [PATCH v2] libndctl: add support for the MSFT family of DSM
functions

-----Original Message-----
From: Dan Williams [mailto:[email protected]]

From: Lijun Pan <[email protected]>

This patch retrieves the health data from NVDIMM-N via
the MSFT _DSM function[1], following JESD245A[2] standards.
Now 'ndctl list --dimms --health --idle' could work
on MSFT type NVDIMM-N, but limited to health_state,
temperature_celsius, and life_used_percentage.

...
Output is something like,

  "health":{
    "health_state":"ok",
    "temperature_celsius":193.750000,
    "life_used_percentage":1
  }

If the BIOS returns a value say 45.75, how can it be represented in (__u16)
instead of using a 'double' type? I think the ((__u16) temp & 0x0FFC) already
represents a temperature in 1/16 Celsius granularity. No need to multiple it
by
16 again.

Below I quote the section 7.8 of JESD245.pdf
Bit 3 has a resolution of  1/2 Celsius,
Bit 2 has a resolution of 1/4 Celsius,
Bit 1 has 1/8 Celsius, but is reserved, so I assume it be zero,
Bit 0 has 1/16 Celsius, but is reserved, so I assume it be zero.

((__u16) temp & 0x0FFC) will only get the bit11 - bit 0. This presents the
1/16 Celsius resolution, kind of left shifted 4 bits.
So we don't need to do
'return CMD_MSFT_SMART(cmd)->temp * 16;' again.

==== = quotation starts  =====
"
Temperature measurement shall have a minimum resolution of 0.25 Celsius.
Registers containing measured temperature value shall be 16-bits and report
temperature as a 10-bit value based on the following definition.

Table 3: Temperature value bit definition
Bit15   Bit14   Bit13   Bit12   Bit11   Bit10   Bit9    Bit8
Reserved        Reserved        Reserved        Reserved        128     64
        32      16
Bit7    Bit6    Bit5    Bit4    Bit3    Bit2    Bit1    Bit0
8       4       2       1       0.5     0.25    Reserved        Reserved

Examples:

A temperature value of 10.5 Celsius is represented as 0000000010101000b.

A temperature value of 64.75 Celsius is represented as 0000010000001100b.
"

==== quotation ends ========


Lijun


...so users know what to expect. With that change and addressing
Linda's comment about the temperature multiplier I think we're good to
go.


You should plan to support temperatures compliant with JESD21C
Page 4.1.6-2 (TSE2004 SPD EEPROM with Temperature Sensor), which include:
* a sign bit to support negative temperatures (in bit 12)
* 0.125 and 0.0625 degrees C precision (i.e., bits 1 and 0 are defined)

Industrial Grade and Automotive Grade components operate down to
-40 degrees C, so negative values will be required.

The importance of extra precision is a but fuzzy given that sensor
accuracy varies from +/- 1 to +/- 3 degrees C (depending on the
temperature range).  A software API should pass along all the
available information, though.

Interesting, but until someone changes their DSM spec, none of that matters.
This patch is supposed to be implementing the MSFT DSM spec.

-- ljk


---
Robert Elliott, HPE Persistent Memory


_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm

Reply via email to