···1818#include <drm/drmP.h>1919#include "psb_drv.h"2020#include "psb_reg.h"2121+#include "mmu.h"21222223/*2324 * Code for the SGX MMU:···4746 * If it fails, the caller need to insert the page using a workqueue function,4847 * but on average it should be fast.4948 */5050-5151-struct psb_mmu_driver {5252- /* protects driver- and pd structures. Always take in read mode5353- * before taking the page table spinlock.5454- */5555- struct rw_semaphore sem;5656-5757- /* protects page tables, directory tables and pt tables.5858- * and pt structures.5959- */6060- spinlock_t lock;6161-6262- atomic_t needs_tlbflush;6363- atomic_t *msvdx_mmu_invaldc;6464- struct psb_mmu_pd *default_pd;6565- uint32_t bif_ctrl;6666- int has_clflush;6767- int clflush_add;6868- unsigned long clflush_mask;6969-7070- struct drm_device *dev;7171-};7272-7373-struct psb_mmu_pd;7474-7575-struct psb_mmu_pt {7676- struct psb_mmu_pd *pd;7777- uint32_t index;7878- uint32_t count;7979- struct page *p;8080- uint32_t *v;8181-};8282-8383-struct psb_mmu_pd {8484- struct psb_mmu_driver *driver;8585- int hw_context;8686- struct psb_mmu_pt **tables;8787- struct page *p;8888- struct page *dummy_pt;8989- struct page *dummy_page;9090- uint32_t pd_mask;9191- uint32_t invalid_pde;9292- uint32_t invalid_pte;9393-};94499550static inline uint32_t psb_mmu_pt_index(uint32_t offset)9651{
+93
drivers/gpu/drm/gma500/mmu.h
···11+/**************************************************************************22+ * Copyright (c) 2007-2011, Intel Corporation.33+ * All Rights Reserved.44+ *55+ * This program is free software; you can redistribute it and/or modify it66+ * under the terms and conditions of the GNU General Public License,77+ * version 2, as published by the Free Software Foundation.88+ *99+ * This program is distributed in the hope it will be useful, but WITHOUT1010+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or1111+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for1212+ * more details.1313+ **************************************************************************/1414+1515+#ifndef __MMU_H1616+#define __MMU_H1717+1818+struct psb_mmu_driver {1919+ /* protects driver- and pd structures. Always take in read mode2020+ * before taking the page table spinlock.2121+ */2222+ struct rw_semaphore sem;2323+2424+ /* protects page tables, directory tables and pt tables.2525+ * and pt structures.2626+ */2727+ spinlock_t lock;2828+2929+ atomic_t needs_tlbflush;3030+ atomic_t *msvdx_mmu_invaldc;3131+ struct psb_mmu_pd *default_pd;3232+ uint32_t bif_ctrl;3333+ int has_clflush;3434+ int clflush_add;3535+ unsigned long clflush_mask;3636+3737+ struct drm_device *dev;3838+};3939+4040+struct psb_mmu_pd;4141+4242+struct psb_mmu_pt {4343+ struct psb_mmu_pd *pd;4444+ uint32_t index;4545+ uint32_t count;4646+ struct page *p;4747+ uint32_t *v;4848+};4949+5050+struct psb_mmu_pd {5151+ struct psb_mmu_driver *driver;5252+ int hw_context;5353+ struct psb_mmu_pt **tables;5454+ struct page *p;5555+ struct page *dummy_pt;5656+ struct page *dummy_page;5757+ uint32_t pd_mask;5858+ uint32_t invalid_pde;5959+ uint32_t invalid_pte;6060+};6161+6262+extern struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,6363+ int trap_pagefaults,6464+ int invalid_type,6565+ atomic_t *msvdx_mmu_invaldc);6666+extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver);6767+extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver6868+ *driver);6969+extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,7070+ int trap_pagefaults,7171+ int invalid_type);7272+extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd);7373+extern void psb_mmu_flush(struct psb_mmu_driver *driver);7474+extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,7575+ unsigned long address,7676+ uint32_t num_pages);7777+extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd,7878+ uint32_t start_pfn,7979+ unsigned long address,8080+ uint32_t num_pages, int type);8181+extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,8282+ unsigned long *pfn);8383+extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context);8484+extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,8585+ unsigned long address, uint32_t num_pages,8686+ uint32_t desired_tile_stride,8787+ uint32_t hw_tile_stride, int type);8888+extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd,8989+ unsigned long address, uint32_t num_pages,9090+ uint32_t desired_tile_stride,9191+ uint32_t hw_tile_stride);9292+9393+#endif
+1-44
drivers/gpu/drm/gma500/psb_drv.h
···3333#include "power.h"3434#include "opregion.h"3535#include "oaktrail.h"3636+#include "mmu.h"36373738/* Append new drm mode definition here, align with libdrm definition */3839#define DRM_MODE_SCALE_NO_SCALE 2···714713715714716715717717-struct psb_mmu_driver;718718-719716extern int drm_crtc_probe_output_modes(struct drm_device *dev, int, int);720717extern int drm_pick_crtcs(struct drm_device *dev);721718···722723 return (struct drm_psb_private *) dev->dev_private;723724}724725725725-/*726726- * MMU stuff.727727- */728728-729729-extern struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,730730- int trap_pagefaults,731731- int invalid_type,732732- atomic_t *msvdx_mmu_invaldc);733733-extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver);734734-extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver735735- *driver);736736-extern void psb_mmu_mirror_gtt(struct psb_mmu_pd *pd, uint32_t mmu_offset,737737- uint32_t gtt_start, uint32_t gtt_pages);738738-extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,739739- int trap_pagefaults,740740- int invalid_type);741741-extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd);742742-extern void psb_mmu_flush(struct psb_mmu_driver *driver);743743-extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,744744- unsigned long address,745745- uint32_t num_pages);746746-extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd,747747- uint32_t start_pfn,748748- unsigned long address,749749- uint32_t num_pages, int type);750750-extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,751751- unsigned long *pfn);752752-753753-/*754754- * Enable / disable MMU for different requestors.755755- */756756-757757-758758-extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context);759759-extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,760760- unsigned long address, uint32_t num_pages,761761- uint32_t desired_tile_stride,762762- uint32_t hw_tile_stride, int type);763763-extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd,764764- unsigned long address, uint32_t num_pages,765765- uint32_t desired_tile_stride,766766- uint32_t hw_tile_stride);767726/*768727 *psb_irq.c769728 */