blob: af0cfe81da69ddb07b7d11c374d1007808a55e61 [file] [log] [blame]
Ben Skeggs6ee73862009-12-11 19:24:15 +10001/*
Ben Skeggs77145f12012-07-31 16:16:21 +10002 * Copyright 2012 Red Hat Inc.
Ben Skeggs6ee73862009-12-11 19:24:15 +10003 *
Ben Skeggs77145f12012-07-31 16:16:21 +10004 * 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:
Ben Skeggs6ee73862009-12-11 19:24:15 +100010 *
Ben Skeggs77145f12012-07-31 16:16:21 +100011 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
Ben Skeggs6ee73862009-12-11 19:24:15 +100013 *
Ben Skeggs77145f12012-07-31 16:16:21 +100014 * 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.
Ben Skeggs6ee73862009-12-11 19:24:15 +100021 *
Ben Skeggs77145f12012-07-31 16:16:21 +100022 * Authors: Ben Skeggs
Ben Skeggs6ee73862009-12-11 19:24:15 +100023 */
24
Ben Skeggs77145f12012-07-31 16:16:21 +100025#include <subdev/mc.h>
Ben Skeggs6ee73862009-12-11 19:24:15 +100026
Ben Skeggs77145f12012-07-31 16:16:21 +100027#include "nouveau_drm.h"
28#include "nv50_display.h"
Ben Skeggs6ee73862009-12-11 19:24:15 +100029
Ben Skeggs6ee73862009-12-11 19:24:15 +100030void
31nouveau_irq_preinstall(struct drm_device *dev)
32{
Ben Skeggs77145f12012-07-31 16:16:21 +100033 nv_wr32(nouveau_dev(dev), 0x000140, 0x00000000);
Ben Skeggs6ee73862009-12-11 19:24:15 +100034}
35
36int
37nouveau_irq_postinstall(struct drm_device *dev)
38{
Ben Skeggs77145f12012-07-31 16:16:21 +100039 nv_wr32(nouveau_dev(dev), 0x000140, 0x00000001);
Ben Skeggs6ee73862009-12-11 19:24:15 +100040 return 0;
41}
42
43void
44nouveau_irq_uninstall(struct drm_device *dev)
45{
Ben Skeggs77145f12012-07-31 16:16:21 +100046 nv_wr32(nouveau_dev(dev), 0x000140, 0x00000000);
Ben Skeggs6ee73862009-12-11 19:24:15 +100047}
48
Ben Skeggs6ee73862009-12-11 19:24:15 +100049irqreturn_t
50nouveau_irq_handler(DRM_IRQ_ARGS)
51{
Ben Skeggs77145f12012-07-31 16:16:21 +100052 struct drm_device *dev = arg;
53 struct nouveau_device *device = nouveau_dev(dev);
54 struct nouveau_mc *pmc = nouveau_mc(device);
Ben Skeggs274fec92010-11-03 13:16:18 +100055 u32 stat;
Ben Skeggs6ee73862009-12-11 19:24:15 +100056
Ben Skeggs77145f12012-07-31 16:16:21 +100057 stat = nv_rd32(device, 0x000100);
Ben Skeggs9717f3d2011-07-12 15:42:45 +100058 if (stat == 0 || stat == ~0)
Ben Skeggs6ee73862009-12-11 19:24:15 +100059 return IRQ_NONE;
60
Ben Skeggs77145f12012-07-31 16:16:21 +100061 nv_subdev(pmc)->intr(nv_subdev(pmc));
Ben Skeggs8f8a5442010-11-03 09:57:28 +100062
Ben Skeggs77145f12012-07-31 16:16:21 +100063 if (device->card_type >= NV_D0) {
64 if (nv_rd32(device, 0x000100) & 0x04000000)
65 nvd0_display_intr(dev);
66 } else
67 if (device->card_type >= NV_50) {
68 if (nv_rd32(device, 0x000100) & 0x04000000)
69 nv50_display_intr(dev);
Ben Skeggs8f8a5442010-11-03 09:57:28 +100070 }
71
Ben Skeggs6ee73862009-12-11 19:24:15 +100072 return IRQ_HANDLED;
73}
Ben Skeggs35fa2f22010-10-21 14:07:03 +100074
75int
76nouveau_irq_init(struct drm_device *dev)
77{
Ben Skeggs35fa2f22010-10-21 14:07:03 +100078 return drm_irq_install(dev);
79}
80
81void
82nouveau_irq_fini(struct drm_device *dev)
83{
Ben Skeggs35fa2f22010-10-21 14:07:03 +100084 drm_irq_uninstall(dev);
Ben Skeggs8f8a5442010-11-03 09:57:28 +100085}