[doc] small changes before sw moves (new layout)
`sw/device/lib/dif/{_index.md,README.md}` are duplicates.
Moving `sw/README.md`, so that it can be replace
with the content of `sw/_index.md`.
Signed-off-by: Hugo McNally <hugo.mcnally@gmail.com>
diff --git a/sw/device/lib/dif/_index.md b/sw/device/lib/dif/_index.md
deleted file mode 100644
index 72f75d4..0000000
--- a/sw/device/lib/dif/_index.md
+++ /dev/null
@@ -1,348 +0,0 @@
----
-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.
-
-## Section content
-
-{{% sectionContent %}}
diff --git a/sw/README.md b/sw/doc/build_software.md
similarity index 100%
rename from sw/README.md
rename to sw/doc/build_software.md