Do not apply this until you fix the problem noted below. Thanks,
Zach On Wed, 2009-12-02 at 14:38 +0100, Øyvind Harboe wrote: > Fix 'regression' where jtag_add_dr_out() is no longer inlined > after refactoring. > > The minidrivers strip away all the overhead and allow inner loops > to communicate directly with a hardware FIFO. > > Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com> > --- > src/jtag/Makefile.am | 2 - > src/jtag/core.c | 14 --------- > src/jtag/driver.c | 10 +++++++ > src/jtag/jtag.h | 37 +++---------------------- > src/jtag/minidriver.h | 67 ++++++++++++++++++++++++++++++++++++++------- > src/jtag/zy1000/zy1000.c | 3 +- > 6 files changed, 73 insertions(+), 60 deletions(-) > > diff --git a/src/jtag/Makefile.am b/src/jtag/Makefile.am > index 5254a2b..c762300 100644 > --- a/src/jtag/Makefile.am > +++ b/src/jtag/Makefile.am > @@ -11,11 +11,9 @@ if MINIDRIVER > > if ZY1000 > DRIVERFILES += zy1000/zy1000.c > -AM_CPPFLAGS += -I$(srcdir)/zy1000 > endif > if MINIDRIVER_DUMMY > DRIVERFILES += minidummy/minidummy.c commands.c > -AM_CPPFLAGS += -I$(srcdir)/minidummy > endif > > else > diff --git a/src/jtag/core.c b/src/jtag/core.c > index 9230cc2..cf14394 100644 > --- a/src/jtag/core.c > +++ b/src/jtag/core.c > @@ -502,20 +502,6 @@ void jtag_add_plain_dr_scan(int in_num_fields, const > struct scan_field *in_field > jtag_set_error(retval); > } > > -void jtag_add_dr_out(struct jtag_tap* tap, > - int num_fields, const int* num_bits, const uint32_t* value, > - tap_state_t end_state) > -{ > - assert(end_state != TAP_RESET); > - assert(end_state != TAP_INVALID); > - > - cmd_queue_cur_state = end_state; > - > - interface_jtag_add_dr_out(tap, > - num_fields, num_bits, value, > - end_state); > -} > - > void jtag_add_tlr(void) > { > jtag_prelude(TAP_RESET); > diff --git a/src/jtag/driver.c b/src/jtag/driver.c > index cadd88e..fe56369 100644 > --- a/src/jtag/driver.c > +++ b/src/jtag/driver.c > @@ -525,3 +525,13 @@ void interface_jtag_add_callback(jtag_callback1_t > callback, jtag_callback_data_t > jtag_add_callback4(jtag_convert_to_callback4, data0, > (jtag_callback_data_t)callback, 0, 0); > } > > +void interface_jtag_alloc_in_value32(struct scan_field *field) > +{ > + field->in_value = (uint8_t *)cmd_queue_alloc(4); > +} > + > +void interface_jtag_add_scan_check_alloc(struct scan_field *field) > +{ > + unsigned num_bytes = DIV_ROUND_UP(field->num_bits, 8); > + field->in_value = (uint8_t *)cmd_queue_alloc(num_bytes); > +} > diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h > index ee96775..4b0e8b2 100644 > --- a/src/jtag/jtag.h > +++ b/src/jtag/jtag.h > @@ -2,7 +2,7 @@ > * Copyright (C) 2005 by Dominic Rath * > * dominic.r...@gmx.de * > * * > -* Copyright (C) 2007,2008 Øyvind Harboe * > +* Copyright (C) 2007-2009 Øyvind Harboe * > * oyvind.har...@zylin.com * > * * > * This program is free software; you can redistribute it and/or modify * > @@ -663,37 +663,6 @@ void jtag_sleep(uint32_t us); > #define ERROR_JTAG_INIT_SOFT_FAIL (-110) > > /** > - * jtag_add_dr_out() is a version of jtag_add_dr_scan() which > - * only scans data out. It operates on 32 bit integers instead > - * of 8 bit, which makes it a better impedance match with > - * the calling code which often operate on 32 bit integers. > - * > - * Current or end_state can not be TAP_RESET. end_state can be TAP_INVALID > - * > - * num_bits[i] is the number of bits to clock out from value[i] LSB first. > - * > - * If the device is in bypass, then that is an error condition in > - * the caller code that is not detected by this fn, whereas > - * jtag_add_dr_scan() does detect it. Similarly if the device is not in > - * bypass, data must be passed to it. > - * > - * If anything fails, then jtag_error will be set and jtag_execute() will > - * return an error. There is no way to determine if there was a failure > - * during this function call. > - * > - * This is an inline fn to speed up embedded hosts. Also note that > - * interface_jtag_add_dr_out() can be a *small* inline function for > - * embedded hosts. > - * > - * There is no jtag_add_dr_outin() version of this fn that also allows > - * clocking data back in. Patches gladly accepted! > - */ > -void jtag_add_dr_out(struct jtag_tap* tap, > - int num_fields, const int* num_bits, const uint32_t* value, > - tap_state_t end_state); > - > - > -/** > * Set the current JTAG core execution error, unless one was set > * by a previous call previously. Driver or application code must > * use jtag_error_clear to reset jtag_error once this routine has been > @@ -725,4 +694,8 @@ bool jtag_poll_get_enabled(void); > */ > void jtag_poll_set_enabled(bool value); > > + > +/* The minidriver contains inline versions of JTAG fn's */ > +#include "minidriver.h" > + This is bad, as you are creating a new layering violation that will need to be removed. You should move this #include to somewhere other than what should be our public API, probably inside the C files that need it. Presently, this change exposes _more_ internals, not less. > #endif /* JTAG_H */ > diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h > index 392a190..7c8dcd7 100644 > --- a/src/jtag/minidriver.h > +++ b/src/jtag/minidriver.h > @@ -46,7 +46,14 @@ > > #ifdef HAVE_JTAG_MINIDRIVER_H > > -#include "jtag_minidriver.h" > +#if BUILD_ZY1000 > +#include "zy1000/jtag_minidriver.h" > +#endif > + > +#if BUILD_MINIDRIVER_DUMMY > +#include "minidummy/jtag_minidriver.h" > +#endif > + > > static inline void interface_jtag_alloc_in_value32(struct scan_field *field) > { > @@ -70,16 +77,8 @@ static inline void > interface_jtag_add_scan_check_alloc(struct scan_field *field) > > #include "commands.h" > > -static inline void interface_jtag_alloc_in_value32(struct scan_field *field) > -{ > - field->in_value = (uint8_t *)cmd_queue_alloc(4); > -} > - > -static inline void interface_jtag_add_scan_check_alloc(struct scan_field > *field) > -{ > - unsigned num_bytes = DIV_ROUND_UP(field->num_bits, 8); > - field->in_value = (uint8_t *)cmd_queue_alloc(num_bytes); > -} > +void interface_jtag_alloc_in_value32(struct scan_field *field); > +void interface_jtag_add_scan_check_alloc(struct scan_field *field); > > void interface_jtag_add_dr_out(struct jtag_tap* tap, > int num_fields, const int* num_bits, const uint32_t* value, > @@ -130,4 +129,50 @@ int interface_jtag_execute_queue(void); > */ > int default_interface_jtag_execute_queue(void); > > +/** > + * jtag_add_dr_out() is a version of jtag_add_dr_scan() which > + * only scans data out. It operates on 32 bit integers instead > + * of 8 bit, which makes it a better impedance match with > + * the calling code which often operate on 32 bit integers. > + * > + * Current or end_state can not be TAP_RESET. end_state can be TAP_INVALID > + * > + * num_bits[i] is the number of bits to clock out from value[i] LSB first. > + * > + * If the device is in bypass, then that is an error condition in > + * the caller code that is not detected by this fn, whereas > + * jtag_add_dr_scan() does detect it. Similarly if the device is not in > + * bypass, data must be passed to it. > + * > + * If anything fails, then jtag_error will be set and jtag_execute() will > + * return an error. There is no way to determine if there was a failure > + * during this function call. > + * > + * This is an inline fn to speed up embedded hosts. Also note that > + * interface_jtag_add_dr_out() can be a *small* inline function for > + * embedded hosts. > + * > + * There is no jtag_add_dr_outin() version of this fn that also allows > + * clocking data back in. Patches gladly accepted! > + */ > + > + > +/* NB!!!! this must be inline in order to allow interface_jtag_add_dr_out() > + * to be inlined! > + */ > +static __inline__ void jtag_add_dr_out(struct jtag_tap* tap, > + int num_fields, const int* num_bits, const uint32_t* value, > + tap_state_t end_state) > +{ > + assert(end_state != TAP_RESET); > + assert(end_state != TAP_INVALID); > + > + cmd_queue_cur_state = end_state; > + > + interface_jtag_add_dr_out(tap, > + num_fields, num_bits, value, > + end_state); > +} > + > + > #endif // MINIDRIVER_H > diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c > index 07d840f..c3c93ac 100644 > --- a/src/jtag/zy1000/zy1000.c > +++ b/src/jtag/zy1000/zy1000.c > @@ -20,9 +20,10 @@ > #include "config.h" > #endif > > -#include "embeddedice.h" > +#include "arm7_9_common.h" > #include "minidriver.h" > #include "interface.h" > +#include "embeddedice.h" > #include "zy1000_version.h" > > #include <cyg/hal/hal_io.h> // low level i/o > -- > 1.6.3.3 > > _______________________________________________ > Openocd-development mailing list > Openocd-development@lists.berlios.de > https://lists.berlios.de/mailman/listinfo/openocd-development _______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development