1 /* SPDX-License-Identifier: GPL-2.0-or-later */
4 * Copyright (C) 2015 by Esben Haabendal <eha@deif.com>
12 #include "target_type.h"
14 #include <jtag/jtag.h>
20 static int ls1_sap_target_create(struct target
*target
, Jim_Interp
*interp
)
22 struct ls1_sap
*ls1_sap
= calloc(1, sizeof(struct ls1_sap
));
24 ls1_sap
->tap
= target
->tap
;
25 target
->arch_info
= ls1_sap
;
30 static int ls1_sap_init_target(struct command_context
*cmd_ctx
, struct target
*target
)
32 LOG_DEBUG("%s", __func__
);
36 static int ls1_sap_arch_state(struct target
*target
)
38 LOG_DEBUG("%s", __func__
);
42 static int ls1_sap_poll(struct target
*target
)
44 if ((target
->state
== TARGET_UNKNOWN
) ||
45 (target
->state
== TARGET_RUNNING
) ||
46 (target
->state
== TARGET_DEBUG_RUNNING
))
47 target
->state
= TARGET_HALTED
;
52 static int ls1_sap_halt(struct target
*target
)
54 LOG_DEBUG("%s", __func__
);
58 static int ls1_sap_resume(struct target
*target
, int current
, target_addr_t address
,
59 int handle_breakpoints
, int debug_execution
)
61 LOG_DEBUG("%s", __func__
);
65 static int ls1_sap_step(struct target
*target
, int current
, target_addr_t address
,
66 int handle_breakpoints
)
68 LOG_DEBUG("%s", __func__
);
72 static int ls1_sap_assert_reset(struct target
*target
)
74 target
->state
= TARGET_RESET
;
76 LOG_DEBUG("%s", __func__
);
80 static int ls1_sap_deassert_reset(struct target
*target
)
82 target
->state
= TARGET_RUNNING
;
84 LOG_DEBUG("%s", __func__
);
88 static void ls1_sap_set_instr(struct jtag_tap
*tap
, uint32_t new_instr
)
90 struct scan_field field
;
92 if (buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
) == new_instr
)
95 field
.num_bits
= tap
->ir_length
;
96 uint8_t *t
= calloc(DIV_ROUND_UP(field
.num_bits
, 8), 1);
98 buf_set_u32(t
, 0, field
.num_bits
, new_instr
);
99 field
.in_value
= NULL
;
100 jtag_add_ir_scan(tap
, &field
, TAP_IDLE
);
104 static void ls1_sap_set_addr_high(struct jtag_tap
*tap
, uint16_t addr_high
)
106 struct scan_field field
;
107 uint8_t buf
[2] = { 0 };
109 ls1_sap_set_instr(tap
, 0x21);
112 field
.out_value
= buf
;
113 buf_set_u32(buf
, 0, 16, addr_high
);
114 field
.in_value
= NULL
;
115 field
.check_value
= NULL
;
116 field
.check_mask
= NULL
;
117 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
120 static void ls1_sap_memory_cmd(struct jtag_tap
*tap
, uint32_t address
,
121 int32_t size
, bool rnw
)
123 struct scan_field field
;
124 uint8_t cmd
[8] = { 0 };
126 ls1_sap_set_instr(tap
, 0x24);
129 field
.out_value
= cmd
;
130 buf_set_u64(cmd
, 0, 9, 0);
131 buf_set_u64(cmd
, 9, 3, size
);
132 buf_set_u64(cmd
, 12, 1, rnw
);
133 buf_set_u64(cmd
, 13, 3, 0);
134 buf_set_u64(cmd
, 16, 32, address
);
135 buf_set_u64(cmd
, 48, 16, 0);
136 field
.in_value
= NULL
;
137 field
.check_value
= NULL
;
138 field
.check_mask
= NULL
;
139 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
142 static void ls1_sap_memory_read(struct jtag_tap
*tap
, uint32_t size
,
145 struct scan_field field
;
147 ls1_sap_set_instr(tap
, 0x25);
149 field
.num_bits
= 8 * size
;
150 field
.out_value
= NULL
;
151 field
.in_value
= value
;
152 field
.check_value
= NULL
;
153 field
.check_mask
= NULL
;
154 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
157 static void ls1_sap_memory_write(struct jtag_tap
*tap
, uint32_t size
,
158 const uint8_t *value
)
160 struct scan_field field
;
162 ls1_sap_set_instr(tap
, 0x25);
164 field
.num_bits
= 8 * size
;
165 field
.out_value
= value
;
166 field
.in_value
= NULL
;
167 field
.check_value
= NULL
;
168 field
.check_mask
= NULL
;
169 jtag_add_dr_scan(tap
, 1, &field
, TAP_IDLE
);
172 static int ls1_sap_read_memory(struct target
*target
, target_addr_t address
,
173 uint32_t size
, uint32_t count
, uint8_t *buffer
)
175 LOG_DEBUG("Reading memory at physical address 0x%" TARGET_PRIxADDR
176 "; size %" PRIu32
"; count %" PRIu32
, address
, size
, count
);
178 if (count
== 0 || !buffer
)
179 return ERROR_COMMAND_SYNTAX_ERROR
;
181 ls1_sap_set_addr_high(target
->tap
, 0);
184 ls1_sap_memory_cmd(target
->tap
, address
, size
, true);
185 ls1_sap_memory_read(target
->tap
, size
, buffer
);
190 return jtag_execute_queue();
193 static int ls1_sap_write_memory(struct target
*target
, target_addr_t address
,
194 uint32_t size
, uint32_t count
,
195 const uint8_t *buffer
)
197 LOG_DEBUG("Writing memory at physical address 0x%" TARGET_PRIxADDR
198 "; size %" PRIu32
"; count %" PRIu32
, address
, size
, count
);
201 if (count
== 0 || !buffer
)
202 return ERROR_COMMAND_SYNTAX_ERROR
;
204 ls1_sap_set_addr_high(target
->tap
, 0);
207 ls1_sap_memory_cmd(target
->tap
, address
, size
, false);
208 ls1_sap_memory_write(target
->tap
, size
, buffer
);
213 return jtag_execute_queue();
216 struct target_type ls1_sap_target
= {
219 .target_create
= ls1_sap_target_create
,
220 .init_target
= ls1_sap_init_target
,
222 .poll
= ls1_sap_poll
,
223 .arch_state
= ls1_sap_arch_state
,
225 .halt
= ls1_sap_halt
,
226 .resume
= ls1_sap_resume
,
227 .step
= ls1_sap_step
,
229 .assert_reset
= ls1_sap_assert_reset
,
230 .deassert_reset
= ls1_sap_deassert_reset
,
232 .read_memory
= ls1_sap_read_memory
,
233 .write_memory
= ls1_sap_write_memory
,