Dear Wolfgang, On Sat, 2014-02-22 at 09:42 +0100, ZY - wd wrote: > Dear Chin Liang See, > > In message <1393022790-9296-1-git-send-email-cl...@altera.com> you wrote: > > Scan Manager driver will be called to configure the IOCSR > > scan chain. This configuration will setup the IO buffer settings > > > > Signed-off-by: Chin Liang See <cl...@altera.com> > > Cc: Dinh Nguyen <dingu...@altera.com> > > Cc: Wolfgang Denk <w...@denx.de> > > CC: Pavel Machek <pa...@denx.de> > > Cc: Tom Rini <tr...@ti.com> > > Cc: Albert Aribaud <albert.u.b...@aribaud.net> > > --- > > Changes for v5 > > - Removal of additional blank line > > - Added comment for magic number > > Changes for v4 > > - avoid code duplication by add goto error > > - include underscore to variables name > > Changes for v3 > > - merge the handoff file and driver into single patch > > Changes for v2 > > - rebase with latest v2014.01-rc1 > > --- > > arch/arm/cpu/armv7/socfpga/Makefile | 2 +- > > arch/arm/cpu/armv7/socfpga/scan_manager.c | 214 +++++++ > > arch/arm/cpu/armv7/socfpga/spl.c | 4 + > > arch/arm/include/asm/arch-socfpga/scan_manager.h | 96 +++ > > .../include/asm/arch-socfpga/socfpga_base_addrs.h | 1 + > > board/altera/socfpga/iocsr_config.c | 657 > > ++++++++++++++++++++ > > board/altera/socfpga/iocsr_config.h | 17 + > > include/configs/socfpga_cyclone5.h | 1 + > > 8 files changed, 991 insertions(+), 1 deletion(-) > > create mode 100644 arch/arm/cpu/armv7/socfpga/scan_manager.c > > create mode 100644 arch/arm/include/asm/arch-socfpga/scan_manager.h > > create mode 100644 board/altera/socfpga/iocsr_config.c > > create mode 100644 board/altera/socfpga/iocsr_config.h > > > > diff --git a/arch/arm/cpu/armv7/socfpga/Makefile > > b/arch/arm/cpu/armv7/socfpga/Makefile > > index 3e84a0c..4edc5d4 100644 > > --- a/arch/arm/cpu/armv7/socfpga/Makefile > > +++ b/arch/arm/cpu/armv7/socfpga/Makefile > > @@ -9,4 +9,4 @@ > > > > obj-y := lowlevel_init.o > > obj-y += misc.o timer.o reset_manager.o system_manager.o > > -obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o > > +obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o scan_manager.o > > diff --git a/arch/arm/cpu/armv7/socfpga/scan_manager.c > > b/arch/arm/cpu/armv7/socfpga/scan_manager.c > > new file mode 100644 > > index 0000000..6e6f372 > > --- /dev/null > > +++ b/arch/arm/cpu/armv7/socfpga/scan_manager.c > > @@ -0,0 +1,214 @@ > > +/* > > + * Copyright (C) 2013 Altera Corporation <www.altera.com> > > + * > > + * SPDX-License-Identifier: GPL-2.0+ > > + */ > > + > > +#include <common.h> > > +#include <asm/io.h> > > +#include <asm/arch/freeze_controller.h> > > +#include <asm/arch/scan_manager.h> > > + > > +DECLARE_GLOBAL_DATA_PTR; > > + > > +static const struct socfpga_scan_manager *scan_manager_base = > > + (void *)(SOCFPGA_SCANMGR_ADDRESS); > > +static const struct socfpga_freeze_controller *freeze_controller_base = > > + (void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS); > > + > > +/* > > + * Function to check IO scan chain engine status and wait if the engine is > > + * is active. Poll the IO scan chain engine till maximum iteration reached. > > + */ > > +static inline uint32_t scan_mgr_io_scan_chain_engine_is_idle(uint32_t > > max_iter) > > +{ > > + uint32_t scanmgr_status; > > + > > + scanmgr_status = readl(&scan_manager_base->stat); > > + > > + /* Poll the engine until the scan engine is inactive */ > > + while (SCANMGR_STAT_ACTIVE_GET(scanmgr_status) > > + || (SCANMGR_STAT_WFIFOCNT_GET(scanmgr_status) > 0)) { > > + max_iter--; > > This is difficult to read due to unlucky indentation. I suggest to > rewrite like this: > > > while (SCANMGR_STAT_ACTIVE_GET(scanmgr_status) || > (SCANMGR_STAT_WFIFOCNT_GET(scanmgr_status) > 0)) { > > or even > > while (SCANMGR_STAT_ACTIVE_GET(scanmgr_status) || > (SCANMGR_STAT_WFIFOCNT_GET(scanmgr_status) > 0) > ) { >
Fixed > > + scanmgr_status = readl(&scan_manager_base->stat); > > + else > > + return SCAN_MGR_IO_SCAN_ENGINE_STATUS_ACTIVE; > > + } > > + return SCAN_MGR_IO_SCAN_ENGINE_STATUS_IDLE; > > +} > > You decrement the parameter "max_iter" in the loop - I guess this was > intended to make sure this is not an endless loop. But there is no > test anywhere for it becoming 0 or so - which makes the parameter > unused. I guess this needs fixing? Actually this is checked at later line of code where the function will exit if max_iter equal to zero or less. > > > + if (SCAN_MGR_IO_SCAN_ENGINE_STATUS_IDLE > > + != scan_mgr_io_scan_chain_engine_is_idle( > > + MAX_WAITING_DELAY_IO_SCAN_ENGINE)) > > + return 1; > > See above. This is not readable. > > Blame yourself that you have such problems - why do you cose so long > identifiers as "SCAN_MGR_IO_SCAN_ENGINE_STATUS_IDLE" or > "scan_mgr_io_scan_chain_engine_is_idle" - when you cannot put two > names on a single line without breaking the 80 character limit, you > are doing something wrong. Actually the variables are generated by tools. But I agree that it create unnecessary length which make the code hard to read. With that, I fixed all these variables. > > > + if (SCAN_MGR_IO_SCAN_ENGINE_STATUS_IDLE > > + != scan_mgr_io_scan_chain_engine_is_idle( > > + MAX_WAITING_DELAY_IO_SCAN_ENGINE)) > > + goto error; > > Same here. Fix the indentation. > > Even better, fix these unwieldy names. Fixed > > > + /* Final TDI_TDO packet if any */ > > + if (0 != io_scan_chain_data_residual) { > > Actually I would prefer if you wrote all this in the natural order, > i. e. as > > if (io_scan_chain_data_residual != 0) > > With != it's just a nuisance, but with < or > it requires the reader > to think backwards which makes the code hard to read and increases the > error rate. Fixed by simplifying it to if (io_scan_chain_data_residual) > > > + tdi_tdo_header = TDI_TDO_HEADER_FIRST_BYTE | > > + ((io_scan_chain_data_residual - 1) > > + << TDI_TDO_HEADER_SECOND_BYTE_SHIFT); > > Again, this is hard to read. Please fix globally. Do not start a new > line with an operation - put this in the previous line where it serves > as a mark that the line will need a continuation. Fixed > > > + for (i = 0; i < io_program_iter; i++) > > + /* > > + * write remaining scan chain data into scan > > + * manager WFIFO with 4 bytes write > > + */ > > + writel(iocsr_scan_chain[index + i], > > + &scan_manager_base->fifo_quad_byte); > > Incorrect multiline comment style, fix the last line. Fixed > > Second, even if checkpatch lats this pass, we don't. This is a > multi-line statement (even without the comment), and as such it > requires braces. Yup, good to note this. Fixed > > > + if (IO_SCAN_CHAIN_PAYLOAD_24BIT < residual) > > + /* > > + * write the last 4B scan chain data > > + * into scan manager WFIFO > > + */ > > + writel(iocsr_scan_chain[index], > > + &scan_manager_base->fifo_quad_byte); > > + else { > > Braces needed - first because it is multiline, second because the esle > branch has braces. Fixed > > > + for (i = 0; i < residual; i += 8) > > + writel(((iocsr_scan_chain[index] >> i) > > + & IO_SCAN_CHAIN_BYTE_MASK), > > + &scan_manager_base->fifo_single_byte); > > Braces needed. Fixed > > > + if (SCAN_MGR_IO_SCAN_ENGINE_STATUS_IDLE > > + != scan_mgr_io_scan_chain_engine_is_idle( > > + MAX_WAITING_DELAY_IO_SCAN_ENGINE)) > > + goto error; > > fix indentation., Fixed > > > > +#define IO_SCAN_CHAIN_128BIT_SHIFT (7) > > Remove parens around simple values - please fix globally. Good to know this. Fixed > > > +++ b/board/altera/socfpga/iocsr_config.h > > @@ -0,0 +1,17 @@ > > +/* > > + * Copyright Altera Corporation (C) 2012-2014. All rights reserved > > + * > > + * SPDX-License-Identifier: BSD-3-Clause > > Why is this not under GPL? New code that gets added to U-Boot shall > be GPL-2.0+ Actually this is tools generated which will be consumed by non GPL software too. This file doesn't contain any source but just array with values. Hope this is ok. > > > Best regards, > > Wolfgang Denk > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot