blob: eb740b57c91cc0782960a56183a0f318dc2b57d9 [file] [log] [blame]
// Copyright 2023 Google LLC
// Copyright lowRISC contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef ${helper.header_macro_prefix}_TOP_${top["name"].upper()}_H_
#define ${helper.header_macro_prefix}_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 (inst_name, if_name), region in helper.devices():
<%
if_desc = inst_name if if_name is None else '{} device on {}'.format(if_name, inst_name)
hex_base_addr = "0x{:X}u".format(region.base_addr)
hex_size_bytes = "0x{:X}u".format(region.size_bytes)
base_addr_name = region.base_addr_name().as_c_define()
size_bytes_name = region.size_bytes_name().as_c_define()
%>\
/**
* Peripheral base address for ${if_desc} 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 ${base_addr_name} ${hex_base_addr}
/**
* Peripheral size for ${if_desc} 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 #${base_addr_name} and
* `${base_addr_name} + ${size_bytes_name}`.
*/
#define ${size_bytes_name} ${hex_size_bytes}
% endfor
% for name, region in helper.memories():
<%
hex_base_addr = "0x{:X}u".format(region.base_addr)
hex_size_bytes = "0x{:X}u".format(region.size_bytes)
base_addr_name = region.base_addr_name().as_c_define()
size_bytes_name = region.size_bytes_name().as_c_define()
%>\
/**
* Memory base address for ${name} in top ${top["name"]}.
*/
#define ${base_addr_name} ${hex_base_addr}
/**
* Memory size for ${name} in top ${top["name"]}.
*/
#define ${size_bytes_name} ${hex_size_bytes}
% endfor
/**
* PLIC Interrupt Source Peripheral.
*
* Enumeration used to determine which peripheral asserted the corresponding
* interrupt.
*/
${helper.plic_sources.render()}
${helper.smc_helper.smc_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()}
${helper.smc_helper.smc_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()}
${helper.smc_helper.smc_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()}
${helper.smc_helper.smc_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_MIO_PERIPH_INSEL_IDX_OFFSET 2
// PERIPH_INSEL ranges from 0 to NUM_MIO_PADS + 2 -1}
// 0 and 1 are tied to value 0 and 1
#define NUM_MIO_PADS ${top["pinmux"]["io_counts"]["muxed"]["pads"]}
#define NUM_DIO_PADS ${top["pinmux"]["io_counts"]["dedicated"]["inouts"] + \
top["pinmux"]["io_counts"]["dedicated"]["inputs"] + \
top["pinmux"]["io_counts"]["dedicated"]["outputs"] }
#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()}
/**
* Dedicated Pad Selects
*/
${helper.direct_pads.render()}
/**
* Muxed Pad Selects
*/
${helper.muxed_pads.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()}
/**
* MMIO Region
*
* MMIO region excludes any memory that is separate from the module
* configuration space, i.e. ROM, main SRAM, and flash are excluded but
* retention SRAM, spi_device memory, or usbdev memory are included.
*/
#define ${helper.mmio.base_addr_name().as_c_define()} ${"0x{:X}u".format(helper.mmio.base_addr)}
#define ${helper.mmio.size_bytes_name().as_c_define()} ${"0x{:X}u".format(helper.mmio.size_bytes)}
// Header Extern Guard
#ifdef __cplusplus
} // extern "C"
#endif
#endif // ${helper.header_macro_prefix}_TOP_${top["name"].upper()}_H_