blob: 9ca8afdb5549777c7a2b25e64de9b63f700260bc [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"
Marcin Slusarz5b8a43a2012-08-19 23:00:00 +020028#include "nouveau_irq.h"
Ben Skeggs77145f12012-07-31 16:16:21 +100029#include "nv50_display.h"
Ben Skeggs6ee73862009-12-11 19:24:15 +100030
Ben Skeggs6ee73862009-12-11 19:24:15 +100031void
32nouveau_irq_preinstall(struct drm_device *dev)
33{
Ben Skeggs77145f12012-07-31 16:16:21 +100034 nv_wr32(nouveau_dev(dev), 0x000140, 0x00000000);
Ben Skeggs6ee73862009-12-11 19:24:15 +100035}
36
37int
38nouveau_irq_postinstall(struct drm_device *dev)
39{
Ben Skeggs77145f12012-07-31 16:16:21 +100040 nv_wr32(nouveau_dev(dev), 0x000140, 0x00000001);
Ben Skeggs6ee73862009-12-11 19:24:15 +100041 return 0;
42}
43
44void
45nouveau_irq_uninstall(struct drm_device *dev)
46{
Ben Skeggs77145f12012-07-31 16:16:21 +100047 nv_wr32(nouveau_dev(dev), 0x000140, 0x00000000);
Ben Skeggs6ee73862009-12-11 19:24:15 +100048}
49
Ben Skeggs6ee73862009-12-11 19:24:15 +100050irqreturn_t
51nouveau_irq_handler(DRM_IRQ_ARGS)
52{
Ben Skeggs77145f12012-07-31 16:16:21 +100053 struct drm_device *dev = arg;
54 struct nouveau_device *device = nouveau_dev(dev);
55 struct nouveau_mc *pmc = nouveau_mc(device);
Ben Skeggs274fec92010-11-03 13:16:18 +100056 u32 stat;
Ben Skeggs6ee73862009-12-11 19:24:15 +100057
Ben Skeggs77145f12012-07-31 16:16:21 +100058 stat = nv_rd32(device, 0x000100);
Ben Skeggs9717f3d2011-07-12 15:42:45 +100059 if (stat == 0 || stat == ~0)
Ben Skeggs6ee73862009-12-11 19:24:15 +100060 return IRQ_NONE;
61
Ben Skeggs77145f12012-07-31 16:16:21 +100062 nv_subdev(pmc)->intr(nv_subdev(pmc));
Ben Skeggs8f8a5442010-11-03 09:57:28 +100063
Ben Skeggs77145f12012-07-31 16:16:21 +100064 if (device->card_type >= NV_D0) {
65 if (nv_rd32(device, 0x000100) & 0x04000000)
66 nvd0_display_intr(dev);
67 } else
68 if (device->card_type >= NV_50) {
69 if (nv_rd32(device, 0x000100) & 0x04000000)
70 nv50_display_intr(dev);
Ben Skeggs8f8a5442010-11-03 09:57:28 +100071 }
72
Ben Skeggs6ee73862009-12-11 19:24:15 +100073 return IRQ_HANDLED;
74}
Ben Skeggs35fa2f22010-10-21 14:07:03 +100075
76int
77nouveau_irq_init(struct drm_device *dev)
78{
Ben Skeggs35fa2f22010-10-21 14:07:03 +100079 return drm_irq_install(dev);
80}
81
82void
83nouveau_irq_fini(struct drm_device *dev)
84{
Ben Skeggs35fa2f22010-10-21 14:07:03 +100085 drm_irq_uninstall(dev);
Ben Skeggs8f8a5442010-11-03 09:57:28 +100086}