LCOV - code coverage report
Current view: top level - dev/pci/drm/ttm - ttm_bo_api.h (source / functions) Hit Total Coverage
Test: 6.4 Lines: 0 6 0.0 %
Date: 2018-10-19 03:25:38 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /**************************************************************************
       2             :  *
       3             :  * Copyright (c) 2006-2009 VMware, Inc., Palo Alto, CA., USA
       4             :  * All Rights Reserved.
       5             :  *
       6             :  * Permission is hereby granted, free of charge, to any person obtaining a
       7             :  * copy of this software and associated documentation files (the
       8             :  * "Software"), to deal in the Software without restriction, including
       9             :  * without limitation the rights to use, copy, modify, merge, publish,
      10             :  * distribute, sub license, and/or sell copies of the Software, and to
      11             :  * permit persons to whom the Software is furnished to do so, subject to
      12             :  * the following conditions:
      13             :  *
      14             :  * The above copyright notice and this permission notice (including the
      15             :  * next paragraph) shall be included in all copies or substantial portions
      16             :  * of the Software.
      17             :  *
      18             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      19             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      20             :  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
      21             :  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
      22             :  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
      23             :  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
      24             :  * USE OR OTHER DEALINGS IN THE SOFTWARE.
      25             :  *
      26             :  **************************************************************************/
      27             : /*
      28             :  * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
      29             :  */
      30             : 
      31             : #ifndef _TTM_BO_API_H_
      32             : #define _TTM_BO_API_H_
      33             : 
      34             : #include <dev/pci/drm/drm_linux.h>
      35             : #include <dev/pci/drm/linux_ww_mutex.h>
      36             : #include <dev/pci/drm/linux_reservation.h>
      37             : #include <dev/pci/drm/drm_hashtab.h>
      38             : #include <dev/pci/drm/drm_vma_manager.h>
      39             : 
      40             : struct ttm_bo_device;
      41             : 
      42             : struct drm_mm_node;
      43             : 
      44             : /**
      45             :  * struct ttm_place
      46             :  *
      47             :  * @fpfn:       first valid page frame number to put the object
      48             :  * @lpfn:       last valid page frame number to put the object
      49             :  * @flags:      memory domain and caching flags for the object
      50             :  *
      51             :  * Structure indicating a possible place to put an object.
      52             :  */
      53             : struct ttm_place {
      54             :         unsigned        fpfn;
      55             :         unsigned        lpfn;
      56             :         uint32_t        flags;
      57             : };
      58             : 
      59             : /**
      60             :  * struct ttm_placement
      61             :  *
      62             :  * @num_placement:      number of preferred placements
      63             :  * @placement:          preferred placements
      64             :  * @num_busy_placement: number of preferred placements when need to evict buffer
      65             :  * @busy_placement:     preferred placements when need to evict buffer
      66             :  *
      67             :  * Structure indicating the placement you request for an object.
      68             :  */
      69             : struct ttm_placement {
      70             :         unsigned                num_placement;
      71             :         const struct ttm_place  *placement;
      72             :         unsigned                num_busy_placement;
      73             :         const struct ttm_place  *busy_placement;
      74             : };
      75             : 
      76             : /**
      77             :  * struct ttm_bus_placement
      78             :  *
      79             :  * @addr:               mapped virtual address
      80             :  * @base:               bus base address
      81             :  * @is_iomem:           is this io memory ?
      82             :  * @size:               size in byte
      83             :  * @offset:             offset from the base address
      84             :  * @io_reserved_vm:     The VM system has a refcount in @io_reserved_count
      85             :  * @io_reserved_count:  Refcounting the numbers of callers to ttm_mem_io_reserve
      86             :  *
      87             :  * Structure indicating the bus placement of an object.
      88             :  */
      89             : struct ttm_bus_placement {
      90             :         void            *addr;
      91             :         unsigned long   base;
      92             :         unsigned long   size;
      93             :         unsigned long   offset;
      94             :         bool            is_iomem;
      95             :         bool            io_reserved_vm;
      96             :         uint64_t        io_reserved_count;
      97             :         bus_space_handle_t bsh;
      98             : };
      99             : 
     100             : 
     101             : /**
     102             :  * struct ttm_mem_reg
     103             :  *
     104             :  * @mm_node: Memory manager node.
     105             :  * @size: Requested size of memory region.
     106             :  * @num_pages: Actual size of memory region in pages.
     107             :  * @page_alignment: Page alignment.
     108             :  * @placement: Placement flags.
     109             :  * @bus: Placement on io bus accessible to the CPU
     110             :  *
     111             :  * Structure indicating the placement and space resources used by a
     112             :  * buffer object.
     113             :  */
     114             : 
     115             : struct ttm_mem_reg {
     116             :         void *mm_node;
     117             :         unsigned long start;
     118             :         unsigned long size;
     119             :         unsigned long num_pages;
     120             :         uint32_t page_alignment;
     121             :         uint32_t mem_type;
     122             :         uint32_t placement;
     123             :         struct ttm_bus_placement bus;
     124             : };
     125             : 
     126             : /**
     127             :  * enum ttm_bo_type
     128             :  *
     129             :  * @ttm_bo_type_device: These are 'normal' buffers that can
     130             :  * be mmapped by user space. Each of these bos occupy a slot in the
     131             :  * device address space, that can be used for normal vm operations.
     132             :  *
     133             :  * @ttm_bo_type_kernel: These buffers are like ttm_bo_type_device buffers,
     134             :  * but they cannot be accessed from user-space. For kernel-only use.
     135             :  *
     136             :  * @ttm_bo_type_sg: Buffer made from dmabuf sg table shared with another
     137             :  * driver.
     138             :  */
     139             : 
     140             : enum ttm_bo_type {
     141             :         ttm_bo_type_device,
     142             :         ttm_bo_type_kernel,
     143             :         ttm_bo_type_sg
     144             : };
     145             : 
     146             : struct ttm_tt;
     147             : 
     148             : /**
     149             :  * struct ttm_buffer_object
     150             :  *
     151             :  * @bdev: Pointer to the buffer object device structure.
     152             :  * @type: The bo type.
     153             :  * @destroy: Destruction function. If NULL, kfree is used.
     154             :  * @num_pages: Actual number of pages.
     155             :  * @acc_size: Accounted size for this object.
     156             :  * @kref: Reference count of this buffer object. When this refcount reaches
     157             :  * zero, the object is put on the delayed delete list.
     158             :  * @list_kref: List reference count of this buffer object. This member is
     159             :  * used to avoid destruction while the buffer object is still on a list.
     160             :  * Lru lists may keep one refcount, the delayed delete list, and kref != 0
     161             :  * keeps one refcount. When this refcount reaches zero,
     162             :  * the object is destroyed.
     163             :  * @mem: structure describing current placement.
     164             :  * @persistent_swap_storage: Usually the swap storage is deleted for buffers
     165             :  * pinned in physical memory. If this behaviour is not desired, this member
     166             :  * holds a pointer to a persistent shmem object.
     167             :  * @ttm: TTM structure holding system pages.
     168             :  * @evicted: Whether the object was evicted without user-space knowing.
     169             :  * @cpu_writes: For synchronization. Number of cpu writers.
     170             :  * @lru: List head for the lru list.
     171             :  * @ddestroy: List head for the delayed destroy list.
     172             :  * @swap: List head for swap LRU list.
     173             :  * @priv_flags: Flags describing buffer object internal state.
     174             :  * @vma_node: Address space manager node.
     175             :  * @offset: The current GPU offset, which can have different meanings
     176             :  * depending on the memory type. For SYSTEM type memory, it should be 0.
     177             :  * @cur_placement: Hint of current placement.
     178             :  * @wu_mutex: Wait unreserved mutex.
     179             :  *
     180             :  * Base class for TTM buffer object, that deals with data placement and CPU
     181             :  * mappings. GPU mappings are really up to the driver, but for simpler GPUs
     182             :  * the driver can usually use the placement offset @offset directly as the
     183             :  * GPU virtual address. For drivers implementing multiple
     184             :  * GPU memory manager contexts, the driver should manage the address space
     185             :  * in these contexts separately and use these objects to get the correct
     186             :  * placement and caching for these GPU maps. This makes it possible to use
     187             :  * these objects for even quite elaborate memory management schemes.
     188             :  * The destroy member, the API visibility of this object makes it possible
     189             :  * to derive driver specific types.
     190             :  */
     191             : 
     192             : struct ttm_buffer_object {
     193             :         struct uvm_object uobj;
     194             : 
     195             :         /**
     196             :          * Members constant at init.
     197             :          */
     198             : 
     199             :         struct ttm_bo_global *glob;
     200             :         struct ttm_bo_device *bdev;
     201             :         enum ttm_bo_type type;
     202             :         void (*destroy) (struct ttm_buffer_object *);
     203             :         unsigned long num_pages;
     204             :         size_t acc_size;
     205             : 
     206             :         /**
     207             :         * Members not needing protection.
     208             :         */
     209             : 
     210             :         struct kref kref;
     211             :         struct kref list_kref;
     212             : 
     213             :         /**
     214             :          * Members protected by the bo::resv::reserved lock.
     215             :          */
     216             : 
     217             :         struct ttm_mem_reg mem;
     218             :         struct uvm_object *persistent_swap_storage;
     219             :         struct ttm_tt *ttm;
     220             :         bool evicted;
     221             : 
     222             :         /**
     223             :          * Members protected by the bo::reserved lock only when written to.
     224             :          */
     225             : 
     226             :         atomic_t cpu_writers;
     227             : 
     228             :         /**
     229             :          * Members protected by the bdev::lru_lock.
     230             :          */
     231             : 
     232             :         struct list_head lru;
     233             :         struct list_head ddestroy;
     234             :         struct list_head swap;
     235             :         struct list_head io_reserve_lru;
     236             : 
     237             :         /**
     238             :          * Members protected by a bo reservation.
     239             :          */
     240             : 
     241             :         unsigned long priv_flags;
     242             : 
     243             :         struct drm_vma_offset_node vma_node;
     244             : 
     245             :         /**
     246             :          * Special members that are protected by the reserve lock
     247             :          * and the bo::lock when written to. Can be read with
     248             :          * either of these locks held.
     249             :          */
     250             : 
     251             :         uint64_t offset; /* GPU address space is independent of CPU word size */
     252             :         uint32_t cur_placement;
     253             : 
     254             :         struct sg_table *sg;
     255             : 
     256             :         struct reservation_object *resv;
     257             :         struct reservation_object ttm_resv;
     258             :         struct rwlock wu_mutex;
     259             : };
     260             : 
     261             : /**
     262             :  * struct ttm_bo_kmap_obj
     263             :  *
     264             :  * @virtual: The current kernel virtual address.
     265             :  * @page: The page when kmap'ing a single page.
     266             :  * @bo_kmap_type: Type of bo_kmap.
     267             :  *
     268             :  * Object describing a kernel mapping. Since a TTM bo may be located
     269             :  * in various memory types with various caching policies, the
     270             :  * mapping can either be an ioremap, a vmap, a kmap or part of a
     271             :  * premapped region.
     272             :  */
     273             : 
     274             : #define TTM_BO_MAP_IOMEM_MASK 0x80
     275             : struct ttm_bo_kmap_obj {
     276             :         void *virtual;
     277             :         struct vm_page *page;
     278             :         enum {
     279             :                 ttm_bo_map_iomap        = 1 | TTM_BO_MAP_IOMEM_MASK,
     280             :                 ttm_bo_map_vmap         = 2,
     281             :                 ttm_bo_map_kmap         = 3,
     282             :                 ttm_bo_map_premapped    = 4 | TTM_BO_MAP_IOMEM_MASK,
     283             :         } bo_kmap_type;
     284             :         struct ttm_buffer_object *bo;
     285             : };
     286             : 
     287             : /**
     288             :  * ttm_bo_reference - reference a struct ttm_buffer_object
     289             :  *
     290             :  * @bo: The buffer object.
     291             :  *
     292             :  * Returns a refcounted pointer to a buffer object.
     293             :  */
     294             : 
     295             : static inline struct ttm_buffer_object *
     296           0 : ttm_bo_reference(struct ttm_buffer_object *bo)
     297             : {
     298           0 :         kref_get(&bo->kref);
     299           0 :         return bo;
     300             : }
     301             : 
     302             : /**
     303             :  * ttm_bo_wait - wait for buffer idle.
     304             :  *
     305             :  * @bo:  The buffer object.
     306             :  * @interruptible:  Use interruptible wait.
     307             :  * @no_wait:  Return immediately if buffer is busy.
     308             :  *
     309             :  * This function must be called with the bo::mutex held, and makes
     310             :  * sure any previous rendering to the buffer is completed.
     311             :  * Note: It might be necessary to block validations before the
     312             :  * wait by reserving the buffer.
     313             :  * Returns -EBUSY if no_wait is true and the buffer is busy.
     314             :  * Returns -ERESTARTSYS if interrupted by a signal.
     315             :  */
     316             : extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
     317             :                        bool interruptible, bool no_wait);
     318             : 
     319             : /**
     320             :  * ttm_bo_mem_compat - Check if proposed placement is compatible with a bo
     321             :  *
     322             :  * @placement:  Return immediately if buffer is busy.
     323             :  * @mem:  The struct ttm_mem_reg indicating the region where the bo resides
     324             :  * @new_flags: Describes compatible placement found
     325             :  *
     326             :  * Returns true if the placement is compatible
     327             :  */
     328             : extern bool ttm_bo_mem_compat(struct ttm_placement *placement,
     329             :                               struct ttm_mem_reg *mem,
     330             :                               uint32_t *new_flags);
     331             : 
     332             : /**
     333             :  * ttm_bo_validate
     334             :  *
     335             :  * @bo: The buffer object.
     336             :  * @placement: Proposed placement for the buffer object.
     337             :  * @interruptible: Sleep interruptible if sleeping.
     338             :  * @no_wait_gpu: Return immediately if the GPU is busy.
     339             :  *
     340             :  * Changes placement and caching policy of the buffer object
     341             :  * according proposed placement.
     342             :  * Returns
     343             :  * -EINVAL on invalid proposed placement.
     344             :  * -ENOMEM on out-of-memory condition.
     345             :  * -EBUSY if no_wait is true and buffer busy.
     346             :  * -ERESTARTSYS if interrupted by a signal.
     347             :  */
     348             : extern int ttm_bo_validate(struct ttm_buffer_object *bo,
     349             :                                 struct ttm_placement *placement,
     350             :                                 bool interruptible,
     351             :                                 bool no_wait_gpu);
     352             : 
     353             : /**
     354             :  * ttm_bo_unref
     355             :  *
     356             :  * @bo: The buffer object.
     357             :  *
     358             :  * Unreference and clear a pointer to a buffer object.
     359             :  */
     360             : extern void ttm_bo_unref(struct ttm_buffer_object **bo);
     361             : 
     362             : 
     363             : /**
     364             :  * ttm_bo_list_ref_sub
     365             :  *
     366             :  * @bo: The buffer object.
     367             :  * @count: The number of references with which to decrease @bo::list_kref;
     368             :  * @never_free: The refcount should not reach zero with this operation.
     369             :  *
     370             :  * Release @count lru list references to this buffer object.
     371             :  */
     372             : extern void ttm_bo_list_ref_sub(struct ttm_buffer_object *bo, int count,
     373             :                                 bool never_free);
     374             : 
     375             : /**
     376             :  * ttm_bo_add_to_lru
     377             :  *
     378             :  * @bo: The buffer object.
     379             :  *
     380             :  * Add this bo to the relevant mem type lru and, if it's backed by
     381             :  * system pages (ttms) to the swap list.
     382             :  * This function must be called with struct ttm_bo_global::lru_lock held, and
     383             :  * is typically called immediately prior to unreserving a bo.
     384             :  */
     385             : extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);
     386             : 
     387             : /**
     388             :  * ttm_bo_del_from_lru
     389             :  *
     390             :  * @bo: The buffer object.
     391             :  *
     392             :  * Remove this bo from all lru lists used to lookup and reserve an object.
     393             :  * This function must be called with struct ttm_bo_global::lru_lock held,
     394             :  * and is usually called just immediately after the bo has been reserved to
     395             :  * avoid recursive reservation from lru lists.
     396             :  */
     397             : extern int ttm_bo_del_from_lru(struct ttm_buffer_object *bo);
     398             : 
     399             : 
     400             : /**
     401             :  * ttm_bo_lock_delayed_workqueue
     402             :  *
     403             :  * Prevent the delayed workqueue from running.
     404             :  * Returns
     405             :  * True if the workqueue was queued at the time
     406             :  */
     407             : extern int ttm_bo_lock_delayed_workqueue(struct ttm_bo_device *bdev);
     408             : 
     409             : /**
     410             :  * ttm_bo_unlock_delayed_workqueue
     411             :  *
     412             :  * Allows the delayed workqueue to run.
     413             :  */
     414             : extern void ttm_bo_unlock_delayed_workqueue(struct ttm_bo_device *bdev,
     415             :                                             int resched);
     416             : 
     417             : /**
     418             :  * ttm_bo_synccpu_write_grab
     419             :  *
     420             :  * @bo: The buffer object:
     421             :  * @no_wait: Return immediately if buffer is busy.
     422             :  *
     423             :  * Synchronizes a buffer object for CPU RW access. This means
     424             :  * command submission that affects the buffer will return -EBUSY
     425             :  * until ttm_bo_synccpu_write_release is called.
     426             :  *
     427             :  * Returns
     428             :  * -EBUSY if the buffer is busy and no_wait is true.
     429             :  * -ERESTARTSYS if interrupted by a signal.
     430             :  */
     431             : extern int
     432             : ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait);
     433             : 
     434             : /**
     435             :  * ttm_bo_synccpu_write_release:
     436             :  *
     437             :  * @bo : The buffer object.
     438             :  *
     439             :  * Releases a synccpu lock.
     440             :  */
     441             : extern void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);
     442             : 
     443             : /**
     444             :  * ttm_bo_acc_size
     445             :  *
     446             :  * @bdev: Pointer to a ttm_bo_device struct.
     447             :  * @bo_size: size of the buffer object in byte.
     448             :  * @struct_size: size of the structure holding buffer object datas
     449             :  *
     450             :  * Returns size to account for a buffer object
     451             :  */
     452             : size_t ttm_bo_acc_size(struct ttm_bo_device *bdev,
     453             :                        unsigned long bo_size,
     454             :                        unsigned struct_size);
     455             : size_t ttm_bo_dma_acc_size(struct ttm_bo_device *bdev,
     456             :                            unsigned long bo_size,
     457             :                            unsigned struct_size);
     458             : 
     459             : /**
     460             :  * ttm_bo_init
     461             :  *
     462             :  * @bdev: Pointer to a ttm_bo_device struct.
     463             :  * @bo: Pointer to a ttm_buffer_object to be initialized.
     464             :  * @size: Requested size of buffer object.
     465             :  * @type: Requested type of buffer object.
     466             :  * @flags: Initial placement flags.
     467             :  * @page_alignment: Data alignment in pages.
     468             :  * @interruptible: If needing to sleep to wait for GPU resources,
     469             :  * sleep interruptible.
     470             :  * @persistent_swap_storage: Usually the swap storage is deleted for buffers
     471             :  * pinned in physical memory. If this behaviour is not desired, this member
     472             :  * holds a pointer to a persistent shmem object. Typically, this would
     473             :  * point to the shmem object backing a GEM object if TTM is used to back a
     474             :  * GEM user interface.
     475             :  * @acc_size: Accounted size for this object.
     476             :  * @resv: Pointer to a reservation_object, or NULL to let ttm allocate one.
     477             :  * @destroy: Destroy function. Use NULL for kfree().
     478             :  *
     479             :  * This function initializes a pre-allocated struct ttm_buffer_object.
     480             :  * As this object may be part of a larger structure, this function,
     481             :  * together with the @destroy function,
     482             :  * enables driver-specific objects derived from a ttm_buffer_object.
     483             :  * On successful return, the object kref and list_kref are set to 1.
     484             :  * If a failure occurs, the function will call the @destroy function, or
     485             :  * kfree() if @destroy is NULL. Thus, after a failure, dereferencing @bo is
     486             :  * illegal and will likely cause memory corruption.
     487             :  *
     488             :  * Returns
     489             :  * -ENOMEM: Out of memory.
     490             :  * -EINVAL: Invalid placement flags.
     491             :  * -ERESTARTSYS: Interrupted by signal while sleeping waiting for resources.
     492             :  */
     493             : 
     494             : extern int ttm_bo_init(struct ttm_bo_device *bdev,
     495             :                         struct ttm_buffer_object *bo,
     496             :                         unsigned long size,
     497             :                         enum ttm_bo_type type,
     498             :                         struct ttm_placement *placement,
     499             :                         uint32_t page_alignment,
     500             :                         bool interrubtible,
     501             :                         struct uvm_object *persistent_swap_storage,
     502             :                         size_t acc_size,
     503             :                         struct sg_table *sg,
     504             :                         struct reservation_object *resv,
     505             :                         void (*destroy) (struct ttm_buffer_object *));
     506             : 
     507             : /**
     508             :  * ttm_bo_create
     509             :  *
     510             :  * @bdev: Pointer to a ttm_bo_device struct.
     511             :  * @size: Requested size of buffer object.
     512             :  * @type: Requested type of buffer object.
     513             :  * @placement: Initial placement.
     514             :  * @page_alignment: Data alignment in pages.
     515             :  * @interruptible: If needing to sleep while waiting for GPU resources,
     516             :  * sleep interruptible.
     517             :  * @persistent_swap_storage: Usually the swap storage is deleted for buffers
     518             :  * pinned in physical memory. If this behaviour is not desired, this member
     519             :  * holds a pointer to a persistent shmem object. Typically, this would
     520             :  * point to the shmem object backing a GEM object if TTM is used to back a
     521             :  * GEM user interface.
     522             :  * @p_bo: On successful completion *p_bo points to the created object.
     523             :  *
     524             :  * This function allocates a ttm_buffer_object, and then calls ttm_bo_init
     525             :  * on that object. The destroy function is set to kfree().
     526             :  * Returns
     527             :  * -ENOMEM: Out of memory.
     528             :  * -EINVAL: Invalid placement flags.
     529             :  * -ERESTARTSYS: Interrupted by signal while waiting for resources.
     530             :  */
     531             : 
     532             : extern int ttm_bo_create(struct ttm_bo_device *bdev,
     533             :                                 unsigned long size,
     534             :                                 enum ttm_bo_type type,
     535             :                                 struct ttm_placement *placement,
     536             :                                 uint32_t page_alignment,
     537             :                                 bool interruptible,
     538             :                                 struct uvm_object *persistent_swap_storage,
     539             :                                 struct ttm_buffer_object **p_bo);
     540             : 
     541             : /**
     542             :  * ttm_bo_init_mm
     543             :  *
     544             :  * @bdev: Pointer to a ttm_bo_device struct.
     545             :  * @mem_type: The memory type.
     546             :  * @p_size: size managed area in pages.
     547             :  *
     548             :  * Initialize a manager for a given memory type.
     549             :  * Note: if part of driver firstopen, it must be protected from a
     550             :  * potentially racing lastclose.
     551             :  * Returns:
     552             :  * -EINVAL: invalid size or memory type.
     553             :  * -ENOMEM: Not enough memory.
     554             :  * May also return driver-specified errors.
     555             :  */
     556             : 
     557             : extern int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
     558             :                                 unsigned long p_size);
     559             : /**
     560             :  * ttm_bo_clean_mm
     561             :  *
     562             :  * @bdev: Pointer to a ttm_bo_device struct.
     563             :  * @mem_type: The memory type.
     564             :  *
     565             :  * Take down a manager for a given memory type after first walking
     566             :  * the LRU list to evict any buffers left alive.
     567             :  *
     568             :  * Normally, this function is part of lastclose() or unload(), and at that
     569             :  * point there shouldn't be any buffers left created by user-space, since
     570             :  * there should've been removed by the file descriptor release() method.
     571             :  * However, before this function is run, make sure to signal all sync objects,
     572             :  * and verify that the delayed delete queue is empty. The driver must also
     573             :  * make sure that there are no NO_EVICT buffers present in this memory type
     574             :  * when the call is made.
     575             :  *
     576             :  * If this function is part of a VT switch, the caller must make sure that
     577             :  * there are no appications currently validating buffers before this
     578             :  * function is called. The caller can do that by first taking the
     579             :  * struct ttm_bo_device::ttm_lock in write mode.
     580             :  *
     581             :  * Returns:
     582             :  * -EINVAL: invalid or uninitialized memory type.
     583             :  * -EBUSY: There are still buffers left in this memory type.
     584             :  */
     585             : 
     586             : extern int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type);
     587             : 
     588             : /**
     589             :  * ttm_bo_evict_mm
     590             :  *
     591             :  * @bdev: Pointer to a ttm_bo_device struct.
     592             :  * @mem_type: The memory type.
     593             :  *
     594             :  * Evicts all buffers on the lru list of the memory type.
     595             :  * This is normally part of a VT switch or an
     596             :  * out-of-memory-space-due-to-fragmentation handler.
     597             :  * The caller must make sure that there are no other processes
     598             :  * currently validating buffers, and can do that by taking the
     599             :  * struct ttm_bo_device::ttm_lock in write mode.
     600             :  *
     601             :  * Returns:
     602             :  * -EINVAL: Invalid or uninitialized memory type.
     603             :  * -ERESTARTSYS: The call was interrupted by a signal while waiting to
     604             :  * evict a buffer.
     605             :  */
     606             : 
     607             : extern int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type);
     608             : 
     609             : /**
     610             :  * ttm_kmap_obj_virtual
     611             :  *
     612             :  * @map: A struct ttm_bo_kmap_obj returned from ttm_bo_kmap.
     613             :  * @is_iomem: Pointer to an integer that on return indicates 1 if the
     614             :  * virtual map is io memory, 0 if normal memory.
     615             :  *
     616             :  * Returns the virtual address of a buffer object area mapped by ttm_bo_kmap.
     617             :  * If *is_iomem is 1 on return, the virtual address points to an io memory area,
     618             :  * that should strictly be accessed by the iowriteXX() and similar functions.
     619             :  */
     620             : 
     621           0 : static inline void *ttm_kmap_obj_virtual(struct ttm_bo_kmap_obj *map,
     622             :                                          bool *is_iomem)
     623             : {
     624           0 :         *is_iomem = !!(map->bo_kmap_type & TTM_BO_MAP_IOMEM_MASK);
     625           0 :         return map->virtual;
     626             : }
     627             : 
     628             : /**
     629             :  * ttm_bo_kmap
     630             :  *
     631             :  * @bo: The buffer object.
     632             :  * @start_page: The first page to map.
     633             :  * @num_pages: Number of pages to map.
     634             :  * @map: pointer to a struct ttm_bo_kmap_obj representing the map.
     635             :  *
     636             :  * Sets up a kernel virtual mapping, using ioremap, vmap or kmap to the
     637             :  * data in the buffer object. The ttm_kmap_obj_virtual function can then be
     638             :  * used to obtain a virtual address to the data.
     639             :  *
     640             :  * Returns
     641             :  * -ENOMEM: Out of memory.
     642             :  * -EINVAL: Invalid range.
     643             :  */
     644             : 
     645             : extern int ttm_bo_kmap(struct ttm_buffer_object *bo, unsigned long start_page,
     646             :                        unsigned long num_pages, struct ttm_bo_kmap_obj *map);
     647             : 
     648             : /**
     649             :  * ttm_bo_kunmap
     650             :  *
     651             :  * @map: Object describing the map to unmap.
     652             :  *
     653             :  * Unmaps a kernel map set up by ttm_bo_kmap.
     654             :  */
     655             : 
     656             : extern void ttm_bo_kunmap(struct ttm_bo_kmap_obj *map);
     657             : 
     658             : /**
     659             :  * ttm_fbdev_mmap - mmap fbdev memory backed by a ttm buffer object.
     660             :  *
     661             :  * @vma:       vma as input from the fbdev mmap method.
     662             :  * @bo:        The bo backing the address space. The address space will
     663             :  * have the same size as the bo, and start at offset 0.
     664             :  *
     665             :  * This function is intended to be called by the fbdev mmap method
     666             :  * if the fbdev address space is to be backed by a bo.
     667             :  */
     668             : 
     669             : #ifdef notyet
     670             : extern int ttm_fbdev_mmap(struct vm_area_struct *vma,
     671             :                           struct ttm_buffer_object *bo);
     672             : 
     673             : /**
     674             :  * ttm_bo_mmap - mmap out of the ttm device address space.
     675             :  *
     676             :  * @filp:      filp as input from the mmap method.
     677             :  * @vma:       vma as input from the mmap method.
     678             :  * @bdev:      Pointer to the ttm_bo_device with the address space manager.
     679             :  *
     680             :  * This function is intended to be called by the device mmap method.
     681             :  * if the device address space is to be backed by the bo manager.
     682             :  */
     683             : 
     684             : extern int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
     685             :                        struct ttm_bo_device *bdev);
     686             : #endif
     687             : extern struct uvm_object *ttm_bo_mmap(voff_t, vsize_t,
     688             :                                       struct ttm_bo_device *);
     689             : 
     690             : /**
     691             :  * ttm_bo_io
     692             :  *
     693             :  * @bdev:      Pointer to the struct ttm_bo_device.
     694             :  * @filp:      Pointer to the struct file attempting to read / write.
     695             :  * @wbuf:      User-space pointer to address of buffer to write. NULL on read.
     696             :  * @rbuf:      User-space pointer to address of buffer to read into.
     697             :  * Null on write.
     698             :  * @count:     Number of bytes to read / write.
     699             :  * @f_pos:     Pointer to current file position.
     700             :  * @write:     1 for read, 0 for write.
     701             :  *
     702             :  * This function implements read / write into ttm buffer objects, and is
     703             :  * intended to
     704             :  * be called from the fops::read and fops::write method.
     705             :  * Returns:
     706             :  * See man (2) write, man(2) read. In particular,
     707             :  * the function may return -ERESTARTSYS if
     708             :  * interrupted by a signal.
     709             :  */
     710             : 
     711             : extern ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp,
     712             :                          const char __user *wbuf, char __user *rbuf,
     713             :                          size_t count, loff_t *f_pos, bool write);
     714             : 
     715             : extern void ttm_bo_swapout_all(struct ttm_bo_device *bdev);
     716             : extern int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo);
     717             : #endif

Generated by: LCOV version 1.13