diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 109 |
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 | ||
141 | u32 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 | |||
155 | static void gk20a_remove_fifo_support(struct fifo_gk20a *f) | 156 | static void gk20a_remove_fifo_support(struct fifo_gk20a *f) |
156 | { | 157 | { |
157 | struct gk20a *g = f->g; | 158 | struct gk20a *g = f->g; |