Re: [PATCH 36/40] dmaengine: add support to provide error result from a DMA transation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2016-07-15 at 09:29 +0300, Laurent Pinchart wrote:
> Hi Dave,
> 
> Thank you for the patch.
> 
> On Thursday 14 Jul 2016 15:00:09 Dave Jiang wrote:
> > Adding a new callback that will provide the error result for a
> > transaction.
> > The result is allocated on the stack and the callback should create
> > a copy
> > if it wishes to retain the information after exiting.
> > 
> > Signed-off-by: Dave Jiang <dave.jiang@xxxxxxxxx>
> > ---
> >  include/linux/dmaengine.h |   35 ++++++++++++++++++++++++++++++++-
> > --
> 
> Missing change for Documentation/dmaengine/*

Yes I realized that after the patches went out. I'll update.

> 
> >  1 file changed, 32 insertions(+), 3 deletions(-)
> > 
> > diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
> > index b601f23..ab8c498 100644
> > --- a/include/linux/dmaengine.h
> > +++ b/include/linux/dmaengine.h
> > @@ -441,6 +441,21 @@ typedef bool (*dma_filter_fn)(struct dma_chan
> > *chan,
> > void *filter_param);
> > 
> >  typedef void (*dma_async_tx_callback)(void *dma_async_param);
> > 
> > +enum dma_trans_result {
> > +	DMA_TRANS_NOERROR = 0,
> > +	DMA_TRANS_READ_FAILED,
> > +	DMA_TRANS_WRITE_FAILED,
> > +	DMA_TRANS_ABORTED,
> > +};
> > +
> > +struct dmaengine_result {
> > +	enum dma_trans_result result;
> > +	u32 residue;
> > +};
> > +
> > +typedef void (*dma_async_tx_callback_result)(void
> > *dma_async_param,
> > +					     struct
> > dmaengine_result *result);
> 
> How about making the result const ? Is there any reason to allow the
> callback 
> to modify the result ?

I'll make the change. 

> 
> > +
> >  struct dmaengine_unmap_data {
> >  	u8 map_cnt;
> >  	u8 to_cnt;
> > @@ -478,6 +493,7 @@ struct dma_async_tx_descriptor {
> >  	dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor
> > *tx);
> >  	int (*desc_free)(struct dma_async_tx_descriptor *tx);
> >  	dma_async_tx_callback callback;
> > +	dma_async_tx_callback_result callback_result;
> 
> So we now have two APIs. On the DMA engine drivers side, the
> transition path 
> is quite clear. Drivers should be ported to the new API to report
> results. The 
> results will be ignored by older client drivers, and newer client
> drivers that 
> interact with older DMA engine drivers will get dummy results that
> always 
> report success. There's no regression compared to the current API as
> client 
> drivers have no way to detect failures today.
> 
> On the client drivers side however, what's your plan to transition to
> the new 
> API ? We don't want to keep two APIs forever, so we should get all
> client 
> drivers converted in the not too distant future. There needs to be
> an 
> incentive for that to happen, unless you plan to do the work
> yourself. The 
> latter option would certainly be appreciated :-)

Honestly I would prefer the driver owners cared enough to move over to
the new API. Can we mark the old callback as deprecated in
documentation? We could add a check and print out a warning saying it's
deprecated?

> 
> >  	void *callback_param;
> >  	struct dmaengine_unmap_data *unmap;
> >  #ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH
> > @@ -1374,6 +1390,7 @@ static inline int dmaengine_desc_free(struct
> > dma_async_tx_descriptor *desc)
> > 
> >  struct dma_desc_callback {
> >  	dma_async_tx_callback callback;
> > +	dma_async_tx_callback_result callback_result;
> >  	void *callback_param;
> >  };
> > 
> > @@ -1382,14 +1399,26 @@ dmaengine_desc_get_callback(struct
> > dma_async_tx_descriptor *tx, struct dma_desc_callback *cb)
> >  {
> >  	cb->callback = tx->callback;
> > +	cb->callback_result = tx->callback_result;
> >  	cb->callback_param = tx->callback_param;
> >  }
> > 
> >  static inline void
> > -dmaengine_desc_callback_invoke(struct dma_desc_callback *cb, void
> > *result)
> > -{
> > -	if (cb->callback)
> > +dmaengine_desc_callback_invoke(struct dma_desc_callback *cb,
> > +			       struct dmaengine_result *result)
> > +{
> > +	struct dmaengine_result dummy_result = {
> > +		.result = DMA_TRANS_NOERROR,
> > +		.residue = 0
> > +	};
> > +
> > +	if (cb->callback_result) {
> > +		if (!result)
> > +			result = &dummy_result;
> > +		cb->callback_result(cb->callback_param, result);
> > +	} else if (cb->callback) {
> >  		cb->callback(cb->callback_param);
> > +	}
> >  }
> > 
> >  /* --- DMA device --- */
> ��.n��������+%������w��{.n��������)�)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥




[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux PCI]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux