Commit fdd04102 authored by Alexander Antonov's avatar Alexander Antonov Committed by Peter Zijlstra
Browse files

perf/x86/intel/uncore: Factor out topology_gidnid_map()



The same code is used for retrieving package ID procedure from GIDNIDMAP
register. Factor out topology_gidnid_map() to avoid code duplication.

Signed-off-by: default avatarAlexander Antonov <alexander.antonov@linux.intel.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarKan Liang <kan.liang@linux.intel.com>
Link: https://lore.kernel.org/r/20231127185246.2371939-3-alexander.antonov@linux.intel.com
parent 1692cf43
Loading
Loading
Loading
Loading
+40 −37
Original line number Diff line number Diff line
@@ -1396,6 +1396,29 @@ static int upi_nodeid_groupid(struct pci_dev *ubox_dev, int nodeid_loc, int idma
	return ret;
}

static int topology_gidnid_map(int nodeid, u32 gidnid)
{
	int i, die_id = -1;

	/*
	 * every three bits in the Node ID mapping register maps
	 * to a particular node.
	 */
	for (i = 0; i < 8; i++) {
		if (nodeid == GIDNIDMAP(gidnid, i)) {
			if (topology_max_die_per_package() > 1)
				die_id = i;
			else
				die_id = topology_phys_to_logical_pkg(i);
			if (die_id < 0)
				die_id = -ENODEV;
			break;
		}
	}

	return die_id;
}

/*
 * build pci bus to socket mapping
 */
@@ -1435,22 +1458,7 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool
				break;
			}

			/*
			 * every three bits in the Node ID mapping register maps
			 * to a particular node.
			 */
			for (i = 0; i < 8; i++) {
				if (nodeid == GIDNIDMAP(config, i)) {
					if (topology_max_die_per_package() > 1)
						die_id = i;
					else
						die_id = topology_phys_to_logical_pkg(i);
					if (die_id < 0)
						die_id = -ENODEV;
					map->pbus_to_dieid[bus] = die_id;
					break;
				}
			}
			map->pbus_to_dieid[bus] = topology_gidnid_map(nodeid, config);
			raw_spin_unlock(&pci2phy_map_lock);
		} else {
			segment = pci_domain_nr(ubox_dev->bus);
@@ -5596,7 +5604,7 @@ static int discover_upi_topology(struct intel_uncore_type *type, int ubox_did, i
	struct pci_dev *ubox = NULL;
	struct pci_dev *dev = NULL;
	u32 nid, gid;
	int i, idx, lgc_pkg, ret = -EPERM;
	int idx, lgc_pkg, ret = -EPERM;
	struct intel_uncore_topology *upi;
	unsigned int devfn;

@@ -5611,10 +5619,7 @@ static int discover_upi_topology(struct intel_uncore_type *type, int ubox_did, i
			break;
		}

		for (i = 0; i < 8; i++) {
			if (nid != GIDNIDMAP(gid, i))
				continue;
			lgc_pkg = topology_phys_to_logical_pkg(i);
		lgc_pkg = topology_gidnid_map(nid, gid);
		if (lgc_pkg < 0) {
			ret = -EPERM;
			goto err;
@@ -5631,8 +5636,6 @@ static int discover_upi_topology(struct intel_uncore_type *type, int ubox_did, i
					goto err;
			}
		}
			break;
		}
	}
err:
	pci_dev_put(ubox);