Commit ec65f08d authored by Federico Vaga's avatar Federico Vaga

Merge branch 'master' into develop

parents d6b1eaf4 00ec80ed
urv-core @ 5c7e906c
Subproject commit 70e9e78f740aa7f4d8168ccaa003bf3924824284
Subproject commit 5c7e906ceb6b15f53830061c9087cce0befef13a
wr-cores @ 7a42cf8e
Subproject commit f1f97978cea46eb6ccefc3c26ea86e56c4e85651
Subproject commit 7a42cf8e9a39f72955c3fde2126c0b126037eaae
......@@ -256,14 +256,17 @@ NET "fp_gpio2_a2b_o" IOSTANDARD="LVCMOS33";
NET "fp_gpio34_a2b_o" LOC=V28;
NET "fp_gpio34_a2b_o" IOSTANDARD="LVCMOS33";
NET "fp_gpio_in[0]" LOC=R30;
NET "fp_gpio_in[0]" IOSTANDARD="LVCMOS33";
NET "fp_gpio_in[1]" LOC=T28;
NET "fp_gpio_in[1]" IOSTANDARD="LVCMOS33";
NET "fp_gpio_in[2]" LOC=U29;
NET "fp_gpio_in[2]" IOSTANDARD="LVCMOS33";
NET "fp_gpio_in[3]" LOC=V27;
NET "fp_gpio_in[3]" IOSTANDARD="LVCMOS33";
NET "fp_gpio1_b" LOC=R30;
NET "fp_gpio1_b" IOSTANDARD="LVCMOS33";
NET "fp_gpio2_b" LOC=T28;
NET "fp_gpio2_b" IOSTANDARD="LVCMOS33";
NET "fp_gpio3_b" LOC=U29;
NET "fp_gpio3_b" IOSTANDARD="LVCMOS33";
NET "fp_gpio4_b" LOC=V27;
NET "fp_gpio4_b" IOSTANDARD="LVCMOS33";
NET "clk_125m_pllref_n_i" TNM_NET = clk_125m_pllref_n_i;
TIMESPEC TS_clk_125m_pllref_n_i = PERIOD "clk_125m_pllref_n_i" 8 ns HIGH 50%;
......
......@@ -55,7 +55,10 @@ module main;
.fp_gpio1_a2b_o (),
.fp_gpio2_a2b_o (),
.fp_gpio34_a2b_o (),
.fp_gpio_b (),
.fp_gpio1_b (),
.fp_gpio2_b (),
.fp_gpio3_b (),
.fp_gpio4_b (),
.sim_wb_i (Host.out),
.sim_wb_o (Host.in),
.VME_AS_n_i (),
......
......@@ -56,7 +56,10 @@ entity svec_mt_demo is
fp_gpio1_a2b_o : out std_logic;
fp_gpio2_a2b_o : out std_logic;
fp_gpio34_a2b_o : out std_logic;
fp_gpio_b : inout std_logic_vector(3 downto 0);
fp_gpio1_b : inout std_logic;
fp_gpio2_b : inout std_logic;
fp_gpio3_b : inout std_logic;
fp_gpio4_b : inout std_logic;
-- Bypass VME core, useful only in simulation
-- synthesis translate_off
sim_wb_i : in t_wishbone_slave_in := cc_dummy_slave_in;
......@@ -167,11 +170,6 @@ architecture arch of svec_mt_demo is
signal powerup_rst_n : std_logic := '0';
signal sys_locked : std_logic;
signal fp_gpio_in : std_logic_vector(3 downto 0);
attribute keep : string;
attribute keep of fp_gpio_in : signal is "true";
begin -- architecture arch
U_Buf_CLK_PLL : IBUFGDS
......@@ -382,19 +380,16 @@ begin -- architecture arch
fp_gpio34_a2b_o <= cpu_gpio_oen(2);
-- FP GPIO bidir in/out (3 and 4 share the same direction line)
fp_gpio_gen : for i in 0 to 3 generate
fp_gpio_b(i) <= cpu_gpio_out(i) when cpu_gpio_oen(i) = '1' else 'Z';
fp_gpio_in(i) <= fp_gpio_b(i);
gpio_sync_ffs : gc_sync_ffs
port map (
clk_i => clk_sys,
rst_n_i => rst_n_sys,
data_i => fp_gpio_in(i),
synced_o => cpu_gpio_in(i));
end generate fp_gpio_gen;
fp_gpio1_b <= cpu_gpio_out(0) when cpu_gpio_oen(0) = '1' else 'Z';
fp_gpio2_b <= cpu_gpio_out(1) when cpu_gpio_oen(1) = '1' else 'Z';
fp_gpio3_b <= cpu_gpio_out(2) when cpu_gpio_oen(2) = '1' else 'Z';
fp_gpio4_b <= cpu_gpio_out(3) when cpu_gpio_oen(2) = '1' else 'Z';
-- gpio inputs (same for both CPUs)
cpu_gpio_in(0) <= fp_gpio1_b;
cpu_gpio_in(1) <= fp_gpio2_b;
cpu_gpio_in(2) <= fp_gpio3_b;
cpu_gpio_in(3) <= fp_gpio4_b;
cpu_gpio_in(23 downto 4) <= cpu_gpio_out(23 downto 4);
......
......@@ -828,7 +828,7 @@ static inline void smem_atomic_xor(int *p, int x)
* @param[in] p address on the shared memory
* @return the value before the set
*/
static inline int smem_atomic_test_and_set(int *p)
static inline int smem_atomic_test_and_set(volatile int *p)
{
/* shift right translates range in bytes into range in words */
return *(volatile int *)(p + (TRTL_SMEM_TYPE_TST_SET >> 2));
......
......@@ -27,7 +27,9 @@ mockturtle-y += mockturtle-hmq.o
mockturtle-y += mockturtle-tty.o
mockturtle-y += mockturtle-dbg.o
all modules:
$(MAKE) -C ../include/hw/
$(MAKE) -C $(LINUX) M=$(shell /bin/pwd) modules
install modules_install:
......@@ -40,3 +42,5 @@ clean:
coccicheck:
$(MAKE) -C $(LINUX) M=$(shell /bin/pwd) coccicheck
.PHONY: headers
......@@ -1068,7 +1068,7 @@ static void trtl_message_push(struct trtl_hmq *hmq, struct trtl_msg *msg)
* Use this only from the output IRQ handler because it assumes that
* the output channel has a free slot (the reason for having the IRQ)
*/
static void trtl_mesage_push_from_buf(struct trtl_hmq *hmq)
static void trtl_message_push_from_buf(struct trtl_hmq *hmq)
{
unsigned long flags;
struct mturtle_hmq_buffer *buf = &hmq->buf_out;
......@@ -1138,7 +1138,7 @@ irqreturn_t trtl_irq_handler_out(int irq_core_base, void *arg)
"There must be a freeslot if we got an interrupt. Look for an HDL bug\nDisable HMQ output IRQ\n");
trtl_hmq_irq_disable(hmq, 1);
}
trtl_mesage_push_from_buf(hmq);
trtl_message_push_from_buf(hmq);
}
return IRQ_HANDLED;
......
......@@ -55,11 +55,13 @@ int trtl_fw_version(struct trtl_dev *trtl,
* @param[in] trtl device token
* @param[in] idx_cpu CPU index
* @param[in] idx_hmq HMQ index
* @param[in] timeout_ms timeout
* @return 0 on success, -1 on error and errno is set appropriately
*/
int trtl_fw_ping(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq)
int trtl_fw_ping_timeout(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq,
int timeout_ms)
{
struct trtl_desc *wdesc = (struct trtl_desc *)trtl;
struct trtl_msg msg;
......@@ -72,7 +74,7 @@ int trtl_fw_ping(struct trtl_dev *trtl,
msg.hdr.flags = TRTL_HMQ_HEADER_FLAG_RPC;
err = trtl_msg_sync(trtl, idx_cpu, idx_hmq, &msg, &msg,
trtl_default_timeout_ms);
timeout_ms);
if (err < 0)
return -1;
if (msg.hdr.msg_id != TRTL_MSG_ID_PING) {
......@@ -83,6 +85,21 @@ int trtl_fw_ping(struct trtl_dev *trtl,
return 0;
}
/**
* It checks if firmware core is running and answering to messages
* @param[in] trtl device token
* @param[in] idx_cpu CPU index
* @param[in] idx_hmq HMQ index
* @return 0 on success, -1 on error and errno is set appropriately
*/
int trtl_fw_ping(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq)
{
return trtl_fw_ping_timeout(trtl, idx_cpu, idx_hmq,
trtl_default_timeout_ms);
}
static int __trtl_fw_variable(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq,
......
......@@ -36,7 +36,7 @@ const unsigned int trtl_default_timeout_ms = 1000;
/**
* Mock Turtle error code strings
*/
static char *trtl_error_str[] = {
static const char * const trtl_error_str[] = {
"Cannot parse data from sysfs attribute",
"Invalid slot",
"Operation not yet implemented",
......@@ -92,7 +92,7 @@ static int trtl_sysfs_write(char *path, void *buf, size_t len);
* @param[in] err error code. Typically 'errno' variable
* @return a message error. No need to free the string.
*/
char *trtl_strerror(int err)
const char *trtl_strerror(int err)
{
if (err < ETRTL_INVAL_PARSE || err > __ETRTL_MAX)
return strerror(err);
......@@ -575,7 +575,7 @@ int trtl_cpu_reset_set(struct trtl_dev *trtl, uint32_t mask)
*/
int trtl_cpu_load_application_raw(struct trtl_dev *trtl,
unsigned int index,
void *code, size_t length,
const void *code, size_t length,
unsigned int offset)
{
struct trtl_desc *wdesc = (struct trtl_desc *)trtl;
......@@ -658,7 +658,7 @@ int trtl_cpu_dump_application_raw(struct trtl_dev *trtl,
*/
int trtl_cpu_load_application_file(struct trtl_dev *trtl,
unsigned int index,
char *path)
const char *path)
{
int i, len;
void *code;
......@@ -709,7 +709,7 @@ int trtl_cpu_load_application_file(struct trtl_dev *trtl,
*/
int trtl_cpu_dump_application_file(struct trtl_dev *trtl,
unsigned int index,
char *path)
const char *path)
{
int i = 0;
uint8_t code[4096];
......@@ -1068,21 +1068,28 @@ int trtl_msg_sync(struct trtl_dev *trtl,
{
struct trtl_desc *wdesc = (struct trtl_desc *)trtl;
struct polltrtl p;
#if 0
struct trtl_msg_filter f_sync = {
.flags = TRTL_MSG_FILTER_FLAG_HEADER,
.operation = TRTL_MSG_FILTER_AND,
.word_offset = 1, /* ATTENTION: sync_id in the message header */
.mask = 0xFFFF0000,
};
#endif
int ret;
msg_s->hdr.flags |= TRTL_HMQ_HEADER_FLAG_SYNC;
f_sync.value = (msg_s->hdr.sync_id << 16);
#if 0
/* FIXME: commented out as the filter is never removed.
The filter shouldn't be needed as the synchronous messages are
always sent sequentially - if there is only one process. */
f_sync.value = (msg_s->hdr.sync_id << 16);
ret = trtl_hmq_filter_add(wdesc->trtl_sync, idx_cpu, idx_hmq,
&f_sync);
if (ret < 0)
return -1;
#endif
/* send message */
ret = trtl_msg_async_send(wdesc->trtl_sync, idx_cpu, idx_hmq, msg_s, 1);
......
......@@ -101,7 +101,7 @@ const struct trtl_config_rom *trtl_config_get(struct trtl_dev *trtl);
extern void trtl_print_header(struct trtl_msg *msg);
extern void trtl_print_payload(struct trtl_msg *msg);
extern void trtl_print_message(struct trtl_msg *msg);
extern char *trtl_strerror(int err);
extern const char *trtl_strerror(int err);
/**@}*/
/**
......@@ -111,18 +111,18 @@ extern char *trtl_strerror(int err);
*/
extern int trtl_cpu_load_application_raw(struct trtl_dev *trtl,
unsigned int index,
void *code, size_t length,
const void *code, size_t length,
unsigned int offset);
extern int trtl_cpu_load_application_file(struct trtl_dev *trtl,
unsigned int index,
char *path);
const char *path);
extern int trtl_cpu_dump_application_raw(struct trtl_dev *trtl,
unsigned int index,
void *code, size_t length,
unsigned int offset);
extern int trtl_cpu_dump_application_file(struct trtl_dev *trtl,
unsigned int index,
char *path);
const char *path);
extern int trtl_cpu_reset_set(struct trtl_dev *trtl, uint32_t mask);
extern int trtl_cpu_reset_get(struct trtl_dev *trtl, uint32_t *mask);
......@@ -205,6 +205,10 @@ extern int trtl_fw_version(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq,
struct trtl_fw_version *version);
extern int trtl_fw_ping_timeout(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq,
int timeout_ms);
extern int trtl_fw_ping(struct trtl_dev *trtl,
unsigned int idx_cpu,
unsigned int idx_hmq);
......
......@@ -620,6 +620,7 @@ class GdbServer(object):
sys.stdout.write("Waiting for connection on port {}\n".format(gdb_port))
self.conn, client_addr = sock.accept()
sys.stdout.write("connection from {}\n".format(client_addr))
self.force_debug()
while True:
# Wait for a packet
packet = ""
......@@ -659,7 +660,6 @@ class GdbServer(object):
packet = ''
def run(self):
self.force_debug()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', gdb_port))
......@@ -670,12 +670,16 @@ class GdbServer(object):
def cmd_gdb(csr):
# Set force
csr.writel(CSR_DBG_FORCE, 0xf)
# Clear reset
csr.writel(CSR_RESET, 0)
# Disable force
csr.writel(CSR_DBG_FORCE, 0)
rst = csr.readl(CSR_RESET)
cpu_bit = 1 << flag_cpu
if (rst & cpu_bit) != 0:
sys.stdout.write("Put cpu #{} out of reset\n".format(flag_cpu))
# Set force
csr.writel(CSR_DBG_FORCE, cpu_bit)
# Clear reset
csr.writel(CSR_RESET, rst & ~cpu_bit)
# Disable force
csr.writel(CSR_DBG_FORCE, 0)
csr.writel(CSR_CORESEL, flag_cpu);
......@@ -707,24 +711,24 @@ def main():
'gdb': cmd_gdb}
parser = argparse.ArgumentParser(description='Low-level debugging interface without driver')
parser.add_argument("-b, --bus", choices=["pci", "vme"],
parser.add_argument("-b", "--bus", choices=["pci", "vme"],
required=True, dest='bus', help='to select the bus on which there is the Mock Turtle core to access.')
parser.add_argument("-o, --offset", type=auto_int, required=True, dest='offset', default=0,
parser.add_argument("-o", "--offset", type=auto_int, required=True, dest='offset', default=0,
help='The memory offset to apply to be able to point to the Mock Turtle core. This is strictly dependent on the bus in use.')
parser.add_argument("-v, --verbose", action='store_true',
parser.add_argument("-v", "--verbose", action='store_true',
default=False, dest='verbose', help='')
parser.add_argument("-k, --keep", action='store_true',
parser.add_argument("-k", "--keep", action='store_true',
default=False, dest='keep', help='')
parser.add_argument("-c, --cpu", type=int, default=0, dest='cpu',
parser.add_argument("-c", "--cpu", type=int, default=0, dest='cpu',
help='Select the CPU to use')
parser.add_argument("-t, --no-term", action='store_false',
parser.add_argument("-t", "--no-term", action='store_false',
default=True, dest='term',
help='It disable the console during GDB session')
parser.add_argument("-d, --device", default=None, dest='device',
parser.add_argument("-d", "--device", default=None, dest='device',
help='PCI device id (Bus << 16) | (Dev << 8) | Func')
parser.add_argument("cmd", default=False, nargs='+', choices=cmds.keys(),
help='The command to execute')
parser.add_argument("-p, --gdb-port", type=auto_int, required=False, dest='gdb_port', default=3000,
parser.add_argument("-p", "--gdb-port", type=auto_int, required=False, dest='gdb_port', default=3000,
help='Define the listening port for GDB sessions.')
args = parser.parse_args()
......@@ -737,11 +741,10 @@ def main():
if args.bus == "pci":
if args.device is None:
raise Exception("--device required for PCI")
bar = 0
mt_desc = PyUAL.PyUALPCI(int(args.device, 16), 4, 0, 0x10000,
args.offset, 0)
elif args.bus == "vme":
mt_desc = PyUAL.PyUALVME(4, 0x39, 0x80000, args.offset, 1)
mt_desc = PyUAL.PyUALVME(4, 0x39, 0x10000, args.offset, 1)
else:
raise Exception("Invalid bus")
......@@ -750,7 +753,7 @@ def main():
for cmd in args.cmd:
cmds[cmd](csr)
except Exception as e:
print("Failed! {:s}".format(str(e)))
print("Failed! {}".format(str(e)))
if __name__ == "__main__":
main()
......@@ -40,7 +40,7 @@ static int protocol;
static void help()
{
fprintf(stderr, "\n");
fprintf(stderr, "mockturtle-messages -D 0x<hex-number> -i <number> [options]\n\n");
fprintf(stderr, "mockturtle-messages [options]\n\n");
fprintf(stderr, "It dumps all messages from a given set of Mock-Turtle slots\n\n");
fprintf(stderr, "-q message queue selection string\n\t0x<devid>,<cpu>,<hmq>,<n>\n");
fprintf(stderr, "-t print message timestamp\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment