Lines Matching refs:chain

10 static void qed_chain_init(struct qed_chain *chain,
14 memset(chain, 0, sizeof(*chain));
16 chain->elem_size = params->elem_size;
17 chain->intended_use = params->intended_use;
18 chain->mode = params->mode;
19 chain->cnt_type = params->cnt_type;
21 chain->elem_per_page = ELEMS_PER_PAGE(params->elem_size,
23 chain->usable_per_page = USABLE_ELEMS_PER_PAGE(params->elem_size,
26 chain->elem_unusable = UNUSABLE_ELEMS_PER_PAGE(params->elem_size,
29 chain->elem_per_page_mask = chain->elem_per_page - 1;
30 chain->next_page_mask = chain->usable_per_page &
31 chain->elem_per_page_mask;
33 chain->page_size = params->page_size;
34 chain->page_cnt = page_cnt;
35 chain->capacity = chain->usable_per_page * page_cnt;
36 chain->size = chain->elem_per_page * page_cnt;
39 chain->pbl_sp.table_virt = params->ext_pbl_virt;
40 chain->pbl_sp.table_phys = params->ext_pbl_phys;
42 chain->b_external_pbl = true;
46 static void qed_chain_init_next_ptr_elem(const struct qed_chain *chain,
53 size = chain->elem_size * chain->usable_per_page;
60 static void qed_chain_init_mem(struct qed_chain *chain, void *virt_addr,
63 chain->p_virt_addr = virt_addr;
64 chain->p_phys_addr = phys_addr;
68 struct qed_chain *chain)
76 size = chain->elem_size * chain->usable_per_page;
77 virt = chain->p_virt_addr;
78 phys = chain->p_phys_addr;
80 for (i = 0; i < chain->page_cnt; i++) {
88 dma_free_coherent(dev, chain->page_size, virt, phys);
96 struct qed_chain *chain)
98 if (!chain->p_virt_addr)
101 dma_free_coherent(&cdev->pdev->dev, chain->page_size,
102 chain->p_virt_addr, chain->p_phys_addr);
105 static void qed_chain_free_pbl(struct qed_dev *cdev, struct qed_chain *chain)
111 if (!chain->pbl.pp_addr_tbl)
114 for (i = 0; i < chain->page_cnt; i++) {
115 entry = chain->pbl.pp_addr_tbl + i;
119 dma_free_coherent(dev, chain->page_size, entry->virt_addr,
123 if (!chain->b_external_pbl)
124 dma_free_coherent(dev, chain->pbl_sp.table_size,
125 chain->pbl_sp.table_virt,
126 chain->pbl_sp.table_phys);
128 vfree(chain->pbl.pp_addr_tbl);
129 chain->pbl.pp_addr_tbl = NULL;
133 * qed_chain_free() - Free chain DMA memory.
136 * @chain: Chain to free.
138 void qed_chain_free(struct qed_dev *cdev, struct qed_chain *chain)
140 switch (chain->mode) {
142 qed_chain_free_next_ptr(cdev, chain);
145 qed_chain_free_single(cdev, chain);
148 qed_chain_free_pbl(cdev, chain);
154 qed_chain_init_mem(chain, NULL, 0);
170 /* The actual chain size can be larger than the maximal possible value
173 * The size of a "u16" chain can be (U16_MAX + 1) since the chain
192 "The actual chain size (0x%llx) is larger than the maximal possible value\n",
199 struct qed_chain *chain)
206 for (i = 0; i < chain->page_cnt; i++) {
207 virt = dma_alloc_coherent(dev, chain->page_size, &phys,
213 qed_chain_init_mem(chain, virt, phys);
214 qed_chain_reset(chain);
216 qed_chain_init_next_ptr_elem(chain, virt_prev, virt,
224 * chain.
226 qed_chain_init_next_ptr_elem(chain, virt_prev, chain->p_virt_addr,
227 chain->p_phys_addr);
233 struct qed_chain *chain)
238 virt = dma_alloc_coherent(&cdev->pdev->dev, chain->page_size,
243 qed_chain_init_mem(chain, virt, phys);
244 qed_chain_reset(chain);
249 static int qed_chain_alloc_pbl(struct qed_dev *cdev, struct qed_chain *chain)
259 page_cnt = chain->page_cnt;
269 chain->pbl.pp_addr_tbl = addr_tbl;
271 if (chain->b_external_pbl) {
272 pbl_virt = chain->pbl_sp.table_virt;
284 chain->pbl_sp.table_virt = pbl_virt;
285 chain->pbl_sp.table_phys = pbl_phys;
286 chain->pbl_sp.table_size = size;
290 virt = dma_alloc_coherent(dev, chain->page_size, &phys,
296 qed_chain_init_mem(chain, virt, phys);
297 qed_chain_reset(chain);
312 * qed_chain_alloc() - Allocate and initialize a chain.
315 * @chain: Chain to be processed.
320 int qed_chain_alloc(struct qed_dev *cdev, struct qed_chain *chain,
340 "Cannot allocate a chain with the given arguments:\n");
349 qed_chain_init(chain, params, page_cnt);
353 rc = qed_chain_alloc_next_ptr(cdev, chain);
356 rc = qed_chain_alloc_single(cdev, chain);
359 rc = qed_chain_alloc_pbl(cdev, chain);
368 qed_chain_free(cdev, chain);