LCOV - code coverage report
Current view: top level - include/drm/ttm - ttm_tt.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 0 -

          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             : #ifndef _TTM_TT_H_
      28             : #define _TTM_TT_H_
      29             : 
      30             : #include <linux/pagemap.h>
      31             : #include <linux/types.h>
      32             : #include <drm/ttm/ttm_caching.h>
      33             : #include <drm/ttm/ttm_kmap_iter.h>
      34             : 
      35             : struct ttm_device;
      36             : struct ttm_tt;
      37             : struct ttm_resource;
      38             : struct ttm_buffer_object;
      39             : struct ttm_operation_ctx;
      40             : 
      41             : /**
      42             :  * struct ttm_tt - This is a structure holding the pages, caching- and aperture
      43             :  * binding status for a buffer object that isn't backed by fixed (VRAM / AGP)
      44             :  * memory.
      45             :  */
      46             : struct ttm_tt {
      47             :         /** @pages: Array of pages backing the data. */
      48             :         struct page **pages;
      49             :         /**
      50             :          * @page_flags: The page flags.
      51             :          *
      52             :          * Supported values:
      53             :          *
      54             :          * TTM_TT_FLAG_SWAPPED: Set by TTM when the pages have been unpopulated
      55             :          * and swapped out by TTM.  Calling ttm_tt_populate() will then swap the
      56             :          * pages back in, and unset the flag. Drivers should in general never
      57             :          * need to touch this.
      58             :          *
      59             :          * TTM_TT_FLAG_ZERO_ALLOC: Set if the pages will be zeroed on
      60             :          * allocation.
      61             :          *
      62             :          * TTM_TT_FLAG_EXTERNAL: Set if the underlying pages were allocated
      63             :          * externally, like with dma-buf or userptr. This effectively disables
      64             :          * TTM swapping out such pages.  Also important is to prevent TTM from
      65             :          * ever directly mapping these pages.
      66             :          *
      67             :          * Note that enum ttm_bo_type.ttm_bo_type_sg objects will always enable
      68             :          * this flag.
      69             :          *
      70             :          * TTM_TT_FLAG_EXTERNAL_MAPPABLE: Same behaviour as
      71             :          * TTM_TT_FLAG_EXTERNAL, but with the reduced restriction that it is
      72             :          * still valid to use TTM to map the pages directly. This is useful when
      73             :          * implementing a ttm_tt backend which still allocates driver owned
      74             :          * pages underneath(say with shmem).
      75             :          *
      76             :          * Note that since this also implies TTM_TT_FLAG_EXTERNAL, the usage
      77             :          * here should always be:
      78             :          *
      79             :          *   page_flags = TTM_TT_FLAG_EXTERNAL |
      80             :          *                TTM_TT_FLAG_EXTERNAL_MAPPABLE;
      81             :          *
      82             :          * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is
      83             :          * set by TTM after ttm_tt_populate() has successfully returned, and is
      84             :          * then unset when TTM calls ttm_tt_unpopulate().
      85             :          */
      86             : #define TTM_TT_FLAG_SWAPPED             (1 << 0)
      87             : #define TTM_TT_FLAG_ZERO_ALLOC          (1 << 1)
      88             : #define TTM_TT_FLAG_EXTERNAL            (1 << 2)
      89             : #define TTM_TT_FLAG_EXTERNAL_MAPPABLE   (1 << 3)
      90             : 
      91             : #define TTM_TT_FLAG_PRIV_POPULATED  (1 << 31)
      92             :         uint32_t page_flags;
      93             :         /** @num_pages: Number of pages in the page array. */
      94             :         uint32_t num_pages;
      95             :         /** @sg: for SG objects via dma-buf. */
      96             :         struct sg_table *sg;
      97             :         /** @dma_address: The DMA (bus) addresses of the pages. */
      98             :         dma_addr_t *dma_address;
      99             :         /** @swap_storage: Pointer to shmem struct file for swap storage. */
     100             :         struct file *swap_storage;
     101             :         /**
     102             :          * @caching: The current caching state of the pages, see enum
     103             :          * ttm_caching.
     104             :          */
     105             :         enum ttm_caching caching;
     106             : };
     107             : 
     108             : /**
     109             :  * struct ttm_kmap_iter_tt - Specialization of a mappig iterator for a tt.
     110             :  * @base: Embedded struct ttm_kmap_iter providing the usage interface
     111             :  * @tt: Cached struct ttm_tt.
     112             :  * @prot: Cached page protection for mapping.
     113             :  */
     114             : struct ttm_kmap_iter_tt {
     115             :         struct ttm_kmap_iter base;
     116             :         struct ttm_tt *tt;
     117             :         pgprot_t prot;
     118             : };
     119             : 
     120             : static inline bool ttm_tt_is_populated(struct ttm_tt *tt)
     121             : {
     122             :         return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
     123             : }
     124             : 
     125             : /**
     126             :  * ttm_tt_create
     127             :  *
     128             :  * @bo: pointer to a struct ttm_buffer_object
     129             :  * @zero_alloc: true if allocated pages needs to be zeroed
     130             :  *
     131             :  * Make sure we have a TTM structure allocated for the given BO.
     132             :  * No pages are actually allocated.
     133             :  */
     134             : int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc);
     135             : 
     136             : /**
     137             :  * ttm_tt_init
     138             :  *
     139             :  * @ttm: The struct ttm_tt.
     140             :  * @bo: The buffer object we create the ttm for.
     141             :  * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
     142             :  * @caching: the desired caching state of the pages
     143             :  * @extra_pages: Extra pages needed for the driver.
     144             :  *
     145             :  * Create a struct ttm_tt to back data with system memory pages.
     146             :  * No pages are actually allocated.
     147             :  * Returns:
     148             :  * NULL: Out of memory.
     149             :  */
     150             : int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
     151             :                 uint32_t page_flags, enum ttm_caching caching,
     152             :                 unsigned long extra_pages);
     153             : int ttm_sg_tt_init(struct ttm_tt *ttm_dma, struct ttm_buffer_object *bo,
     154             :                    uint32_t page_flags, enum ttm_caching caching);
     155             : 
     156             : /**
     157             :  * ttm_tt_fini
     158             :  *
     159             :  * @ttm: the ttm_tt structure.
     160             :  *
     161             :  * Free memory of ttm_tt structure
     162             :  */
     163             : void ttm_tt_fini(struct ttm_tt *ttm);
     164             : 
     165             : /**
     166             :  * ttm_tt_destroy:
     167             :  *
     168             :  * @bdev: the ttm_device this object belongs to
     169             :  * @ttm: The struct ttm_tt.
     170             :  *
     171             :  * Unbind, unpopulate and destroy common struct ttm_tt.
     172             :  */
     173             : void ttm_tt_destroy(struct ttm_device *bdev, struct ttm_tt *ttm);
     174             : 
     175             : /**
     176             :  * ttm_tt_swapin:
     177             :  *
     178             :  * @ttm: The struct ttm_tt.
     179             :  *
     180             :  * Swap in a previously swap out ttm_tt.
     181             :  */
     182             : int ttm_tt_swapin(struct ttm_tt *ttm);
     183             : int ttm_tt_swapout(struct ttm_device *bdev, struct ttm_tt *ttm,
     184             :                    gfp_t gfp_flags);
     185             : 
     186             : /**
     187             :  * ttm_tt_populate - allocate pages for a ttm
     188             :  *
     189             :  * @bdev: the ttm_device this object belongs to
     190             :  * @ttm: Pointer to the ttm_tt structure
     191             :  * @ctx: operation context for populating the tt object.
     192             :  *
     193             :  * Calls the driver method to allocate pages for a ttm
     194             :  */
     195             : int ttm_tt_populate(struct ttm_device *bdev, struct ttm_tt *ttm,
     196             :                     struct ttm_operation_ctx *ctx);
     197             : 
     198             : /**
     199             :  * ttm_tt_unpopulate - free pages from a ttm
     200             :  *
     201             :  * @bdev: the ttm_device this object belongs to
     202             :  * @ttm: Pointer to the ttm_tt structure
     203             :  *
     204             :  * Calls the driver method to free all pages from a ttm
     205             :  */
     206             : void ttm_tt_unpopulate(struct ttm_device *bdev, struct ttm_tt *ttm);
     207             : 
     208             : /**
     209             :  * ttm_tt_mark_for_clear - Mark pages for clearing on populate.
     210             :  *
     211             :  * @ttm: Pointer to the ttm_tt structure
     212             :  *
     213             :  * Marks pages for clearing so that the next time the page vector is
     214             :  * populated, the pages will be cleared.
     215             :  */
     216             : static inline void ttm_tt_mark_for_clear(struct ttm_tt *ttm)
     217             : {
     218           0 :         ttm->page_flags |= TTM_TT_FLAG_ZERO_ALLOC;
     219             : }
     220             : 
     221             : void ttm_tt_mgr_init(unsigned long num_pages, unsigned long num_dma32_pages);
     222             : 
     223             : struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct ttm_kmap_iter_tt *iter_tt,
     224             :                                             struct ttm_tt *tt);
     225             : 
     226             : #if IS_ENABLED(CONFIG_AGP)
     227             : #include <linux/agp_backend.h>
     228             : 
     229             : /**
     230             :  * ttm_agp_tt_create
     231             :  *
     232             :  * @bo: Buffer object we allocate the ttm for.
     233             :  * @bridge: The agp bridge this device is sitting on.
     234             :  * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags.
     235             :  *
     236             :  *
     237             :  * Create a TTM backend that uses the indicated AGP bridge as an aperture
     238             :  * for TT memory. This function uses the linux agpgart interface to
     239             :  * bind and unbind memory backing a ttm_tt.
     240             :  */
     241             : struct ttm_tt *ttm_agp_tt_create(struct ttm_buffer_object *bo,
     242             :                                  struct agp_bridge_data *bridge,
     243             :                                  uint32_t page_flags);
     244             : int ttm_agp_bind(struct ttm_tt *ttm, struct ttm_resource *bo_mem);
     245             : void ttm_agp_unbind(struct ttm_tt *ttm);
     246             : void ttm_agp_destroy(struct ttm_tt *ttm);
     247             : bool ttm_agp_is_bound(struct ttm_tt *ttm);
     248             : #endif
     249             : 
     250             : #endif

Generated by: LCOV version 1.14