123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2020 VeriSilicon Holdings Co., Ltd.
- */
- #ifndef _VS_DC_MMU_H_
- #define _VS_DC_MMU_H_
- #include "vs_type.h"
- #define DC_INFINITE ((u32)(~0U))
- #define DC_ENTRY_TYPE(x) (x & 0xF0)
- #define DC_SINGLE_PAGE_NODE_INITIALIZE (~((1U << 8) - 1))
- #define DC_INVALID_PHYSICAL_ADDRESS ~0ULL
- #define DC_INVALID_ADDRESS ~0U
- /* 1k mode */
- #define MMU_MTLB_SHIFT 24
- #define MMU_STLB_4K_SHIFT 12
- #define MMU_MTLB_BITS (32 - MMU_MTLB_SHIFT)
- #define MMU_PAGE_4K_BITS MMU_STLB_4K_SHIFT
- #define MMU_STLB_4K_BITS (32 - MMU_MTLB_BITS - MMU_PAGE_4K_BITS)
- #define MMU_MTLB_ENTRY_NUM (1 << MMU_MTLB_BITS)
- #define MMU_MTLB_SIZE (MMU_MTLB_ENTRY_NUM << 2)
- #define MMU_STLB_4K_ENTRY_NUM (1 << MMU_STLB_4K_BITS)
- #define MMU_STLB_4K_SIZE (MMU_STLB_4K_ENTRY_NUM << 2)
- #define MMU_PAGE_4K_SIZE (1 << MMU_STLB_4K_SHIFT)
- #define MMU_MTLB_MASK (~((1U << MMU_MTLB_SHIFT)-1))
- #define MMU_STLB_4K_MASK ((~0U << MMU_STLB_4K_SHIFT) ^ MMU_MTLB_MASK)
- #define MMU_PAGE_4K_MASK (MMU_PAGE_4K_SIZE - 1)
- /* page offset definitions. */
- #define MMU_OFFSET_4K_BITS (32 - MMU_MTLB_BITS - MMU_STLB_4K_BITS)
- #define MMU_OFFSET_4K_MASK ((1U << MMU_OFFSET_4K_BITS) - 1)
- #define MMU_MTLB_PRESENT 0x00000001
- #define MMU_MTLB_EXCEPTION 0x00000002
- #define MMU_MTLB_SECURITY 0x00000010
- #define MMU_MTLB_4K_PAGE 0x00000000
- typedef enum _dc_mmu_type
- {
- DC_MMU_USED = (0 << 4),
- DC_MMU_SINGLE = (1 << 4),
- DC_MMU_FREE = (2 << 4),
- }
- dc_mmu_type;
- typedef enum _dc_mmu_mode
- {
- MMU_MODE_1K,
- MMU_MODE_4K,
- }
- dc_mmu_mode;
- typedef struct _dc_mmu_stlb
- {
- u32 *logical;
- void *physical;
- u32 size;
- u64 physBase;
- u32 pageCount;
- }
- dc_mmu_stlb, *dc_mmu_stlb_pt;
- typedef struct _dc_mmu {
- u32 mtlb_bytes;
- u64 mtlb_physical;
- u32 *mtlb_logical;
- void *safe_page_logical;
- u64 safe_page_physical;
- u32 dynamic_mapping_start;
- void *stlbs;
- u64 stlb_physicals[MMU_MTLB_ENTRY_NUM];
- u32 page_table_entries;
- u32 page_table_size;
- u32 heap_list;
- u32 *map_logical;
- bool free_nodes;
- void *page_table_mutex;
- dc_mmu_mode mode;
- void *static_stlb;
- }
- dc_mmu, *dc_mmu_pt;
- int dc_mmu_construct(struct device *dev, dc_mmu_pt *mmu);
- int dc_mmu_map_memory(dc_mmu_pt mmu, u64 physical, u32 page_count,
- u32 *address, bool continuous, bool security);
- int dc_mmu_unmap_memory(dc_mmu_pt mmu, u32 gpu_address, u32 page_count);
- #endif /* _VS_DC_MMU_H_ */
|