arm: socfpga: scan: Clean up scan_chain_engine_is_idle()
Rework this function so it's clear that it is only polling for certain bits to be cleared. Add kerneldoc. Fix it's return value to be either 0 on success and -ETIMEDOUT on error and propagate this through the scan manager code. Signed-off-by: Marek Vasut <marex@denx.de> Acked-by: Dinh Nguyen <dinguyen@opensource.altera.com>
This commit is contained in:
@@ -59,15 +59,6 @@ struct socfpga_scan_manager {
|
|||||||
/* Position of second command byte for TDI_TDO packet */
|
/* Position of second command byte for TDI_TDO packet */
|
||||||
#define TDI_TDO_HEADER_SECOND_BYTE_SHIFT 8
|
#define TDI_TDO_HEADER_SECOND_BYTE_SHIFT 8
|
||||||
|
|
||||||
/*
|
|
||||||
* Maximum polling loop to wait for IO scan chain engine
|
|
||||||
* becomes idle to prevent infinite loop
|
|
||||||
*/
|
|
||||||
#define SCAN_MAX_DELAY 100
|
|
||||||
|
|
||||||
#define SCANMGR_STAT_ACTIVE_GET(x) (((x) & 0x80000000) >> 31)
|
|
||||||
#define SCANMGR_STAT_WFIFOCNT_GET(x) (((x) & 0x70000000) >> 28)
|
|
||||||
|
|
||||||
int scan_mgr_configure_iocsr(void);
|
int scan_mgr_configure_iocsr(void);
|
||||||
int iocsr_get_config_table(const unsigned int chain_id,
|
int iocsr_get_config_table(const unsigned int chain_id,
|
||||||
const unsigned long **table,
|
const unsigned long **table,
|
||||||
|
@@ -5,10 +5,22 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/arch/freeze_controller.h>
|
#include <asm/arch/freeze_controller.h>
|
||||||
#include <asm/arch/scan_manager.h>
|
#include <asm/arch/scan_manager.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum polling loop to wait for IO scan chain engine becomes idle
|
||||||
|
* to prevent infinite loop. It is important that this is NOT changed
|
||||||
|
* to delay using timer functions, since at the time this function is
|
||||||
|
* called, timer might not yet be inited.
|
||||||
|
*/
|
||||||
|
#define SCANMGR_MAX_DELAY 100
|
||||||
|
|
||||||
|
#define SCANMGR_STAT_ACTIVE (1 << 31)
|
||||||
|
#define SCANMGR_STAT_WFIFOCNT_MASK 0x70000000
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static const struct socfpga_scan_manager *scan_manager_base =
|
static const struct socfpga_scan_manager *scan_manager_base =
|
||||||
@@ -16,26 +28,26 @@ static const struct socfpga_scan_manager *scan_manager_base =
|
|||||||
static const struct socfpga_freeze_controller *freeze_controller_base =
|
static const struct socfpga_freeze_controller *freeze_controller_base =
|
||||||
(void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
|
(void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
|
* scan_chain_engine_is_idle() - Check if the JTAG scan chain is idle
|
||||||
|
* @max_iter: Maximum number of iterations to wait for idle
|
||||||
|
*
|
||||||
* Function to check IO scan chain engine status and wait if the engine is
|
* 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.
|
* is active. Poll the IO scan chain engine till maximum iteration reached.
|
||||||
*/
|
*/
|
||||||
static inline uint32_t scan_chain_engine_is_idle(uint32_t max_iter)
|
static u32 scan_chain_engine_is_idle(u32 max_iter)
|
||||||
{
|
{
|
||||||
uint32_t scanmgr_status;
|
const u32 mask = SCANMGR_STAT_ACTIVE | SCANMGR_STAT_WFIFOCNT_MASK;
|
||||||
|
u32 status;
|
||||||
|
|
||||||
scanmgr_status = readl(&scan_manager_base->stat);
|
/* Poll the engine until the scan engine is inactive. */
|
||||||
|
do {
|
||||||
/* Poll the engine until the scan engine is inactive */
|
status = readl(&scan_manager_base->stat);
|
||||||
while (SCANMGR_STAT_ACTIVE_GET(scanmgr_status) ||
|
if (!(status & mask))
|
||||||
(SCANMGR_STAT_WFIFOCNT_GET(scanmgr_status) > 0)) {
|
|
||||||
max_iter--;
|
|
||||||
if (max_iter > 0)
|
|
||||||
scanmgr_status = readl(&scan_manager_base->stat);
|
|
||||||
else
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
} while (max_iter--);
|
||||||
return 1;
|
|
||||||
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -70,8 +82,9 @@ static int scan_mgr_io_scan_chain_prg(const unsigned int io_scan_chain_id)
|
|||||||
* Check if the scan chain engine is inactive and the
|
* Check if the scan chain engine is inactive and the
|
||||||
* WFIFO is empty before enabling the IO scan chain
|
* WFIFO is empty before enabling the IO scan chain
|
||||||
*/
|
*/
|
||||||
if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
|
ret = scan_chain_engine_is_idle(SCANMGR_MAX_DELAY);
|
||||||
return 1;
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable IO Scan chain based on scan chain id
|
* Enable IO Scan chain based on scan chain id
|
||||||
@@ -114,7 +127,8 @@ static int scan_mgr_io_scan_chain_prg(const unsigned int io_scan_chain_id)
|
|||||||
* Check if the scan chain engine has completed the
|
* Check if the scan chain engine has completed the
|
||||||
* IO scan chain data shifting
|
* IO scan chain data shifting
|
||||||
*/
|
*/
|
||||||
if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
|
ret = scan_chain_engine_is_idle(SCANMGR_MAX_DELAY);
|
||||||
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +199,8 @@ static int scan_mgr_io_scan_chain_prg(const unsigned int io_scan_chain_id)
|
|||||||
* Check if the scan chain engine has completed the
|
* Check if the scan chain engine has completed the
|
||||||
* IO scan chain data shifting
|
* IO scan chain data shifting
|
||||||
*/
|
*/
|
||||||
if (!scan_chain_engine_is_idle(SCAN_MAX_DELAY))
|
ret = scan_chain_engine_is_idle(SCANMGR_MAX_DELAY);
|
||||||
|
if (ret)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +211,7 @@ static int scan_mgr_io_scan_chain_prg(const unsigned int io_scan_chain_id)
|
|||||||
error:
|
error:
|
||||||
/* Disable IO Scan chain when error detected */
|
/* Disable IO Scan chain when error detected */
|
||||||
clrbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
|
clrbits_le32(&scan_manager_base->en, 1 << io_scan_chain_id);
|
||||||
return 1;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scan_mgr_configure_iocsr(void)
|
int scan_mgr_configure_iocsr(void)
|
||||||
|
Reference in New Issue
Block a user