Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp5965304ybv; Tue, 18 Feb 2020 07:19:02 -0800 (PST) X-Google-Smtp-Source: APXvYqyTsBsE4Pw+FZzcEqT+FMEGi9Sf60ls9nMGBxcRaqlp/Jp3yCtQRcjkGKdk9sMiWeJhFtng X-Received: by 2002:a05:6830:1e86:: with SMTP id n6mr16308088otr.321.1582039142548; Tue, 18 Feb 2020 07:19:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582039142; cv=none; d=google.com; s=arc-20160816; b=hMG8aVgKHt4rug+N1YIytcOCdtItfzgEzTe3oOT5LXpRu+gQpY/f4SjUwTb+t+AEHN EUjADZBoW2IH5ZZW3lW97eDgpd/fRZTqc70Vs7OZsbYTSahqvxmLn0QuemO45qm1frub MKV17aZphzAypgJt+gdJ6rUbF16XmQUi9Y9WSF9be4Or7jC6D19p3yjetUEP1b9nzt2c 0x/rRHsMgK02CLZm5g8VvzwxEihDbA+BPHBGtt/Yl9VsOo8TcxDCFsIREBzKuLO6AaVZ dED598ltn0Li07eTzNQU2rIl/YK2NK87ONfsEgLrKgb8ARCHDT+C7xn8pRj2D0O5tr5i 3eoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=wx+cL5OzSMNi+U8mF/WBqDarqS3TGMwUqhW7Hou4rlo=; b=XJZvlLTFUlyAEV3/Hsfs18Ut5uYoTonrLETNm4d+zjUJodnWpENGh3qiWgpQNTqa0y 6J/HdCqkQg+/mPvXWNfA94ncDBvxCxiiZF9Qsp3ky2z+3zvYFIY37dSjrSncUIzU08yX 1NUbRqpKZy64flTZduYVNmo7QRZ4S7c+X6y9c+yABTHHb2zj/1hSrYZ169VChI8fsxs+ 6yj3lW2E0PKBny2AZOm7Y/AESo83w7h3vqN277Un9DaFPVSz7esPnPN2lhhlVlsrq1Jl JkJetVjZXROBDbOt3qXErj/gi/KZNmlI+yLsSbPVsBxhbZbzPSwlJpkq+xj9bKEj6jgh JVTA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z15si7452480oih.41.2020.02.18.07.18.50; Tue, 18 Feb 2020 07:19:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727405AbgBRPSi (ORCPT + 99 others); Tue, 18 Feb 2020 10:18:38 -0500 Received: from laurent.telenet-ops.be ([195.130.137.89]:39534 "EHLO laurent.telenet-ops.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727295AbgBRPSf (ORCPT ); Tue, 18 Feb 2020 10:18:35 -0500 Received: from ramsan ([84.195.182.253]) by laurent.telenet-ops.be with bizsmtp id 4FJD2200y5USYZQ01FJEv4; Tue, 18 Feb 2020 16:18:34 +0100 Received: from rox.of.borg ([192.168.97.57]) by ramsan with esmtp (Exim 4.90_1) (envelope-from ) id 1j44dZ-0006yA-Pa; Tue, 18 Feb 2020 16:18:13 +0100 Received: from geert by rox.of.borg with local (Exim 4.90_1) (envelope-from ) id 1j44dZ-00022u-MX; Tue, 18 Feb 2020 16:18:13 +0100 From: Geert Uytterhoeven To: Linus Walleij , Bartosz Golaszewski , Jonathan Corbet , Harish Jenny K N , Eugeniu Rosca Cc: Alexander Graf , Peter Maydell , Paolo Bonzini , Phil Reid , Marc Zyngier , Christoffer Dall , Magnus Damm , Rob Herring , Mark Rutland , linux-gpio@vger.kernel.org, linux-doc@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, qemu-devel@nongnu.org, Geert Uytterhoeven Subject: [PATCH v5 0/5] gpio: Add GPIO Aggregator Date: Tue, 18 Feb 2020 16:18:07 +0100 Message-Id: <20200218151812.7816-1-geert+renesas@glider.be> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi all, 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 this adds a GPIO driver to aggregate existing GPIOs, 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, this simplifies and hardens exporting GPIOs to a virtual machine, as the VM can just grab the full GPIO controller, and no longer needs to care about which GPIOs to grab and which not, reducing the attack surface. Recently, other use cases have been discovered[1]: - Describing simple GPIO-operated devices in DT, and using the GPIO Aggregator as a generic GPIO driver for userspace, which is useful for industrial control. Changes compared to v4[2]: - Add Reviewed-by, Tested-by, - Fix inconsistent indentation in documentation. Changes compared to v3[3] (more details in the individual patches): - Drop controversial GPIO repeater, - Drop support for legacy sysfs interface based name matching, - Drop applied "gpiolib: Add GPIOCHIP_NAME definition", - Documentation improvements, - Lots of small cleanups. Changes compared to v2[4] (more details in the individual patches): - Integrate GPIO Repeater functionality, - Absorb GPIO forwarder library, as the Aggregator and Repeater are now a single driver, - Use the aggregator parameters to create a GPIO lookup table instead of an array of GPIO descriptors, - Add documentation, - New patches: - "gpiolib: Add GPIOCHIP_NAME definition", - "gpiolib: Add support for gpiochipN-based table lookup", - "gpiolib: Add support for GPIO line table lookup", - "dt-bindings: gpio: Add gpio-repeater bindings", - "docs: gpio: Add GPIO Aggregator/Repeater documentation", - "MAINTAINERS: Add GPIO Aggregator/Repeater section". - Dropped patches: - "gpio: Export gpiod_{request,free}() to modular GPIO code", - "gpio: Export gpiochip_get_desc() to modular GPIO code", - "gpio: Export gpio_name_to_desc() to modular GPIO code", - "gpio: Add GPIO Forwarder Helper". Changes compared to v1[5]: - Drop "virtual", rename to gpio-aggregator, - Create and use new GPIO Forwarder Helper, to allow sharing code with the GPIO inverter, - Lift limit on the maximum number of GPIOs, - Improve parsing of GPIO specifiers, - Fix modular build. Aggregating GPIOs and exposing them as a new gpiochip was suggested in response to my proof-of-concept for GPIO virtualization with QEMU[6][7]. For the first use case, aggregated GPIO controllers are instantiated and destroyed by writing to atribute files in sysfs. Sample session on the Renesas Koelsch development board: - Unbind LEDs from leds-gpio driver: echo leds > /sys/bus/platform/drivers/leds-gpio/unbind - Create aggregators: $ echo e6052000.gpio 19,20 \ > /sys/bus/platform/drivers/gpio-aggregator/new_device gpio-aggregator gpio-aggregator.0: gpio 0 => gpio-953 (gpio-aggregator.0) gpio-aggregator gpio-aggregator.0: gpio 1 => gpio-954 (gpio-aggregator.0) gpiochip_find_base: found new base at 778 gpio gpiochip8: (gpio-aggregator.0): added GPIO chardev (254:8) gpiochip_setup_dev: registered GPIOs 778 to 779 on device: gpiochip8 (gpio-aggregator.0) $ echo e6052000.gpio 21 e6050000.gpio 20-22 \ > /sys/bus/platform/drivers/gpio-aggregator/new_device gpio-aggregator gpio-aggregator.1: gpio 0 => gpio-955 (gpio-aggregator.1) gpio-aggregator gpio-aggregator.1: gpio 1 => gpio-1012 (gpio-aggregator.1) gpio-aggregator gpio-aggregator.1: gpio 2 => gpio-1013 (gpio-aggregator.1) gpio-aggregator gpio-aggregator.1: gpio 3 => gpio-1014 (gpio-aggregator.1) gpiochip_find_base: found new base at 774 gpio gpiochip9: (gpio-aggregator.1): added GPIO chardev (254:9) gpiochip_setup_dev: registered GPIOs 774 to 777 on device: gpiochip9 (gpio-aggregator.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 aggregators: $ echo gpio-aggregator.0 \ > /sys/bus/platform/drivers/gpio-aggregator/delete_device $ echo gpio-aggregator.1 \ > /sys/bus/platform/drivers/gpio-aggregator/delete_device Thanks! References: [1] "[PATCH V4 2/2] gpio: inverter: document the inverter bindings" (https://lore.kernel.org/r/1561699236-18620-3-git-send-email-harish_kandiga@mentor.com/) [2] "[PATCH v4 0/5] gpio: Add GPIO Aggregator" (https://lore.kernel.org/r/20200115181523.23556-1-geert+renesas@glider.be) [3] "[PATCH v3 0/7] gpio: Add GPIO Aggregator/Repeater" (https://lore.kernel.org/r/20191127084253.16356-1-geert+renesas@glider.be/) [4] "[PATCH/RFC v2 0/5] gpio: Add GPIO Aggregator Driver" (https://lore.kernel.org/r/20190911143858.13024-1-geert+renesas@glider.be/) [5] "[PATCH RFC] gpio: Add Virtual Aggregator GPIO Driver" (https://lore.kernel.org/r/20190705160536.12047-1-geert+renesas@glider.be/) [6] "[PATCH QEMU POC] Add a GPIO backend" (https://lore.kernel.org/r/20181003152521.23144-1-geert+renesas@glider.be/) [7] "Getting To Blinky: Virt Edition / Making device pass-through work on embedded ARM" (https://fosdem.org/2019/schedule/event/vai_getting_to_blinky/) Geert Uytterhoeven (5): gpiolib: Add support for gpiochipN-based table lookup gpiolib: Add support for GPIO line table lookup gpio: Add GPIO Aggregator docs: gpio: Add GPIO Aggregator documentation MAINTAINERS: Add GPIO Aggregator section .../admin-guide/gpio/gpio-aggregator.rst | 102 ++++ Documentation/admin-guide/gpio/index.rst | 1 + MAINTAINERS | 7 + drivers/gpio/Kconfig | 12 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio-aggregator.c | 574 ++++++++++++++++++ drivers/gpio/gpiolib.c | 33 +- include/linux/gpio/machine.h | 15 +- 8 files changed, 732 insertions(+), 13 deletions(-) create mode 100644 Documentation/admin-guide/gpio/gpio-aggregator.rst create mode 100644 drivers/gpio/gpio-aggregator.c -- 2.17.1 Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org 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