|
@@ -0,0 +1,93 @@
|
|
|
+/**************************************************************************
|
|
|
+ * Copyright (c) 2007-2011, Intel Corporation.
|
|
|
+ * All Rights Reserved.
|
|
|
+ *
|
|
|
+ * This program is free software; you can redistribute it and/or modify it
|
|
|
+ * under the terms and conditions of the GNU General Public License,
|
|
|
+ * version 2, as published by the Free Software Foundation.
|
|
|
+ *
|
|
|
+ * This program is distributed in the hope it will be useful, but WITHOUT
|
|
|
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
+ * more details.
|
|
|
+ **************************************************************************/
|
|
|
+
|
|
|
+#ifndef __MMU_H
|
|
|
+#define __MMU_H
|
|
|
+
|
|
|
+struct psb_mmu_driver {
|
|
|
+ /* protects driver- and pd structures. Always take in read mode
|
|
|
+ * before taking the page table spinlock.
|
|
|
+ */
|
|
|
+ struct rw_semaphore sem;
|
|
|
+
|
|
|
+ /* protects page tables, directory tables and pt tables.
|
|
|
+ * and pt structures.
|
|
|
+ */
|
|
|
+ spinlock_t lock;
|
|
|
+
|
|
|
+ atomic_t needs_tlbflush;
|
|
|
+ atomic_t *msvdx_mmu_invaldc;
|
|
|
+ struct psb_mmu_pd *default_pd;
|
|
|
+ uint32_t bif_ctrl;
|
|
|
+ int has_clflush;
|
|
|
+ int clflush_add;
|
|
|
+ unsigned long clflush_mask;
|
|
|
+
|
|
|
+ struct drm_device *dev;
|
|
|
+};
|
|
|
+
|
|
|
+struct psb_mmu_pd;
|
|
|
+
|
|
|
+struct psb_mmu_pt {
|
|
|
+ struct psb_mmu_pd *pd;
|
|
|
+ uint32_t index;
|
|
|
+ uint32_t count;
|
|
|
+ struct page *p;
|
|
|
+ uint32_t *v;
|
|
|
+};
|
|
|
+
|
|
|
+struct psb_mmu_pd {
|
|
|
+ struct psb_mmu_driver *driver;
|
|
|
+ int hw_context;
|
|
|
+ struct psb_mmu_pt **tables;
|
|
|
+ struct page *p;
|
|
|
+ struct page *dummy_pt;
|
|
|
+ struct page *dummy_page;
|
|
|
+ uint32_t pd_mask;
|
|
|
+ uint32_t invalid_pde;
|
|
|
+ uint32_t invalid_pte;
|
|
|
+};
|
|
|
+
|
|
|
+extern struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
|
|
|
+ int trap_pagefaults,
|
|
|
+ int invalid_type,
|
|
|
+ atomic_t *msvdx_mmu_invaldc);
|
|
|
+extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver);
|
|
|
+extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver
|
|
|
+ *driver);
|
|
|
+extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,
|
|
|
+ int trap_pagefaults,
|
|
|
+ int invalid_type);
|
|
|
+extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd);
|
|
|
+extern void psb_mmu_flush(struct psb_mmu_driver *driver);
|
|
|
+extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
|
|
|
+ unsigned long address,
|
|
|
+ uint32_t num_pages);
|
|
|
+extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd,
|
|
|
+ uint32_t start_pfn,
|
|
|
+ unsigned long address,
|
|
|
+ uint32_t num_pages, int type);
|
|
|
+extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,
|
|
|
+ unsigned long *pfn);
|
|
|
+extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context);
|
|
|
+extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,
|
|
|
+ unsigned long address, uint32_t num_pages,
|
|
|
+ uint32_t desired_tile_stride,
|
|
|
+ uint32_t hw_tile_stride, int type);
|
|
|
+extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd,
|
|
|
+ unsigned long address, uint32_t num_pages,
|
|
|
+ uint32_t desired_tile_stride,
|
|
|
+ uint32_t hw_tile_stride);
|
|
|
+
|
|
|
+#endif
|