|
@@ -72,6 +72,7 @@ static int stmmac_dwmac4_quirks(struct stmmac_priv *priv)
|
|
|
static const struct stmmac_hwif_entry {
|
|
|
bool gmac;
|
|
|
bool gmac4;
|
|
|
+ bool xgmac;
|
|
|
u32 min_id;
|
|
|
const struct stmmac_regs_off regs;
|
|
|
const void *desc;
|
|
@@ -87,6 +88,7 @@ static const struct stmmac_hwif_entry {
|
|
|
{
|
|
|
.gmac = false,
|
|
|
.gmac4 = false,
|
|
|
+ .xgmac = false,
|
|
|
.min_id = 0,
|
|
|
.regs = {
|
|
|
.ptp_off = PTP_GMAC3_X_OFFSET,
|
|
@@ -103,6 +105,7 @@ static const struct stmmac_hwif_entry {
|
|
|
}, {
|
|
|
.gmac = true,
|
|
|
.gmac4 = false,
|
|
|
+ .xgmac = false,
|
|
|
.min_id = 0,
|
|
|
.regs = {
|
|
|
.ptp_off = PTP_GMAC3_X_OFFSET,
|
|
@@ -119,6 +122,7 @@ static const struct stmmac_hwif_entry {
|
|
|
}, {
|
|
|
.gmac = false,
|
|
|
.gmac4 = true,
|
|
|
+ .xgmac = false,
|
|
|
.min_id = 0,
|
|
|
.regs = {
|
|
|
.ptp_off = PTP_GMAC4_OFFSET,
|
|
@@ -135,6 +139,7 @@ static const struct stmmac_hwif_entry {
|
|
|
}, {
|
|
|
.gmac = false,
|
|
|
.gmac4 = true,
|
|
|
+ .xgmac = false,
|
|
|
.min_id = DWMAC_CORE_4_00,
|
|
|
.regs = {
|
|
|
.ptp_off = PTP_GMAC4_OFFSET,
|
|
@@ -151,6 +156,7 @@ static const struct stmmac_hwif_entry {
|
|
|
}, {
|
|
|
.gmac = false,
|
|
|
.gmac4 = true,
|
|
|
+ .xgmac = false,
|
|
|
.min_id = DWMAC_CORE_4_10,
|
|
|
.regs = {
|
|
|
.ptp_off = PTP_GMAC4_OFFSET,
|
|
@@ -167,6 +173,7 @@ static const struct stmmac_hwif_entry {
|
|
|
}, {
|
|
|
.gmac = false,
|
|
|
.gmac4 = true,
|
|
|
+ .xgmac = false,
|
|
|
.min_id = DWMAC_CORE_5_10,
|
|
|
.regs = {
|
|
|
.ptp_off = PTP_GMAC4_OFFSET,
|
|
@@ -180,11 +187,29 @@ static const struct stmmac_hwif_entry {
|
|
|
.tc = &dwmac510_tc_ops,
|
|
|
.setup = dwmac4_setup,
|
|
|
.quirks = NULL,
|
|
|
- }
|
|
|
+ }, {
|
|
|
+ .gmac = false,
|
|
|
+ .gmac4 = false,
|
|
|
+ .xgmac = true,
|
|
|
+ .min_id = DWXGMAC_CORE_2_10,
|
|
|
+ .regs = {
|
|
|
+ .ptp_off = 0,
|
|
|
+ .mmc_off = 0,
|
|
|
+ },
|
|
|
+ .desc = NULL,
|
|
|
+ .dma = NULL,
|
|
|
+ .mac = NULL,
|
|
|
+ .hwtimestamp = NULL,
|
|
|
+ .mode = NULL,
|
|
|
+ .tc = NULL,
|
|
|
+ .setup = NULL,
|
|
|
+ .quirks = NULL,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
int stmmac_hwif_init(struct stmmac_priv *priv)
|
|
|
{
|
|
|
+ bool needs_xgmac = priv->plat->has_xgmac;
|
|
|
bool needs_gmac4 = priv->plat->has_gmac4;
|
|
|
bool needs_gmac = priv->plat->has_gmac;
|
|
|
const struct stmmac_hwif_entry *entry;
|
|
@@ -195,7 +220,7 @@ int stmmac_hwif_init(struct stmmac_priv *priv)
|
|
|
|
|
|
if (needs_gmac) {
|
|
|
id = stmmac_get_id(priv, GMAC_VERSION);
|
|
|
- } else if (needs_gmac4) {
|
|
|
+ } else if (needs_gmac4 || needs_xgmac) {
|
|
|
id = stmmac_get_id(priv, GMAC4_VERSION);
|
|
|
} else {
|
|
|
id = 0;
|
|
@@ -229,6 +254,8 @@ int stmmac_hwif_init(struct stmmac_priv *priv)
|
|
|
continue;
|
|
|
if (needs_gmac4 ^ entry->gmac4)
|
|
|
continue;
|
|
|
+ if (needs_xgmac ^ entry->xgmac)
|
|
|
+ continue;
|
|
|
/* Use synopsys_id var because some setups can override this */
|
|
|
if (priv->synopsys_id < entry->min_id)
|
|
|
continue;
|