Loading drivers/char/adsprpc.c +24 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ #define TZ_PIL_CLEAR_PROTECT_MEM_SUBSYS_ID 0x0D #define TZ_PIL_AUTH_QDSP6_PROC 1 #define ADSP_MMAP_HEAP_ADDR 4 #define FASTRPC_ENOSUCH 39 #define RPC_TIMEOUT (5 * HZ) #define BALIGN 128 Loading Loading @@ -146,6 +147,7 @@ struct fastrpc_smmu { struct dma_iommu_mapping *mapping; int cb; int enabled; int faults; }; struct fastrpc_session_ctx { Loading Loading @@ -1171,6 +1173,10 @@ static int fastrpc_internal_invoke(struct fastrpc_file *fl, uint32_t mode, &ctx)); if (err) goto bail; if (fl->sctx->smmu.faults) err = FASTRPC_ENOSUCH; if (err) goto bail; if (ctx) goto wait; } Loading Loading @@ -1607,6 +1613,7 @@ static int fastrpc_session_alloc(struct fastrpc_channel_ctx *chan, int *session) if (err) goto bail; set_bit(idx, &chan->bitmap); chan->session[idx].smmu.faults = 0; *session = idx; bail: return err; Loading Loading @@ -1810,6 +1817,21 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb, return NOTIFY_DONE; } static int fastrpc_smmu_fault_handler(struct iommu_domain *domain, struct device *dev, unsigned long iova, int flags, void *token) { struct fastrpc_session_ctx *sess = (struct fastrpc_session_ctx *)token; int err = 0; VERIFY(err, sess != NULL); if (err) return err; sess->smmu.faults++; dev_err(dev, "ADSPRPC context fault: iova=0x%08lx, cb = %d, faults=%d", iova, sess->smmu.cb, sess->smmu.faults); return 0; } static const struct file_operations fops = { .open = fastrpc_device_open, .release = fastrpc_device_release, Loading Loading @@ -1864,6 +1886,8 @@ static int fastrpc_cb_probe(struct device *dev) iommu_domain_set_attr(sess->smmu.mapping->domain, DOMAIN_ATTR_COHERENT_HTW_DISABLE, &disable_htw); iommu_set_fault_handler(sess->smmu.mapping->domain, fastrpc_smmu_fault_handler, sess); VERIFY(err, !arm_iommu_attach_device(dev, sess->smmu.mapping)); if (err) goto bail; Loading Loading
drivers/char/adsprpc.c +24 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ #define TZ_PIL_CLEAR_PROTECT_MEM_SUBSYS_ID 0x0D #define TZ_PIL_AUTH_QDSP6_PROC 1 #define ADSP_MMAP_HEAP_ADDR 4 #define FASTRPC_ENOSUCH 39 #define RPC_TIMEOUT (5 * HZ) #define BALIGN 128 Loading Loading @@ -146,6 +147,7 @@ struct fastrpc_smmu { struct dma_iommu_mapping *mapping; int cb; int enabled; int faults; }; struct fastrpc_session_ctx { Loading Loading @@ -1171,6 +1173,10 @@ static int fastrpc_internal_invoke(struct fastrpc_file *fl, uint32_t mode, &ctx)); if (err) goto bail; if (fl->sctx->smmu.faults) err = FASTRPC_ENOSUCH; if (err) goto bail; if (ctx) goto wait; } Loading Loading @@ -1607,6 +1613,7 @@ static int fastrpc_session_alloc(struct fastrpc_channel_ctx *chan, int *session) if (err) goto bail; set_bit(idx, &chan->bitmap); chan->session[idx].smmu.faults = 0; *session = idx; bail: return err; Loading Loading @@ -1810,6 +1817,21 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb, return NOTIFY_DONE; } static int fastrpc_smmu_fault_handler(struct iommu_domain *domain, struct device *dev, unsigned long iova, int flags, void *token) { struct fastrpc_session_ctx *sess = (struct fastrpc_session_ctx *)token; int err = 0; VERIFY(err, sess != NULL); if (err) return err; sess->smmu.faults++; dev_err(dev, "ADSPRPC context fault: iova=0x%08lx, cb = %d, faults=%d", iova, sess->smmu.cb, sess->smmu.faults); return 0; } static const struct file_operations fops = { .open = fastrpc_device_open, .release = fastrpc_device_release, Loading Loading @@ -1864,6 +1886,8 @@ static int fastrpc_cb_probe(struct device *dev) iommu_domain_set_attr(sess->smmu.mapping->domain, DOMAIN_ATTR_COHERENT_HTW_DISABLE, &disable_htw); iommu_set_fault_handler(sess->smmu.mapping->domain, fastrpc_smmu_fault_handler, sess); VERIFY(err, !arm_iommu_attach_device(dev, sess->smmu.mapping)); if (err) goto bail; Loading