Message ID | fec1f80de5cb12c66746dbf88fdb5c7f367c2608.1529466573.git-series.andrew.donnellan@au1.ibm.com |
---|---|
State | Accepted |
Headers | show |
Series | occ: GPU presence detection | expand |
On 06/20/2018 09:19 AM, Andrew Donnellan wrote: > 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> > --- Reviewed-by: Shilpasri G Bhat <shilpa.bhat@linux.vnet.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 > > 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" > >
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"
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