ACPI: HMAT / cxl: Add retrieval of generic port coordinates for both access classes
authorDave Jiang <dave.jiang@intel.com>
Fri, 8 Mar 2024 21:59:23 +0000 (14:59 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 12 Mar 2024 19:34:11 +0000 (12:34 -0700)
Update acpi_get_genport_coordinates() to allow retrieval of both access
classes of the 'struct access_coordinate' for a generic target. The update
will allow CXL code to compute access coordinates for both access class.

Cc: Rafael J. Wysocki <rafael@kernel.org>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Tested-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20240308220055.2172956-5-dave.jiang@intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/acpi/numa/hmat.c
drivers/cxl/acpi.c
drivers/cxl/core/port.c
drivers/cxl/cxl.h

index a1257888a6dfd4bd451ebbc3835249e67a1b4f9c..75e9aac43228a449a89b9c0666974ff917ebe1e1 100644 (file)
@@ -126,7 +126,8 @@ static struct memory_target *acpi_find_genport_target(u32 uid)
 /**
  * acpi_get_genport_coordinates - Retrieve the access coordinates for a generic port
  * @uid: ACPI unique id
- * @coord: The access coordinates written back out for the generic port
+ * @coord: The access coordinates written back out for the generic port.
+ *        Expect 2 levels array.
  *
  * Return: 0 on success. Errno on failure.
  *
@@ -142,7 +143,10 @@ int acpi_get_genport_coordinates(u32 uid,
        if (!target)
                return -ENOENT;
 
-       *coord = target->coord[NODE_ACCESS_CLASS_GENPORT_SINK_LOCAL];
+       coord[ACCESS_COORDINATE_LOCAL] =
+               target->coord[NODE_ACCESS_CLASS_GENPORT_SINK_LOCAL];
+       coord[ACCESS_COORDINATE_CPU] =
+               target->coord[NODE_ACCESS_CLASS_GENPORT_SINK_CPU];
 
        return 0;
 }
index 1a3e6aafbdcc33dd2aae8731be8a5ad52cc0891e..af5cb818f84d6bf566e6c0a84763d8239d64700f 100644 (file)
@@ -530,13 +530,15 @@ static int get_genport_coordinates(struct device *dev, struct cxl_dport *dport)
        if (kstrtou32(acpi_device_uid(hb), 0, &uid))
                return -EINVAL;
 
-       rc = acpi_get_genport_coordinates(uid, &dport->hb_coord);
+       rc = acpi_get_genport_coordinates(uid, dport->hb_coord);
        if (rc < 0)
                return rc;
 
        /* Adjust back to picoseconds from nanoseconds */
-       dport->hb_coord.read_latency *= 1000;
-       dport->hb_coord.write_latency *= 1000;
+       for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) {
+               dport->hb_coord[i].read_latency *= 1000;
+               dport->hb_coord[i].write_latency *= 1000;
+       }
 
        return 0;
 }
index e59d9d37aa65009c97326fa93ec869dee709804d..612bf7e1e8474e72a65a17b2ee6ed5a9e0a20f40 100644 (file)
@@ -2152,7 +2152,7 @@ int cxl_endpoint_get_perf_coordinates(struct cxl_port *port,
        }
 
        /* Augment with the generic port (host bridge) perf data */
-       combine_coordinates(&c, &dport->hb_coord);
+       combine_coordinates(&c, &dport->hb_coord[ACCESS_COORDINATE_LOCAL]);
 
        /* Get the calculated PCI paths bandwidth */
        pdev = to_pci_dev(port->uport_dev->parent);
index 003feebab79b5f8e7563ba2e32665b4377871a55..fe7448f2745e19d22b3befaa14d8993a68be6aff 100644 (file)
@@ -671,7 +671,7 @@ struct cxl_dport {
        struct cxl_port *port;
        struct cxl_regs regs;
        struct access_coordinate sw_coord;
-       struct access_coordinate hb_coord;
+       struct access_coordinate hb_coord[ACCESS_COORDINATE_MAX];
        long link_latency;
 };