1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /************************************************************************** 3*4882a593Smuzhiyun * Copyright (c) 2007-2008, Intel Corporation. 4*4882a593Smuzhiyun * All Rights Reserved. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun **************************************************************************/ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _PSB_GTT_H_ 9*4882a593Smuzhiyun #define _PSB_GTT_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <drm/drm_gem.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* This wants cleaning up with respect to the psb_dev and un-needed stuff */ 14*4882a593Smuzhiyun struct psb_gtt { 15*4882a593Smuzhiyun uint32_t gatt_start; 16*4882a593Smuzhiyun uint32_t mmu_gatt_start; 17*4882a593Smuzhiyun uint32_t gtt_start; 18*4882a593Smuzhiyun uint32_t gtt_phys_start; 19*4882a593Smuzhiyun unsigned gtt_pages; 20*4882a593Smuzhiyun unsigned gatt_pages; 21*4882a593Smuzhiyun unsigned long stolen_size; 22*4882a593Smuzhiyun unsigned long vram_stolen_size; 23*4882a593Smuzhiyun struct rw_semaphore sem; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Exported functions */ 27*4882a593Smuzhiyun extern int psb_gtt_init(struct drm_device *dev, int resume); 28*4882a593Smuzhiyun extern void psb_gtt_takedown(struct drm_device *dev); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* Each gtt_range describes an allocation in the GTT area */ 31*4882a593Smuzhiyun struct gtt_range { 32*4882a593Smuzhiyun struct resource resource; /* Resource for our allocation */ 33*4882a593Smuzhiyun u32 offset; /* GTT offset of our object */ 34*4882a593Smuzhiyun struct drm_gem_object gem; /* GEM high level stuff */ 35*4882a593Smuzhiyun int in_gart; /* Currently in the GART (ref ct) */ 36*4882a593Smuzhiyun bool stolen; /* Backed from stolen RAM */ 37*4882a593Smuzhiyun bool mmapping; /* Is mmappable */ 38*4882a593Smuzhiyun struct page **pages; /* Backing pages if present */ 39*4882a593Smuzhiyun int npage; /* Number of backing pages */ 40*4882a593Smuzhiyun int roll; /* Roll applied to the GTT entries */ 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define to_gtt_range(x) container_of(x, struct gtt_range, gem) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun extern struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, 46*4882a593Smuzhiyun const char *name, int backed, 47*4882a593Smuzhiyun u32 align); 48*4882a593Smuzhiyun extern void psb_gtt_kref_put(struct gtt_range *gt); 49*4882a593Smuzhiyun extern void psb_gtt_free_range(struct drm_device *dev, struct gtt_range *gt); 50*4882a593Smuzhiyun extern int psb_gtt_pin(struct gtt_range *gt); 51*4882a593Smuzhiyun extern void psb_gtt_unpin(struct gtt_range *gt); 52*4882a593Smuzhiyun extern void psb_gtt_roll(struct drm_device *dev, 53*4882a593Smuzhiyun struct gtt_range *gt, int roll); 54*4882a593Smuzhiyun extern int psb_gtt_restore(struct drm_device *dev); 55*4882a593Smuzhiyun #endif 56