Hi Linus, On Thu, Sep 12, 2019 at 10:56 AM Linus Walleij <linus.walleij@xxxxxxxxxx> wrote: > On Fri, Jul 5, 2019 at 5:05 PM Geert Uytterhoeven > <geert+renesas@xxxxxxxxx> wrote: > > GPIO controllers are exported to userspace using /dev/gpiochip* > > character devices. Access control to these devices is provided by > > standard UNIX file system permissions, on an all-or-nothing basis: > > either a GPIO controller is accessible for a user, or it is not. > > Currently no mechanism exists to control access to individual GPIOs. > > > > Hence add a virtual GPIO driver to aggregate existing GPIOs (up to 32), > > and expose them as a new gpiochip. This is useful for implementing > > access control, and assigning a set of GPIOs to a specific user. > > Furthermore, it would simplify and harden exporting GPIOs to a virtual > > machine, as the VM can just grab the full virtual GPIO controller, and > > no longer needs to care about which GPIOs to grab and which not, > > reducing the attack surface. > > > > Virtual GPIO controllers are instantiated by writing to the "new_device" > > attribute file in sysfs: > > > > $ echo "<gpiochipA> <gpioA1> [<gpioA2> ...]" > > "[, <gpiochipB> <gpioB1> [<gpioB2> ...]] ...]" > > > /sys/bus/platform/drivers/gpio-virt-agg/new_device > > > > Likewise, virtual GPIO controllers can be destroyed after use: > > > > $ echo gpio-virt-agg.<N> \ > > > /sys/bus/platform/drivers/gpio-virt-agg/delete_device > > > > Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> > > --- > > Aggregating GPIOs and exposing them as a new gpiochip was suggested in > > response to my proof-of-concept for GPIO virtualization with QEMU[1][2]. > > > > Sample session on r8a7791/koelsch: > > > > - Disable the leds node in arch/arm/boot/dts/r8a7791-koelsch.dts > > > > - Create virtual aggregators: > > > > $ echo "e6052000.gpio 19 20" \ > > > /sys/bus/platform/drivers/gpio-virt-agg/new_device > > > > gpio-virt-agg gpio-virt-agg.0: GPIO 0 => e6052000.gpio/19 > > gpio-virt-agg gpio-virt-agg.0: GPIO 1 => e6052000.gpio/20 > > gpiochip_find_base: found new base at 778 > > gpio gpiochip8: (gpio-virt-agg.0): added GPIO chardev (254:8) > > gpiochip_setup_dev: registered GPIOs 778 to 779 on device: gpiochip8 (gpio-virt-agg.0) > > > > $ echo "e6052000.gpio 21, e6050000.gpio 20 21 22" \ > > > /sys/bus/platform/drivers/gpio-virt-agg/new_device > > > > gpio-virt-agg gpio-virt-agg.1: GPIO 0 => e6052000.gpio/21 > > gpio-virt-agg gpio-virt-agg.1: GPIO 1 => e6050000.gpio/20 > > gpio-virt-agg gpio-virt-agg.1: GPIO 2 => e6050000.gpio/21 > > gpio-virt-agg gpio-virt-agg.1: GPIO 3 => e6050000.gpio/22 > > gpiochip_find_base: found new base at 774 > > gpio gpiochip9: (gpio-virt-agg.1): added GPIO chardev (254:9) > > gpiochip_setup_dev: registered GPIOs 774 to 777 on device: gpiochip9 (gpio-virt-agg.1) > > > > - Adjust permissions on /dev/gpiochip[89] (optional) > > > > - Control LEDs: > > > > $ gpioset gpiochip8 0=0 1=1 # LED6 OFF, LED7 ON > > $ gpioset gpiochip8 0=1 1=0 # LED6 ON, LED7 OFF > > $ gpioset gpiochip9 0=0 # LED8 OFF > > $ gpioset gpiochip9 0=1 # LED8 ON > > > > - Destroy virtual aggregators: > > > > $ echo gpio-virt-agg.0 \ > > > /sys/bus/platform/drivers/gpio-virt-agg/delete_device > > $ echo gpio-virt-agg.1 \ > > > /sys/bus/platform/drivers/gpio-virt-agg/delete_device > > > > Thanks for your comments! > > > > References: > > - [1] "[PATCH QEMU POC] Add a GPIO backend" > > (https://lore.kernel.org/linux-renesas-soc/20181003152521.23144-1-geert+renesas@xxxxxxxxx/) > > - [2] "Getting To Blinky: Virt Edition / Making device pass-through > > work on embedded ARM" > > (https://fosdem.org/2019/schedule/event/vai_getting_to_blinky/) > > I'm looping in my friends at Google for this discussion. > > They need a virtualized gpio_chip for their Android emulator, > and their current approach for other devices has been around > using virtio in most cases and an emulated AC97 for the > audio case as far as I remember. > > It would be great to have their input on this so we can create a > virtualization/aggregate that works for all. > > Please include adelva@xxxxxxxxxx on future postings of this! I've sent v2 yesterday: https://lore.kernel.org/lkml/20190911143858.13024-1-geert+renesas@xxxxxxxxx/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds