mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
rpmsg updates for v4.14
This extends the Qualcomm GLINK implementation to support the additional features used for communicating with modem and DSP coprocessors in modern Qualcomm platforms. In addition to this there's support for placing virtio RPMSG buffers in non-System RAM. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJZswd9AAoJEAsfOT8Nma3FSigQALyq2wNtf60tkTKW0f2K8cM6 JpnEKAKqO1t5ZkokEevT05PLT4rqXuidrDVOBJ3VQ7LtSqJOiTjGyN9YM8t+WBVG ts0Yg69+wUxBATg9iM2JiUsKn8gH8swUAtf16dmkL/Ca8BJKOHGYTUjADfwuFrEg EAGcLZnlwz736xdo9qZu/Ke9rItz6CDOD3AphbpJbcv7Wj2F/mEuqMZjfLk+1Mo8 C3wXx9jIzW1siNtT0OY9raUNV5gLaGS2zZ+DYwrwjND7Eh0TqeLxyJ1OS7f2kOZ5 P6zcrYw02WbDVW7LUzVegj5PejZm/wdFZ5hSvishEfZZVT+wGHBK34mfObe0moJZ Wp8jFSXKqECIEU3x/2DtPAHi+mittDpQ3FCkElWKJRD6B3HTySHjvM0lOor+zYKB gRX4QUR6jwkSRAbV6GP24Z8SL9kU6TXOSoOQvuzuKhB30JzADJPuQnGZR0SftYiH YJG/RT9FklbljWP9hIgey3QPNHPoL3IzNBU2iyEjdraabmNaFEb++wpLdpCZdnGf 1HMLrMfUmd3QKRtXvT+5Q6CjnfzwFk1ii1naN3Ky9rar3WRtij5bzo8eveR8i9ag DtWA88N9mnpSUao14o5vKN830q3/fkwW6HyT0nCd59Wq94cMNfiMdFPVXvO0xVAF mjP4JXHbqNhdJySWR4Du =PVGN -----END PGP SIGNATURE----- Merge tag 'rpmsg-v4.14' of git://github.com/andersson/remoteproc Pull rpmsg updates from Bjorn Andersson: "This extends the Qualcomm GLINK implementation to support the additional features used for communicating with modem and DSP coprocessors in modern Qualcomm platforms. In addition to this there's support for placing virtio RPMSG buffers in non-System RAM" * tag 'rpmsg-v4.14' of git://github.com/andersson/remoteproc: (29 commits) rpmsg: glink: initialize ret to zero to ensure error status check is correct rpmsg: glink: fix null pointer dereference on a null intent dt-bindings: soc: qcom: Extend GLINK to cover SMEM remoteproc: qcom: adsp: Allow defining GLINK edge rpmsg: glink: Export symbols from common code rpmsg: glink: Release idr lock before returning on error rpmsg: glink: Handle remote rx done command rpmsg: glink: Request for intents when unavailable rpmsg: glink: Use the intents passed by remote rpmsg: glink: Receive and store the remote intent buffers rpmsg: glink: Add announce_create ops and preallocate intents rpmsg: glink: Add rx done command rpmsg: glink: Make RX FIFO peak accessor to take an offset rpmsg: glink: Use the local intents when receiving data rpmsg: glink: Add support for TX intents rpmsg: glink: Fix idr_lock from mutex to spinlock rpmsg: glink: Add support for transport version negotiation rpmsg: glink: Introduce glink smem based transport rpmsg: glink: Do a mbox_free_channel in remove rpmsg: glink: Return -EAGAIN when there is no FIFO space ...
This commit is contained in:
commit
7151202b64
16 changed files with 2210 additions and 971 deletions
|
|
@ -92,6 +92,7 @@ config QCOM_ADSP_PIL
|
|||
depends on OF && ARCH_QCOM
|
||||
depends on QCOM_SMEM
|
||||
depends on RPMSG_QCOM_SMD || (COMPILE_TEST && RPMSG_QCOM_SMD=n)
|
||||
depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n
|
||||
select MFD_SYSCON
|
||||
select QCOM_MDT_LOADER
|
||||
select QCOM_RPROC_COMMON
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ struct qcom_adsp {
|
|||
void *mem_region;
|
||||
size_t mem_size;
|
||||
|
||||
struct qcom_rproc_glink glink_subdev;
|
||||
struct qcom_rproc_subdev smd_subdev;
|
||||
struct qcom_rproc_ssr ssr_subdev;
|
||||
};
|
||||
|
|
@ -400,6 +401,7 @@ static int adsp_probe(struct platform_device *pdev)
|
|||
goto free_rproc;
|
||||
}
|
||||
|
||||
qcom_add_glink_subdev(rproc, &adsp->glink_subdev);
|
||||
qcom_add_smd_subdev(rproc, &adsp->smd_subdev);
|
||||
qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name);
|
||||
|
||||
|
|
@ -422,6 +424,7 @@ static int adsp_remove(struct platform_device *pdev)
|
|||
qcom_smem_state_put(adsp->state);
|
||||
rproc_del(adsp->rproc);
|
||||
|
||||
qcom_remove_glink_subdev(adsp->rproc, &adsp->glink_subdev);
|
||||
qcom_remove_smd_subdev(adsp->rproc, &adsp->smd_subdev);
|
||||
qcom_remove_ssr_subdev(adsp->rproc, &adsp->ssr_subdev);
|
||||
rproc_free(adsp->rproc);
|
||||
|
|
|
|||
|
|
@ -20,11 +20,13 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/remoteproc.h>
|
||||
#include <linux/rpmsg/qcom_glink.h>
|
||||
#include <linux/rpmsg/qcom_smd.h>
|
||||
|
||||
#include "remoteproc_internal.h"
|
||||
#include "qcom_common.h"
|
||||
|
||||
#define to_glink_subdev(d) container_of(d, struct qcom_rproc_glink, subdev)
|
||||
#define to_smd_subdev(d) container_of(d, struct qcom_rproc_subdev, subdev)
|
||||
#define to_ssr_subdev(d) container_of(d, struct qcom_rproc_ssr, subdev)
|
||||
|
||||
|
|
@ -49,6 +51,53 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_mdt_find_rsc_table);
|
||||
|
||||
static int glink_subdev_probe(struct rproc_subdev *subdev)
|
||||
{
|
||||
struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
|
||||
|
||||
glink->edge = qcom_glink_smem_register(glink->dev, glink->node);
|
||||
|
||||
return IS_ERR(glink->edge) ? PTR_ERR(glink->edge) : 0;
|
||||
}
|
||||
|
||||
static void glink_subdev_remove(struct rproc_subdev *subdev)
|
||||
{
|
||||
struct qcom_rproc_glink *glink = to_glink_subdev(subdev);
|
||||
|
||||
qcom_glink_smem_unregister(glink->edge);
|
||||
glink->edge = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* qcom_add_glink_subdev() - try to add a GLINK subdevice to rproc
|
||||
* @rproc: rproc handle to parent the subdevice
|
||||
* @glink: reference to a GLINK subdev context
|
||||
*/
|
||||
void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink)
|
||||
{
|
||||
struct device *dev = &rproc->dev;
|
||||
|
||||
glink->node = of_get_child_by_name(dev->parent->of_node, "glink-edge");
|
||||
if (!glink->node)
|
||||
return;
|
||||
|
||||
glink->dev = dev;
|
||||
rproc_add_subdev(rproc, &glink->subdev, glink_subdev_probe, glink_subdev_remove);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_add_glink_subdev);
|
||||
|
||||
/**
|
||||
* qcom_remove_glink_subdev() - remove a GLINK subdevice from rproc
|
||||
* @rproc: rproc handle
|
||||
* @glink: reference to a GLINK subdev context
|
||||
*/
|
||||
void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink)
|
||||
{
|
||||
rproc_remove_subdev(rproc, &glink->subdev);
|
||||
of_node_put(glink->node);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_remove_glink_subdev);
|
||||
|
||||
static int smd_subdev_probe(struct rproc_subdev *subdev)
|
||||
{
|
||||
struct qcom_rproc_subdev *smd = to_smd_subdev(subdev);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,14 @@
|
|||
#include <linux/remoteproc.h>
|
||||
#include "remoteproc_internal.h"
|
||||
|
||||
struct qcom_rproc_glink {
|
||||
struct rproc_subdev subdev;
|
||||
|
||||
struct device *dev;
|
||||
struct device_node *node;
|
||||
struct qcom_glink *edge;
|
||||
};
|
||||
|
||||
struct qcom_rproc_subdev {
|
||||
struct rproc_subdev subdev;
|
||||
|
||||
|
|
@ -22,6 +30,9 @@ struct resource_table *qcom_mdt_find_rsc_table(struct rproc *rproc,
|
|||
const struct firmware *fw,
|
||||
int *tablesz);
|
||||
|
||||
void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
|
||||
void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
|
||||
|
||||
void qcom_add_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
|
||||
void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue