Messages in this thread | | | Subject | Re: [PATCH net-next 2/4] net: ipa: introduce dma_addr_high32() | From | Florian Fainelli <> | Date | Wed, 17 Mar 2021 15:47:47 -0700 |
| |
On 3/17/2021 3:29 PM, Alex Elder wrote: > Create a new helper function to encapsulate extracting the > high-order 32 bits of a DMA address. It returns 0 for builds > in which a DMA address is not 64 bits. > > This avoids doing a 32-position shift on a DMA address if it > happens not to be 64 bits wide. > > Signed-off-by: Alex Elder <elder@linaro.org> > --- > drivers/net/ipa/gsi.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ipa/gsi.c b/drivers/net/ipa/gsi.c > index 2119367b93ea9..53698c64cf882 100644 > --- a/drivers/net/ipa/gsi.c > +++ b/drivers/net/ipa/gsi.c > @@ -688,6 +688,16 @@ static void gsi_evt_ring_doorbell(struct gsi *gsi, u32 evt_ring_id, u32 index) > iowrite32(val, gsi->virt + GSI_EV_CH_E_DOORBELL_0_OFFSET(evt_ring_id)); > } > > +/* Encapsulate extracting high-order 32 bits of DMA address */ > +static u32 dma_addr_high32(dma_addr_t addr) > +{ > +#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT > + return (u32)(addr >> 32);
You can probably use upper_32bits() here...
> +#else /* !CONFIG_ARCH_DMA_ADDR_T_64BIT */ > + return 0; > +#endif /* !CONFIG_ARCH_DMA_ADDR_T_64BIT */ > +} > + > /* Program an event ring for use */ > static void gsi_evt_ring_program(struct gsi *gsi, u32 evt_ring_id) > { > @@ -711,7 +721,7 @@ static void gsi_evt_ring_program(struct gsi *gsi, u32 evt_ring_id) > val = evt_ring->ring.addr & GENMASK(31, 0);
...and you can use lower_32bits() here.
> iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_2_OFFSET(evt_ring_id)); > > - val = evt_ring->ring.addr >> 32; > + val = dma_addr_high32(evt_ring->ring.addr);
Does the compiler do a good job at eliminating the assignment when CONFIG_ARCH_DMA_ADDR_T_64BIT is not defined?
> iowrite32(val, gsi->virt + GSI_EV_CH_E_CNTXT_3_OFFSET(evt_ring_id)); > > /* Enable interrupt moderation by setting the moderation delay */ > @@ -819,7 +829,7 @@ static void gsi_channel_program(struct gsi_channel *channel, bool doorbell) > val = channel->tre_ring.addr & GENMASK(31, 0); > iowrite32(val, gsi->virt + GSI_CH_C_CNTXT_2_OFFSET(channel_id)); > > - val = channel->tre_ring.addr >> 32; > + val = dma_addr_high32(channel->tre_ring.addr); > iowrite32(val, gsi->virt + GSI_CH_C_CNTXT_3_OFFSET(channel_id)); > > /* Command channel gets low weighted round-robin priority */ >
-- Florian
| |