summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/xe/xe_any.h
blob: 5d97afa76915a1d8d390b716f77d85564eda6595 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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