]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: ipa: support different event ring encoding
authorAlex Elder <elder@linaro.org>
Wed, 15 Feb 2023 19:53:51 +0000 (13:53 -0600)
committerPaolo Abeni <pabeni@redhat.com>
Mon, 20 Feb 2023 07:14:20 +0000 (08:14 +0100)
Starting with IPA v5.0, a channel's event ring index is encoded in
a field in the CH_C_CNTXT_1 GSI register rather than CH_C_CNTXT_0.
Define a new field ID for the former register and encode the event
ring in the appropriate register.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ipa/gsi.c
drivers/net/ipa/gsi_reg.h

index 88279956194a98e1e639cc5911ccafb86b585bdf..f128d5bd6956e584d1e483ea78bb497f1a134f32 100644 (file)
@@ -840,12 +840,15 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell)
        val = ch_c_cntxt_0_type_encode(gsi->version, reg, GSI_CHANNEL_TYPE_GPI);
        if (channel->toward_ipa)
                val |= reg_bit(reg, CHTYPE_DIR);
-       val |= reg_encode(reg, ERINDEX, channel->evt_ring_id);
+       if (gsi->version < IPA_VERSION_5_0)
+               val |= reg_encode(reg, ERINDEX, channel->evt_ring_id);
        val |= reg_encode(reg, ELEMENT_SIZE, GSI_RING_ELEMENT_SIZE);
        iowrite32(val, gsi->virt + reg_n_offset(reg, channel_id));
 
        reg = gsi_reg(gsi, CH_C_CNTXT_1);
        val = reg_encode(reg, CH_R_LENGTH, size);
+       if (gsi->version >= IPA_VERSION_5_0)
+               val |= reg_encode(reg, CH_ERINDEX, channel->evt_ring_id);
        iowrite32(val, gsi->virt + reg_n_offset(reg, channel_id));
 
        /* The context 2 and 3 registers store the low-order and
index 52520cd44c3e17b719481edbf16bcd4ccd0e35d6..2a19d9e34a10a426aa887c8aa10e3c7ee9483833 100644 (file)
@@ -102,7 +102,7 @@ enum gsi_reg_ch_c_cntxt_0_field_id {
        CH_EE,
        CHID,
        CHTYPE_PROTOCOL_MSB,                            /* IPA v4.5-4.11 */
-       ERINDEX,
+       ERINDEX,                                        /* Not IPA v5.0+ */
        CHSTATE,
        ELEMENT_SIZE,
 };
@@ -124,6 +124,7 @@ enum gsi_channel_type {
 /* CH_C_CNTXT_1 register */
 enum gsi_reg_ch_c_cntxt_1_field_id {
        CH_R_LENGTH,
+       CH_ERINDEX,                                     /* IPA v5.0+ */
 };
 
 /* CH_C_QOS register */