drm/msm: add evtlog and fault handler to smmu
Add eventt log to map and unmap to capture smmu sequence.
Add fault handler to dump eventlog in case of smmu fault.
CRs-Fixed: 2046593
Change-Id: Ie51757a0730d87b5395e859e44d361bd59e858ba
Signed-off-by: Alan Kwong <akwong@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/msm_smmu.c b/drivers/gpu/drm/msm/msm_smmu.c
index 4d45898..7fbcff4 100644
--- a/drivers/gpu/drm/msm/msm_smmu.c
+++ b/drivers/gpu/drm/msm/msm_smmu.c
@@ -27,6 +27,7 @@
#include "msm_drv.h"
#include "msm_gem.h"
#include "msm_mmu.h"
+#include "sde_dbg.h"
#ifndef SZ_4G
#define SZ_4G (((size_t) SZ_1G) * 4)
@@ -238,6 +239,13 @@
return -ENOMEM;
}
+ if (sgt && sgt->sgl) {
+ DRM_DEBUG("%pad/0x%x/0x%x/0x%lx\n", &sgt->sgl->dma_address,
+ sgt->sgl->dma_length, dir, attrs);
+ SDE_EVT32(sgt->sgl->dma_address, sgt->sgl->dma_length,
+ dir, attrs);
+ }
+
return 0;
}
@@ -248,6 +256,12 @@
struct msm_smmu *smmu = to_msm_smmu(mmu);
struct msm_smmu_client *client = msm_smmu_to_client(smmu);
+ if (sgt && sgt->sgl) {
+ DRM_DEBUG("%pad/0x%x/0x%x\n", &sgt->sgl->dma_address,
+ sgt->sgl->dma_length, dir);
+ SDE_EVT32(sgt->sgl->dma_address, sgt->sgl->dma_length, dir);
+ }
+
msm_dma_unmap_sg(client->dev, sgt->sgl, sgt->nents, dir, dma_buf);
}
@@ -386,6 +400,37 @@
return &smmu->base;
}
+static int msm_smmu_fault_handler(struct iommu_domain *domain,
+ struct device *dev, unsigned long iova,
+ int flags, void *token)
+{
+ struct msm_smmu_client *client;
+ int rc = -EINVAL;
+
+ if (!token) {
+ DRM_ERROR("Error: token is NULL\n");
+ return -EINVAL;
+ }
+
+ client = (struct msm_smmu_client *)token;
+
+ /* see iommu.h for fault flags definition */
+ SDE_EVT32(iova, flags);
+ DRM_ERROR("trigger dump, iova=0x%08lx, flags=0x%x\n", iova, flags);
+ DRM_ERROR("SMMU device:%s", client->dev ? client->dev->kobj.name : "");
+
+ /* generate dump, but no panic */
+ SDE_DBG_DUMP("sde", "dsi0_ctrl", "dsi0_phy", "dsi1_ctrl",
+ "dsi1_phy", "vbif", "dbg_bus",
+ "vbif_dbg_bus");
+
+ /*
+ * return -ENOSYS to allow smmu driver to dump out useful
+ * debug info.
+ */
+ return rc;
+}
+
static int _msm_smmu_create_mapping(struct msm_smmu_client *client,
const struct msm_smmu_domain *domain)
{
@@ -411,6 +456,9 @@
}
}
+ iommu_set_fault_handler(client->mmu_mapping->domain,
+ msm_smmu_fault_handler, (void *)client);
+
DRM_INFO("Created domain %s [%zx,%zx] secure=%d\n",
domain->label, domain->va_start, domain->va_size,
domain->secure);
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
index 1657b9b..08a9c2f 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c
@@ -342,8 +342,20 @@
hw_wb->ops.setup_cdp(hw_wb, cdp_cfg);
}
- if (hw_wb->ops.setup_outaddress)
+ if (hw_wb->ops.setup_outaddress) {
+ SDE_EVT32(hw_wb->idx,
+ wb_cfg->dest.width,
+ wb_cfg->dest.height,
+ wb_cfg->dest.plane_addr[0],
+ wb_cfg->dest.plane_size[0],
+ wb_cfg->dest.plane_addr[1],
+ wb_cfg->dest.plane_size[1],
+ wb_cfg->dest.plane_addr[2],
+ wb_cfg->dest.plane_size[2],
+ wb_cfg->dest.plane_addr[3],
+ wb_cfg->dest.plane_size[3]);
hw_wb->ops.setup_outaddress(hw_wb, wb_cfg);
+ }
}
/**
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index 8941a54..06a4837 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -788,9 +788,22 @@
SDE_DEBUG_PLANE(psde, "not updating same src addrs\n");
else if (ret)
SDE_ERROR_PLANE(psde, "failed to get format layout, %d\n", ret);
- else if (psde->pipe_hw->ops.setup_sourceaddress)
+ else if (psde->pipe_hw->ops.setup_sourceaddress) {
+ SDE_EVT32(psde->pipe_hw->idx,
+ pipe_cfg->layout.width,
+ pipe_cfg->layout.height,
+ pipe_cfg->layout.plane_addr[0],
+ pipe_cfg->layout.plane_size[0],
+ pipe_cfg->layout.plane_addr[1],
+ pipe_cfg->layout.plane_size[1],
+ pipe_cfg->layout.plane_addr[2],
+ pipe_cfg->layout.plane_size[2],
+ pipe_cfg->layout.plane_addr[3],
+ pipe_cfg->layout.plane_size[3],
+ pstate->multirect_index);
psde->pipe_hw->ops.setup_sourceaddress(psde->pipe_hw, pipe_cfg,
pstate->multirect_index);
+ }
}
static int _sde_plane_setup_scaler3_lut(struct sde_plane *psde,