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 <subdev/fb.h>
28
29struct nv44_fb_priv {
30 struct nouveau_fb base;
31};
32
33int
34nv44_fb_vram_init(struct nouveau_fb *pfb)
35{
36 u32 pfb474 = nv_rd32(pfb, 0x100474);
37 if (pfb474 & 0x00000004)
38 pfb->ram.type = NV_MEM_TYPE_GDDR3;
39 if (pfb474 & 0x00000002)
40 pfb->ram.type = NV_MEM_TYPE_DDR2;
41 if (pfb474 & 0x00000001)
42 pfb->ram.type = NV_MEM_TYPE_DDR1;
43
44 pfb->ram.size = nv_rd32(pfb, 0x10020c) & 0xff000000;
45 return 0;
46}
47
48static void
49nv44_fb_tile_init(struct nouveau_fb *pfb, int i, u32 addr, u32 size, u32 pitch,
50 u32 flags, struct nouveau_fb_tile *tile)
51{
52 tile->addr = 0x00000001;
53 tile->addr |= addr;
54 tile->limit = max(1u, addr + size) - 1;
55 tile->pitch = pitch;
56}
57
58void
59nv44_fb_tile_prog(struct nouveau_fb *pfb, int i, struct nouveau_fb_tile *tile)
60{
61 nv_wr32(pfb, 0x100604 + (i * 0x10), tile->limit);
62 nv_wr32(pfb, 0x100608 + (i * 0x10), tile->pitch);
63 nv_wr32(pfb, 0x100600 + (i * 0x10), tile->addr);
64 nv_rd32(pfb, 0x100600 + (i * 0x10));
65}
66
67int
68nv44_fb_init(struct nouveau_object *object)
69{
70 struct nv44_fb_priv *priv = (void *)object;
71 int ret;
72
73 ret = nouveau_fb_init(&priv->base);
74 if (ret)
75 return ret;
76
77 nv_wr32(priv, 0x100850, 0x80000000);
78 nv_wr32(priv, 0x100800, 0x00000001);
79 return 0;
80}
81
82static int
83nv44_fb_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
84 struct nouveau_oclass *oclass, void *data, u32 size,
85 struct nouveau_object **pobject)
86{
87 struct nv44_fb_priv *priv;
88 int ret;
89
90 ret = nouveau_fb_create(parent, engine, oclass, &priv);
91 *pobject = nv_object(priv);
92 if (ret)
93 return ret;
94
95 priv->base.memtype_valid = nv04_fb_memtype_valid;
96 priv->base.ram.init = nv44_fb_vram_init;
97 priv->base.tile.regions = 12;
98 priv->base.tile.init = nv44_fb_tile_init;
99 priv->base.tile.fini = nv20_fb_tile_fini;
100 priv->base.tile.prog = nv44_fb_tile_prog;
101 return nouveau_fb_preinit(&priv->base);
102}
103
104
105struct nouveau_oclass
106nv44_fb_oclass = {
107 .handle = NV_SUBDEV(FB, 0x44),
108 .ofuncs = &(struct nouveau_ofuncs) {
109 .ctor = nv44_fb_ctor,
110 .dtor = _nouveau_fb_dtor,
111 .init = nv44_fb_init,
112 .fini = _nouveau_fb_fini,
113 },
114};
115