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
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to