forked from mirrors/linux
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**************************************************************************
 | 
						|
 * 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
 |