Commit 14dbf977 authored by Alex Elder's avatar Alex Elder Committed by Jakub Kicinski

net: ipa: record IPA version in GSI structure

Record the IPA version passed to gsi_init() in the GSI structure.
This allows that value to be used directly where needed, rather than
passing and storing certain flag arguments through the code.

In particular, for all but one supported version of IPA, the command
channel is programmed to only use an "escape buffer".  By storing
the IPA version, we can do a simple version check in one location,
and avoid storing a flag field in every channel (and passing a flag
along while initializing channels to set that field properly).
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1d0c09de
...@@ -747,7 +747,8 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell) ...@@ -747,7 +747,8 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell)
if (doorbell) if (doorbell)
val |= USE_DB_ENG_FMASK; val |= USE_DB_ENG_FMASK;
if (!channel->use_prefetch) /* Starting with IPA v4.0 the command channel uses the escape buffer */
if (gsi->version != IPA_VERSION_3_5_1 && channel->command)
val |= USE_ESCAPE_BUF_ONLY_FMASK; val |= USE_ESCAPE_BUF_ONLY_FMASK;
iowrite32(val, gsi->virt + GSI_CH_C_QOS_OFFSET(channel_id)); iowrite32(val, gsi->virt + GSI_CH_C_QOS_OFFSET(channel_id));
...@@ -1815,7 +1816,7 @@ static bool gsi_channel_data_valid(struct gsi *gsi, ...@@ -1815,7 +1816,7 @@ static bool gsi_channel_data_valid(struct gsi *gsi,
/* Init function for a single channel */ /* Init function for a single channel */
static int gsi_channel_init_one(struct gsi *gsi, static int gsi_channel_init_one(struct gsi *gsi,
const struct ipa_gsi_endpoint_data *data, const struct ipa_gsi_endpoint_data *data,
bool command, bool prefetch) bool command)
{ {
struct gsi_channel *channel; struct gsi_channel *channel;
u32 tre_count; u32 tre_count;
...@@ -1839,7 +1840,6 @@ static int gsi_channel_init_one(struct gsi *gsi, ...@@ -1839,7 +1840,6 @@ static int gsi_channel_init_one(struct gsi *gsi,
channel->gsi = gsi; channel->gsi = gsi;
channel->toward_ipa = data->toward_ipa; channel->toward_ipa = data->toward_ipa;
channel->command = command; channel->command = command;
channel->use_prefetch = command && prefetch;
channel->tlv_count = data->channel.tlv_count; channel->tlv_count = data->channel.tlv_count;
channel->tre_count = tre_count; channel->tre_count = tre_count;
channel->event_count = data->channel.event_count; channel->event_count = data->channel.event_count;
...@@ -1893,7 +1893,7 @@ static void gsi_channel_exit_one(struct gsi_channel *channel) ...@@ -1893,7 +1893,7 @@ static void gsi_channel_exit_one(struct gsi_channel *channel)
} }
/* Init function for channels */ /* Init function for channels */
static int gsi_channel_init(struct gsi *gsi, bool prefetch, u32 count, static int gsi_channel_init(struct gsi *gsi, u32 count,
const struct ipa_gsi_endpoint_data *data, const struct ipa_gsi_endpoint_data *data,
bool modem_alloc) bool modem_alloc)
{ {
...@@ -1917,7 +1917,7 @@ static int gsi_channel_init(struct gsi *gsi, bool prefetch, u32 count, ...@@ -1917,7 +1917,7 @@ static int gsi_channel_init(struct gsi *gsi, bool prefetch, u32 count,
continue; continue;
} }
ret = gsi_channel_init_one(gsi, &data[i], command, prefetch); ret = gsi_channel_init_one(gsi, &data[i], command);
if (ret) if (ret)
goto err_unwind; goto err_unwind;
} }
...@@ -1962,17 +1962,15 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev, ...@@ -1962,17 +1962,15 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev,
resource_size_t size; resource_size_t size;
unsigned int irq; unsigned int irq;
bool modem_alloc; bool modem_alloc;
bool prefetch;
int ret; int ret;
gsi_validate_build(); gsi_validate_build();
/* IPA v4.0+ (GSI v2.0+) uses prefetch for the command channel */
prefetch = version != IPA_VERSION_3_5_1;
/* IPA v4.2 requires the AP to allocate channels for the modem */ /* IPA v4.2 requires the AP to allocate channels for the modem */
modem_alloc = version == IPA_VERSION_4_2; modem_alloc = version == IPA_VERSION_4_2;
gsi->dev = dev; gsi->dev = dev;
gsi->version = version;
/* The GSI layer performs NAPI on all endpoints. NAPI requires a /* The GSI layer performs NAPI on all endpoints. NAPI requires a
* network device structure, but the GSI layer does not have one, * network device structure, but the GSI layer does not have one,
...@@ -2016,7 +2014,7 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev, ...@@ -2016,7 +2014,7 @@ int gsi_init(struct gsi *gsi, struct platform_device *pdev,
goto err_free_irq; goto err_free_irq;
} }
ret = gsi_channel_init(gsi, prefetch, count, data, modem_alloc); ret = gsi_channel_init(gsi, count, data, modem_alloc);
if (ret) if (ret)
goto err_iounmap; goto err_iounmap;
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include "ipa_version.h"
/* Maximum number of channels and event rings supported by the driver */ /* Maximum number of channels and event rings supported by the driver */
#define GSI_CHANNEL_COUNT_MAX 17 #define GSI_CHANNEL_COUNT_MAX 17
#define GSI_EVT_RING_COUNT_MAX 13 #define GSI_EVT_RING_COUNT_MAX 13
...@@ -20,8 +22,6 @@ ...@@ -20,8 +22,6 @@
/* Maximum TLV FIFO size for a channel; 64 here is arbitrary (and high) */ /* Maximum TLV FIFO size for a channel; 64 here is arbitrary (and high) */
#define GSI_TLV_MAX 64 #define GSI_TLV_MAX 64
enum ipa_version;
struct device; struct device;
struct scatterlist; struct scatterlist;
struct platform_device; struct platform_device;
...@@ -109,7 +109,6 @@ struct gsi_channel { ...@@ -109,7 +109,6 @@ struct gsi_channel {
struct gsi *gsi; struct gsi *gsi;
bool toward_ipa; bool toward_ipa;
bool command; /* AP command TX channel or not */ bool command; /* AP command TX channel or not */
bool use_prefetch; /* use prefetch (else escape buf) */
u8 tlv_count; /* # entries in TLV FIFO */ u8 tlv_count; /* # entries in TLV FIFO */
u16 tre_count; u16 tre_count;
...@@ -149,6 +148,7 @@ struct gsi_evt_ring { ...@@ -149,6 +148,7 @@ struct gsi_evt_ring {
struct gsi { struct gsi {
struct device *dev; /* Same as IPA device */ struct device *dev; /* Same as IPA device */
enum ipa_version version;
struct net_device dummy_dev; /* needed for NAPI */ struct net_device dummy_dev; /* needed for NAPI */
void __iomem *virt; void __iomem *virt;
u32 irq; u32 irq;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment