diff options
author | Alex Waterman <alexw@nvidia.com> | 2016-08-03 21:41:36 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2016-09-01 12:10:10 -0400 |
commit | aa7f4bf251ee6346bf300f3793002eb4a7f05562 (patch) | |
tree | 573ee8b63c82a125f92e78ba721a3567ebc2be99 | |
parent | c845b210129a4a2ebd8a3cd22c53dc30cad3664d (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>
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.c | 28 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mm_gk20a.h | 4 |
2 files changed, 29 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 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h index 60f653e0..e4d7d741 100644 --- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.h | |||
@@ -51,6 +51,8 @@ enum gk20a_aperture { | |||
51 | APERTURE_VIDMEM | 51 | APERTURE_VIDMEM |
52 | }; | 52 | }; |
53 | 53 | ||
54 | #define NVGPU_VIDMEM_BOOTSTRAP_ALLOCATOR_BASE 0x18000000 | ||
55 | |||
54 | static inline const char *gk20a_aperture_str(enum gk20a_aperture aperture) | 56 | static inline const char *gk20a_aperture_str(enum gk20a_aperture aperture) |
55 | { | 57 | { |
56 | switch (aperture) { | 58 | switch (aperture) { |
@@ -404,7 +406,9 @@ struct mm_gk20a { | |||
404 | struct { | 406 | struct { |
405 | size_t size; | 407 | size_t size; |
406 | struct gk20a_allocator allocator; | 408 | struct gk20a_allocator allocator; |
409 | struct gk20a_allocator bootstrap_allocator; | ||
407 | u32 ce_ctx_id; | 410 | u32 ce_ctx_id; |
411 | bool cleared; | ||
408 | } vidmem; | 412 | } vidmem; |
409 | }; | 413 | }; |
410 | 414 | ||