Commit b05a5683 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull dmaengine fixes from Vinod Koul:
 "A bunch of driver fixes:

   - idxd device RO checks and device cleanup

   - dw-edma unaligned access and alignment

   - qcom: missing minItems in binding

   - mediatek pm usage fix

   - imx init script"

* tag 'dmaengine-fix-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine:
  dt-bindings: dmaengine: qcom: gpi: Add minItems for interrupts
  dmaengine: idxd: skip clearing device context when device is read-only
  dmaengine: idxd: add RO check for wq max_transfer_size write
  dmaengine: idxd: add RO check for wq max_batch_size write
  dmaengine: idxd: fix retry value to be constant for duration of function call
  dmaengine: idxd: match type for retries var in idxd_enqcmds()
  dmaengine: dw-edma: Fix inconsistent indenting
  dmaengine: dw-edma: Fix unaligned 64bit access
  dmaengine: mediatek:Fix PM usage reference leak of mtk_uart_apdma_alloc_chan_resources
  dmaengine: imx-sdma: Fix error checking in sdma_event_remap
  dma: at_xdmac: fix a missing check on list iterator
  dmaengine: imx-sdma: fix init of uart scripts
  dmaengine: idxd: fix device cleanup on disable
parents 59f0c244 7495a5bb
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ properties:
  interrupts:
  interrupts:
    description:
    description:
      Interrupt lines for each GPI instance
      Interrupt lines for each GPI instance
    minItems: 1
    maxItems: 13
    maxItems: 13


  "#dma-cells":
  "#dma-cells":
+7 −5
Original line number Original line Diff line number Diff line
@@ -1453,7 +1453,7 @@ at_xdmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
{
{
	struct at_xdmac_chan	*atchan = to_at_xdmac_chan(chan);
	struct at_xdmac_chan	*atchan = to_at_xdmac_chan(chan);
	struct at_xdmac		*atxdmac = to_at_xdmac(atchan->chan.device);
	struct at_xdmac		*atxdmac = to_at_xdmac(atchan->chan.device);
	struct at_xdmac_desc	*desc, *_desc;
	struct at_xdmac_desc	*desc, *_desc, *iter;
	struct list_head	*descs_list;
	struct list_head	*descs_list;
	enum dma_status		ret;
	enum dma_status		ret;
	int			residue, retry;
	int			residue, retry;
@@ -1568,12 +1568,14 @@ at_xdmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
	 * microblock.
	 * microblock.
	 */
	 */
	descs_list = &desc->descs_list;
	descs_list = &desc->descs_list;
	list_for_each_entry_safe(desc, _desc, descs_list, desc_node) {
	list_for_each_entry_safe(iter, _desc, descs_list, desc_node) {
		dwidth = at_xdmac_get_dwidth(desc->lld.mbr_cfg);
		dwidth = at_xdmac_get_dwidth(iter->lld.mbr_cfg);
		residue -= (desc->lld.mbr_ubc & 0xffffff) << dwidth;
		residue -= (iter->lld.mbr_ubc & 0xffffff) << dwidth;
		if ((desc->lld.mbr_nda & 0xfffffffc) == cur_nda)
		if ((iter->lld.mbr_nda & 0xfffffffc) == cur_nda) {
			desc = iter;
			break;
			break;
		}
		}
	}
	residue += cur_ubc << dwidth;
	residue += cur_ubc << dwidth;


	dma_set_residue(txstate, residue);
	dma_set_residue(txstate, residue);
+10 −6
Original line number Original line Diff line number Diff line
@@ -414,9 +414,13 @@ void dw_edma_v0_core_start(struct dw_edma_chunk *chunk, bool first)
		SET_CH_32(dw, chan->dir, chan->id, ch_control1,
		SET_CH_32(dw, chan->dir, chan->id, ch_control1,
			  (DW_EDMA_V0_CCS | DW_EDMA_V0_LLE));
			  (DW_EDMA_V0_CCS | DW_EDMA_V0_LLE));
		/* Linked list */
		/* Linked list */

		#ifdef CONFIG_64BIT
		#ifdef CONFIG_64BIT
			SET_CH_64(dw, chan->dir, chan->id, llp.reg,
		/* llp is not aligned on 64bit -> keep 32bit accesses */
				  chunk->ll_region.paddr);
		SET_CH_32(dw, chan->dir, chan->id, llp.lsb,
			  lower_32_bits(chunk->ll_region.paddr));
		SET_CH_32(dw, chan->dir, chan->id, llp.msb,
			  upper_32_bits(chunk->ll_region.paddr));
		#else /* CONFIG_64BIT */
		#else /* CONFIG_64BIT */
		SET_CH_32(dw, chan->dir, chan->id, llp.lsb,
		SET_CH_32(dw, chan->dir, chan->id, llp.lsb,
			  lower_32_bits(chunk->ll_region.paddr));
			  lower_32_bits(chunk->ll_region.paddr));
+4 −2
Original line number Original line Diff line number Diff line
@@ -373,7 +373,6 @@ static void idxd_wq_device_reset_cleanup(struct idxd_wq *wq)
{
{
	lockdep_assert_held(&wq->wq_lock);
	lockdep_assert_held(&wq->wq_lock);


	idxd_wq_disable_cleanup(wq);
	wq->size = 0;
	wq->size = 0;
	wq->group = NULL;
	wq->group = NULL;
}
}
@@ -701,14 +700,17 @@ static void idxd_device_wqs_clear_state(struct idxd_device *idxd)


		if (wq->state == IDXD_WQ_ENABLED) {
		if (wq->state == IDXD_WQ_ENABLED) {
			idxd_wq_disable_cleanup(wq);
			idxd_wq_disable_cleanup(wq);
			idxd_wq_device_reset_cleanup(wq);
			wq->state = IDXD_WQ_DISABLED;
			wq->state = IDXD_WQ_DISABLED;
		}
		}
		idxd_wq_device_reset_cleanup(wq);
	}
	}
}
}


void idxd_device_clear_state(struct idxd_device *idxd)
void idxd_device_clear_state(struct idxd_device *idxd)
{
{
	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
		return;

	idxd_groups_clear_state(idxd);
	idxd_groups_clear_state(idxd);
	idxd_engines_clear_state(idxd);
	idxd_engines_clear_state(idxd);
	idxd_device_wqs_clear_state(idxd);
	idxd_device_wqs_clear_state(idxd);
+3 −2
Original line number Original line Diff line number Diff line
@@ -150,14 +150,15 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
 */
 */
int idxd_enqcmds(struct idxd_wq *wq, void __iomem *portal, const void *desc)
int idxd_enqcmds(struct idxd_wq *wq, void __iomem *portal, const void *desc)
{
{
	int rc, retries = 0;
	unsigned int retries = wq->enqcmds_retries;
	int rc;


	do {
	do {
		rc = enqcmds(portal, desc);
		rc = enqcmds(portal, desc);
		if (rc == 0)
		if (rc == 0)
			break;
			break;
		cpu_relax();
		cpu_relax();
	} while (retries++ < wq->enqcmds_retries);
	} while (retries--);


	return rc;
	return rc;
}
}
Loading