2020-08-03 16:25:15 +02:00
/*
* Copyright 2020 Advanced Micro Devices , Inc .
*
* 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 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 COPYRIGHT HOLDER ( S ) OR AUTHOR ( S ) 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 .
*
* Authors : Christian König
*/
# include <drm/ttm/ttm_resource.h>
# include <drm/ttm/ttm_bo_driver.h>
int ttm_resource_alloc ( struct ttm_buffer_object * bo ,
const struct ttm_place * place ,
struct ttm_resource * res )
{
struct ttm_resource_manager * man =
ttm_manager_type ( bo - > bdev , res - > mem_type ) ;
res - > mm_node = NULL ;
if ( ! man - > func | | ! man - > func - > alloc )
return 0 ;
return man - > func - > alloc ( man , bo , place , res ) ;
}
void ttm_resource_free ( struct ttm_buffer_object * bo , struct ttm_resource * res )
{
struct ttm_resource_manager * man =
ttm_manager_type ( bo - > bdev , res - > mem_type ) ;
if ( man - > func & & man - > func - > free )
man - > func - > free ( man , res ) ;
res - > mm_node = NULL ;
res - > mem_type = TTM_PL_SYSTEM ;
}
EXPORT_SYMBOL ( ttm_resource_free ) ;
/**
* ttm_resource_manager_init
*
* @ man : memory manager object to init
* @ p_size : size managed area in pages .
*
* Initialise core parts of a manager object .
*/
void ttm_resource_manager_init ( struct ttm_resource_manager * man ,
unsigned long p_size )
{
unsigned i ;
spin_lock_init ( & man - > move_lock ) ;
man - > size = p_size ;
for ( i = 0 ; i < TTM_MAX_BO_PRIORITY ; + + i )
INIT_LIST_HEAD ( & man - > lru [ i ] ) ;
man - > move = NULL ;
}
EXPORT_SYMBOL ( ttm_resource_manager_init ) ;
/*
2020-10-01 15:21:00 +02:00
* ttm_resource_manager_evict_all
2020-08-03 16:25:15 +02:00
*
* @ bdev - device to use
* @ man - manager to use
*
2020-10-01 15:21:00 +02:00
* Evict all the objects out of a memory manager until it is empty .
2020-08-03 16:25:15 +02:00
* Part of memory manager cleanup sequence .
*/
2020-10-01 14:51:40 +02:00
int ttm_resource_manager_evict_all ( struct ttm_device * bdev ,
2020-10-01 15:21:00 +02:00
struct ttm_resource_manager * man )
2020-08-03 16:25:15 +02:00
{
struct ttm_operation_ctx ctx = {
. interruptible = false ,
. no_wait_gpu = false ,
2020-11-02 13:16:13 +01:00
. force_alloc = true
2020-08-03 16:25:15 +02:00
} ;
struct dma_fence * fence ;
int ret ;
unsigned i ;
/*
* Can ' t use standard list traversal since we ' re unlocking .
*/
2020-10-06 17:26:42 +02:00
spin_lock ( & bdev - > lru_lock ) ;
2020-08-03 16:25:15 +02:00
for ( i = 0 ; i < TTM_MAX_BO_PRIORITY ; + + i ) {
while ( ! list_empty ( & man - > lru [ i ] ) ) {
2020-10-06 17:26:42 +02:00
spin_unlock ( & bdev - > lru_lock ) ;
2020-08-03 16:25:15 +02:00
ret = ttm_mem_evict_first ( bdev , man , NULL , & ctx ,
NULL ) ;
if ( ret )
return ret ;
2020-10-06 17:26:42 +02:00
spin_lock ( & bdev - > lru_lock ) ;
2020-08-03 16:25:15 +02:00
}
}
2020-10-06 17:26:42 +02:00
spin_unlock ( & bdev - > lru_lock ) ;
2020-08-03 16:25:15 +02:00
spin_lock ( & man - > move_lock ) ;
fence = dma_fence_get ( man - > move ) ;
spin_unlock ( & man - > move_lock ) ;
if ( fence ) {
ret = dma_fence_wait ( fence , false ) ;
dma_fence_put ( fence ) ;
if ( ret )
return ret ;
}
return 0 ;
}
2020-10-01 15:21:00 +02:00
EXPORT_SYMBOL ( ttm_resource_manager_evict_all ) ;
2020-08-03 16:25:15 +02:00
/**
* ttm_resource_manager_debug
*
* @ man : manager type to dump .
* @ p : printer to use for debug .
*/
void ttm_resource_manager_debug ( struct ttm_resource_manager * man ,
struct drm_printer * p )
{
drm_printf ( p , " use_type: %d \n " , man - > use_type ) ;
drm_printf ( p , " use_tt: %d \n " , man - > use_tt ) ;
drm_printf ( p , " size: %llu \n " , man - > size ) ;
if ( man - > func & & man - > func - > debug )
( * man - > func - > debug ) ( man , p ) ;
}
EXPORT_SYMBOL ( ttm_resource_manager_debug ) ;