From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966307AbcIZNWY (ORCPT ); Mon, 26 Sep 2016 09:22:24 -0400 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:1808 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965709AbcIZNWW (ORCPT ); Mon, 26 Sep 2016 09:22:22 -0400 Subject: Re: [PATCH] serial: stm32: use mapbase instead of membase for DMA To: Arnd Bergmann , Greg Kroah-Hartman References: <20160923193935.3726427-1-arnd@arndb.de> CC: Jiri Slaby , Maxime Coquelin , Alexandre TORGUE , "linux-serial@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" From: Gerald Baeza Message-ID: <61d40e5f-a096-e401-50d4-941fd86d2e0c@st.com> Date: Mon, 26 Sep 2016 15:21:30 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160923193935.3726427-1-arnd@arndb.de> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.201.23.250] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-09-26_06:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Arnd On 09/23/2016 09:38 PM, Arnd Bergmann wrote: > Building this driver with a 64-bit dma_addr_t type results in > a compiler warning: > > drivers/tty/serial/stm32-usart.c: In function 'stm32_of_dma_rx_probe': > drivers/tty/serial/stm32-usart.c:746:20: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast] > drivers/tty/serial/stm32-usart.c: In function 'stm32_of_dma_tx_probe': > drivers/tty/serial/stm32-usart.c:818:20: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast] > > While the type conversion here is harmless, this hints at a different > problem: we pass an __iomem pointer into a DMA engine, which expects > a phys_addr_t. This happens to work because stm32 has no MMU and > ioremap() is an identity mapping here, but it's still an incorrect > API use. Using dma_addr_t is doubly wrong here, because that would > be the result of dma_map_single() rather than the physical address. > > Using the mapbase instead fixes multiple issues: > > - the warning is gone > - we don't go through ioremap in error > - the cast is gone, making it use the correct resource_size_t/phys_addr_t > type in the process. > > Fixes: 3489187204eb ("serial: stm32: adding dma support") > Signed-off-by: Arnd Bergmann > --- > drivers/tty/serial/stm32-usart.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c > index 4d3001b77e7e..2adb678a863b 100644 > --- a/drivers/tty/serial/stm32-usart.c > +++ b/drivers/tty/serial/stm32-usart.c > @@ -743,7 +743,7 @@ static int stm32_of_dma_rx_probe(struct stm32_port *stm32port, > > /* Configure DMA channel */ > memset(&config, 0, sizeof(config)); > - config.src_addr = (dma_addr_t)port->membase + ofs->rdr; > + config.src_addr = port->mapbase + ofs->rdr; > config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; > > ret = dmaengine_slave_config(stm32port->rx_ch, &config); > @@ -815,7 +815,7 @@ static int stm32_of_dma_tx_probe(struct stm32_port *stm32port, > > /* Configure DMA channel */ > memset(&config, 0, sizeof(config)); > - config.dst_addr = (dma_addr_t)port->membase + ofs->tdr; > + config.dst_addr = port->mapbase + ofs->tdr; > config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; > > ret = dmaengine_slave_config(stm32port->tx_ch, &config); > Indeed, thanks for this finding. Reviewed-by: Gerald Baeza