axiethernet: Add support for Hier IP

The axiethernet ip contains 3 inbuilt blocks init
--> Axi Ethernet MAC
--> Axi Etherent BUF
--> PCS/PMA Core

During the vivado version < 2015.2 the axiethernet ip
being exported to hdf in flat mode and the hsi opens this in flat mode.
But from 2015.3 build onwards the axiethernet ip is tagged as core in the vivado
and hsi will open the ip in hier IP mode(hierarchy) means for user only
top level axiethernet instance will be visible and it will contains all
the properties related to the sub-cores.

In order to allow backward compatabilty
---> If a xml/hdf file which got created with the vivado version < 2015.3 being exported to
the sdk >= 2015.3.
---> Two drivers will be active to resolve this issue.
---> axiethernet_v4_4 will be attached to BUF this will fix the backward compatabilty issue.
---> axiethernet_v5_0 will be attached to top level block for newer features.

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
This commit is contained in:
Kedareswara rao Appana 2015-06-18 13:05:37 +05:30 committed by Nava kishore Manne
parent 3b07202f16
commit ec3aa65779
3 changed files with 174 additions and 133 deletions

View file

@ -39,7 +39,7 @@ OPTION psf_version = 2.1;
BEGIN driver axiethernet
OPTION supported_peripherals = (axi_ethernet_v[3-9]_[0-9][1-9]_[a-z] axi_ethernet_v[3-9]_[0-9] axi_ethernet_buffer);
OPTION supported_peripherals = (axi_ethernet_v[3-9]_[0-9][1-9]_[a-z] axi_ethernet_v[3-9]_[0-9]);
OPTION driver_state = ACTIVE;
OPTION copyfiles = all;
OPTION VERSION = 5.0;

View file

@ -45,6 +45,7 @@
# When IP is configured with the PCS/PMA core (CR 828796)
# 8/1/15 adk Fixed TCL errors when axiethernet is configured with the
# Axi stream fifo (CR 835605).
# 13/06/15 adk Updated the driver tcl for Hier IP(To support User parameters).
#
###############################################################################
#uses "xillib.tcl"
@ -115,26 +116,22 @@ proc xdefine_axiethernet_include_file {drv_handle file_name drv_string} {
# Now print all useful parameters for all peripherals
set device_id 0
foreach periph $periphs {
#puts $file_handle ""
set file_handle [::hsi::utils::open_include_file $file_name]
::hsi::utils::define_include_file $drv_handle "xparameters.h" "XAxiEthernet" "NUM_INSTANCES" "DEVICE_ID" "C_BASEADDR" "C_HIGHADDR" "C_TYPE" "C_TXCSUM" "C_RXCSUM" "C_PHY_TYPE" "C_TXVLAN_TRAN" "C_RXVLAN_TRAN" "C_TXVLAN_TAG" "C_RXVLAN_TAG" "C_TXVLAN_STRP" "C_RXVLAN_STRP" "C_MCAST_EXTEND" "C_STATS" "C_AVB" "C_PHYADDR"
xdefine_temac_params_include_file $file_handle $periph $device_id
set file_handle [::hsi::utils::open_include_file $file_name]
# Create canonical definitions
xdefine_temac_params_canonical $file_handle $periph $device_id
# Create canonical definitions
xdefine_temac_params_canonical $file_handle $periph $device_id
# Interrupt ID (canonical)
xdefine_temac_interrupt $file_handle $periph $device_id
generate_sgmii_params $drv_handle "xparameters.h"
display_avb_warning_if_applicable $periph
# Interrupt ID (canonical)
xdefine_temac_interrupt $file_handle $periph $device_id
incr device_id
puts $file_handle "\n"
close $file_handle
}
generate_sgmii_params $drv_handle "xparameters.h"
display_avb_warning_if_applicable $periph
incr device_id
puts $file_handle "\n"
close $file_handle
}
# -------------------------------------------------------
# PART 2 -- AXIFIFO/AXIDMA Connection related parameters
# -------------------------------------------------------
@ -275,6 +272,74 @@ proc xdefine_axi_target_params {periphs file_handle} {
}
}
}
proc xdefine_temac_params_include_file {file_handle periph device_id} {
puts $file_handle "/* Definitions for peripheral [string toupper [common::get_property NAME $periph]] */"
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "DEVICE_ID"] $device_id"
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "BASEADDR"] [common::get_property CONFIG.C_BASEADDR $periph]"
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "HIGHADDR"] [common::get_property CONFIG.C_HIGHADDR $periph]"
set value [common::get_property CONFIG.PHY_TYPE $periph]
set value [get_mactype $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "TYPE"] $value"
set value [common::get_property CONFIG.TXCSUM $periph]
set value [get_checksum $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "TXCSUM"] $value"
set value [common::get_property CONFIG.RXCSUM $periph]
set value [get_checksum $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "RXCSUM"] $value"
set value [common::get_property CONFIG.PHY_TYPE $periph]
set value [get_phytype $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "PHY_TYPE"] $value"
set value [common::get_property CONFIG.TXVLAN_TRAN $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "TXVLAN_TRAN"] $value"
set value [common::get_property CONFIG.RXVLAN_TRAN $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "RXVLAN_TRAN"] $value"
set value [common::get_property CONFIG.TXVLAN_TAG $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "TXVLAN_TAG"] $value"
set value [common::get_property CONFIG.RXVLAN_TAG $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "RXVLAN_TAG"] $value"
set value [common::get_property CONFIG.TXVLAN_STRP $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "TXVLAN_STRP"] $value"
set value [common::get_property CONFIG.RXVLAN_STRP $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "RXVLAN_STRP"] $value"
set value [common::get_property CONFIG.MCAST_EXTEND $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "MCAST_EXTEND"] $value"
set value [common::get_property CONFIG.Statistics_Counters $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "STATS"] $value"
set value [common::get_property CONFIG.AVB $periph]
set value [is_property_set $value]
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "AVB"] $value"
set phyaddr [common::get_property CONFIG.PHYADDR $periph]
set value [::hsi::utils::convert_binary_to_decimal $phyaddr]
if {[llength $value] == 0} {
set value 0
}
puts $file_handle "\#define [::hsi::utils::get_driver_param_name $periph "PHYADDR"] $value"
}
# ------------------------------------------------------------------
# This procedure creates XPARs that are canonical/normalized for the
# hardware design parameters. It also adds these to the Config table.
@ -300,117 +365,91 @@ proc xdefine_temac_params_canonical {file_handle periph device_id} {
puts $file_handle "\#define $canonical_name [::hsi::utils::get_param_value $periph C_HIGHADDR]"
set canonical_name [format "%s_TEMAC_TYPE" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_TYPE]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph PHY_TYPE]
set value [get_mactype $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_TXCSUM" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_TXCSUM]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph TXCSUM]
set value [get_checksum $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_RXCSUM" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_RXCSUM]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph RXCSUM]
set value [get_checksum $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_PHY_TYPE" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_PHY_TYPE]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph PHY_TYPE]
set value [get_phytype $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_TXVLAN_TRAN" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_TXVLAN_TRAN]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph TXVLAN_TRAN]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_RXVLAN_TRAN" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_RXVLAN_TRAN]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph RXVLAN_TRAN]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_TXVLAN_TAG" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_TXVLAN_TAG]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph TXVLAN_TAG]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_RXVLAN_TAG" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_RXVLAN_TAG]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph RXVLAN_TAG]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_TXVLAN_STRP" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_TXVLAN_STRP]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph TXVLAN_STRP]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_RXVLAN_STRP" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_RXVLAN_STRP]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph RXVLAN_STRP]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_MCAST_EXTEND" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_MCAST_EXTEND]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph MCAST_EXTEND]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_STATS" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_STATS]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph Statistics_Counters]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_AVB" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_AVB]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph ENABLE_AVB]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_ENABLE_SGMII_OVER_LVDS" $canonical_tag]
set value [::hsi::utils::get_param_value $periph C_ENABLE_LVDS]
if {[llength $value] == 0} {
set value 0
}
set value [::hsi::utils::get_param_value $periph ENABLE_LVDS]
set value [is_property_set $value]
puts $file_handle "\#define $canonical_name $value"
add_field_to_periph_config_struct $device_id $canonical_name
set canonical_name [format "%s_PHYADDR" $canonical_tag]
set phyaddr [::hsi::utils::get_param_value $periph C_PHYADDR]
set phyaddr [::hsi::utils::get_param_value $periph PHYADDR]
set value [::hsi::utils::convert_binary_to_decimal $phyaddr]
if {[llength $value] == 0} {
set value 0
@ -630,71 +669,72 @@ proc xdefine_temac_interrupt {file_handle periph device_id} {
proc generate_sgmii_params {drv_handle file_name} {
set file_handle [::hsi::utils::open_include_file $file_name]
set ips [get_cells "*"]
foreach ip $ips {
set periph [get_property IP_NAME $ip]
if { [string compare -nocase $periph "gig_ethernet_pcs_pma"] == 0} {
set PhyStandard [get_property CONFIG.Standard $ip]
}
set phy_type [common::get_property CONFIG.PHY_TYPE [get_cells $drv_handle]]
set phyaddr [common::get_property CONFIG.PHYADDR [get_cells $drv_handle]]
set phyaddr [::hsi::utils::convert_binary_to_decimal $phyaddr]
if {[llength $phyaddr] == 0} {
set phyaddr 0
}
foreach ip $ips {
set periph [get_property IP_NAME $ip]
if { [string compare -nocase $periph "axi_ethernet_buffer"] == 0} {
set phya [is_gige_pcs_pma_ip_present $ip]
if { $phya == 0} {
close $file_handle
return 0
}
if { $PhyStandard == "1000BASEX" } {
puts $file_handle "/* Definitions related to PCS PMA PL IP*/"
puts $file_handle "\#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1"
puts $file_handle "\#define XPAR_PCSPMA_1000BASEX_PHYADDR $phya"
puts $file_handle "\n/******************************************************************/\n"
} else {
puts $file_handle "/* Definitions related to PCS PMA PL IP*/"
puts $file_handle "\#define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1"
puts $file_handle "\#define XPAR_PCSPMA_SGMII_PHYADDR $phya"
puts $file_handle "\n/******************************************************************/\n"
}
}
set phya [::hsi::utils::convert_binary_to_decimal $phyaddr]
if {[string compare -nocase $phy_type "SGMII"] == 0} {
puts $file_handle "/* Definitions related to PCS PMA PL IP*/"
puts $file_handle "\#define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1"
puts $file_handle "\#define XPAR_PCSPMA_SGMII_PHYADDR $phya"
puts $file_handle "\n/******************************************************************/\n"
} elseif {[string compare -nocase $phy_type "1000BaseX"] == 0} {
puts $file_handle "/* Definitions related to PCS PMA PL IP*/"
puts $file_handle "\#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1"
puts $file_handle "\#define XPAR_PCSPMA_1000BASEX_PHYADDR $phya"
puts $file_handle "\n/******************************************************************/\n"
}
close $file_handle
}
proc is_gige_pcs_pma_ip_present {slave} {
set port_value 0
set phy_addr 0
set ipconv 0
set ips [get_cells "*"]
set enetipinstance_name [get_property IP_NAME $slave]
foreach ip $ips {
set periph [get_property IP_NAME $ip]
if { [string compare -nocase $periph "gig_ethernet_pcs_pma"] == 0} {
set sgmii_param [get_property CONFIG.c_is_sgmii $ip]
set PhyStandarrd [get_property CONFIG.Standard $ip]
if {$sgmii_param == true || $PhyStandarrd == "1000BASEX"} {
set ipconv $ip
}
break
}
proc is_property_set {value} {
if {[string compare -nocase $value "true"] == 0} {
set value 1
} else {
set value 0
}
if { $ipconv != 0 } {
set port_value [get_pins -of_objects [get_nets -of_objects [get_pins -of_objects $ipconv gmii_txd]]]
if { $port_value != 0 } {
if { [string compare -nocase $enetipinstance_name "axi_ethernet_buffer"] == 0} {
set phyaddr [::hsi::utils::get_param_value $ipconv C_PHYADDR]
set phy_addr [::hsi::utils::convert_binary_to_decimal $phyaddr]
if {[llength $phy_addr] == 0} {
set phy_addr 0
}
}
}
}
return $phy_addr
return $value
}
proc get_checksum {value} {
if {[string compare -nocase $value "None"] == 0} {
set value 0
} elseif {[string compare -nocase $value "Partial"] == 0} {
set value 1
} else {
set value 2
}
return $value
}
proc get_phytype {value} {
if {[string compare -nocase $value "MII"] == 0} {
set value 0
} elseif {[string compare -nocase $value "GMII"] == 0} {
set value 1
} elseif {[string compare -nocase $value "RGMII"] == 0} {
set value 3
} elseif {[string compare -nocase $value "SGMII"] == 0} {
set value 4
} else {
set value 5
}
return $value
}
proc get_mactype {value} {
if {[string compare -nocase $value "MII"] == 0} {
set value 0
} else {
set value 1
}
return $value
}

View file

@ -460,6 +460,7 @@
* 4.4 adk 8/1/15 - Fixed TCL errors when axiethernet is configured with the
* Axi stream fifo (CR 835605). Changes are made in the
* driver tcl file.
* 5.0 adk 13/06/15 - Updated the driver tcl for Hier IP(To support User parameters).
* </pre>
*
******************************************************************************/