mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

In the case of iova fault triggered devcore dumps, include additional debug information based on what we think is the current page tables, including the TTBR0 value (which should match what we have in adreno_smmu_fault_info unless things have gone horribly wrong), and the pagetable entries traversed in the process of resolving the faulting iova. Signed-off-by: Rob Clark <robdclark@chromium.org> Patchwork: https://patchwork.freedesktop.org/patch/628117/
62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2013 Red Hat
|
|
* Author: Rob Clark <robdclark@gmail.com>
|
|
*/
|
|
|
|
#ifndef __MSM_MMU_H__
|
|
#define __MSM_MMU_H__
|
|
|
|
#include <linux/iommu.h>
|
|
|
|
struct msm_mmu_funcs {
|
|
void (*detach)(struct msm_mmu *mmu);
|
|
int (*map)(struct msm_mmu *mmu, uint64_t iova, struct sg_table *sgt,
|
|
size_t len, int prot);
|
|
int (*unmap)(struct msm_mmu *mmu, uint64_t iova, size_t len);
|
|
void (*destroy)(struct msm_mmu *mmu);
|
|
void (*resume_translation)(struct msm_mmu *mmu);
|
|
};
|
|
|
|
enum msm_mmu_type {
|
|
MSM_MMU_GPUMMU,
|
|
MSM_MMU_IOMMU,
|
|
MSM_MMU_IOMMU_PAGETABLE,
|
|
};
|
|
|
|
struct msm_mmu {
|
|
const struct msm_mmu_funcs *funcs;
|
|
struct device *dev;
|
|
int (*handler)(void *arg, unsigned long iova, int flags, void *data);
|
|
void *arg;
|
|
enum msm_mmu_type type;
|
|
};
|
|
|
|
static inline void msm_mmu_init(struct msm_mmu *mmu, struct device *dev,
|
|
const struct msm_mmu_funcs *funcs, enum msm_mmu_type type)
|
|
{
|
|
mmu->dev = dev;
|
|
mmu->funcs = funcs;
|
|
mmu->type = type;
|
|
}
|
|
|
|
struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks);
|
|
struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsigned long quirks);
|
|
struct msm_mmu *msm_iommu_disp_new(struct device *dev, unsigned long quirks);
|
|
|
|
static inline void msm_mmu_set_fault_handler(struct msm_mmu *mmu, void *arg,
|
|
int (*handler)(void *arg, unsigned long iova, int flags, void *data))
|
|
{
|
|
mmu->arg = arg;
|
|
mmu->handler = handler;
|
|
}
|
|
|
|
struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent);
|
|
|
|
int msm_iommu_pagetable_params(struct msm_mmu *mmu, phys_addr_t *ttbr,
|
|
int *asid);
|
|
int msm_iommu_pagetable_walk(struct msm_mmu *mmu, unsigned long iova, uint64_t ptes[4]);
|
|
struct iommu_domain_geometry *msm_iommu_get_geometry(struct msm_mmu *mmu);
|
|
|
|
#endif /* __MSM_MMU_H__ */
|