Commit a3a3e341 authored by Dave Jiang's avatar Dave Jiang Committed by Dan Williams

acpi: numa: Add setting of generic port system locality attributes

Add generic port support for the parsing of HMAT system locality sub-table.
The attributes will be added to the third array member of the access
coordinates in order to not mix with the existing memory attributes. It
only provides the system locality attributes from initiator to the
generic port targets and is missing the rest of the data to the actual
memory device.

The complete attributes will be updated when a memory device is
attached and the system locality information is calculated end to end.

Through hmat_update_target_attrs(), the best performance attributes will
be setup in target->coord.
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Link: https://lore.kernel.org/r/170319618135.2212653.13778540010384821833.stgit@djiang5-mobl3Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 79205651
...@@ -61,6 +61,7 @@ struct target_cache { ...@@ -61,6 +61,7 @@ struct target_cache {
enum { enum {
NODE_ACCESS_CLASS_0 = 0, NODE_ACCESS_CLASS_0 = 0,
NODE_ACCESS_CLASS_1, NODE_ACCESS_CLASS_1,
NODE_ACCESS_CLASS_GENPORT_SINK,
NODE_ACCESS_CLASS_MAX, NODE_ACCESS_CLASS_MAX,
}; };
...@@ -654,6 +655,11 @@ static void hmat_update_target_attrs(struct memory_target *target, ...@@ -654,6 +655,11 @@ static void hmat_update_target_attrs(struct memory_target *target,
u32 best = 0; u32 best = 0;
int i; int i;
/* Don't update for generic port if there's no device handle */
if (access == NODE_ACCESS_CLASS_GENPORT_SINK &&
!(*(u16 *)target->gen_port_device_handle))
return;
bitmap_zero(p_nodes, MAX_NUMNODES); bitmap_zero(p_nodes, MAX_NUMNODES);
/* /*
* If the Address Range Structure provides a local processor pxm, set * If the Address Range Structure provides a local processor pxm, set
...@@ -723,6 +729,14 @@ static void __hmat_register_target_initiators(struct memory_target *target, ...@@ -723,6 +729,14 @@ static void __hmat_register_target_initiators(struct memory_target *target,
} }
} }
static void hmat_register_generic_target_initiators(struct memory_target *target)
{
static DECLARE_BITMAP(p_nodes, MAX_NUMNODES);
__hmat_register_target_initiators(target, p_nodes,
NODE_ACCESS_CLASS_GENPORT_SINK);
}
static void hmat_register_target_initiators(struct memory_target *target) static void hmat_register_target_initiators(struct memory_target *target)
{ {
static DECLARE_BITMAP(p_nodes, MAX_NUMNODES); static DECLARE_BITMAP(p_nodes, MAX_NUMNODES);
...@@ -774,6 +788,17 @@ static void hmat_register_target(struct memory_target *target) ...@@ -774,6 +788,17 @@ static void hmat_register_target(struct memory_target *target)
*/ */
hmat_register_target_devices(target); hmat_register_target_devices(target);
/*
* Register generic port perf numbers. The nid may not be
* initialized and is still NUMA_NO_NODE.
*/
mutex_lock(&target_lock);
if (*(u16 *)target->gen_port_device_handle) {
hmat_register_generic_target_initiators(target);
target->registered = true;
}
mutex_unlock(&target_lock);
/* /*
* Skip offline nodes. This can happen when memory * Skip offline nodes. This can happen when memory
* marked EFI_MEMORY_SP, "specific purpose", is applied * marked EFI_MEMORY_SP, "specific purpose", is applied
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment