Home | History | Annotate | Line # | Download | only in lib
      1 /*
      2  *  Copyright 2019 Alyssa Rosenzweig
      3  *  Copyright 2019 Collabora, Ltd.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  *
     24  */
     25 
     26 #ifndef __PAN_BO_H__
     27 #define __PAN_BO_H__
     28 
     29 #include "util/list.h"
     30 #include "panfrost-job.h"
     31 #include <time.h>
     32 
     33 /* Flags for allocated memory */
     34 
     35 /* This memory region is executable */
     36 #define PAN_BO_EXECUTE            (1 << 0)
     37 
     38 /* This memory region should be lazily allocated and grow-on-page-fault. Must
     39  * be used in conjunction with INVISIBLE */
     40 #define PAN_BO_GROWABLE           (1 << 1)
     41 
     42 /* This memory region should not be mapped to the CPU */
     43 #define PAN_BO_INVISIBLE          (1 << 2)
     44 
     45 /* This region may not be used immediately and will not mmap on allocate
     46  * (semantically distinct from INVISIBLE, which cannot never be mmaped) */
     47 #define PAN_BO_DELAY_MMAP         (1 << 3)
     48 
     49 /* BO is shared across processes (imported or exported) and therefore cannot be
     50  * cached locally */
     51 #define PAN_BO_SHARED             (1 << 4)
     52 
     53 /* GPU access flags */
     54 
     55 /* BO is either shared (can be accessed by more than one GPU batch) or private
     56  * (reserved by a specific GPU job). */
     57 #define PAN_BO_ACCESS_PRIVATE         (0 << 0)
     58 #define PAN_BO_ACCESS_SHARED          (1 << 0)
     59 
     60 /* BO is being read/written by the GPU */
     61 #define PAN_BO_ACCESS_READ            (1 << 1)
     62 #define PAN_BO_ACCESS_WRITE           (1 << 2)
     63 #define PAN_BO_ACCESS_RW              (PAN_BO_ACCESS_READ | PAN_BO_ACCESS_WRITE)
     64 
     65 /* BO is accessed by the vertex/tiler job. */
     66 #define PAN_BO_ACCESS_VERTEX_TILER    (1 << 3)
     67 
     68 /* BO is accessed by the fragment job. */
     69 #define PAN_BO_ACCESS_FRAGMENT        (1 << 4)
     70 
     71 struct panfrost_device;
     72 
     73 struct panfrost_ptr {
     74         /* CPU address */
     75         void *cpu;
     76 
     77         /* GPU address */
     78         mali_ptr gpu;
     79 };
     80 
     81 struct panfrost_bo {
     82         /* Must be first for casting */
     83         struct list_head bucket_link;
     84 
     85         /* Used to link the BO to the BO cache LRU list. */
     86         struct list_head lru_link;
     87 
     88         /* Store the time this BO was use last, so the BO cache logic can evict
     89          * stale BOs.
     90          */
     91         time_t last_used;
     92 
     93         /* Atomic reference count */
     94         int32_t refcnt;
     95 
     96         struct panfrost_device *dev;
     97 
     98         /* Mapping for the entire object (all levels) */
     99         struct panfrost_ptr ptr;
    100 
    101         /* Size of all entire trees */
    102         size_t size;
    103 
    104         int gem_handle;
    105 
    106         uint32_t flags;
    107 
    108         /* Combination of PAN_BO_ACCESS_{READ,WRITE} flags encoding pending
    109          * GPU accesses to this BO. Useful to avoid calling the WAIT_BO ioctl
    110          * when the BO is idle.
    111          */
    112         uint32_t gpu_access;
    113 
    114         /* Human readable description of the BO for debugging. */
    115         const char *label;
    116 };
    117 
    118 bool
    119 panfrost_bo_wait(struct panfrost_bo *bo, int64_t timeout_ns, bool wait_readers);
    120 void
    121 panfrost_bo_reference(struct panfrost_bo *bo);
    122 void
    123 panfrost_bo_unreference(struct panfrost_bo *bo);
    124 struct panfrost_bo *
    125 panfrost_bo_create(struct panfrost_device *dev, size_t size,
    126                    uint32_t flags, const char *label);
    127 void
    128 panfrost_bo_mmap(struct panfrost_bo *bo);
    129 struct panfrost_bo *
    130 panfrost_bo_import(struct panfrost_device *dev, int fd);
    131 int
    132 panfrost_bo_export(struct panfrost_bo *bo);
    133 void
    134 panfrost_bo_cache_evict_all(struct panfrost_device *dev);
    135 
    136 #endif /* __PAN_BO_H__ */
    137