Re: [PATCH v4 01/32] drm/xe: Introduce xe_any helpers
"Mallesh, Koujalagi" <[email protected]>
| Newsgroups | org.freedesktop.lists.intel-xe |
|---|---|
| Message-ID | <[email protected]> |
On 13-08-2026 12:44 am, Michal Wajdeczko wrote: > In upcoming patches we want to define macros that will work with > either xe_device or xe_tile or xe_gt pointers. To make them work > and to allow compiler optimizations, introduce set of helpers > that will return either expected pointer type or NULL or make > necessary conversions to/from the struct xe/device/pci_dev. > > Signed-off-by: Michal Wajdeczko <[email protected]> > Cc: Rodrigo Vivi <[email protected]> > Cc: Thomas Hellström <[email protected]> > Cc: Matthew Brost <[email protected]> > Reviewed-by: Rodrigo Vivi <[email protected]> #v2 > Reviewed-by: Mallesh Koujalagi <[email protected]> #v2 Reviewed-by: Mallesh Koujalagi <[email protected]> > Cc: Jani Nikula <[email protected]> > --- > v2: add include (Sashiko) and const support (Mallesh) > reuse existing to_xe() helpers (Michal) > v3: fix another typo and fix to_pdev (Sashiko) > use assoc macros/helpers (Jani) > add support for drm_device (Michal) > --- > drivers/gpu/drm/xe/xe_any.h | 137 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 137 insertions(+) > create mode 100644 drivers/gpu/drm/xe/xe_any.h > > diff --git a/drivers/gpu/drm/xe/xe_any.h b/drivers/gpu/drm/xe/xe_any.h > new file mode 100644 > index 000000000000..5d97afa76915 > --- /dev/null > +++ b/drivers/gpu/drm/xe/xe_any.h > @@ -0,0 +1,137 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright © 2026 Intel Corporation > + */ > + > +#ifndef _XE_ANY_H_ > +#define _XE_ANY_H_ > + > +#include "xe_device.h" > + > +#define __xe_any_to_self_assoc(type, any) \ > + const type * : (any), \ > + type * : (any) > + > +/** > + * xe_any_if_type() - Get the pointer only if it is @type pointer. > + * @any: any pointer > + * @type: data type to look for > + * > + * Return: the @type pointer or NULL. > + */ > +#define xe_any_if_type(any, type) \ > + _Generic((any), \ > + __xe_any_to_self_assoc(type, (any)), \ > + default : NULL) > + > +/** > + * xe_any_if_gt() - Get the pointer only if it is &xe_gt. > + * @any: any pointer > + * > + * Return: the @xe_gt pointer or NULL. > + */ > +#define xe_any_if_gt(any) xe_any_if_type((any), struct xe_gt) > + > +/** > + * xe_any_if_tile() - Get the pointer only if it is &xe_tile. > + * @any: any pointer > + * > + * Return: the @xe_tile pointer or NULL. > + */ > +#define xe_any_if_tile(any) xe_any_if_type((any), struct xe_tile) > + > +/** > + * xe_any_if_xe() - Get the pointer only if it is &xe_device. > + * @any: any pointer > + * > + * Return: the @xe_device pointer or NULL. > + */ > +#define xe_any_if_xe(any) xe_any_if_type((any), struct xe_device) > + > +/** > + * xe_any_if_pdev() - Get the pointer only if it is &pci_dev. > + * @any: any pointer > + * > + * Return: the @pci_dev pointer or NULL. > + */ > +#define xe_any_if_pdev(any) xe_any_if_type((any), struct pci_dev) > + > +#define __xe_any_to_other_assoc(const, from, other, p) \ > + const struct from * : __##from##_to_##other((const struct from *)(p)) > + > +#define __xe_tile_to_xe_device(p) tile_to_xe(p) > +#define __xe_gt_to_xe_device(p) gt_to_xe(p) > +#define __pci_dev_to_xe_device(p) pdev_to_xe_device(p) > +#define __device_to_xe_device(p) kdev_to_xe_device(p) > +#define __drm_device_to_xe_device(p) to_xe_device(p) > +#define __pci_dev_to_device(p) (&(p)->dev) > + > +/** > + * xe_any_to_xe() - Obtain the &xe_device pointer. > + * @any: the &pci_dev or the &xe_device or &xe_tile or &xe_gt pointer > + * > + * Return: the @xe_device pointer or backpointer. > + */ > +#define xe_any_to_xe(any) \ > + _Generic((any), \ > + __xe_any_to_self_assoc(struct xe_device, (any)), \ > + __xe_any_to_other_assoc(/* */, xe_tile, xe_device, (any)), \ > + __xe_any_to_other_assoc(const, xe_tile, xe_device, (any)), \ > + __xe_any_to_other_assoc(/* */, xe_gt, xe_device, (any)), \ > + __xe_any_to_other_assoc(const, xe_gt, xe_device, (any)), \ > + __xe_any_to_other_assoc(, drm_device, xe_device, (any)), \ > + __xe_any_to_other_assoc(, pci_dev, xe_device, (any)), \ > + __xe_any_to_other_assoc(, device, xe_device, (any))) > + > +/** > + * xe_any_to_drm() - Obtain the &drm_device pointer. > + * @any: the &pci_dev or the &xe_device or &xe_tile or &xe_gt pointer > + * > + * Return: the @drm_device pointer or backpointer. > + */ > +#define xe_any_to_drm(any) \ > + _Generic((any), \ > + __xe_any_to_self_assoc(struct drm_device, (any)), \ > + default : &xe_any_to_xe(any)->drm) > + > +/** > + * xe_any_to_dev() - Obtain the &device pointer. > + * @any: the &pci_dev or the &xe_device or &xe_tile or &xe_gt pointer > + * > + * Return: the @device pointer or backpointer. > + */ > +#define xe_any_to_dev(any) \ > + _Generic((any), \ > + __xe_any_to_self_assoc(struct device, (any)), \ > + __xe_any_to_other_assoc(, pci_dev, device, (any)), \ > + default : xe_any_to_drm(any)->dev) > + > +/** > + * xe_any_to_pdev() - Obtain the &pci_dev pointer. > + * @any: the &pci_dev or the &xe_device or &xe_tile or &xe_gt pointer > + * > + * Return: the @pci_dev pointer or backpointer. > + */ > +#define xe_any_to_pdev(any) \ > + _Generic((any), \ > + __xe_any_to_self_assoc(struct pci_dev, (any)), \ > + default : to_pci_dev(xe_any_to_dev(any))) > + > +#define __xe_tile_to_id(p) ((p)->id) > +#define __xe_gt_to_id(p) ((p)->info.id) > + > +/** > + * xe_any_id() - Get the identifier of the underlying object. > + * @any: the &pci_dev or the &xe_device or &xe_tile or &xe_gt pointer > + * > + * Return: the identifier of the object, or 0 if not applicable/available. > + */ > +#define xe_any_id(any) \ > + _Generic((any), \ > + __xe_any_to_other_assoc(/* */, xe_tile, id, (any)), \ > + __xe_any_to_other_assoc(const, xe_tile, id, (any)), \ > + __xe_any_to_other_assoc(/* */, xe_gt, id, (any)), \ > + __xe_any_to_other_assoc(const, xe_gt, id, (any)), \ > + default : 0) > + > +#endif