Lines Matching refs:wq
62 static void free_hw_descs(struct idxd_wq *wq) in free_hw_descs() argument
66 for (i = 0; i < wq->num_descs; i++) in free_hw_descs()
67 kfree(wq->hw_descs[i]); in free_hw_descs()
69 kfree(wq->hw_descs); in free_hw_descs()
72 static int alloc_hw_descs(struct idxd_wq *wq, int num) in alloc_hw_descs() argument
74 struct device *dev = &wq->idxd->pdev->dev; in alloc_hw_descs()
78 wq->hw_descs = kcalloc_node(num, sizeof(struct dsa_hw_desc *), in alloc_hw_descs()
80 if (!wq->hw_descs) in alloc_hw_descs()
84 wq->hw_descs[i] = kzalloc_node(sizeof(*wq->hw_descs[i]), in alloc_hw_descs()
86 if (!wq->hw_descs[i]) { in alloc_hw_descs()
87 free_hw_descs(wq); in alloc_hw_descs()
95 static void free_descs(struct idxd_wq *wq) in free_descs() argument
99 for (i = 0; i < wq->num_descs; i++) in free_descs()
100 kfree(wq->descs[i]); in free_descs()
102 kfree(wq->descs); in free_descs()
105 static int alloc_descs(struct idxd_wq *wq, int num) in alloc_descs() argument
107 struct device *dev = &wq->idxd->pdev->dev; in alloc_descs()
111 wq->descs = kcalloc_node(num, sizeof(struct idxd_desc *), in alloc_descs()
113 if (!wq->descs) in alloc_descs()
117 wq->descs[i] = kzalloc_node(sizeof(*wq->descs[i]), in alloc_descs()
119 if (!wq->descs[i]) { in alloc_descs()
120 free_descs(wq); in alloc_descs()
129 int idxd_wq_alloc_resources(struct idxd_wq *wq) in idxd_wq_alloc_resources() argument
131 struct idxd_device *idxd = wq->idxd; in idxd_wq_alloc_resources()
135 if (wq->type != IDXD_WQT_KERNEL) in idxd_wq_alloc_resources()
138 wq->num_descs = wq->size; in idxd_wq_alloc_resources()
139 num_descs = wq->size; in idxd_wq_alloc_resources()
141 rc = alloc_hw_descs(wq, num_descs); in idxd_wq_alloc_resources()
145 wq->compls_size = num_descs * sizeof(struct dsa_completion_record); in idxd_wq_alloc_resources()
146 wq->compls = dma_alloc_coherent(dev, wq->compls_size, in idxd_wq_alloc_resources()
147 &wq->compls_addr, GFP_KERNEL); in idxd_wq_alloc_resources()
148 if (!wq->compls) { in idxd_wq_alloc_resources()
153 rc = alloc_descs(wq, num_descs); in idxd_wq_alloc_resources()
157 rc = sbitmap_queue_init_node(&wq->sbq, num_descs, -1, false, GFP_KERNEL, in idxd_wq_alloc_resources()
163 struct idxd_desc *desc = wq->descs[i]; in idxd_wq_alloc_resources()
165 desc->hw = wq->hw_descs[i]; in idxd_wq_alloc_resources()
166 desc->completion = &wq->compls[i]; in idxd_wq_alloc_resources()
167 desc->compl_dma = wq->compls_addr + in idxd_wq_alloc_resources()
170 desc->wq = wq; in idxd_wq_alloc_resources()
177 free_descs(wq); in idxd_wq_alloc_resources()
179 dma_free_coherent(dev, wq->compls_size, wq->compls, wq->compls_addr); in idxd_wq_alloc_resources()
181 free_hw_descs(wq); in idxd_wq_alloc_resources()
185 void idxd_wq_free_resources(struct idxd_wq *wq) in idxd_wq_free_resources() argument
187 struct device *dev = &wq->idxd->pdev->dev; in idxd_wq_free_resources()
189 if (wq->type != IDXD_WQT_KERNEL) in idxd_wq_free_resources()
192 free_hw_descs(wq); in idxd_wq_free_resources()
193 free_descs(wq); in idxd_wq_free_resources()
194 dma_free_coherent(dev, wq->compls_size, wq->compls, wq->compls_addr); in idxd_wq_free_resources()
195 sbitmap_queue_free(&wq->sbq); in idxd_wq_free_resources()
198 int idxd_wq_enable(struct idxd_wq *wq) in idxd_wq_enable() argument
200 struct idxd_device *idxd = wq->idxd; in idxd_wq_enable()
204 if (wq->state == IDXD_WQ_ENABLED) { in idxd_wq_enable()
205 dev_dbg(dev, "WQ %d already enabled\n", wq->id); in idxd_wq_enable()
209 idxd_cmd_exec(idxd, IDXD_CMD_ENABLE_WQ, wq->id, &status); in idxd_wq_enable()
217 wq->state = IDXD_WQ_ENABLED; in idxd_wq_enable()
218 dev_dbg(dev, "WQ %d enabled\n", wq->id); in idxd_wq_enable()
222 int idxd_wq_disable(struct idxd_wq *wq) in idxd_wq_disable() argument
224 struct idxd_device *idxd = wq->idxd; in idxd_wq_disable()
228 dev_dbg(dev, "Disabling WQ %d\n", wq->id); in idxd_wq_disable()
230 if (wq->state != IDXD_WQ_ENABLED) { in idxd_wq_disable()
231 dev_dbg(dev, "WQ %d in wrong state: %d\n", wq->id, wq->state); in idxd_wq_disable()
235 operand = BIT(wq->id % 16) | ((wq->id / 16) << 16); in idxd_wq_disable()
243 wq->state = IDXD_WQ_DISABLED; in idxd_wq_disable()
244 dev_dbg(dev, "WQ %d disabled\n", wq->id); in idxd_wq_disable()
248 void idxd_wq_drain(struct idxd_wq *wq) in idxd_wq_drain() argument
250 struct idxd_device *idxd = wq->idxd; in idxd_wq_drain()
254 if (wq->state != IDXD_WQ_ENABLED) { in idxd_wq_drain()
255 dev_dbg(dev, "WQ %d in wrong state: %d\n", wq->id, wq->state); in idxd_wq_drain()
259 dev_dbg(dev, "Draining WQ %d\n", wq->id); in idxd_wq_drain()
260 operand = BIT(wq->id % 16) | ((wq->id / 16) << 16); in idxd_wq_drain()
264 void idxd_wq_reset(struct idxd_wq *wq) in idxd_wq_reset() argument
266 struct idxd_device *idxd = wq->idxd; in idxd_wq_reset()
270 if (wq->state != IDXD_WQ_ENABLED) { in idxd_wq_reset()
271 dev_dbg(dev, "WQ %d in wrong state: %d\n", wq->id, wq->state); in idxd_wq_reset()
275 operand = BIT(wq->id % 16) | ((wq->id / 16) << 16); in idxd_wq_reset()
277 wq->state = IDXD_WQ_DISABLED; in idxd_wq_reset()
280 int idxd_wq_map_portal(struct idxd_wq *wq) in idxd_wq_map_portal() argument
282 struct idxd_device *idxd = wq->idxd; in idxd_wq_map_portal()
288 start += idxd_get_wq_portal_full_offset(wq->id, IDXD_PORTAL_LIMITED); in idxd_wq_map_portal()
290 wq->dportal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE); in idxd_wq_map_portal()
291 if (!wq->dportal) in idxd_wq_map_portal()
293 dev_dbg(dev, "wq %d portal mapped at %p\n", wq->id, wq->dportal); in idxd_wq_map_portal()
298 void idxd_wq_unmap_portal(struct idxd_wq *wq) in idxd_wq_unmap_portal() argument
300 struct device *dev = &wq->idxd->pdev->dev; in idxd_wq_unmap_portal()
302 devm_iounmap(dev, wq->dportal); in idxd_wq_unmap_portal()
305 void idxd_wq_disable_cleanup(struct idxd_wq *wq) in idxd_wq_disable_cleanup() argument
307 struct idxd_device *idxd = wq->idxd; in idxd_wq_disable_cleanup()
310 memset(wq->wqcfg, 0, idxd->wqcfg_size); in idxd_wq_disable_cleanup()
311 wq->type = IDXD_WQT_NONE; in idxd_wq_disable_cleanup()
312 wq->size = 0; in idxd_wq_disable_cleanup()
313 wq->group = NULL; in idxd_wq_disable_cleanup()
314 wq->threshold = 0; in idxd_wq_disable_cleanup()
315 wq->priority = 0; in idxd_wq_disable_cleanup()
316 clear_bit(WQ_FLAG_DEDICATED, &wq->flags); in idxd_wq_disable_cleanup()
317 memset(wq->name, 0, WQ_NAME_SIZE); in idxd_wq_disable_cleanup()
450 struct idxd_wq *wq = &idxd->wqs[i]; in idxd_device_wqs_clear_state() local
452 if (wq->state == IDXD_WQ_ENABLED) { in idxd_device_wqs_clear_state()
453 idxd_wq_disable_cleanup(wq); in idxd_device_wqs_clear_state()
454 wq->state = IDXD_WQ_DISABLED; in idxd_device_wqs_clear_state()
558 static int idxd_wq_config_write(struct idxd_wq *wq) in idxd_wq_config_write() argument
560 struct idxd_device *idxd = wq->idxd; in idxd_wq_config_write()
565 if (!wq->group) in idxd_wq_config_write()
573 wq_offset = WQCFG_OFFSET(idxd, wq->id, i); in idxd_wq_config_write()
574 wq->wqcfg->bits[i] = ioread32(idxd->reg_base + wq_offset); in idxd_wq_config_write()
578 wq->wqcfg->wq_size = wq->size; in idxd_wq_config_write()
580 if (wq->size == 0) { in idxd_wq_config_write()
586 wq->wqcfg->wq_thresh = wq->threshold; in idxd_wq_config_write()
589 wq->wqcfg->priv = !!(wq->type == IDXD_WQT_KERNEL); in idxd_wq_config_write()
590 wq->wqcfg->mode = 1; in idxd_wq_config_write()
591 wq->wqcfg->priority = wq->priority; in idxd_wq_config_write()
594 wq->wqcfg->max_xfer_shift = ilog2(wq->max_xfer_bytes); in idxd_wq_config_write()
595 wq->wqcfg->max_batch_shift = ilog2(wq->max_batch_size); in idxd_wq_config_write()
597 dev_dbg(dev, "WQ %d CFGs\n", wq->id); in idxd_wq_config_write()
599 wq_offset = WQCFG_OFFSET(idxd, wq->id, i); in idxd_wq_config_write()
600 iowrite32(wq->wqcfg->bits[i], idxd->reg_base + wq_offset); in idxd_wq_config_write()
602 wq->id, i, wq_offset, in idxd_wq_config_write()
614 struct idxd_wq *wq = &idxd->wqs[i]; in idxd_wqs_config_write() local
616 rc = idxd_wq_config_write(wq); in idxd_wqs_config_write()
680 struct idxd_wq *wq; in idxd_wqs_setup() local
692 wq = &idxd->wqs[i]; in idxd_wqs_setup()
693 group = wq->group; in idxd_wqs_setup()
695 if (!wq->group) in idxd_wqs_setup()
697 if (!wq->size) in idxd_wqs_setup()
700 if (!wq_dedicated(wq)) { in idxd_wqs_setup()
705 group->grpcfg.wqs[wq->id / 64] |= BIT(wq->id % 64); in idxd_wqs_setup()