summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
diff options
context:
space:
mode:
authorSourab Gupta <sourabg@nvidia.com>2018-02-20 05:37:43 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-03-29 21:54:38 -0400
commit0b2ea2924bd0122e0eaa286b4dbcfc9fe96ebe20 (patch)
treee5c7daebf3254032c8d1d645dfd4e3fc24e5ef55 /drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
parent8d8ff9d34e9707e9306fcf40b5ffcfa0d826765a (diff)
gpu: nvgpu: add gops.fifo.setup_sw
bar1/userd setup is different for RM server. created common function gk20a_init_fifo_setup_sw_common. Jira VQRM-3058 Change-Id: I655b54e21ed5f15dcb8e7b01bd9cd129b35ae7a3 Signed-off-by: Richard Zhao <rizhao@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1665691 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c119
1 files changed, 86 insertions, 33 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 576a7f81..fd7faa22 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -862,24 +862,27 @@ int gk20a_init_fifo_reset_enable_hw(struct gk20a *g)
862 return 0; 862 return 0;
863} 863}
864 864
865int gk20a_init_fifo_setup_sw(struct gk20a *g) 865int gk20a_init_fifo_setup_sw_common(struct gk20a *g)
866{ 866{
867 struct fifo_gk20a *f = &g->fifo; 867 struct fifo_gk20a *f = &g->fifo;
868 unsigned int chid, i; 868 unsigned int chid, i;
869 int err = 0; 869 int err = 0;
870 u64 userd_base;
871 870
872 gk20a_dbg_fn(""); 871 gk20a_dbg_fn("");
873 872
874 if (f->sw_ready) {
875 gk20a_dbg_fn("skip init");
876 return 0;
877 }
878
879 f->g = g; 873 f->g = g;
880 874
881 nvgpu_mutex_init(&f->intr.isr.mutex); 875 err = nvgpu_mutex_init(&f->intr.isr.mutex);
882 nvgpu_mutex_init(&f->gr_reset_mutex); 876 if (err) {
877 nvgpu_err(g, "failed to init isr.mutex");
878 return err;
879 }
880
881 err = nvgpu_mutex_init(&f->gr_reset_mutex);
882 if (err) {
883 nvgpu_err(g, "failed to init gr_reset_mutex");
884 return err;
885 }
883 886
884 g->ops.fifo.init_pbdma_intr_descs(f); /* just filling in data/tables */ 887 g->ops.fifo.init_pbdma_intr_descs(f); /* just filling in data/tables */
885 888
@@ -914,7 +917,73 @@ int gk20a_init_fifo_setup_sw(struct gk20a *g)
914 init_runlist(g, f); 917 init_runlist(g, f);
915 918
916 nvgpu_init_list_node(&f->free_chs); 919 nvgpu_init_list_node(&f->free_chs);
917 nvgpu_mutex_init(&f->free_chs_mutex); 920
921 err = nvgpu_mutex_init(&f->free_chs_mutex);
922 if (err) {
923 nvgpu_err(g, "failed to init free_chs_mutex");
924 goto clean_up;
925 }
926
927 for (chid = 0; chid < f->num_channels; chid++) {
928 gk20a_init_channel_support(g, chid);
929 gk20a_init_tsg_support(g, chid);
930 }
931
932 err = nvgpu_mutex_init(&f->tsg_inuse_mutex);
933 if (err) {
934 nvgpu_err(g, "failed to init tsg_inuse_mutex");
935 goto clean_up;
936 }
937
938 f->remove_support = gk20a_remove_fifo_support;
939
940 f->deferred_reset_pending = false;
941
942 err = nvgpu_mutex_init(&f->deferred_reset_mutex);
943 if (err) {
944 nvgpu_err(g, "failed to init deferred_reset_mutex");
945 goto clean_up;
946 }
947
948 gk20a_dbg_fn("done");
949 return 0;
950
951clean_up:
952 nvgpu_err(g, "fail");
953
954 nvgpu_vfree(g, f->channel);
955 f->channel = NULL;
956 nvgpu_vfree(g, f->tsg);
957 f->tsg = NULL;
958 nvgpu_kfree(g, f->pbdma_map);
959 f->pbdma_map = NULL;
960 nvgpu_kfree(g, f->engine_info);
961 f->engine_info = NULL;
962 nvgpu_kfree(g, f->active_engines_list);
963 f->active_engines_list = NULL;
964
965 return err;
966}
967
968int gk20a_init_fifo_setup_sw(struct gk20a *g)
969{
970 struct fifo_gk20a *f = &g->fifo;
971 unsigned int chid;
972 u64 userd_base;
973 int err = 0;
974
975 gk20a_dbg_fn("");
976
977 if (f->sw_ready) {
978 gk20a_dbg_fn("skip init");
979 return 0;
980 }
981
982 err = gk20a_init_fifo_setup_sw_common(g);
983 if (err) {
984 nvgpu_err(g, "fail: err: %d", err);
985 return err;
986 }
918 987
919 if (g->ops.mm.is_bar1_supported(g)) 988 if (g->ops.mm.is_bar1_supported(g))
920 err = nvgpu_dma_alloc_map_sys(g->mm.bar1.vm, 989 err = nvgpu_dma_alloc_map_sys(g->mm.bar1.vm,
@@ -936,18 +1005,11 @@ int gk20a_init_fifo_setup_sw(struct gk20a *g)
936 chid * f->userd_entry_size; 1005 chid * f->userd_entry_size;
937 f->channel[chid].userd_gpu_va = 1006 f->channel[chid].userd_gpu_va =
938 f->userd.gpu_va + chid * f->userd_entry_size; 1007 f->userd.gpu_va + chid * f->userd_entry_size;
939 gk20a_init_channel_support(g, chid);
940 gk20a_init_tsg_support(g, chid);
941 } 1008 }
942 nvgpu_mutex_init(&f->tsg_inuse_mutex);
943 1009
944 err = nvgpu_channel_worker_init(g); 1010 err = nvgpu_channel_worker_init(g);
945 if (err) 1011 if (err)
946 goto clean_up; 1012 goto clean_up;
947 f->remove_support = gk20a_remove_fifo_support;
948
949 f->deferred_reset_pending = false;
950 nvgpu_mutex_init(&f->deferred_reset_mutex);
951 1013
952 f->sw_ready = true; 1014 f->sw_ready = true;
953 1015
@@ -956,21 +1018,12 @@ int gk20a_init_fifo_setup_sw(struct gk20a *g)
956 1018
957clean_up: 1019clean_up:
958 gk20a_dbg_fn("fail"); 1020 gk20a_dbg_fn("fail");
959 if (g->ops.mm.is_bar1_supported(g)) 1021 if (nvgpu_mem_is_valid(&f->userd)) {
960 nvgpu_dma_unmap_free(g->mm.bar1.vm, &f->userd); 1022 if (g->ops.mm.is_bar1_supported(g))
961 else 1023 nvgpu_dma_unmap_free(g->mm.bar1.vm, &f->userd);
962 nvgpu_dma_free(g, &f->userd); 1024 else
963 1025 nvgpu_dma_free(g, &f->userd);
964 nvgpu_vfree(g, f->channel); 1026 }
965 f->channel = NULL;
966 nvgpu_vfree(g, f->tsg);
967 f->tsg = NULL;
968 nvgpu_kfree(g, f->pbdma_map);
969 f->pbdma_map = NULL;
970 nvgpu_kfree(g, f->engine_info);
971 f->engine_info = NULL;
972 nvgpu_kfree(g, f->active_engines_list);
973 f->active_engines_list = NULL;
974 1027
975 return err; 1028 return err;
976} 1029}
@@ -1049,7 +1102,7 @@ int gk20a_init_fifo_support(struct gk20a *g)
1049{ 1102{
1050 u32 err; 1103 u32 err;
1051 1104
1052 err = gk20a_init_fifo_setup_sw(g); 1105 err = g->ops.fifo.setup_sw(g);
1053 if (err) 1106 if (err)
1054 return err; 1107 return err;
1055 1108