root/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv20.c

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

DEFINITIONS

This source file includes following definitions.
  1. nv20_devinit_meminit
  2. nv20_devinit_new

   1 /*
   2  * Copyright (C) 2010 Francisco Jerez.
   3  * All Rights Reserved.
   4  *
   5  * Permission is hereby granted, free of charge, to any person obtaining
   6  * a copy of this software and associated documentation files (the
   7  * "Software"), to deal in the Software without restriction, including
   8  * without limitation the rights to use, copy, modify, merge, publish,
   9  * distribute, sublicense, and/or sell copies of the Software, and to
  10  * permit persons to whom the Software is furnished to do so, subject to
  11  * the following conditions:
  12  *
  13  * The above copyright notice and this permission notice (including the
  14  * next paragraph) shall be included in all copies or substantial
  15  * portions of the Software.
  16  *
  17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  20  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
  21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24  *
  25  */
  26 #include "nv04.h"
  27 #include "fbmem.h"
  28 
  29 #include <subdev/bios.h>
  30 #include <subdev/bios/init.h>
  31 
  32 static void
  33 nv20_devinit_meminit(struct nvkm_devinit *init)
  34 {
  35         struct nvkm_subdev *subdev = &init->subdev;
  36         struct nvkm_device *device = subdev->device;
  37         uint32_t mask = (device->chipset >= 0x25 ? 0x300 : 0x900);
  38         uint32_t amount, off;
  39         struct io_mapping *fb;
  40 
  41         /* Map the framebuffer aperture */
  42         fb = fbmem_init(device);
  43         if (!fb) {
  44                 nvkm_error(subdev, "failed to map fb\n");
  45                 return;
  46         }
  47 
  48         nvkm_wr32(device, NV10_PFB_REFCTRL, NV10_PFB_REFCTRL_VALID_1);
  49 
  50         /* Allow full addressing */
  51         nvkm_mask(device, NV04_PFB_CFG0, 0, mask);
  52 
  53         amount = nvkm_rd32(device, 0x10020c);
  54         for (off = amount; off > 0x2000000; off -= 0x2000000)
  55                 fbmem_poke(fb, off - 4, off);
  56 
  57         amount = nvkm_rd32(device, 0x10020c);
  58         if (amount != fbmem_peek(fb, amount - 4))
  59                 /* IC missing - disable the upper half memory space. */
  60                 nvkm_mask(device, NV04_PFB_CFG0, mask, 0);
  61 
  62         fbmem_fini(fb);
  63 }
  64 
  65 static const struct nvkm_devinit_func
  66 nv20_devinit = {
  67         .dtor = nv04_devinit_dtor,
  68         .preinit = nv04_devinit_preinit,
  69         .post = nv04_devinit_post,
  70         .meminit = nv20_devinit_meminit,
  71         .pll_set = nv04_devinit_pll_set,
  72 };
  73 
  74 int
  75 nv20_devinit_new(struct nvkm_device *device, int index,
  76                  struct nvkm_devinit **pinit)
  77 {
  78         return nv04_devinit_new_(&nv20_devinit, device, index, pinit);
  79 }

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