^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /**************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2007-2011, Intel Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) **************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef __MMU_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define __MMU_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct psb_mmu_driver {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /* protects driver- and pd structures. Always take in read mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * before taking the page table spinlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct rw_semaphore sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* protects page tables, directory tables and pt tables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * and pt structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) atomic_t needs_tlbflush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) atomic_t *msvdx_mmu_invaldc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct psb_mmu_pd *default_pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) uint32_t bif_ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) int has_clflush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) int clflush_add;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) unsigned long clflush_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct drm_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct psb_mmu_pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct psb_mmu_pt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct psb_mmu_pd *pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) uint32_t index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) uint32_t count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct page *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) uint32_t *v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct psb_mmu_pd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct psb_mmu_driver *driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) int hw_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct psb_mmu_pt **tables;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct page *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct page *dummy_pt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct page *dummy_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) uint32_t pd_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) uint32_t invalid_pde;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) uint32_t invalid_pte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) extern struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int trap_pagefaults,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) int invalid_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) atomic_t *msvdx_mmu_invaldc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) *driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int trap_pagefaults,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) int invalid_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) extern void psb_mmu_flush(struct psb_mmu_driver *driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) unsigned long address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) uint32_t num_pages);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) uint32_t start_pfn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) unsigned long address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) uint32_t num_pages, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) unsigned long *pfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unsigned long address, uint32_t num_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) uint32_t desired_tile_stride,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) uint32_t hw_tile_stride, int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned long address, uint32_t num_pages,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) uint32_t desired_tile_stride,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) uint32_t hw_tile_stride);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #endif