mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 18:30:06 +00:00
![Jacek Lawrynowicz](/assets/img/avatar_default.png)
VPU Memory Management Unit is based on ARM MMU-600. It allows the creation of multiple virtual address spaces for the device and map noncontinuous host memory (there is no dedicated memory on the VPU). Address space is implemented as a struct ivpu_mmu_context, it has an ID, drm_mm allocator for VPU addresses and struct ivpu_mmu_pgtable that holds actual 3-level, 4KB page table. Context with ID 0 (global context) is created upon driver initialization and it's mainly used for mapping memory required to execute the firmware. Contexts with non-zero IDs are user contexts allocated each time the devices is open()-ed and they map command buffers and other workload-related memory. Workloads executing in a given contexts have access only to the memory mapped in this context. This patch is has two main files: - ivpu_mmu_context.c handles MMU page tables and memory mapping - ivpu_mmu.c implements a driver that programs the MMU device Co-developed-by: Karol Wachowski <karol.wachowski@linux.intel.com> Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com> Co-developed-by: Krystian Pradzynski <krystian.pradzynski@linux.intel.com> Signed-off-by: Krystian Pradzynski <krystian.pradzynski@linux.intel.com> Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com> Reviewed-by: Oded Gabbay <ogabbay@kernel.org> Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20230117092723.60441-3-jacek.lawrynowicz@linux.intel.com
50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2020-2023 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __IVPU_MMU_H__
|
|
#define __IVPU_MMU_H__
|
|
|
|
struct ivpu_device;
|
|
|
|
struct ivpu_mmu_cdtab {
|
|
void *base;
|
|
dma_addr_t dma;
|
|
};
|
|
|
|
struct ivpu_mmu_strtab {
|
|
void *base;
|
|
dma_addr_t dma;
|
|
u64 dma_q;
|
|
u32 base_cfg;
|
|
};
|
|
|
|
struct ivpu_mmu_queue {
|
|
void *base;
|
|
dma_addr_t dma;
|
|
u64 dma_q;
|
|
u32 prod;
|
|
u32 cons;
|
|
};
|
|
|
|
struct ivpu_mmu_info {
|
|
struct mutex lock; /* Protects cdtab, strtab, cmdq, on */
|
|
struct ivpu_mmu_cdtab cdtab;
|
|
struct ivpu_mmu_strtab strtab;
|
|
struct ivpu_mmu_queue cmdq;
|
|
struct ivpu_mmu_queue evtq;
|
|
bool on;
|
|
};
|
|
|
|
int ivpu_mmu_init(struct ivpu_device *vdev);
|
|
void ivpu_mmu_disable(struct ivpu_device *vdev);
|
|
int ivpu_mmu_enable(struct ivpu_device *vdev);
|
|
int ivpu_mmu_set_pgtable(struct ivpu_device *vdev, int ssid, struct ivpu_mmu_pgtable *pgtable);
|
|
void ivpu_mmu_clear_pgtable(struct ivpu_device *vdev, int ssid);
|
|
int ivpu_mmu_invalidate_tlb(struct ivpu_device *vdev, u16 ssid);
|
|
|
|
void ivpu_mmu_irq_evtq_handler(struct ivpu_device *vdev);
|
|
void ivpu_mmu_irq_gerr_handler(struct ivpu_device *vdev);
|
|
|
|
#endif /* __IVPU_MMU_H__ */
|