[PATCH 6/6] drm/xe: Make xe_mmio_read|write() functions non-inline
Matt Roper
matthew.d.roper at intel.com
Wed Jan 17 23:43:34 UTC 2024
On Tue, Jan 16, 2024 at 03:56:17PM +0100, Michal Wajdeczko wrote:
> Shortly we will updating xe_mmio_read|write() functions with SR-IOV
> specific features making those functions less suitable for inline.
> Convert now those functions into regular ones, lowering driver
> footprint, according to scripts/bloat-o-meter, by 6%
>
> add/remove: 18/18 grow/shrink: 31/603 up/down: 2719/-79663 (-76944)
> Function old new delta
> Total: Before=1276633, After=1199689, chg -6.03%
> add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
> Data old new delta
> Total: Before=48990, After=48990, chg +0.00%
> add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
> RO Data old new delta
> Total: Before=115680, After=115680, chg +0.00%
>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
Reviewed-by: Matt Roper <matthew.d.roper at intel.com>
> ---
> drivers/gpu/drm/xe/xe_mmio.c | 72 ++++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_mmio.h | 81 ++++--------------------------------
> 2 files changed, 79 insertions(+), 74 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c
> index c8c5d74b6e90..5a7f9a9d4624 100644
> --- a/drivers/gpu/drm/xe/xe_mmio.c
> +++ b/drivers/gpu/drm/xe/xe_mmio.c
> @@ -413,6 +413,78 @@ int xe_mmio_root_tile_init(struct xe_device *xe)
> return 0;
> }
>
> +u8 xe_mmio_read8(struct xe_gt *gt, struct xe_reg reg)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> +
> + if (reg.addr < gt->mmio.adj_limit)
> + reg.addr += gt->mmio.adj_offset;
> +
> + return readb((reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> +}
> +
> +u16 xe_mmio_read16(struct xe_gt *gt, struct xe_reg reg)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> +
> + if (reg.addr < gt->mmio.adj_limit)
> + reg.addr += gt->mmio.adj_offset;
> +
> + return readw((reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> +}
> +
> +void xe_mmio_write32(struct xe_gt *gt, struct xe_reg reg, u32 val)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> +
> + if (reg.addr < gt->mmio.adj_limit)
> + reg.addr += gt->mmio.adj_offset;
> +
> + writel(val, (reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> +}
> +
> +u32 xe_mmio_read32(struct xe_gt *gt, struct xe_reg reg)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> +
> + if (reg.addr < gt->mmio.adj_limit)
> + reg.addr += gt->mmio.adj_offset;
> +
> + return readl((reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> +}
> +
> +u32 xe_mmio_rmw32(struct xe_gt *gt, struct xe_reg reg, u32 clr, u32 set)
> +{
> + u32 old, reg_val;
> +
> + old = xe_mmio_read32(gt, reg);
> + reg_val = (old & ~clr) | set;
> + xe_mmio_write32(gt, reg, reg_val);
> +
> + return old;
> +}
> +
> +int xe_mmio_write32_and_verify(struct xe_gt *gt,
> + struct xe_reg reg, u32 val, u32 mask, u32 eval)
> +{
> + u32 reg_val;
> +
> + xe_mmio_write32(gt, reg, val);
> + reg_val = xe_mmio_read32(gt, reg);
> +
> + return (reg_val & mask) != eval ? -EINVAL : 0;
> +}
> +
> +bool xe_mmio_in_range(const struct xe_gt *gt,
> + const struct xe_mmio_range *range,
> + struct xe_reg reg)
> +{
> + if (reg.addr < gt->mmio.adj_limit)
> + reg.addr += gt->mmio.adj_offset;
> +
> + return range && reg.addr >= range->start && reg.addr <= range->end;
> +}
> +
> /**
> * xe_mmio_read64_2x32() - Read a 64-bit register as two 32-bit reads
> * @gt: MMIO target GT
> diff --git a/drivers/gpu/drm/xe/xe_mmio.h b/drivers/gpu/drm/xe/xe_mmio.h
> index 98de5c13c89b..67ead99f321b 100644
> --- a/drivers/gpu/drm/xe/xe_mmio.h
> +++ b/drivers/gpu/drm/xe/xe_mmio.h
> @@ -24,80 +24,13 @@ int xe_mmio_init(struct xe_device *xe);
> int xe_mmio_root_tile_init(struct xe_device *xe);
> void xe_mmio_probe_tiles(struct xe_device *xe);
>
> -static inline u8 xe_mmio_read8(struct xe_gt *gt, struct xe_reg reg)
> -{
> - struct xe_tile *tile = gt_to_tile(gt);
> -
> - if (reg.addr < gt->mmio.adj_limit)
> - reg.addr += gt->mmio.adj_offset;
> -
> - return readb((reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> -}
> -
> -static inline u16 xe_mmio_read16(struct xe_gt *gt, struct xe_reg reg)
> -{
> - struct xe_tile *tile = gt_to_tile(gt);
> -
> - if (reg.addr < gt->mmio.adj_limit)
> - reg.addr += gt->mmio.adj_offset;
> -
> - return readw((reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> -}
> -
> -static inline void xe_mmio_write32(struct xe_gt *gt,
> - struct xe_reg reg, u32 val)
> -{
> - struct xe_tile *tile = gt_to_tile(gt);
> -
> - if (reg.addr < gt->mmio.adj_limit)
> - reg.addr += gt->mmio.adj_offset;
> -
> - writel(val, (reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> -}
> -
> -static inline u32 xe_mmio_read32(struct xe_gt *gt, struct xe_reg reg)
> -{
> - struct xe_tile *tile = gt_to_tile(gt);
> -
> - if (reg.addr < gt->mmio.adj_limit)
> - reg.addr += gt->mmio.adj_offset;
> -
> - return readl((reg.ext ? tile->mmio_ext.regs : tile->mmio.regs) + reg.addr);
> -}
> -
> -static inline u32 xe_mmio_rmw32(struct xe_gt *gt, struct xe_reg reg, u32 clr,
> - u32 set)
> -{
> - u32 old, reg_val;
> -
> - old = xe_mmio_read32(gt, reg);
> - reg_val = (old & ~clr) | set;
> - xe_mmio_write32(gt, reg, reg_val);
> -
> - return old;
> -}
> -
> -static inline int xe_mmio_write32_and_verify(struct xe_gt *gt,
> - struct xe_reg reg, u32 val,
> - u32 mask, u32 eval)
> -{
> - u32 reg_val;
> -
> - xe_mmio_write32(gt, reg, val);
> - reg_val = xe_mmio_read32(gt, reg);
> -
> - return (reg_val & mask) != eval ? -EINVAL : 0;
> -}
> -
> -static inline bool xe_mmio_in_range(const struct xe_gt *gt,
> - const struct xe_mmio_range *range,
> - struct xe_reg reg)
> -{
> - if (reg.addr < gt->mmio.adj_limit)
> - reg.addr += gt->mmio.adj_offset;
> -
> - return range && reg.addr >= range->start && reg.addr <= range->end;
> -}
> +u8 xe_mmio_read8(struct xe_gt *gt, struct xe_reg reg);
> +u16 xe_mmio_read16(struct xe_gt *gt, struct xe_reg reg);
> +void xe_mmio_write32(struct xe_gt *gt, struct xe_reg reg, u32 val);
> +u32 xe_mmio_read32(struct xe_gt *gt, struct xe_reg reg);
> +u32 xe_mmio_rmw32(struct xe_gt *gt, struct xe_reg reg, u32 clr, u32 set);
> +int xe_mmio_write32_and_verify(struct xe_gt *gt, struct xe_reg reg, u32 val, u32 mask, u32 eval);
> +bool xe_mmio_in_range(const struct xe_gt *gt, const struct xe_mmio_range *range, struct xe_reg reg);
>
> int xe_mmio_probe_vram(struct xe_device *xe);
> u64 xe_mmio_read64_2x32(struct xe_gt *gt, struct xe_reg reg);
> --
> 2.25.1
>
--
Matt Roper
Graphics Software Engineer
Linux GPU Platform Enablement
Intel Corporation
More information about the Intel-xe
mailing list