2010-11-05 22:23:30 +01:00
/*
* Copyright © 2010 Daniel Vetter
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
* FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE .
*
*/
# include "drmP.h"
# include "drm.h"
# include "i915_drm.h"
# include "i915_drv.h"
# include "i915_trace.h"
# include "intel_drv.h"
void i915_gem_restore_gtt_mappings ( struct drm_device * dev )
{
struct drm_i915_private * dev_priv = dev - > dev_private ;
2010-11-08 19:18:58 +00:00
struct drm_i915_gem_object * obj ;
2010-11-05 22:23:30 +01:00
2010-11-08 19:18:58 +00:00
list_for_each_entry ( obj , & dev_priv - > mm . gtt_list , gtt_list ) {
2010-12-08 14:28:54 +00:00
i915_gem_clflush_object ( obj ) ;
2010-11-06 12:12:35 +01:00
if ( dev_priv - > mm . gtt - > needs_dmar ) {
2010-11-08 19:18:58 +00:00
BUG_ON ( ! obj - > sg_list ) ;
2010-11-06 12:12:35 +01:00
2010-11-08 19:18:58 +00:00
intel_gtt_insert_sg_entries ( obj - > sg_list ,
obj - > num_sg ,
obj - > gtt_space - > start
2010-11-06 12:12:35 +01:00
> > PAGE_SHIFT ,
2010-11-08 19:18:58 +00:00
obj - > agp_type ) ;
2010-11-06 12:12:35 +01:00
} else
2010-11-08 19:18:58 +00:00
intel_gtt_insert_pages ( obj - > gtt_space - > start
2010-11-06 12:12:35 +01:00
> > PAGE_SHIFT ,
2010-11-08 19:18:58 +00:00
obj - > base . size > > PAGE_SHIFT ,
obj - > pages ,
obj - > agp_type ) ;
2010-11-05 22:23:30 +01:00
}
intel_gtt_chipset_flush ( ) ;
}
2010-11-06 10:10:47 +01:00
2010-11-08 19:18:58 +00:00
int i915_gem_gtt_bind_object ( struct drm_i915_gem_object * obj )
2010-11-06 10:10:47 +01:00
{
2010-11-08 19:18:58 +00:00
struct drm_device * dev = obj - > base . dev ;
2010-11-06 12:12:35 +01:00
struct drm_i915_private * dev_priv = dev - > dev_private ;
int ret ;
2010-11-06 10:10:47 +01:00
2010-11-06 12:12:35 +01:00
if ( dev_priv - > mm . gtt - > needs_dmar ) {
2010-11-08 19:18:58 +00:00
ret = intel_gtt_map_memory ( obj - > pages ,
obj - > base . size > > PAGE_SHIFT ,
& obj - > sg_list ,
& obj - > num_sg ) ;
2010-11-06 12:12:35 +01:00
if ( ret ! = 0 )
return ret ;
2010-11-08 19:18:58 +00:00
intel_gtt_insert_sg_entries ( obj - > sg_list ,
obj - > num_sg ,
obj - > gtt_space - > start > > PAGE_SHIFT ,
obj - > agp_type ) ;
2010-11-06 12:12:35 +01:00
} else
2010-11-08 19:18:58 +00:00
intel_gtt_insert_pages ( obj - > gtt_space - > start > > PAGE_SHIFT ,
obj - > base . size > > PAGE_SHIFT ,
obj - > pages ,
obj - > agp_type ) ;
2010-11-06 10:10:47 +01:00
2010-11-06 12:12:35 +01:00
return 0 ;
2010-11-06 10:10:47 +01:00
}
2010-11-08 19:18:58 +00:00
void i915_gem_gtt_unbind_object ( struct drm_i915_gem_object * obj )
2010-11-06 10:10:47 +01:00
{
2011-01-11 11:07:54 +00:00
intel_gtt_clear_range ( obj - > gtt_space - > start > > PAGE_SHIFT ,
obj - > base . size > > PAGE_SHIFT ) ;
2010-11-06 10:10:47 +01:00
2011-01-11 11:07:54 +00:00
if ( obj - > sg_list ) {
2010-11-08 19:18:58 +00:00
intel_gtt_unmap_memory ( obj - > sg_list , obj - > num_sg ) ;
obj - > sg_list = NULL ;
2010-11-06 12:12:35 +01:00
}
2010-11-06 10:10:47 +01:00
}