blob: 8706c9dc1138df6be7dec7b74839d30f38ff8bae [file] [log] [blame]
#!/bin/bash
#
# Copyright 2024 Google LLC
#
# 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
#
# https://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.
# Firmware image to build & load at boot.
ifeq ($(CHERIOT_FIRMWARE),)
$(error "CHERIOT_FIRMWARE not set. Did build/platforms/${PLATFORM}/setup.sh get sourced?")
endif
CHERIOT_FIRMWARE_SRC_DIR := ${ROOTDIR}/hw/matcha/sw/device/cheriot/${CHERIOT_FIRMWARE}
# Optional xmake config options, typically useful for enabling debugging
# otherwise compiled out.
#CHERIOT_DEBUG_CONFIG_OPTIONS=--debug-scheduler=true --debug-allocator=true
#CHERIOT_RELEASE_CONFIG_OPTIONS=--debug-scheduler=true --debug-allocator=true
# Platform-specific requirements handled by "m prereqs"
PLATFORM_PYTHON_DEPS=\
${ROOTDIR}/hw/opentitan-upstream/python-requirements.txt
PLATFORM_APT_DEPS=\
${ROOTDIR}/hw/opentitan-upstream/apt-requirements.txt
# Put host tool targets first.
include $(ROOTDIR)/build/platforms/nexus/renode.mk
include $(ROOTDIR)/build/platforms/sencha/cheriot.mk
include $(ROOTDIR)/build/platforms/sencha/riscv_toolchain.mk
include $(ROOTDIR)/build/platforms/nexus/iree.mk
include $(ROOTDIR)/build/platforms/nexus/kelvin.mk
include $(ROOTDIR)/build/platforms/nexus/opentitan_sw.mk
include $(ROOTDIR)/build/platforms/nexus/opentitan_hw.mk
include $(ROOTDIR)/build/platforms/nexus/matcha_hw.mk
include $(ROOTDIR)/build/platforms/nexus/tock.mk
# Put simulation targets at the end
include $(ROOTDIR)/build/platforms/sencha/sim.mk
# Driver include files auto-generated from opentitan definitions.
ifeq ($(OPENTITAN_SOURCE),)
$(error "OPENTITAN_SOURCE not set. Did build/platforms/sencha/setup.sh get sourced?")
endif
ifeq ($(OPENTITAN_GEN_DIR),)
$(error "OPENTITAN_GEN_DIR not set. Did build/platforms/sencha/setup.sh get sourced?")
endif
$(OPENTITAN_GEN_DIR):
mkdir -p $(OPENTITAN_GEN_DIR)
# Matcha hw config #defines generated from RTL
I2S_HEADER=$(OPENTITAN_GEN_DIR)/i2s_regs.h
ML_TOP_HEADER=$(OPENTITAN_GEN_DIR)/ml_top_regs.h
TLUL_MAILBOX_HEADER=$(OPENTITAN_GEN_DIR)/tlul_mailbox_regs.h
UART_HEADER=$(OPENTITAN_GEN_DIR)/uart_regs.h
$(I2S_HEADER): $(REGTOOL) $(I2S_HJSON) | $(OPENTITAN_GEN_DIR)
$(REGTOOL) -D -o $@ $(I2S_HJSON)
$(ML_TOP_HEADER): $(REGTOOL) $(ML_TOP_HJSON) | $(OPENTITAN_GEN_DIR)
$(REGTOOL) -D -o $@ $(ML_TOP_HJSON)
$(TLUL_MAILBOX_HEADER): $(REGTOOL) $(MBOX_HJSON) | $(OPENTITAN_GEN_DIR)
$(REGTOOL) -D -o $@ $(MBOX_HJSON)
$(UART_HEADER): $(REGTOOL) $(UART_HJSON) | $(OPENTITAN_GEN_DIR)
$(REGTOOL) -D -o $@ $(UART_HJSON)
TOP_MATCHA_DIR=${CHERIOT_OUT_DIR}/top_matcha
TOP_MATCHA_MEMORY_HEADER=$(TOP_MATCHA_DIR)/sw/autogen/top_matcha_memory.h
TOP_MATCHA_IRQ_HEADER=$(TOP_MATCHA_DIR)/sw/autogen/top_matcha_smc_irq.h
# NB: could depend on the templates instead
TOPGEN_MATCHA=${ROOTDIR}/hw/matcha/util/topgen_matcha.py
${TOP_MATCHA_DIR}:
mkdir -p $(TOP_MATCHA_DIR)
# NB: no way to generate just the files we need
$(TOP_MATCHA_IRQ_HEADER): $(TOPGEN_MATCHA) ${TOP_MATCHA_DIR} $(TOP_MATCHA_HJSON)
PYTHONPATH=${OPENTITAN_SOURCE}/util/ ${TOPGEN_MATCHA} -t ${TOP_MATCHA_HJSON} -o ${TOP_MATCHA_DIR}/ --top-only
$(TOP_MATCHA_MEMORY_HEADER): $(TOPGEN_MATCHA) ${TOP_MATCHA_DIR} $(TOP_MATCHA_HJSON)
PYTHONPATH=${OPENTITAN_SOURCE}/util/ ${TOPGEN_MATCHA} -t ${TOP_MATCHA_HJSON} -o ${TOP_MATCHA_DIR}/ --top-only
# Targets to install the symlink to opentitan headers for each build
cheriot-build-debug-prepare:: | $(CHERIOT_OUT_DEBUG)
ln -sf $(CHERIOT_OUT_DIR)/opentitan-gen $(CHERIOT_OUT_DEBUG)/
cheriot-build-release-prepare:: | $(CHERIOT_OUT_RELEASE)
ln -sf $(CHERIOT_OUT_DIR)/opentitan-gen $(CHERIOT_OUT_RELEASE)/
CHERIOT_GEN_HEADERS=\
$(I2S_HEADER) \
$(ML_TOP_HEADER) \
$(TLUL_MAILBOX_HEADER) \
$(UART_HEADER) \
$(TOP_MATCHA_IRQ_HEADER) \
$(TOP_MATCHA_MEMORY_HEADER)
cheriot-gen-headers:: $(CHERIOT_GEN_HEADERS)
cheriot-clean-headers::
rm -f $(CHERIOT_GEN_HEADERS)
# Point to the clang++ target to make sure the binary is installed.
$(CACHE)/cheriot-tools/bin/clang++: | $(CACHE)
./scripts/install-toolchain.sh cheriot
## Installs the LLVM compiler for CHERIoT
#
# Requires network access. This fetches the toolchain from the GCP archive and
# extracts it locally to the cache/.
install_cheriot: $(CACHE)/cheriot-tools/bin/clang++
# NB: install the prebuilt CHERIoT toolchain. Note this means it
# is necessary to do something like:
# $ set-platform sencha
# $ m tools
# to get a working build environment.
tools:: install_cheriot
.PHONY:: install_cheriot