diff --git a/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.mdd b/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.mdd
index fde9af64..a474c73d 100755
--- a/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.mdd
+++ b/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.mdd
@@ -37,7 +37,7 @@ BEGIN driver trafgen
OPTION supported_peripherals = (axi_traffic_gen_v[2-9]_[0-9][0-9]_[a-z] axi_traffic_gen_v[2-9]_[0-9]);
OPTION driver_state = ACTIVE;
OPTION copyfiles = all;
- OPTION VERSION = 3.2;
+ OPTION VERSION = 4.0;
OPTION NAME = trafgen;
END driver
diff --git a/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.tcl b/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.tcl
index 08ad42a1..c66eee94 100755
--- a/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.tcl
+++ b/XilinxProcessorIPLib/drivers/trafgen/data/trafgen.tcl
@@ -56,6 +56,7 @@ set periph_ninstances_atg 0
set atg_mode_value 0
set atg_mode_value_l2 0
set axi_mode_value 0
+set address_width_value 0
set baseaddr_value 0
set highaddr_value 0
@@ -113,6 +114,7 @@ proc xdfeine_trafgen_params_constants { periph } {
global atg_mode_value_l2
global axi_mode_value
global baseaddr_value
+ global address_width_value
global highaddr_value
set atg_mode_name [::hsi::utils::get_param_value $periph C_ATG_MODE]
@@ -174,6 +176,10 @@ proc xdfeine_trafgen_params_constants { periph } {
if {[llength $baseaddr_value] == 0} {
set baseaddr_value 0
}
+ set address_width_value [::hsi::utils::get_param_value $periph C_EXTENDED_ADDRESS_WIDTH]
+ if {[llength $address_width_value] == 0} {
+ set address_width_value 0
+ }
set highaddr_value [::hsi::utils::get_param_value $periph C_HIGHADDR]
if {[llength $highaddr_value] == 0} {
set highaddr_value 0
@@ -194,6 +200,7 @@ proc xdefine_trafgen_params_instance {file_handle periph device_id} {
puts $file_handle "\#define [::hsi::utils::get_ip_param_name $periph "C_ATG_MODE"] $atg_mode_value"
puts $file_handle "\#define [::hsi::utils::get_ip_param_name $periph "C_ATG_MODE_L2"] $atg_mode_value_l2"
puts $file_handle "\#define [::hsi::utils::get_ip_param_name $periph "C_AXIS_MODE"] $axi_mode_value"
+ puts $file_handle "\#define [::hsi::utils::get_ip_param_name $periph "C_EXTENDED_ADDRESS_WIDTH"] [::hsi::utils::get_param_value $periph C_EXTENDED_ADDRESS_WIDTH]"
}
proc xdefine_trafgen_params_canonical {file_handle periph device_id} {
@@ -201,6 +208,7 @@ proc xdefine_trafgen_params_canonical {file_handle periph device_id} {
global atg_mode_value
global atg_mode_value_l2
global axi_mode_value
+ global address_width_value
global baseaddr_value
global highaddr_value
puts $file_handle "\n/* Canonical definitions for peripheral [string toupper [common::get_property NAME $periph]] */"
@@ -230,6 +238,10 @@ proc xdefine_trafgen_params_canonical {file_handle periph device_id} {
set canonical_name [format "%s_AXIS_MODE" $canonical_tag]
puts $file_handle "\#define $canonical_name $axi_mode_value"
add_field_to_periph_config_struct_atg $device_id $canonical_name
+
+ set canonical_name [format "%s_EXTENDED_ADDRESS_WIDTH" $canonical_tag]
+ puts $file_handle "\#define $canonical_name $address_width_value"
+ add_field_to_periph_config_struct_atg $device_id $canonical_name
}
proc xdefine_trafgen_config_file {file_name drv_string} {
diff --git a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.c b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.c
index e0b5f892..b0e1ad2e 100644
--- a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.c
+++ b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.c
@@ -116,7 +116,7 @@ static int XTrafGen_ProgramParamRam(XTrafGen *InstancePtr, u8 RdWrFlag);
*
*****************************************************************************/
int XTrafGen_CfgInitialize(XTrafGen * InstancePtr,
- XTrafGen_Config *Config, u32 EffectiveAddress)
+ XTrafGen_Config *Config, UINTPTR EffectiveAddress)
{
u32 ConfigStatus;
@@ -130,6 +130,7 @@ int XTrafGen_CfgInitialize(XTrafGen * InstancePtr,
memset(InstancePtr, 0, sizeof(XTrafGen));
InstancePtr->Config.BaseAddress = EffectiveAddress;
InstancePtr->Config.DeviceId = Config->DeviceId;
+ InstancePtr->Config.AddressWidth = Config->AddressWidth;
if((Config->BusType == 1) && (Config->Mode == 1 ||
Config->ModeType == 2)) {
@@ -442,7 +443,13 @@ static void XTrafGen_PrepCmdWords(XTrafGen *InstancePtr,
Cmd = &CmdPtr->CRamCmd;
/* Command Word 0 */
- CmdWords[0] = Cmd->Address;
+ if ( InstancePtr->Config.AddressWidth > 32) {
+ /* Command Word 4 */
+ CmdWords[0] = LOWER_32_BITS(Cmd->Address);
+ CmdWords[4] = UPPER_32_BITS(Cmd->Address);
+ } else {
+ CmdWords[0] = Cmd->Address;
+ }
/* Command Word 1 */
CmdWords[1] = 0;
@@ -556,6 +563,7 @@ static int XTrafGen_ProgramCmdRam(XTrafGen *InstancePtr, u8 RdWrFlag)
u32 Index;
u32 Offset;
u32 CmdWordIndex;
+ u32 Offset1;
int ValidIndex;
/* Verify arguments */
@@ -567,10 +575,12 @@ static int XTrafGen_ProgramCmdRam(XTrafGen *InstancePtr, u8 RdWrFlag)
EntryIndex = CmdInfo->WrIndex;
ValidIndex = CmdInfo->LastWrValidIndex;
Offset = XTG_CMD_RAM_BLOCK_SIZE;
+ Offset1 = XTG_EXTCMD_RAM_BLOCK_SIZE;
} else {
EntryIndex = CmdInfo->RdIndex;
ValidIndex = CmdInfo->LastRdValidIndex;
Offset = 0;
+ Offset1 = 0;
}
for (Index = 0; Index < EntryIndex; Index++) {
@@ -582,6 +592,12 @@ static int XTrafGen_ProgramCmdRam(XTrafGen *InstancePtr, u8 RdWrFlag)
Offset, CmdWords[CmdWordIndex]);
Offset += 4;
}
+ if ( InstancePtr->Config.AddressWidth > 32) {
+ XTrafGen_WriteCmdRam_Msb(InstancePtr->Config.BaseAddress,
+ Offset1, CmdWords[4]);
+ Offset1 += 4;
+ }
+
} else {
return XST_FAILURE;
}
@@ -671,7 +687,7 @@ void XTrafGen_PrintCmds(XTrafGen *InstancePtr)
xil_printf("Commands configured for Write Block: \n\r");
for (Index1 = 0; Index1 < MAX_NUM_ENTRIES; Index1++) {
xil_printf("Cmd%d:\t", Index1);
- for (Index2 = 0; Index2 < 4; Index2++) {
+ for (Index2 = 0; Index2 < 5; Index2++) {
xil_printf("0x%08x, ",
CmdInfo->CmdEntry[1][Index1].CmdWords[Index2]);
}
@@ -681,7 +697,7 @@ void XTrafGen_PrintCmds(XTrafGen *InstancePtr)
xil_printf("Commands configured for Read Block: \n\r");
for (Index1 = 0; Index1 < MAX_NUM_ENTRIES; Index1++) {
xil_printf("Cmd%d:\t", Index1);
- for (Index2 = 0; Index2 < 4; Index2++) {
+ for (Index2 = 0; Index2 < 5; Index2++) {
xil_printf("0x%08x, ",
CmdInfo->CmdEntry[0][Index1].CmdWords[Index2]);
}
diff --git a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.h b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.h
index 9091871b..ed450c36 100644
--- a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.h
+++ b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen.h
@@ -191,6 +191,8 @@
* 3.2 adk 05/08/14 Fixed CR:798742 The last word of 8KB Master RAM in
* axi traffic generator can't access and CR:799554
* Some incorrect parameter in axi traffic generator driver.
+* 4.0 sd 19/08/15 Fixed CR:876564 Added 64-bit Support to axi traffic generator
+* driver.
*
******************************************************************************/
@@ -235,6 +237,7 @@ extern "C" {
/* Internal RAM Sizes */
#define XTG_PRM_RAM_BLOCK_SIZE 0x400 /**< PARAM Block Size (1KB) */
#define XTG_CMD_RAM_BLOCK_SIZE 0x1000 /**< Cmd RAM Block Size (4KB) */
+#define XTG_EXTCMD_RAM_BLOCK_SIZE 0x400 /**< Extended CMDRAM Block Size (1KB) */
#define XTG_PARAM_RAM_SIZE 0x800 /**< Parameter RAM (2KB) */
#define XTG_COMMAND_RAM_SIZE 0x2000 /**< Command RAM (8KB) */
#define XTG_MASTER_RAM_SIZE 0x2000 /**< Master RAM (8KB) */
@@ -247,7 +250,7 @@ extern "C" {
*/
typedef struct XTrafGen_CRamCmd
{
- u32 Address; /**< Address Driven to a*_addr line */
+ UINTPTR Address; /**< Address Driven to a*_addr line */
u32 ValidCmd; /**< Valid Command */
u32 LastAddress; /**< Last address */
u32 Prot; /**< Driven to a*_prot line */
@@ -301,7 +304,7 @@ typedef struct XTrafGen_Cmd
*/
typedef struct XTrafGen_CmdEntry
{
- u32 CmdWords[4]; /**< Command Ram words */
+ u32 CmdWords[5]; /**< Command Ram words */
u32 ParamWord; /**< Parameter Ram word */
} XTrafGen_CmdEntry;
@@ -312,10 +315,11 @@ typedef struct XTrafGen_CmdEntry
*/
typedef struct XTrafGen_Config {
u16 DeviceId; /**< Device Id */
- u32 BaseAddress; /**< Base Address */
+ UINTPTR BaseAddress; /**< Base Address */
u32 BusType; /**< Atgmode */
u32 Mode; /**< Atgmode_l2 */
u32 ModeType; /**< Axismode */
+ u32 AddressWidth; /**< AddressWidth */
} XTrafGen_Config;
/**
@@ -1188,7 +1192,7 @@ typedef struct XTrafGen {
* Initialization and control functions in xtrafgen.c
*/
int XTrafGen_CfgInitialize(XTrafGen * InstancePtr,
- XTrafGen_Config *Config, u32 EffectiveAddress);
+ XTrafGen_Config *Config, UINTPTR EffectiveAddress);
XTrafGen_Config *XTrafGen_LookupConfig(u32 DeviceId);
int XTrafGen_AddCommand(XTrafGen *InstancePtr, XTrafGen_Cmd *CmdPtr);
int XTrafGen_GetLastValidIndex(XTrafGen *InstancePtr, u32 RdWrFlag);
diff --git a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_g.c b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_g.c
index 9dc117e9..ae00e468 100644
--- a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_g.c
+++ b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_g.c
@@ -67,7 +67,8 @@ XTrafGen_Config XTrafGen_ConfigTable[] =
XPAR_XTRAFGEN_0_BASEADDR,
XPAR_XTRAFGEN_0_ATG_MODE,
XPAR_XTRAFGEN_0_ATG_MODE_L2,
- XPAR_XTRAFGEN_0_AXIS_MODE
+ XPAR_XTRAFGEN_0_AXIS_MODE,
+ XPAR_XTRAFGEN_0_ADDRESS_WIDTH
}
};
/** @} */
diff --git a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_hw.h b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_hw.h
index b9090ec5..453ba3c2 100644
--- a/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_hw.h
+++ b/XilinxProcessorIPLib/drivers/trafgen/src/xtrafgen_hw.h
@@ -107,6 +107,7 @@ extern "C" {
#define XTG_PARAM_RAM_OFFSET 0x1000 /**< Parameter RAM Offset */
#define XTG_COMMAND_RAM_OFFSET 0x8000 /**< Command RAM Offset */
#define XTG_MASTER_RAM_OFFSET 0xC000 /**< Master RAM Offset */
+#define XTG_COMMAND_RAM_MSB_OFFSET 0xa000 /**< Command RAM MSB Offset */
/*@}*/
@@ -458,6 +459,23 @@ extern "C" {
/****************************************************************************/
/**
*
+* XTrafGen_ReadCmdRam_Msb returns the value read from the Command RAM
+* specified by Offset.
+*
+* @param BaseAddress is the MSB of base address of the Axi TrafGen device.
+* @param Offset is the offset of the Command RAM to be read.
+*
+* @return Returns the 32-bit value of the memory location.
+*
+* @note C-style signature:
+* u32 XTrafGen_ReadCmdRam_Msb(u32 BaseAddress, u32 Offset)
+*
+*****************************************************************************/
+#define XTrafGen_ReadCmdRam_Msb(BaseAddress, Offset) \
+ (Xil_In32(((BaseAddress) + XTG_COMMAND_RAM_MSB_OFFSET + (Offset))))
+/****************************************************************************/
+/**
+*
* XTrafGen_WriteCmdRam, writes Data to the Command RAM specified by
* Offset.
*
@@ -475,6 +493,26 @@ extern "C" {
*****************************************************************************/
#define XTrafGen_WriteCmdRam(BaseAddress, Offset, Data) \
Xil_Out32(((BaseAddress) + XTG_COMMAND_RAM_OFFSET + (Offset)), (Data))
+/****************************************************************************/
+/**
+*
+* XTrafGen_WriteCmdRam_Msb, writes Data to the Command RAM specified by
+* Offset.
+*
+* @param BaseAddress is the MSB of base address of the Axi TrafGen device.
+* @param Offset is the offset of the location in Command RAM
+* to be written.
+* @param Data is the 32-bit value to write to the Command RAM.
+*
+* @return None.
+*
+* @note
+* C-style signature:
+* void XTrafGen_WriteCmdRam_Msb(u32 BaseAddress, u32 Offset, u32 Data)
+*
+*****************************************************************************/
+#define XTrafGen_WriteCmdRam_Msb(BaseAddress, Offset, Data) \
+ Xil_Out32(((BaseAddress) + XTG_COMMAND_RAM_MSB_OFFSET + (Offset)), (Data))
/****************************************************************************/
/**