Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1461471 > unrolled thread

[PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID mapping location

Started byKan Liang <kan.liang@intel.com>
First post2016-08-12 23:40 +0200
Last post2016-08-13 16:10 +0200
Articles 2 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID mapping location Kan Liang <kan.liang@intel.com> - 2016-08-12 23:40 +0200
    Re: [PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID  mapping location Nilay Vaish <nilayvaish@gmail.com> - 2016-08-13 16:10 +0200

#1461471 — [PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID mapping location

FromKan Liang <kan.liang@intel.com>
Date2016-08-12 23:40 +0200
Subject[PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID mapping location
Message-ID<s5slj-7eH-3@gated-at.bofh.it>
From: Kan Liang <kan.liang@intel.com>

The method to build PCI bus to socket mapping is similar among
platforms. However, the PCI location where store Node ID mapping could
vary for different platforms. For example, the Node ID mapping address
on Skylake server is different as the previous platform. Also, to build
the mapping for the PCI bus without UBOX, it has to start from bus 0 on
Skylake server.

This patch removes the hard code in current implementation, and adds
three parameters for snbep_pci2phy_map_init. So the Node ID mapping
address and bus searching direction could be configured according to
different platforms.

Signed-off-by: Kan Liang <kan.liang@intel.com>
---
 arch/x86/events/intel/uncore_snbep.c | 37 ++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c
index 8aee83b..3719af5 100644
--- a/arch/x86/events/intel/uncore_snbep.c
+++ b/arch/x86/events/intel/uncore_snbep.c
@@ -1,6 +1,10 @@
 /* SandyBridge-EP/IvyTown uncore support */
 #include "uncore.h"
 
+/* SNB-EP pci bus to socket mapping */
+#define SNBEP_CPUNODEID			0x40
+#define SNBEP_GIDNIDMAP			0x54
+
 /* SNB-EP Box level control */
 #define SNBEP_PMON_BOX_CTL_RST_CTRL	(1 << 0)
 #define SNBEP_PMON_BOX_CTL_RST_CTRS	(1 << 1)
@@ -1153,7 +1157,7 @@ static struct pci_driver snbep_uncore_pci_driver = {
 /*
  * build pci bus to socket mapping
  */
-static int snbep_pci2phy_map_init(int devid)
+static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool reverse)
 {
 	struct pci_dev *ubox_dev = NULL;
 	int i, bus, nodeid, segment;
@@ -1168,12 +1172,12 @@ static int snbep_pci2phy_map_init(int devid)
 			break;
 		bus = ubox_dev->bus->number;
 		/* get the Node ID of the local register */
-		err = pci_read_config_dword(ubox_dev, 0x40, &config);
+		err = pci_read_config_dword(ubox_dev, nodeid_loc, &config);
 		if (err)
 			break;
 		nodeid = config;
 		/* get the Node ID mapping */
-		err = pci_read_config_dword(ubox_dev, 0x54, &config);
+		err = pci_read_config_dword(ubox_dev, idmap_loc, &config);
 		if (err)
 			break;
 
@@ -1207,11 +1211,20 @@ static int snbep_pci2phy_map_init(int devid)
 		raw_spin_lock(&pci2phy_map_lock);
 		list_for_each_entry(map, &pci2phy_map_head, list) {
 			i = -1;
-			for (bus = 255; bus >= 0; bus--) {
-				if (map->pbus_to_physid[bus] >= 0)
-					i = map->pbus_to_physid[bus];
-				else
-					map->pbus_to_physid[bus] = i;
+			if (reverse) {
+				for (bus = 255; bus >= 0; bus--) {
+					if (map->pbus_to_physid[bus] >= 0)
+						i = map->pbus_to_physid[bus];
+					else
+						map->pbus_to_physid[bus] = i;
+				}
+			} else {
+				for (bus = 0; bus <= 255; bus++) {
+					if (map->pbus_to_physid[bus] >= 0)
+						i = map->pbus_to_physid[bus];
+					else
+						map->pbus_to_physid[bus] = i;
+				}
 			}
 		}
 		raw_spin_unlock(&pci2phy_map_lock);
@@ -1224,7 +1237,7 @@ static int snbep_pci2phy_map_init(int devid)
 
 int snbep_uncore_pci_init(void)
 {
-	int ret = snbep_pci2phy_map_init(0x3ce0);
+	int ret = snbep_pci2phy_map_init(0x3ce0, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
 	if (ret)
 		return ret;
 	uncore_pci_uncores = snbep_pci_uncores;
@@ -1788,7 +1801,7 @@ static struct pci_driver ivbep_uncore_pci_driver = {
 
 int ivbep_uncore_pci_init(void)
 {
-	int ret = snbep_pci2phy_map_init(0x0e1e);
+	int ret = snbep_pci2phy_map_init(0x0e1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
 	if (ret)
 		return ret;
 	uncore_pci_uncores = ivbep_pci_uncores;
@@ -2897,7 +2910,7 @@ static struct pci_driver hswep_uncore_pci_driver = {
 
 int hswep_uncore_pci_init(void)
 {
-	int ret = snbep_pci2phy_map_init(0x2f1e);
+	int ret = snbep_pci2phy_map_init(0x2f1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
 	if (ret)
 		return ret;
 	uncore_pci_uncores = hswep_pci_uncores;
@@ -3186,7 +3199,7 @@ static struct pci_driver bdx_uncore_pci_driver = {
 
 int bdx_uncore_pci_init(void)
 {
-	int ret = snbep_pci2phy_map_init(0x6f1e);
+	int ret = snbep_pci2phy_map_init(0x6f1e, SNBEP_CPUNODEID, SNBEP_GIDNIDMAP, true);
 
 	if (ret)
 		return ret;
-- 
2.5.5

[toc] | [next] | [standalone]


#1461625 — Re: [PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID mapping location

FromNilay Vaish <nilayvaish@gmail.com>
Date2016-08-13 16:10 +0200
SubjectRe: [PATCH 1/3] perf/x86/intel/uncore: remove hard code for Node ID mapping location
Message-ID<s5HNn-1We-1@gated-at.bofh.it>
In reply to#1461471
On 12 August 2016 at 16:30, Kan Liang <kan.liang@intel.com> wrote:
> From: Kan Liang <kan.liang@intel.com>
>
> The method to build PCI bus to socket mapping is similar among
> platforms. However, the PCI location where store Node ID mapping could

I think we should replace "where store" with "which store".

> vary for different platforms. For example, the Node ID mapping address
> on Skylake server is different as the previous platform. Also, to build

I think we should change "as the previous platform" to "from the
previous platforms".

> the mapping for the PCI bus without UBOX, it has to start from bus 0 on
> Skylake server.
>
> This patch removes the hard code in current implementation, and adds
> three parameters for snbep_pci2phy_map_init. So the Node ID mapping
> address and bus searching direction could be configured according to
> different platforms.
>
> Signed-off-by: Kan Liang <kan.liang@intel.com>
> ---
>  arch/x86/events/intel/uncore_snbep.c | 37 ++++++++++++++++++++++++------------
>  1 file changed, 25 insertions(+), 12 deletions(-)
>

Kan,  I have suggested a couple of changes to patch's description
above.  The main content of the patch seems good to me.


--
Nilay

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web