Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751860AbdHAPks (ORCPT ); Tue, 1 Aug 2017 11:40:48 -0400 Received: from mail-lf0-f52.google.com ([209.85.215.52]:37650 "EHLO mail-lf0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751760AbdHAPkr (ORCPT ); Tue, 1 Aug 2017 11:40:47 -0400 MIME-Version: 1.0 In-Reply-To: <20170728203111.20078-1-sboyd@codeaurora.org> References: <20170728203111.20078-1-sboyd@codeaurora.org> From: Mathieu Poirier Date: Tue, 1 Aug 2017 09:40:45 -0600 Message-ID: Subject: Re: [PATCH] coresight: STM: Clean up __iomem type usage To: Stephen Boyd Cc: "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , Satyajit Desai Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5373 Lines: 114 On 28 July 2017 at 14:31, Stephen Boyd wrote: > The casting and other things here is odd, and causes sparse to > complain: > > drivers/hwtracing/coresight/coresight-stm.c:279:35: warning: incorrect type in argument 1 (different address spaces) > drivers/hwtracing/coresight/coresight-stm.c:279:35: expected void [noderef] *addr > drivers/hwtracing/coresight/coresight-stm.c:279:35: got struct stm_drvdata *drvdata > drivers/hwtracing/coresight/coresight-stm.c:327:17: warning: incorrect type in argument 2 (different address spaces) > drivers/hwtracing/coresight/coresight-stm.c:327:17: expected void volatile [noderef] *addr > drivers/hwtracing/coresight/coresight-stm.c:327:17: got void *addr > drivers/hwtracing/coresight/coresight-stm.c:330:17: warning: incorrect type in argument 2 (different address spaces) > drivers/hwtracing/coresight/coresight-stm.c:330:17: expected void volatile [noderef] *addr > drivers/hwtracing/coresight/coresight-stm.c:330:17: got void *addr > drivers/hwtracing/coresight/coresight-stm.c:333:17: warning: incorrect type in argument 2 (different address spaces) > drivers/hwtracing/coresight/coresight-stm.c:333:17: expected void volatile [noderef] *addr > drivers/hwtracing/coresight/coresight-stm.c:333:17: got void *addr > > From what I can tell, we don't really need to treat ch_addr as > anything besides a pointer, and we can just do pointer math > instead of ORing in the bits of the offset and achieve the same > thing. > > Also, we were passing a drvdata pointer to the > coresight_timeout() function, but we really wanted to pass the > address of the register base. Luckily the base is the first > member of the structure, so everything works out, but this is > quite unsafe if we ever change the structure layout. Clean this > all up so sparse stops complaining on this code. > > Reported-by: Satyajit Desai > Signed-off-by: Stephen Boyd > --- > drivers/hwtracing/coresight/coresight-stm.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c > index 93fc26f01bab..a4273972099d 100644 > --- a/drivers/hwtracing/coresight/coresight-stm.c > +++ b/drivers/hwtracing/coresight/coresight-stm.c > @@ -276,7 +276,7 @@ static void stm_disable(struct coresight_device *csdev, > spin_unlock(&drvdata->spinlock); > > /* Wait until the engine has completely stopped */ > - coresight_timeout(drvdata, STMTCSR, STMTCSR_BUSY_BIT, 0); > + coresight_timeout(drvdata->base, STMTCSR, STMTCSR_BUSY_BIT, 0); Oh boy... > > pm_runtime_put(drvdata->dev); > > @@ -307,7 +307,7 @@ static inline bool stm_addr_unaligned(const void *addr, u8 write_bytes) > return ((unsigned long)addr & (write_bytes - 1)); > } > > -static void stm_send(void *addr, const void *data, u32 size, u8 write_bytes) > +static void stm_send(void __iomem *addr, const void *data, u32 size, u8 write_bytes) This ends up being over 80 characters long - I have corrected and applied your patch. Thanks, Mathieu > { > u8 paload[8]; > > @@ -414,7 +414,7 @@ static ssize_t notrace stm_generic_packet(struct stm_data *stm_data, > unsigned int size, > const unsigned char *payload) > { > - unsigned long ch_addr; > + void __iomem *ch_addr; > struct stm_drvdata *drvdata = container_of(stm_data, > struct stm_drvdata, stm); > > @@ -424,7 +424,7 @@ static ssize_t notrace stm_generic_packet(struct stm_data *stm_data, > if (channel >= drvdata->numsp) > return -EINVAL; > > - ch_addr = (unsigned long)stm_channel_addr(drvdata, channel); > + ch_addr = stm_channel_addr(drvdata, channel); > > flags = (flags == STP_PACKET_TIMESTAMPED) ? STM_FLAG_TIMESTAMPED : 0; > flags |= test_bit(channel, drvdata->chs.guaranteed) ? > @@ -437,20 +437,20 @@ static ssize_t notrace stm_generic_packet(struct stm_data *stm_data, > > switch (packet) { > case STP_PACKET_FLAG: > - ch_addr |= stm_channel_off(STM_PKT_TYPE_FLAG, flags); > + ch_addr += stm_channel_off(STM_PKT_TYPE_FLAG, flags); > > /* > * The generic STM core sets a size of '0' on flag packets. > * As such send a flag packet of size '1' and tell the > * core we did so. > */ > - stm_send((void *)ch_addr, payload, 1, drvdata->write_bytes); > + stm_send(ch_addr, payload, 1, drvdata->write_bytes); > size = 1; > break; > > case STP_PACKET_DATA: > - ch_addr |= stm_channel_off(STM_PKT_TYPE_DATA, flags); > - stm_send((void *)ch_addr, payload, size, > + ch_addr += stm_channel_off(STM_PKT_TYPE_DATA, flags); > + stm_send(ch_addr, payload, size, > drvdata->write_bytes); > break; > > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project >