VT binding: Add sysfs support
PATCH 2/5 VT binding: Add sysfs support
Add sysfs attributes for binding and unbinding VT console drivers. The attributes are located in /sys/class/tty/console and are namely:
A. backend - list registered drivers in the following format:
"I C: Description"
Where: I = ID number of the driver
C = status of the driver which can be:
S = system driver
B = bound modular driver
U = unbound modular driver
Description - text description of the driver
B. bind - binds a driver to the console layer
echo <ID> > /sys/class/tty/console/bind
C. unbind - unbinds a driver from the console layer
echo <ID> > /sys/class/tty/console/unbind
The tty layer does nothing to these attributes except create them and punt all requests to the VT layer.
---
drivers/char/tty_io.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++- include/linux/tty.h | 19 ++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletions(-)
drivers/char/tty_io.c +52 -1
@@ -3231,6 +3231,47 @@ #ifdef CONFIG_VTstatic struct cdev vc0_cdev;#endif +static ssize_t store_bind (struct class_device *class_device, +const char *buf,size_t count) +{ +int index =simple_strtoul (buf,NULL ,0 ); + +vt_bind (index); +return count; +} + +static ssize_t store_unbind (struct class_device *class_device, +const char *buf,size_t count) +{ +int index =simple_strtoul (buf,NULL ,0 ); + +vt_unbind (index); +return count; +} + +static ssize_t show_con_drivers (struct class_device *class_device,char *buf) +{ +return vt_show_drivers (buf); +} + +static struct class_device_attribute class_device_attrs[] = { +__ATTR (bind,S_IWUSR ,NULL , store_bind), +__ATTR (unbind,S_IWUSR ,NULL , store_unbind), +__ATTR (backend,S_IRUGO , show_con_drivers,NULL ), +}; + +static struct class_device *console_class_device; + +static int console_init_class_device (void ) +{ +int i; + +for (i =0 ; i <ARRAY_SIZE (class_device_attrs); i++) +class_device_create_file (console_class_device, + &class_device_attrs[i]); +return 0 ; +} +/* * Ok, now we can initialize the rest of the tty devices and can count * on memory allocations, interrupts etc..
@@ -3249,7 +3290,17 @@ static int __init tty_init(void) register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)panic ("Couldn't register /dev/console driver\n" );devfs_mk_cdev (MKDEV (TTYAUX_MAJOR ,1 ),S_IFCHR |S_IRUSR |S_IWUSR ,"console" ); -class_device_create (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,1 ),NULL ,"console" ); + console_class_device =class_device_create (tty_class,NULL , +MKDEV (TTYAUX_MAJOR ,1 ), +NULL ,"console" ); +if (IS_ERR (console_class_device)) { +printk (KERN_WARNING "Unable to create class device " +"for console; errno = %ldn" , +PTR_ERR (console_class_device)); + console_class_device =NULL ; + }else +console_init_class_device (); +#ifdef CONFIG_UNIX98_PTYS cdev_init (&ptmx_cdev, &ptmx_fops);
include/linux/tty.h +19 -0
@@ -347,6 +347,25 @@ extern void console_print(const char *);extern int vt_ioctl (struct tty_struct *tty,struct file * file,unsigned int cmd,unsigned long arg); +#ifdef CONFIG_VT +extern int vt_bind (int index); +extern int vt_unbind (int index); +extern int vt_show_drivers (char *buf); +#else +static inline int vt_bind (int index) +{ +return 0 ; +} +static inline int vt_unbind (int index) +{ +return 0 ; +} +static inline int vt_show_drivers (char *buf) +{ +return 0 ; +} +#endif +static inline dev_t tty_devnum (struct tty_struct *tty) {return MKDEV (tty->driver->major, tty->driver->minor_start) + tty->index;
Quoted 6 lines · Antonino A. Daplas
Add sysfs attributes for binding and unbinding VT console drivers. The attributes are located in
/sys/class/tty/consoleand are namely:A. backend - list registered drivers in the following format:
"I C: Description"
No, this violates the "one value per file" issue with sysfs. How do you know you will not overflow the buffer passed to you?
Quoted 12 lines
Where: I = ID number of the driver
C = status of the driver which can be:S = system driver
B = bound modular driver
U = unbound modular driverDescription - text description of the driver
B. bind - binds a driver to the console layer
Quoted 8 lines
echo <ID> >
/sys/class/tty/console/bindC. unbind - unbinds a driver from the console layer
echo <ID> >
/sys/class/tty/console/unbindThe tty layer does nothing to these attributes except create them and punt all requests to the VT layer.
Why is this needed? What is wrong with the current scheme of binding ttys to the console?
thanks,
greg k-h
Quoted 10 lines · Greg KH
Quoted 6 lines · Antonino A. Daplas
Add sysfs attributes for binding and unbinding VT console drivers. The attributes are located in
/sys/class/tty/consoleand are namely:A. backend - list registered drivers in the following format:
"I C: Description"
No, this violates the "one value per file" issue with sysfs. How do you know you will not overflow the buffer passed to you?
I was wondering about this. I just want a way to show what are the currently loaded drivers, so it's a read-only attribute. It's using snprintf (though I haven't added a check for possible overflows, should be a 2-liner). Maximum number of lines is 16, and there are examples of this rule-breakage in the current sysfs tree.
/sys/class/usb_host/usb_hostx/device/pools
Yes, none are valid excuses. Anyway, what would be the best way? I was considering creating another class for vt_console, but that would entail the creation of a new device major number just for this.
Quoted 16 lines
Quoted 16 lines
Where: I = ID number of the driver
C = status of the driver which can be:S = system driver
B = bound modular driver
U = unbound modular driverDescription - text description of the driver
B. bind - binds a driver to the console layer
echo <ID> >
/sys/class/tty/console/bindC. unbind - unbinds a driver from the console layer
Quoted 8 lines
Quoted 4 lines
echo <ID> >
/sys/class/tty/console/unbindThe tty layer does nothing to these attributes except create them and punt all requests to the VT layer.
Why is this needed? What is wrong with the current scheme of binding ttys to the console?
The binding part, maybe none, but that's still debatable. It's the unbinding feature that people are requesting. Note the longish threads on "the future of graphics subsystem". It would also ease the life of console driver developers, and it would stop people from pestering me on why they cannot unload their beloved framebuffer console and drivers and go back to VGA console.
Tony
Quoted 12 lines · Antonino A. Daplas
Quoted 10 lines · Greg KH
Quoted 6 lines · Antonino A. Daplas
Add sysfs attributes for binding and unbinding VT console drivers. The attributes are located in
/sys/class/tty/consoleand are namely:A. backend - list registered drivers in the following format:
"I C: Description"
No, this violates the "one value per file" issue with sysfs. How do you know you will not overflow the buffer passed to you?
Quoted 7 lines
I was wondering about this. I just want a way to show what are the currently loaded drivers, so it's a read-only attribute. It's using snprintf (though I haven't added a check for possible overflows, should be a 2-liner). Maximum number of lines is 16, and there are examples of this rule-breakage in the current sysfs tree.
/sys/class/usb_host/usb_hostx/device/pools
Ah, thanks for pointing this out. Those files should go to debugfs, they do NOT belong in sysfs at all.
Quoted 3 lines
Yes, none are valid excuses. Anyway, what would be the best way? I was considering creating another class for
vt_console, but that would entail the creation of a new device major number just for this.
No, you don't need a major to create a new class in sysfs at all. Look at usb_host for an example of that :)
And even if you did, we have loads of free major numbers now, it's not a big deal to get a new one.
I vote for this, it would make things much easier.
Quoted 24 lines
Quoted 15 lines
Quoted 15 lines
Where: I = ID number of the driver
C = status of the driver which can be:S = system driver
B = bound modular driver
U = unbound modular driverDescription - text description of the driver
B. bind - binds a driver to the console layer
echo <ID> >
/sys/class/tty/console/bindC. unbind - unbinds a driver from the console layer
Quoted 8 lines
Quoted 4 lines
echo <ID> >
/sys/class/tty/console/unbindThe tty layer does nothing to these attributes except create them and punt all requests to the VT layer.
Why is this needed? What is wrong with the current scheme of binding ttys to the console?
Quoted 5 lines
The binding part, maybe none, but that's still debatable. It's the unbinding feature that people are requesting. Note the longish threads on "the future of graphics subsystem". It would also ease the life of console driver developers, and it would stop people from pestering me on why they cannot unload their beloved framebuffer console and drivers and go back to VGA console.
Ok, I also read the 0/5 in this series which describes this in detail, sorry for not seeing that (hint, cc: everyone on the series that one too, so they get a bit of detail in the future.)
thanks,
greg k-h
Quoted 22 lines · Greg KH
Quoted 10 lines · Antonino A. Daplas
Quoted 9 lines · Greg KH
Quoted 6 lines · Antonino A. Daplas
Add sysfs attributes for binding and unbinding VT console drivers. The attributes are located in
/sys/class/tty/consoleand are namely:A. backend - list registered drivers in the following format:
"I C: Description"
No, this violates the "one value per file" issue with sysfs. How do you know you will not overflow the buffer passed to you?
Quoted 7 lines
I was wondering about this. I just want a way to show what are the currently loaded drivers, so it's a read-only attribute. It's using snprintf (though I haven't added a check for possible overflows, should be a 2-liner). Maximum number of lines is 16, and there are examples of this rule-breakage in the current sysfs tree.
/sys/class/usb_host/usb_hostx/device/poolsAh, thanks for pointing this out. Those files should go to debugfs, they do NOT belong in sysfs at all.
Quoted 6 lines
Quoted 3 lines
Yes, none are valid excuses. Anyway, what would be the best way? I was considering creating another class for
vt_console, but that would entail the creation of a new device major number just for this.No, you don't need a major to create a new class in sysfs at all. Look at
usb_hostfor an example of that :)
Aha, I see it now. Yes, this is exactly what I need. Thanks for the tip.
Quoted 4 lines
Ok, I also read the 0/5 in this series which describes this in detail, sorry for not seeing that (hint, cc: everyone on the series that one too, so they get a bit of detail in the future.)
Sorry about that, slipped my mind.
Tony