drm/nouveau/devinit: convert to new-style nvkm_subdev
[deliverable/linux.git] / drivers / gpu / drm / nouveau / nvkm / subdev / fb / gf100.c
CommitLineData
4b223eef 1/*
861d2107 2 * Copyright 2012 Red Hat Inc.
4b223eef
BS
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 */
639c308e 24#include "gf100.h"
d36a99d2 25#include "ram.h"
4b223eef 26
639c308e 27extern const u8 gf100_pte_storage_type_map[256];
e30441ad 28
aae95ca7 29bool
b1e4553c 30gf100_fb_memtype_valid(struct nvkm_fb *fb, u32 tile_flags)
a1484512 31{
861d2107 32 u8 memtype = (tile_flags & 0x0000ff00) >> 8;
639c308e 33 return likely((gf100_pte_storage_type_map[memtype] != 0xff));
861d2107 34}
a1484512 35
c814a60d 36static void
639c308e 37gf100_fb_intr(struct nvkm_subdev *subdev)
c814a60d 38{
6758745b 39 struct nvkm_device *device = subdev->device;
6758745b 40 u32 intr = nvkm_rd32(device, 0x000100);
b1e4553c 41 if (intr & 0x08000000)
3ecd329b 42 nvkm_debug(subdev, "PFFB intr\n");
b1e4553c 43 if (intr & 0x00002000)
3ecd329b 44 nvkm_debug(subdev, "PBFB intr\n");
c814a60d
BS
45}
46
aae95ca7 47int
639c308e 48gf100_fb_init(struct nvkm_object *object)
a1484512 49{
b1e4553c 50 struct gf100_fb *fb = (void *)object;
6758745b 51 struct nvkm_device *device = fb->base.subdev.device;
861d2107
BS
52 int ret;
53
b1e4553c 54 ret = nvkm_fb_init(&fb->base);
861d2107
BS
55 if (ret)
56 return ret;
ffc6a4e4 57
b1e4553c 58 if (fb->r100c10_page)
6758745b 59 nvkm_wr32(device, 0x100c10, fb->r100c10 >> 8);
639c308e 60
6758745b 61 nvkm_mask(device, 0x100c80, 0x00000001, 0x00000000); /* 128KiB lpg */
861d2107 62 return 0;
a1484512
BS
63}
64
aae95ca7 65void
639c308e 66gf100_fb_dtor(struct nvkm_object *object)
310ff414 67{
639c308e 68 struct nvkm_device *device = nv_device(object);
b1e4553c 69 struct gf100_fb *fb = (void *)object;
a1484512 70
b1e4553c
BS
71 if (fb->r100c10_page) {
72 dma_unmap_page(nv_device_base(device), fb->r100c10, PAGE_SIZE,
fd1496a0 73 DMA_BIDIRECTIONAL);
b1e4553c 74 __free_page(fb->r100c10_page);
310ff414
BS
75 }
76
b1e4553c 77 nvkm_fb_destroy(&fb->base);
310ff414
BS
78}
79
aae95ca7 80int
639c308e
BS
81gf100_fb_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
82 struct nvkm_oclass *oclass, void *data, u32 size,
83 struct nvkm_object **pobject)
4b223eef 84{
639c308e 85 struct nvkm_device *device = nv_device(parent);
b1e4553c 86 struct gf100_fb *fb;
310ff414
BS
87 int ret;
88
b1e4553c
BS
89 ret = nvkm_fb_create(parent, engine, oclass, &fb);
90 *pobject = nv_object(fb);
861d2107
BS
91 if (ret)
92 return ret;
310ff414 93
b1e4553c
BS
94 fb->r100c10_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
95 if (fb->r100c10_page) {
96 fb->r100c10 = dma_map_page(nv_device_base(device),
97 fb->r100c10_page, 0, PAGE_SIZE,
fd1496a0 98 DMA_BIDIRECTIONAL);
b1e4553c 99 if (dma_mapping_error(nv_device_base(device), fb->r100c10))
fffeba2a
BS
100 return -EFAULT;
101 }
861d2107 102
b1e4553c 103 nv_subdev(fb)->intr = gf100_fb_intr;
dceef5d8 104 return 0;
4b223eef 105}
861d2107 106
639c308e
BS
107struct nvkm_oclass *
108gf100_fb_oclass = &(struct nvkm_fb_impl) {
8613e731 109 .base.handle = NV_SUBDEV(FB, 0xc0),
639c308e
BS
110 .base.ofuncs = &(struct nvkm_ofuncs) {
111 .ctor = gf100_fb_ctor,
112 .dtor = gf100_fb_dtor,
113 .init = gf100_fb_init,
114 .fini = _nvkm_fb_fini,
861d2107 115 },
639c308e 116 .memtype = gf100_fb_memtype_valid,
d36a99d2 117 .ram_new = gf100_ram_new,
8613e731 118}.base;
This page took 0.424762 seconds and 5 git commands to generate.