summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c109
1 files changed, 55 insertions, 54 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index df6b84c5..64203027 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -72,8 +72,6 @@ static int init_engine_info(struct fifo_gk20a *f)
72{ 72{
73 struct gk20a *g = f->g; 73 struct gk20a *g = f->g;
74 struct device *d = dev_from_gk20a(g); 74 struct device *d = dev_from_gk20a(g);
75 struct fifo_engine_info_gk20a *gr_info;
76 const u32 gr_sw_id = ENGINE_GR_GK20A;
77 u32 i; 75 u32 i;
78 u32 max_info_entries = top_device_info__size_1_v(); 76 u32 max_info_entries = top_device_info__size_1_v();
79 77
@@ -81,77 +79,80 @@ static int init_engine_info(struct fifo_gk20a *f)
81 79
82 /* all we really care about finding is the graphics entry */ 80 /* all we really care about finding is the graphics entry */
83 /* especially early on in sim it probably thinks it has more */ 81 /* especially early on in sim it probably thinks it has more */
84 f->num_engines = 1; 82 f->num_engines = 2;
85
86 gr_info = f->engine_info + gr_sw_id;
87
88 gr_info->sw_id = gr_sw_id;
89 gr_info->name = "gr";
90 gr_info->dev_info_id = top_device_info_type_enum_graphics_v();
91 gr_info->mmu_fault_id = fifo_intr_mmu_fault_eng_id_graphics_v();
92 gr_info->runlist_id = ~0;
93 gr_info->pbdma_id = ~0;
94 gr_info->engine_id = ~0;
95 83
96 for (i = 0; i < max_info_entries; i++) { 84 for (i = 0; i < max_info_entries; i++) {
85 struct fifo_engine_info_gk20a *info = NULL;
97 u32 table_entry = gk20a_readl(f->g, top_device_info_r(i)); 86 u32 table_entry = gk20a_readl(f->g, top_device_info_r(i));
98 u32 entry = top_device_info_entry_v(table_entry); 87 u32 entry = top_device_info_entry_v(table_entry);
99 u32 engine_enum = top_device_info_type_enum_v(table_entry); 88 u32 engine_enum;
100 u32 table_entry2 = 0; 89 int pbdma_id;
90 u32 runlist_bit;
101 91
102 if (entry == top_device_info_entry_not_valid_v()) 92 if (entry != top_device_info_entry_enum_v())
103 continue; 93 continue;
104 94
105 if (top_device_info_chain_v(table_entry) == 95 /* we only care about GR engine here */
106 top_device_info_chain_enable_v()) { 96 engine_enum = top_device_info_engine_enum_v(table_entry);
97 if (engine_enum >= ENGINE_INVAL_GK20A)
98 continue;
107 99
108 table_entry2 = gk20a_readl(f->g, 100 gk20a_dbg_info("info: engine_id %d",
109 top_device_info_r(++i)); 101 top_device_info_engine_enum_v(table_entry));
102 info = &g->fifo.engine_info[engine_enum];
110 103
111 engine_enum = top_device_info_type_enum_v(table_entry2); 104 info->runlist_id =
112 } 105 top_device_info_runlist_enum_v(table_entry);
106 gk20a_dbg_info("gr info: runlist_id %d", info->runlist_id);
113 107
114 /* we only care about GR engine here */ 108 info->engine_id =
115 if (entry == top_device_info_entry_enum_v() && 109 top_device_info_engine_enum_v(table_entry);
116 engine_enum == gr_info->dev_info_id) { 110 gk20a_dbg_info("gr info: engine_id %d", info->engine_id);
117 int pbdma_id;
118 u32 runlist_bit;
119
120 gr_info->runlist_id =
121 top_device_info_runlist_enum_v(table_entry);
122 gk20a_dbg_info("gr info: runlist_id %d", gr_info->runlist_id);
123
124 gr_info->engine_id =
125 top_device_info_engine_enum_v(table_entry);
126 gk20a_dbg_info("gr info: engine_id %d", gr_info->engine_id);
127
128 runlist_bit = 1 << gr_info->runlist_id;
129
130 for (pbdma_id = 0; pbdma_id < f->num_pbdma; pbdma_id++) {
131 gk20a_dbg_info("gr info: pbdma_map[%d]=%d",
132 pbdma_id, f->pbdma_map[pbdma_id]);
133 if (f->pbdma_map[pbdma_id] & runlist_bit)
134 break;
135 }
136 111
137 if (pbdma_id == f->num_pbdma) { 112 runlist_bit = 1 << info->runlist_id;
138 gk20a_err(d, "busted pbmda map");
139 return -EINVAL;
140 }
141 gr_info->pbdma_id = pbdma_id;
142 113
143 break; 114 for (pbdma_id = 0; pbdma_id < f->num_pbdma; pbdma_id++) {
115 gk20a_dbg_info("gr info: pbdma_map[%d]=%d",
116 pbdma_id, f->pbdma_map[pbdma_id]);
117 if (f->pbdma_map[pbdma_id] & runlist_bit)
118 break;
144 } 119 }
145 }
146 120
147 if (gr_info->runlist_id == ~0) { 121 if (pbdma_id == f->num_pbdma) {
148 gk20a_err(d, "busted device info"); 122 gk20a_err(d, "busted pbmda map");
149 return -EINVAL; 123 return -EINVAL;
124 }
125 info->pbdma_id = pbdma_id;
126
127 info->intr_id =
128 top_device_info_intr_enum_v(table_entry);
129 gk20a_dbg_info("gr info: intr_id %d", info->intr_id);
130
131 info->reset_id =
132 top_device_info_reset_enum_v(table_entry);
133 gk20a_dbg_info("gr info: reset_id %d",
134 info->reset_id);
135
150 } 136 }
151 137
152 return 0; 138 return 0;
153} 139}
154 140
141u32 gk20a_fifo_engine_interrupt_mask(struct gk20a *g)
142{
143 u32 eng_intr_mask = 0;
144 int i = 0;
145
146 for (i = 0; i < g->fifo.max_engines; i++) {
147 u32 intr_id = g->fifo.engine_info[i].intr_id;
148
149 if (intr_id)
150 eng_intr_mask |= BIT(intr_id);
151 }
152
153 return eng_intr_mask;
154}
155
155static void gk20a_remove_fifo_support(struct fifo_gk20a *f) 156static void gk20a_remove_fifo_support(struct fifo_gk20a *f)
156{ 157{
157 struct gk20a *g = f->g; 158 struct gk20a *g = f->g;