1 /*
2  * Copyright (c) 2010 Red Hat Inc.
3  * Author : Dave Airlie <airlied@redhat.com>
4  *
5  * Licensed under GPLv2
6  *
7  * vga_switcheroo.h - Support for laptop with dual GPU using one set of outputs
8  */
9 
10 #ifndef _LINUX_VGA_SWITCHEROO_H_
11 #define _LINUX_VGA_SWITCHEROO_H_
12 
13 #include <linux/fb.h>
14 
15 struct pci_dev;
16 
17 enum vga_switcheroo_state {
18 	VGA_SWITCHEROO_OFF,
19 	VGA_SWITCHEROO_ON,
20 	/* below are referred only from vga_switcheroo_get_client_state() */
21 	VGA_SWITCHEROO_INIT,
22 	VGA_SWITCHEROO_NOT_FOUND,
23 };
24 
25 enum vga_switcheroo_client_id {
26 	VGA_SWITCHEROO_IGD,
27 	VGA_SWITCHEROO_DIS,
28 	VGA_SWITCHEROO_MAX_CLIENTS,
29 };
30 
31 struct vga_switcheroo_handler {
32 	int (*switchto)(enum vga_switcheroo_client_id id);
33 	int (*power_state)(enum vga_switcheroo_client_id id,
34 			   enum vga_switcheroo_state state);
35 	int (*init)(void);
36 	int (*get_client_id)(struct pci_dev *pdev);
37 };
38 
39 struct vga_switcheroo_client_ops {
40 	void (*set_gpu_state)(struct pci_dev *dev, enum vga_switcheroo_state);
41 	void (*reprobe)(struct pci_dev *dev);
42 	bool (*can_switch)(struct pci_dev *dev);
43 };
44 
45 #if defined(CONFIG_VGA_SWITCHEROO)
46 void vga_switcheroo_unregister_client(struct pci_dev *dev);
47 int vga_switcheroo_register_client(struct pci_dev *dev,
48 				   const struct vga_switcheroo_client_ops *ops,
49 				   bool driver_power_control);
50 int vga_switcheroo_register_audio_client(struct pci_dev *pdev,
51 					 const struct vga_switcheroo_client_ops *ops,
52 					 int id, bool active);
53 
54 void vga_switcheroo_client_fb_set(struct pci_dev *dev,
55 				  struct fb_info *info);
56 
57 int vga_switcheroo_register_handler(struct vga_switcheroo_handler *handler);
58 void vga_switcheroo_unregister_handler(void);
59 
60 int vga_switcheroo_process_delayed_switch(void);
61 
62 int vga_switcheroo_get_client_state(struct pci_dev *dev);
63 
64 void vga_switcheroo_set_dynamic_switch(struct pci_dev *pdev, enum vga_switcheroo_state dynamic);
65 
66 int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain);
67 void vga_switcheroo_fini_domain_pm_ops(struct device *dev);
68 int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, struct dev_pm_domain *domain);
69 #else
70 
vga_switcheroo_unregister_client(struct pci_dev * dev)71 static inline void vga_switcheroo_unregister_client(struct pci_dev *dev) {}
vga_switcheroo_register_client(struct pci_dev * dev,const struct vga_switcheroo_client_ops * ops,bool driver_power_control)72 static inline int vga_switcheroo_register_client(struct pci_dev *dev,
73 		const struct vga_switcheroo_client_ops *ops, bool driver_power_control) { return 0; }
vga_switcheroo_client_fb_set(struct pci_dev * dev,struct fb_info * info)74 static inline void vga_switcheroo_client_fb_set(struct pci_dev *dev, struct fb_info *info) {}
vga_switcheroo_register_handler(struct vga_switcheroo_handler * handler)75 static inline int vga_switcheroo_register_handler(struct vga_switcheroo_handler *handler) { return 0; }
vga_switcheroo_register_audio_client(struct pci_dev * pdev,const struct vga_switcheroo_client_ops * ops,int id,bool active)76 static inline int vga_switcheroo_register_audio_client(struct pci_dev *pdev,
77 	const struct vga_switcheroo_client_ops *ops,
78 	int id, bool active) { return 0; }
vga_switcheroo_unregister_handler(void)79 static inline void vga_switcheroo_unregister_handler(void) {}
vga_switcheroo_process_delayed_switch(void)80 static inline int vga_switcheroo_process_delayed_switch(void) { return 0; }
vga_switcheroo_get_client_state(struct pci_dev * dev)81 static inline int vga_switcheroo_get_client_state(struct pci_dev *dev) { return VGA_SWITCHEROO_ON; }
82 
vga_switcheroo_set_dynamic_switch(struct pci_dev * pdev,enum vga_switcheroo_state dynamic)83 static inline void vga_switcheroo_set_dynamic_switch(struct pci_dev *pdev, enum vga_switcheroo_state dynamic) {}
84 
vga_switcheroo_init_domain_pm_ops(struct device * dev,struct dev_pm_domain * domain)85 static inline int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *domain) { return -EINVAL; }
vga_switcheroo_fini_domain_pm_ops(struct device * dev)86 static inline void vga_switcheroo_fini_domain_pm_ops(struct device *dev) {}
vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device * dev,struct dev_pm_domain * domain)87 static inline int vga_switcheroo_init_domain_pm_optimus_hdmi_audio(struct device *dev, struct dev_pm_domain *domain) { return -EINVAL; }
88 
89 #endif
90 #endif /* _LINUX_VGA_SWITCHEROO_H_ */
91