aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-08-20 14:54:23 +1000
committerBen Skeggs <bskeggs@redhat.com>2015-08-28 12:40:49 +1000
commit340b0e7c500a0ac8fb649c58cf8528550642c1d8 (patch)
tree5d0e79108aee9874fd4eabdb138cf7415ad770c0 /drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
parentdrm/nouveau/device: remove pci/platform_device from common struct (diff)
downloadlinux-dev-340b0e7c500a0ac8fb649c58cf8528550642c1d8.tar.xz
linux-dev-340b0e7c500a0ac8fb649c58cf8528550642c1d8.zip
drm/nouveau/pci: merge agp handling from nouveau drm
This commit reinstates the pre-DEVINIT AGP fiddling that was broken in an earlier commit. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c')
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
index e5e0d02f3d88..d1c148e51922 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
@@ -22,6 +22,7 @@
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "priv.h"
+#include "agp.h"
#include <core/option.h>
#include <core/pci.h>
@@ -76,10 +77,24 @@ static int
nvkm_pci_fini(struct nvkm_subdev *subdev, bool suspend)
{
struct nvkm_pci *pci = nvkm_pci(subdev);
+
if (pci->irq >= 0) {
free_irq(pci->irq, pci);
pci->irq = -1;
};
+
+ if (pci->agp.bridge)
+ nvkm_agp_fini(pci);
+
+ return 0;
+}
+
+static int
+nvkm_pci_preinit(struct nvkm_subdev *subdev)
+{
+ struct nvkm_pci *pci = nvkm_pci(subdev);
+ if (pci->agp.bridge)
+ nvkm_agp_preinit(pci);
return 0;
}
@@ -90,6 +105,12 @@ nvkm_pci_init(struct nvkm_subdev *subdev)
struct pci_dev *pdev = pci->pdev;
int ret;
+ if (pci->agp.bridge) {
+ ret = nvkm_agp_init(pci);
+ if (ret)
+ return ret;
+ }
+
ret = request_irq(pdev->irq, nvkm_pci_intr, IRQF_SHARED, "nvkm", pci);
if (ret)
return ret;
@@ -102,6 +123,7 @@ static void *
nvkm_pci_dtor(struct nvkm_subdev *subdev)
{
struct nvkm_pci *pci = nvkm_pci(subdev);
+ nvkm_agp_dtor(pci);
if (pci->msi)
pci_disable_msi(pci->pdev);
return nvkm_pci(subdev);
@@ -110,6 +132,7 @@ nvkm_pci_dtor(struct nvkm_subdev *subdev)
static const struct nvkm_subdev_func
nvkm_pci_func = {
.dtor = nvkm_pci_dtor,
+ .preinit = nvkm_pci_preinit,
.init = nvkm_pci_init,
.fini = nvkm_pci_fini,
};
@@ -127,6 +150,9 @@ nvkm_pci_new_(const struct nvkm_pci_func *func, struct nvkm_device *device,
pci->pdev = device->func->pci(device)->pdev;
pci->irq = -1;
+ if (device->type == NVKM_DEVICE_AGP)
+ nvkm_agp_ctor(pci);
+
switch (pci->pdev->device & 0x0ff0) {
case 0x00f0:
case 0x02e0: