| # -*- Mode: Python -*- | |
| # vim: filetype=python | |
| ## | |
| # *********** | |
| # CXL devices | |
| # *********** | |
| ## | |
| ## | |
| # @CxlEventLog: | |
| # CXL has a number of separate event logs for different types of | |
| # events. Each such event log is handled and signaled | |
| # independently. | |
| # | |
| # @informational: Information Event Log | |
| # | |
| # @warning: Warning Event Log | |
| # | |
| # @failure: Failure Event Log | |
| # | |
| # @fatal: Fatal Event Log | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'enum': 'CxlEventLog', | |
| 'data': ['informational', | |
| 'warning', | |
| 'failure', | |
| 'fatal'] | |
| } | |
| ## | |
| # @CXLCommonEventBase: | |
| # Common event base for a CXL Event (CXL r3.2 8.2.10.2.1 Table | |
| # 8-55 Common Event Record Format). | |
| # | |
| # @path: CXL type 3 device canonical QOM path | |
| # | |
| # @log: event log to add the event to | |
| # | |
| # @flags: Event Record Flags. See CXL r3.2 Table 8-55 Common Event | |
| # Record Format, Event Record Flags for subfield definitions. | |
| # | |
| # @maint-op-class: Maintenance operation class the device requests to | |
| # initiate. | |
| # | |
| # @maint-op-subclass: Maintenance operation subclass the device | |
| # requests to initiate. | |
| # | |
| # @ld-id: Logical Device (LD) ID of LD from where the event | |
| # originated. | |
| # | |
| # @head-id: ID of the device head from where the event originated. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'struct': 'CXLCommonEventBase', | |
| 'data': { 'path': 'str', 'log': 'CxlEventLog', 'flags': 'uint32', | |
| '*maint-op-class':'uint8', '*maint-op-subclass':'uint8', | |
| '*ld-id':'uint16', '*head-id':'uint8' } } | |
| ## | |
| # @CXLGeneralMediaEvent: | |
| # Event record for a General Media Event (CXL r3.2 8.2.10.2.1.1). | |
| # | |
| # @dpa: Device Physical Address (relative to @path device). Note | |
| # lower bits include some flags. See CXL r3.2 Table 8-57 General | |
| # Media Event Record, Physical Address. | |
| # | |
| # @descriptor: Memory Event Descriptor with additional memory event | |
| # information. See CXL r3.2 Table 8-57 General Media Event | |
| # Record, Memory Event Descriptor for bit definitions. | |
| # | |
| # @type: Type of memory event that occurred. See CXL r3.2 Table 8-57 | |
| # General Media Event Record, Memory Event Type for possible | |
| # values. | |
| # | |
| # @transaction-type: Type of first transaction that caused the event | |
| # to occur. See CXL r3-2 Table 8-57 General Media Event Record, | |
| # Transaction Type for possible values. | |
| # | |
| # @channel: The channel of the memory event location. A channel is an | |
| # interface that can be independently accessed for a transaction. | |
| # | |
| # @rank: The rank of the memory event location. A rank is a set of | |
| # memory devices on a channel that together execute a transaction. | |
| # | |
| # @device: Bitmask that represents all devices in the rank associated | |
| # with the memory event location. | |
| # | |
| # @component-id: Device specific component identifier for the event. | |
| # May describe a field replaceable sub-component of the device. | |
| # | |
| # @is-comp-id-pldm: This flag specifies whether the device-specific | |
| # component identifier format follows PLDM. | |
| # | |
| # @cme-ev-flags: Advanced programmable corrected memory error | |
| # threshold event flags. | |
| # | |
| # @cme-count: Corrected memory error count at event. | |
| # | |
| # @sub-type: Memory event sub-type. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'struct': 'CXLGeneralMediaEvent', | |
| 'base': 'CXLCommonEventBase', | |
| 'data': { 'dpa': 'uint64', 'descriptor': 'uint8', | |
| 'type': 'uint8', 'transaction-type': 'uint8', | |
| '*channel': 'uint8', '*rank': 'uint8', | |
| '*device': 'uint32', '*component-id': 'str', | |
| '*is-comp-id-pldm':'bool', | |
| '*cme-ev-flags':'uint8', '*cme-count':'uint32', | |
| 'sub-type':'uint8' } } | |
| ## | |
| # @cxl-inject-general-media-event: | |
| # Inject an event record for a General Media Event (CXL r3.2 | |
| # 8.2.10.2.1.1). This event type is reported via one of the event | |
| # logs specified via the log parameter. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'command': 'cxl-inject-general-media-event', | |
| 'data': 'CXLGeneralMediaEvent' } | |
| ## | |
| # @CXLDRAMEvent: | |
| # Event record for a DRAM Event (CXL r3.2 8.2.10.2.1.2). | |
| # | |
| # @dpa: Device Physical Address (relative to @path device). Note | |
| # lower bits include some flags. See CXL r3.2 Table 8-58 DRAM | |
| # Event Record, Physical Address. | |
| # | |
| # @descriptor: Memory Event Descriptor with additional memory event | |
| # information. See CXL r3.2 Table 8-58 DRAM Event Record, Memory | |
| # Event Descriptor for bit definitions. | |
| # | |
| # @type: Type of memory event that occurred. See CXL r3.2 Table 8-58 | |
| # DRAM Event Record, Memory Event Type for possible values. | |
| # | |
| # @transaction-type: Type of first transaction that caused the event | |
| # to occur. See CXL r3.2 Table 8-58 DRAM Event Record, | |
| # Transaction Type for possible values. | |
| # | |
| # @channel: The channel of the memory event location. A channel is an | |
| # interface that can be independently accessed for a transaction. | |
| # | |
| # @rank: The rank of the memory event location. A rank is a set of | |
| # memory devices on a channel that together execute a transaction. | |
| # | |
| # @nibble-mask: Identifies one or more nibbles that the error affects | |
| # | |
| # @bank-group: Bank group of the memory event location, incorporating | |
| # a number of banks. | |
| # | |
| # @bank: Bank of the memory event location. A single bank is accessed | |
| # per read or write of the memory. | |
| # | |
| # @row: Row address within the DRAM. | |
| # | |
| # @column: Column address within the DRAM. | |
| # | |
| # @correction-mask: Bits within each nibble. Used in order of bits | |
| # set in the nibble-mask. Up to 4 nibbles may be covered. | |
| # | |
| # @component-id: Device specific component identifier for the event. | |
| # May describe a field replaceable sub-component of the device. | |
| # | |
| # @is-comp-id-pldm: This flag specifies whether the device-specific | |
| # component identifier format follows PLDM. | |
| # | |
| # @sub-channel: The sub-channel of the memory event location. | |
| # | |
| # @cme-ev-flags: Advanced programmable corrected memory error | |
| # threshold event flags. | |
| # | |
| # @cvme-count: Corrected volatile memory error count at event. | |
| # | |
| # @sub-type: Memory event sub-type. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'struct': 'CXLDRAMEvent', | |
| 'base': 'CXLCommonEventBase', | |
| 'data': { 'dpa': 'uint64', 'descriptor': 'uint8', | |
| 'type': 'uint8', 'transaction-type': 'uint8', | |
| '*channel': 'uint8', '*rank': 'uint8', '*nibble-mask': 'uint32', | |
| '*bank-group': 'uint8', '*bank': 'uint8', '*row': 'uint32', | |
| '*column': 'uint16', '*correction-mask': [ 'uint64' ], | |
| '*component-id': 'str', '*is-comp-id-pldm':'bool', | |
| '*sub-channel':'uint8', | |
| '*cme-ev-flags':'uint8', '*cvme-count':'uint32', | |
| 'sub-type':'uint8' | |
| }} | |
| ## | |
| # @cxl-inject-dram-event: | |
| # Inject an event record for a DRAM Event (CXL r3.2 8.2.10.2.1.2). | |
| # This event type is reported via one of the event logs specified | |
| # via the log parameter. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'command': 'cxl-inject-dram-event', | |
| 'data': 'CXLDRAMEvent' } | |
| ## | |
| # @CXLMemModuleEvent: | |
| # Event record for a Memory Module Event (CXL r3.2 8.2.10.2.1.3). | |
| # | |
| # @type: Device Event Type. See CXL r3.2 Table 8-59 Memory Module | |
| # Event Record for bit definitions for bit definiions. | |
| # | |
| # @health-status: Overall health summary bitmap. See CXL r3.2 Table | |
| # 8-148 Get Health Info Output Payload, Health Status for bit | |
| # definitions. | |
| # | |
| # @media-status: Overall media health summary. See CXL r3.2 Table | |
| # 8-148 Get Health Info Output Payload, Media Status for bit | |
| # definitions. | |
| # | |
| # @additional-status: See CXL r3.2 Table 8-148 Get Health Info Output | |
| # Payload, Additional Status for subfield definitions. | |
| # | |
| # @life-used: Percentage (0-100) of factory expected life span. | |
| # | |
| # @temperature: Device temperature in degrees Celsius. | |
| # | |
| # @dirty-shutdown-count: Number of times the device has been unable to | |
| # determine whether data loss may have occurred. | |
| # | |
| # @corrected-volatile-error-count: Total number of correctable errors | |
| # in volatile memory. | |
| # | |
| # @corrected-persistent-error-count: Total number of correctable | |
| # errors in persistent memory | |
| # | |
| # @component-id: Device specific component identifier for the event. | |
| # May describe a field replaceable sub-component of the device. | |
| # | |
| # @is-comp-id-pldm: This flag specifies whether the device-specific | |
| # component identifier format follows PLDM. | |
| # | |
| # @sub-type: Device event sub-type. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'struct': 'CXLMemModuleEvent', | |
| 'base': 'CXLCommonEventBase', | |
| 'data': { 'type': 'uint8', 'health-status': 'uint8', | |
| 'media-status': 'uint8', 'additional-status': 'uint8', | |
| 'life-used': 'uint8', 'temperature' : 'int16', | |
| 'dirty-shutdown-count': 'uint32', | |
| 'corrected-volatile-error-count': 'uint32', | |
| 'corrected-persistent-error-count': 'uint32', | |
| '*component-id': 'str', '*is-comp-id-pldm':'bool', | |
| 'sub-type':'uint8' | |
| }} | |
| ## | |
| # @cxl-inject-memory-module-event: | |
| # Inject an event record for a Memory Module Event (CXL r3.2 | |
| # 8.2.10.2.1.3). This event includes a copy of the Device Health | |
| # info at the time of the event. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'command': 'cxl-inject-memory-module-event', | |
| 'data': 'CXLMemModuleEvent' } | |
| ## | |
| # @cxl-inject-poison: | |
| # Poison records indicate that a CXL memory device knows that a | |
| # particular memory region may be corrupted. This may be because | |
| # of locally detected errors (e.g. ECC failure) or poisoned writes | |
| # received from other components in the system. This injection | |
| # mechanism enables testing of the OS handling of poison records | |
| # which may be queried via the CXL mailbox. | |
| # | |
| # @path: CXL type 3 device canonical QOM path | |
| # | |
| # @start: Start address; must be 64 byte aligned. | |
| # | |
| # @length: Length of poison to inject; must be a multiple of 64 bytes. | |
| # | |
| # Since: 8.1 | |
| ## | |
| { 'command': 'cxl-inject-poison', | |
| 'data': { 'path': 'str', 'start': 'uint64', 'length': 'size' }} | |
| ## | |
| # @CxlUncorErrorType: | |
| # Type of uncorrectable CXL error to inject. These errors are | |
| # reported via an AER uncorrectable internal error with additional | |
| # information logged at the CXL device. | |
| # | |
| # @cache-data-parity: Data error such as data parity or data ECC error | |
| # CXL.cache | |
| # | |
| # @cache-address-parity: Address parity or other errors associated | |
| # with the address field on CXL.cache | |
| # | |
| # @cache-be-parity: Byte enable parity or other byte enable errors on | |
| # CXL.cache | |
| # | |
| # @cache-data-ecc: ECC error on CXL.cache | |
| # | |
| # @mem-data-parity: Data error such as data parity or data ECC error | |
| # on CXL.mem | |
| # | |
| # @mem-address-parity: Address parity or other errors associated with | |
| # the address field on CXL.mem | |
| # | |
| # @mem-be-parity: Byte enable parity or other byte enable errors on | |
| # CXL.mem. | |
| # | |
| # @mem-data-ecc: Data ECC error on CXL.mem. | |
| # | |
| # @reinit-threshold: REINIT threshold hit. | |
| # | |
| # @rsvd-encoding: Received unrecognized encoding. | |
| # | |
| # @poison-received: Received poison from the peer. | |
| # | |
| # @receiver-overflow: Buffer overflows (first 3 bits of header log | |
| # indicate which) | |
| # | |
| # @internal: Component specific error | |
| # | |
| # @cxl-ide-tx: Integrity and data encryption tx error. | |
| # | |
| # @cxl-ide-rx: Integrity and data encryption rx error. | |
| # | |
| # Since: 8.0 | |
| ## | |
| { 'enum': 'CxlUncorErrorType', | |
| 'data': ['cache-data-parity', | |
| 'cache-address-parity', | |
| 'cache-be-parity', | |
| 'cache-data-ecc', | |
| 'mem-data-parity', | |
| 'mem-address-parity', | |
| 'mem-be-parity', | |
| 'mem-data-ecc', | |
| 'reinit-threshold', | |
| 'rsvd-encoding', | |
| 'poison-received', | |
| 'receiver-overflow', | |
| 'internal', | |
| 'cxl-ide-tx', | |
| 'cxl-ide-rx' | |
| ] | |
| } | |
| ## | |
| # @CXLUncorErrorRecord: | |
| # Record of a single error including header log. | |
| # | |
| # @type: Type of error | |
| # | |
| # @header: 16 DWORD of header. | |
| # | |
| # Since: 8.0 | |
| ## | |
| { 'struct': 'CXLUncorErrorRecord', | |
| 'data': { | |
| 'type': 'CxlUncorErrorType', | |
| 'header': [ 'uint32' ] | |
| } | |
| } | |
| ## | |
| # @cxl-inject-uncorrectable-errors: | |
| # Command to allow injection of multiple errors in one go. This | |
| # allows testing of multiple header log handling in the OS. | |
| # | |
| # @path: CXL Type 3 device canonical QOM path | |
| # | |
| # @errors: Errors to inject | |
| # | |
| # Since: 8.0 | |
| ## | |
| { 'command': 'cxl-inject-uncorrectable-errors', | |
| 'data': { 'path': 'str', | |
| 'errors': [ 'CXLUncorErrorRecord' ] }} | |
| ## | |
| # @CxlCorErrorType: | |
| # Type of CXL correctable error to inject | |
| # | |
| # @cache-data-ecc: Data ECC error on CXL.cache | |
| # | |
| # @mem-data-ecc: Data ECC error on CXL.mem | |
| # | |
| # @crc-threshold: Component specific and applicable to 68 byte Flit | |
| # mode only. | |
| # | |
| # @retry-threshold: Retry threshold hit in the Local Retry State | |
| # Machine, 68B Flits only. | |
| # | |
| # @cache-poison-received: Received poison from a peer on CXL.cache. | |
| # | |
| # @mem-poison-received: Received poison from a peer on CXL.mem | |
| # | |
| # @physical: Received error indication from the physical layer. | |
| # | |
| # Since: 8.0 | |
| ## | |
| { 'enum': 'CxlCorErrorType', | |
| 'data': ['cache-data-ecc', | |
| 'mem-data-ecc', | |
| 'crc-threshold', | |
| 'retry-threshold', | |
| 'cache-poison-received', | |
| 'mem-poison-received', | |
| 'physical'] | |
| } | |
| ## | |
| # @cxl-inject-correctable-error: | |
| # Command to inject a single correctable error. Multiple error | |
| # injection of this error type is not interesting as there is no | |
| # associated header log. These errors are reported via AER as a | |
| # correctable internal error, with additional detail available | |
| # from the CXL device. | |
| # | |
| # @path: CXL Type 3 device canonical QOM path | |
| # | |
| # @type: Type of error. | |
| # | |
| # Since: 8.0 | |
| ## | |
| {'command': 'cxl-inject-correctable-error', | |
| 'data': {'path': 'str', 'type': 'CxlCorErrorType'}} | |
| ## | |
| # @CxlDynamicCapacityExtent: | |
| # A single dynamic capacity extent. This is a contiguous | |
| # allocation of memory by Device Physical Address within a single | |
| # Dynamic Capacity Region on a CXL Type 3 Device. | |
| # | |
| # @offset: The offset (in bytes) to the start of the region where the | |
| # extent belongs to. | |
| # | |
| # @len: The length of the extent in bytes. | |
| # | |
| # Since: 9.1 | |
| ## | |
| { 'struct': 'CxlDynamicCapacityExtent', | |
| 'data': { | |
| 'offset':'uint64', | |
| 'len': 'uint64' | |
| } | |
| } | |
| ## | |
| # @CxlExtentSelectionPolicy: | |
| # The policy to use for selecting which extents comprise the added | |
| # capacity, as defined in Compute Express Link (CXL) | |
| # Specification, Revision 3.1, Table 7-70. | |
| # | |
| # @free: Device is responsible for allocating the requested memory | |
| # capacity and is free to do this using any combination of | |
| # supported extents. | |
| # | |
| # @contiguous: Device is responsible for allocating the requested | |
| # memory capacity but must do so as a single contiguous | |
| # extent. | |
| # | |
| # @prescriptive: The precise set of extents to be allocated is | |
| # specified by the command. Thus allocation is being managed | |
| # by the issuer of the allocation command, not the device. | |
| # | |
| # @enable-shared-access: Capacity has already been allocated to a | |
| # different host using free, contiguous or prescriptive policy | |
| # with a known tag. This policy then instructs the device to make | |
| # the capacity with the specified tag available to an additional | |
| # host. Capacity is implicit as it matches that already | |
| # associated with the tag. Note that the extent list (and hence | |
| # Device Physical Addresses) used are per host, so a device may | |
| # use different representations on each host. The ordering of the | |
| # extents provided to each host is indicated to the host using per | |
| # extent sequence numbers generated by the device. Has a similar | |
| # meaning for temporal sharing, but in that case there may be only | |
| # one host involved. | |
| # | |
| # Since: 9.1 | |
| ## | |
| { 'enum': 'CxlExtentSelectionPolicy', | |
| 'data': ['free', | |
| 'contiguous', | |
| 'prescriptive', | |
| 'enable-shared-access'] | |
| } | |
| ## | |
| # @cxl-add-dynamic-capacity: | |
| # Initiate adding dynamic capacity extents to a host. This | |
| # simulates operations defined in Compute Express Link (CXL) | |
| # Specification, Revision 3.1, Section 7.6.7.6.5. Note that, | |
| # currently, establishing success or failure of the full Add | |
| # Dynamic Capacity flow requires out of band communication with | |
| # the OS of the CXL host. | |
| # | |
| # @path: path to the CXL Dynamic Capacity Device in the QOM tree. | |
| # | |
| # @host-id: The "Host ID" field as defined in Compute Express Link | |
| # (CXL) Specification, Revision 3.1, Table 7-70. | |
| # | |
| # @selection-policy: The "Selection Policy" bits as defined in | |
| # Compute Express Link (CXL) Specification, Revision 3.1, | |
| # Table 7-70. It specifies the policy to use for selecting | |
| # which extents comprise the added capacity. | |
| # | |
| # @region: The "Region Number" field as defined in Compute Express | |
| # Link (CXL) Specification, Revision 3.1, Table 7-70. Valid | |
| # range is from 0-7. | |
| # | |
| # @tag: The "Tag" field as defined in Compute Express Link (CXL) | |
| # Specification, Revision 3.1, Table 7-70. | |
| # | |
| # @extents: The "Extent List" field as defined in Compute Express Link | |
| # (CXL) Specification, Revision 3.1, Table 7-70. | |
| # | |
| # Features: | |
| # | |
| # @unstable: For now this command is subject to change. | |
| # | |
| # Since: 9.1 | |
| ## | |
| { 'command': 'cxl-add-dynamic-capacity', | |
| 'data': { 'path': 'str', | |
| 'host-id': 'uint16', | |
| 'selection-policy': 'CxlExtentSelectionPolicy', | |
| 'region': 'uint8', | |
| '*tag': 'str', | |
| 'extents': [ 'CxlDynamicCapacityExtent' ] | |
| }, | |
| 'features': [ 'unstable' ] | |
| } | |
| ## | |
| # @CxlExtentRemovalPolicy: | |
| # The policy to use for selecting which extents comprise the | |
| # released capacity, defined in the "Flags" field in Compute | |
| # Express Link (CXL) Specification, Revision 3.1, Table 7-71. | |
| # | |
| # @tag-based: Extents are selected by the device based on tag, with | |
| # no requirement for contiguous extents. | |
| # | |
| # @prescriptive: Extent list of capacity to release is included in | |
| # the request payload. | |
| # | |
| # Since: 9.1 | |
| ## | |
| { 'enum': 'CxlExtentRemovalPolicy', | |
| 'data': ['tag-based', | |
| 'prescriptive'] | |
| } | |
| ## | |
| # @cxl-release-dynamic-capacity: | |
| # Initiate release of dynamic capacity extents from a host. This | |
| # simulates operations defined in Compute Express Link (CXL) | |
| # Specification, Revision 3.1, Section 7.6.7.6.6. Note that, | |
| # currently, success or failure of the full Release Dynamic | |
| # Capacity flow requires out of band communication with the OS of | |
| # the CXL host. | |
| # | |
| # @path: path to the CXL Dynamic Capacity Device in the QOM tree. | |
| # | |
| # @host-id: The "Host ID" field as defined in Compute Express Link | |
| # (CXL) Specification, Revision 3.1, Table 7-71. | |
| # | |
| # @removal-policy: Bit[3:0] of the "Flags" field as defined in | |
| # Compute Express Link (CXL) Specification, Revision 3.1, | |
| # Table 7-71. | |
| # | |
| # @forced-removal: Bit[4] of the "Flags" field in Compute Express | |
| # Link (CXL) Specification, Revision 3.1, Table 7-71. When set, | |
| # the device does not wait for a Release Dynamic Capacity command | |
| # from the host. Instead, the host immediately looses access to | |
| # the released capacity. | |
| # | |
| # @sanitize-on-release: Bit[5] of the "Flags" field in Compute Express | |
| # Link (CXL) Specification, Revision 3.1, Table 7-71. When set, | |
| # the device should sanitize all released capacity as a result of | |
| # this request. This ensures that all user data and metadata is | |
| # made permanently unavailable by whatever means is appropriate | |
| # for the media type. Note that changing encryption keys is not | |
| # sufficient. | |
| # | |
| # @region: The "Region Number" field as defined in Compute Express | |
| # Link Specification, Revision 3.1, Table 7-71. Valid range | |
| # is from 0-7. | |
| # | |
| # @tag: The "Tag" field as defined in Compute Express Link (CXL) | |
| # Specification, Revision 3.1, Table 7-71. | |
| # | |
| # @extents: The "Extent List" field as defined in Compute Express | |
| # Link (CXL) Specification, Revision 3.1, Table 7-71. | |
| # | |
| # Features: | |
| # | |
| # @unstable: For now this command is subject to change. | |
| # | |
| # Since: 9.1 | |
| ## | |
| { 'command': 'cxl-release-dynamic-capacity', | |
| 'data': { 'path': 'str', | |
| 'host-id': 'uint16', | |
| 'removal-policy': 'CxlExtentRemovalPolicy', | |
| '*forced-removal': 'bool', | |
| '*sanitize-on-release': 'bool', | |
| 'region': 'uint8', | |
| '*tag': 'str', | |
| 'extents': [ 'CxlDynamicCapacityExtent' ] | |
| }, | |
| 'features': [ 'unstable' ] | |
| } |