cxl changes for v6.14
- Move HMAT printouts to pr_debug() - Add CXL type2 support to cxl_dvsec_rr_decode() in preparation for type2 support - A series that updates CXL event records to spec r3.1 and related changes - Refactoring of cxl_find_regblock_instance() to count regblocks -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE5DAy15EJMCV1R6v9YGjFFmlTOEoFAmeaUgcACgkQYGjFFmlT OEqheg/+Iz7d1uBmyEcgf9JX0XAoPuG7uAPQcgSDK1u4gG0WxuBn+rc4Vprukml5 0wn1n6LVQg3lkQp9oNQKwEMt1es7Y2RDOaPd17eiBxFoBPkmHIF8fl2nhoLzCSco j23kdKsySW5wcT7FdppVT0cRdMQM/9ecJhR7mribdIxNwmPP2D7knnOYjytQjRFp C65EGZ97cn8CAJt7zdBRLNcgzJc4iVfT7jyRbtFvA/Bx4WU7qSCiwh8c2KZ4U3wE piCoMnsv/RwMjbGZNmEt7dTC3RIawWajGchWJ9aolXYidWm6sxpx6JOgzaGWJK5q 19fsb978SnqA6tr4qNmTgohl20gkRiqQZnYWZoKlyIZeBA+IqMdpl0YosSVNvS85 kBlau9eMmZVIxJlHevQ3+5NBCzzXz2rLnORAJUUCgHnuWeKU/+t31xK2lfbMJet9 Q6wkJC4kz1u6xLBP1aEnkVtQE0RY1UmUw4aU0L3jiLF6IGRF9wBRW/bFBKTEYLul 7cL7R5rwFxIwvR1uNIQVVnSTUzHUeA1brQS1I6QJP2SNzVl2uew1Xlx6KrLt3kQw zOuQFAvMa3L/HWjfDJYvcxfzhYN2ng3ec3XjyGN75S5jrb7a0PZ5vOmxZ6PFvEZE 8HFHfQqvpdO0e1SLWgLv7OBENM3GgLovbeSbEhQOlxzjx7QEsFc= =Tavn -----END PGP SIGNATURE----- Merge tag 'cxl-for-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl Pull Compute Express Link (CXL) updates from Dave Jiang: "A tweak to the HMAT output that was acked by Rafael, a prep patch for CXL type2 devices support that's coming soon, refactoring of the CXL regblock enumeration code, and a series of patches to update the event records to CXL spec r3.1: - Move HMAT printouts to pr_debug() - Add CXL type2 support to cxl_dvsec_rr_decode() in preparation for type2 support - A series that updates CXL event records to spec r3.1 and related changes - Refactoring of cxl_find_regblock_instance() to count regblocks" * tag 'cxl-for-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl: cxl/core/regs: Refactor out functions to count regblocks of given type cxl/test: Update test code for event records to CXL spec rev 3.1 cxl/events: Update Memory Module Event Record to CXL spec rev 3.1 cxl/events: Update DRAM Event Record to CXL spec rev 3.1 cxl/events: Update General Media Event Record to CXL spec rev 3.1 cxl/events: Add Component Identifier formatting for CXL spec rev 3.1 cxl/events: Update Common Event Record to CXL spec rev 3.1 cxl/pci: Add CXL Type 1/2 support to cxl_dvsec_rr_decode() ACPI/HMAT: Move HMAT messages to pr_debug()
This commit is contained in:
commit
9071080d1e
10 changed files with 319 additions and 97 deletions
|
@ -442,9 +442,9 @@ static __init int hmat_parse_locality(union acpi_subtable_headers *header,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
pr_info("Locality: Flags:%02x Type:%s Initiator Domains:%u Target Domains:%u Base:%lld\n",
|
||||
hmat_loc->flags, hmat_data_type(type), ipds, tpds,
|
||||
hmat_loc->entry_base_unit);
|
||||
pr_debug("Locality: Flags:%02x Type:%s Initiator Domains:%u Target Domains:%u Base:%lld\n",
|
||||
hmat_loc->flags, hmat_data_type(type), ipds, tpds,
|
||||
hmat_loc->entry_base_unit);
|
||||
|
||||
inits = (u32 *)(hmat_loc + 1);
|
||||
targs = inits + ipds;
|
||||
|
@ -455,9 +455,9 @@ static __init int hmat_parse_locality(union acpi_subtable_headers *header,
|
|||
value = hmat_normalize(entries[init * tpds + targ],
|
||||
hmat_loc->entry_base_unit,
|
||||
type);
|
||||
pr_info(" Initiator-Target[%u-%u]:%u%s\n",
|
||||
inits[init], targs[targ], value,
|
||||
hmat_data_type_suffix(type));
|
||||
pr_debug(" Initiator-Target[%u-%u]:%u%s\n",
|
||||
inits[init], targs[targ], value,
|
||||
hmat_data_type_suffix(type));
|
||||
|
||||
hmat_update_target(targs[targ], inits[init],
|
||||
mem_hier, type, value);
|
||||
|
@ -485,9 +485,9 @@ static __init int hmat_parse_cache(union acpi_subtable_headers *header,
|
|||
}
|
||||
|
||||
attrs = cache->cache_attributes;
|
||||
pr_info("Cache: Domain:%u Size:%llu Attrs:%08x SMBIOS Handles:%d\n",
|
||||
cache->memory_PD, cache->cache_size, attrs,
|
||||
cache->number_of_SMBIOShandles);
|
||||
pr_debug("Cache: Domain:%u Size:%llu Attrs:%08x SMBIOS Handles:%d\n",
|
||||
cache->memory_PD, cache->cache_size, attrs,
|
||||
cache->number_of_SMBIOShandles);
|
||||
|
||||
target = find_mem_target(cache->memory_PD);
|
||||
if (!target)
|
||||
|
@ -546,9 +546,9 @@ static int __init hmat_parse_proximity_domain(union acpi_subtable_headers *heade
|
|||
}
|
||||
|
||||
if (hmat_revision == 1)
|
||||
pr_info("Memory (%#llx length %#llx) Flags:%04x Processor Domain:%u Memory Domain:%u\n",
|
||||
p->reserved3, p->reserved4, p->flags, p->processor_PD,
|
||||
p->memory_PD);
|
||||
pr_debug("Memory (%#llx length %#llx) Flags:%04x Processor Domain:%u Memory Domain:%u\n",
|
||||
p->reserved3, p->reserved4, p->flags, p->processor_PD,
|
||||
p->memory_PD);
|
||||
else
|
||||
pr_info("Memory Flags:%04x Processor Domain:%u Memory Domain:%u\n",
|
||||
p->flags, p->processor_PD, p->memory_PD);
|
||||
|
|
|
@ -291,11 +291,11 @@ static int devm_cxl_enable_hdm(struct device *host, struct cxl_hdm *cxlhdm)
|
|||
return devm_add_action_or_reset(host, disable_hdm, cxlhdm);
|
||||
}
|
||||
|
||||
int cxl_dvsec_rr_decode(struct device *dev, struct cxl_port *port,
|
||||
int cxl_dvsec_rr_decode(struct cxl_dev_state *cxlds,
|
||||
struct cxl_endpoint_dvsec_info *info)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct cxl_dev_state *cxlds = pci_get_drvdata(pdev);
|
||||
struct pci_dev *pdev = to_pci_dev(cxlds->dev);
|
||||
struct device *dev = cxlds->dev;
|
||||
int hdm_count, rc, i, ranges = 0;
|
||||
int d = cxlds->cxl_dvsec;
|
||||
u16 cap, ctrl;
|
||||
|
|
|
@ -289,21 +289,17 @@ static bool cxl_decode_regblock(struct pci_dev *pdev, u32 reg_lo, u32 reg_hi,
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* cxl_find_regblock_instance() - Locate a register block by type / index
|
||||
* @pdev: The CXL PCI device to enumerate.
|
||||
* @type: Register Block Indicator id
|
||||
* @map: Enumeration output, clobbered on error
|
||||
* @index: Index into which particular instance of a regblock wanted in the
|
||||
* order found in register locator DVSEC.
|
||||
/*
|
||||
* __cxl_find_regblock_instance() - Locate a register block or count instances by type / index
|
||||
* Use CXL_INSTANCES_COUNT for @index if counting instances.
|
||||
*
|
||||
* Return: 0 if register block enumerated, negative error code otherwise
|
||||
*
|
||||
* A CXL DVSEC may point to one or more register blocks, search for them
|
||||
* by @type and @index.
|
||||
* __cxl_find_regblock_instance() may return:
|
||||
* 0 - if register block enumerated.
|
||||
* >= 0 - if counting instances.
|
||||
* < 0 - error code otherwise.
|
||||
*/
|
||||
int cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map, int index)
|
||||
static int __cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map, int index)
|
||||
{
|
||||
u32 regloc_size, regblocks;
|
||||
int instance = 0;
|
||||
|
@ -342,8 +338,30 @@ int cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type,
|
|||
}
|
||||
|
||||
map->resource = CXL_RESOURCE_NONE;
|
||||
if (index == CXL_INSTANCES_COUNT)
|
||||
return instance;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/**
|
||||
* cxl_find_regblock_instance() - Locate a register block by type / index
|
||||
* @pdev: The CXL PCI device to enumerate.
|
||||
* @type: Register Block Indicator id
|
||||
* @map: Enumeration output, clobbered on error
|
||||
* @index: Index into which particular instance of a regblock wanted in the
|
||||
* order found in register locator DVSEC.
|
||||
*
|
||||
* Return: 0 if register block enumerated, negative error code otherwise
|
||||
*
|
||||
* A CXL DVSEC may point to one or more register blocks, search for them
|
||||
* by @type and @index.
|
||||
*/
|
||||
int cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map, unsigned int index)
|
||||
{
|
||||
return __cxl_find_regblock_instance(pdev, type, map, index);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_find_regblock_instance, "CXL");
|
||||
|
||||
/**
|
||||
|
@ -360,7 +378,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_find_regblock_instance, "CXL");
|
|||
int cxl_find_regblock(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map)
|
||||
{
|
||||
return cxl_find_regblock_instance(pdev, type, map, 0);
|
||||
return __cxl_find_regblock_instance(pdev, type, map, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_find_regblock, "CXL");
|
||||
|
||||
|
@ -371,19 +389,13 @@ EXPORT_SYMBOL_NS_GPL(cxl_find_regblock, "CXL");
|
|||
*
|
||||
* Some regblocks may be repeated. Count how many instances.
|
||||
*
|
||||
* Return: count of matching regblocks.
|
||||
* Return: non-negative count of matching regblocks, negative error code otherwise.
|
||||
*/
|
||||
int cxl_count_regblock(struct pci_dev *pdev, enum cxl_regloc_type type)
|
||||
{
|
||||
struct cxl_register_map map;
|
||||
int rc, count = 0;
|
||||
|
||||
while (1) {
|
||||
rc = cxl_find_regblock_instance(pdev, type, &map, count);
|
||||
if (rc)
|
||||
return count;
|
||||
count++;
|
||||
}
|
||||
return __cxl_find_regblock_instance(pdev, type, &map, CXL_INSTANCES_COUNT);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_count_regblock, "CXL");
|
||||
|
||||
|
|
|
@ -166,11 +166,13 @@ TRACE_EVENT(cxl_overflow,
|
|||
#define CXL_EVENT_RECORD_FLAG_MAINT_NEEDED BIT(3)
|
||||
#define CXL_EVENT_RECORD_FLAG_PERF_DEGRADED BIT(4)
|
||||
#define CXL_EVENT_RECORD_FLAG_HW_REPLACE BIT(5)
|
||||
#define CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID BIT(6)
|
||||
#define show_hdr_flags(flags) __print_flags(flags, " | ", \
|
||||
{ CXL_EVENT_RECORD_FLAG_PERMANENT, "PERMANENT_CONDITION" }, \
|
||||
{ CXL_EVENT_RECORD_FLAG_MAINT_NEEDED, "MAINTENANCE_NEEDED" }, \
|
||||
{ CXL_EVENT_RECORD_FLAG_PERF_DEGRADED, "PERFORMANCE_DEGRADED" }, \
|
||||
{ CXL_EVENT_RECORD_FLAG_HW_REPLACE, "HARDWARE_REPLACEMENT_NEEDED" } \
|
||||
{ CXL_EVENT_RECORD_FLAG_HW_REPLACE, "HARDWARE_REPLACEMENT_NEEDED" }, \
|
||||
{ CXL_EVENT_RECORD_FLAG_MAINT_OP_SUB_CLASS_VALID, "MAINT_OP_SUB_CLASS_VALID" } \
|
||||
)
|
||||
|
||||
/*
|
||||
|
@ -197,7 +199,8 @@ TRACE_EVENT(cxl_overflow,
|
|||
__field(u16, hdr_related_handle) \
|
||||
__field(u64, hdr_timestamp) \
|
||||
__field(u8, hdr_length) \
|
||||
__field(u8, hdr_maint_op_class)
|
||||
__field(u8, hdr_maint_op_class) \
|
||||
__field(u8, hdr_maint_op_sub_class)
|
||||
|
||||
#define CXL_EVT_TP_fast_assign(cxlmd, l, hdr) \
|
||||
__assign_str(memdev); \
|
||||
|
@ -209,17 +212,19 @@ TRACE_EVENT(cxl_overflow,
|
|||
__entry->hdr_handle = le16_to_cpu((hdr).handle); \
|
||||
__entry->hdr_related_handle = le16_to_cpu((hdr).related_handle); \
|
||||
__entry->hdr_timestamp = le64_to_cpu((hdr).timestamp); \
|
||||
__entry->hdr_maint_op_class = (hdr).maint_op_class
|
||||
__entry->hdr_maint_op_class = (hdr).maint_op_class; \
|
||||
__entry->hdr_maint_op_sub_class = (hdr).maint_op_sub_class
|
||||
|
||||
#define CXL_EVT_TP_printk(fmt, ...) \
|
||||
TP_printk("memdev=%s host=%s serial=%lld log=%s : time=%llu uuid=%pUb " \
|
||||
"len=%d flags='%s' handle=%x related_handle=%x " \
|
||||
"maint_op_class=%u : " fmt, \
|
||||
"maint_op_class=%u maint_op_sub_class=%u : " fmt, \
|
||||
__get_str(memdev), __get_str(host), __entry->serial, \
|
||||
cxl_event_log_type_str(__entry->log), \
|
||||
__entry->hdr_timestamp, &__entry->hdr_uuid, __entry->hdr_length,\
|
||||
show_hdr_flags(__entry->hdr_flags), __entry->hdr_handle, \
|
||||
__entry->hdr_related_handle, __entry->hdr_maint_op_class, \
|
||||
__entry->hdr_maint_op_sub_class, \
|
||||
##__VA_ARGS__)
|
||||
|
||||
TRACE_EVENT(cxl_generic_event,
|
||||
|
@ -263,9 +268,31 @@ TRACE_EVENT(cxl_generic_event,
|
|||
{ CXL_DPA_NOT_REPAIRABLE, "NOT_REPAIRABLE" } \
|
||||
)
|
||||
|
||||
/*
|
||||
* Component ID Format
|
||||
* CXL 3.1 section 8.2.9.2.1; Table 8-44
|
||||
*/
|
||||
#define CXL_PLDM_COMPONENT_ID_ENTITY_VALID BIT(0)
|
||||
#define CXL_PLDM_COMPONENT_ID_RES_VALID BIT(1)
|
||||
|
||||
#define show_comp_id_pldm_flags(flags) __print_flags(flags, " | ", \
|
||||
{ CXL_PLDM_COMPONENT_ID_ENTITY_VALID, "PLDM Entity ID" }, \
|
||||
{ CXL_PLDM_COMPONENT_ID_RES_VALID, "Resource ID" } \
|
||||
)
|
||||
|
||||
#define show_pldm_entity_id(flags, valid_comp_id, valid_id_format, comp_id) \
|
||||
(flags & valid_comp_id && flags & valid_id_format) ? \
|
||||
(comp_id[0] & CXL_PLDM_COMPONENT_ID_ENTITY_VALID) ? \
|
||||
__print_hex(&comp_id[1], 6) : "0x00" : "0x00"
|
||||
|
||||
#define show_pldm_resource_id(flags, valid_comp_id, valid_id_format, comp_id) \
|
||||
(flags & valid_comp_id && flags & valid_id_format) ? \
|
||||
(comp_id[0] & CXL_PLDM_COMPONENT_ID_RES_VALID) ? \
|
||||
__print_hex(&comp_id[7], 4) : "0x00" : "0x00"
|
||||
|
||||
/*
|
||||
* General Media Event Record - GMER
|
||||
* CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
|
||||
* CXL rev 3.1 Section 8.2.9.2.1.1; Table 8-45
|
||||
*/
|
||||
#define CXL_GMER_EVT_DESC_UNCORECTABLE_EVENT BIT(0)
|
||||
#define CXL_GMER_EVT_DESC_THRESHOLD_EVENT BIT(1)
|
||||
|
@ -279,10 +306,18 @@ TRACE_EVENT(cxl_generic_event,
|
|||
#define CXL_GMER_MEM_EVT_TYPE_ECC_ERROR 0x00
|
||||
#define CXL_GMER_MEM_EVT_TYPE_INV_ADDR 0x01
|
||||
#define CXL_GMER_MEM_EVT_TYPE_DATA_PATH_ERROR 0x02
|
||||
#define show_gmer_mem_event_type(type) __print_symbolic(type, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_ECC_ERROR, "ECC Error" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_INV_ADDR, "Invalid Address" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_DATA_PATH_ERROR, "Data Path Error" } \
|
||||
#define CXL_GMER_MEM_EVT_TYPE_TE_STATE_VIOLATION 0x03
|
||||
#define CXL_GMER_MEM_EVT_TYPE_SCRUB_MEDIA_ECC_ERROR 0x04
|
||||
#define CXL_GMER_MEM_EVT_TYPE_AP_CME_COUNTER_EXPIRE 0x05
|
||||
#define CXL_GMER_MEM_EVT_TYPE_CKID_VIOLATION 0x06
|
||||
#define show_gmer_mem_event_type(type) __print_symbolic(type, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_ECC_ERROR, "ECC Error" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_INV_ADDR, "Invalid Address" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_DATA_PATH_ERROR, "Data Path Error" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_TE_STATE_VIOLATION, "TE State Violation" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_SCRUB_MEDIA_ECC_ERROR, "Scrub Media ECC Error" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_AP_CME_COUNTER_EXPIRE, "Adv Prog CME Counter Expiration" }, \
|
||||
{ CXL_GMER_MEM_EVT_TYPE_CKID_VIOLATION, "CKID Violation" } \
|
||||
)
|
||||
|
||||
#define CXL_GMER_TRANS_UNKNOWN 0x00
|
||||
|
@ -292,6 +327,8 @@ TRACE_EVENT(cxl_generic_event,
|
|||
#define CXL_GMER_TRANS_HOST_INJECT_POISON 0x04
|
||||
#define CXL_GMER_TRANS_INTERNAL_MEDIA_SCRUB 0x05
|
||||
#define CXL_GMER_TRANS_INTERNAL_MEDIA_MANAGEMENT 0x06
|
||||
#define CXL_GMER_TRANS_INTERNAL_MEDIA_ECS 0x07
|
||||
#define CXL_GMER_TRANS_MEDIA_INITIALIZATION 0x08
|
||||
#define show_trans_type(type) __print_symbolic(type, \
|
||||
{ CXL_GMER_TRANS_UNKNOWN, "Unknown" }, \
|
||||
{ CXL_GMER_TRANS_HOST_READ, "Host Read" }, \
|
||||
|
@ -299,18 +336,57 @@ TRACE_EVENT(cxl_generic_event,
|
|||
{ CXL_GMER_TRANS_HOST_SCAN_MEDIA, "Host Scan Media" }, \
|
||||
{ CXL_GMER_TRANS_HOST_INJECT_POISON, "Host Inject Poison" }, \
|
||||
{ CXL_GMER_TRANS_INTERNAL_MEDIA_SCRUB, "Internal Media Scrub" }, \
|
||||
{ CXL_GMER_TRANS_INTERNAL_MEDIA_MANAGEMENT, "Internal Media Management" } \
|
||||
{ CXL_GMER_TRANS_INTERNAL_MEDIA_MANAGEMENT, "Internal Media Management" }, \
|
||||
{ CXL_GMER_TRANS_INTERNAL_MEDIA_ECS, "Internal Media Error Check Scrub" }, \
|
||||
{ CXL_GMER_TRANS_MEDIA_INITIALIZATION, "Media Initialization" } \
|
||||
)
|
||||
|
||||
#define CXL_GMER_VALID_CHANNEL BIT(0)
|
||||
#define CXL_GMER_VALID_RANK BIT(1)
|
||||
#define CXL_GMER_VALID_DEVICE BIT(2)
|
||||
#define CXL_GMER_VALID_COMPONENT BIT(3)
|
||||
#define CXL_GMER_VALID_COMPONENT_ID_FORMAT BIT(4)
|
||||
#define show_valid_flags(flags) __print_flags(flags, "|", \
|
||||
{ CXL_GMER_VALID_CHANNEL, "CHANNEL" }, \
|
||||
{ CXL_GMER_VALID_RANK, "RANK" }, \
|
||||
{ CXL_GMER_VALID_DEVICE, "DEVICE" }, \
|
||||
{ CXL_GMER_VALID_COMPONENT, "COMPONENT" } \
|
||||
{ CXL_GMER_VALID_COMPONENT, "COMPONENT" }, \
|
||||
{ CXL_GMER_VALID_COMPONENT_ID_FORMAT, "COMPONENT PLDM FORMAT" } \
|
||||
)
|
||||
|
||||
#define CXL_GMER_CME_EV_FLAG_CME_MULTIPLE_MEDIA BIT(0)
|
||||
#define CXL_GMER_CME_EV_FLAG_THRESHOLD_EXCEEDED BIT(1)
|
||||
#define show_cme_threshold_ev_flags(flags) __print_flags(flags, "|", \
|
||||
{ \
|
||||
CXL_GMER_CME_EV_FLAG_CME_MULTIPLE_MEDIA, \
|
||||
"Corrected Memory Errors in Multiple Media Components" \
|
||||
}, { \
|
||||
CXL_GMER_CME_EV_FLAG_THRESHOLD_EXCEEDED, \
|
||||
"Exceeded Programmable Threshold" \
|
||||
} \
|
||||
)
|
||||
|
||||
#define CXL_GMER_MEM_EVT_SUB_TYPE_NOT_REPORTED 0x00
|
||||
#define CXL_GMER_MEM_EVT_SUB_TYPE_INTERNAL_DATAPATH_ERROR 0x01
|
||||
#define CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_COMMAND_TRAINING_ERROR 0x02
|
||||
#define CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_CONTROL_TRAINING_ERROR 0x03
|
||||
#define CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_DATA_TRAINING_ERROR 0x04
|
||||
#define CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_CRC_ERROR 0x05
|
||||
#define show_mem_event_sub_type(sub_type) __print_symbolic(sub_type, \
|
||||
{ CXL_GMER_MEM_EVT_SUB_TYPE_NOT_REPORTED, "Not Reported" }, \
|
||||
{ CXL_GMER_MEM_EVT_SUB_TYPE_INTERNAL_DATAPATH_ERROR, "Internal Datapath Error" }, \
|
||||
{ \
|
||||
CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_COMMAND_TRAINING_ERROR, \
|
||||
"Media Link Command Training Error" \
|
||||
}, { \
|
||||
CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_CONTROL_TRAINING_ERROR, \
|
||||
"Media Link Control Training Error" \
|
||||
}, { \
|
||||
CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_DATA_TRAINING_ERROR, \
|
||||
"Media Link Data Training Error" \
|
||||
}, { \
|
||||
CXL_GMER_MEM_EVT_SUB_TYPE_MEDIA_LINK_CRC_ERROR, "Media Link CRC Error" \
|
||||
} \
|
||||
)
|
||||
|
||||
TRACE_EVENT(cxl_general_media,
|
||||
|
@ -336,6 +412,9 @@ TRACE_EVENT(cxl_general_media,
|
|||
__field(u16, validity_flags)
|
||||
__field(u8, rank)
|
||||
__field(u8, dpa_flags)
|
||||
__field(u32, cme_count)
|
||||
__field(u8, sub_type)
|
||||
__field(u8, cme_threshold_ev_flags)
|
||||
__string(region_name, cxlr ? dev_name(&cxlr->dev) : "")
|
||||
),
|
||||
|
||||
|
@ -350,6 +429,7 @@ TRACE_EVENT(cxl_general_media,
|
|||
__entry->dpa &= CXL_DPA_MASK;
|
||||
__entry->descriptor = rec->media_hdr.descriptor;
|
||||
__entry->type = rec->media_hdr.type;
|
||||
__entry->sub_type = rec->sub_type;
|
||||
__entry->transaction_type = rec->media_hdr.transaction_type;
|
||||
__entry->channel = rec->media_hdr.channel;
|
||||
__entry->rank = rec->media_hdr.rank;
|
||||
|
@ -365,27 +445,40 @@ TRACE_EVENT(cxl_general_media,
|
|||
__assign_str(region_name);
|
||||
uuid_copy(&__entry->region_uuid, &uuid_null);
|
||||
}
|
||||
__entry->cme_threshold_ev_flags = rec->cme_threshold_ev_flags;
|
||||
__entry->cme_count = get_unaligned_le24(rec->cme_count);
|
||||
),
|
||||
|
||||
CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' " \
|
||||
"descriptor='%s' type='%s' transaction_type='%s' channel=%u rank=%u " \
|
||||
"device=%x comp_id=%s validity_flags='%s' " \
|
||||
"hpa=%llx region=%s region_uuid=%pUb",
|
||||
"descriptor='%s' type='%s' sub_type='%s' " \
|
||||
"transaction_type='%s' channel=%u rank=%u " \
|
||||
"device=%x validity_flags='%s' " \
|
||||
"comp_id=%s comp_id_pldm_valid_flags='%s' " \
|
||||
"pldm_entity_id=%s pldm_resource_id=%s " \
|
||||
"hpa=%llx region=%s region_uuid=%pUb " \
|
||||
"cme_threshold_ev_flags='%s' cme_count=%u",
|
||||
__entry->dpa, show_dpa_flags(__entry->dpa_flags),
|
||||
show_event_desc_flags(__entry->descriptor),
|
||||
show_gmer_mem_event_type(__entry->type),
|
||||
show_mem_event_sub_type(__entry->sub_type),
|
||||
show_trans_type(__entry->transaction_type),
|
||||
__entry->channel, __entry->rank, __entry->device,
|
||||
__print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE),
|
||||
show_valid_flags(__entry->validity_flags),
|
||||
__entry->hpa, __get_str(region_name), &__entry->region_uuid
|
||||
__print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE),
|
||||
show_comp_id_pldm_flags(__entry->comp_id[0]),
|
||||
show_pldm_entity_id(__entry->validity_flags, CXL_GMER_VALID_COMPONENT,
|
||||
CXL_GMER_VALID_COMPONENT_ID_FORMAT, __entry->comp_id),
|
||||
show_pldm_resource_id(__entry->validity_flags, CXL_GMER_VALID_COMPONENT,
|
||||
CXL_GMER_VALID_COMPONENT_ID_FORMAT, __entry->comp_id),
|
||||
__entry->hpa, __get_str(region_name), &__entry->region_uuid,
|
||||
show_cme_threshold_ev_flags(__entry->cme_threshold_ev_flags), __entry->cme_count
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
* DRAM Event Record - DER
|
||||
*
|
||||
* CXL rev 3.0 section 8.2.9.2.1.2; Table 8-44
|
||||
* CXL rev 3.1 section 8.2.9.2.1.2; Table 8-46
|
||||
*/
|
||||
/*
|
||||
* DRAM Event Record defines many fields the same as the General Media Event
|
||||
|
@ -395,11 +488,17 @@ TRACE_EVENT(cxl_general_media,
|
|||
#define CXL_DER_MEM_EVT_TYPE_SCRUB_MEDIA_ECC_ERROR 0x01
|
||||
#define CXL_DER_MEM_EVT_TYPE_INV_ADDR 0x02
|
||||
#define CXL_DER_MEM_EVT_TYPE_DATA_PATH_ERROR 0x03
|
||||
#define show_dram_mem_event_type(type) __print_symbolic(type, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_ECC_ERROR, "ECC Error" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_SCRUB_MEDIA_ECC_ERROR, "Scrub Media ECC Error" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_INV_ADDR, "Invalid Address" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_DATA_PATH_ERROR, "Data Path Error" } \
|
||||
#define CXL_DER_MEM_EVT_TYPE_TE_STATE_VIOLATION 0x04
|
||||
#define CXL_DER_MEM_EVT_TYPE_AP_CME_COUNTER_EXPIRE 0x05
|
||||
#define CXL_DER_MEM_EVT_TYPE_CKID_VIOLATION 0x06
|
||||
#define show_dram_mem_event_type(type) __print_symbolic(type, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_ECC_ERROR, "ECC Error" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_SCRUB_MEDIA_ECC_ERROR, "Scrub Media ECC Error" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_INV_ADDR, "Invalid Address" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_DATA_PATH_ERROR, "Data Path Error" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_TE_STATE_VIOLATION, "TE State Violation" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_AP_CME_COUNTER_EXPIRE, "Adv Prog CME Counter Expiration" }, \
|
||||
{ CXL_DER_MEM_EVT_TYPE_CKID_VIOLATION, "CKID Violation" } \
|
||||
)
|
||||
|
||||
#define CXL_DER_VALID_CHANNEL BIT(0)
|
||||
|
@ -410,15 +509,21 @@ TRACE_EVENT(cxl_general_media,
|
|||
#define CXL_DER_VALID_ROW BIT(5)
|
||||
#define CXL_DER_VALID_COLUMN BIT(6)
|
||||
#define CXL_DER_VALID_CORRECTION_MASK BIT(7)
|
||||
#define show_dram_valid_flags(flags) __print_flags(flags, "|", \
|
||||
{ CXL_DER_VALID_CHANNEL, "CHANNEL" }, \
|
||||
{ CXL_DER_VALID_RANK, "RANK" }, \
|
||||
{ CXL_DER_VALID_NIBBLE, "NIBBLE" }, \
|
||||
{ CXL_DER_VALID_BANK_GROUP, "BANK GROUP" }, \
|
||||
{ CXL_DER_VALID_BANK, "BANK" }, \
|
||||
{ CXL_DER_VALID_ROW, "ROW" }, \
|
||||
{ CXL_DER_VALID_COLUMN, "COLUMN" }, \
|
||||
{ CXL_DER_VALID_CORRECTION_MASK, "CORRECTION MASK" } \
|
||||
#define CXL_DER_VALID_COMPONENT BIT(8)
|
||||
#define CXL_DER_VALID_COMPONENT_ID_FORMAT BIT(9)
|
||||
#define CXL_DER_VALID_SUB_CHANNEL BIT(10)
|
||||
#define show_dram_valid_flags(flags) __print_flags(flags, "|", \
|
||||
{ CXL_DER_VALID_CHANNEL, "CHANNEL" }, \
|
||||
{ CXL_DER_VALID_RANK, "RANK" }, \
|
||||
{ CXL_DER_VALID_NIBBLE, "NIBBLE" }, \
|
||||
{ CXL_DER_VALID_BANK_GROUP, "BANK GROUP" }, \
|
||||
{ CXL_DER_VALID_BANK, "BANK" }, \
|
||||
{ CXL_DER_VALID_ROW, "ROW" }, \
|
||||
{ CXL_DER_VALID_COLUMN, "COLUMN" }, \
|
||||
{ CXL_DER_VALID_CORRECTION_MASK, "CORRECTION MASK" }, \
|
||||
{ CXL_DER_VALID_COMPONENT, "COMPONENT" }, \
|
||||
{ CXL_DER_VALID_COMPONENT_ID_FORMAT, "COMPONENT PLDM FORMAT" }, \
|
||||
{ CXL_DER_VALID_SUB_CHANNEL, "SUB CHANNEL" } \
|
||||
)
|
||||
|
||||
TRACE_EVENT(cxl_dram,
|
||||
|
@ -447,6 +552,12 @@ TRACE_EVENT(cxl_dram,
|
|||
__field(u8, bank_group) /* Out of order to pack trace record */
|
||||
__field(u8, bank) /* Out of order to pack trace record */
|
||||
__field(u8, dpa_flags) /* Out of order to pack trace record */
|
||||
/* Following are out of order to pack trace record */
|
||||
__array(u8, comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE)
|
||||
__field(u32, cvme_count)
|
||||
__field(u8, sub_type)
|
||||
__field(u8, sub_channel)
|
||||
__field(u8, cme_threshold_ev_flags)
|
||||
__string(region_name, cxlr ? dev_name(&cxlr->dev) : "")
|
||||
),
|
||||
|
||||
|
@ -460,6 +571,7 @@ TRACE_EVENT(cxl_dram,
|
|||
__entry->dpa &= CXL_DPA_MASK;
|
||||
__entry->descriptor = rec->media_hdr.descriptor;
|
||||
__entry->type = rec->media_hdr.type;
|
||||
__entry->sub_type = rec->sub_type;
|
||||
__entry->transaction_type = rec->media_hdr.transaction_type;
|
||||
__entry->validity_flags = get_unaligned_le16(rec->media_hdr.validity_flags);
|
||||
__entry->channel = rec->media_hdr.channel;
|
||||
|
@ -479,30 +591,47 @@ TRACE_EVENT(cxl_dram,
|
|||
__assign_str(region_name);
|
||||
uuid_copy(&__entry->region_uuid, &uuid_null);
|
||||
}
|
||||
memcpy(__entry->comp_id, &rec->component_id,
|
||||
CXL_EVENT_GEN_MED_COMP_ID_SIZE);
|
||||
__entry->sub_channel = rec->sub_channel;
|
||||
__entry->cme_threshold_ev_flags = rec->cme_threshold_ev_flags;
|
||||
__entry->cvme_count = get_unaligned_le24(rec->cvme_count);
|
||||
),
|
||||
|
||||
CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' descriptor='%s' type='%s' " \
|
||||
CXL_EVT_TP_printk("dpa=%llx dpa_flags='%s' descriptor='%s' type='%s' sub_type='%s' " \
|
||||
"transaction_type='%s' channel=%u rank=%u nibble_mask=%x " \
|
||||
"bank_group=%u bank=%u row=%u column=%u cor_mask=%s " \
|
||||
"validity_flags='%s' " \
|
||||
"hpa=%llx region=%s region_uuid=%pUb",
|
||||
"comp_id=%s comp_id_pldm_valid_flags='%s' " \
|
||||
"pldm_entity_id=%s pldm_resource_id=%s " \
|
||||
"hpa=%llx region=%s region_uuid=%pUb " \
|
||||
"sub_channel=%u cme_threshold_ev_flags='%s' cvme_count=%u",
|
||||
__entry->dpa, show_dpa_flags(__entry->dpa_flags),
|
||||
show_event_desc_flags(__entry->descriptor),
|
||||
show_dram_mem_event_type(__entry->type),
|
||||
show_mem_event_sub_type(__entry->sub_type),
|
||||
show_trans_type(__entry->transaction_type),
|
||||
__entry->channel, __entry->rank, __entry->nibble_mask,
|
||||
__entry->bank_group, __entry->bank,
|
||||
__entry->row, __entry->column,
|
||||
__print_hex(__entry->cor_mask, CXL_EVENT_DER_CORRECTION_MASK_SIZE),
|
||||
show_dram_valid_flags(__entry->validity_flags),
|
||||
__entry->hpa, __get_str(region_name), &__entry->region_uuid
|
||||
__print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE),
|
||||
show_comp_id_pldm_flags(__entry->comp_id[0]),
|
||||
show_pldm_entity_id(__entry->validity_flags, CXL_DER_VALID_COMPONENT,
|
||||
CXL_DER_VALID_COMPONENT_ID_FORMAT, __entry->comp_id),
|
||||
show_pldm_resource_id(__entry->validity_flags, CXL_DER_VALID_COMPONENT,
|
||||
CXL_DER_VALID_COMPONENT_ID_FORMAT, __entry->comp_id),
|
||||
__entry->hpa, __get_str(region_name), &__entry->region_uuid,
|
||||
__entry->sub_channel, show_cme_threshold_ev_flags(__entry->cme_threshold_ev_flags),
|
||||
__entry->cvme_count
|
||||
)
|
||||
);
|
||||
|
||||
/*
|
||||
* Memory Module Event Record - MMER
|
||||
*
|
||||
* CXL res 3.0 section 8.2.9.2.1.3; Table 8-45
|
||||
* CXL res 3.1 section 8.2.9.2.1.3; Table 8-47
|
||||
*/
|
||||
#define CXL_MMER_HEALTH_STATUS_CHANGE 0x00
|
||||
#define CXL_MMER_MEDIA_STATUS_CHANGE 0x01
|
||||
|
@ -510,27 +639,35 @@ TRACE_EVENT(cxl_dram,
|
|||
#define CXL_MMER_TEMP_CHANGE 0x03
|
||||
#define CXL_MMER_DATA_PATH_ERROR 0x04
|
||||
#define CXL_MMER_LSA_ERROR 0x05
|
||||
#define CXL_MMER_UNRECOV_SIDEBAND_BUS_ERROR 0x06
|
||||
#define CXL_MMER_MEMORY_MEDIA_FRU_ERROR 0x07
|
||||
#define CXL_MMER_POWER_MANAGEMENT_FAULT 0x08
|
||||
#define show_dev_evt_type(type) __print_symbolic(type, \
|
||||
{ CXL_MMER_HEALTH_STATUS_CHANGE, "Health Status Change" }, \
|
||||
{ CXL_MMER_MEDIA_STATUS_CHANGE, "Media Status Change" }, \
|
||||
{ CXL_MMER_LIFE_USED_CHANGE, "Life Used Change" }, \
|
||||
{ CXL_MMER_TEMP_CHANGE, "Temperature Change" }, \
|
||||
{ CXL_MMER_DATA_PATH_ERROR, "Data Path Error" }, \
|
||||
{ CXL_MMER_LSA_ERROR, "LSA Error" } \
|
||||
{ CXL_MMER_LSA_ERROR, "LSA Error" }, \
|
||||
{ CXL_MMER_UNRECOV_SIDEBAND_BUS_ERROR, "Unrecoverable Internal Sideband Bus Error" }, \
|
||||
{ CXL_MMER_MEMORY_MEDIA_FRU_ERROR, "Memory Media FRU Error" }, \
|
||||
{ CXL_MMER_POWER_MANAGEMENT_FAULT, "Power Management Fault" } \
|
||||
)
|
||||
|
||||
/*
|
||||
* Device Health Information - DHI
|
||||
*
|
||||
* CXL res 3.0 section 8.2.9.8.3.1; Table 8-100
|
||||
* CXL res 3.1 section 8.2.9.9.3.1; Table 8-133
|
||||
*/
|
||||
#define CXL_DHI_HS_MAINTENANCE_NEEDED BIT(0)
|
||||
#define CXL_DHI_HS_PERFORMANCE_DEGRADED BIT(1)
|
||||
#define CXL_DHI_HS_HW_REPLACEMENT_NEEDED BIT(2)
|
||||
#define CXL_DHI_HS_MEM_CAPACITY_DEGRADED BIT(3)
|
||||
#define show_health_status_flags(flags) __print_flags(flags, "|", \
|
||||
{ CXL_DHI_HS_MAINTENANCE_NEEDED, "MAINTENANCE_NEEDED" }, \
|
||||
{ CXL_DHI_HS_PERFORMANCE_DEGRADED, "PERFORMANCE_DEGRADED" }, \
|
||||
{ CXL_DHI_HS_HW_REPLACEMENT_NEEDED, "REPLACEMENT_NEEDED" } \
|
||||
{ CXL_DHI_HS_HW_REPLACEMENT_NEEDED, "REPLACEMENT_NEEDED" }, \
|
||||
{ CXL_DHI_HS_MEM_CAPACITY_DEGRADED, "MEM_CAPACITY_DEGRADED" } \
|
||||
)
|
||||
|
||||
#define CXL_DHI_MS_NORMAL 0x00
|
||||
|
@ -584,6 +721,26 @@ TRACE_EVENT(cxl_dram,
|
|||
#define CXL_DHI_AS_COR_VOL_ERR_CNT(as) ((as & 0x10) >> 4)
|
||||
#define CXL_DHI_AS_COR_PER_ERR_CNT(as) ((as & 0x20) >> 5)
|
||||
|
||||
#define CXL_MMER_VALID_COMPONENT BIT(0)
|
||||
#define CXL_MMER_VALID_COMPONENT_ID_FORMAT BIT(1)
|
||||
#define show_mem_module_valid_flags(flags) __print_flags(flags, "|", \
|
||||
{ CXL_MMER_VALID_COMPONENT, "COMPONENT" }, \
|
||||
{ CXL_MMER_VALID_COMPONENT_ID_FORMAT, "COMPONENT PLDM FORMAT" } \
|
||||
)
|
||||
#define CXL_MMER_DEV_EVT_SUB_TYPE_NOT_REPORTED 0x00
|
||||
#define CXL_MMER_DEV_EVT_SUB_TYPE_INVALID_CONFIG_DATA 0x01
|
||||
#define CXL_MMER_DEV_EVT_SUB_TYPE_UNSUPP_CONFIG_DATA 0x02
|
||||
#define CXL_MMER_DEV_EVT_SUB_TYPE_UNSUPP_MEM_MEDIA_FRU 0x03
|
||||
#define show_dev_event_sub_type(sub_type) __print_symbolic(sub_type, \
|
||||
{ CXL_MMER_DEV_EVT_SUB_TYPE_NOT_REPORTED, "Not Reported" }, \
|
||||
{ CXL_MMER_DEV_EVT_SUB_TYPE_INVALID_CONFIG_DATA, "Invalid Config Data" }, \
|
||||
{ CXL_MMER_DEV_EVT_SUB_TYPE_UNSUPP_CONFIG_DATA, "Unsupported Config Data" }, \
|
||||
{ \
|
||||
CXL_MMER_DEV_EVT_SUB_TYPE_UNSUPP_MEM_MEDIA_FRU, \
|
||||
"Unsupported Memory Media FRU" \
|
||||
} \
|
||||
)
|
||||
|
||||
TRACE_EVENT(cxl_memory_module,
|
||||
|
||||
TP_PROTO(const struct cxl_memdev *cxlmd, enum cxl_event_log_type log,
|
||||
|
@ -606,6 +763,9 @@ TRACE_EVENT(cxl_memory_module,
|
|||
__field(u32, cor_per_err_cnt)
|
||||
__field(s16, device_temp)
|
||||
__field(u8, add_status)
|
||||
__field(u8, event_sub_type)
|
||||
__array(u8, comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE)
|
||||
__field(u16, validity_flags)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
@ -614,6 +774,7 @@ TRACE_EVENT(cxl_memory_module,
|
|||
|
||||
/* Memory Module Event */
|
||||
__entry->event_type = rec->event_type;
|
||||
__entry->event_sub_type = rec->event_sub_type;
|
||||
|
||||
/* Device Health Info */
|
||||
__entry->health_status = rec->info.health_status;
|
||||
|
@ -624,13 +785,20 @@ TRACE_EVENT(cxl_memory_module,
|
|||
__entry->cor_per_err_cnt = get_unaligned_le32(rec->info.cor_per_err_cnt);
|
||||
__entry->device_temp = get_unaligned_le16(rec->info.device_temp);
|
||||
__entry->add_status = rec->info.add_status;
|
||||
__entry->validity_flags = get_unaligned_le16(rec->validity_flags);
|
||||
memcpy(__entry->comp_id, &rec->component_id,
|
||||
CXL_EVENT_GEN_MED_COMP_ID_SIZE);
|
||||
),
|
||||
|
||||
CXL_EVT_TP_printk("event_type='%s' health_status='%s' media_status='%s' " \
|
||||
"as_life_used=%s as_dev_temp=%s as_cor_vol_err_cnt=%s " \
|
||||
CXL_EVT_TP_printk("event_type='%s' event_sub_type='%s' health_status='%s' " \
|
||||
"media_status='%s' as_life_used=%s as_dev_temp=%s as_cor_vol_err_cnt=%s " \
|
||||
"as_cor_per_err_cnt=%s life_used=%u device_temp=%d " \
|
||||
"dirty_shutdown_cnt=%u cor_vol_err_cnt=%u cor_per_err_cnt=%u",
|
||||
"dirty_shutdown_cnt=%u cor_vol_err_cnt=%u cor_per_err_cnt=%u " \
|
||||
"validity_flags='%s' " \
|
||||
"comp_id=%s comp_id_pldm_valid_flags='%s' " \
|
||||
"pldm_entity_id=%s pldm_resource_id=%s",
|
||||
show_dev_evt_type(__entry->event_type),
|
||||
show_dev_event_sub_type(__entry->event_sub_type),
|
||||
show_health_status_flags(__entry->health_status),
|
||||
show_media_status(__entry->media_status),
|
||||
show_two_bit_status(CXL_DHI_AS_LIFE_USED(__entry->add_status)),
|
||||
|
@ -639,7 +807,14 @@ TRACE_EVENT(cxl_memory_module,
|
|||
show_one_bit_status(CXL_DHI_AS_COR_PER_ERR_CNT(__entry->add_status)),
|
||||
__entry->life_used, __entry->device_temp,
|
||||
__entry->dirty_shutdown_cnt, __entry->cor_vol_err_cnt,
|
||||
__entry->cor_per_err_cnt
|
||||
__entry->cor_per_err_cnt,
|
||||
show_mem_module_valid_flags(__entry->validity_flags),
|
||||
__print_hex(__entry->comp_id, CXL_EVENT_GEN_MED_COMP_ID_SIZE),
|
||||
show_comp_id_pldm_flags(__entry->comp_id[0]),
|
||||
show_pldm_entity_id(__entry->validity_flags, CXL_MMER_VALID_COMPONENT,
|
||||
CXL_MMER_VALID_COMPONENT_ID_FORMAT, __entry->comp_id),
|
||||
show_pldm_resource_id(__entry->validity_flags, CXL_MMER_VALID_COMPONENT,
|
||||
CXL_MMER_VALID_COMPONENT_ID_FORMAT, __entry->comp_id)
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
@ -302,10 +302,11 @@ int cxl_map_device_regs(const struct cxl_register_map *map,
|
|||
struct cxl_device_regs *regs);
|
||||
int cxl_map_pmu_regs(struct cxl_register_map *map, struct cxl_pmu_regs *regs);
|
||||
|
||||
#define CXL_INSTANCES_COUNT -1
|
||||
enum cxl_regloc_type;
|
||||
int cxl_count_regblock(struct pci_dev *pdev, enum cxl_regloc_type type);
|
||||
int cxl_find_regblock_instance(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map, int index);
|
||||
struct cxl_register_map *map, unsigned int index);
|
||||
int cxl_find_regblock(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map);
|
||||
int cxl_setup_regs(struct cxl_register_map *map);
|
||||
|
@ -821,7 +822,8 @@ struct cxl_hdm *devm_cxl_setup_hdm(struct cxl_port *port,
|
|||
int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm,
|
||||
struct cxl_endpoint_dvsec_info *info);
|
||||
int devm_cxl_add_passthrough_decoder(struct cxl_port *port);
|
||||
int cxl_dvsec_rr_decode(struct device *dev, struct cxl_port *port,
|
||||
struct cxl_dev_state;
|
||||
int cxl_dvsec_rr_decode(struct cxl_dev_state *cxlds,
|
||||
struct cxl_endpoint_dvsec_info *info);
|
||||
|
||||
bool is_cxl_region(struct device *dev);
|
||||
|
|
|
@ -907,7 +907,8 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
struct cxl_dev_state *cxlds;
|
||||
struct cxl_register_map map;
|
||||
struct cxl_memdev *cxlmd;
|
||||
int i, rc, pmu_count;
|
||||
int rc, pmu_count;
|
||||
unsigned int i;
|
||||
bool irq_avail;
|
||||
|
||||
/*
|
||||
|
@ -1009,6 +1010,9 @@ static int cxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
return rc;
|
||||
|
||||
pmu_count = cxl_count_regblock(pdev, CXL_REGLOC_RBI_PMU);
|
||||
if (pmu_count < 0)
|
||||
return pmu_count;
|
||||
|
||||
for (i = 0; i < pmu_count; i++) {
|
||||
struct cxl_pmu_regs pmu_regs;
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ static int cxl_endpoint_port_probe(struct cxl_port *port)
|
|||
struct cxl_port *root;
|
||||
int rc;
|
||||
|
||||
rc = cxl_dvsec_rr_decode(cxlds->dev, port, &info);
|
||||
rc = cxl_dvsec_rr_decode(cxlds, &info);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
|
|
|
@ -18,7 +18,8 @@ struct cxl_event_record_hdr {
|
|||
__le16 related_handle;
|
||||
__le64 timestamp;
|
||||
u8 maint_op_class;
|
||||
u8 reserved[15];
|
||||
u8 maint_op_sub_class;
|
||||
u8 reserved[14];
|
||||
} __packed;
|
||||
|
||||
struct cxl_event_media_hdr {
|
||||
|
@ -44,19 +45,22 @@ struct cxl_event_generic {
|
|||
|
||||
/*
|
||||
* General Media Event Record
|
||||
* CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
|
||||
* CXL rev 3.1 Section 8.2.9.2.1.1; Table 8-45
|
||||
*/
|
||||
#define CXL_EVENT_GEN_MED_COMP_ID_SIZE 0x10
|
||||
struct cxl_event_gen_media {
|
||||
struct cxl_event_media_hdr media_hdr;
|
||||
u8 device[3];
|
||||
u8 component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE];
|
||||
u8 reserved[46];
|
||||
u8 cme_threshold_ev_flags;
|
||||
u8 cme_count[3];
|
||||
u8 sub_type;
|
||||
u8 reserved[41];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* DRAM Event Record - DER
|
||||
* CXL rev 3.0 section 8.2.9.2.1.2; Table 3-44
|
||||
* CXL rev 3.1 section 8.2.9.2.1.2; Table 8-46
|
||||
*/
|
||||
#define CXL_EVENT_DER_CORRECTION_MASK_SIZE 0x20
|
||||
struct cxl_event_dram {
|
||||
|
@ -67,12 +71,17 @@ struct cxl_event_dram {
|
|||
u8 row[3];
|
||||
u8 column[2];
|
||||
u8 correction_mask[CXL_EVENT_DER_CORRECTION_MASK_SIZE];
|
||||
u8 reserved[0x17];
|
||||
u8 component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE];
|
||||
u8 sub_channel;
|
||||
u8 cme_threshold_ev_flags;
|
||||
u8 cvme_count[3];
|
||||
u8 sub_type;
|
||||
u8 reserved;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Get Health Info Record
|
||||
* CXL rev 3.0 section 8.2.9.8.3.1; Table 8-100
|
||||
* CXL rev 3.1 section 8.2.9.9.3.1; Table 8-133
|
||||
*/
|
||||
struct cxl_get_health_info {
|
||||
u8 health_status;
|
||||
|
@ -87,13 +96,16 @@ struct cxl_get_health_info {
|
|||
|
||||
/*
|
||||
* Memory Module Event Record
|
||||
* CXL rev 3.0 section 8.2.9.2.1.3; Table 8-45
|
||||
* CXL rev 3.1 section 8.2.9.2.1.3; Table 8-47
|
||||
*/
|
||||
struct cxl_event_mem_module {
|
||||
struct cxl_event_record_hdr hdr;
|
||||
u8 event_type;
|
||||
struct cxl_get_health_info info;
|
||||
u8 reserved[0x3d];
|
||||
u8 validity_flags[2];
|
||||
u8 component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE];
|
||||
u8 event_sub_type;
|
||||
u8 reserved[0x2a];
|
||||
} __packed;
|
||||
|
||||
union cxl_event {
|
||||
|
|
|
@ -401,6 +401,10 @@ struct cxl_test_gen_media gen_media = {
|
|||
.channel = 1,
|
||||
.rank = 30,
|
||||
},
|
||||
.component_id = { 0x3, 0x74, 0xc5, 0x8, 0x9a, 0x1a, 0xb, 0xfc, 0xd2, 0x7e, 0x2f, 0x31, 0x9b, 0x3c, 0x81, 0x4d },
|
||||
.cme_threshold_ev_flags = 3,
|
||||
.cme_count = { 33, 0, 0 },
|
||||
.sub_type = 0x2,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -429,6 +433,11 @@ struct cxl_test_dram dram = {
|
|||
.bank_group = 5,
|
||||
.bank = 2,
|
||||
.column = {0xDE, 0xAD},
|
||||
.component_id = { 0x1, 0x74, 0xc5, 0x8, 0x9a, 0x1a, 0xb, 0xfc, 0xd2, 0x7e, 0x2f, 0x31, 0x9b, 0x3c, 0x81, 0x4d },
|
||||
.sub_channel = 8,
|
||||
.cme_threshold_ev_flags = 2,
|
||||
.cvme_count = { 14, 0, 0 },
|
||||
.sub_type = 0x5,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -456,7 +465,10 @@ struct cxl_test_mem_module mem_module = {
|
|||
.dirty_shutdown_cnt = { 0xde, 0xad, 0xbe, 0xef },
|
||||
.cor_vol_err_cnt = { 0xde, 0xad, 0xbe, 0xef },
|
||||
.cor_per_err_cnt = { 0xde, 0xad, 0xbe, 0xef },
|
||||
}
|
||||
},
|
||||
/* .validity_flags = <set below> */
|
||||
.component_id = { 0x2, 0x74, 0xc5, 0x8, 0x9a, 0x1a, 0xb, 0xfc, 0xd2, 0x7e, 0x2f, 0x31, 0x9b, 0x3c, 0x81, 0x4d },
|
||||
.event_sub_type = 0x3,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -478,13 +490,18 @@ static int mock_set_timestamp(struct cxl_dev_state *cxlds,
|
|||
|
||||
static void cxl_mock_add_event_logs(struct mock_event_store *mes)
|
||||
{
|
||||
put_unaligned_le16(CXL_GMER_VALID_CHANNEL | CXL_GMER_VALID_RANK,
|
||||
put_unaligned_le16(CXL_GMER_VALID_CHANNEL | CXL_GMER_VALID_RANK |
|
||||
CXL_GMER_VALID_COMPONENT | CXL_GMER_VALID_COMPONENT_ID_FORMAT,
|
||||
&gen_media.rec.media_hdr.validity_flags);
|
||||
|
||||
put_unaligned_le16(CXL_DER_VALID_CHANNEL | CXL_DER_VALID_BANK_GROUP |
|
||||
CXL_DER_VALID_BANK | CXL_DER_VALID_COLUMN,
|
||||
CXL_DER_VALID_BANK | CXL_DER_VALID_COLUMN | CXL_DER_VALID_SUB_CHANNEL |
|
||||
CXL_DER_VALID_COMPONENT | CXL_DER_VALID_COMPONENT_ID_FORMAT,
|
||||
&dram.rec.media_hdr.validity_flags);
|
||||
|
||||
put_unaligned_le16(CXL_MMER_VALID_COMPONENT | CXL_MMER_VALID_COMPONENT_ID_FORMAT,
|
||||
&mem_module.rec.validity_flags);
|
||||
|
||||
mes_add_event(mes, CXL_EVENT_TYPE_INFO, &maint_needed);
|
||||
mes_add_event(mes, CXL_EVENT_TYPE_INFO,
|
||||
(struct cxl_event_record_raw *)&gen_media);
|
||||
|
|
|
@ -228,16 +228,16 @@ int __wrap_cxl_hdm_decode_init(struct cxl_dev_state *cxlds,
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(__wrap_cxl_hdm_decode_init, "CXL");
|
||||
|
||||
int __wrap_cxl_dvsec_rr_decode(struct device *dev, struct cxl_port *port,
|
||||
int __wrap_cxl_dvsec_rr_decode(struct cxl_dev_state *cxlds,
|
||||
struct cxl_endpoint_dvsec_info *info)
|
||||
{
|
||||
int rc = 0, index;
|
||||
struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
|
||||
|
||||
if (ops && ops->is_mock_dev(dev))
|
||||
if (ops && ops->is_mock_dev(cxlds->dev))
|
||||
rc = 0;
|
||||
else
|
||||
rc = cxl_dvsec_rr_decode(dev, port, info);
|
||||
rc = cxl_dvsec_rr_decode(cxlds, info);
|
||||
put_cxl_mock_ops(index);
|
||||
|
||||
return rc;
|
||||
|
|
Loading…
Add table
Reference in a new issue