@@ -54,16 +54,48 @@ static bool modeset = true;
5454MODULE_PARM_DESC (modeset , "Use kernel modesetting [KMS] (1=on (default), 0=disable)" );
5555module_param (modeset , bool , 0600 );
5656
57- static bool separate_gpu_kms ;
58- MODULE_PARM_DESC (separate_gpu_drm , "Use separate DRM device for the GPU (0=single DRM device for both GPU and display (default), 1=two DRM devices)" );
59- module_param (separate_gpu_kms , bool , 0400 );
57+ static int separate_gpu_kms = -1 ;
58+ MODULE_PARM_DESC (separate_gpu_kms ,
59+ "Use separate DRM device for the GPU (-1=auto (default), 0=single DRM
60+ device , 1 = separate DRM devices )");
61+ module_param (separate_gpu_kms , int , 0400 );
6062
6163DECLARE_FAULT_ATTR (fail_gem_alloc );
6264DECLARE_FAULT_ATTR (fail_gem_iova );
6365
64- bool msm_gpu_no_components (void )
66+ static const struct of_device_id msm_gpu_match [];
67+
68+ static int msm_count_gpus (void )
69+ {
70+ struct device_node * np ;
71+ int count = 0 ;
72+
73+ for_each_matching_node (np , msm_gpu_match ) {
74+ if (of_device_is_available (np ) && adreno_has_gpu (np ))
75+ count ++ ;
76+ }
77+
78+ return count ;
79+ }
80+
81+ static bool msm_separate_gpu_kms_auto (void )
82+ {
83+ int gpus = msm_count_gpus ();
84+ int mdss = msm_mdss_count_masters ();
85+
86+ if (mdss == 2 && gpus == 1 )
87+ return true;
88+
89+ return false;
90+ }
91+
92+ bool msm_seperate_gpu_kms_components (void )
6593{
66- return separate_gpu_kms ;
94+ if (separate_gpu_kms == 1 )
95+ return true;
96+ if (separate_gpu_kms == 0 )
97+ return false;
98+ return msm_separate_gpu_kms_auto ();
6799}
68100
69101static int msm_drm_uninit (struct device * dev , const struct component_ops * gpu_ops )
@@ -1018,7 +1050,7 @@ static int add_gpu_components(struct device *dev,
10181050static int msm_drm_bind (struct device * dev )
10191051{
10201052 return msm_drm_init (dev ,
1021- msm_gpu_no_components () ?
1053+ msm_seperate_gpu_kms_components () ?
10221054 & msm_kms_driver :
10231055 & msm_driver ,
10241056 NULL );
@@ -1057,7 +1089,7 @@ int msm_drv_probe(struct device *master_dev,
10571089 return ret ;
10581090 }
10591091
1060- if (!msm_gpu_no_components ()) {
1092+ if (!msm_seperate_gpu_kms_components ()) {
10611093 ret = add_gpu_components (master_dev , & match );
10621094 if (ret )
10631095 return ret ;
0 commit comments