1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "priv.h"
27#include "ram.h"
28
29static void
30nv44_fb_tile_init(struct nvkm_fb *fb, int i, u32 addr, u32 size, u32 pitch,
31 u32 flags, struct nvkm_fb_tile *tile)
32{
33 tile->addr = 0x00000001;
34 tile->addr |= addr;
35 tile->limit = max(1u, addr + size) - 1;
36 tile->pitch = pitch;
37}
38
39void
40nv44_fb_tile_prog(struct nvkm_fb *fb, int i, struct nvkm_fb_tile *tile)
41{
42 struct nvkm_device *device = fb->subdev.device;
43 nvkm_wr32(device, 0x100604 + (i * 0x10), tile->limit);
44 nvkm_wr32(device, 0x100608 + (i * 0x10), tile->pitch);
45 nvkm_wr32(device, 0x100600 + (i * 0x10), tile->addr);
46 nvkm_rd32(device, 0x100600 + (i * 0x10));
47}
48
49void
50nv44_fb_init(struct nvkm_fb *fb)
51{
52 struct nvkm_device *device = fb->subdev.device;
53 nvkm_wr32(device, 0x100850, 0x80000000);
54 nvkm_wr32(device, 0x100800, 0x00000001);
55}
56
57static const struct nvkm_fb_func
58nv44_fb = {
59 .init = nv44_fb_init,
60 .tile.regions = 12,
61 .tile.init = nv44_fb_tile_init,
62 .tile.fini = nv20_fb_tile_fini,
63 .tile.prog = nv44_fb_tile_prog,
64 .ram_new = nv44_ram_new,
65};
66
67int
68nv44_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
69{
70 return nvkm_fb_new_(&nv44_fb, device, index, pfb);
71}
72