summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorAlex Waterman <alexw@nvidia.com>2016-08-03 21:41:36 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-09-01 12:10:10 -0400
commitaa7f4bf251ee6346bf300f3793002eb4a7f05562 (patch)
tree573ee8b63c82a125f92e78ba721a3567ebc2be99 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parentc845b210129a4a2ebd8a3cd22c53dc30cad3664d (diff)
gpu: nvgpu: Add a bootstrap vidmem allocator
Add an allocator for allocating vidmem before the CE has had a chance to be initialized (and clear the rest of vidmem). Jira DNVGPU-84 Change-Id: I5166607a712b3a6eb4c2906b8c7d002c68a6567b Signed-off-by: Alex Waterman <alexw@nvidia.com> Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: http://git-master/r/1197204 (cherry picked from commit b4e68e84eedd952637b2332d8dc73a9090d6d62e) Reviewed-on: http://git-master/r/1210949 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index dde798cf..a5158e7c 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -781,19 +781,38 @@ static int gk20a_init_vidmem(struct mm_gk20a *mm)
781 struct device *d = dev_from_gk20a(g); 781 struct device *d = dev_from_gk20a(g);
782 size_t size = g->ops.mm.get_vidmem_size ? 782 size_t size = g->ops.mm.get_vidmem_size ?
783 g->ops.mm.get_vidmem_size(g) : 0; 783 g->ops.mm.get_vidmem_size(g) : 0;
784 u64 bootstrap_base, bootstrap_size, base;
784 int err; 785 int err;
785 786
786 if (!size) 787 if (!size)
787 return 0; 788 return 0;
788 789
790 bootstrap_base = NVGPU_VIDMEM_BOOTSTRAP_ALLOCATOR_BASE;
791 bootstrap_size = SZ_16M;
792 base = SZ_4K;
793
794 /*
795 * Bootstrap allocator for use before the CE is initialized (CE
796 * initialization requires vidmem but we want to use the CE to zero
797 * out vidmem before allocating it...
798 */
799 err = gk20a_page_allocator_init(&g->mm.vidmem.bootstrap_allocator,
800 "vidmem-bootstrap",
801 bootstrap_base, bootstrap_size,
802 SZ_4K, 0);
803
789 err = gk20a_page_allocator_init(&g->mm.vidmem.allocator, "vidmem", 804 err = gk20a_page_allocator_init(&g->mm.vidmem.allocator, "vidmem",
790 SZ_4K, size - SZ_4K, SZ_4K, 0); 805 base, size - base, SZ_4K, 0);
791 if (err) { 806 if (err) {
792 gk20a_err(d, "Failed to register vidmem for size %zu: %d", 807 gk20a_err(d, "Failed to register vidmem for size %zu: %d",
793 size, err); 808 size, err);
794 return err; 809 return err;
795 } 810 }
796 811
812 /* Reserve bootstrap region in vidmem allocator */
813 gk20a_alloc_fixed(&g->mm.vidmem.allocator,
814 bootstrap_base, bootstrap_size);
815
797 mm->vidmem.size = size; 816 mm->vidmem.size = size;
798 817
799 gk20a_dbg_info("registered vidmem: %zu MB", size / SZ_1M); 818 gk20a_dbg_info("registered vidmem: %zu MB", size / SZ_1M);
@@ -2741,6 +2760,9 @@ int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr,
2741#if defined(CONFIG_GK20A_VIDMEM) 2760#if defined(CONFIG_GK20A_VIDMEM)
2742 u64 addr; 2761 u64 addr;
2743 int err; 2762 int err;
2763 struct gk20a_allocator *vidmem_alloc = g->mm.vidmem.cleared ?
2764 &g->mm.vidmem.allocator :
2765 &g->mm.vidmem.bootstrap_allocator;
2744 2766
2745 gk20a_dbg_fn(""); 2767 gk20a_dbg_fn("");
2746 2768
@@ -2752,13 +2774,13 @@ int gk20a_gmmu_alloc_attr_vid_at(struct gk20a *g, enum dma_attr attr,
2752 WARN_ON(attr != 0 && attr != DMA_ATTR_NO_KERNEL_MAPPING); 2774 WARN_ON(attr != 0 && attr != DMA_ATTR_NO_KERNEL_MAPPING);
2753 2775
2754 if (at) { 2776 if (at) {
2755 addr = gk20a_alloc_fixed(&g->mm.vidmem.allocator, at, size); 2777 addr = gk20a_alloc_fixed(vidmem_alloc, at, size);
2756 if (!addr) 2778 if (!addr)
2757 return -ENOMEM; 2779 return -ENOMEM;
2758 2780
2759 mem->fixed = true; 2781 mem->fixed = true;
2760 } else { 2782 } else {
2761 addr = gk20a_alloc(&g->mm.vidmem.allocator, size); 2783 addr = gk20a_alloc(vidmem_alloc, size);
2762 if (!addr) 2784 if (!addr)
2763 return -ENOMEM; 2785 return -ENOMEM;
2764 2786