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 "nv04.h"
27#include "fbmem.h"
28
29#include <subdev/bios.h>
30#include <subdev/bios/init.h>
31
32static void
33nv20_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
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
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
60 nvkm_mask(device, NV04_PFB_CFG0, mask, 0);
61
62 fbmem_fini(fb);
63}
64
65static const struct nvkm_devinit_func
66nv20_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
74int
75nv20_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}
80