summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2018-09-11 07:35:09 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2019-08-15 03:58:05 -0400
commiteca2cf043e3f52734e2fbba68631a2ef70dad76d (patch)
treeb714da5be2e95285cd01173a7a74d4e7c0340af1 /drivers/gpu/nvgpu
parent58ee7561f72653aea8acece9f5d33ff8fe6fb99d (diff)
gpu: nvgpu: store bus addr of gpu regs
Usermode submit needs to access the usermode region of registers from userspace. Store the start address of register resource in struct nvgpu_os_linux to be used in remap to userspace. Bug 200145225 Bug 200541476 Change-Id: I3796b6bf67942af0cc16c86accb82a013032bfc8 Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1811838 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Signed-off-by: Debarshi Dutta <ddutta@nvidia.com> (cherry picked from commit 38c11db264f776fa495a3ba74caadf4262062b78 in dev-main) Reviewed-on: https://git-master.nvidia.com/r/2169921 GVS: Gerrit_Virtual_Submit Reviewed-by: Bibek Basu <bbasu@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r--drivers/gpu/nvgpu/os/linux/module.c18
-rw-r--r--drivers/gpu/nvgpu/os/linux/module.h1
-rw-r--r--drivers/gpu/nvgpu/os/linux/os_linux.h2
-rw-r--r--drivers/gpu/nvgpu/os/linux/pci.c7
4 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/os/linux/module.c b/drivers/gpu/nvgpu/os/linux/module.c
index a81d837b..ebe2e650 100644
--- a/drivers/gpu/nvgpu/os/linux/module.c
+++ b/drivers/gpu/nvgpu/os/linux/module.c
@@ -680,6 +680,16 @@ void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset,
680 return devm_ioremap(dev, offset, size); 680 return devm_ioremap(dev, offset, size);
681} 681}
682 682
683u64 nvgpu_resource_addr(struct platform_device *dev, int i)
684{
685 struct resource *r = platform_get_resource(dev, IORESOURCE_MEM, i);
686
687 if (!r)
688 return 0;
689
690 return r->start;
691}
692
683static irqreturn_t gk20a_intr_isr_stall(int irq, void *dev_id) 693static irqreturn_t gk20a_intr_isr_stall(int irq, void *dev_id)
684{ 694{
685 struct gk20a *g = dev_id; 695 struct gk20a *g = dev_id;
@@ -764,6 +774,14 @@ static int gk20a_init_support(struct platform_device *pdev)
764 goto fail; 774 goto fail;
765 } 775 }
766 776
777 l->regs_bus_addr = nvgpu_resource_addr(pdev,
778 GK20A_BAR0_IORESOURCE_MEM);
779 if (!l->regs_bus_addr) {
780 nvgpu_err(g, "failed to read register bus offset");
781 err = -ENODEV;
782 goto fail;
783 }
784
767 l->bar1 = nvgpu_devm_ioremap_resource(pdev, 785 l->bar1 = nvgpu_devm_ioremap_resource(pdev,
768 GK20A_BAR1_IORESOURCE_MEM, 786 GK20A_BAR1_IORESOURCE_MEM,
769 &l->bar1_mem); 787 &l->bar1_mem);
diff --git a/drivers/gpu/nvgpu/os/linux/module.h b/drivers/gpu/nvgpu/os/linux/module.h
index da61425d..76c72748 100644
--- a/drivers/gpu/nvgpu/os/linux/module.h
+++ b/drivers/gpu/nvgpu/os/linux/module.h
@@ -29,6 +29,7 @@ void __iomem *nvgpu_devm_ioremap_resource(struct platform_device *dev, int i,
29 struct resource **out); 29 struct resource **out);
30void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset, 30void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset,
31 resource_size_t size); 31 resource_size_t size);
32u64 nvgpu_resource_addr(struct platform_device *dev, int i);
32extern struct class nvgpu_class; 33extern struct class nvgpu_class;
33 34
34#endif 35#endif
diff --git a/drivers/gpu/nvgpu/os/linux/os_linux.h b/drivers/gpu/nvgpu/os/linux/os_linux.h
index 5f636f49..d4b5a770 100644
--- a/drivers/gpu/nvgpu/os/linux/os_linux.h
+++ b/drivers/gpu/nvgpu/os/linux/os_linux.h
@@ -128,6 +128,8 @@ struct nvgpu_os_linux {
128 void __iomem *usermode_regs; 128 void __iomem *usermode_regs;
129 void __iomem *usermode_regs_saved; 129 void __iomem *usermode_regs_saved;
130 130
131 u64 regs_bus_addr;
132
131 struct nvgpu_os_linux_ops ops; 133 struct nvgpu_os_linux_ops ops;
132 134
133#ifdef CONFIG_DEBUG_FS 135#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/gpu/nvgpu/os/linux/pci.c b/drivers/gpu/nvgpu/os/linux/pci.c
index 2e456abc..61e412f2 100644
--- a/drivers/gpu/nvgpu/os/linux/pci.c
+++ b/drivers/gpu/nvgpu/os/linux/pci.c
@@ -536,6 +536,13 @@ static int nvgpu_pci_init_support(struct pci_dev *pdev)
536 goto fail; 536 goto fail;
537 } 537 }
538 538
539 l->regs_bus_addr = pci_resource_start(pdev, 0);
540 if (!l->regs_bus_addr) {
541 nvgpu_err(g, "failed to read register bus offset");
542 err = -ENODEV;
543 goto fail;
544 }
545
539 l->bar1 = nvgpu_devm_ioremap(dev, pci_resource_start(pdev, 1), 546 l->bar1 = nvgpu_devm_ioremap(dev, pci_resource_start(pdev, 1),
540 pci_resource_len(pdev, 1)); 547 pci_resource_len(pdev, 1));
541 if (IS_ERR(l->bar1)) { 548 if (IS_ERR(l->bar1)) {