---
title: "The OpenTitan DIF Library"
---

A DIF is a "Device Interface Function". DIFs are low-level routines for
accessing the hardware functionality directly, and are agnostic to the
particular environment or context they are called from. The intention is that
DIFs are high-quality software artifacts which can be used during design
verification and early silicon verification.

Although DIFs are high-quality software artifacts, they are not a hardware
abstraction layer (HAL), nor do they follow the device driver model of
any particular operating system, and as such, **_DIFs are not intended
to be used by production firmware_**.  DIFs, in combination with the
hardware specification, may be illustrative for writing drivers, but should
not be considered drivers themselves.

This subtree provides headers and libraries known collectively as the DIF
libraries.

There is one DIF library per hardware IP, and each one contains the DIFs
required to actuate all of the specification-required functionality of the
hardware they are written for.

Each DIF library contains both auto-generated (which are checked-in to our
repository under the `autogen/` subtree), and manually-implemented DIFs (which
are not sub-foldered).

## Developing New DIFs

Developers should use the `util/make_new_dif.py` script to both auto-generate a
subset of DIFs, *and* instantiate some initial boilerplate templates that should
be subsequently edited. Specifically, the script will create:

1. auto-generated DIF code, including:
  * an auto-generated (private) DIF header, `autogen/dif_<ip>_autogen.h`, based
  on `util/make_new_dif/templates/dif_autogen.h.tpl`,
  * auto-generated DIF implementations, `autogen/dif_<ip>_autogen.c`, based on
  `util/make_new_dif/templates/dif_autogen.c.tpl`, and
  * auto-generated DIF unit tests (that test the auto-generated DIFs),
  `autogen/dif_<ip>_autogen_unittest.cc`, based on
  `util/make_new_dif/templates/dif_autogen_unittest.cc.tpl`.
2. boilerplate templates (that should be manually edited/enhanced) for the
   the portion of the IP DIF library that is manually implemented, including:
  * a (public) header for the DIF, based on
  `util/make_new_dif/templates/dif_template.h.tpl`], and
  * a checklist for the DIF, based on `doc/project/sw_checklist.md.tpl`.

Only the second set of files will need checking and editing, but the templates
serve to avoid most of the copy/paste required, while keeping our DIF libraries
consistent across IPs.

Further documentation for the script is provided in the script's source.
Additionally, please invoke `util/make_new_dif.py --help` for detailed usage.

## Checklists

This directory also contains checklists for each DIF, in markdown format. They
are linked to from the [Hardware Dashboard]({{< relref "hw" >}}), in the
Development Stage column.

## DIF Style Guide

DIFs are very low-level software, so they have a more rigorous coding style than
other parts of the codebase.

DIFs should follow the [OpenTitan C/C++ style
guide](https://docs.opentitan.org/doc/rm/c_cpp_coding_style/) where it does not
contradict with the guidelines below.

The guidelines below apply to writing DIFs, and code should be written in a
similar style to the existing DIF libraries in this directory.

### Definitions

<a name="side-effects"></a>
**Side-effects** include (but are not limited to) writing to memory, including
memory-mapped hardware, and modifying processor CSRs.

### DIF Library Guidance

* DIF libraries must be written in C.
* DIF libraries can only depend on the following headers (and their associated
  libraries):
  * `sw/device/lib/base/bitfield.h`
  * `sw/device/lib/base/mmio.h`
  * `sw/device/lib/base/memory.h`
  * `sw/device/lib/dif/dif_base.h`
* DIF libraries must not depend on other DIF libraries. Exercising DIF
  functionality may require an environment set up using another DIF library, but
  DIFs must not call DIFs in other DIF libraries.
* DIF library headers must be polyglot headers for C and C++.
* the public (manually-implemented) DIF header for each DIF library should
  `#include` the (private) auto-generated header, so that DIF consumers need
  only `#include` the public DIF header to make use of an IP's DIF library.

### DIF API Guidance

The following rules specify the basic API that each DIF must conform to. These
rules specify the names of types, constants, and functions that each DIF must
define for providing certain kinds of non-device-specific functionality (such as
initializing handles or managing interrupts).

Notational caveats:
* The token `<ip>` is the "short IP name" of the peripheral,
  in `snake_case` or `PascalCase` as is appropriate.
* The parameter name `handle` is not normative, and DIF libraries are free to
  choose a different, but consistent, name for it.
* All functions below are assumed to return `dif_result_t`, a global DIF return
  type defined in `sw/device/lib/dif/dif_base.h`.
* Unless otherwise noted, all symbols mentioned below are required.

#### Hardware Parameterization

Our aim is that a single DIF library can be used with multiple instances of the
same IP on the same chip, even when those IPs have been instantiated with
different hardware parameters.

At the moment, we have a good approach to being able to address separate
hardware instances instantiated at separate addresses, as long as they have the
same hardware parameters (see the `base_addr` member in `dif_<ip>_t`).
Most other parameters come from the specific IP on a case-by-case basis, and are
extracted from the IP's auto-generated register header file, e.g.,
`<ip>_regs.h`.

#### Base Types

There are two categories of base types:
1. those that are defined once in `sw/device/lib/dif/dif_base.h` and used in all
   DIF libraries, and
2. those that are expected to be defined separately by all DIF libraries (unless
   otherwise specified).

The base types defined in `sw/device/lib/dif/dif_base.h` include:
* `dif_result_t` -- an enum representing global DIF return codes.
* `dif_toggle_t` -- an enum to be used instead of a `bool` when describing
  enablement states.

The base types that are expected to be defined separately by all DIF libraries
include:
* `dif_<ip>_t` -- an **auto-generated** type representing a handle to the
  peripheral. Its first (and only) field is always the base address for the
  peripheral registers, styled `mmio_region_t base_addr;`.
  This type is usually passed by `const` pointer, except when it is
  being initialized (see `dif_<ip>_init()` below).
* `dif_<ip>_config_t` -- a **manually-defined** struct representing runtime
  configuration parameters for the peripheral. It is only present when
  `dif_<ip>_configure()` is defined. This type is always passed by value.

#### Lifecycle Functions
The following functions are the basic functionality for initializing and
handling the lifetime of a handle.

* `dif_result_t dif_<ip>_init(mmio_region_t base_addr, dif_<ip>_t *handle);`
  initializes `handle` with with the base address of the instantiated IP this
  DIF is targeting to use. This DIF is **auto-generated**.

* `dif_result_t dif_<ip>_configure(const dif_<ip>_t *handle, dif_<ip>_config_t
  config);` configures the hardware managed by `handle` with runtime parameters
  in an implementation-defined way. This function should be "one-off": it should
  only need to be called once for the lifetime of the handle.
  _If there is no meaningful state to configure, this function may be omitted._
  In particular, DIF libraries providing transaction functions will usually have
  no need for this function at all. This DIF is **manually-implemented**.

#### Transaction Management

The following types and functions are the standard interface for
*transaction-oriented* peripherals, in which a client schedules an operation to
be completed at some point in the future. All types and functions listed here
are **manually-implemented**.

* `dif_<ip>_transaction_t` is a struct representing runtime parameters for
  starting a hardware transaction. It is only present when `dif_<ip>_start()` is
  defined. This type is always passed by value. A DIF library my opt to use
  another pre-existing type instead, when that type provides a more semantically
  appropriate meaning.
* `dif_<ip>_output_t` is a struct describing how to output a completed
  transaction. Often, this will be a type like `uint8_t *`. The same caveats
  about a DIF library providing a different type apply here.
* `dif_result_t dif_<ip>_start(const dif_<ip>_t *handle, dif_<ip>_transaction_t
  transaction);` starts a transaction on a transaction-oriented peripheral. This
  function may be called multiple times, but each call should be paired with a
  `dif_<ip>_end()` call.
* `dif_result_t dif_<ip>_end(const dif_<ip>_t *handle, dif_<ip>_output_t out);`
  completes a transaction started with `dif_<ip>_start()`, writing its results
  to a location specified in `out`.

If a peripheral supports multiple transaction modes with incompatible parameter
types, the above names may be duplicated by inserting `mode_<mode>` after `<ip>`.
For example,
```
dif_result_t dif_<ip>_mode_<mode>_end(const dif_<ip>_t *handle,
                                  dif_<ip>_mode_<mode>_output_t out);
```
There is no requirement that `_start()` and `_end()` share the same set of
`<mode>`s; for example, there might be a single `dif_<ip>_start()` but many
`dif_<ip>_mode_<mode>_end()`s. This style of API is preferred over using
`union`s with `dif_<ip>_transaction_t` and `dif_<ip>_output_t`.

#### Register Locking

The following functions are the standard interface for peripherals that can lock
portions of their software-accessible functionality. All types and functions
listed here are **manually-implemented**.

* `kDifLocked` is the global return result enum of an operation that can be
  locked out. DIFs which may fail due to lockout, which is software-detectable,
  should return this value when possible.
* `dif_result_t dif_<ip>_lock(const dif_<ip>_t *handle);` locks out all portions
  of the peripheral which can be locked. If a peripheral can be locked-out
  piecewise, `dif_<ip>_lock_<operation>()` functions may be provided alongside
  or in lieu of `dif_<ip>_lock()`.
* `dif_result_t dif_<ip>_is_locked(const dif_<ip>_t *handle, bool *is_locked);`
  checks whether the peripheral has been locked out. As with `dif_<ip>_lock()`,
  DIF libraries may provide a piecewise version of this API.

#### Interrupt Management

The following types and functions are the standard interface for peripherals that
provide a collection of `INTR_ENABLE`, `INTR_STATE`, and `INTR_TEST` registers
for interrupt management. A DIF library for a peripheral providing such
registers must provide this interface. To ensure this, all interrupt DIFs,
including: headers, (C) implementations, and unit tests, are *auto-generated* from
templates and an IP's HJSON configuration file using the `util/make_new_dif.py`
tool (described above).

If a peripheral is defined with `no_auto_intr_regs: true`, this exact API is not
required even if the `INTR_` registers are provided (though DIF libraries are
encouraged to follow it where it makes sense). _In these cases, auto-generated
interrupt DIFs may not exist._

* `dif_<ip>_irq_t` is an enum that lists all of the interrupt types for this
  peripheral. These derived from the `interrupt_list` attribute within an IP's
  HJSON file.
* `dif_result_t dif_<ip>_irq_get_state(const dif_<ip>_t *handle,
  dif_<ip>_irq_state_snapshot_t *snapshot, bool *is_pending);` returns a
  snapshot of the entire interrupt state register, to check the status of all
  interrupts for a peripheral.
* `dif_result_t dif_<ip>_irq_is_pending(const dif_<ip>_t *handle, dif_<ip>_irq_t
  irq, bool *is_pending);` checks whether a specific interrupt is
  pending (i.e., if the interrupt has been asserted but not yet cleared).
* `dif_result_t dif_<ip>_irq_acknowledge_all(const dif_<ip>_t *handle);`
  acknowledges all interrupts have been serviced, marking them as
  complete by clearing all pending bits. This function does nothing and returns
  `kDifOk` if no interrupts were pending.
* `dif_result_t dif_<ip>_irq_acknowledge(const dif_<ip>_t *handle, dif_<ip>_irq_t
  irq);` acknowledges that an interrupt has been serviced, marking it as
  complete by clearing its pending bit. This function does nothing and returns
  `kDifOk` if the interrupt wasn't pending.
* `dif_result_t dif_<ip>_irq_get_enabled(const dif_<ip>_t *handle, dif_<ip>_irq_t
  irq, const dif_<ip>_toggle_t *state);` gets whether an interrupt is
  enabled (i.e., masked).
* `dif_result_t dif_<ip>_irq_set_enabled(const dif_<ip>_t *handle, dif_<ip>_irq_t
  irq, dif_<ip>_toggle_t state);` sets whether a particular interrupt is
  enabled (i.e., masked).
* `dif_result_t dif_<ip>_irq_force(const dif_<ip>_t *handle, dif_<ip>_irq_t
  irq);` forcibly asserts a specific interrupt, causing it to be serviced
  as if hardware had triggered it.

Additionally, the following types allow for batch save/restore operations on
the interrupt enable register:

* `dif_<ip>_irq_enable_snapshot_t` is a type that encapsulates restorable
  interrupt enablement state, to be used with the two functions below. This type
  should be treated as opaque by clients.
* `dif_result_t dif_<ip>_irq_disable_all(const dif_<ip>_t *handle,
  dif_<ip>_irq_enable_snapshot_t *snapshot);` disables all interrupts associated
  with the peripheral, saving them to `*snapshot`. `snapshot` may be null, in
  which case the previous enablement state is not saved.
* `dif_result_t dif_<ip>_irq_restore_all(const dif_<ip>_t *handle,
  const dif_<ip>_irq_enable_snapshot_t *snapshot);` restores an interrupt
  enablement snapshot produced by the above function.

#### Unit Testing

Each DIF has an associated unit test, written in C++. For auto-generated DIFs,
their associated unit tests are also auto-generated. For manually-implemented
DIFs, their associated unit tests follow the conventions:
* The whole file is wrapped in the `dif_<ip>_unittest` namespace.
* There is a base class for all test fixtures, named `<ip>Test`, which derives
  `testing::Test` and `mock_mmio::MmioTest`.
* Each function has an associated test fixture, usually named
  `<function>Test`, which derives `<ip>Test`. Multiple similar functions may be
  grouped under one fixture.
* Prefer to use expectation macros, like `EXPECT_DIF_OK`, defined in
  `dif_test_base.h` whenever possible (e.g. do not write
  `EXPECT_EQ(<long expression>, kDifOk);`).

### DIF Style Guidance

The following rules must be followed by public DIF functions (those declared in
the DIF library's header file). Internal DIF functions (those declared `static`
and not declared in the DIF library's header file) should follow these rules but
there are some relaxations of these rules for them described at the end.

* DIF declarations must match their definitions exactly.
  * Scalar arguments must not be declared `const` or `volatile` (cv-qualified)
    in DIF signatures.

* DIFs must use one of the `dif_result_t` enums (described in
  `sw/device/lib/dif/dif_base.h`) rather than booleans for reporting errors. If
  a DIF can either error or instead produce a value, it must return a
  `dif_result_t`, and use an out-parameter for returning the produced value.
  * DIFs that return an enum return code must be annotated with
    `OT_WARN_UNUSED_RESULT`, to help minimize mistakes from
    failing to check a result. This guidance applies to `static` helper
    functions that return an error of some kind as well.
  * DIFs that cannot error and that do not return a value must return `void`.

* DIFs must check their arguments against preconditions using "guard
  statements". A guard statement is a simple if statement at the start of a
  function which only returns an error code if the preconditions are not met.
  Guard statements must cover the following checks:
  * DIFs must ensure their pointer arguments are non-null, unless that pointer
    is for an optional out-parameter. Arguments typed `mmio_region_t` are not
    pointers, and cannot meaningfully be checked for non-nullness.
  * DIFs must ensure, if they only accept a subset of an enum, that the argument
    is within that subset. However, DIFs may assume, for checking preconditions,
    that any enum argument is one of the enum constants.
  * DIFs must not cause any side-effects before any guard statements. This means
    returning early from a guard statement must not leave the hardware in an
    invalid or unrecoverable state.

* Switch statements in DIFs must always have a default case, including when
  switching on an enum value (an "enum switch").
  * The default case of an enum switch must report an error for values that are
    not a constant from that enum. In the absence of more specific information,
    this should return `kDifError` or the equivalent return code value from
    a global DIF return code enum. If the enum switch is part of a guard
    statement, it may return `kDifBadArg` instead.
  * Enum switches do not need a `case` for enum constants that are unreachable
    due to a guard statement.

* DIFs must use `sw/device/lib/base/mmio.h` for accessing memory-mapped
  hardware. DIFs must not use `sw/device/lib/base/memory.h` for accessing
  memory-mapped hardware.

* Internal DIF functions, which are not intended to be part of a public DIF
  library interface, must not be declared in the DIF library header, and must be
  marked `static`.
  * `static` DIF functions should not be marked `static inline`.
  * An internal DIF function does not need to check preconditions, if all the
    DIF functions that call it have already checked that precondition.
