blob: 56caa5eddbfad0e4782f69f828a0e4669eacdbd9 [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 _TOP_${top["name"].upper()}_H_
#define _TOP_${top["name"].upper()}_H_
/**
* @file
* @brief Top-specific Definitions
*
* This file contains preprocessor and type definitions for use within the
* device C/C++ codebase.
*
* These definitions are for information that depends on the top-specific chip
* configuration, which includes:
* - Device Memory Information (for Peripherals and Memory)
* - PLIC Interrupt ID Names and Source Mappings
* - Alert ID Names and Source Mappings
* - Pinmux Pin/Select Names
* - Power Manager Wakeups
*/
#ifdef __cplusplus
extern "C" {
#endif
% for name, region in helper.modules():
/**
* Peripheral base address for ${name} in top ${top["name"]}.
*
* This should be used with #mmio_region_from_addr to access the memory-mapped
* registers associated with the peripheral (usually via a DIF).
*/
#define ${region.base_addr_name().as_c_define()} ${region.base_addr}u
/**
* Peripheral size for ${name} in top ${top["name"]}.
*
* This is the size (in bytes) of the peripheral's reserved memory area. All
* memory-mapped registers associated with this peripheral should have an
* address between #${region.base_addr_name().as_c_define()} and
* `${region.base_addr_name().as_c_define()} + ${region.size_bytes_name().as_c_define()}`.
*/
#define ${region.size_bytes_name().as_c_define()} ${region.size_bytes}u
% endfor
% for name, region in helper.memories():
/**
* Memory base address for ${name} in top ${top["name"]}.
*/
#define ${region.base_addr_name().as_c_define()} ${region.base_addr}u
/**
* Memory size for ${name} in top ${top["name"]}.
*/
#define ${region.size_bytes_name().as_c_define()} ${region.size_bytes}u
% endfor
/**
* PLIC Interrupt Source Peripheral.
*
* Enumeration used to determine which peripheral asserted the corresponding
* interrupt.
*/
${helper.plic_sources.render()}
/**
* PLIC Interrupt Source.
*
* Enumeration of all PLIC interrupt sources. The interrupt sources belonging to
* the same peripheral are guaranteed to be consecutive.
*/
${helper.plic_interrupts.render()}
/**
* PLIC Interrupt Source to Peripheral Map
*
* This array is a mapping from `${helper.plic_interrupts.name.as_c_type()}` to
* `${helper.plic_sources.name.as_c_type()}`.
*/
${helper.plic_mapping.render_declaration()}
/**
* PLIC Interrupt Target.
*
* Enumeration used to determine which set of IE, CC, threshold registers to
* access for a given interrupt target.
*/
${helper.plic_targets.render()}
/**
* Alert Handler Source Peripheral.
*
* Enumeration used to determine which peripheral asserted the corresponding
* alert.
*/
${helper.alert_sources.render()}
/**
* Alert Handler Alert Source.
*
* Enumeration of all Alert Handler Alert Sources. The alert sources belonging to
* the same peripheral are guaranteed to be consecutive.
*/
${helper.alert_alerts.render()}
/**
* Alert Handler Alert Source to Peripheral Map
*
* This array is a mapping from `${helper.alert_alerts.name.as_c_type()}` to
* `${helper.alert_sources.name.as_c_type()}`.
*/
${helper.alert_mapping.render_declaration()}
#define PINMUX_PERIPH_INSEL_IDX_OFFSET 2
// PERIPH_INSEL ranges from 0 to NUM_MIO + 2 -1}
// 0 and 1 are tied to value 0 and 1
#define NUM_MIO ${top["pinmux"]["num_mio"]}
#define NUM_DIO ${sum([x["width"] if "width" in x else 1 for x in top["pinmux"]["dio"]])}
#define PINMUX_PERIPH_OUTSEL_IDX_OFFSET 3
/**
* Pinmux Peripheral Input.
*/
${helper.pinmux_peripheral_in.render()}
/**
* Pinmux MIO Input Selector.
*/
${helper.pinmux_insel.render()}
/**
* Pinmux MIO Output.
*/
${helper.pinmux_mio_out.render()}
/**
* Pinmux Peripheral Output Selector.
*/
${helper.pinmux_outsel.render()}
/**
* Power Manager Wakeup Signals
*/
${helper.pwrmgr_wakeups.render()}
/**
* Reset Manager Software Controlled Resets
*/
${helper.rstmgr_sw_rsts.render()}
/**
* Power Manager Reset Request Signals
*/
${helper.pwrmgr_reset_requests.render()}
/**
* Clock Manager Software-Controlled ("Gated") Clocks.
*
* The Software has full control over these clocks.
*/
${helper.clkmgr_gateable_clocks.render()}
/**
* Clock Manager Software-Hinted Clocks.
*
* The Software has partial control over these clocks. It can ask them to stop,
* but the clock manager is in control of whether the clock actually is stopped.
*/
${helper.clkmgr_hintable_clocks.render()}
// Header Extern Guard
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _TOP_${top["name"].upper()}_H_