@@ -57,7 +57,7 @@ module_param(modeset, bool, 0600);
57
57
DECLARE_FAULT_ATTR (fail_gem_alloc );
58
58
DECLARE_FAULT_ATTR (fail_gem_iova );
59
59
60
- static int msm_drm_uninit (struct device * dev )
60
+ static int msm_drm_uninit (struct device * dev , const struct component_ops * gpu_ops )
61
61
{
62
62
struct platform_device * pdev = to_platform_device (dev );
63
63
struct msm_drm_private * priv = platform_get_drvdata (pdev );
@@ -84,15 +84,19 @@ static int msm_drm_uninit(struct device *dev)
84
84
if (priv -> kms )
85
85
msm_drm_kms_uninit (dev );
86
86
87
- component_unbind_all (dev , ddev );
87
+ if (gpu_ops )
88
+ gpu_ops -> unbind (dev , dev , NULL );
89
+ else
90
+ component_unbind_all (dev , ddev );
88
91
89
92
ddev -> dev_private = NULL ;
90
93
drm_dev_put (ddev );
91
94
92
95
return 0 ;
93
96
}
94
97
95
- static int msm_drm_init (struct device * dev , const struct drm_driver * drv )
98
+ static int msm_drm_init (struct device * dev , const struct drm_driver * drv ,
99
+ const struct component_ops * gpu_ops )
96
100
{
97
101
struct msm_drm_private * priv = dev_get_drvdata (dev );
98
102
struct drm_device * ddev ;
@@ -139,7 +143,10 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
139
143
dma_set_max_seg_size (dev , UINT_MAX );
140
144
141
145
/* Bind all our sub-components: */
142
- ret = component_bind_all (dev , ddev );
146
+ if (gpu_ops )
147
+ ret = gpu_ops -> bind (dev , dev , NULL );
148
+ else
149
+ ret = component_bind_all (dev , ddev );
143
150
if (ret )
144
151
goto err_put_dev ;
145
152
@@ -151,11 +158,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
151
158
ret = msm_drm_kms_init (dev , drv );
152
159
if (ret )
153
160
goto err_msm_uninit ;
154
- } else {
155
- /* valid only for the dummy headless case, where of_node=NULL */
156
- WARN_ON (dev -> of_node );
157
- ddev -> driver_features &= ~DRIVER_MODESET ;
158
- ddev -> driver_features &= ~DRIVER_ATOMIC ;
159
161
}
160
162
161
163
ret = drm_dev_register (ddev , 0 );
@@ -172,7 +174,7 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
172
174
return 0 ;
173
175
174
176
err_msm_uninit :
175
- msm_drm_uninit (dev );
177
+ msm_drm_uninit (dev , gpu_ops );
176
178
177
179
return ret ;
178
180
@@ -834,6 +836,28 @@ static const struct drm_driver msm_driver = {
834
836
.patchlevel = MSM_VERSION_PATCHLEVEL ,
835
837
};
836
838
839
+ static const struct drm_driver msm_gpu_driver = {
840
+ .driver_features = DRIVER_GEM |
841
+ DRIVER_RENDER |
842
+ DRIVER_SYNCOBJ_TIMELINE |
843
+ DRIVER_SYNCOBJ ,
844
+ .open = msm_open ,
845
+ .postclose = msm_postclose ,
846
+ .gem_prime_import_sg_table = msm_gem_prime_import_sg_table ,
847
+ #ifdef CONFIG_DEBUG_FS
848
+ .debugfs_init = msm_debugfs_init ,
849
+ #endif
850
+ .show_fdinfo = msm_show_fdinfo ,
851
+ .ioctls = msm_ioctls ,
852
+ .num_ioctls = ARRAY_SIZE (msm_ioctls ),
853
+ .fops = & fops ,
854
+ .name = "msm" ,
855
+ .desc = "MSM Snapdragon DRM" ,
856
+ .major = MSM_VERSION_MAJOR ,
857
+ .minor = MSM_VERSION_MINOR ,
858
+ .patchlevel = MSM_VERSION_PATCHLEVEL ,
859
+ };
860
+
837
861
/*
838
862
* Componentized driver support:
839
863
*/
@@ -958,12 +982,12 @@ static int add_gpu_components(struct device *dev,
958
982
959
983
static int msm_drm_bind (struct device * dev )
960
984
{
961
- return msm_drm_init (dev , & msm_driver );
985
+ return msm_drm_init (dev , & msm_driver , NULL );
962
986
}
963
987
964
988
static void msm_drm_unbind (struct device * dev )
965
989
{
966
- msm_drm_uninit (dev );
990
+ msm_drm_uninit (dev , NULL );
967
991
}
968
992
969
993
const struct component_master_ops msm_drm_ops = {
@@ -1012,29 +1036,34 @@ int msm_drv_probe(struct device *master_dev,
1012
1036
return 0 ;
1013
1037
}
1014
1038
1015
- /*
1016
- * Platform driver:
1017
- * Used only for headlesss GPU instances
1018
- */
1019
-
1020
- static int msm_pdev_probe (struct platform_device * pdev )
1039
+ int msm_gpu_probe (struct platform_device * pdev ,
1040
+ const struct component_ops * ops )
1021
1041
{
1022
- return msm_drv_probe (& pdev -> dev , NULL , NULL );
1042
+ struct msm_drm_private * priv ;
1043
+ int ret ;
1044
+
1045
+ priv = devm_kzalloc (& pdev -> dev , sizeof (* priv ), GFP_KERNEL );
1046
+ if (!priv )
1047
+ return - ENOMEM ;
1048
+
1049
+ platform_set_drvdata (pdev , priv );
1050
+
1051
+ /* on all devices that I am aware of, iommu's which can map
1052
+ * any address the cpu can see are used:
1053
+ */
1054
+ ret = dma_set_mask_and_coherent (& pdev -> dev , ~0 );
1055
+ if (ret )
1056
+ return ret ;
1057
+
1058
+ return msm_drm_init (& pdev -> dev , & msm_gpu_driver , ops );
1023
1059
}
1024
1060
1025
- static void msm_pdev_remove (struct platform_device * pdev )
1061
+ void msm_gpu_remove (struct platform_device * pdev ,
1062
+ const struct component_ops * ops )
1026
1063
{
1027
- component_master_del (& pdev -> dev , & msm_drm_ops );
1064
+ msm_drm_uninit (& pdev -> dev , ops );
1028
1065
}
1029
1066
1030
- static struct platform_driver msm_platform_driver = {
1031
- .probe = msm_pdev_probe ,
1032
- .remove = msm_pdev_remove ,
1033
- .driver = {
1034
- .name = "msm" ,
1035
- },
1036
- };
1037
-
1038
1067
static int __init msm_drm_register (void )
1039
1068
{
1040
1069
if (!modeset )
@@ -1049,13 +1078,13 @@ static int __init msm_drm_register(void)
1049
1078
adreno_register ();
1050
1079
msm_mdp4_register ();
1051
1080
msm_mdss_register ();
1052
- return platform_driver_register (& msm_platform_driver );
1081
+
1082
+ return 0 ;
1053
1083
}
1054
1084
1055
1085
static void __exit msm_drm_unregister (void )
1056
1086
{
1057
1087
DBG ("fini" );
1058
- platform_driver_unregister (& msm_platform_driver );
1059
1088
msm_mdss_unregister ();
1060
1089
msm_mdp4_unregister ();
1061
1090
msm_dp_unregister ();
0 commit comments