diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-08-20 14:54:23 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-08-28 12:40:49 +1000 |
commit | 340b0e7c500a0ac8fb649c58cf8528550642c1d8 (patch) | |
tree | 5d0e79108aee9874fd4eabdb138cf7415ad770c0 /drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c | |
parent | drm/nouveau/device: remove pci/platform_device from common struct (diff) | |
download | linux-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.c | 26 |
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: |