Lines Matching refs:gcl

38 static void tsnep_write_gcl_operation(struct tsnep_gcl *gcl, int index,  in tsnep_write_gcl_operation()  argument
41 void __iomem *addr = gcl->addr + in tsnep_write_gcl_operation()
44 gcl->operation[index].properties = properties; in tsnep_write_gcl_operation()
45 gcl->operation[index].interval = interval; in tsnep_write_gcl_operation()
56 static u64 tsnep_change_duration(struct tsnep_gcl *gcl, int index) in tsnep_change_duration() argument
75 duration += gcl->operation[index].interval; in tsnep_change_duration()
79 index = gcl->count - 1; in tsnep_change_duration()
87 static void tsnep_write_gcl(struct tsnep_gcl *gcl, in tsnep_write_gcl() argument
95 gcl->base_time = ktime_to_ns(qopt->base_time); in tsnep_write_gcl()
96 gcl->cycle_time = qopt->cycle_time; in tsnep_write_gcl()
97 gcl->cycle_time_extension = qopt->cycle_time_extension; in tsnep_write_gcl()
104 tsnep_write_gcl_operation(gcl, i, properties, in tsnep_write_gcl()
107 gcl->count = qopt->num_entries; in tsnep_write_gcl()
117 extend = tsnep_change_duration(gcl, gcl->count - 1); in tsnep_write_gcl()
118 extend += gcl->cycle_time_extension; in tsnep_write_gcl()
124 for (i = 0; i < gcl->count; i++) in tsnep_write_gcl()
125 cut = max(cut, tsnep_change_duration(gcl, i)); in tsnep_write_gcl()
130 gcl->change_limit = max(extend, cut); in tsnep_write_gcl()
133 static u64 tsnep_gcl_start_after(struct tsnep_gcl *gcl, u64 limit) in tsnep_gcl_start_after() argument
135 u64 start = gcl->base_time; in tsnep_gcl_start_after()
139 n = div64_u64(limit - start, gcl->cycle_time); in tsnep_gcl_start_after()
140 start += (n + 1) * gcl->cycle_time; in tsnep_gcl_start_after()
146 static u64 tsnep_gcl_start_before(struct tsnep_gcl *gcl, u64 limit) in tsnep_gcl_start_before() argument
148 u64 start = gcl->base_time; in tsnep_gcl_start_before()
151 n = div64_u64(limit - start, gcl->cycle_time); in tsnep_gcl_start_before()
152 start += n * gcl->cycle_time; in tsnep_gcl_start_before()
154 start -= gcl->cycle_time; in tsnep_gcl_start_before()
159 static u64 tsnep_set_gcl_change(struct tsnep_gcl *gcl, int index, u64 change, in tsnep_set_gcl_change() argument
166 index = gcl->count - 1; in tsnep_set_gcl_change()
169 change -= gcl->operation[index].interval; in tsnep_set_gcl_change()
173 void __iomem *addr = gcl->addr + in tsnep_set_gcl_change()
176 gcl->operation[index].properties |= TSNEP_GCL_INSERT; in tsnep_set_gcl_change()
177 iowrite32(gcl->operation[index].properties, addr); in tsnep_set_gcl_change()
183 static void tsnep_clean_gcl(struct tsnep_gcl *gcl) in tsnep_clean_gcl() argument
190 for (i = 0; i < gcl->count; i++) { in tsnep_clean_gcl()
191 if (gcl->operation[i].properties & ~mask) { in tsnep_clean_gcl()
192 addr = gcl->addr + in tsnep_clean_gcl()
195 gcl->operation[i].properties &= mask; in tsnep_clean_gcl()
196 iowrite32(gcl->operation[i].properties, addr); in tsnep_clean_gcl()
203 static u64 tsnep_insert_gcl_operation(struct tsnep_gcl *gcl, int ref, in tsnep_insert_gcl_operation() argument
208 properties = gcl->operation[ref].properties & TSNEP_GCL_MASK; in tsnep_insert_gcl_operation()
213 tsnep_write_gcl_operation(gcl, TSNEP_GCL_COUNT - 1, properties, in tsnep_insert_gcl_operation()
216 return tsnep_set_gcl_change(gcl, ref, change, true); in tsnep_insert_gcl_operation()
219 static u64 tsnep_extend_gcl(struct tsnep_gcl *gcl, u64 start, u32 extension) in tsnep_extend_gcl() argument
221 int ref = gcl->count - 1; in tsnep_extend_gcl()
222 u32 interval = gcl->operation[ref].interval + extension; in tsnep_extend_gcl()
224 start -= gcl->operation[ref].interval; in tsnep_extend_gcl()
226 return tsnep_insert_gcl_operation(gcl, ref, start, interval); in tsnep_extend_gcl()
229 static u64 tsnep_cut_gcl(struct tsnep_gcl *gcl, u64 start, u64 cycle_time) in tsnep_cut_gcl() argument
235 for (i = 0; i < gcl->count; i++) { in tsnep_cut_gcl()
236 u64 sum_tmp = sum + gcl->operation[i].interval; in tsnep_cut_gcl()
254 return tsnep_set_gcl_change(gcl, i, start + sum, false); in tsnep_cut_gcl()
256 return tsnep_insert_gcl_operation(gcl, i, start + sum, in tsnep_cut_gcl()
261 struct tsnep_gcl *gcl, struct tsnep_gcl *curr) in tsnep_enable_gcl() argument
278 gcl->start_time = tsnep_gcl_start_after(gcl, limit); in tsnep_enable_gcl()
283 if ((gcl->start_time - system_time) >= U32_MAX) in tsnep_enable_gcl()
291 last = tsnep_gcl_start_before(curr, gcl->start_time); in tsnep_enable_gcl()
292 if ((last + curr->cycle_time) == gcl->start_time) in tsnep_enable_gcl()
294 gcl->start_time - last); in tsnep_enable_gcl()
295 else if (((gcl->start_time - last) <= in tsnep_enable_gcl()
297 ((gcl->start_time - last) <= TSNEP_GCL_MIN_INTERVAL)) in tsnep_enable_gcl()
299 gcl->start_time - last); in tsnep_enable_gcl()
302 gcl->start_time - last); in tsnep_enable_gcl()
305 gcl->change = true; in tsnep_enable_gcl()
309 WARN_ON(gcl->start_time <= timeout); in tsnep_enable_gcl()
310 gcl->change = false; in tsnep_enable_gcl()
311 iowrite32(gcl->start_time & 0xFFFFFFFF, in tsnep_enable_gcl()
321 struct tsnep_gcl *gcl; in tsnep_taprio() local
348 gcl = &adapter->gcl[adapter->next_gcl]; in tsnep_taprio()
349 tsnep_write_gcl(gcl, qopt); in tsnep_taprio()
354 curr = &adapter->gcl[1]; in tsnep_taprio()
356 curr = &adapter->gcl[0]; in tsnep_taprio()
367 retval = tsnep_enable_gcl(adapter, gcl, curr); in tsnep_taprio()
449 adapter->gcl[0].addr = adapter->addr + TSNEP_GCL_A; in tsnep_tc_init()
450 adapter->gcl[1].addr = adapter->addr + TSNEP_GCL_B; in tsnep_tc_init()