blob: 5d97afa76915a1d8d390b716f77d85564eda6595 [file] [edit]
/* 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