.. _OPAL_ELOG:

OPAL_ELOG: Error logging
========================

OPAL provides an abstraction to platform specific methods of storing and
retrieving error logs. Some service processors may be able to store information
in the Platform Error Log (PEL) format. These may be generated at runtime
by the service processor or OPAL in reaction to certain events. For example,
an IPL failure could be recorded in an error log, as could the reason and
details of an unexpected shut-down/reboot (e.g. hard thermal limits, check-stop).

There are five OPAL calls from host to OPAL on error log:

.. code-block:: c

	#define OPAL_ELOG_READ         71
	#define OPAL_ELOG_WRITE        72
	#define OPAL_ELOG_ACK          73
	#define OPAL_ELOG_RESEND       74
	#define OPAL_ELOG_SIZE         75

Note: :ref:`OPAL_ELOG_WRITE` (72) Unused for now, might be supported in the
future.

Not all platforms support these calls, so it's important for a host Operating
System to use the :ref:`OPAL_CHECK_TOKEN` call first. If :ref:`OPAL_ELOG_READ`,
:ref:`OPAL_ELOG_ACK`, :ref:`OPAL_ELOG_RESEND`, or :ref:`OPAL_ELOG_SIZE` is present,
then the rest of that group is also present. The presence of :ref:`OPAL_ELOG_WRITE`
must be checked separately.

**TODO**: we need a good explanation of the notification mechanism and in
what order and *when* to call each of the OPAL APIs.

.. _OPAL_ELOG_READ:

OPAL_ELOG_READ
--------------

The :ref:`OPAL_ELOG_READ` call will copy the error log identified by ``id`` into
the ``buffer`` of size ``size``.

``OPAL_ELOG_READ`` accepts 3 parameters: ::

	uint64_t *elog_buffer
	uint64_t elog_size
	uint64_t elog_id

Returns:

:ref:`OPAL_WRONG_STATE`
  When there are no error logs to read, or ``OPAL_ELOG`` calls are done in the
  wrong order.

:ref:`OPAL_PARAMETER`
  The ``id`` does not match the log id that is available.

:ref:`OPAL_SUCCESS`
  Error log is copied to ``buffer``.

Other generic OPAL error codes may also be returned and should be treated
like :ref:`OPAL_INTERNAL_ERROR`.

.. _OPAL_ELOG_ACK:

OPAL_ELOG_ACK
-------------

Acknowledging (ACKing) an error log tells OPAL and the service processor that
the host operating system has dealt with the error log successfully. This allows
OPAL and the service processor to delete the error log from their
memory/storage.

:ref:`OPAL_ELOG_ACK` accepts 1 parameter: ::

	uint64_t ack_id

Returns:

:ref:`OPAL_INTERNAL_ERROR`
  OPAL failed to send acknowledgement to the error log creator.
:ref:`OPAL_SUCCESS`
  Success!

Other generic OPAL error codes may also be returned, and should be treated
like :ref:`OPAL_INTERNAL_ERROR`.

.. _OPAL_ELOG_RESEND:

OPAL_ELOG_RESEND
----------------

The :ref:`OPAL_ELOG_RESEND` call will cause OPAL to resend notification to the
host operating system of all outstanding error logs. This is commonly used
(although doesn't have to be) in a kexec scenario.

The call registered with this token accepts no parameter and returns type is
void.

.. _OPAL_ELOG_SIZE:

OPAL_ELOG_SIZE
--------------

The :ref:`OPAL_ELOG_SIZE` call retrieves information about an error log.

Here, ``type`` specifies error log format. Supported types are : ::

	 0 -> Platform Error Log

:ref:`OPAL_ELOG_SIZE` accepts 3 parameters: ::

	uint64_t *elog_id
	uint64_t *elog_size
	uint64_t *elog_type

Returns:

:ref:`OPAL_WRONG_STATE`
  There is no error log to fetch information about.

:ref:`OPAL_SUCCESS`
  Success.

Other general OPAL errors may be returned.
