blob: 3d65c1763311fe8adbad9e701b10fa03b1f167e2 [file] [log] [blame]
Ben Skeggs586c55f2012-07-09 14:14:48 +10001#include "nouveau_drm.h"
2#include "nouveau_compat.h"
3
Ben Skeggscd424392012-07-10 11:38:08 +10004#include <subdev/bios.h>
Ben Skeggscb75d972012-07-11 10:44:20 +10005#include <subdev/bios/dcb.h>
6#include <subdev/bios/init.h>
Ben Skeggs70790f42012-07-10 17:26:46 +10007#include <subdev/bios/pll.h>
Ben Skeggse0996ae2012-07-10 12:20:17 +10008#include <subdev/gpio.h>
Ben Skeggs4196faa2012-07-10 14:36:38 +10009#include <subdev/i2c.h>
Ben Skeggs70790f42012-07-10 17:26:46 +100010#include <subdev/clock.h>
Ben Skeggs7d9115d2012-07-11 15:58:56 +100011#include <subdev/mc.h>
Ben Skeggs5a5c7432012-07-11 16:08:25 +100012#include <subdev/timer.h>
Ben Skeggs861d2102012-07-11 19:05:01 +100013#include <subdev/fb.h>
Ben Skeggscd424392012-07-10 11:38:08 +100014
Ben Skeggs586c55f2012-07-09 14:14:48 +100015void *nouveau_newpriv(struct drm_device *);
16
Ben Skeggscb75d972012-07-11 10:44:20 +100017int
18nvdrm_gart_init(struct drm_device *dev, u64 *base, u64 *size)
19{
20 struct nouveau_drm *drm = nouveau_newpriv(dev);
21 if (drm->agp.stat == ENABLED) {
22 *base = drm->agp.base;
23 *size = drm->agp.base;
24 return 0;
25 }
26 return -ENODEV;
27}
28
Ben Skeggs586c55f2012-07-09 14:14:48 +100029u8
30_nv_rd08(struct drm_device *dev, u32 reg)
31{
32 struct nouveau_drm *drm = nouveau_newpriv(dev);
33 return nv_ro08(drm->device, reg);
34}
35
36void
37_nv_wr08(struct drm_device *dev, u32 reg, u8 val)
38{
39 struct nouveau_drm *drm = nouveau_newpriv(dev);
40 nv_wo08(drm->device, reg, val);
41}
42
43u32
44_nv_rd32(struct drm_device *dev, u32 reg)
45{
46 struct nouveau_drm *drm = nouveau_newpriv(dev);
47 return nv_ro32(drm->device, reg);
48}
49
50void
51_nv_wr32(struct drm_device *dev, u32 reg, u32 val)
52{
53 struct nouveau_drm *drm = nouveau_newpriv(dev);
54 nv_wo32(drm->device, reg, val);
55}
56
57u32
58_nv_mask(struct drm_device *dev, u32 reg, u32 mask, u32 val)
59{
60 u32 tmp = _nv_rd32(dev, reg);
61 _nv_wr32(dev, reg, (tmp & ~mask) | val);
62 return tmp;
63}
Ben Skeggscd424392012-07-10 11:38:08 +100064
65bool
66_nv_bios(struct drm_device *dev, u8 **data, u32 *size)
67{
68 struct nouveau_drm *drm = nouveau_newpriv(dev);
69 struct nouveau_bios *bios = nouveau_bios(drm->device);
70 *data = bios->data;
71 *size = bios->size;
72 return true;
73}
Ben Skeggse0996ae2012-07-10 12:20:17 +100074
75void
76nouveau_gpio_reset(struct drm_device *dev)
77{
78 struct nouveau_drm *drm = nouveau_newpriv(dev);
79 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
80 gpio->reset(gpio);
81}
82
83int
84nouveau_gpio_find(struct drm_device *dev, int idx, u8 tag, u8 line,
85 struct dcb_gpio_func *func)
86{
87 struct nouveau_drm *drm = nouveau_newpriv(dev);
88 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
89
90 return gpio->find(gpio, idx, tag, line, func);
91}
92
93bool
94nouveau_gpio_func_valid(struct drm_device *dev, u8 tag)
95{
96 struct nouveau_drm *drm = nouveau_newpriv(dev);
97 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
98 struct dcb_gpio_func func;
99
100 return gpio->find(gpio, 0, tag, 0xff, &func) == 0;
101}
102
103int
104nouveau_gpio_func_set(struct drm_device *dev, u8 tag, int state)
105{
106 struct nouveau_drm *drm = nouveau_newpriv(dev);
107 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
108 if (gpio && gpio->get)
109 return gpio->set(gpio, 0, tag, 0xff, state);
110 return -ENODEV;
111}
112
113int
114nouveau_gpio_func_get(struct drm_device *dev, u8 tag)
115{
116 struct nouveau_drm *drm = nouveau_newpriv(dev);
117 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
118 if (gpio && gpio->get)
119 return gpio->get(gpio, 0, tag, 0xff);
120 return -ENODEV;
121}
122
123int
124nouveau_gpio_irq(struct drm_device *dev, int idx, u8 tag, u8 line, bool on)
125{
126 struct nouveau_drm *drm = nouveau_newpriv(dev);
127 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
128 if (gpio && gpio->irq)
129 return gpio->irq(gpio, idx, tag, line, on);
130 return -ENODEV;
131}
132
133int
134nouveau_gpio_isr_add(struct drm_device *dev, int idx, u8 tag, u8 line,
135 void (*exec)(void *, int state), void *data)
136{
137 struct nouveau_drm *drm = nouveau_newpriv(dev);
138 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
139 if (gpio && gpio->isr_add)
140 return gpio->isr_add(gpio, idx, tag, line, exec, data);
141 return -ENODEV;
142}
143
144void
145nouveau_gpio_isr_del(struct drm_device *dev, int idx, u8 tag, u8 line,
146 void (*exec)(void *, int state), void *data)
147{
148 struct nouveau_drm *drm = nouveau_newpriv(dev);
149 struct nouveau_gpio *gpio = nouveau_gpio(drm->device);
150 if (gpio && gpio->isr_del)
151 gpio->isr_del(gpio, idx, tag, line, exec, data);
152}
Ben Skeggs4196faa2012-07-10 14:36:38 +1000153
154struct nouveau_i2c_port *
155nouveau_i2c_find(struct drm_device *dev, u8 index)
156{
157 struct nouveau_drm *drm = nouveau_newpriv(dev);
158 struct nouveau_i2c *i2c = nouveau_i2c(drm->device);
159
160 return i2c->find(i2c, index);
161}
162
163bool
164nouveau_probe_i2c_addr(struct nouveau_i2c_port *port, int addr)
165{
166 return nv_probe_i2c(port, addr);
167}
168
169struct i2c_adapter *
170nouveau_i2c_adapter(struct nouveau_i2c_port *port)
171{
172 return &port->adapter;
173}
174
175
176int
177nouveau_i2c_identify(struct drm_device *dev, const char *what,
178 struct i2c_board_info *info,
179 bool (*match)(struct nouveau_i2c_port *,
180 struct i2c_board_info *),
181 int index)
182{
183 struct nouveau_drm *drm = nouveau_newpriv(dev);
184 struct nouveau_i2c *i2c = nouveau_i2c(drm->device);
185
186 return i2c->identify(i2c, index, what, info, match);
187}
188
189int
190auxch_rd(struct drm_device *dev, struct nouveau_i2c_port *port,
191 u32 addr, u8 *data, u8 size)
192{
193 return nv_rdaux(port, addr, data, size);
194}
195
196int
197auxch_wr(struct drm_device *dev, struct nouveau_i2c_port *port,
198 u32 addr, u8 *data, u8 size)
199{
200 return nv_wraux(port, addr, data, size);
201}
Ben Skeggs70790f42012-07-10 17:26:46 +1000202
203u32
204get_pll_register(struct drm_device *dev, u32 type)
205{
206 struct nouveau_drm *drm = nouveau_newpriv(dev);
207 struct nouveau_bios *bios = nouveau_bios(drm->device);
208 struct nvbios_pll info;
209
210 if (nvbios_pll_parse(bios, type, &info))
211 return 0;
212 return info.reg;
213}
214
215int
216get_pll_limits(struct drm_device *dev, u32 type, struct nvbios_pll *info)
217{
218 struct nouveau_drm *drm = nouveau_newpriv(dev);
219 struct nouveau_bios *bios = nouveau_bios(drm->device);
220
221 return nvbios_pll_parse(bios, type, info);
222}
223
224int
225setPLL(struct drm_device *dev, u32 reg, u32 freq)
226{
227 struct nouveau_drm *drm = nouveau_newpriv(dev);
228 struct nouveau_clock *clk = nouveau_clock(drm->device);
229 int ret = -ENODEV;
230
231 if (clk->pll_set)
232 ret = clk->pll_set(clk, reg, freq);
233 return ret;
234}
235
236
237int
238nouveau_calc_pll_mnp(struct drm_device *dev, struct nvbios_pll *info,
239 int freq, struct nouveau_pll_vals *pv)
240{
241 struct nouveau_drm *drm = nouveau_newpriv(dev);
242 struct nouveau_clock *clk = nouveau_clock(drm->device);
243 int ret = 0;
244
245 if (clk->pll_calc)
246 ret = clk->pll_calc(clk, info, freq, pv);
247 return ret;
248}
249
250int
251nouveau_hw_setpll(struct drm_device *dev, u32 reg1,
252 struct nouveau_pll_vals *pv)
253{
254 struct nouveau_drm *drm = nouveau_newpriv(dev);
255 struct nouveau_clock *clk = nouveau_clock(drm->device);
256 int ret = -ENODEV;
257
258 if (clk->pll_prog)
259 ret = clk->pll_prog(clk, reg1, pv);
260 return ret;
261}
262
263int nva3_pll_calc(struct nouveau_clock *, struct nvbios_pll *, u32 freq,
264 int *N, int *fN, int *M, int *P);
265
266int
267nva3_calc_pll(struct drm_device *dev, struct nvbios_pll *info, u32 freq,
268 int *N, int *fN, int *M, int *P)
269{
270 struct nouveau_drm *drm = nouveau_newpriv(dev);
271 struct nouveau_clock *clk = nouveau_clock(drm->device);
272
273 return nva3_pll_calc(clk, info, freq, N, fN, M, P);
274}
Ben Skeggscb75d972012-07-11 10:44:20 +1000275
276void
277nouveau_bios_run_init_table(struct drm_device *dev, uint16_t table,
278 struct dcb_output *dcbent, int crtc)
279{
280 struct nouveau_drm *drm = nouveau_newpriv(dev);
281 struct nouveau_bios *bios = nouveau_bios(drm->device);
282 struct nvbios_init init = {
283 .subdev = nv_subdev(bios),
284 .bios = bios,
285 .offset = table,
286 .outp = dcbent,
287 .crtc = crtc,
288 .execute = 1
289 };
290
291 nvbios_exec(&init);
292}
293
294void
295nouveau_bios_init_exec(struct drm_device *dev, uint16_t table)
296{
297 nouveau_bios_run_init_table(dev, table, NULL, 0);
298}
Ben Skeggs7d9115d2012-07-11 15:58:56 +1000299
300void
301nv_intr(struct drm_device *dev)
302{
303 struct nouveau_drm *drm = nouveau_newpriv(dev);
304 struct nouveau_mc *pmc = nouveau_mc(drm->device);
Ben Skeggs5a5c7432012-07-11 16:08:25 +1000305 nv_subdev(pmc)->intr(&pmc->base);
306}
307
308bool nouveau_wait_eq(struct drm_device *dev, uint64_t timeout,
309 uint32_t reg, uint32_t mask, uint32_t val)
310{
311 struct nouveau_drm *drm = nouveau_newpriv(dev);
312 return nouveau_timer_wait_eq(drm->device, timeout, reg, mask, val);
313}
314
315bool nouveau_wait_ne(struct drm_device *dev, uint64_t timeout,
316 uint32_t reg, uint32_t mask, uint32_t val)
317{
318 struct nouveau_drm *drm = nouveau_newpriv(dev);
319 return nouveau_timer_wait_ne(drm->device, timeout, reg, mask, val);
320}
321
322bool nouveau_wait_cb(struct drm_device *dev, u64 timeout,
323 bool (*cond)(void *), void *data)
324{
325 struct nouveau_drm *drm = nouveau_newpriv(dev);
326 return nouveau_timer_wait_cb(drm->device, timeout, cond, data);
327}
328
329u64
330nv_timer_read(struct drm_device *dev)
331{
332 struct nouveau_drm *drm = nouveau_newpriv(dev);
333 struct nouveau_timer *ptimer = nouveau_timer(drm->device);
334 return ptimer->read(ptimer);
Ben Skeggs7d9115d2012-07-11 15:58:56 +1000335}
Ben Skeggs861d2102012-07-11 19:05:01 +1000336
337int
338nvfb_tile_nr(struct drm_device *dev)
339{
340 struct nouveau_drm *drm = nouveau_newpriv(dev);
341 struct nouveau_fb *pfb = nouveau_fb(drm->device);
342 return pfb->tile.regions;
343}
344
345struct nouveau_fb_tile *
346nvfb_tile(struct drm_device *dev, int i)
347{
348 struct nouveau_drm *drm = nouveau_newpriv(dev);
349 struct nouveau_fb *pfb = nouveau_fb(drm->device);
350 return &pfb->tile.region[i];
351}
352
353void
354nvfb_tile_init(struct drm_device *dev, int i, u32 a, u32 b, u32 c, u32 d)
355{
356 struct nouveau_drm *drm = nouveau_newpriv(dev);
357 struct nouveau_fb *pfb = nouveau_fb(drm->device);
358 pfb->tile.init(pfb, i, a, b, c, d, &pfb->tile.region[i]);
359}
360
361void
362nvfb_tile_fini(struct drm_device *dev, int i)
363{
364 struct nouveau_drm *drm = nouveau_newpriv(dev);
365 struct nouveau_fb *pfb = nouveau_fb(drm->device);
366 pfb->tile.fini(pfb, i, &pfb->tile.region[i]);
367}
368
369void
370nvfb_tile_prog(struct drm_device *dev, int i)
371{
372 struct nouveau_drm *drm = nouveau_newpriv(dev);
373 struct nouveau_fb *pfb = nouveau_fb(drm->device);
374 pfb->tile.prog(pfb, i, &pfb->tile.region[i]);
375}
376
377bool
378nvfb_flags_valid(struct drm_device *dev, u32 flags)
379{
380 struct nouveau_drm *drm = nouveau_newpriv(dev);
381 struct nouveau_fb *pfb = nouveau_fb(drm->device);
382 return pfb->memtype_valid(pfb, flags);
383}
384
385int
386nvfb_vram_get(struct drm_device *dev, u64 size, u32 align, u32 ncmin,
387 u32 memtype, struct nouveau_mem **pmem)
388{
389 struct nouveau_drm *drm = nouveau_newpriv(dev);
390 struct nouveau_fb *pfb = nouveau_fb(drm->device);
391 int ret = pfb->ram.get(pfb, size, align, ncmin, memtype, pmem);
392 if (ret)
393 return ret;
394 (*pmem)->dev = dev;
395 return 0;
396}
397
398void
399nvfb_vram_put(struct drm_device *dev, struct nouveau_mem **pmem)
400{
401 struct nouveau_drm *drm = nouveau_newpriv(dev);
402 struct nouveau_fb *pfb = nouveau_fb(drm->device);
403 pfb->ram.put(pfb, pmem);
404}
405
406
407u64 nvfb_vram_sys_base(struct drm_device *dev)
408{
409 struct nouveau_drm *drm = nouveau_newpriv(dev);
410 struct nouveau_fb *pfb = nouveau_fb(drm->device);
411 return pfb->ram.stolen;
412}
413
414u64 nvfb_vram_size(struct drm_device *dev)
415{
416 struct nouveau_drm *drm = nouveau_newpriv(dev);
417 struct nouveau_fb *pfb = nouveau_fb(drm->device);
418 return pfb->ram.size;
419}
420
421int nvfb_vram_type(struct drm_device *dev)
422{
423 struct nouveau_drm *drm = nouveau_newpriv(dev);
424 struct nouveau_fb *pfb = nouveau_fb(drm->device);
425 return pfb->ram.type;
426}
427
428int nvfb_vram_rank_B(struct drm_device *dev)
429{
430 struct nouveau_drm *drm = nouveau_newpriv(dev);
431 struct nouveau_fb *pfb = nouveau_fb(drm->device);
432 return pfb->ram.ranks > 1;
433}
434
435void
436nv50_fb_vm_trap(struct drm_device *dev, int disp)
437{
438 struct nouveau_drm *drm = nouveau_newpriv(dev);
439 nv50_fb_trap(nouveau_fb(drm->device), disp);
440}