Skip to content

Commit

Permalink
soc: qcom: smd: Use correct remote processor ID
Browse files Browse the repository at this point in the history
This patch fixes SMEM addressing issues when remote processors need to use
secure SMEM partitions.

Signed-off-by: Andy Gross <[email protected]>
Reviewed-by: Bjorn Andersson <[email protected]>
  • Loading branch information
Andy Gross committed Sep 9, 2015
1 parent 1891280 commit 93dbed9
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
6 changes: 6 additions & 0 deletions Documentation/devicetree/bindings/soc/qcom/qcom,smd.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ The edge is described by the following properties:
Definition: the identifier of the remote processor in the smd channel
allocation table

- qcom,remote-pid:
Usage: optional
Value type: <u32>
Definition: the identifier for the remote processor as known by the rest
of the system.

= SMD DEVICES

In turn, subnodes of the "edges" represent devices tied to SMD channels on that
Expand Down
16 changes: 12 additions & 4 deletions drivers/soc/qcom/smd.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ static const struct {
* @smd: handle to qcom_smd
* @of_node: of_node handle for information related to this edge
* @edge_id: identifier of this edge
* @remote_pid: identifier of remote processor
* @irq: interrupt for signals on this edge
* @ipc_regmap: regmap handle holding the outgoing ipc register
* @ipc_offset: offset within @ipc_regmap of the register for ipc
Expand All @@ -111,6 +112,7 @@ struct qcom_smd_edge {
struct qcom_smd *smd;
struct device_node *of_node;
unsigned edge_id;
unsigned remote_pid;

int irq;

Expand Down Expand Up @@ -572,7 +574,7 @@ static irqreturn_t qcom_smd_edge_intr(int irq, void *data)
* have to scan if the amount of available space in smem have changed
* since last scan.
*/
available = qcom_smem_get_free_space(edge->edge_id);
available = qcom_smem_get_free_space(edge->remote_pid);
if (available != edge->smem_available) {
edge->smem_available = available;
edge->need_rescan = true;
Expand Down Expand Up @@ -976,7 +978,8 @@ static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *ed
spin_lock_init(&channel->recv_lock);
init_waitqueue_head(&channel->fblockread_event);

ret = qcom_smem_get(edge->edge_id, smem_info_item, (void **)&info, &info_size);
ret = qcom_smem_get(edge->remote_pid, smem_info_item, (void **)&info,
&info_size);
if (ret)
goto free_name_and_channel;

Expand All @@ -997,7 +1000,8 @@ static struct qcom_smd_channel *qcom_smd_create_channel(struct qcom_smd_edge *ed
goto free_name_and_channel;
}

ret = qcom_smem_get(edge->edge_id, smem_fifo_item, &fifo_base, &fifo_size);
ret = qcom_smem_get(edge->remote_pid, smem_fifo_item, &fifo_base,
&fifo_size);
if (ret)
goto free_name_and_channel;

Expand Down Expand Up @@ -1041,7 +1045,7 @@ static void qcom_discover_channels(struct qcom_smd_edge *edge)
int i;

for (tbl = 0; tbl < SMD_ALLOC_TBL_COUNT; tbl++) {
ret = qcom_smem_get(edge->edge_id,
ret = qcom_smem_get(edge->remote_pid,
smem_items[tbl].alloc_tbl_id,
(void **)&alloc_tbl,
NULL);
Expand Down Expand Up @@ -1184,6 +1188,10 @@ static int qcom_smd_parse_edge(struct device *dev,
return -EINVAL;
}

edge->remote_pid = QCOM_SMEM_HOST_ANY;
key = "qcom,remote-pid";
of_property_read_u32(node, key, &edge->remote_pid);

syscon_np = of_parse_phandle(node, "qcom,ipc", 0);
if (!syscon_np) {
dev_err(dev, "no qcom,ipc node\n");
Expand Down

0 comments on commit 93dbed9

Please sign in to comment.