summarylogtreecommitdiffstats
path: root/0003-config-igpu.patch
blob: 4cdf84f8b9a902170f1cb975ee5bc7747feb6dd7 (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
diff --git a/conf/bumblebee.conf.in b/conf/bumblebee.conf.in
index a4d071718ff4f4f7acd18639cce9e745203ab13b..d572dcfa35ca8ba7da5b2ed1bf0cd7c5f7fe21cb 100644
--- a/conf/bumblebee.conf.in
+++ b/conf/bumblebee.conf.in
@@ -22,6 +22,8 @@ NoEcoModeOverride=false
 Driver=@CONF_DRIVER@
 # Directory with a dummy config file to pass as a -configdir to secondary X
 XorgConfDir=@XCONFDDIR@
+# PCI Vendor ID of integrated card, empty defaults to INTEL (0x8086)
+IGCPCIVendorId=0x1002
 
 ## Client options. Will take effect on the next optirun executed.
 [optirun]
diff --git a/src/bbconfig.c b/src/bbconfig.c
index 1dff5e020fcbdc61a0143e69fc16ca6f63c50c34..81458d040864960b265dcbd7c8760c9c26debde2 100644
--- a/src/bbconfig.c
+++ b/src/bbconfig.c
@@ -47,6 +47,14 @@ const char *bb_pm_method_string[PM_METHODS_COUNT] = {
 struct bb_status_struct bb_status;
 struct bb_config_struct bb_config;
 
+/**
+* Returns a guint from value string
+*/
+guint bb_uint_from_string(char* str) {
+  unsigned int ret;
+  sscanf(str, "%x", &ret);
+  return ret;
+}
 /**
  * Returns a gboolean from true/false strings
  * @return TRUE if str="true", FALSE otherwise
@@ -425,6 +433,10 @@ GKeyFile *bbconfig_parse_conf(void) {
   if (g_key_file_has_key(bbcfg, section, key, NULL)) {
     free_and_set_value(&bb_config.x_conf_dir, g_key_file_get_string(bbcfg, section, key, NULL));
   }
+  key = "IGCPCIVendorId";
+  if (g_key_file_has_key(bbcfg, section, key, NULL)) {
+    free_and_set_value(&bb_config.igc_pci_vendor_id, g_key_file_get_string(bbcfg, section, key, NULL));
+  }  
   return bbcfg;
 }
 
@@ -520,6 +532,7 @@ void init_config(void) {
   set_string_value(&bb_config.optirun_bridge, CONF_BRIDGE);
   set_string_value(&bb_config.primus_ld_path, CONF_PRIMUS_LD_PATH);
   set_string_value(&bb_config.vgl_compress, CONF_VGLCOMPRESS);
+  set_string_value(&bb_config.igc_pci_vendor_id, "");
   // default to auto-detect
   set_string_value(&bb_config.driver, "");
   set_string_value(&bb_config.module_name, "");
@@ -543,6 +556,8 @@ void config_dump(void) {
   bb_log(LOG_DEBUG, " X display: %s\n", bb_config.x_display);
   bb_log(LOG_DEBUG, " LD_LIBRARY_PATH: %s\n", bb_config.ld_path);
   bb_log(LOG_DEBUG, " Socket path: %s\n", bb_config.socket_path);
+  bb_log(LOG_DEBUG, " Integrated Graphic Card PCI Vendor ID: %s\n", bb_config.igc_pci_vendor_id);
+  
   if (bb_status.runmode == BB_RUN_SERVER || bb_status.runmode == BB_RUN_DAEMON) {
     /* daemon options */
 #ifdef WITH_PIDFILE
diff --git a/src/bbconfig.h b/src/bbconfig.h
index 5596b64c872d738be6da7478228f0607c8fd99e7..62fd388d9d6829a0a2c4f3c59fa219f2b786f021 100644
--- a/src/bbconfig.h
+++ b/src/bbconfig.h
@@ -143,6 +143,7 @@ struct bb_config_struct {
                                     * If empty, driver will be used. This is
                                     * for Ubuntu which uses nvidia-current */
     int card_shutdown_state;
+    char * igc_pci_vendor_id;
 #ifdef WITH_PIDFILE
     char *pid_file; /* pid file for storing the daemons PID */
 #endif
@@ -180,6 +181,7 @@ void bbconfig_parse_opts(int argc, char *argv[], int conf_round);
 GKeyFile *bbconfig_parse_conf(void);
 void bbconfig_parse_conf_driver(GKeyFile *bbcfg, char *driver);
 
+guint bb_uint_from_string(char* str);
 gboolean bb_bool_from_string(char* str);
 
 enum bb_pm_method bb_pm_method_from_string(char *value);
diff --git a/src/bumblebeed.c b/src/bumblebeed.c
index a911da9a474a5fe69e813b7f38d7ce7906f8d125..44d761e585603f1e08651c605b721442b7ecb2e0 100644
--- a/src/bumblebeed.c
+++ b/src/bumblebeed.c
@@ -461,14 +461,19 @@ int main(int argc, char* argv[]) {
   init_config();
   bbconfig_parse_opts(argc, argv, PARSE_STAGE_PRECONF);
 
-  /* First look for an intel card */
-  struct pci_bus_id *pci_id_igd = pci_find_gfx_by_vendor(PCI_VENDOR_ID_INTEL, 0);
+  GKeyFile *bbcfg = bbconfig_parse_conf();
+
+  /* look for an integrated card */
+  unsigned int igc_pcivndid = bb_uint_from_string(bb_config.igc_pci_vendor_id);
+  igc_pcivndid =  igc_pcivndid == 0 ? PCI_VENDOR_ID_INTEL : igc_pcivndid; 
+
+  struct pci_bus_id *pci_id_igd = pci_find_gfx_by_vendor(igc_pcivndid, 0);
   if (!pci_id_igd) {
     /* This is no Optimus configuration. But maybe it's a
        dual-nvidia configuration. Let us test that.
     */
     pci_id_igd = pci_find_gfx_by_vendor(PCI_VENDOR_ID_NVIDIA, 1);
-    bb_log(LOG_INFO, "No Intel video card found, testing for dual-nvidia system.\n");
+    bb_log(LOG_INFO, "No integrated video card found, testing for dual-nvidia system.\n");
 
     if (!pci_id_igd) {
       /* Ok, this is not a double gpu setup supported (there is at most
@@ -488,7 +493,6 @@ int main(int argc, char* argv[]) {
 
   free(pci_id_igd);
 
-  GKeyFile *bbcfg = bbconfig_parse_conf();
   bbconfig_parse_opts(argc, argv, PARSE_STAGE_DRIVER);
   driver_detect();
   if (bbcfg) {