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
27#include "nv04.h"
28
29static void
30nv44_fb_tile_init(struct nouveau_fb *pfb, int i, u32 addr, u32 size, u32 pitch,
31 u32 flags, struct nouveau_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 nouveau_fb *pfb, int i, struct nouveau_fb_tile *tile)
41{
42 nv_wr32(pfb, 0x100604 + (i * 0x10), tile->limit);
43 nv_wr32(pfb, 0x100608 + (i * 0x10), tile->pitch);
44 nv_wr32(pfb, 0x100600 + (i * 0x10), tile->addr);
45 nv_rd32(pfb, 0x100600 + (i * 0x10));
46}
47
48int
49nv44_fb_init(struct nouveau_object *object)
50{
51 struct nv04_fb_priv *priv = (void *)object;
52 int ret;
53
54 ret = nouveau_fb_init(&priv->base);
55 if (ret)
56 return ret;
57
58 nv_wr32(priv, 0x100850, 0x80000000);
59 nv_wr32(priv, 0x100800, 0x00000001);
60 return 0;
61}
62
63struct nouveau_oclass *
64nv44_fb_oclass = &(struct nv04_fb_impl) {
65 .base.base.handle = NV_SUBDEV(FB, 0x44),
66 .base.base.ofuncs = &(struct nouveau_ofuncs) {
67 .ctor = nv04_fb_ctor,
68 .dtor = _nouveau_fb_dtor,
69 .init = nv44_fb_init,
70 .fini = _nouveau_fb_fini,
71 },
72 .base.memtype = nv04_fb_memtype_valid,
73 .base.ram = &nv44_ram_oclass,
74 .tile.regions = 12,
75 .tile.init = nv44_fb_tile_init,
76 .tile.fini = nv20_fb_tile_fini,
77 .tile.prog = nv44_fb_tile_prog,
78}.base.base;
79