This is the first batch of USB performance regression
fixes.
This patch uses the new jtag_add_callback() scheme to perform
postprocessing later on so bigger scans can be performed.
Although this is posted as one big patch, I intend to split
it up a bit so as to allow better bisection possibilities
(banish the thought that it should be necessary!).
Next steps:
- commit attached patch after some more testing
- allow a day or two to wait for fallout
- fix problems with synchronous jtag_check_value_mask()
which reduces performance on USB interfaces
- done! performance regressions fixed + new post
processing scheme complete.
--
Øyvind Harboe
Embedded software and hardware consulting services
http://consulting.zylin.com
### Eclipse Workspace Patch 1.0
#P openocd
Index: src/target/arm_jtag.h
===================================================================
--- src/target/arm_jtag.h (revision 1690)
+++ src/target/arm_jtag.h (working copy)
@@ -57,5 +57,18 @@
int arm_jtag_buf_to_be16(u8 *in_buf, void *priv, struct scan_field_s *field);
int arm_jtag_buf_to_8(u8 *in_buf, void *priv, struct scan_field_s *field);
+
+/* use this as a static so we can inline it in -O3 and refer to it via a
pointer */
+static __inline__ void arm7flip32(u8 *in)
+{
+ *((u32 *)in)=flip_u32(le_to_h_u32(in), 32);
+}
+
+static __inline__ void arm_le_to_h_u32(u8 *in)
+{
+ *((u32 *)in)=le_to_h_u32(in);
+}
+
+
#endif /* ARM_JTAG */
Index: src/target/arm720t.c
===================================================================
--- src/target/arm720t.c (revision 1690)
+++ src/target/arm720t.c (working copy)
@@ -121,10 +121,9 @@
if (in)
{
- u8 tmp[4];
- fields[1].in_value = tmp;
- jtag_add_dr_scan_now(2, fields, TAP_INVALID);
- *in=flip_u32(le_to_h_u32(tmp), 32);
+ fields[1].in_value = (u8 *)in;
+ jtag_add_dr_scan(2, fields, TAP_INVALID);
+ jtag_add_callback(arm7flip32, (u8 *)in);
} else
{
jtag_add_dr_scan(2, fields, TAP_INVALID);
Index: src/target/arm_adi_v5.c
===================================================================
--- src/target/arm_adi_v5.c (revision 1693)
+++ src/target/arm_adi_v5.c (working copy)
@@ -126,11 +126,10 @@
if (invalue)
{
- u8 tmp[4];
- fields[1].in_value = tmp;
- jtag_add_dr_scan_now(2, fields, TAP_INVALID);
+ fields[1].in_value = (u8 *)invalue;
+ jtag_add_dr_scan(2, fields, TAP_INVALID);
- *invalue=le_to_h_u32(tmp);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)invalue);
} else
{
Index: src/target/xscale.c
===================================================================
--- src/target/xscale.c (revision 1694)
+++ src/target/xscale.c (working copy)
@@ -270,7 +270,7 @@
fields[1].num_bits = 32;
fields[1].out_value = NULL;
fields[1].in_value = xscale->reg_cache->reg_list[XSCALE_DCSR].value;
-
+
fields[2].tap = xscale->jtag_info.tap;
fields[2].num_bits = 1;
@@ -308,6 +308,12 @@
return jtag_execute_queue();
}
+
+static void xscale_getbuf(u8 *in)
+{
+ *((u32 *)in)=buf_get_u32(in, 0, 32);
+}
+
int xscale_receive(target_t *target, u32 *buffer, int num_words)
{
if (num_words==0)
@@ -344,9 +350,7 @@
fields[1].tap = xscale->jtag_info.tap;
fields[1].num_bits = 32;
fields[1].out_value = NULL;
- u8 tmp[4];
- fields[1].in_value = tmp;
-
+
fields[2].tap = xscale->jtag_info.tap;
fields[2].num_bits = 1;
@@ -369,13 +373,15 @@
fields[0].in_value = &field0[i];
jtag_add_pathmove(3, path);
- jtag_add_dr_scan_now(3, fields, TAP_IDLE);
+
+ fields[1].in_value = (u8 *)(field1+i);
+ jtag_add_dr_scan(3, fields, TAP_IDLE);
+
+ jtag_add_callback(xscale_getbuf, (u8 *)(field1+i));
jtag_check_value_mask(fields+0, &field0_check_value,
&field0_check_mask);
jtag_check_value_mask(fields+2, &field2_check_value,
&field2_check_mask);
- field1[i]=buf_get_u32(tmp, 0, 32);
-
words_scheduled++;
}
@@ -462,7 +468,7 @@
fields[1].num_bits = 32;
fields[1].out_value = NULL;
fields[1].in_value = xscale->reg_cache->reg_list[XSCALE_TX].value;
-
+
fields[2].tap = xscale->jtag_info.tap;
fields[2].num_bits = 1;
@@ -554,7 +560,7 @@
fields[1].num_bits = 32;
fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_RX].value;
fields[1].in_value = NULL;
-
+
fields[2].tap = xscale->jtag_info.tap;
fields[2].num_bits = 1;
@@ -726,7 +732,7 @@
fields[1].num_bits = 32;
fields[1].out_value = xscale->reg_cache->reg_list[XSCALE_DCSR].value;
fields[1].in_value = NULL;
-
+
fields[2].tap = xscale->jtag_info.tap;
fields[2].num_bits = 1;
@@ -796,7 +802,7 @@
fields[0].in_value = NULL;
-
+
fields[1].tap = xscale->jtag_info.tap;
@@ -806,7 +812,7 @@
fields[1].in_value = NULL;
-
+
jtag_add_dr_scan(2, fields, TAP_INVALID);
@@ -858,7 +864,7 @@
fields[0].in_value = NULL;
-
+
fields[1].tap = xscale->jtag_info.tap;
@@ -868,7 +874,7 @@
fields[1].in_value = NULL;
-
+
jtag_add_dr_scan(2, fields, TAP_INVALID);
Index: src/target/etb.c
===================================================================
--- src/target/etb.c (revision 1690)
+++ src/target/etb.c (working copy)
@@ -168,6 +168,13 @@
return ERROR_OK;
}
+
+static void etb_getbuf(u8 *in)
+{
+ *((u32 *)in)=buf_get_u32(in, 0, 32);
+}
+
+
static int etb_read_ram(etb_t *etb, u32 *data, int num_frames)
{
scan_field_t fields[3];
@@ -180,8 +187,6 @@
fields[0].tap = etb->tap;
fields[0].num_bits = 32;
fields[0].out_value = NULL;
- u8 tmp[4];
- fields[0].in_value = tmp;
fields[1].tap = etb->tap;
fields[1].num_bits = 7;
@@ -208,9 +213,10 @@
else
buf_set_u32(fields[1].out_value, 0, 7, 0);
- jtag_add_dr_scan_now(3, fields, TAP_INVALID);
+ fields[0].in_value = (u8 *)(data+i);
+ jtag_add_dr_scan(3, fields, TAP_INVALID);
- data[i]=buf_get_u32(tmp, 0, 32);
+ jtag_add_callback(etb_getbuf, (u8 *)(data+i));
}
jtag_execute_queue();
Index: src/target/arm9tdmi.c
===================================================================
--- src/target/arm9tdmi.c (revision 1690)
+++ src/target/arm9tdmi.c (working copy)
@@ -215,11 +215,10 @@
if (in)
{
- u8 tmp[4];
- fields[0].in_value=tmp;
- jtag_add_dr_scan_now(3, fields, TAP_INVALID);
+ fields[0].in_value=(u8 *)in;
+ jtag_add_dr_scan(3, fields, TAP_INVALID);
- *in=le_to_h_u32(tmp);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)in);
}
else
{
@@ -264,8 +263,7 @@
fields[0].tap = jtag_info->tap;
fields[0].num_bits = 32;
fields[0].out_value = NULL;
- u8 tmp[4];
- fields[0].in_value = tmp;
+ fields[0].in_value = (u8 *)in;
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 3;
@@ -277,9 +275,9 @@
fields[2].out_value = NULL;
fields[2].in_value = NULL;
- jtag_add_dr_scan_now(3, fields, TAP_INVALID);
+ jtag_add_dr_scan(3, fields, TAP_INVALID);
- *in=le_to_h_u32(tmp);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)in);
jtag_add_runtest(0, TAP_INVALID);
@@ -306,6 +304,12 @@
extern void arm_endianness(u8 *tmp, void *in, int size, int be, int flip);
+static int arm9endianness(u8 *in, jtag_callback_data_t size,
jtag_callback_data_t be)
+{
+ arm_endianness(in, in, (int)size, (int)be, 0);
+ return ERROR_OK;
+}
+
/* clock the target, and read the databus
* the *in pointer points to a buffer where elements of 'size' bytes
* are stored in big (be==1) or little (be==0) endianness
@@ -326,8 +330,7 @@
fields[0].tap = jtag_info->tap;
fields[0].num_bits = 32;
fields[0].out_value = NULL;
- u8 tmp[4];
- fields[0].in_value = tmp;
+ fields[0].in_value = (u8 *)in;
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 3;
@@ -339,10 +342,9 @@
fields[2].out_value = NULL;
fields[2].in_value = NULL;
- jtag_add_dr_scan_now(3, fields, TAP_INVALID);
+ jtag_add_dr_scan(3, fields, TAP_INVALID);
- arm_endianness(tmp, in, size, be, 0);
-
+ jtag_add_callback3(arm9endianness, in, (jtag_callback_data_t)size,
(jtag_callback_data_t)be);
jtag_add_runtest(0, TAP_INVALID);
Index: src/target/embeddedice.c
===================================================================
--- src/target/embeddedice.c (revision 1690)
+++ src/target/embeddedice.c (working copy)
@@ -252,21 +252,21 @@
fields[0].num_bits = 32;
fields[0].out_value = reg->value;
fields[0].in_value = NULL;
-
+
fields[1].tap = ice_reg->jtag_info->tap;
fields[1].num_bits = 5;
fields[1].out_value = field1_out;
buf_set_u32(fields[1].out_value, 0, 5, reg_addr);
fields[1].in_value = NULL;
-
+
fields[2].tap = ice_reg->jtag_info->tap;
fields[2].num_bits = 1;
fields[2].out_value = field2_out;
buf_set_u32(fields[2].out_value, 0, 1, 0);
fields[2].in_value = NULL;
-
+
jtag_add_dr_scan(3, fields, TAP_INVALID);
@@ -302,23 +302,21 @@
fields[0].tap = jtag_info->tap;
fields[0].num_bits = 32;
fields[0].out_value = NULL;
- u8 tmp[4];
- fields[0].in_value = tmp;
-
+
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 5;
fields[1].out_value = field1_out;
buf_set_u32(fields[1].out_value, 0, 5,
embeddedice_reg_arch_info[EICE_COMMS_DATA]);
fields[1].in_value = NULL;
-
+
fields[2].tap = jtag_info->tap;
fields[2].num_bits = 1;
fields[2].out_value = field2_out;
buf_set_u32(fields[2].out_value, 0, 1, 0);
fields[2].in_value = NULL;
-
+
jtag_add_dr_scan(3, fields, TAP_INVALID);
@@ -330,9 +328,9 @@
if (size == 1)
buf_set_u32(fields[1].out_value, 0, 5,
embeddedice_reg_arch_info[EICE_COMMS_CTRL]);
- jtag_add_dr_scan_now(3, fields, TAP_INVALID);
-
- *data = le_to_h_u32(tmp);
+ fields[0].in_value = (u8 *)data;
+ jtag_add_dr_scan(3, fields, TAP_INVALID);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)data);
data++;
size--;
@@ -412,7 +410,7 @@
fields[0].in_value = NULL;
-
+
fields[1].tap = jtag_info->tap;
@@ -423,7 +421,7 @@
fields[1].in_value = NULL;
-
+
fields[2].tap = jtag_info->tap;
@@ -434,7 +432,7 @@
fields[2].in_value = NULL;
-
+
while (size > 0)
@@ -481,7 +479,7 @@
fields[0].in_value = field0_in;
-
+
fields[1].tap = jtag_info->tap;
@@ -492,7 +490,7 @@
fields[1].in_value = NULL;
-
+
fields[2].tap = jtag_info->tap;
@@ -503,7 +501,7 @@
fields[2].in_value = NULL;
-
+
jtag_add_dr_scan(3, fields, TAP_INVALID);
Index: src/target/arm920t.c
===================================================================
--- src/target/arm920t.c (revision 1690)
+++ src/target/arm920t.c (working copy)
@@ -132,12 +132,11 @@
jtag_add_dr_scan(4, fields, TAP_INVALID);
- u8 tmp[4];
- fields[1].in_value = tmp;
+ fields[1].in_value = (u8 *)value;
- jtag_add_dr_scan_now(4, fields, TAP_INVALID);
+ jtag_add_dr_scan(4, fields, TAP_INVALID);
- *value=le_to_h_u32(tmp);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)value);
#ifdef _DEBUG_INSTRUCTION_EXECUTION_
jtag_execute_queue();
Index: src/target/arm7tdmi.c
===================================================================
--- src/target/arm7tdmi.c (revision 1693)
+++ src/target/arm7tdmi.c (working copy)
@@ -196,15 +196,11 @@
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 32;
fields[1].out_value = NULL;
- u8 tmp[4];
- fields[1].in_value = tmp;
+ fields[1].in_value = (u8 *)in;
- jtag_add_dr_scan_now(2, fields, TAP_INVALID);
+ jtag_add_dr_scan(2, fields, TAP_INVALID);
- if (jtag_error==ERROR_OK)
- {
- *in=flip_u32(le_to_h_u32(tmp), 32);
- }
+ jtag_add_callback(arm7flip32, (u8 *)in);
jtag_add_runtest(0, TAP_INVALID);
@@ -258,7 +254,12 @@
*((u8 *)in)= readback & 0xff;
break;
}
+}
+static int arm7endianness(u8 *in, jtag_callback_data_t size,
jtag_callback_data_t be)
+{
+ arm_endianness(in, in, (int)size, (int)be, 1);
+ return ERROR_OK;
}
/* clock the target, and read the databus
@@ -285,12 +286,11 @@
fields[1].tap = jtag_info->tap;
fields[1].num_bits = 32;
fields[1].out_value = NULL;
- u8 tmp[4];
- fields[1].in_value = tmp;
+ fields[1].in_value = (u8 *)in;
- jtag_add_dr_scan_now(2, fields, TAP_INVALID);
+ jtag_add_dr_scan(2, fields, TAP_INVALID);
- arm_endianness(tmp, in, size, be, 1);
+ jtag_add_callback3(arm7endianness, in, (jtag_callback_data_t)size,
(jtag_callback_data_t)be);
jtag_add_runtest(0, TAP_INVALID);
Index: src/target/arm926ejs.c
===================================================================
--- src/target/arm926ejs.c (revision 1690)
+++ src/target/arm926ejs.c (working copy)
@@ -142,8 +142,7 @@
fields[0].tap = jtag_info->tap;
fields[0].num_bits = 32;
fields[0].out_value = NULL;
- u8 tmp[4];
- fields[0].in_value = tmp;
+ fields[0].in_value = (u8 *)value;
fields[1].tap = jtag_info->tap;
@@ -169,9 +168,9 @@
/* rescan with NOP, to wait for the access to complete */
access = 0;
nr_w_buf = 0;
- jtag_add_dr_scan_now(4, fields, TAP_INVALID);
+ jtag_add_dr_scan(4, fields, TAP_INVALID);
- *value=le_to_h_u32(tmp);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)value);
if ((retval = jtag_execute_queue()) != ERROR_OK)
{
Index: src/target/arm966e.c
===================================================================
--- src/target/arm966e.c (revision 1690)
+++ src/target/arm966e.c (working copy)
@@ -201,12 +201,11 @@
jtag_add_dr_scan(3, fields, TAP_INVALID);
- u8 tmp[4];
- fields[1].in_value = tmp;
+ fields[1].in_value = (u8 *)value;
- jtag_add_dr_scan_now(3, fields, TAP_INVALID);
+ jtag_add_dr_scan(3, fields, TAP_INVALID);
- *value=le_to_h_u32(tmp);
+ jtag_add_callback(arm_le_to_h_u32, (u8 *)value);
#ifdef _DEBUG_INSTRUCTION_EXECUTION_
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development