| OPAL Flash calls |
| ================ |
| |
| There are three OPAL calls for interacting with flash devices: |
| |
| .. code-block:: c |
| |
| #define OPAL_FLASH_READ 110 |
| #define OPAL_FLASH_WRITE 111 |
| #define OPAL_FLASH_ERASE 112 |
| |
| Multiple flash devices are supported by OPAL - each of these calls takes an id |
| parameter, which must match an ID found in the corresponding ``ibm,opal/flash@n`` |
| device tree node. See :ref:`device-tree/ibm,opal/flash` for details of |
| the device tree bindings. |
| |
| All operations on the flash device must be aligned to the block size of the |
| flash. This applies to both offset and size arguments. |
| |
| This interface is asynchronous; all calls require a 'token' argument. On |
| success, the calls will return :ref:`OPAL_ASYNC_COMPLETION`, and an |
| opal_async_completion message will be sent (with the appropriate token |
| argument) when the operation completes. |
| |
| .. note:: These calls can have higher than normal latency, spending many |
| **milliseconds** inside OPAL. This is due to the OPAL_FLASH_* calls |
| typically being backed by flash on the other side of the LPC bus, |
| which has a maximum transfer rate of 5MB/sec, or to/from flash attached |
| to the ast2400/ast2500 (the typical setup for OpenPOWER systems) of |
| only 1.75MB/sec. |
| |
| All calls share the same return values: |
| |
| :ref:`OPAL_ASYNC_COMPLETION` |
| operation started, an async completion will be triggered with the ``token`` argument |
| :ref:`OPAL_PARAMETER` |
| invalid flash id |
| :ref:`OPAL_PARAMETER` |
| invalid size or offset (alignment, or access beyond end of device) |
| :ref:`OPAL_BUSY` |
| flash in use |
| :ref:`OPAL_HARDWARE` |
| error accessing flash device |
| |
| .. _OPAL_FLASH_READ: |
| |
| OPAL_FLASH_READ |
| --------------- |
| |
| .. code-block:: c |
| |
| #define OPAL_FLASH_READ 110 |
| |
| int64_t opal_flash_read(uint64_t id, uint64_t offset, uint64_t buf, |
| uint64_t size, uint64_t token); |
| |
| Reads from the specified flash id, at the specified offset, into the buffer. |
| Will trigger an async completion with token when completed. |
| |
| .. _OPAL_FLASH_ERASE: |
| |
| OPAL_FLASH_ERASE |
| ---------------- |
| |
| .. code-block:: c |
| |
| #define OPAL_FLASH_ERASE 112 |
| |
| int64_t opal_flash_erase(uint64_t id, uint64_t offset, uint64_t size, |
| uint64_t token); |
| |
| Erases the specified flash id, at the specified offset and size. Will trigger |
| an async completion with token when completed. |
| |
| .. _OPAL_FLASH_WRITE: |
| |
| OPAL_FLASH_WRITE |
| ---------------- |
| |
| .. code-block:: c |
| |
| #define OPAL_FLASH_WRITE 111 |
| |
| int64_t opal_flash_write(uint64_t id, uint64_t offset, uint64_t buf, |
| uint64_t size, uint64_t token); |
| |
| Writes buffer to the specified flash id, at the specified offset and size. The |
| flash must be erased before being written. Will trigger an async completion with |
| token when completed. |
| |