[Skiboot] [PATCH v1 02/11]ibm-fsp/firenze: nest feature detection

Madhavan Srinivasan maddy at linux.vnet.ibm.com
Mon Jun 1 11:53:21 AEST 2015


Patch adds nest init function and Nest meta-data load functions.
Nest events supported by HW are passed as lid (meta-data), called as "catalog"
"Catalog" lid is loaded to detect chip nest instrumentation support.
New file call "nest.c" added to hw/ to contain nest support code.

Signed-off-by: Madhavan Srinivasan <maddy at linux.vnet.ibm.com>
---
 hw/fsp/fsp.c       |   3 ++
 hw/nest.c          | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/mem-map.h  |   2 +
 include/nest.h     |  10 +++++
 include/platform.h |   1 +
 include/types.h    |   1 +
 6 files changed, 124 insertions(+)
 create mode 100644 hw/nest.c

diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c
index 12e162d..6b5d87c 100644
--- a/hw/fsp/fsp.c
+++ b/hw/fsp/fsp.c
@@ -38,6 +38,7 @@
 #include <opal.h>
 #include <opal-msg.h>
 #include <ccan/list/list.h>
+#include <chip.h>
 
 DEFINE_LOG_ENTRY(OPAL_RC_FSP_POLL_TIMEOUT, OPAL_PLATFORM_ERR_EVT, OPAL_FSP,
 		 OPAL_PLATFORM_FIRMWARE, OPAL_ERROR_PANIC, OPAL_NA, NULL);
@@ -106,6 +107,7 @@ static u64 fsp_hir_timeout;
 #define KERNEL_LID_PHYP			0x80a00701
 #define KERNEL_LID_OPAL			0x80f00101
 #define INITRAMFS_LID_OPAL		0x80f00102
+#define NEST_CATALOGUE_LID		0x81e00610
 
 /*
  * We keep track on last logged values for some things to print only on
@@ -2222,6 +2224,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_CATALOGUE,RESOURCE_SUBID_NONE,	NEST_CATALOGUE_LID},
 };
 
 static void fsp_start_fetching_next_lid(void);
diff --git a/hw/nest.c b/hw/nest.c
new file mode 100644
index 0000000..fd22a0e
--- /dev/null
+++ b/hw/nest.c
@@ -0,0 +1,107 @@
+/* Copyright 2015 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 <mem-map.h>
+#include <opal-api.h>
+#include <io.h>
+
+/*
+ * Optimize different array/index
+ */
+struct ima_catalog_page_0 *page0_ptr;
+struct page0_offsets *pg0_offsets;
+
+int load_catalogue_lid()
+{
+	struct proc_chip *chip = get_chip(pir_to_chip_id(this_cpu()->pir));
+	size_t size = NEST_CATALOGUE_SIZE;
+	int rc=0, loaded;
+
+	pg0_offsets = (struct page0_offsets *)malloc(
+					sizeof(struct page0_offsets));
+	if (!pg0_offsets) {
+		prerror("Nest_IMA: No mem for pg0_offsets structure\n");;
+		rc = OPAL_NO_MEM;
+		return rc;
+	}
+
+	pg0_offsets->page0 = (char *)malloc(NEST_CATALOGUE_SIZE);
+	if (!pg0_offsets->page0) {
+		prerror("Nest_IMA: No mem for catalogue lid \n");
+		rc = OPAL_NO_MEM;
+		return rc;
+	}
+
+	loaded = start_preload_resource (RESOURCE_ID_CATALOGUE,
+						RESOURCE_SUBID_NONE,
+						pg0_offsets->page0, &size);
+	if (loaded == OPAL_SUCCESS)
+		loaded = wait_for_resource_loaded(RESOURCE_ID_CATALOGUE,
+							RESOURCE_SUBID_NONE);
+
+	if (loaded != OPAL_SUCCESS) {
+		prerror("Nest_IMA: Error loading catalogue lid. index=%x\n",
+							(int)chip->type);
+		rc = OPAL_RESOURCE;
+		free(pg0_offsets->page0);
+		free(pg0_offsets);
+		return rc;
+	}
+
+	/*
+	 * Now that we have loaded the catalogue. Check for Chip event support
+	 */
+	page0_ptr = (struct ima_catalog_page_0 *) PAGE0(pg0_offsets);
+	if (page0_ptr->chip_group_offset == 0) {
+		prerror("Nest_IMA: Not Supported \n");
+		return OPAL_UNSUPPORTED;
+	}
+
+	/*
+	 * Lets save some entry points to help out search
+	 */
+	GROUP_ENTRY(pg0_offsets) = PAGE0(pg0_offsets) +
+					(page0_ptr->group_data_offs * 4096);
+	EVENT_ENTRY(pg0_offsets) = PAGE0(pg0_offsets) +
+					(page0_ptr->event_data_offs * 4096);
+	CHIP_EVENT_ENTRY(pg0_offsets) = EVENT_ENTRY(pg0_offsets) +
+					(page0_ptr->chip_event_offset);
+	CHIP_GROUP_ENTRY(pg0_offsets) = GROUP_ENTRY(pg0_offsets) +
+					(page0_ptr->chip_group_offset);
+
+	return rc;
+}
+
+/*
+ * powerpc Nest instrumentation support
+ */
+void nest_ima_init(void)
+{
+	if (load_catalogue_lid()) {
+		printf("IMA Catalog lid failed to load, Exiting \n");
+		return;
+	}
+
+	return;
+}
diff --git a/include/mem-map.h b/include/mem-map.h
index 1258d87..8bd8054 100644
--- a/include/mem-map.h
+++ b/include/mem-map.h
@@ -121,5 +121,7 @@
 /* Size allocated to build the device-tree */
 #define	DEVICE_TREE_MAX_SIZE	0x80000
 
+/*Size of IMA Catalogue LID. 256KBytes. Fixed */
+#define NEST_CATALOGUE_SIZE		0x40000
 
 #endif /* __MEM_MAP_H */
diff --git a/include/nest.h b/include/nest.h
index 0dcd946..368815b 100644
--- a/include/nest.h
+++ b/include/nest.h
@@ -29,6 +29,10 @@
  * This firmware programs the nest counter and moves counter values to
  * per chip HOMER region in a fixed offset for each unit. Engine
  * has a control block structure for communication with Hyperviosr.
+ *
+ * PORE -- Power On Reset Engine
+ * SLW  -- Sleep/Winkle
+ * IMA  -- In Memory Accumulation.
  */
 
 /*
@@ -216,4 +220,10 @@ struct page0_offsets {
 #define MURANO_CENTAUR_DIMM	24000
 #define VENICE_CENTAUR_DIMM	27000
 
+/*
+ * Function prototypes
+ */
+int load_catalogue_lid(void);
+void nest_ima_init(void);
+
 #endif	/* __NEST_H__ */
diff --git a/include/platform.h b/include/platform.h
index 80aa8ba..400f990 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_CATALOGUE,
 };
 #define RESOURCE_SUBID_NONE 0
 #define RESOURCE_SUBID_SUPPORTED 1
diff --git a/include/types.h b/include/types.h
index 36dc81d..4993dfd 100644
--- a/include/types.h
+++ b/include/types.h
@@ -22,6 +22,7 @@
 typedef u16 __be16;
 typedef u32 __be32;
 typedef u64 __be64;
+typedef u8 __u8;
 
 #endif /* __TYPES_H */
 
-- 
1.9.3



More information about the Skiboot mailing list