root/drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nvkm_fb_tile_fini
  2. nvkm_fb_tile_init
  3. nvkm_fb_tile_prog
  4. nvkm_fb_bios_memtype
  5. nvkm_fb_intr
  6. nvkm_fb_oneinit
  7. nvkm_fb_init
  8. nvkm_fb_dtor
  9. nvkm_fb_ctor
  10. nvkm_fb_new_

   1 /*
   2  * Copyright 2012 Red Hat Inc.
   3  *
   4  * Permission is hereby granted, free of charge, to any person obtaining a
   5  * copy of this software and associated documentation files (the "Software"),
   6  * to deal in the Software without restriction, including without limitation
   7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8  * and/or sell copies of the Software, and to permit persons to whom the
   9  * Software is furnished to do so, subject to the following conditions:
  10  *
  11  * The above copyright notice and this permission notice shall be included in
  12  * all copies or substantial portions of the Software.
  13  *
  14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20  * OTHER DEALINGS IN THE SOFTWARE.
  21  *
  22  * Authors: Ben Skeggs
  23  */
  24 #include "priv.h"
  25 #include "ram.h"
  26 
  27 #include <core/memory.h>
  28 #include <core/option.h>
  29 #include <subdev/bios.h>
  30 #include <subdev/bios/M0203.h>
  31 #include <engine/gr.h>
  32 #include <engine/mpeg.h>
  33 
  34 void
  35 nvkm_fb_tile_fini(struct nvkm_fb *fb, int region, struct nvkm_fb_tile *tile)
  36 {
  37         fb->func->tile.fini(fb, region, tile);
  38 }
  39 
  40 void
  41 nvkm_fb_tile_init(struct nvkm_fb *fb, int region, u32 addr, u32 size,
  42                   u32 pitch, u32 flags, struct nvkm_fb_tile *tile)
  43 {
  44         fb->func->tile.init(fb, region, addr, size, pitch, flags, tile);
  45 }
  46 
  47 void
  48 nvkm_fb_tile_prog(struct nvkm_fb *fb, int region, struct nvkm_fb_tile *tile)
  49 {
  50         struct nvkm_device *device = fb->subdev.device;
  51         if (fb->func->tile.prog) {
  52                 fb->func->tile.prog(fb, region, tile);
  53                 if (device->gr)
  54                         nvkm_engine_tile(&device->gr->engine, region);
  55                 if (device->mpeg)
  56                         nvkm_engine_tile(device->mpeg, region);
  57         }
  58 }
  59 
  60 int
  61 nvkm_fb_bios_memtype(struct nvkm_bios *bios)
  62 {
  63         struct nvkm_subdev *subdev = &bios->subdev;
  64         struct nvkm_device *device = subdev->device;
  65         const u8 ramcfg = (nvkm_rd32(device, 0x101000) & 0x0000003c) >> 2;
  66         struct nvbios_M0203E M0203E;
  67         u8 ver, hdr;
  68 
  69         if (nvbios_M0203Em(bios, ramcfg, &ver, &hdr, &M0203E)) {
  70                 switch (M0203E.type) {
  71                 case M0203E_TYPE_DDR2  : return NVKM_RAM_TYPE_DDR2;
  72                 case M0203E_TYPE_DDR3  : return NVKM_RAM_TYPE_DDR3;
  73                 case M0203E_TYPE_GDDR3 : return NVKM_RAM_TYPE_GDDR3;
  74                 case M0203E_TYPE_GDDR5 : return NVKM_RAM_TYPE_GDDR5;
  75                 case M0203E_TYPE_GDDR5X: return NVKM_RAM_TYPE_GDDR5X;
  76                 case M0203E_TYPE_GDDR6 : return NVKM_RAM_TYPE_GDDR6;
  77                 case M0203E_TYPE_HBM2  : return NVKM_RAM_TYPE_HBM2;
  78                 default:
  79                         nvkm_warn(subdev, "M0203E type %02x\n", M0203E.type);
  80                         return NVKM_RAM_TYPE_UNKNOWN;
  81                 }
  82         }
  83 
  84         nvkm_warn(subdev, "M0203E not matched!\n");
  85         return NVKM_RAM_TYPE_UNKNOWN;
  86 }
  87 
  88 static void
  89 nvkm_fb_intr(struct nvkm_subdev *subdev)
  90 {
  91         struct nvkm_fb *fb = nvkm_fb(subdev);
  92         if (fb->func->intr)
  93                 fb->func->intr(fb);
  94 }
  95 
  96 static int
  97 nvkm_fb_oneinit(struct nvkm_subdev *subdev)
  98 {
  99         struct nvkm_fb *fb = nvkm_fb(subdev);
 100         u32 tags = 0;
 101 
 102         if (fb->func->ram_new) {
 103                 int ret = fb->func->ram_new(fb, &fb->ram);
 104                 if (ret) {
 105                         nvkm_error(subdev, "vram setup failed, %d\n", ret);
 106                         return ret;
 107                 }
 108         }
 109 
 110         if (fb->func->oneinit) {
 111                 int ret = fb->func->oneinit(fb);
 112                 if (ret)
 113                         return ret;
 114         }
 115 
 116         /* Initialise compression tag allocator.
 117          *
 118          * LTC oneinit() will override this on Fermi and newer.
 119          */
 120         if (fb->func->tags) {
 121                 tags = fb->func->tags(fb);
 122                 nvkm_debug(subdev, "%d comptags\n", tags);
 123         }
 124 
 125         return nvkm_mm_init(&fb->tags, 0, 0, tags, 1);
 126 }
 127 
 128 static int
 129 nvkm_fb_init(struct nvkm_subdev *subdev)
 130 {
 131         struct nvkm_fb *fb = nvkm_fb(subdev);
 132         int ret, i;
 133 
 134         if (fb->ram) {
 135                 ret = nvkm_ram_init(fb->ram);
 136                 if (ret)
 137                         return ret;
 138         }
 139 
 140         for (i = 0; i < fb->tile.regions; i++)
 141                 fb->func->tile.prog(fb, i, &fb->tile.region[i]);
 142 
 143         if (fb->func->init)
 144                 fb->func->init(fb);
 145 
 146         if (fb->func->init_remapper)
 147                 fb->func->init_remapper(fb);
 148 
 149         if (fb->func->init_page) {
 150                 ret = fb->func->init_page(fb);
 151                 if (WARN_ON(ret))
 152                         return ret;
 153         }
 154 
 155         if (fb->func->init_unkn)
 156                 fb->func->init_unkn(fb);
 157         return 0;
 158 }
 159 
 160 static void *
 161 nvkm_fb_dtor(struct nvkm_subdev *subdev)
 162 {
 163         struct nvkm_fb *fb = nvkm_fb(subdev);
 164         int i;
 165 
 166         nvkm_memory_unref(&fb->mmu_wr);
 167         nvkm_memory_unref(&fb->mmu_rd);
 168 
 169         for (i = 0; i < fb->tile.regions; i++)
 170                 fb->func->tile.fini(fb, i, &fb->tile.region[i]);
 171 
 172         nvkm_mm_fini(&fb->tags);
 173         nvkm_ram_del(&fb->ram);
 174 
 175         if (fb->func->dtor)
 176                 return fb->func->dtor(fb);
 177         return fb;
 178 }
 179 
 180 static const struct nvkm_subdev_func
 181 nvkm_fb = {
 182         .dtor = nvkm_fb_dtor,
 183         .oneinit = nvkm_fb_oneinit,
 184         .init = nvkm_fb_init,
 185         .intr = nvkm_fb_intr,
 186 };
 187 
 188 void
 189 nvkm_fb_ctor(const struct nvkm_fb_func *func, struct nvkm_device *device,
 190              int index, struct nvkm_fb *fb)
 191 {
 192         nvkm_subdev_ctor(&nvkm_fb, device, index, &fb->subdev);
 193         fb->func = func;
 194         fb->tile.regions = fb->func->tile.regions;
 195         fb->page = nvkm_longopt(device->cfgopt, "NvFbBigPage",
 196                                 fb->func->default_bigpage);
 197 }
 198 
 199 int
 200 nvkm_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
 201              int index, struct nvkm_fb **pfb)
 202 {
 203         if (!(*pfb = kzalloc(sizeof(**pfb), GFP_KERNEL)))
 204                 return -ENOMEM;
 205         nvkm_fb_ctor(func, device, index, *pfb);
 206         return 0;
 207 }

/* [<][>][^][v][top][bottom][index][help] */