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