2018-02-22 09:23:44 +01:00
/**************************************************************************
*
* Copyright ( c ) 2006 - 2009 Vmware , Inc . , Palo Alto , CA . , USA
* All Rights Reserved .
*
* 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 , sub license , 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 NON - INFRINGEMENT . IN NO EVENT SHALL
* THE COPYRIGHT HOLDERS , AUTHORS AND / OR ITS SUPPLIERS 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 .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef _TTM_TT_H_
# define _TTM_TT_H_
# include <linux/types.h>
2020-09-30 10:38:48 +02:00
# include <drm/ttm/ttm_caching.h>
2018-02-22 09:23:44 +01:00
struct ttm_tt ;
2020-08-04 12:56:32 +10:00
struct ttm_resource ;
2018-02-22 09:23:44 +01:00
struct ttm_buffer_object ;
struct ttm_operation_ctx ;
# define TTM_PAGE_FLAG_SWAPPED (1 << 4)
# define TTM_PAGE_FLAG_ZERO_ALLOC (1 << 6)
# define TTM_PAGE_FLAG_DMA32 (1 << 7)
# define TTM_PAGE_FLAG_SG (1 << 8)
# define TTM_PAGE_FLAG_NO_RETRY (1 << 9)
2020-09-15 11:47:19 +10:00
# define TTM_PAGE_FLAG_PRIV_POPULATED (1 << 31)
2018-02-22 09:23:44 +01:00
/**
* struct ttm_tt
*
* @ pages : Array of pages backing the data .
* @ num_pages : Number of pages in the page array .
* @ bdev : Pointer to the current struct ttm_bo_device .
* @ be : Pointer to the ttm backend .
* @ swap_storage : Pointer to shmem struct file for swap storage .
* @ caching_state : The current caching state of the pages .
* @ state : The current binding state of the pages .
*
* This is a structure holding the pages , caching - and aperture binding
* status for a buffer object that isn ' t backed by fixed ( VRAM / AGP )
* memory .
*/
struct ttm_tt {
struct page * * pages ;
uint32_t page_flags ;
2020-10-20 20:10:39 +02:00
uint32_t num_pages ;
2018-02-22 09:23:44 +01:00
struct sg_table * sg ; /* for SG objects via dma-buf */
struct file * swap_storage ;
2020-09-30 10:38:48 +02:00
enum ttm_caching caching ;
2018-02-22 09:23:44 +01:00
} ;
2020-09-15 10:21:15 +10:00
static inline bool ttm_tt_is_populated ( struct ttm_tt * tt )
{
2020-09-15 11:47:19 +10:00
return tt - > page_flags & TTM_PAGE_FLAG_PRIV_POPULATED ;
2020-09-15 10:21:15 +10:00
}
2018-02-22 09:23:44 +01:00
/**
* struct ttm_dma_tt
*
* @ ttm : Base ttm_tt struct .
* @ dma_address : The DMA ( bus ) addresses of the pages
* @ pages_list : used by some page allocation backend
*
* This is a structure holding the pages , caching - and aperture binding
* status for a buffer object that isn ' t backed by fixed ( VRAM / AGP )
* memory .
*/
struct ttm_dma_tt {
struct ttm_tt ttm ;
dma_addr_t * dma_address ;
struct list_head pages_list ;
} ;
/**
* ttm_tt_create
*
* @ bo : pointer to a struct ttm_buffer_object
* @ zero_alloc : true if allocated pages needs to be zeroed
*
* Make sure we have a TTM structure allocated for the given BO .
* No pages are actually allocated .
*/
int ttm_tt_create ( struct ttm_buffer_object * bo , bool zero_alloc ) ;
/**
* ttm_tt_init
*
* @ ttm : The struct ttm_tt .
2018-02-22 10:18:14 +01:00
* @ bo : The buffer object we create the ttm for .
2018-02-22 09:23:44 +01:00
* @ page_flags : Page flags as identified by TTM_PAGE_FLAG_XX flags .
2020-09-30 10:38:48 +02:00
* @ caching : the desired caching state of the pages
2018-02-22 09:23:44 +01:00
*
* Create a struct ttm_tt to back data with system memory pages .
* No pages are actually allocated .
* Returns :
* NULL : Out of memory .
*/
2018-02-22 10:18:14 +01:00
int ttm_tt_init ( struct ttm_tt * ttm , struct ttm_buffer_object * bo ,
2020-09-30 10:38:48 +02:00
uint32_t page_flags , enum ttm_caching caching ) ;
2018-02-22 10:18:14 +01:00
int ttm_dma_tt_init ( struct ttm_dma_tt * ttm_dma , struct ttm_buffer_object * bo ,
2020-09-30 10:38:48 +02:00
uint32_t page_flags , enum ttm_caching caching ) ;
2018-02-22 10:18:14 +01:00
int ttm_sg_tt_init ( struct ttm_dma_tt * ttm_dma , struct ttm_buffer_object * bo ,
2020-09-30 10:38:48 +02:00
uint32_t page_flags , enum ttm_caching caching ) ;
2018-02-22 09:23:44 +01:00
/**
* ttm_tt_fini
*
* @ ttm : the ttm_tt structure .
*
* Free memory of ttm_tt structure
*/
void ttm_tt_fini ( struct ttm_tt * ttm ) ;
void ttm_dma_tt_fini ( struct ttm_dma_tt * ttm_dma ) ;
/**
* ttm_ttm_destroy :
*
* @ ttm : The struct ttm_tt .
*
* Unbind , unpopulate and destroy common struct ttm_tt .
*/
2020-08-25 09:46:00 +10:00
void ttm_tt_destroy ( struct ttm_bo_device * bdev , struct ttm_tt * ttm ) ;
2018-02-22 09:23:44 +01:00
2020-09-17 13:20:48 +10:00
/**
* ttm_tt_destroy_common :
*
* Called from driver to destroy common path .
*/
void ttm_tt_destroy_common ( struct ttm_bo_device * bdev , struct ttm_tt * ttm ) ;
2018-02-22 09:23:44 +01:00
/**
* ttm_tt_swapin :
*
* @ ttm : The struct ttm_tt .
*
* Swap in a previously swap out ttm_tt .
*/
int ttm_tt_swapin ( struct ttm_tt * ttm ) ;
2020-09-17 13:27:35 +02:00
int ttm_tt_swapout ( struct ttm_bo_device * bdev , struct ttm_tt * ttm ) ;
2018-02-22 09:23:44 +01:00
/**
* ttm_tt_populate - allocate pages for a ttm
*
* @ ttm : Pointer to the ttm_tt structure
*
* Calls the driver method to allocate pages for a ttm
*/
2020-08-25 09:46:00 +10:00
int ttm_tt_populate ( struct ttm_bo_device * bdev , struct ttm_tt * ttm , struct ttm_operation_ctx * ctx ) ;
2018-02-22 09:23:44 +01:00
/**
* ttm_tt_unpopulate - free pages from a ttm
*
* @ ttm : Pointer to the ttm_tt structure
*
* Calls the driver method to free all pages from a ttm
*/
2020-08-25 09:46:00 +10:00
void ttm_tt_unpopulate ( struct ttm_bo_device * bdev , struct ttm_tt * ttm ) ;
2018-02-22 09:23:44 +01:00
# if IS_ENABLED(CONFIG_AGP)
# include <linux/agp_backend.h>
/**
* ttm_agp_tt_create
*
2018-02-22 10:18:14 +01:00
* @ bo : Buffer object we allocate the ttm for .
2018-02-22 09:23:44 +01:00
* @ bridge : The agp bridge this device is sitting on .
* @ page_flags : Page flags as identified by TTM_PAGE_FLAG_XX flags .
*
*
* Create a TTM backend that uses the indicated AGP bridge as an aperture
* for TT memory . This function uses the linux agpgart interface to
* bind and unbind memory backing a ttm_tt .
*/
2018-02-22 10:18:14 +01:00
struct ttm_tt * ttm_agp_tt_create ( struct ttm_buffer_object * bo ,
2018-02-22 09:23:44 +01:00
struct agp_bridge_data * bridge ,
2018-02-22 10:18:14 +01:00
uint32_t page_flags ) ;
2020-09-08 06:46:29 +10:00
int ttm_agp_bind ( struct ttm_tt * ttm , struct ttm_resource * bo_mem ) ;
void ttm_agp_unbind ( struct ttm_tt * ttm ) ;
void ttm_agp_destroy ( struct ttm_tt * ttm ) ;
2020-09-17 12:54:24 +10:00
bool ttm_agp_is_bound ( struct ttm_tt * ttm ) ;
2018-02-22 09:23:44 +01:00
# endif
# endif