blob: d5671e86b1ea1101df7e4d7874f0094684fd1b8f [file]
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2021 MediaTek Inc.
*
*/
#ifndef _MTK_DMABUFHEAP_DEBUG_H
#define _MTK_DMABUFHEAP_DEBUG_H
#include <linux/dma-heap.h>
#include <linux/dma-buf.h>
#include <linux/dma-resv.h>
#include <linux/seq_file.h>
#include <linux/sched/clock.h>
#include <dt-bindings/memory/mtk-memory-port.h>
#define DUMP_INFO_LEN_MAX (400)
/* Bit map */
#define HEAP_DUMP_SKIP_ATTACH (1 << 0)
#define HEAP_DUMP_SKIP_RB_DUMP (1 << 1)
#define HEAP_DUMP_HEAP_SKIP_POOL (1 << 2)
#define HEAP_DUMP_STATS (1 << 3)
#define HEAP_DUMP_DEC_1_REF (1 << 4)
#define HEAP_DUMP_OOM (1 << 5)
#define dmabuf_dump(file, fmt, args...) \
do { \
if (file) \
seq_printf(file, fmt, ##args); \
else \
pr_info(fmt, ##args); \
} while (0)
/* mtk_heap private info, used for dump */
struct mtk_heap_priv_info {
/* used for heap dump */
void (*show)(struct dma_heap *heap, void *seq_file, int flag);
/* used for buffer dump */
int (*buf_priv_dump)(const struct dma_buf *dmabuf,
struct dma_heap *heap,
void *seq_file);
};
struct dma_heap_attachment {
struct device *dev;
struct sg_table *table;
struct list_head list;
bool mapped;
bool uncached;
};
struct mtk_heap_dev_info {
struct device *dev;
enum dma_data_direction direction;
unsigned long map_attrs;
};
/* common function */
void dmabuf_release_check(const struct dma_buf *dmabuf)
{
dma_addr_t iova = 0x0;
const char *device_name = NULL;
int attach_cnt = 0;
struct dma_buf_attachment *attach_obj;
if (!dma_resv_trylock(dmabuf->resv)) {
/* get lock fail, maybe is using, skip check */
return;
}
/* Don't dump inode number here, it will cause KASAN issue !! */
if (WARN(!list_empty(&dmabuf->attachments),
"%s: size:%-8ld dbg_name:%s exp:%s, %s\n", __func__,
dmabuf->size,
dmabuf->name,
dmabuf->exp_name,
"Release dmabuf before detach all attachments, dump attach below:")) {
/* dump all attachment info */
list_for_each_entry(attach_obj, &dmabuf->attachments, node) {
iova = (dma_addr_t)0;
attach_cnt++;
if (attach_obj->sgt && dev_iommu_fwspec_get(attach_obj->dev))
iova = sg_dma_address(attach_obj->sgt->sgl);
device_name = dev_name(attach_obj->dev);
dmabuf_dump(NULL,
"attach[%d]: iova:0x%-12lx attr:%-4lx dir:%-2d dev:%s\n",
attach_cnt, iova,
attach_obj->dma_map_attrs,
attach_obj->dir,
device_name);
}
dmabuf_dump(NULL, "Total %d devices attached\n\n", attach_cnt);
}
dma_resv_unlock(dmabuf->resv);
}
#endif /* _MTK_DMABUFHEAP_DEBUG_H */