[Skiboot] [PATCH v7 2/9] OPAL nest feature detection

Madhavan Srinivasan maddy at linux.vnet.ibm.com
Tue Mar 1 21:40:26 AEDT 2016


Initialize the nest pmu and load the nest meta-data. The
nest events supported by HW are available as a lid (meta-data),
called "Catalog". The catalog lid loaded in two parts. First,
it is queued for loading in the preload function and in the second, loaded
catalog is verified and used to detect chip nest instrumentation support.
New file called "nest.c" added to "hw/" to contain nest support code.
Makefile changes made to include "nest.c".

Signed-off-by: Madhavan Srinivasan <maddy at linux.vnet.ibm.com>
---
 core/flash.c       |   1 +
 core/init.c        |   9 ++++
 hw/Makefile.inc    |   2 +-
 hw/fsp/fsp.c       |   2 +
 hw/nest.c          | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/platform.h |   1 +
 6 files changed, 137 insertions(+), 1 deletion(-)
 create mode 100644 hw/nest.c

diff --git a/core/flash.c b/core/flash.c
index 746db6f8ae8c..88ef4441167a 100644
--- a/core/flash.c
+++ b/core/flash.c
@@ -381,6 +381,7 @@ static struct {
 	{ RESOURCE_ID_KERNEL,	RESOURCE_SUBID_NONE,		"BOOTKERNEL" },
 	{ RESOURCE_ID_INITRAMFS,RESOURCE_SUBID_NONE,		"ROOTFS" },
 	{ RESOURCE_ID_CAPP,	RESOURCE_SUBID_SUPPORTED,	"CAPP" },
+	{ RESOURCE_ID_CATALOG,	RESOURCE_SUBID_NONE,		"CATALOG" },
 };
 
 /* This mimics the hostboot SBE format */
diff --git a/core/init.c b/core/init.c
index 54a5735f8239..b73d2753f304 100644
--- a/core/init.c
+++ b/core/init.c
@@ -44,6 +44,7 @@
 #include <timer.h>
 #include <ipmi.h>
 #include <sensor.h>
+#include <nest.h>
 
 enum proc_gen proc_gen;
 
@@ -552,6 +553,8 @@ static void do_ctors(void)
 
 void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 {
+	int loaded;
+
 	/*
 	 * WARNING: At this point. the timebases have
 	 * *not* been synchronized yet. Do not use any timebase
@@ -711,6 +714,9 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 	if (platform.init)
 		platform.init();
 
+	/* Start Nest pmu catalog lid loading */
+	loaded = preload_catalog_lid();
+
 	/* Setup dummy console nodes if it's enabled */
 	if (dummy_console_enabled())
 		dummy_console_add_nodes();
@@ -718,6 +724,9 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 	/* Init SLW related stuff, including fastsleep */
 	slw_init();
 
+	/* Init Nest PMU unit */
+	nest_pmu_init(loaded);
+
 	op_display(OP_LOG, OP_MOD_INIT, 0x0002);
 
 	/* Read in NVRAM and set it up */
diff --git a/hw/Makefile.inc b/hw/Makefile.inc
index a9dd9f1fc0bd..bee8c38790c6 100644
--- a/hw/Makefile.inc
+++ b/hw/Makefile.inc
@@ -2,7 +2,7 @@
 
 SUBDIRS += hw
 HW_OBJS  = xscom.o chiptod.o gx.o cec.o lpc.o lpc-uart.o psi.o
-HW_OBJS += homer.o slw.o occ.o fsi-master.o centaur.o
+HW_OBJS += homer.o slw.o occ.o fsi-master.o centaur.o nest.o
 HW_OBJS += nx.o nx-rng.o nx-crypto.o nx-842.o
 HW_OBJS += p7ioc.o p7ioc-inits.o p7ioc-phb.o
 HW_OBJS += phb3.o sfc-ctrl.o fake-rtc.o bt.o p8-i2c.o prd.o
diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
index 26ae71e2fe08..df10a6220ce4 100644
--- a/hw/fsp/fsp.c
+++ b/hw/fsp/fsp.c
@@ -116,6 +116,7 @@ static u64 fsp_hir_timeout;
 #define KERNEL_LID_PHYP			0x80a00701
 #define KERNEL_LID_OPAL			0x80f00101
 #define INITRAMFS_LID_OPAL		0x80f00102
+#define NEST_CATALOG_LID		0x81e00610
 
 /*
  * We keep track on last logged values for some things to print only on
@@ -2272,6 +2273,7 @@ static struct {
 	{ RESOURCE_ID_CAPP,	CAPP_IDX_MURANO_DD21,	0x80a02001 },
 	{ RESOURCE_ID_CAPP,	CAPP_IDX_VENICE_DD10,	0x80a02003 },
 	{ RESOURCE_ID_CAPP,	CAPP_IDX_VENICE_DD20,	0x80a02004 },
+	{ RESOURCE_ID_CATALOG,	RESOURCE_SUBID_NONE,	NEST_CATALOG_LID},
 };
 
 static void fsp_start_fetching_next_lid(void);
diff --git a/hw/nest.c b/hw/nest.c
new file mode 100644
index 000000000000..50b4942adba5
--- /dev/null
+++ b/hw/nest.c
@@ -0,0 +1,123 @@
+/* Copyright 2016 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * Locking notes:
+ */
+
+#include <skiboot.h>
+#include <device.h>
+#include <nest.h>
+#include <chip.h>
+#include <cpu.h>
+#include <xscom.h>
+#include <timebase.h>
+#include <opal-api.h>
+#include <opal-internal.h>
+#include <io.h>
+#include <platform.h>
+
+/*
+ * Pointer to hold the Catalog file in memory
+ */
+struct nest_catalog_desc *catalog_desc;
+
+/*
+ * Catalog Page-0 (each page is 4K bytes long) contains
+ * information about event, group, formula structure offsets
+ * in the catalog. Cache these offsets in struct nest_catalog_page_0
+ * to help the search later.
+ */
+struct nest_catalog_page_0 *page0_desc;
+
+int preload_catalog_lid()
+{
+	struct proc_chip *chip = get_chip(this_cpu()->chip_id);
+	size_t size = NEST_CATALOG_SIZE;
+	int loaded;
+
+	/*
+	 * Disble the nest instrumentation feature on POWER8 murano system.
+	 */
+	if (chip->type == PROC_CHIP_P8_MURANO)
+		return -1;
+
+        catalog_desc = malloc(sizeof(struct nest_catalog_desc));
+	if (!catalog_desc) {
+		prerror("nest-counters: No mem for nest_catalog_desc structure\n");
+		return OPAL_NO_MEM;
+	}
+
+	catalog_desc->catalog = malloc(NEST_CATALOG_SIZE);
+	if (!catalog_desc->catalog) {
+		prerror("nest-counters: No mem for catalog lid \n");
+		free(catalog_desc);
+		return OPAL_NO_MEM;
+	}
+
+	loaded = start_preload_resource(RESOURCE_ID_CATALOG,
+						RESOURCE_SUBID_NONE,
+						catalog_desc->catalog, &size);
+
+	return loaded;
+}
+
+int load_catalog_lid(int loaded)
+{
+	if (loaded == OPAL_SUCCESS)
+		loaded = wait_for_resource_loaded(RESOURCE_ID_CATALOG,
+							RESOURCE_SUBID_NONE);
+
+	if (loaded != OPAL_SUCCESS) {
+		prerror("nest-counters: Error loading catalog lid\n");
+		return OPAL_RESOURCE;
+	}
+
+	/*
+	 * Now that we have loaded the catalog, check for the
+	 * catalog magic.
+	 */
+	page0_desc = (struct nest_catalog_page_0 *)CATALOG(catalog_desc);
+	if (page0_desc->magic != CATALOG_MAGIC) {
+		prerror("nest-counters: Error catalog magic number mismatch\n");
+		return OPAL_RESOURCE;
+	}
+
+	/*
+	 * Lets save some entry points to help out search
+	 */
+	GROUP_ENTRY(catalog_desc) = CATALOG(catalog_desc) +
+					(page0_desc->group_data_offs * 4096);
+	EVENT_ENTRY(catalog_desc) = CATALOG(catalog_desc) +
+					(page0_desc->event_data_offs * 4096);
+	CHIP_EVENT_ENTRY(catalog_desc) = EVENT_ENTRY(catalog_desc) +
+					(page0_desc->chip_event_offset);
+	CHIP_GROUP_ENTRY(catalog_desc) = GROUP_ENTRY(catalog_desc) +
+					(page0_desc->chip_group_offset);
+	CORE_EVENT_ENTRY(catalog_desc) = EVENT_ENTRY(catalog_desc) +
+					(page0_desc->core_event_offset);
+	CORE_GROUP_ENTRY(catalog_desc) = GROUP_ENTRY(catalog_desc) +
+					(page0_desc->core_group_offset);
+
+	return OPAL_SUCCESS;
+}
+
+void nest_pmu_init(int loaded)
+{
+
+	if (load_catalog_lid(loaded) != OPAL_SUCCESS) {
+		prerror("nest-counters: Catalog failed to load\n");
+		return;
+	}
+
+}
diff --git a/include/platform.h b/include/platform.h
index f1bdc301a98e..999ad2aaa890 100644
--- a/include/platform.h
+++ b/include/platform.h
@@ -26,6 +26,7 @@ enum resource_id {
 	RESOURCE_ID_KERNEL,
 	RESOURCE_ID_INITRAMFS,
 	RESOURCE_ID_CAPP,
+	RESOURCE_ID_CATALOG,
 };
 #define RESOURCE_SUBID_NONE 0
 #define RESOURCE_SUBID_SUPPORTED 1
-- 
1.9.1



More information about the Skiboot mailing list