Hi Vinod, On 03/01/2019 12:45, Vinod Koul wrote: > Hi Gustavo, > > On 03-01-19, 09:53, Gustavo Pimentel wrote: >> Hi Vinod, >> >> (snipped) >> >>>>> +{ >>>>> + struct dw_edma_chan *chan = dchan2dw_edma_chan(dchan); >>>>> + const struct dw_edma_core_ops *ops = chan2ops(chan); >>>>> + enum dma_transfer_direction dir; >>>>> + unsigned long flags; >>>>> + int err = 0; >>>>> + >>>>> + spin_lock_irqsave(&chan->vc.lock, flags); >>>>> + >>>>> + if (!config) { >>>>> + err = -EINVAL; >>>>> + goto err_config; >>>>> + } >>>>> + >>>>> + if (chan->configured) { >>>>> + dev_err(chan2dev(chan), ": channel already configured\n"); >>>>> + err = -EPERM; >>>>> + goto err_config; >>>>> + } >>>>> + >>>>> + dir = config->direction; >>>> >>>> Direction is depreciated, I have already removed the usages, so please >>>> do not add new ones. >>>> >>>> You need to take direction for respective prep_ calls >>> >>> Ok, I already do that. IMHO I found it strange to have the same information >>> repeated on two places. But now that you say that this is deprecated, it makes >>> sense now. >>> >>>> >>>>> + if (dir == DMA_DEV_TO_MEM && chan->dir == EDMA_DIR_WRITE) { >>>>> + dev_info(chan2dev(chan), >>>>> + ": direction DMA_DEV_TO_MEM (EDMA_DIR_WRITE)\n"); >>>>> + chan->p_addr = config->src_addr; >>>>> + } else if (dir == DMA_MEM_TO_DEV && chan->dir == EDMA_DIR_READ) { >>>>> + dev_info(chan2dev(chan), >>>>> + ": direction DMA_MEM_TO_DEV (EDMA_DIR_READ)\n"); >>>>> + chan->p_addr = config->dst_addr; >>>>> + } else { >>>>> + dev_err(chan2dev(chan), ": invalid direction\n"); >>>>> + err = -EINVAL; >>>>> + goto err_config; >>>>> + } >>>> >>>> This should be removed >>> >>> Yeah, it was just for validation purposes. Now that direction is deprecated on >>> the API, makes no sense to validate it. >>> >>>> >>>>> + >>>>> + dev_info(chan2dev(chan), >>>>> + ": src_addr(physical) = 0x%.16x\n", config->src_addr); >>>>> + dev_info(chan2dev(chan), >>>>> + ": dst_addr(physical) = 0x%.16x\n", config->dst_addr); >>>> >> >> I've a doubt now. As you know, for a DMA transfer you need the source and >> destination addresses, which in the limited can be swapped according to the >> direction MEM_TO_DEV/DEV_TO_MEM case. >> >> For the sake of simplicity, I'll just consider now the MEM_TO_DEV case, since >> the other case is similar but the source and destination address are swapped. >> >> In my code I can get some of the information that I need by using the >> sg_dma_address() in the scatter-gather list (which gives me the source address). >> >> The remaining information I got from here, using the direction to help me to >> select which address I'll use later on the DMA transfer, in this case the >> destination address. >> >> Since this is deprecated how should I proceed? How can I get that information? >> There is some similar function to sg_dma_address() that could give me the >> destination address? > > So the direction field is deprecated but rest of the configuration comes > from from dma_slave_config. The user should set src_addr, dst_addr and > then based on direction passed in the .device_prep_dma_* call arguments > one can use one of these as peripheral address. Ok, and the address given by sg_dma_address()? Is redundant or not applicable for this case? > > Also, please keep in mind that for memory to memory transfers you should > not expect the dma_slave_config to be used My DMA implementation is only MEM_TO_DEV and DEV_TO_MEM. > > Thanks > Thanks.