@ -9,6 +9,7 @@
# include <asm/io.h>
# include <asm/arch/freeze_controller.h>
# include <asm/arch/scan_manager.h>
# include <asm/arch/system_manager.h>
/*
* Maximum polling loop to wait for IO scan chain engine becomes idle
@ -33,6 +34,8 @@ 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 ) ;
static struct socfpga_system_manager * sys_mgr_base =
( struct socfpga_system_manager * ) SOCFPGA_SYSMGR_ADDRESS ;
/**
* scan_chain_engine_is_idle ( ) - Check if the JTAG scan chain is idle
@ -205,3 +208,55 @@ int scan_mgr_configure_iocsr(void)
status | = scan_mgr_io_scan_chain_prg ( 3 ) ;
return status ;
}
/**
* scan_mgr_get_fpga_id ( ) - Obtain FPGA JTAG ID
*
* This function obtains JTAG ID from the FPGA TAP controller .
*/
u32 scan_mgr_get_fpga_id ( void )
{
const unsigned long data = 0 ;
u32 id = 0xffffffff ;
int ret ;
/* Enable HPS to talk to JTAG in the FPGA through the System Manager */
writel ( 0x1 , & sys_mgr_base - > scanmgrgrp_ctrl ) ;
/* Enable port 7 */
writel ( 0x80 , & scan_manager_base - > en ) ;
/* write to CSW to make s2f_ntrst reset */
writel ( 0x02 , & scan_manager_base - > stat ) ;
/* Add a pause */
mdelay ( 1 ) ;
/* write 0x00 to CSW to clear the s2f_ntrst */
writel ( 0 , & scan_manager_base - > stat ) ;
/*
* Go to Test - Logic - Reset state .
* This sets TAP controller into IDCODE mode .
*/
scan_mgr_jtag_io ( JTAG_BP_INSN | JTAG_BP_TMS , 0x1f | ( 1 < < 5 ) , 0x0 ) ;
/* Go to Run-Test/Idle -> DR-Scan -> Capture-DR -> Shift-DR state. */
scan_mgr_jtag_io ( JTAG_BP_INSN | JTAG_BP_TMS , 0x02 | ( 1 < < 4 ) , 0x0 ) ;
/*
* Push 4 bytes of data through TDI - > DR - > TDO .
*
* Length of TDI data is 32 bits ( length - 1 ) and they are only
* zeroes as we care only for TDO data .
*/
ret = scan_mgr_jtag_insn_data ( 0x4 , & data , 32 ) ;
/* Read 32 bit from captured JTAG data. */
if ( ! ret )
id = readl ( & scan_manager_base - > fifo_quad_byte ) ;
/* Disable all port */
writel ( 0 , & scan_manager_base - > en ) ;
writel ( 0 , & sys_mgr_base - > scanmgrgrp_ctrl ) ;
return id ;
}