|
@@ -228,7 +228,21 @@ do { \
|
|
|
|
|
|
/* Interrupt Cause and Mask registers */
|
|
|
#define MVPP2_ISR_RX_THRESHOLD_REG(rxq) (0x5200 + 4 * (rxq))
|
|
|
-#define MVPP2_ISR_RXQ_GROUP_REG(rxq) (0x5400 + 4 * (rxq))
|
|
|
+#define MVPP21_ISR_RXQ_GROUP_REG(rxq) (0x5400 + 4 * (rxq))
|
|
|
+
|
|
|
+#define MVPP22_ISR_RXQ_GROUP_INDEX_REG 0x5400
|
|
|
+#define MVPP22_ISR_RXQ_GROUP_INDEX_SUBGROUP_MASK 0xf
|
|
|
+#define MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_MASK 0x380
|
|
|
+#define MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_OFFSET 7
|
|
|
+
|
|
|
+#define MVPP22_ISR_RXQ_GROUP_INDEX_SUBGROUP_MASK 0xf
|
|
|
+#define MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_MASK 0x380
|
|
|
+
|
|
|
+#define MVPP22_ISR_RXQ_SUB_GROUP_CONFIG_REG 0x5404
|
|
|
+#define MVPP22_ISR_RXQ_SUB_GROUP_STARTQ_MASK 0x1f
|
|
|
+#define MVPP22_ISR_RXQ_SUB_GROUP_SIZE_MASK 0xf00
|
|
|
+#define MVPP22_ISR_RXQ_SUB_GROUP_SIZE_OFFSET 8
|
|
|
+
|
|
|
#define MVPP2_ISR_ENABLE_REG(port) (0x5420 + 4 * (port))
|
|
|
#define MVPP2_ISR_ENABLE_INTERRUPT(mask) ((mask) & 0xffff)
|
|
|
#define MVPP2_ISR_DISABLE_INTERRUPT(mask) (((mask) << 16) & 0xffff0000)
|
|
@@ -3747,7 +3761,19 @@ static int mvpp2_port_init(struct udevice *dev, struct mvpp2_port *port)
|
|
|
}
|
|
|
|
|
|
/* Configure Rx queue group interrupt for this port */
|
|
|
- mvpp2_write(priv, MVPP2_ISR_RXQ_GROUP_REG(port->id), CONFIG_MV_ETH_RXQ);
|
|
|
+ if (priv->hw_version == MVPP21) {
|
|
|
+ mvpp2_write(priv, MVPP21_ISR_RXQ_GROUP_REG(port->id),
|
|
|
+ CONFIG_MV_ETH_RXQ);
|
|
|
+ } else {
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ val = (port->id << MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_OFFSET);
|
|
|
+ mvpp2_write(priv, MVPP22_ISR_RXQ_GROUP_INDEX_REG, val);
|
|
|
+
|
|
|
+ val = (CONFIG_MV_ETH_RXQ <<
|
|
|
+ MVPP22_ISR_RXQ_SUB_GROUP_SIZE_OFFSET);
|
|
|
+ mvpp2_write(priv, MVPP22_ISR_RXQ_SUB_GROUP_CONFIG_REG, val);
|
|
|
+ }
|
|
|
|
|
|
/* Create Rx descriptor rings */
|
|
|
for (queue = 0; queue < rxq_number; queue++) {
|
|
@@ -4013,9 +4039,23 @@ static int mvpp2_init(struct udevice *dev, struct mvpp2 *priv)
|
|
|
mvpp2_rx_fifo_init(priv);
|
|
|
|
|
|
/* Reset Rx queue group interrupt configuration */
|
|
|
- for (i = 0; i < MVPP2_MAX_PORTS; i++)
|
|
|
- mvpp2_write(priv, MVPP2_ISR_RXQ_GROUP_REG(i),
|
|
|
- CONFIG_MV_ETH_RXQ);
|
|
|
+ for (i = 0; i < MVPP2_MAX_PORTS; i++) {
|
|
|
+ if (priv->hw_version == MVPP21) {
|
|
|
+ mvpp2_write(priv, MVPP21_ISR_RXQ_GROUP_REG(i),
|
|
|
+ CONFIG_MV_ETH_RXQ);
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ val = (i << MVPP22_ISR_RXQ_GROUP_INDEX_GROUP_OFFSET);
|
|
|
+ mvpp2_write(priv, MVPP22_ISR_RXQ_GROUP_INDEX_REG, val);
|
|
|
+
|
|
|
+ val = (CONFIG_MV_ETH_RXQ <<
|
|
|
+ MVPP22_ISR_RXQ_SUB_GROUP_SIZE_OFFSET);
|
|
|
+ mvpp2_write(priv,
|
|
|
+ MVPP22_ISR_RXQ_SUB_GROUP_CONFIG_REG, val);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (priv->hw_version == MVPP21)
|
|
|
writel(MVPP2_EXT_GLOBAL_CTRL_DEFAULT,
|