Commit 1d0c09de authored by Alex Elder's avatar Alex Elder Committed by Jakub Kicinski

net: ipa: expose IPA version to the GSI layer

Although GSI is integral to IPA, it is a separate hardware component
and the IPA code supporting it has been structured to avoid explicit
dependence on IPA details.  An example of this is that gsi_init() is
passed a number of Boolean flags to indicate special behaviors,
whose values are dependent on the IPA hardware version.  Looking
ahead, newer hardware versions would require even more such special
behaviors.

For any given version of IPA hardware (like 3.5.1 or 4.2), the GSI
hardware version is fixed (in this case, 1.3 and 2.2, respectively).
So the IPA version *implies* the GSI version, and the IPA version
can be used as effectively the equivalent of the GSI hardware version.

Rather than proliferating new special behavior flags, just provide
the IPA version to the GSI layer when it is initialized.  The GSI
code can then use that directly to determine whether special
behaviors are required.  The IPA version enumerated type is already
isolated to its own header file, so the exposure of this IPA detail
is very limited.

For now, just change gsi_init() to pass the version rather than the
Boolean flags, and set the flag values internal to that function.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3fb6928b
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "gsi_trans.h" #include "gsi_trans.h"
#include "ipa_gsi.h" #include "ipa_gsi.h"
#include "ipa_data.h" #include "ipa_data.h"
#include "ipa_version.h"
/** /**
* DOC: The IPA Generic Software Interface * DOC: The IPA Generic Software Interface
...@@ -1952,18 +1953,25 @@ static void gsi_channel_exit(struct gsi *gsi) ...@@ -1952,18 +1953,25 @@ static void gsi_channel_exit(struct gsi *gsi)
} }
/* Init function for GSI. GSI hardware does not need to be "ready" */ /* Init function for GSI. GSI hardware does not need to be "ready" */
int gsi_init(struct gsi *gsi, struct platform_device *pdev, bool prefetch, int gsi_init(struct gsi *gsi, struct platform_device *pdev,
u32 count, const struct ipa_gsi_endpoint_data *data, enum ipa_version version, u32 count,
bool modem_alloc) const struct ipa_gsi_endpoint_data *data)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
resource_size_t size; resource_size_t size;
unsigned int irq; unsigned int irq;
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 */
modem_alloc = version == IPA_VERSION_4_2;
gsi->dev = dev; gsi->dev = dev;
/* The GSI layer performs NAPI on all endpoints. NAPI requires a /* The GSI layer performs NAPI on all endpoints. NAPI requires a
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
/* 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;
...@@ -236,15 +238,18 @@ int gsi_channel_resume(struct gsi *gsi, u32 channel_id, bool start); ...@@ -236,15 +238,18 @@ int gsi_channel_resume(struct gsi *gsi, u32 channel_id, bool start);
* gsi_init() - Initialize the GSI subsystem * gsi_init() - Initialize the GSI subsystem
* @gsi: Address of GSI structure embedded in an IPA structure * @gsi: Address of GSI structure embedded in an IPA structure
* @pdev: IPA platform device * @pdev: IPA platform device
* @version: IPA hardware version (implies GSI version)
* @count: Number of entries in the configuration data array
* @data: Endpoint and channel configuration data
* *
* Return: 0 if successful, or a negative error code * Return: 0 if successful, or a negative error code
* *
* Early stage initialization of the GSI subsystem, performing tasks * Early stage initialization of the GSI subsystem, performing tasks
* that can be done before the GSI hardware is ready to use. * that can be done before the GSI hardware is ready to use.
*/ */
int gsi_init(struct gsi *gsi, struct platform_device *pdev, bool prefetch, int gsi_init(struct gsi *gsi, struct platform_device *pdev,
u32 count, const struct ipa_gsi_endpoint_data *data, enum ipa_version version, u32 count,
bool modem_alloc); const struct ipa_gsi_endpoint_data *data);
/** /**
* gsi_exit() - Exit the GSI subsystem * gsi_exit() - Exit the GSI subsystem
......
...@@ -723,10 +723,8 @@ static int ipa_probe(struct platform_device *pdev) ...@@ -723,10 +723,8 @@ static int ipa_probe(struct platform_device *pdev)
const struct ipa_data *data; const struct ipa_data *data;
struct ipa_clock *clock; struct ipa_clock *clock;
struct rproc *rproc; struct rproc *rproc;
bool modem_alloc;
bool modem_init; bool modem_init;
struct ipa *ipa; struct ipa *ipa;
bool prefetch;
phandle ph; phandle ph;
int ret; int ret;
...@@ -788,13 +786,8 @@ static int ipa_probe(struct platform_device *pdev) ...@@ -788,13 +786,8 @@ static int ipa_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_reg_exit; goto err_reg_exit;
/* GSI v2.0+ (IPA v4.0+) uses prefetch for the command channel */ ret = gsi_init(&ipa->gsi, pdev, ipa->version, data->endpoint_count,
prefetch = ipa->version != IPA_VERSION_3_5_1; data->endpoint_data);
/* IPA v4.2 requires the AP to allocate channels for the modem */
modem_alloc = ipa->version == IPA_VERSION_4_2;
ret = gsi_init(&ipa->gsi, pdev, prefetch, data->endpoint_count,
data->endpoint_data, modem_alloc);
if (ret) if (ret)
goto err_mem_exit; goto err_mem_exit;
......
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