[v3,2/3] occ: Move occ declarations into occ.h

Message ID fec1f80de5cb12c66746dbf88fdb5c7f367c2608.1529475742.git-series.andrew.donnellan@au1.ibm.com
State New
Headers show
Series
  • occ: GPU presence detection
Related show

Commit Message

Andrew Donnellan June 20, 2018, 6:22 a.m.
OCC declarations are currently split between skiboot.h and occ-sensor.h.
Given the growing unwieldyness of skiboot.h it's probably time to move it
all into one header.

Rename occ-sensor.h to occ.h, move all OCC-related declarations out of
skiboot.h, and add #includes as necessary.

Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
---
 core/hostservices.c        |   1 +-
 core/init.c                |   1 +-
 core/opal.c                |   1 +-
 core/sensor.c              |   1 +-
 hw/ipmi/ipmi-sel.c         |   1 +-
 hw/occ-sensor.c            |   2 +-
 hw/occ.c                   |   2 +-
 hw/psi.c                   |   1 +-
 include/occ-sensor.h       | 264 +----------------------------------
 include/occ.h              | 296 ++++++++++++++++++++++++++++++++++++++-
 include/skiboot.h          |  27 +---
 platforms/ibm-fsp/common.c |   1 +-
 12 files changed, 305 insertions(+), 293 deletions(-)
 delete mode 100644 include/occ-sensor.h
 create mode 100644 include/occ.h

Patch

diff --git a/core/hostservices.c b/core/hostservices.c
index c37bf2f0bbf0..d3a9b3cefe10 100644
--- a/core/hostservices.c
+++ b/core/hostservices.c
@@ -29,6 +29,7 @@ 
 #include <console.h>
 #include <mem-map.h>
 #include <timebase.h>
+#include <occ.h>
 
 #define HOSTBOOT_RUNTIME_INTERFACE_VERSION 1
 
diff --git a/core/init.c b/core/init.c
index 272a57a145ee..b660af2d7824 100644
--- a/core/init.c
+++ b/core/init.c
@@ -53,6 +53,7 @@ 
 #include <dts.h>
 #include <sbe-p9.h>
 #include <debug_descriptor.h>
+#include <occ.h>
 
 enum proc_gen proc_gen;
 unsigned int pcie_max_link_speed;
diff --git a/core/opal.c b/core/opal.c
index e3a3bbdeea98..7ffca9c17bb3 100644
--- a/core/opal.c
+++ b/core/opal.c
@@ -31,6 +31,7 @@ 
 #include <timer.h>
 #include <elf-abi.h>
 #include <errorlog.h>
+#include <occ.h>
 
 /* Pending events to signal via opal_poll_events */
 uint64_t opal_pending_events;
diff --git a/core/sensor.c b/core/sensor.c
index c3fa3193757f..bd329a183ee1 100644
--- a/core/sensor.c
+++ b/core/sensor.c
@@ -21,6 +21,7 @@ 
 #include <opal.h>
 #include <dts.h>
 #include <lock.h>
+#include <occ.h>
 
 struct dt_node *sensor_node;
 
diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c
index 54cc597d9dee..eb63147bdc52 100644
--- a/hw/ipmi/ipmi-sel.c
+++ b/hw/ipmi/ipmi-sel.c
@@ -26,6 +26,7 @@ 
 #include <pel.h>
 #include <opal-msg.h>
 #include <debug_descriptor.h>
+#include <occ.h>
 
 /* OEM SEL fields */
 #define SEL_OEM_ID_0		0x55
diff --git a/hw/occ-sensor.c b/hw/occ-sensor.c
index 783f75740c42..c062f64a6fd3 100644
--- a/hw/occ-sensor.c
+++ b/hw/occ-sensor.c
@@ -20,7 +20,7 @@ 
 #include <sensor.h>
 #include <device.h>
 #include <cpu.h>
-#include <occ-sensor.h>
+#include <occ.h>
 
 enum sensor_attr {
 	SENSOR_SAMPLE,
diff --git a/hw/occ.c b/hw/occ.c
index 29eb4bd67ca2..fc95d3926bb0 100644
--- a/hw/occ.c
+++ b/hw/occ.c
@@ -31,7 +31,7 @@ 
 #include <powercap.h>
 #include <psr.h>
 #include <sensor.h>
-#include <occ-sensor.h>
+#include <occ.h>
 
 /* OCC Communication Area for PStates */
 
diff --git a/hw/psi.c b/hw/psi.c
index f5168ba96765..cbdbeaa9aeff 100644
--- a/hw/psi.c
+++ b/hw/psi.c
@@ -35,6 +35,7 @@ 
 #include <xive.h>
 #include <sbe-p9.h>
 #include <phys-map.h>
+#include <occ.h>
 
 static LIST_HEAD(psis);
 static u64 psi_link_timer;
diff --git a/include/occ-sensor.h b/include/occ-sensor.h
deleted file mode 100644
index 67ffae86e699..000000000000
--- a/include/occ-sensor.h
+++ /dev/null
@@ -1,264 +0,0 @@ 
-/* Copyright 2017 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.
- */
-
-/*
- * OCC Sensor Data
- *
- * OCC sensor data will use BAR2 (OCC Common is per physical drawer).
- * Starting address is at offset 0x00580000 from BAR2 base address.
- * Maximum size is 1.5MB.
- *
- * -------------------------------------------------------------------------
- * | Start (Offset from |	End	| Size	   |Description		   |
- * | BAR2 base address) |		|	   |			   |
- * -------------------------------------------------------------------------
- * |	0x00580000      |  0x005A57FF   |150kB     |OCC 0 Sensor Data Block|
- * |	0x005A5800      |  0x005CAFFF   |150kB	   |OCC 1 Sensor Data Block|
- * |	    :		|	:	|  :	   |		:          |
- * |	0x00686800	|  0x006ABFFF   |150kB	   |OCC 7 Sensor Data Block|
- * |	0x006AC000	|  0x006FFFFF   |336kB     |Reserved		   |
- * -------------------------------------------------------------------------
- *
- *
- * OCC N Sensor Data Block Layout (150kB)
- *
- * The sensor data block layout is the same for each OCC N. It contains
- * sensor-header-block, sensor-names buffer, sensor-readings-ping buffer and
- * sensor-readings-pong buffer.
- *
- * ----------------------------------------------------------------------------
- * | Start (Offset from OCC |   End	   | Size |Description		      |
- * | N Sensor Data Block)   |		   |	  |			      |
- * ----------------------------------------------------------------------------
- * |	0x00000000	    |  0x000003FF  |1kB   |Sensor Data Header Block   |
- * |	0x00000400	    |  0x0000CBFF  |50kB  |Sensor Names		      |
- * |	0x0000CC00	    |  0x0000DBFF  |4kB   |Reserved		      |
- * |	0x0000DC00	    |  0x00017BFF  |40kB  |Sensor Readings ping buffer|
- * |	0x00017C00	    |  0x00018BFF  |4kB   |Reserved		      |
- * |	0x00018C00	    |  0x00022BFF  |40kB  |Sensor Readings pong buffer|
- * |	0x00022C00	    |  0x000257FF  |11kB  |Reserved		      |
- * ----------------------------------------------------------------------------
- *
- * Sensor Data Header Block : This is written once by the OCC during
- * initialization after a load or reset. Layout is defined in 'struct
- * occ_sensor_data_header'
- *
- * Sensor Names : This is written once by the OCC during initialization after a
- * load or reset. It contains static information for each sensor. The number of
- * sensors, format version and length of each sensor is defined in
- * 'Sensor Data Header Block'. Format of each sensor name is defined in
- * 'struct occ_sensor_name'. The first sensor starts at offset 0 followed
- * immediately by the next sensor.
- *
- * Sensor Readings Ping/Pong Buffer:
- * There are two 40kB buffers to store the sensor readings. One buffer that
- * is currently being updated by the OCC and one that is available to be read.
- * Each of these buffers will be of the same format. The number of sensors and
- * the format version of the ping and pong buffers is defined in the
- * 'Sensor Data Header Block'.
- *
- * Each sensor within the ping and pong buffers may be of a different format
- * and length. For each sensor the length and format is determined by its
- * 'struct occ_sensor_name.structure_type' in the Sensor Names buffer.
- *
- * --------------------------------------------------------------------------
- * | Offset | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
- * --------------------------------------------------------------------------
- * | 0x0000 |Valid  |		   Reserved				    |
- * |        |(0x01) |							    |
- * --------------------------------------------------------------------------
- * | 0x0008 |			Sensor Readings				    |
- * --------------------------------------------------------------------------
- * |	:   |				:				    |
- * --------------------------------------------------------------------------
- * | 0xA000 |                     End of Data				    |
- * --------------------------------------------------------------------------
- *
- */
-
-#define MAX_OCCS			8
-#define MAX_CHARS_SENSOR_NAME		16
-#define MAX_CHARS_SENSOR_UNIT		4
-
-#define OCC_SENSOR_DATA_BLOCK_OFFSET		0x00580000
-#define OCC_SENSOR_DATA_BLOCK_SIZE		0x00025800
-
-/*
- * These should match the definitions inside the OCC source:
- * occ/src/occ_405/sensor/sensor_info.c
- */
-
-enum occ_sensor_type {
-	OCC_SENSOR_TYPE_GENERIC		= 0x0001,
-	OCC_SENSOR_TYPE_CURRENT		= 0x0002,
-	OCC_SENSOR_TYPE_VOLTAGE		= 0x0004,
-	OCC_SENSOR_TYPE_TEMPERATURE	= 0x0008,
-	OCC_SENSOR_TYPE_UTILIZATION	= 0x0010,
-	OCC_SENSOR_TYPE_TIME		= 0x0020,
-	OCC_SENSOR_TYPE_FREQUENCY	= 0x0040,
-	OCC_SENSOR_TYPE_POWER		= 0x0080,
-	OCC_SENSOR_TYPE_PERFORMANCE	= 0x0200,
-};
-
-#define OCC_ENABLED_SENSOR_MASK	(OCC_SENSOR_TYPE_GENERIC |	\
-				 OCC_SENSOR_TYPE_CURRENT |	\
-				 OCC_SENSOR_TYPE_VOLTAGE |	\
-				 OCC_SENSOR_TYPE_TIME    |	\
-				 OCC_SENSOR_TYPE_TEMPERATURE |	\
-				 OCC_SENSOR_TYPE_POWER |	\
-				 OCC_SENSOR_TYPE_UTILIZATION |	\
-				 OCC_SENSOR_TYPE_FREQUENCY   |	\
-				 OCC_SENSOR_TYPE_PERFORMANCE);
-
-enum occ_sensor_location {
-	OCC_SENSOR_LOC_SYSTEM		= 0x0001,
-	OCC_SENSOR_LOC_PROCESSOR	= 0x0002,
-	OCC_SENSOR_LOC_PARTITION	= 0x0004,
-	OCC_SENSOR_LOC_MEMORY		= 0x0008,
-	OCC_SENSOR_LOC_VRM		= 0x0010,
-	OCC_SENSOR_LOC_OCC		= 0x0020,
-	OCC_SENSOR_LOC_CORE		= 0x0040,
-	OCC_SENSOR_LOC_GPU		= 0x0080,
-	OCC_SENSOR_LOC_QUAD		= 0x0100,
-};
-
-enum sensor_struct_type {
-	OCC_SENSOR_READING_FULL		= 0x01,
-	OCC_SENSOR_READING_COUNTER	= 0x02,
-};
-
-/**
- * struct occ_sensor_data_header -	Sensor Data Header Block
- * @valid:				When the value is 0x01 it indicates
- *					that this header block and the sensor
- *					names buffer are ready
- * @version:				Format version of this block
- * @nr_sensors:				Number of sensors in names, ping and
- *					pong buffer
- * @reading_version:			Format version of the Ping/Pong buffer
- * @names_offset:			Offset to the location of names buffer
- * @names_version:			Format version of names buffer
- * @names_length:			Length of each sensor in names buffer
- * @reading_ping_offset:		Offset to the location of Ping buffer
- * @reading_pong_offset:		Offset to the location of Pong buffer
- * @pad/reserved:			Unused data
- */
-struct occ_sensor_data_header {
-	u8 valid;
-	u8 version;
-	u16 nr_sensors;
-	u8 reading_version;
-	u8 pad[3];
-	u32 names_offset;
-	u8 names_version;
-	u8 name_length;
-	u16 reserved;
-	u32 reading_ping_offset;
-	u32 reading_pong_offset;
-} __attribute__((__packed__));
-
-/**
- * struct occ_sensor_name -		Format of Sensor Name
- * @name:				Sensor name
- * @units:				Sensor units of measurement
- * @gsid:				Global sensor id (OCC)
- * @freq:				Update frequency
- * @scale_factor:			Scaling factor
- * @type:				Sensor type as defined in
- *					'enum occ_sensor_type'
- * @location:				Sensor location as defined in
- *					'enum occ_sensor_location'
- * @structure_type:			Indicates type of data structure used
- *					for the sensor readings in the ping and
- *					pong buffers for this sensor as defined
- *					in 'enum sensor_struct_type'
- * @reading_offset:			Offset from the start of the ping/pong
- *					reading buffers for this sensor
- * @sensor_data:			Sensor specific info
- * @pad:				Padding to fit the size of 48 bytes.
- */
-struct occ_sensor_name {
-	char name[MAX_CHARS_SENSOR_NAME];
-	char units[MAX_CHARS_SENSOR_UNIT];
-	u16 gsid;
-	u32 freq;
-	u32 scale_factor;
-	u16 type;
-	u16 location;
-	u8 structure_type;
-	u32 reading_offset;
-	u8 sensor_data;
-	u8 pad[8];
-} __attribute__((__packed__));
-
-/**
- * struct occ_sensor_record -		Sensor Reading Full
- * @gsid:				Global sensor id (OCC)
- * @timestamp:				Time base counter value while updating
- *					the sensor
- * @sample:				Latest sample of this sensor
- * @sample_min:				Minimum value since last OCC reset
- * @sample_max:				Maximum value since last OCC reset
- * @csm_min:				Minimum value since last reset request
- *					by CSM (CORAL)
- * @csm_max:				Maximum value since last reset request
- *					by CSM (CORAL)
- * @profiler_min:			Minimum value since last reset request
- *					by profiler (CORAL)
- * @profiler_max:			Maximum value since last reset request
- *					by profiler (CORAL)
- * @job_scheduler_min:			Minimum value since last reset request
- *					by job scheduler(CORAL)
- * @job_scheduler_max:			Maximum value since last reset request
- *					by job scheduler (CORAL)
- * @accumulator:			Accumulator for this sensor
- * @update_tag:				Count of the number of ticks that have
- *					passed between updates
- * @pad:				Padding to fit the size of 48 bytes
- */
-struct occ_sensor_record {
-	u16 gsid;
-	u64 timestamp;
-	u16 sample;
-	u16 sample_min;
-	u16 sample_max;
-	u16 csm_min;
-	u16 csm_max;
-	u16 profiler_min;
-	u16 profiler_max;
-	u16 job_scheduler_min;
-	u16 job_scheduler_max;
-	u64 accumulator;
-	u32 update_tag;
-	u8 pad[8];
-} __attribute__((__packed__));
-
-/**
- * struct occ_sensor_counter -		Sensor Reading Counter
- * @gsid:				Global sensor id (OCC)
- * @timestamp:				Time base counter value while updating
- *					the sensor
- * @accumulator:			Accumulator/Counter
- * @sample:				Latest sample of this sensor (0/1)
- * @pad:				Padding to fit the size of 24 bytes
- */
-struct occ_sensor_counter {
-	u16 gsid;
-	u64 timestamp;
-	u64 accumulator;
-	u8 sample;
-	u8 pad[5];
-} __attribute__((__packed__));
diff --git a/include/occ.h b/include/occ.h
new file mode 100644
index 000000000000..c9faef9fdfb8
--- /dev/null
+++ b/include/occ.h
@@ -0,0 +1,296 @@ 
+/* Copyright 2017 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.
+ */
+
+/* OCC Functions */
+
+extern void occ_pstates_init(void);
+extern void occ_fsp_init(void);
+
+/* OCC interrupt for P8 */
+extern void occ_p8_interrupt(uint32_t chip_id);
+extern void occ_send_dummy_interrupt(void);
+
+/* OCC interrupt for P9 */
+extern void occ_p9_interrupt(uint32_t chip_id);
+
+/* OCC load support */
+extern void occ_poke_load_queue(void);
+
+/* OCC/Host PNOR ownership */
+enum pnor_owner {
+	PNOR_OWNER_HOST,
+	PNOR_OWNER_EXTERNAL,
+};
+extern void occ_pnor_set_owner(enum pnor_owner owner);
+
+
+/* OCC Inband Sensors */
+extern bool occ_sensors_init(void);
+extern int occ_sensor_read(u32 handle, u64 *data);
+extern int occ_sensor_group_clear(u32 group_hndl, int token);
+extern void occ_add_sensor_groups(struct dt_node *sg, u32  *phandles,
+				  u32 *ptype, int nr_phandles, int chipid);
+
+extern int occ_sensor_group_enable(u32 group_hndl, int token, bool enable);
+
+/*
+ * OCC Sensor Data
+ *
+ * OCC sensor data will use BAR2 (OCC Common is per physical drawer).
+ * Starting address is at offset 0x00580000 from BAR2 base address.
+ * Maximum size is 1.5MB.
+ *
+ * -------------------------------------------------------------------------
+ * | Start (Offset from |	End	| Size	   |Description		   |
+ * | BAR2 base address) |		|	   |			   |
+ * -------------------------------------------------------------------------
+ * |	0x00580000      |  0x005A57FF   |150kB     |OCC 0 Sensor Data Block|
+ * |	0x005A5800      |  0x005CAFFF   |150kB	   |OCC 1 Sensor Data Block|
+ * |	    :		|	:	|  :	   |		:          |
+ * |	0x00686800	|  0x006ABFFF   |150kB	   |OCC 7 Sensor Data Block|
+ * |	0x006AC000	|  0x006FFFFF   |336kB     |Reserved		   |
+ * -------------------------------------------------------------------------
+ *
+ *
+ * OCC N Sensor Data Block Layout (150kB)
+ *
+ * The sensor data block layout is the same for each OCC N. It contains
+ * sensor-header-block, sensor-names buffer, sensor-readings-ping buffer and
+ * sensor-readings-pong buffer.
+ *
+ * ----------------------------------------------------------------------------
+ * | Start (Offset from OCC |   End	   | Size |Description		      |
+ * | N Sensor Data Block)   |		   |	  |			      |
+ * ----------------------------------------------------------------------------
+ * |	0x00000000	    |  0x000003FF  |1kB   |Sensor Data Header Block   |
+ * |	0x00000400	    |  0x0000CBFF  |50kB  |Sensor Names		      |
+ * |	0x0000CC00	    |  0x0000DBFF  |4kB   |Reserved		      |
+ * |	0x0000DC00	    |  0x00017BFF  |40kB  |Sensor Readings ping buffer|
+ * |	0x00017C00	    |  0x00018BFF  |4kB   |Reserved		      |
+ * |	0x00018C00	    |  0x00022BFF  |40kB  |Sensor Readings pong buffer|
+ * |	0x00022C00	    |  0x000257FF  |11kB  |Reserved		      |
+ * ----------------------------------------------------------------------------
+ *
+ * Sensor Data Header Block : This is written once by the OCC during
+ * initialization after a load or reset. Layout is defined in 'struct
+ * occ_sensor_data_header'
+ *
+ * Sensor Names : This is written once by the OCC during initialization after a
+ * load or reset. It contains static information for each sensor. The number of
+ * sensors, format version and length of each sensor is defined in
+ * 'Sensor Data Header Block'. Format of each sensor name is defined in
+ * 'struct occ_sensor_name'. The first sensor starts at offset 0 followed
+ * immediately by the next sensor.
+ *
+ * Sensor Readings Ping/Pong Buffer:
+ * There are two 40kB buffers to store the sensor readings. One buffer that
+ * is currently being updated by the OCC and one that is available to be read.
+ * Each of these buffers will be of the same format. The number of sensors and
+ * the format version of the ping and pong buffers is defined in the
+ * 'Sensor Data Header Block'.
+ *
+ * Each sensor within the ping and pong buffers may be of a different format
+ * and length. For each sensor the length and format is determined by its
+ * 'struct occ_sensor_name.structure_type' in the Sensor Names buffer.
+ *
+ * --------------------------------------------------------------------------
+ * | Offset | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
+ * --------------------------------------------------------------------------
+ * | 0x0000 |Valid  |		   Reserved				    |
+ * |        |(0x01) |							    |
+ * --------------------------------------------------------------------------
+ * | 0x0008 |			Sensor Readings				    |
+ * --------------------------------------------------------------------------
+ * |	:   |				:				    |
+ * --------------------------------------------------------------------------
+ * | 0xA000 |                     End of Data				    |
+ * --------------------------------------------------------------------------
+ *
+ */
+
+#define MAX_OCCS			8
+#define MAX_CHARS_SENSOR_NAME		16
+#define MAX_CHARS_SENSOR_UNIT		4
+
+#define OCC_SENSOR_DATA_BLOCK_OFFSET		0x00580000
+#define OCC_SENSOR_DATA_BLOCK_SIZE		0x00025800
+
+/*
+ * These should match the definitions inside the OCC source:
+ * occ/src/occ_405/sensor/sensor_info.c
+ */
+
+enum occ_sensor_type {
+	OCC_SENSOR_TYPE_GENERIC		= 0x0001,
+	OCC_SENSOR_TYPE_CURRENT		= 0x0002,
+	OCC_SENSOR_TYPE_VOLTAGE		= 0x0004,
+	OCC_SENSOR_TYPE_TEMPERATURE	= 0x0008,
+	OCC_SENSOR_TYPE_UTILIZATION	= 0x0010,
+	OCC_SENSOR_TYPE_TIME		= 0x0020,
+	OCC_SENSOR_TYPE_FREQUENCY	= 0x0040,
+	OCC_SENSOR_TYPE_POWER		= 0x0080,
+	OCC_SENSOR_TYPE_PERFORMANCE	= 0x0200,
+};
+
+#define OCC_ENABLED_SENSOR_MASK	(OCC_SENSOR_TYPE_GENERIC |	\
+				 OCC_SENSOR_TYPE_CURRENT |	\
+				 OCC_SENSOR_TYPE_VOLTAGE |	\
+				 OCC_SENSOR_TYPE_TIME    |	\
+				 OCC_SENSOR_TYPE_TEMPERATURE |	\
+				 OCC_SENSOR_TYPE_POWER |	\
+				 OCC_SENSOR_TYPE_UTILIZATION |	\
+				 OCC_SENSOR_TYPE_FREQUENCY   |	\
+				 OCC_SENSOR_TYPE_PERFORMANCE);
+
+enum occ_sensor_location {
+	OCC_SENSOR_LOC_SYSTEM		= 0x0001,
+	OCC_SENSOR_LOC_PROCESSOR	= 0x0002,
+	OCC_SENSOR_LOC_PARTITION	= 0x0004,
+	OCC_SENSOR_LOC_MEMORY		= 0x0008,
+	OCC_SENSOR_LOC_VRM		= 0x0010,
+	OCC_SENSOR_LOC_OCC		= 0x0020,
+	OCC_SENSOR_LOC_CORE		= 0x0040,
+	OCC_SENSOR_LOC_GPU		= 0x0080,
+	OCC_SENSOR_LOC_QUAD		= 0x0100,
+};
+
+enum sensor_struct_type {
+	OCC_SENSOR_READING_FULL		= 0x01,
+	OCC_SENSOR_READING_COUNTER	= 0x02,
+};
+
+/**
+ * struct occ_sensor_data_header -	Sensor Data Header Block
+ * @valid:				When the value is 0x01 it indicates
+ *					that this header block and the sensor
+ *					names buffer are ready
+ * @version:				Format version of this block
+ * @nr_sensors:				Number of sensors in names, ping and
+ *					pong buffer
+ * @reading_version:			Format version of the Ping/Pong buffer
+ * @names_offset:			Offset to the location of names buffer
+ * @names_version:			Format version of names buffer
+ * @names_length:			Length of each sensor in names buffer
+ * @reading_ping_offset:		Offset to the location of Ping buffer
+ * @reading_pong_offset:		Offset to the location of Pong buffer
+ * @pad/reserved:			Unused data
+ */
+struct occ_sensor_data_header {
+	u8 valid;
+	u8 version;
+	u16 nr_sensors;
+	u8 reading_version;
+	u8 pad[3];
+	u32 names_offset;
+	u8 names_version;
+	u8 name_length;
+	u16 reserved;
+	u32 reading_ping_offset;
+	u32 reading_pong_offset;
+} __attribute__((__packed__));
+
+/**
+ * struct occ_sensor_name -		Format of Sensor Name
+ * @name:				Sensor name
+ * @units:				Sensor units of measurement
+ * @gsid:				Global sensor id (OCC)
+ * @freq:				Update frequency
+ * @scale_factor:			Scaling factor
+ * @type:				Sensor type as defined in
+ *					'enum occ_sensor_type'
+ * @location:				Sensor location as defined in
+ *					'enum occ_sensor_location'
+ * @structure_type:			Indicates type of data structure used
+ *					for the sensor readings in the ping and
+ *					pong buffers for this sensor as defined
+ *					in 'enum sensor_struct_type'
+ * @reading_offset:			Offset from the start of the ping/pong
+ *					reading buffers for this sensor
+ * @sensor_data:			Sensor specific info
+ * @pad:				Padding to fit the size of 48 bytes.
+ */
+struct occ_sensor_name {
+	char name[MAX_CHARS_SENSOR_NAME];
+	char units[MAX_CHARS_SENSOR_UNIT];
+	u16 gsid;
+	u32 freq;
+	u32 scale_factor;
+	u16 type;
+	u16 location;
+	u8 structure_type;
+	u32 reading_offset;
+	u8 sensor_data;
+	u8 pad[8];
+} __attribute__((__packed__));
+
+/**
+ * struct occ_sensor_record -		Sensor Reading Full
+ * @gsid:				Global sensor id (OCC)
+ * @timestamp:				Time base counter value while updating
+ *					the sensor
+ * @sample:				Latest sample of this sensor
+ * @sample_min:				Minimum value since last OCC reset
+ * @sample_max:				Maximum value since last OCC reset
+ * @csm_min:				Minimum value since last reset request
+ *					by CSM (CORAL)
+ * @csm_max:				Maximum value since last reset request
+ *					by CSM (CORAL)
+ * @profiler_min:			Minimum value since last reset request
+ *					by profiler (CORAL)
+ * @profiler_max:			Maximum value since last reset request
+ *					by profiler (CORAL)
+ * @job_scheduler_min:			Minimum value since last reset request
+ *					by job scheduler(CORAL)
+ * @job_scheduler_max:			Maximum value since last reset request
+ *					by job scheduler (CORAL)
+ * @accumulator:			Accumulator for this sensor
+ * @update_tag:				Count of the number of ticks that have
+ *					passed between updates
+ * @pad:				Padding to fit the size of 48 bytes
+ */
+struct occ_sensor_record {
+	u16 gsid;
+	u64 timestamp;
+	u16 sample;
+	u16 sample_min;
+	u16 sample_max;
+	u16 csm_min;
+	u16 csm_max;
+	u16 profiler_min;
+	u16 profiler_max;
+	u16 job_scheduler_min;
+	u16 job_scheduler_max;
+	u64 accumulator;
+	u32 update_tag;
+	u8 pad[8];
+} __attribute__((__packed__));
+
+/**
+ * struct occ_sensor_counter -		Sensor Reading Counter
+ * @gsid:				Global sensor id (OCC)
+ * @timestamp:				Time base counter value while updating
+ *					the sensor
+ * @accumulator:			Accumulator/Counter
+ * @sample:				Latest sample of this sensor (0/1)
+ * @pad:				Padding to fit the size of 24 bytes
+ */
+struct occ_sensor_counter {
+	u16 gsid;
+	u64 timestamp;
+	u64 accumulator;
+	u8 sample;
+	u8 pad[5];
+} __attribute__((__packed__));
diff --git a/include/skiboot.h b/include/skiboot.h
index 989565c1f8b5..bba76c12c39e 100644
--- a/include/skiboot.h
+++ b/include/skiboot.h
@@ -206,10 +206,8 @@  extern void uart_init(void);
 extern void mbox_init(void);
 extern void early_uart_init(void);
 extern void homer_init(void);
-extern void occ_pstates_init(void);
 extern void slw_init(void);
 extern void add_cpu_idle_state_properties(void);
-extern void occ_fsp_init(void);
 extern void lpc_rtc_init(void);
 
 /* flash support */
@@ -242,23 +240,6 @@  enum {
 extern void uart_set_console_policy(int policy);
 extern bool uart_enabled(void);
 
-/* OCC interrupt for P8 */
-extern void occ_p8_interrupt(uint32_t chip_id);
-extern void occ_send_dummy_interrupt(void);
-
-/* OCC interrupt for P9 */
-extern void occ_p9_interrupt(uint32_t chip_id);
-
-/* OCC load support */
-extern void occ_poke_load_queue(void);
-
-/* OCC/Host PNOR ownership */
-enum pnor_owner {
-	PNOR_OWNER_HOST,
-	PNOR_OWNER_EXTERNAL,
-};
-extern void occ_pnor_set_owner(enum pnor_owner owner);
-
 /* PRD */
 extern void prd_psi_interrupt(uint32_t proc);
 extern void prd_tmgt_interrupt(uint32_t proc);
@@ -310,12 +291,4 @@  extern int fake_nvram_info(uint32_t *total_size);
 extern int fake_nvram_start_read(void *dst, uint32_t src, uint32_t len);
 extern int fake_nvram_write(uint32_t offset, void *src, uint32_t size);
 
-/* OCC Inband Sensors */
-extern bool occ_sensors_init(void);
-extern int occ_sensor_read(u32 handle, u64 *data);
-extern int occ_sensor_group_clear(u32 group_hndl, int token);
-extern void occ_add_sensor_groups(struct dt_node *sg, u32  *phandles,
-				  u32 *ptype, int nr_phandles, int chipid);
-
-extern int occ_sensor_group_enable(u32 group_hndl, int token, bool enable);
 #endif /* __SKIBOOT_H */
diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c
index d7433e31dcf7..a7f2beedcb78 100644
--- a/platforms/ibm-fsp/common.c
+++ b/platforms/ibm-fsp/common.c
@@ -23,6 +23,7 @@ 
 #include <hostservices.h>
 #include <ipmi.h>
 #include <debug_descriptor.h>
+#include <occ.h>
 
 #include "ibm-fsp.h"