diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-17 23:12:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-17 23:12:08 -0500 |
commit | bedf571986990046ddc4578e6378de146cf75b9e (patch) | |
tree | 60ceae16db9c3b5efbe8d53fab4ecf3499ccc1bb /drivers/rpmsg | |
parent | d9ef1ccf7cf1210d5ca49c652045bc03c97c8b59 (diff) | |
parent | 38a9acb3bb7b2561a08144ff80a292889f389a9b (diff) |
Merge tag 'rpmsg-v4.15' of git://github.com/andersson/remoteproc
Pull rpmsg updates from Bjorn Andersson:
- turn RPMSG_VIRTIO into a user selectable config
- fix few bugs in GLINK
- provide the support for specifying initial buffer sizes for GLINK
channels.
* tag 'rpmsg-v4.15' of git://github.com/andersson/remoteproc:
rpmsg: glink: The mbox client knows_txdone
rpmsg: glink: Add missing MODULE_LICENSE
rpmsg: glink: Use best fit intent during tx
rpmsg: glink: Add support to preallocate intents
dt-bindings: soc: qcom: Support GLINK intents
rpmsg: glink: Initialize the "intent_req_comp" completion variable
rpmsg: Allow RPMSG_VIRTIO to be enabled via menuconfig or defconfig
Diffstat (limited to 'drivers/rpmsg')
-rw-r--r-- | drivers/rpmsg/Kconfig | 3 | ||||
-rw-r--r-- | drivers/rpmsg/qcom_glink_native.c | 51 |
2 files changed, 42 insertions, 12 deletions
diff --git a/drivers/rpmsg/Kconfig b/drivers/rpmsg/Kconfig index 0fe6eac46512..65a9f6b892f0 100644 --- a/drivers/rpmsg/Kconfig +++ b/drivers/rpmsg/Kconfig | |||
@@ -47,7 +47,8 @@ config RPMSG_QCOM_SMD | |||
47 | platforms. | 47 | platforms. |
48 | 48 | ||
49 | config RPMSG_VIRTIO | 49 | config RPMSG_VIRTIO |
50 | tristate | 50 | tristate "Virtio RPMSG bus driver" |
51 | depends on HAS_DMA | ||
51 | select RPMSG | 52 | select RPMSG |
52 | select VIRTIO | 53 | select VIRTIO |
53 | 54 | ||
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 5dcc9bf1c5bc..40d76d2a5eff 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c | |||
@@ -227,6 +227,7 @@ static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink, | |||
227 | 227 | ||
228 | init_completion(&channel->open_req); | 228 | init_completion(&channel->open_req); |
229 | init_completion(&channel->open_ack); | 229 | init_completion(&channel->open_ack); |
230 | init_completion(&channel->intent_req_comp); | ||
230 | 231 | ||
231 | INIT_LIST_HEAD(&channel->done_intents); | 232 | INIT_LIST_HEAD(&channel->done_intents); |
232 | INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work); | 233 | INIT_WORK(&channel->intent_work, qcom_glink_rx_done_work); |
@@ -1148,19 +1149,38 @@ static struct rpmsg_endpoint *qcom_glink_create_ept(struct rpmsg_device *rpdev, | |||
1148 | static int qcom_glink_announce_create(struct rpmsg_device *rpdev) | 1149 | static int qcom_glink_announce_create(struct rpmsg_device *rpdev) |
1149 | { | 1150 | { |
1150 | struct glink_channel *channel = to_glink_channel(rpdev->ept); | 1151 | struct glink_channel *channel = to_glink_channel(rpdev->ept); |
1151 | struct glink_core_rx_intent *intent; | 1152 | struct device_node *np = rpdev->dev.of_node; |
1152 | struct qcom_glink *glink = channel->glink; | 1153 | struct qcom_glink *glink = channel->glink; |
1153 | int num_intents = glink->intentless ? 0 : 5; | 1154 | struct glink_core_rx_intent *intent; |
1155 | const struct property *prop = NULL; | ||
1156 | __be32 defaults[] = { cpu_to_be32(SZ_1K), cpu_to_be32(5) }; | ||
1157 | int num_intents; | ||
1158 | int num_groups = 1; | ||
1159 | __be32 *val = defaults; | ||
1160 | int size; | ||
1161 | |||
1162 | if (glink->intentless) | ||
1163 | return 0; | ||
1164 | |||
1165 | prop = of_find_property(np, "qcom,intents", NULL); | ||
1166 | if (prop) { | ||
1167 | val = prop->value; | ||
1168 | num_groups = prop->length / sizeof(u32) / 2; | ||
1169 | } | ||
1154 | 1170 | ||
1155 | /* Channel is now open, advertise base set of intents */ | 1171 | /* Channel is now open, advertise base set of intents */ |
1156 | while (num_intents--) { | 1172 | while (num_groups--) { |
1157 | intent = qcom_glink_alloc_intent(glink, channel, SZ_1K, true); | 1173 | size = be32_to_cpup(val++); |
1158 | if (!intent) | 1174 | num_intents = be32_to_cpup(val++); |
1159 | break; | 1175 | while (num_intents--) { |
1176 | intent = qcom_glink_alloc_intent(glink, channel, size, | ||
1177 | true); | ||
1178 | if (!intent) | ||
1179 | break; | ||
1160 | 1180 | ||
1161 | qcom_glink_advertise_intent(glink, channel, intent); | 1181 | qcom_glink_advertise_intent(glink, channel, intent); |
1182 | } | ||
1162 | } | 1183 | } |
1163 | |||
1164 | return 0; | 1184 | return 0; |
1165 | } | 1185 | } |
1166 | 1186 | ||
@@ -1237,11 +1257,16 @@ static int __qcom_glink_send(struct glink_channel *channel, | |||
1237 | spin_lock_irqsave(&channel->intent_lock, flags); | 1257 | spin_lock_irqsave(&channel->intent_lock, flags); |
1238 | idr_for_each_entry(&channel->riids, tmp, iid) { | 1258 | idr_for_each_entry(&channel->riids, tmp, iid) { |
1239 | if (tmp->size >= len && !tmp->in_use) { | 1259 | if (tmp->size >= len && !tmp->in_use) { |
1240 | tmp->in_use = true; | 1260 | if (!intent) |
1241 | intent = tmp; | 1261 | intent = tmp; |
1242 | break; | 1262 | else if (intent->size > tmp->size) |
1263 | intent = tmp; | ||
1264 | if (intent->size == len) | ||
1265 | break; | ||
1243 | } | 1266 | } |
1244 | } | 1267 | } |
1268 | if (intent) | ||
1269 | intent->in_use = true; | ||
1245 | spin_unlock_irqrestore(&channel->intent_lock, flags); | 1270 | spin_unlock_irqrestore(&channel->intent_lock, flags); |
1246 | 1271 | ||
1247 | /* We found an available intent */ | 1272 | /* We found an available intent */ |
@@ -1551,6 +1576,7 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev, | |||
1551 | idr_init(&glink->rcids); | 1576 | idr_init(&glink->rcids); |
1552 | 1577 | ||
1553 | glink->mbox_client.dev = dev; | 1578 | glink->mbox_client.dev = dev; |
1579 | glink->mbox_client.knows_txdone = true; | ||
1554 | glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0); | 1580 | glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0); |
1555 | if (IS_ERR(glink->mbox_chan)) { | 1581 | if (IS_ERR(glink->mbox_chan)) { |
1556 | if (PTR_ERR(glink->mbox_chan) != -EPROBE_DEFER) | 1582 | if (PTR_ERR(glink->mbox_chan) != -EPROBE_DEFER) |
@@ -1616,3 +1642,6 @@ void qcom_glink_native_unregister(struct qcom_glink *glink) | |||
1616 | device_unregister(glink->dev); | 1642 | device_unregister(glink->dev); |
1617 | } | 1643 | } |
1618 | EXPORT_SYMBOL_GPL(qcom_glink_native_unregister); | 1644 | EXPORT_SYMBOL_GPL(qcom_glink_native_unregister); |
1645 | |||
1646 | MODULE_DESCRIPTION("Qualcomm GLINK driver"); | ||
1647 | MODULE_LICENSE("GPL v2"); | ||