]> Git Repo - linux.git/commitdiff
Merge branch 'for-6.8/cxl-cper' into for-6.8/cxl
authorDan Williams <[email protected]>
Wed, 10 Jan 2024 03:21:44 +0000 (19:21 -0800)
committerDan Williams <[email protected]>
Wed, 10 Jan 2024 03:21:44 +0000 (19:21 -0800)
Pick up the CPER to CXL driver integration work for v6.8. Some
additional cleanup of cper_estatus_print() messages is needed, but that
is to be handled incrementally.

1  2 
drivers/cxl/core/mbox.c
drivers/cxl/cxlmem.h
include/linux/pci.h

diff --combined drivers/cxl/core/mbox.c
index d51a1f250c8cdd9e314dd54331ac65dda6d12844,23021920aaceef25f8622f92983fac3e9f814fe7..27166a41170579a9441a2f9bf3e2a915ed85d893
@@@ -63,7 -63,6 +63,7 @@@ static struct cxl_mem_command cxl_mem_c
        CXL_CMD(GET_SHUTDOWN_STATE, 0, 0x1, 0),
        CXL_CMD(SET_SHUTDOWN_STATE, 0x1, 0, 0),
        CXL_CMD(GET_SCAN_MEDIA_CAPS, 0x10, 0x4, 0),
 +      CXL_CMD(GET_TIMESTAMP, 0, 0x8, 0),
  };
  
  /*
@@@ -837,54 -836,37 +837,37 @@@ out
  }
  EXPORT_SYMBOL_NS_GPL(cxl_enumerate_cmds, CXL);
  
- /*
-  * General Media Event Record
-  * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
-  */
- static const uuid_t gen_media_event_uuid =
-       UUID_INIT(0xfbcd0a77, 0xc260, 0x417f,
-                 0x85, 0xa9, 0x08, 0x8b, 0x16, 0x21, 0xeb, 0xa6);
- /*
-  * DRAM Event Record
-  * CXL rev 3.0 section 8.2.9.2.1.2; Table 8-44
-  */
- static const uuid_t dram_event_uuid =
-       UUID_INIT(0x601dcbb3, 0x9c06, 0x4eab,
-                 0xb8, 0xaf, 0x4e, 0x9b, 0xfb, 0x5c, 0x96, 0x24);
- /*
-  * Memory Module Event Record
-  * CXL rev 3.0 section 8.2.9.2.1.3; Table 8-45
-  */
- static const uuid_t mem_mod_event_uuid =
-       UUID_INIT(0xfe927475, 0xdd59, 0x4339,
-                 0xa5, 0x86, 0x79, 0xba, 0xb1, 0x13, 0xb7, 0x74);
- static void cxl_event_trace_record(const struct cxl_memdev *cxlmd,
-                                  enum cxl_event_log_type type,
-                                  struct cxl_event_record_raw *record)
+ void cxl_event_trace_record(const struct cxl_memdev *cxlmd,
+                           enum cxl_event_log_type type,
+                           enum cxl_event_type event_type,
+                           const uuid_t *uuid, union cxl_event *evt)
  {
-       uuid_t *id = &record->hdr.id;
-       if (uuid_equal(id, &gen_media_event_uuid)) {
-               struct cxl_event_gen_media *rec =
-                               (struct cxl_event_gen_media *)record;
+       if (event_type == CXL_CPER_EVENT_GEN_MEDIA)
+               trace_cxl_general_media(cxlmd, type, &evt->gen_media);
+       else if (event_type == CXL_CPER_EVENT_DRAM)
+               trace_cxl_dram(cxlmd, type, &evt->dram);
+       else if (event_type == CXL_CPER_EVENT_MEM_MODULE)
+               trace_cxl_memory_module(cxlmd, type, &evt->mem_module);
+       else
+               trace_cxl_generic_event(cxlmd, type, uuid, &evt->generic);
+ }
+ EXPORT_SYMBOL_NS_GPL(cxl_event_trace_record, CXL);
  
-               trace_cxl_general_media(cxlmd, type, rec);
-       } else if (uuid_equal(id, &dram_event_uuid)) {
-               struct cxl_event_dram *rec = (struct cxl_event_dram *)record;
+ static void __cxl_event_trace_record(const struct cxl_memdev *cxlmd,
+                                    enum cxl_event_log_type type,
+                                    struct cxl_event_record_raw *record)
+ {
+       enum cxl_event_type ev_type = CXL_CPER_EVENT_GENERIC;
+       const uuid_t *uuid = &record->id;
  
-               trace_cxl_dram(cxlmd, type, rec);
-       } else if (uuid_equal(id, &mem_mod_event_uuid)) {
-               struct cxl_event_mem_module *rec =
-                               (struct cxl_event_mem_module *)record;
+       if (uuid_equal(uuid, &CXL_EVENT_GEN_MEDIA_UUID))
+               ev_type = CXL_CPER_EVENT_GEN_MEDIA;
+       else if (uuid_equal(uuid, &CXL_EVENT_DRAM_UUID))
+               ev_type = CXL_CPER_EVENT_DRAM;
+       else if (uuid_equal(uuid, &CXL_EVENT_MEM_MODULE_UUID))
+               ev_type = CXL_CPER_EVENT_MEM_MODULE;
  
-               trace_cxl_memory_module(cxlmd, type, rec);
-       } else {
-               /* For unknown record types print just the header */
-               trace_cxl_generic_event(cxlmd, type, record);
-       }
+       cxl_event_trace_record(cxlmd, type, ev_type, uuid, &record->event);
  }
  
  static int cxl_clear_event_record(struct cxl_memdev_state *mds,
         */
        i = 0;
        for (cnt = 0; cnt < total; cnt++) {
-               payload->handles[i++] = get_pl->records[cnt].hdr.handle;
+               struct cxl_event_record_raw *raw = &get_pl->records[cnt];
+               struct cxl_event_generic *gen = &raw->event.generic;
+               payload->handles[i++] = gen->hdr.handle;
                dev_dbg(mds->cxlds.dev, "Event log '%d': Clearing %u\n", log,
                        le16_to_cpu(payload->handles[i]));
  
@@@ -992,8 -977,8 +978,8 @@@ static void cxl_mem_get_records_log(str
                        break;
  
                for (i = 0; i < nr_rec; i++)
-                       cxl_event_trace_record(cxlmd, type,
-                                              &payload->records[i]);
+                       __cxl_event_trace_record(cxlmd, type,
+                                                &payload->records[i]);
  
                if (payload->flags & CXL_GET_EVENT_FLAG_OVERFLOW)
                        trace_cxl_overflow(cxlmd, type, payload);
@@@ -1405,8 -1390,6 +1391,8 @@@ struct cxl_memdev_state *cxl_memdev_sta
        mds->cxlds.reg_map.host = dev;
        mds->cxlds.reg_map.resource = CXL_RESOURCE_NONE;
        mds->cxlds.type = CXL_DEVTYPE_CLASSMEM;
 +      INIT_LIST_HEAD(&mds->ram_perf_list);
 +      INIT_LIST_HEAD(&mds->pmem_perf_list);
  
        return mds;
  }
diff --combined drivers/cxl/cxlmem.h
index 1125d4f988e107e464d6ca40c11965935751ae36,3c201324a3b3e0c9e8cda6d726b0b05ae1ee0b13..5303d6942b880af65dcf8e77b02d26626c2bb94d
@@@ -6,7 -6,7 +6,8 @@@
  #include <linux/cdev.h>
  #include <linux/uuid.h>
  #include <linux/rcuwait.h>
+ #include <linux/cxl-event.h>
 +#include <linux/node.h>
  #include "cxl.h"
  
  /* CXL 2.0 8.2.8.5.1.1 Memory Device Status Register */
@@@ -392,20 -392,6 +393,20 @@@ enum cxl_devtype 
        CXL_DEVTYPE_CLASSMEM,
  };
  
 +/**
 + * struct cxl_dpa_perf - DPA performance property entry
 + * @list - list entry
 + * @dpa_range - range for DPA address
 + * @coord - QoS performance data (i.e. latency, bandwidth)
 + * @qos_class - QoS Class cookies
 + */
 +struct cxl_dpa_perf {
 +      struct list_head list;
 +      struct range dpa_range;
 +      struct access_coordinate coord;
 +      int qos_class;
 +};
 +
  /**
   * struct cxl_dev_state - The driver device state
   *
@@@ -470,8 -456,6 +471,8 @@@ struct cxl_dev_state 
   * @security: security driver state info
   * @fw: firmware upload / activation state
   * @mbox_send: @dev specific transport for transmitting mailbox commands
 + * @ram_perf_list: performance data entries matched to RAM
 + * @pmem_perf_list: performance data entries matched to PMEM
   *
   * See CXL 3.0 8.2.9.8.2 Capacity Configuration and Label Storage for
   * details on capacity parameters.
@@@ -492,10 -476,6 +493,10 @@@ struct cxl_memdev_state 
        u64 active_persistent_bytes;
        u64 next_volatile_bytes;
        u64 next_persistent_bytes;
 +
 +      struct list_head ram_perf_list;
 +      struct list_head pmem_perf_list;
 +
        struct cxl_event_state event;
        struct cxl_poison_state poison;
        struct cxl_security_state security;
@@@ -524,7 -504,6 +525,7 @@@ enum cxl_opcode 
        CXL_MBOX_OP_GET_FW_INFO         = 0x0200,
        CXL_MBOX_OP_TRANSFER_FW         = 0x0201,
        CXL_MBOX_OP_ACTIVATE_FW         = 0x0202,
 +      CXL_MBOX_OP_GET_TIMESTAMP       = 0x0300,
        CXL_MBOX_OP_SET_TIMESTAMP       = 0x0301,
        CXL_MBOX_OP_GET_SUPPORTED_LOGS  = 0x0400,
        CXL_MBOX_OP_GET_LOG             = 0x0401,
@@@ -602,25 -581,28 +603,28 @@@ struct cxl_mbox_identify 
  } __packed;
  
  /*
-  * Common Event Record Format
-  * CXL rev 3.0 section 8.2.9.2.1; Table 8-42
+  * General Media Event Record UUID
+  * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
   */
- struct cxl_event_record_hdr {
-       uuid_t id;
-       u8 length;
-       u8 flags[3];
-       __le16 handle;
-       __le16 related_handle;
-       __le64 timestamp;
-       u8 maint_op_class;
-       u8 reserved[15];
- } __packed;
+ #define CXL_EVENT_GEN_MEDIA_UUID                                            \
+       UUID_INIT(0xfbcd0a77, 0xc260, 0x417f, 0x85, 0xa9, 0x08, 0x8b, 0x16, \
+                 0x21, 0xeb, 0xa6)
  
- #define CXL_EVENT_RECORD_DATA_LENGTH 0x50
- struct cxl_event_record_raw {
-       struct cxl_event_record_hdr hdr;
-       u8 data[CXL_EVENT_RECORD_DATA_LENGTH];
- } __packed;
+ /*
+  * DRAM Event Record UUID
+  * CXL rev 3.0 section 8.2.9.2.1.2; Table 8-44
+  */
+ #define CXL_EVENT_DRAM_UUID                                                 \
+       UUID_INIT(0x601dcbb3, 0x9c06, 0x4eab, 0xb8, 0xaf, 0x4e, 0x9b, 0xfb, \
+                 0x5c, 0x96, 0x24)
+ /*
+  * Memory Module Event Record UUID
+  * CXL rev 3.0 section 8.2.9.2.1.3; Table 8-45
+  */
+ #define CXL_EVENT_MEM_MODULE_UUID                                           \
+       UUID_INIT(0xfe927475, 0xdd59, 0x4339, 0xa5, 0x86, 0x79, 0xba, 0xb1, \
+                 0x13, 0xb7, 0x74)
  
  /*
   * Get Event Records output payload
@@@ -663,74 -645,6 +667,6 @@@ struct cxl_mbox_clear_event_payload 
  } __packed;
  #define CXL_CLEAR_EVENT_MAX_HANDLES U8_MAX
  
- /*
-  * General Media Event Record
-  * CXL rev 3.0 Section 8.2.9.2.1.1; Table 8-43
-  */
- #define CXL_EVENT_GEN_MED_COMP_ID_SIZE        0x10
- struct cxl_event_gen_media {
-       struct cxl_event_record_hdr hdr;
-       __le64 phys_addr;
-       u8 descriptor;
-       u8 type;
-       u8 transaction_type;
-       u8 validity_flags[2];
-       u8 channel;
-       u8 rank;
-       u8 device[3];
-       u8 component_id[CXL_EVENT_GEN_MED_COMP_ID_SIZE];
-       u8 reserved[46];
- } __packed;
- /*
-  * DRAM Event Record - DER
-  * CXL rev 3.0 section 8.2.9.2.1.2; Table 3-44
-  */
- #define CXL_EVENT_DER_CORRECTION_MASK_SIZE    0x20
- struct cxl_event_dram {
-       struct cxl_event_record_hdr hdr;
-       __le64 phys_addr;
-       u8 descriptor;
-       u8 type;
-       u8 transaction_type;
-       u8 validity_flags[2];
-       u8 channel;
-       u8 rank;
-       u8 nibble_mask[3];
-       u8 bank_group;
-       u8 bank;
-       u8 row[3];
-       u8 column[2];
-       u8 correction_mask[CXL_EVENT_DER_CORRECTION_MASK_SIZE];
-       u8 reserved[0x17];
- } __packed;
- /*
-  * Get Health Info Record
-  * CXL rev 3.0 section 8.2.9.8.3.1; Table 8-100
-  */
- struct cxl_get_health_info {
-       u8 health_status;
-       u8 media_status;
-       u8 add_status;
-       u8 life_used;
-       u8 device_temp[2];
-       u8 dirty_shutdown_cnt[4];
-       u8 cor_vol_err_cnt[4];
-       u8 cor_per_err_cnt[4];
- } __packed;
- /*
-  * Memory Module Event Record
-  * CXL rev 3.0 section 8.2.9.2.1.3; Table 8-45
-  */
- struct cxl_event_mem_module {
-       struct cxl_event_record_hdr hdr;
-       u8 event_type;
-       struct cxl_get_health_info info;
-       u8 reserved[0x3d];
- } __packed;
  struct cxl_mbox_get_partition_info {
        __le64 active_volatile_cap;
        __le64 active_persistent_cap;
@@@ -888,6 -802,10 +824,10 @@@ void set_exclusive_cxl_commands(struct 
  void clear_exclusive_cxl_commands(struct cxl_memdev_state *mds,
                                  unsigned long *cmds);
  void cxl_mem_get_event_records(struct cxl_memdev_state *mds, u32 status);
+ void cxl_event_trace_record(const struct cxl_memdev *cxlmd,
+                           enum cxl_event_log_type type,
+                           enum cxl_event_type event_type,
+                           const uuid_t *uuid, union cxl_event *evt);
  int cxl_set_timestamp(struct cxl_memdev_state *mds);
  int cxl_poison_state_init(struct cxl_memdev_state *mds);
  int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,
diff --combined include/linux/pci.h
index 504a4ba2c29efd6c79e0590edaf6260bbb8c22b5,0d23d2e0eb1a455f7fe488bfc11c0fb90d0c4803..bf6c02bee49f2768eba17c90a07f58d7cdb8a34c
@@@ -1170,6 -1170,7 +1170,7 @@@ int pci_get_interrupt_pin(struct pci_de
  u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp);
  struct pci_dev *pci_dev_get(struct pci_dev *dev);
  void pci_dev_put(struct pci_dev *dev);
+ DEFINE_FREE(pci_dev_put, struct pci_dev *, if (_T) pci_dev_put(_T))
  void pci_remove_bus(struct pci_bus *b);
  void pci_stop_and_remove_bus_device(struct pci_dev *dev);
  void pci_stop_and_remove_bus_device_locked(struct pci_dev *dev);
@@@ -1364,7 -1365,6 +1365,7 @@@ int pcie_set_mps(struct pci_dev *dev, i
  u32 pcie_bandwidth_available(struct pci_dev *dev, struct pci_dev **limiting_dev,
                             enum pci_bus_speed *speed,
                             enum pcie_link_width *width);
 +int pcie_link_speed_mbps(struct pci_dev *pdev);
  void pcie_print_link_status(struct pci_dev *dev);
  int pcie_reset_flr(struct pci_dev *dev, bool probe);
  int pcie_flr(struct pci_dev *dev);
@@@ -1875,6 -1875,7 +1876,7 @@@ void pci_cfg_access_unlock(struct pci_d
  void pci_dev_lock(struct pci_dev *dev);
  int pci_dev_trylock(struct pci_dev *dev);
  void pci_dev_unlock(struct pci_dev *dev);
+ DEFINE_GUARD(pci_dev, struct pci_dev *, pci_dev_lock(_T), pci_dev_unlock(_T))
  
  /*
   * PCI domain support.  Sometimes called PCI segment (eg by ACPI),
This page took 0.096552 seconds and 4 git commands to generate.