[PATCH] coresight: STM: Clean up __iomem type usage

Mathieu Poirier mathieu.poirier at linaro.org
Tue Aug 1 08:40:45 PDT 2017


On 28 July 2017 at 14:31, Stephen Boyd <sboyd at codeaurora.org> 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] <asn:2>*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] <asn:2>*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] <asn:2>*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] <asn:2>*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 <sadesai at codeaurora.org>
> Signed-off-by: Stephen Boyd <sboyd at codeaurora.org>
> ---
>  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
>



More information about the linux-arm-kernel mailing list