2006-08-07 15:30:28 +04:00
/**************************************************************************
*
* Copyright 2006 Tungsten Graphics , Inc . , Bismarck , ND . , 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 .
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Simple memory MANager interface that keeps track on allocate regions on a
* per " owner " basis . All regions associated with an " owner " can be released
* with a simple call . Typically if the " owner " exists . The owner is any
* " unsigned long " identifier . Can typically be a pointer to a file private
* struct or a context identifier .
*
* Authors :
2007-10-20 01:21:04 +04:00
* Thomas Hellström < thomas - at - tungstengraphics - dot - com >
2006-08-07 15:30:28 +04:00
*/
# ifndef DRM_SMAN_H
# define DRM_SMAN_H
# include "drmP.h"
# include "drm_hashtab.h"
/*
* A class that is an abstration of a simple memory allocator .
* The sman implementation provides a default such allocator
* using the drm_mm . c implementation . But the user can replace it .
* See the SiS implementation , which may use the SiS FB kernel module
* for memory management .
*/
2007-07-12 04:21:05 +04:00
struct drm_sman_mm {
2006-08-07 15:30:28 +04:00
/* private info. If allocated, needs to be destroyed by the destroy
function */
void * private ;
/* Allocate a memory block with given size and alignment.
Return an opaque reference to the memory block */
void * ( * allocate ) ( void * private , unsigned long size ,
unsigned alignment ) ;
/* Free a memory block. "ref" is the opaque reference that we got from
the " alloc " function */
void ( * free ) ( void * private , void * ref ) ;
/* Free all resources associated with this allocator */
void ( * destroy ) ( void * private ) ;
/* Return a memory offset from the opaque reference returned from the
" alloc " function */
unsigned long ( * offset ) ( void * private , void * ref ) ;
2007-07-12 04:21:05 +04:00
} ;
2006-08-07 15:30:28 +04:00
2007-07-12 04:21:05 +04:00
struct drm_memblock_item {
2006-08-07 15:30:28 +04:00
struct list_head owner_list ;
2007-07-12 04:26:44 +04:00
struct drm_hash_item user_hash ;
2006-08-07 15:30:28 +04:00
void * mm_info ;
2007-07-12 04:21:05 +04:00
struct drm_sman_mm * mm ;
2006-08-07 15:30:28 +04:00
struct drm_sman * sman ;
2007-07-12 04:21:05 +04:00
} ;
2006-08-07 15:30:28 +04:00
2007-07-12 04:21:05 +04:00
struct drm_sman {
struct drm_sman_mm * mm ;
2006-08-07 15:30:28 +04:00
int num_managers ;
2007-07-12 04:26:44 +04:00
struct drm_open_hash owner_hash_tab ;
struct drm_open_hash user_hash_tab ;
2006-08-07 15:30:28 +04:00
struct list_head owner_items ;
2007-07-12 04:21:05 +04:00
} ;
2006-08-07 15:30:28 +04:00
/*
* Take down a memory manager . This function should only be called after a
* successful init and after a call to drm_sman_cleanup .
*/
2007-07-12 04:21:05 +04:00
extern void drm_sman_takedown ( struct drm_sman * sman ) ;
2006-08-07 15:30:28 +04:00
/*
* Allocate structures for a manager .
* num_managers are the number of memory pools to manage . ( VRAM , AGP , . . . . )
* user_order is the log2 of the number of buckets in the user hash table .
* set this to approximately log2 of the max number of memory regions
* that will be allocated for _all_ pools together .
* owner_order is the log2 of the number of buckets in the owner hash table .
* set this to approximately log2 of
* the number of client file connections that will
* be using the manager .
*
*/
2007-07-12 04:21:05 +04:00
extern int drm_sman_init ( struct drm_sman * sman , unsigned int num_managers ,
2006-08-07 15:30:28 +04:00
unsigned int user_order , unsigned int owner_order ) ;
/*
* Initialize a drm_mm . c allocator . Should be called only once for each
* manager unless a customized allogator is used .
*/
2007-07-12 04:21:05 +04:00
extern int drm_sman_set_range ( struct drm_sman * sman , unsigned int manager ,
2006-08-07 15:30:28 +04:00
unsigned long start , unsigned long size ) ;
/*
* Initialize a customized allocator for one of the managers .
* ( See the SiS module ) . The object pointed to by " allocator " is copied ,
* so it can be destroyed after this call .
*/
2007-07-12 04:21:05 +04:00
extern int drm_sman_set_manager ( struct drm_sman * sman , unsigned int mananger ,
struct drm_sman_mm * allocator ) ;
2006-08-07 15:30:28 +04:00
/*
* Allocate a memory block . Aligment is not implemented yet .
*/
2007-07-12 04:21:05 +04:00
extern struct drm_memblock_item * drm_sman_alloc ( struct drm_sman * sman ,
unsigned int manager ,
unsigned long size ,
unsigned alignment ,
unsigned long owner ) ;
2006-08-07 15:30:28 +04:00
/*
* Free a memory block identified by its user hash key .
*/
2007-07-12 04:21:05 +04:00
extern int drm_sman_free_key ( struct drm_sman * sman , unsigned int key ) ;
2006-08-07 15:30:28 +04:00
/*
2006-08-14 05:35:15 +04:00
* returns 1 iff there are no stale memory blocks associated with this owner .
2006-08-07 15:30:28 +04:00
* Typically called to determine if we need to idle the hardware and call
* drm_sman_owner_cleanup . If there are no stale memory blocks , it removes all
* resources associated with owner .
*/
2007-07-12 04:21:05 +04:00
extern int drm_sman_owner_clean ( struct drm_sman * sman , unsigned long owner ) ;
2006-08-07 15:30:28 +04:00
/*
* Frees all stale memory blocks associated with this owner . Note that this
* requires that the hardware is finished with all blocks , so the graphics engine
* should be idled before this call is made . This function also frees
* any resources associated with " owner " and should be called when owner
* is not going to be referenced anymore .
*/
2007-07-12 04:21:05 +04:00
extern void drm_sman_owner_cleanup ( struct drm_sman * sman , unsigned long owner ) ;
2006-08-07 15:30:28 +04:00
/*
* Frees all stale memory blocks associated with the memory manager .
* See idling above .
*/
2007-07-12 04:21:05 +04:00
extern void drm_sman_cleanup ( struct drm_sman * sman ) ;
2006-08-07 15:30:28 +04:00
# endif