# SPDX-License-Identifier: GPL-2.0-or-later

#
# SpacemiT Key Stone K1 target
#
# https://www.spacemit.com/key-stone-k1
#

transport select jtag

adapter speed 2000

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

if { [info exists CORES] } {
    set _cores $CORES
} else {
    set _cores 1
}

if { [info exists SECJTAG] } {
    jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10000E21
} else {
    jtag newtap pre unknown -irlen 1 -expected-id 0x00000000 -disable
    jtag configure pre.unknown -event tap-enable ""

    jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10000E21 -disable
    jtag configure $_CHIPNAME.cpu -event tap-enable ""

    jtag newtap post unknown -irlen 9 -expected-id 0x08501C0D -ignore-version

    jtag configure post.unknown -event setup {
        global _CHIPNAME

        irscan post.unknown 0x98
        drscan post.unknown 16 0xa

        jtag tapenable pre.unknown
        jtag tapenable $_CHIPNAME.cpu
    }
}

set _TARGETNAME $_CHIPNAME.cpu
set DBGBASE {0x0 0x400}
set _smp_command "target smp"

for { set _core 0 } { $_core < $_cores } { incr _core } {
    target create $_TARGETNAME.$_core riscv -chain-position $_TARGETNAME \
        -coreid [expr {$_core % 4}] -dbgbase [lindex $DBGBASE [expr {$_core / 4}]]

    if { [expr {$_core % 4}] == 0 } {
        $_TARGETNAME.$_core configure -rtos hwthread
    }

    set _smp_command "$_smp_command $_TARGETNAME.$_core"
}

eval $_smp_command

set _SPEED 8000

$_TARGETNAME.0 configure -event examine-start {
    adapter speed $_SPEED
    puts [ adapter speed ]
}

foreach t [target names] {
    # $t riscv set_mem_access sysbus progbuf
    $t riscv set_mem_access progbuf
}
