Lines Matching refs:bd_chain

3 * bd_chain.h - bd chain interface 
23 __inline static u16_t lm_bd_chain_avail_bds(lm_bd_chain_t* bd_chain)
25 return bd_chain->bd_left;
29 __inline static u16_t lm_bd_chain_prod_idx(lm_bd_chain_t* bd_chain)
31 return bd_chain->prod_idx;
35 __inline static u16_t lm_bd_chain_cons_idx(lm_bd_chain_t* bd_chain)
37 return bd_chain->cons_idx;
41 __inline static u16_t lm_bd_chain_usable_bds_per_page(lm_bd_chain_t* bd_chain)
43 return bd_chain->usable_bds_per_page;
47 __inline static u16_t lm_bd_chain_page_cnt(lm_bd_chain_t* bd_chain)
49 return bd_chain->page_cnt;
53 __inline static u16_t lm_bd_chain_bds_per_page(lm_bd_chain_t* bd_chain)
55 return bd_chain->bds_per_page;
59 __inline static u16_t lm_bd_chain_bds_per_page_mask(lm_bd_chain_t* bd_chain)
61 return bd_chain->bds_per_page_mask;
65 __inline static u16_t lm_bd_chain_bds_skip_eop(lm_bd_chain_t* bd_chain)
67 return bd_chain->bds_skip_eop;
71 __inline static u8_t lm_bd_chain_is_empty(lm_bd_chain_t* bd_chain)
73 return (bd_chain->bd_left == 0);
77 __inline static u8_t lm_bd_chain_is_full(lm_bd_chain_t* bd_chain)
79 return (bd_chain->bd_left == bd_chain->capacity);
83 __inline static lm_address_t lm_bd_chain_phys_addr(lm_bd_chain_t* bd_chain, u8_t page_idx)
85 lm_address_t mem_phys = bd_chain->bd_chain_phy;
88 page_idx = page_idx % bd_chain->page_cnt;
90 if (bd_chain->b_is_chain_mode)
101 mem_phys = bd_chain->pbl_phys_addr_table[page_idx];
113 __inline static void lm_bd_chain_set_next_ptrs(lm_bd_chain_t * bd_chain)
122 mem_virt = bd_chain->bd_chain_virt;
123 mem_phy = bd_chain->bd_chain_phy;
129 DbgBreakIf(!bd_chain->b_is_chain_mode);
155 for(idx = 0; idx < bd_chain->page_cnt-1; idx++)
167 next_bd = (lm_bd_chain_next *)(mem_virt + (bd_chain->bd_size) * (bd_chain->usable_bds_per_page));
179 next_bd = (lm_bd_chain_next *)(mem_virt + (bd_chain->bd_size) * (bd_chain->usable_bds_per_page));
193 lm_bd_chain_t* bd_chain,
204 DbgBreakIf((bd_chain->page_cnt + 1) * BD_PER_PAGE(bd_size) > 0xffff);
207 if (bd_chain->page_cnt) {
209 DbgBreakIf(bd_chain->bd_size != bd_size);
210 next_bd = (lm_bd_chain_next *)((u8_t*)bd_chain->bd_chain_virt + (bd_chain->bd_size) * (bd_chain->usable_bds_per_page));
211 for (page_index = 0; page_index < bd_chain->page_cnt - 1; page_index++) {
212 next_bd = (lm_bd_chain_next *)((u8_t*)(*(void **)(next_bd->reserved)) + (bd_chain->bd_size) * (bd_chain->usable_bds_per_page));
217 next_bd = (lm_bd_chain_next *)((u8_t*)mem_virt + (bd_chain->bd_size) * (bd_chain->usable_bds_per_page));
218 next_bd->addr_hi = mm_cpu_to_le32(bd_chain->bd_chain_phy.as_u32.high);
219 next_bd->addr_lo = mm_cpu_to_le32(bd_chain->bd_chain_phy.as_u32.low);
220 *((u8_t **) next_bd->reserved) = bd_chain->bd_chain_virt;
222 bd_chain->bd_chain_phy = mem_phys;
223 bd_chain->bd_chain_virt = mem_virt;
224 bd_chain->bd_size = bd_size;
225 bd_chain->bds_skip_eop = NUM_BDS_USED_FOR_NEXT_PTR(bd_size,is_chain_mode);
226 bd_chain->usable_bds_per_page = USABLE_BDS_PER_PAGE(bd_size,is_chain_mode);
227 bd_chain->bds_per_page = BD_PER_PAGE(bd_size);
228 bd_chain->b_is_chain_mode = TRUE;
229 bd_chain->num_bd_to_sub = 0;
230 bd_chain->usable_bds_mask = bd_chain->usable_bds_per_page;
232 /* we assume power of 2 for bd_chain->bds_per_page */
233 DbgBreakIf(bd_chain->bds_per_page != log2_align((u32_t)bd_chain->bds_per_page));
234 bd_chain->bds_per_page_mask = bd_chain->bds_per_page - 1;
235 bd_chain->cons_idx = 0;
236 bd_chain->prod_idx = 0;
237 bd_chain->next_bd = bd_chain->bd_chain_virt;
239 next_bd = (lm_bd_chain_next *)((u8_t*)mem_virt + (bd_chain->bd_size) * (bd_chain->usable_bds_per_page));
256 bd_chain->page_cnt++;
257 bd_chain->capacity = bd_chain->page_cnt * bd_chain->usable_bds_per_page;
258 bd_chain->bd_left = bd_chain->capacity;
265 lm_bd_chain_t* bd_chain,
277 bd_chain->bd_chain_phy = mem_phys;
278 bd_chain->bd_chain_virt = mem_virt;
279 bd_chain->bd_size = bd_size;
280 bd_chain->bds_skip_eop = NUM_BDS_USED_FOR_NEXT_PTR(bd_size,is_chain_mode);
281 bd_chain->usable_bds_per_page = USABLE_BDS_PER_PAGE(bd_size,is_chain_mode);
282 bd_chain->bds_per_page = BD_PER_PAGE(bd_size);
284 /* we assume power of 2 for bd_chain->bds_per_page */
285 DbgBreakIf(bd_chain->bds_per_page != log2_align((u32_t)bd_chain->bds_per_page));
286 bd_chain->bds_per_page_mask = bd_chain->bds_per_page - 1;
298 bd_chain->capacity = page_cnt;
299 bd_chain->capacity *= bd_chain->usable_bds_per_page;
301 bd_chain->capacity = page_cnt * bd_chain->usable_bds_per_page;
303 bd_chain->page_cnt = page_cnt;
304 bd_chain->next_bd = bd_chain->bd_chain_virt;
305 bd_chain->cons_idx = 0;
308 bd_chain->prod_idx = page_cnt * bd_chain->bds_per_page;
309 bd_chain->bd_left = 0;
311 bd_chain->prod_idx = 0;
314 bd_chain->bd_left = bd_chain->capacity;
318 bd_chain->b_is_chain_mode = TRUE;
319 bd_chain->num_bd_to_sub = 0;
320 bd_chain->usable_bds_mask = bd_chain->usable_bds_per_page;
321 lm_bd_chain_set_next_ptrs(bd_chain);
370 lm_bd_chain_t* bd_chain,
382 bd_chain,
395 bd_chain->pbl_phys_addr_table = pbl_phys_table;
396 bd_chain->pbl_virt_addr_table = pbl_virt_table;
397 bd_chain->b_is_chain_mode = FALSE;
398 bd_chain->num_bd_to_sub = 1;
399 bd_chain->usable_bds_mask = bd_chain->usable_bds_per_page - 1;
402 bd_chain->pbe_idx = page_cnt - 1;
406 bd_chain->pbl_phys_addr_table,
407 bd_chain->pbl_virt_addr_table,
421 __inline static void lm_bd_chain_reset(struct _lm_device_t * pdev, lm_bd_chain_t * bd_chain)
423 DbgBreakIf(!bd_chain->bd_chain_virt);
425 mm_memset(bd_chain->bd_chain_virt, 0, bd_chain->page_cnt * LM_PAGE_SIZE);
426 if (bd_chain->b_is_chain_mode)
429 bd_chain,
430 bd_chain->bd_chain_virt,
431 bd_chain->bd_chain_phy,
432 bd_chain->page_cnt,
433 bd_chain->bd_size,
435 bd_chain->b_is_chain_mode);
440 bd_chain,
441 bd_chain->bd_chain_virt,
442 bd_chain->bd_chain_phy,
443 bd_chain->pbl_virt_addr_table,
444 bd_chain->pbl_phys_addr_table,
445 bd_chain->page_cnt,
446 bd_chain->bd_size,
458 lm_bd_chain_t * bd_chain,
465 *virt = ((char *)*virt) + bd_chain->bd_size;
467 if((*bd_idx & bd_chain->usable_bds_per_page) == bd_chain->usable_bds_per_page) {
468 if (bd_chain->b_is_chain_mode) {
470 (*bd_idx) += bd_chain->bds_skip_eop;
482 __inline static void lm_bd_advance_page(lm_bd_chain_t* bd_chain, u16_t *idx_to_inc)
484 if (bd_chain->b_is_chain_mode)
486 lm_bd_chain_next *next_bd = (lm_bd_chain_next *)bd_chain->next_bd;
487 bd_chain->next_bd = *(void **)(next_bd->reserved);
488 *idx_to_inc += bd_chain->bds_skip_eop;
492 bd_chain->pbe_idx++;
493 if (bd_chain->pbe_idx == bd_chain->page_cnt) {
494 bd_chain->pbe_idx = 0;
496 bd_chain->next_bd = *(void **)((u8_t *)bd_chain->pbl_virt_addr_table + (sizeof(void *) * bd_chain->pbe_idx));
507 __inline static void lm_bd_chain_bds_consumed(lm_bd_chain_t* bd_chain, u16_t nbds)
509 bd_chain->bd_left += nbds;
510 DbgBreakIfFastPath(bd_chain->bd_left > bd_chain->capacity);
516 __inline static void *lm_toe_bd_chain_produce_bd(lm_bd_chain_t* bd_chain)
521 DbgBreakIf(!bd_chain->bd_left);
523 prod_idx = bd_chain->prod_idx - bd_chain->num_bd_to_sub;
524 if((prod_idx & bd_chain->usable_bds_mask) == bd_chain->usable_bds_mask) {
525 lm_bd_advance_page(bd_chain, &bd_chain->prod_idx);
528 ret_bd = bd_chain->next_bd;
529 bd_chain->bd_left--;
530 bd_chain->prod_idx++;
531 bd_chain->next_bd += bd_chain->bd_size;
539 __inline static void *lm_bd_chain_produce_bd(lm_bd_chain_t* bd_chain)
544 DbgBreakIfFastPath(!bd_chain->bd_left);
546 ret_bd = bd_chain->next_bd;
547 bd_chain->bd_left--;
548 bd_chain->prod_idx++;
549 bd_chain->next_bd += bd_chain->bd_size;
551 prod_idx = bd_chain->prod_idx - bd_chain->num_bd_to_sub;
552 if((prod_idx & bd_chain->usable_bds_mask) == bd_chain->usable_bds_mask) {
553 lm_bd_advance_page(bd_chain, &bd_chain->prod_idx);
567 __inline static void *lm_toe_bd_chain_consume_bd(lm_bd_chain_t* bd_chain)
572 DbgBreakIf(bd_chain->bd_left == bd_chain->capacity);
574 cons_idx = bd_chain->cons_idx - bd_chain->num_bd_to_sub;
575 if((cons_idx & bd_chain->usable_bds_mask) == bd_chain->usable_bds_mask) {
576 lm_bd_advance_page(bd_chain, &bd_chain->cons_idx);
578 ret_bd = bd_chain->next_bd;
580 bd_chain->bd_left++;
581 bd_chain->cons_idx++;
582 bd_chain->next_bd += bd_chain->bd_size;
587 __inline static void *lm_bd_chain_consume_bd(lm_bd_chain_t* bd_chain)
592 DbgBreakIfFastPath(bd_chain->bd_left == bd_chain->capacity);
594 ret_bd = bd_chain->next_bd;
596 bd_chain->bd_left++;
597 bd_chain->cons_idx++;
598 bd_chain->next_bd += bd_chain->bd_size;
600 cons_idx = bd_chain->cons_idx - bd_chain->num_bd_to_sub;
601 if((cons_idx & bd_chain->usable_bds_mask) == bd_chain->usable_bds_mask) {
602 lm_bd_advance_page(bd_chain, &bd_chain->cons_idx);
614 __inline static void *lm_bd_chain_consume_bd_contiguous(lm_bd_chain_t* bd_chain)
619 DbgBreakIf(bd_chain->bd_left == bd_chain->capacity);
621 cons_idx = bd_chain->cons_idx - bd_chain->num_bd_to_sub;
622 if((cons_idx & bd_chain->usable_bds_mask) == bd_chain->usable_bds_mask) {
623 lm_bd_advance_page(bd_chain, &bd_chain->cons_idx);
628 ret_bd = bd_chain->next_bd;
630 bd_chain->bd_left++;
631 bd_chain->cons_idx++;
632 bd_chain->next_bd += bd_chain->bd_size;
642 __inline static void lm_toe_bd_chain_bds_produced(lm_bd_chain_t* bd_chain, u16_t nbds)
647 DbgBreakIfFastPath(bd_chain->bd_left < nbds);
648 bd_chain->bd_left -= nbds;
650 /* perform the operation "nbds % bd_chain->usable_bds_per_page" manually
654 while (nbds_mod_usable_bds >= bd_chain->usable_bds_per_page)
656 nbds_mod_usable_bds -= bd_chain->usable_bds_per_page;
660 next_bds += nbds / bd_chain->usable_bds_per_page;
661 if(next_bds && ((bd_chain->prod_idx & bd_chain->bds_per_page_mask) == 0)) {
664 if((bd_chain->prod_idx & bd_chain->bds_per_page_mask) + nbds_mod_usable_bds > bd_chain->usable_bds_per_page) {
669 bd_chain->prod_idx += nbds + next_bds * bd_chain->bds_skip_eop;
671 DbgBreakIfFastPath((bd_chain->prod_idx & bd_chain->bds_per_page_mask) > bd_chain->usable_bds_per_page); /* assertion relevant to 8b bd chain */
672 DbgBreakIfFastPath((bd_chain->prod_idx & bd_chain->bds_per_page_mask) == 0); /* GilR 5/13/2006 - this is currently the agreement with FW */
677 __inline static void lm_bd_chain_bds_produced(lm_bd_chain_t* bd_chain, u16_t nbds)
682 DbgBreakIfFastPath(bd_chain->bd_left < nbds);
683 bd_chain->bd_left -= nbds;
685 /* perform the operation "nbds % bd_chain->usable_bds_per_page" manually
689 while (nbds_mod_usable_bds >= bd_chain->usable_bds_per_page)
691 nbds_mod_usable_bds -= bd_chain->usable_bds_per_page;
695 next_bds += nbds / bd_chain->usable_bds_per_page;
696 if((bd_chain->prod_idx & bd_chain->bds_per_page_mask) + nbds_mod_usable_bds > bd_chain->usable_bds_per_page) {
701 bd_chain->prod_idx += nbds + next_bds * bd_chain->bds_skip_eop;
708 __inline static void lm_bd_chain_bd_produced(lm_bd_chain_t* bd_chain)
710 DbgBreakIfFastPath(bd_chain->bd_left < 1);
711 bd_chain->bd_left--;
714 if((bd_chain->prod_idx & bd_chain->bds_per_page_mask) + 1 > bd_chain->usable_bds_per_page) {
715 bd_chain->prod_idx += bd_chain->bds_skip_eop;
719 bd_chain->prod_idx++;
723 __inline static u8_t lm_bd_chains_are_consistent( lm_bd_chain_t* bd_chain,
731 b_ret = mm_memcmp( (u8_t*)bd_chain + OFFSETOF(lm_bd_chain_t, page_cnt),