# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Target configuration for the lowRISC "Earl Grey" chip

if { [info exists CHIPNAME] } {
   set  _CHIPNAME $CHIPNAME
} else {
   set  _CHIPNAME riscv
}

if { [info exists CPUTAPID ] } {
   set _CPUTAPID $CPUTAPID
} else {
   # TODO: This is a dummy JTAG IDCODE value currently used in the HW design.
   # This needs to be replaced with an assigned JTAG IDCODE value as we get it.
   set _CPUTAPID 0x00000001
}

jtag newtap $_CHIPNAME tap -irlen 5 -expected-id $_CPUTAPID
set _TARGETNAME $_CHIPNAME.tap
target create $_TARGETNAME.0 riscv -chain-position $_TARGETNAME -rtos riscv

# Configure work area in on-chip SRAM
$_TARGETNAME.0 configure -work-area-phys 0x80000000 -work-area-size 1000 -work-area-backup 0

# This chip implements system bus access, use it.
# Accessing the memory through the system bus is faster than through
# instruction feeding.
riscv set_prefer_sba on

# Be verbose about GDB errors
gdb_report_data_abort enable
gdb_report_register_access_error enable
