1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright © 2012 Red Hat.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun * all copies or substantial portions of the Software.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20*4882a593Smuzhiyun * DEALINGS IN THE SOFTWARE.
21*4882a593Smuzhiyun *
22*4882a593Smuzhiyun * Author: Dave Airlie <airlied@redhat.com>
23*4882a593Smuzhiyun */
24*4882a593Smuzhiyun #ifndef XF86_PLATFORM_BUS_H
25*4882a593Smuzhiyun #define XF86_PLATFORM_BUS_H
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #include "hotplug.h"
28*4882a593Smuzhiyun #include "xf86MatchDrivers.h"
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun struct xf86_platform_device {
31*4882a593Smuzhiyun struct OdevAttributes *attribs;
32*4882a593Smuzhiyun /* for PCI devices */
33*4882a593Smuzhiyun struct pci_device *pdev;
34*4882a593Smuzhiyun int flags;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /* xf86_platform_device flags */
38*4882a593Smuzhiyun #define XF86_PDEV_UNOWNED 0x01
39*4882a593Smuzhiyun #define XF86_PDEV_SERVER_FD 0x02
40*4882a593Smuzhiyun #define XF86_PDEV_PAUSED 0x04
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun #ifdef XSERVER_PLATFORM_BUS
43*4882a593Smuzhiyun int xf86platformProbe(void);
44*4882a593Smuzhiyun int xf86platformProbeDev(DriverPtr drvp);
45*4882a593Smuzhiyun int xf86platformAddGPUDevices(DriverPtr drvp);
46*4882a593Smuzhiyun void xf86MergeOutputClassOptions(int entityIndex, void **options);
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun extern int xf86_num_platform_devices;
49*4882a593Smuzhiyun extern struct xf86_platform_device *xf86_platform_devices;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun extern int
52*4882a593Smuzhiyun xf86_add_platform_device(struct OdevAttributes *attribs, Bool unowned);
53*4882a593Smuzhiyun extern int
54*4882a593Smuzhiyun xf86_remove_platform_device(int dev_index);
55*4882a593Smuzhiyun extern Bool
56*4882a593Smuzhiyun xf86_get_platform_device_unowned(int index);
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun extern int
59*4882a593Smuzhiyun xf86platformAddDevice(int index);
60*4882a593Smuzhiyun extern void
61*4882a593Smuzhiyun xf86platformRemoveDevice(int index);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun static inline struct OdevAttributes *
xf86_platform_device_odev_attributes(struct xf86_platform_device * device)64*4882a593Smuzhiyun xf86_platform_device_odev_attributes(struct xf86_platform_device *device)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun return device->attribs;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun static inline struct OdevAttributes *
xf86_platform_odev_attributes(int index)70*4882a593Smuzhiyun xf86_platform_odev_attributes(int index)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun struct xf86_platform_device *device = &xf86_platform_devices[index];
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun return device->attribs;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun #ifndef _XORG_CONFIG_H_
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun * Define the legacy API only for external builds
80*4882a593Smuzhiyun */
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun /* path to kernel device node - Linux e.g. /dev/dri/card0 */
83*4882a593Smuzhiyun #define ODEV_ATTRIB_PATH 1
84*4882a593Smuzhiyun /* system device path - Linux e.g. /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 */
85*4882a593Smuzhiyun #define ODEV_ATTRIB_SYSPATH 2
86*4882a593Smuzhiyun /* DRI-style bus id */
87*4882a593Smuzhiyun #define ODEV_ATTRIB_BUSID 3
88*4882a593Smuzhiyun /* Server managed FD */
89*4882a593Smuzhiyun #define ODEV_ATTRIB_FD 4
90*4882a593Smuzhiyun /* Major number of the device node pointed to by ODEV_ATTRIB_PATH */
91*4882a593Smuzhiyun #define ODEV_ATTRIB_MAJOR 5
92*4882a593Smuzhiyun /* Minor number of the device node pointed to by ODEV_ATTRIB_PATH */
93*4882a593Smuzhiyun #define ODEV_ATTRIB_MINOR 6
94*4882a593Smuzhiyun /* kernel driver name */
95*4882a593Smuzhiyun #define ODEV_ATTRIB_DRIVER 7
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /* Protect against a mismatch attribute type by generating a compiler
98*4882a593Smuzhiyun * error using a negative array size when an incorrect attribute is
99*4882a593Smuzhiyun * passed
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun #define _ODEV_ATTRIB_IS_STRING(x) ((x) == ODEV_ATTRIB_PATH || \
103*4882a593Smuzhiyun (x) == ODEV_ATTRIB_SYSPATH || \
104*4882a593Smuzhiyun (x) == ODEV_ATTRIB_BUSID || \
105*4882a593Smuzhiyun (x) == ODEV_ATTRIB_DRIVER)
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun #define _ODEV_ATTRIB_STRING_CHECK(x) ((int (*)[_ODEV_ATTRIB_IS_STRING(x)-1]) 0)
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun static inline char *
_xf86_get_platform_device_attrib(struct xf86_platform_device * device,int attrib,int (* fake)[0])110*4882a593Smuzhiyun _xf86_get_platform_device_attrib(struct xf86_platform_device *device, int attrib, int (*fake)[0])
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun switch (attrib) {
113*4882a593Smuzhiyun case ODEV_ATTRIB_PATH:
114*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->path;
115*4882a593Smuzhiyun case ODEV_ATTRIB_SYSPATH:
116*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->syspath;
117*4882a593Smuzhiyun case ODEV_ATTRIB_BUSID:
118*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->busid;
119*4882a593Smuzhiyun case ODEV_ATTRIB_DRIVER:
120*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->driver;
121*4882a593Smuzhiyun default:
122*4882a593Smuzhiyun assert(FALSE);
123*4882a593Smuzhiyun return NULL;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun #define xf86_get_platform_device_attrib(device, attrib) _xf86_get_platform_device_attrib(device,attrib,_ODEV_ATTRIB_STRING_CHECK(attrib))
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun #define _ODEV_ATTRIB_IS_INT(x) ((x) == ODEV_ATTRIB_FD || (x) == ODEV_ATTRIB_MAJOR || (x) == ODEV_ATTRIB_MINOR)
130*4882a593Smuzhiyun #define _ODEV_ATTRIB_INT_DEFAULT(x) ((x) == ODEV_ATTRIB_FD ? -1 : 0)
131*4882a593Smuzhiyun #define _ODEV_ATTRIB_DEFAULT_CHECK(x,def) (_ODEV_ATTRIB_INT_DEFAULT(x) == (def))
132*4882a593Smuzhiyun #define _ODEV_ATTRIB_INT_CHECK(x,def) ((int (*)[_ODEV_ATTRIB_IS_INT(x)*_ODEV_ATTRIB_DEFAULT_CHECK(x,def)-1]) 0)
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun static inline int
_xf86_get_platform_device_int_attrib(struct xf86_platform_device * device,int attrib,int (* fake)[0])135*4882a593Smuzhiyun _xf86_get_platform_device_int_attrib(struct xf86_platform_device *device, int attrib, int (*fake)[0])
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun switch (attrib) {
138*4882a593Smuzhiyun case ODEV_ATTRIB_FD:
139*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->fd;
140*4882a593Smuzhiyun case ODEV_ATTRIB_MAJOR:
141*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->major;
142*4882a593Smuzhiyun case ODEV_ATTRIB_MINOR:
143*4882a593Smuzhiyun return xf86_platform_device_odev_attributes(device)->minor;
144*4882a593Smuzhiyun default:
145*4882a593Smuzhiyun assert(FALSE);
146*4882a593Smuzhiyun return 0;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun #define xf86_get_platform_device_int_attrib(device, attrib, def) _xf86_get_platform_device_int_attrib(device,attrib,_ODEV_ATTRIB_INT_CHECK(attrib,def))
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun #endif
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun extern _X_EXPORT Bool
155*4882a593Smuzhiyun xf86PlatformDeviceCheckBusID(struct xf86_platform_device *device, const char *busid);
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun extern _X_EXPORT void
158*4882a593Smuzhiyun xf86PlatformMatchDriver(XF86MatchedDrivers *);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun extern void xf86platformVTProbe(void);
161*4882a593Smuzhiyun extern void xf86platformPrimary(void);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun #else
164*4882a593Smuzhiyun
xf86platformAddGPUDevices(DriverPtr drvp)165*4882a593Smuzhiyun static inline int xf86platformAddGPUDevices(DriverPtr drvp) { return FALSE; }
xf86MergeOutputClassOptions(int index,void ** options)166*4882a593Smuzhiyun static inline void xf86MergeOutputClassOptions(int index, void **options) {}
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun #endif
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun #endif
171