On 04/28/16 20:07, Tom Yan wrote:
> Instead of requiring a serial of arbitrary length/format, I think a
> WWN/EUI-64 is more useful/important,
WWN/EUI-64 is not "more important". Section "7.9 Unique Identifier" in
the NVMe spec (Revision 1.2a, October 23, 2015) says that the serial
number is mandatory, while implementing an EUI-64 is optional. Let me
quote it all (emphases mine):
> 7.9 Unique Identifier
>
> Information is returned in the Identify Controller data structure that
> may be used to construct a unique identifier. Specifically, the PCI
> Vendor ID, *Serial Number*, and Model Number fields when combined
> shall form a globally unique value that identifies the NVM subsystem.
> The mechanism used by the vendor to assign Serial Number and Model
> Number values to ensure uniqueness is *outside the scope* of this
> specification.
>
> An NVM subsystem may contain multiple controllers. All of the
> controllers that make up an NVM subsystem share the same NVM subsystem
> identifier (i.e., PCI Vendor ID, Serial Number, and Model Number). The
> Controller ID (CNTLID) value returned in the Identify Controller data
> structure may be used to uniquely identify a controller within an NVM
> subsystem. The Controller ID value when combined with the NVM
> subsystem identifier forms a globally unique value that identifies the
> controller. The mechanism used by the vendor to assign Controller ID
> values is outside the scope of this specification.
>
> The Identify Namespace data structure contains the IEEE Extended
> Unique Identifier (EUI64) and the Namespace Globally Unique Identifier
> (NGUID) fields. EUI64 is an 8-byte EUI-64 identifier and NGUID is a
> 16-byte identifier based on EUI-64. When creating a namespace, the
> controller specifies a globally unique value in the EUI64 or NGUID
> field (the controller may optionally specify a globally unique value
> in both fields). In cases where the 64-bit EUI64 field is unable to
> ensure a globally unique namespace identifier, the EUI64 field shall
> be cleared to 0h. *When not implemented*, these fields contain a value
> of 0h.
The QEMU device model conforms to this:
- The serial number is mandatory, and its generation is unspecified.
(First paragraph quoted.) Accordingly, QEMU forces the user to generate
and provide a serial number.
- The EUI64 is optional (third paragraph); it shall be zero-filled when
not implemented. QEMU conforms.
> not to mention that the WWN/EUI-64
> can pretty much always be used as the serial at the same time.
>
> Unlike Linux, Windows consider the WWN/EUI-64 as the "serial":
That's Windows's problem. Not the first (and not the last) occasion
where Microsoft interpret a specification creatively.
The UEFI specification (version 2.6, January 2016) says in "9.3.5.22 NVM
Express namespace messaging device path node":
Mnemonic: IEEE Extended Unique Identifier
Byte Offset: 8
Byte Length: 8
Description: This field contains the IEEE Extended Unique Identifier (EUI-64). Devices without an EUI-64 value
must initialize this field with a value of 0.
QEMU conforms.
The device paths visible on your OVMF screenshots are distinguishable
from each other by their Pci() device path nodes. There is no collision.
The point being: if QEMU grows a capability to store a nonzero EUI64,
and that EUI64 is reflected in the OpenFirmware device path that is
placed into the "bootorder" fw_cfg file, then OVMF will parse it just
fine. However, QEMU is not required to grow such a capability, according
to the NVMe and UEFI specifications. In practice, multiple NVMe devices
can be distinguished from each other by their different PCI B/D/F locations.
On 04/28/16 20:07, Tom Yan wrote:
> Instead of requiring a serial of arbitrary length/format, I think a
> WWN/EUI-64 is more useful/important,
WWN/EUI-64 is not "more important". Section "7.9 Unique Identifier" in
the NVMe spec (Revision 1.2a, October 23, 2015) says that the serial
number is mandatory, while implementing an EUI-64 is optional. Let me
quote it all (emphases mine):
> 7.9 Unique Identifier
>
> Information is returned in the Identify Controller data structure that
> may be used to construct a unique identifier. Specifically, the PCI
> Vendor ID, *Serial Number*, and Model Number fields when combined
> shall form a globally unique value that identifies the NVM subsystem.
> The mechanism used by the vendor to assign Serial Number and Model
> Number values to ensure uniqueness is *outside the scope* of this
> specification.
>
> An NVM subsystem may contain multiple controllers. All of the
> controllers that make up an NVM subsystem share the same NVM subsystem
> identifier (i.e., PCI Vendor ID, Serial Number, and Model Number). The
> Controller ID (CNTLID) value returned in the Identify Controller data
> structure may be used to uniquely identify a controller within an NVM
> subsystem. The Controller ID value when combined with the NVM
> subsystem identifier forms a globally unique value that identifies the
> controller. The mechanism used by the vendor to assign Controller ID
> values is outside the scope of this specification.
>
> The Identify Namespace data structure contains the IEEE Extended
> Unique Identifier (EUI64) and the Namespace Globally Unique Identifier
> (NGUID) fields. EUI64 is an 8-byte EUI-64 identifier and NGUID is a
> 16-byte identifier based on EUI-64. When creating a namespace, the
> controller specifies a globally unique value in the EUI64 or NGUID
> field (the controller may optionally specify a globally unique value
> in both fields). In cases where the 64-bit EUI64 field is unable to
> ensure a globally unique namespace identifier, the EUI64 field shall
> be cleared to 0h. *When not implemented*, these fields contain a value
> of 0h.
The QEMU device model conforms to this:
- The serial number is mandatory, and its generation is unspecified.
(First paragraph quoted.) Accordingly, QEMU forces the user to generate
and provide a serial number.
- The EUI64 is optional (third paragraph); it shall be zero-filled when
not implemented. QEMU conforms.
> not to mention that the WWN/EUI-64
> can pretty much always be used as the serial at the same time.
>
> Unlike Linux, Windows consider the WWN/EUI-64 as the "serial":
That's Windows's problem. Not the first (and not the last) occasion
where Microsoft interpret a specification creatively.
> "C:\Windows\ system32> sg_vpd -i PD1 31698 system32> sg_vpd -p sn PD1 0000_0000. " /bugs.launchpad .net/qemu/ +bug/1576347/ +attachment/ 4650553/ +files/ 02.PNG) /bugs.launchpad .net/qemu/ +bug/1576347/ +attachment/ 4650554/ +files/ 03.png /bugs.launchpad .net/qemu/ +bug/1576347/ +attachment/ 4650555/ +files/ 04.png
> Device Identification VPD page:
> Addressed logical unit:
> designator type: SCSI name string, code set: UTF-8
> SCSI name string:
> 8086QEMU NVMe Ctrl 00012BDAC262CF8
>
> C:\Windows\
> Unit serial number VPD page:
> Unit serial number: 0000_0000_
>
> (https:/
>
> UEFI also makes use of the WWN/EUI-64 to generate boot entries for NVMe devices:
> https:/
> https:/
The UEFI specification (version 2.6, January 2016) says in "9.3.5.22 NVM
Express namespace messaging device path node":
Mnemonic: IEEE Extended Unique Identifier
Identifier (EUI-64). Devices without an EUI-64 value
Byte Offset: 8
Byte Length: 8
Description: This field contains the IEEE Extended Unique
must initialize this field with a value of 0.
QEMU conforms.
The device paths visible on your OVMF screenshots are distinguishable
from each other by their Pci() device path nodes. There is no collision.
I recommend reviewing the following commits:
http:// git.qemu. org/?p= qemu.git; a=commitdiff; h=a907ec52cc1a /github. com/tianocore/ edk2/commit/ d7c0dfaef26c
https:/
The point being: if QEMU grows a capability to store a nonzero EUI64,
and that EUI64 is reflected in the OpenFirmware device path that is
placed into the "bootorder" fw_cfg file, then OVMF will parse it just
fine. However, QEMU is not required to grow such a capability, according
to the NVMe and UEFI specifications. In practice, multiple NVMe devices
can be distinguished from each other by their different PCI B/D/F locations.
Thanks,
Laszlo