+
struct fastrpc_phy_page {
u64 addr; /* physical or dma address */
u64 size; /* size of contiguous region */
@@ -257,6 +265,10 @@ struct fastrpc_session_ctx {
bool valid;
};
+struct fastrpc_soc_data {
+ u32 sid_pos;
+};
+
struct fastrpc_channel_ctx {
int domain_id;
int sesscount;
@@ -278,6 +290,7 @@ struct fastrpc_channel_ctx {
bool secure;
bool unsigned_support;
u64 dma_mask;
+ const struct fastrpc_soc_data *soc_data;
};
struct fastrpc_device {
@@ -390,7 +403,7 @@ static int fastrpc_map_lookup(struct fastrpc_user *fl, int
fd,
static void fastrpc_buf_free(struct fastrpc_buf *buf)
{
dma_free_coherent(buf->dev, buf->size, buf->virt,
- FASTRPC_PHYS(buf->dma_addr));
+ IPA_TO_DMA_ADDR(buf->dma_addr,
buf->fl->cctx->soc_data->sid_pos));
kfree(buf);
}
@@ -440,7 +453,8 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
buf = *obuf;
if (fl->sctx && fl->sctx->sid)
- buf->dma_addr += ((u64)fl->sctx->sid << 32);
+ IOVA_FROM_SID_PA((u64)fl->sctx->sid, buf->dma_addr,
+ fl->cctx->soc_data->sid_pos);
return 0;
}
@@ -685,7 +699,8 @@ static int fastrpc_dma_buf_attach(struct dma_buf *dmabuf,
return -ENOMEM;
ret = dma_get_sgtable(buffer->dev, &a->sgt, buffer->virt,
- FASTRPC_PHYS(buffer->dma_addr), buffer->size);
+ IPA_TO_DMA_ADDR(buffer->dma_addr,
+ buffer->fl->cctx->soc_data->sid_pos),
buffer->size);
if (ret < 0) {
dev_err(buffer->dev, "failed to get scatterlist from DMA
API\n");
kfree(a);
@@ -734,7 +749,8 @@ static int fastrpc_mmap(struct dma_buf *dmabuf,
dma_resv_assert_held(dmabuf->resv);
return dma_mmap_coherent(buf->dev, vma, buf->virt,
- FASTRPC_PHYS(buf->dma_addr), size);
+ IPA_TO_DMA_ADDR(buf->dma_addr,
+ buf->fl->cctx->soc_data->sid_pos), size);
}
static const struct dma_buf_ops fastrpc_dma_buf_ops = {
@@ -789,7 +805,8 @@ static int fastrpc_map_attach(struct fastrpc_user *fl, int
fd,
map->dma_addr = sg_phys(map->table->sgl);
} else {
map->dma_addr = sg_dma_address(map->table->sgl);
- map->dma_addr += ((u64)fl->sctx->sid << 32);
+ IOVA_FROM_SID_PA((u64)fl->sctx->sid,
+ map->dma_addr, fl->cctx->soc_data->sid_pos);
}
for_each_sg(map->table->sgl, sgl, map->table->nents,
sgl_index)
@@ -2289,6 +2306,14 @@ static int fastrpc_get_domain_id(const char *domain)
return -EINVAL;
}
+static const struct fastrpc_soc_data kaanapali_soc_data = {
+ .sid_pos = 56,
+};
+
+static const struct fastrpc_soc_data default_soc_data = {
+ .sid_pos = 32,
+};
+
static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
{
struct device *rdev = &rpdev->dev;
@@ -2297,6 +2322,11 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device
*rpdev)
const char *domain;
bool secure_dsp;
unsigned int vmids[FASTRPC_MAX_VMIDS];
+ const struct fastrpc_soc_data *soc_data = NULL;
+
+ soc_data = device_get_match_data(rdev);
+ if (!soc_data)
+ soc_data = &default_soc_data;
err = of_property_read_string(rdev->of_node, "label", &domain);
if (err) {
@@ -2349,6 +2379,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
data->secure = secure_dsp;
+ data->soc_data = soc_data;
switch (domain_id) {
case ADSP_DOMAIN_ID:
@@ -2486,7 +2517,8 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device
*rpdev, void *data,
}
static const struct of_device_id fastrpc_rpmsg_of_match[] = {
- { .compatible = "qcom,fastrpc" },
+ { .compatible = "qcom,kaanapali-fastrpc", .data = &kaanapali_soc_data },
+ { .compatible = "qcom,fastrpc", .data = &default_soc_data },
{ },
};
MODULE_DEVICE_TABLE(of, fastrpc_rpmsg_of_match);
--
2.34.1