Merge tag 'soc-drivers-6.3' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc
[linux-2.6-microblaze.git] / drivers / net / ipa / ipa_main.c
index 90baf7a..4cc8d8d 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 
 /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
- * Copyright (C) 2018-2022 Linaro Ltd.
+ * Copyright (C) 2018-2023 Linaro Ltd.
  */
 
 #include <linux/types.h>
@@ -203,7 +203,7 @@ static void ipa_teardown(struct ipa *ipa)
 static void
 ipa_hardware_config_bcr(struct ipa *ipa, const struct ipa_data *data)
 {
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 val;
 
        /* IPA v4.5+ has no backward compatibility register */
@@ -212,13 +212,13 @@ ipa_hardware_config_bcr(struct ipa *ipa, const struct ipa_data *data)
 
        reg = ipa_reg(ipa, IPA_BCR);
        val = data->backward_compat;
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 }
 
 static void ipa_hardware_config_tx(struct ipa *ipa)
 {
        enum ipa_version version = ipa->version;
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 offset;
        u32 val;
 
@@ -227,11 +227,11 @@ static void ipa_hardware_config_tx(struct ipa *ipa)
 
        /* Disable PA mask to allow HOLB drop */
        reg = ipa_reg(ipa, IPA_TX_CFG);
-       offset = ipa_reg_offset(reg);
+       offset = reg_offset(reg);
 
        val = ioread32(ipa->reg_virt + offset);
 
-       val &= ~ipa_reg_bit(reg, PA_MASK_EN);
+       val &= ~reg_bit(reg, PA_MASK_EN);
 
        iowrite32(val, ipa->reg_virt + offset);
 }
@@ -239,7 +239,7 @@ static void ipa_hardware_config_tx(struct ipa *ipa)
 static void ipa_hardware_config_clkon(struct ipa *ipa)
 {
        enum ipa_version version = ipa->version;
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 val;
 
        if (version >= IPA_VERSION_4_5)
@@ -252,20 +252,20 @@ static void ipa_hardware_config_clkon(struct ipa *ipa)
        reg = ipa_reg(ipa, CLKON_CFG);
        if (version == IPA_VERSION_3_1) {
                /* Disable MISC clock gating */
-               val = ipa_reg_bit(reg, CLKON_MISC);
+               val = reg_bit(reg, CLKON_MISC);
        } else {        /* IPA v4.0+ */
                /* Enable open global clocks in the CLKON configuration */
-               val = ipa_reg_bit(reg, CLKON_GLOBAL);
-               val |= ipa_reg_bit(reg, GLOBAL_2X_CLK);
+               val = reg_bit(reg, CLKON_GLOBAL);
+               val |= reg_bit(reg, GLOBAL_2X_CLK);
        }
 
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 }
 
 /* Configure bus access behavior for IPA components */
 static void ipa_hardware_config_comp(struct ipa *ipa)
 {
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 offset;
        u32 val;
 
@@ -274,21 +274,22 @@ static void ipa_hardware_config_comp(struct ipa *ipa)
                return;
 
        reg = ipa_reg(ipa, COMP_CFG);
-       offset = ipa_reg_offset(reg);
+       offset = reg_offset(reg);
+
        val = ioread32(ipa->reg_virt + offset);
 
        if (ipa->version == IPA_VERSION_4_0) {
-               val &= ~ipa_reg_bit(reg, IPA_QMB_SELECT_CONS_EN);
-               val &= ~ipa_reg_bit(reg, IPA_QMB_SELECT_PROD_EN);
-               val &= ~ipa_reg_bit(reg, IPA_QMB_SELECT_GLOBAL_EN);
+               val &= ~reg_bit(reg, IPA_QMB_SELECT_CONS_EN);
+               val &= ~reg_bit(reg, IPA_QMB_SELECT_PROD_EN);
+               val &= ~reg_bit(reg, IPA_QMB_SELECT_GLOBAL_EN);
        } else if (ipa->version < IPA_VERSION_4_5) {
-               val |= ipa_reg_bit(reg, GSI_MULTI_AXI_MASTERS_DIS);
+               val |= reg_bit(reg, GSI_MULTI_AXI_MASTERS_DIS);
        } else {
                /* For IPA v4.5 FULL_FLUSH_WAIT_RS_CLOSURE_EN is 0 */
        }
 
-       val |= ipa_reg_bit(reg, GSI_MULTI_INORDER_RD_DIS);
-       val |= ipa_reg_bit(reg, GSI_MULTI_INORDER_WR_DIS);
+       val |= reg_bit(reg, GSI_MULTI_INORDER_RD_DIS);
+       val |= reg_bit(reg, GSI_MULTI_INORDER_WR_DIS);
 
        iowrite32(val, ipa->reg_virt + offset);
 }
@@ -299,7 +300,7 @@ ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)
 {
        const struct ipa_qsb_data *data0;
        const struct ipa_qsb_data *data1;
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 val;
 
        /* QMB 0 represents DDR; QMB 1 (if present) represents PCIe */
@@ -310,29 +311,27 @@ ipa_hardware_config_qsb(struct ipa *ipa, const struct ipa_data *data)
        /* Max outstanding write accesses for QSB masters */
        reg = ipa_reg(ipa, QSB_MAX_WRITES);
 
-       val = ipa_reg_encode(reg, GEN_QMB_0_MAX_WRITES, data0->max_writes);
+       val = reg_encode(reg, GEN_QMB_0_MAX_WRITES, data0->max_writes);
        if (data->qsb_count > 1)
-               val |= ipa_reg_encode(reg, GEN_QMB_1_MAX_WRITES,
-                                     data1->max_writes);
+               val |= reg_encode(reg, GEN_QMB_1_MAX_WRITES, data1->max_writes);
 
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 
        /* Max outstanding read accesses for QSB masters */
        reg = ipa_reg(ipa, QSB_MAX_READS);
 
-       val = ipa_reg_encode(reg, GEN_QMB_0_MAX_READS, data0->max_reads);
+       val = reg_encode(reg, GEN_QMB_0_MAX_READS, data0->max_reads);
        if (ipa->version >= IPA_VERSION_4_0)
-               val |= ipa_reg_encode(reg, GEN_QMB_0_MAX_READS_BEATS,
-                                     data0->max_reads_beats);
+               val |= reg_encode(reg, GEN_QMB_0_MAX_READS_BEATS,
+                                 data0->max_reads_beats);
        if (data->qsb_count > 1) {
-               val = ipa_reg_encode(reg, GEN_QMB_1_MAX_READS,
-                                    data1->max_reads);
+               val = reg_encode(reg, GEN_QMB_1_MAX_READS, data1->max_reads);
                if (ipa->version >= IPA_VERSION_4_0)
-                       val |= ipa_reg_encode(reg, GEN_QMB_1_MAX_READS_BEATS,
-                                             data1->max_reads_beats);
+                       val |= reg_encode(reg, GEN_QMB_1_MAX_READS_BEATS,
+                                         data1->max_reads_beats);
        }
 
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 }
 
 /* The internal inactivity timer clock is used for the aggregation timer */
@@ -368,41 +367,47 @@ static __always_inline u32 ipa_aggr_granularity_val(u32 usec)
  */
 static void ipa_qtime_config(struct ipa *ipa)
 {
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 offset;
        u32 val;
 
        /* Timer clock divider must be disabled when we change the rate */
        reg = ipa_reg(ipa, TIMERS_XO_CLK_DIV_CFG);
-       iowrite32(0, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(0, ipa->reg_virt + reg_offset(reg));
 
        reg = ipa_reg(ipa, QTIME_TIMESTAMP_CFG);
        /* Set DPL time stamp resolution to use Qtime (instead of 1 msec) */
-       val = ipa_reg_encode(reg, DPL_TIMESTAMP_LSB, DPL_TIMESTAMP_SHIFT);
-       val |= ipa_reg_bit(reg, DPL_TIMESTAMP_SEL);
+       val = reg_encode(reg, DPL_TIMESTAMP_LSB, DPL_TIMESTAMP_SHIFT);
+       val |= reg_bit(reg, DPL_TIMESTAMP_SEL);
        /* Configure tag and NAT Qtime timestamp resolution as well */
-       val = ipa_reg_encode(reg, TAG_TIMESTAMP_LSB, TAG_TIMESTAMP_SHIFT);
-       val = ipa_reg_encode(reg, NAT_TIMESTAMP_LSB, NAT_TIMESTAMP_SHIFT);
+       val = reg_encode(reg, TAG_TIMESTAMP_LSB, TAG_TIMESTAMP_SHIFT);
+       val = reg_encode(reg, NAT_TIMESTAMP_LSB, NAT_TIMESTAMP_SHIFT);
 
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 
        /* Set granularity of pulse generators used for other timers */
        reg = ipa_reg(ipa, TIMERS_PULSE_GRAN_CFG);
-       val = ipa_reg_encode(reg, PULSE_GRAN_0, IPA_GRAN_100_US);
-       val |= ipa_reg_encode(reg, PULSE_GRAN_1, IPA_GRAN_1_MS);
-       val |= ipa_reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_1_MS);
+       val = reg_encode(reg, PULSE_GRAN_0, IPA_GRAN_100_US);
+       val |= reg_encode(reg, PULSE_GRAN_1, IPA_GRAN_1_MS);
+       if (ipa->version >= IPA_VERSION_5_0) {
+               val |= reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_10_MS);
+               val |= reg_encode(reg, PULSE_GRAN_3, IPA_GRAN_10_MS);
+       } else {
+               val |= reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_1_MS);
+       }
 
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 
        /* Actual divider is 1 more than value supplied here */
        reg = ipa_reg(ipa, TIMERS_XO_CLK_DIV_CFG);
-       offset = ipa_reg_offset(reg);
-       val = ipa_reg_encode(reg, DIV_VALUE, IPA_XO_CLOCK_DIVIDER - 1);
+       offset = reg_offset(reg);
+
+       val = reg_encode(reg, DIV_VALUE, IPA_XO_CLOCK_DIVIDER - 1);
 
        iowrite32(val, ipa->reg_virt + offset);
 
        /* Divider value is set; re-enable the common timer clock divider */
-       val |= ipa_reg_bit(reg, DIV_ENABLE);
+       val |= reg_bit(reg, DIV_ENABLE);
 
        iowrite32(val, ipa->reg_virt + offset);
 }
@@ -411,13 +416,13 @@ static void ipa_qtime_config(struct ipa *ipa)
 static void ipa_hardware_config_counter(struct ipa *ipa)
 {
        u32 granularity = ipa_aggr_granularity_val(IPA_AGGR_GRANULARITY);
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 val;
 
        reg = ipa_reg(ipa, COUNTER_CFG);
        /* If defined, EOT_COAL_GRANULARITY is 0 */
-       val = ipa_reg_encode(reg, AGGR_GRANULARITY, granularity);
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       val = reg_encode(reg, AGGR_GRANULARITY, granularity);
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 }
 
 static void ipa_hardware_config_timing(struct ipa *ipa)
@@ -430,8 +435,13 @@ static void ipa_hardware_config_timing(struct ipa *ipa)
 
 static void ipa_hardware_config_hashing(struct ipa *ipa)
 {
-       const struct ipa_reg *reg;
+       const struct reg *reg;
 
+       /* Other than IPA v4.2, all versions enable "hashing".  Starting
+        * with IPA v5.0, the filter and router tables are implemented
+        * differently, but the default configuration enables this feature
+        * (now referred to as "cacheing"), so there's nothing to do here.
+        */
        if (ipa->version != IPA_VERSION_4_2)
                return;
 
@@ -441,26 +451,26 @@ static void ipa_hardware_config_hashing(struct ipa *ipa)
        /* IPV6_ROUTER_HASH, IPV6_FILTER_HASH, IPV4_ROUTER_HASH,
         * IPV4_FILTER_HASH are all zero.
         */
-       iowrite32(0, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(0, ipa->reg_virt + reg_offset(reg));
 }
 
 static void ipa_idle_indication_cfg(struct ipa *ipa,
                                    u32 enter_idle_debounce_thresh,
                                    bool const_non_idle_enable)
 {
-       const struct ipa_reg *reg;
+       const struct reg *reg;
        u32 val;
 
        if (ipa->version < IPA_VERSION_3_5_1)
                return;
 
        reg = ipa_reg(ipa, IDLE_INDICATION_CFG);
-       val = ipa_reg_encode(reg, ENTER_IDLE_DEBOUNCE_THRESH,
-                            enter_idle_debounce_thresh);
+       val = reg_encode(reg, ENTER_IDLE_DEBOUNCE_THRESH,
+                        enter_idle_debounce_thresh);
        if (const_non_idle_enable)
-               val |= ipa_reg_bit(reg, CONST_NON_IDLE_ENABLE);
+               val |= reg_bit(reg, CONST_NON_IDLE_ENABLE);
 
-       iowrite32(val, ipa->reg_virt + ipa_reg_offset(reg));
+       iowrite32(val, ipa->reg_virt + reg_offset(reg));
 }
 
 /**