diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2018-09-11 07:35:09 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2019-08-15 03:58:05 -0400 |
commit | eca2cf043e3f52734e2fbba68631a2ef70dad76d (patch) | |
tree | b714da5be2e95285cd01173a7a74d4e7c0340af1 /drivers/gpu/nvgpu/os/linux | |
parent | 58ee7561f72653aea8acece9f5d33ff8fe6fb99d (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/os/linux')
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/module.c | 18 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/module.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/os_linux.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/os/linux/pci.c | 7 |
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 | ||
683 | u64 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 | |||
683 | static irqreturn_t gk20a_intr_isr_stall(int irq, void *dev_id) | 693 | static 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); |
30 | void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset, | 30 | void __iomem *nvgpu_devm_ioremap(struct device *dev, resource_size_t offset, |
31 | resource_size_t size); | 31 | resource_size_t size); |
32 | u64 nvgpu_resource_addr(struct platform_device *dev, int i); | ||
32 | extern struct class nvgpu_class; | 33 | extern 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)) { |