@@ -19,6 +19,7 @@ static bool is_configfs_registered;
1919 * @planes_group: Default subgroup of @group at "/config/vkms/planes"
2020 * @crtcs_group: Default subgroup of @group at "/config/vkms/crtcs"
2121 * @encoders_group: Default subgroup of @group at "/config/vkms/encoders"
22+ * @connectors_group: Default subgroup of @group at "/config/vkms/connectors"
2223 * @lock: Lock used to project concurrent access to the configuration attributes
2324 * @config: Protected by @lock. Configuration of the VKMS device
2425 * @enabled: Protected by @lock. The device is created or destroyed when this
@@ -29,6 +30,7 @@ struct vkms_configfs_device {
2930 struct config_group planes_group ;
3031 struct config_group crtcs_group ;
3132 struct config_group encoders_group ;
33+ struct config_group connectors_group ;
3234
3335 struct mutex lock ;
3436 struct vkms_config * config ;
@@ -81,6 +83,20 @@ struct vkms_configfs_encoder {
8183 struct vkms_config_encoder * config ;
8284};
8385
86+ /**
87+ * struct vkms_configfs_connector - Configfs representation of a connector
88+ *
89+ * @group: Top level configuration group that represents a connector.
90+ * Initialized when a new directory is created under "/config/vkms/connectors"
91+ * @dev: The vkms_configfs_device this connector belongs to
92+ * @config: Configuration of the VKMS connector
93+ */
94+ struct vkms_configfs_connector {
95+ struct config_group group ;
96+ struct vkms_configfs_device * dev ;
97+ struct vkms_config_connector * config ;
98+ };
99+
84100#define device_item_to_vkms_configfs_device (item ) \
85101 container_of(to_config_group((item)), struct vkms_configfs_device, \
86102 group)
@@ -106,6 +122,10 @@ struct vkms_configfs_encoder {
106122 container_of(to_config_group((item)), struct vkms_configfs_encoder, \
107123 possible_crtcs_group)
108124
125+ #define connector_item_to_vkms_configfs_connector (item ) \
126+ container_of(to_config_group((item)), struct vkms_configfs_connector, \
127+ group)
128+
109129static ssize_t crtc_writeback_show (struct config_item * item , char * page )
110130{
111131 struct vkms_configfs_crtc * crtc ;
@@ -485,6 +505,69 @@ static const struct config_item_type encoder_group_type = {
485505 .ct_owner = THIS_MODULE ,
486506};
487507
508+ static void connector_release (struct config_item * item )
509+ {
510+ struct vkms_configfs_connector * connector ;
511+ struct mutex * lock ;
512+
513+ connector = connector_item_to_vkms_configfs_connector (item );
514+ lock = & connector -> dev -> lock ;
515+
516+ scoped_guard (mutex , lock ) {
517+ vkms_config_destroy_connector (connector -> config );
518+ kfree (connector );
519+ }
520+ }
521+
522+ static struct configfs_item_operations connector_item_operations = {
523+ .release = & connector_release ,
524+ };
525+
526+ static const struct config_item_type connector_item_type = {
527+ .ct_item_ops = & connector_item_operations ,
528+ .ct_owner = THIS_MODULE ,
529+ };
530+
531+ static struct config_group * make_connector_group (struct config_group * group ,
532+ const char * name )
533+ {
534+ struct vkms_configfs_device * dev ;
535+ struct vkms_configfs_connector * connector ;
536+
537+ dev = child_group_to_vkms_configfs_device (group );
538+
539+ scoped_guard (mutex , & dev -> lock ) {
540+ if (dev -> enabled )
541+ return ERR_PTR (- EBUSY );
542+
543+ connector = kzalloc (sizeof (* connector ), GFP_KERNEL );
544+ if (!connector )
545+ return ERR_PTR (- ENOMEM );
546+
547+ connector -> dev = dev ;
548+
549+ connector -> config = vkms_config_create_connector (dev -> config );
550+ if (IS_ERR (connector -> config )) {
551+ kfree (connector );
552+ return ERR_CAST (connector -> config );
553+ }
554+
555+ config_group_init_type_name (& connector -> group , name ,
556+ & connector_item_type );
557+ }
558+
559+ return & connector -> group ;
560+ }
561+
562+ static struct configfs_group_operations connectors_group_operations = {
563+ .make_group = & make_connector_group ,
564+ };
565+
566+ static const struct config_item_type connector_group_type = {
567+ .ct_group_ops = & connectors_group_operations ,
568+ .ct_owner = THIS_MODULE ,
569+ };
570+
488571static ssize_t device_enabled_show (struct config_item * item , char * page )
489572{
490573 struct vkms_configfs_device * dev ;
@@ -592,6 +675,10 @@ static struct config_group *make_device_group(struct config_group *group,
592675 & encoder_group_type );
593676 configfs_add_default_group (& dev -> encoders_group , & dev -> group );
594677
678+ config_group_init_type_name (& dev -> connectors_group , "connectors" ,
679+ & connector_group_type );
680+ configfs_add_default_group (& dev -> connectors_group , & dev -> group );
681+
595682 return & dev -> group ;
596683}
597684
0 commit comments