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