blob: 8be0d80eae52fed384cfe0c6c246013377a17ff4 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_SW_DEVICE_LIB_DIF_DIF_PATTGEN_H_
#define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_PATTGEN_H_
/**
* @file
* @brief <a href="/hw/ip/pattgen/doc/">Pattern Generator</a> Device Interface
* Functions
*/
#include <stdint.h>
#include "sw/device/lib/dif/dif_base.h"
#include "sw/device/lib/dif/autogen/dif_pattgen_autogen.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
* Helper X macro for defining enums and case statements related to Pattern
* Generator channels. If an additional channel is ever added to the hardware,
* this list can be updated.
*/
#define DIF_PATTGEN_CHANNEL_LIST(X) \
X(0) \
X(1)
/**
* Helper macro for defining a `dif_pattgen_channel_t` enumeration constant.
* @channel_ Pattern Generator channel of the enumeration constant.
*/
#define PATTGEN_CHANNEL_ENUM_INIT_(channel_) \
kDifPattgenChannel##channel_ = channel_,
/**
* A Pattern Generator channel.
*/
typedef enum dif_pattgen_channel {
DIF_PATTGEN_CHANNEL_LIST(PATTGEN_CHANNEL_ENUM_INIT_)
} dif_pattgen_channel_t;
#undef PATTGEN_CHANNEL_ENUM_INIT_
/**
* The polarity of a Pattern Generator channel.
*/
typedef enum dif_pattgen_polarity {
/**
* Low polarity indicates the output data signal (PDA) changes on a falling
* output clock (PCL) edge.
*/
kDifPattgenPolarityLow = 0,
/**
* High polarity indicates the output data signal (PDA) changes on a rising
* output clock (PCL) edge.
*/
kDifPattgenPolarityHigh = 1,
/**
* Number of polarity values, used for argument validation.
*/
kDifPattgenPolarityCount = 2,
} dif_pattgen_polarity_t;
/**
* Runtime configuration for a Pattern Generator channel.
*/
typedef struct dif_pattgen_channel_config {
/**
* The polarity of the channel.
*/
dif_pattgen_polarity_t polarity;
/**
* The I/O clock divisor that determines the frequency of channel's clock.
*
* Specifically, the output clock frequency (f_pcl) is computed from the I/O
* clock frequency (f_io_clk):
*
* f_pcl = f_io_clk / (2 * (clock_divisor + 1))
*/
uint32_t clock_divisor;
/**
* The lower 32-bits of the seed pattern.
*
* Some bits may go unused depending on the value of `seed_pattern_length`.
*/
uint32_t seed_pattern_lower_word;
/**
* The upper 32-bits of the seed pattern.
*
* Some, or all, bits may go unused depending on the value of
* `seed_pattern_length`.
*/
uint32_t seed_pattern_upper_word;
/**
* The length of the seed pattern.
*
* Units: bits
* Valid range: [1, 64]
*/
uint8_t seed_pattern_length;
/**
* The number of times to repeat the pattern.
*
* Valid range: [1, 1024]
*/
uint16_t num_pattern_repetitions;
} dif_pattgen_channel_config_t;
/**
* Configures a Pattern Generator channel.
*
* This should be called once for each channel to be configured.
*
* Since writes to channel configuration registers have no effect when the
* channel is enabled, this function will return `kDifError` if the channel is
* enabled.
*
* @param pattgen A Pattern Generator handle.
* @param channel The channel to configure.
* @param config Runtime configuration parameters.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_pattgen_configure_channel(const dif_pattgen_t *pattgen,
dif_pattgen_channel_t channel,
dif_pattgen_channel_config_t config);
/**
* Sets the enablement state of a Pattern Generator channel.
*
* @param pattgen A Pattern Generator handle.
* @param channel The channel to set the enablement state of.
* @param enabled The enablement state to configure the channel in.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_pattgen_channel_set_enabled(const dif_pattgen_t *pattgen,
dif_pattgen_channel_t channel,
dif_toggle_t enabled);
/**
* Gets the enablement state of a Pattern Generator channel.
*
* @param pattgen A Pattern Generator handle.
* @param channel The channel to get the enablement state of.
* @param[out] is_enabled The enablement state of the channel.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_pattgen_channel_get_enabled(const dif_pattgen_t *pattgen,
dif_pattgen_channel_t channel,
dif_toggle_t *is_enabled);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_PATTGEN_H_