Commit | Line | Data |
---|---|---|
75faef78 BS |
1 | /* |
2 | * Copyright 2013 Red Hat Inc. | |
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 | */ | |
24 | ||
25 | #include "nv50.h" | |
26 | ||
0b428011 BS |
27 | struct nvaa_ram_priv { |
28 | struct nouveau_ram base; | |
e9d91238 | 29 | u64 poller_base; |
0b428011 BS |
30 | }; |
31 | ||
75faef78 BS |
32 | static int |
33 | nvaa_ram_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |
34 | struct nouveau_oclass *oclass, void *data, u32 datasize, | |
35 | struct nouveau_object **pobject) | |
36 | { | |
e9d91238 PM |
37 | u32 rsvd_head = ( 256 * 1024); /* vga memory */ |
38 | u32 rsvd_tail = (1024 * 1024); /* vbios etc */ | |
75faef78 | 39 | struct nouveau_fb *pfb = nouveau_fb(parent); |
0b428011 | 40 | struct nvaa_ram_priv *priv; |
75faef78 BS |
41 | int ret; |
42 | ||
0b428011 BS |
43 | ret = nouveau_ram_create(parent, engine, oclass, &priv); |
44 | *pobject = nv_object(priv); | |
75faef78 BS |
45 | if (ret) |
46 | return ret; | |
47 | ||
5f3ac299 BS |
48 | priv->base.type = NV_MEM_TYPE_STOLEN; |
49 | priv->base.stolen = (u64)nv_rd32(pfb, 0x100e10) << 12; | |
50 | priv->base.size = (u64)nv_rd32(pfb, 0x100e14) << 12; | |
75faef78 | 51 | |
e9d91238 PM |
52 | rsvd_tail += 0x1000; |
53 | priv->poller_base = priv->base.size - rsvd_tail; | |
54 | ||
55 | ret = nouveau_mm_init(&pfb->vram, rsvd_head >> 12, | |
56 | (priv->base.size - (rsvd_head + rsvd_tail)) >> 12, | |
57 | 1); | |
75faef78 BS |
58 | if (ret) |
59 | return ret; | |
60 | ||
0b428011 BS |
61 | priv->base.get = nv50_ram_get; |
62 | priv->base.put = nv50_ram_put; | |
75faef78 BS |
63 | return 0; |
64 | } | |
65 | ||
e9d91238 PM |
66 | static int |
67 | nvaa_ram_init(struct nouveau_object *object) | |
68 | { | |
69 | struct nouveau_fb *pfb = nouveau_fb(object); | |
70 | struct nvaa_ram_priv *priv = (void *)object; | |
71 | int ret; | |
72 | u64 dniso, hostnb, flush; | |
73 | ||
74 | ret = nouveau_ram_init(&priv->base); | |
75 | if (ret) | |
76 | return ret; | |
77 | ||
78 | dniso = ((priv->base.size - (priv->poller_base + 0x00)) >> 5) - 1; | |
79 | hostnb = ((priv->base.size - (priv->poller_base + 0x20)) >> 5) - 1; | |
80 | flush = ((priv->base.size - (priv->poller_base + 0x40)) >> 5) - 1; | |
81 | ||
82 | /* Enable NISO poller for various clients and set their associated | |
83 | * read address, only for MCP77/78 and MCP79/7A. (fd#25701) | |
84 | */ | |
85 | nv_wr32(pfb, 0x100c18, dniso); | |
86 | nv_mask(pfb, 0x100c14, 0x00000000, 0x00000001); | |
87 | nv_wr32(pfb, 0x100c1c, hostnb); | |
88 | nv_mask(pfb, 0x100c14, 0x00000000, 0x00000002); | |
89 | nv_wr32(pfb, 0x100c24, flush); | |
90 | nv_mask(pfb, 0x100c14, 0x00000000, 0x00010000); | |
91 | ||
92 | return 0; | |
93 | } | |
94 | ||
75faef78 BS |
95 | struct nouveau_oclass |
96 | nvaa_ram_oclass = { | |
97 | .ofuncs = &(struct nouveau_ofuncs) { | |
98 | .ctor = nvaa_ram_ctor, | |
99 | .dtor = _nouveau_ram_dtor, | |
e9d91238 | 100 | .init = nvaa_ram_init, |
75faef78 BS |
101 | .fini = _nouveau_ram_fini, |
102 | }, | |
103 | }; |