#
fd3d6217 |
|
25-Aug-2018 |
Mike Voydanoff <voydanoff@google.com> |
[platform-bus][aml-canvas] Add support for proxying SOC-specific protocols This change adds support to the platform bus driver for proxying SOC-specific protocols to platform devices without modifying the platform bus source code. It also removes support for the Amlogic canvas protocol from the platform bus driver and uses this new proxying support instead. The Amlogic canvas driver is now split into two drivers: the canvas implementation driver and the canvas proxy driver. The implementation driver runs in the platform bus devhost and implements the main functionality of the driver. The proxy driver runs in the devhosts of the drivers that are clients of the canvas protocol and is responsible for proxying the canvas protocol to the implementation driver. To make this work we add a new protocol ZX_PROTOCOL_PLATFORM_PROXY and add new support to ZX_PROTOCOL_PLATFORM_BUS. In ZX_PROTOCOL_PLATFORM_BUS, the pbus_register_protocol() API now adds an optional callback of type platform_proxy_cb_t. This callback handles RPCs from a protocol proxy driver. The new protocol ZX_PROTOCOL_PLATFORM_PROXY is used for protocol proxy drivers to communicate with the platform bus in the client devhosts. When the proxy driver loads, it calls platform_proxy_register_protocol() to register its protocol implementation with the platform bus proxy driver. When the client driver calls a protocol API implemented by the proxy driver, the proxy driver calls platform_proxy_proxy() to proxy the protocol to the implementation driver in the platform device devhost, via the channel that connects the two devhosts. Support for proxying the Amlogic canvas protocol is now removed from the platform bus driver, since we are using this new mechanism instead. Within the platform bus driver, we add a new class ProxyClient. This is a subclass of ddk::Device that is used for binding the protocol proxy drivers. In the case where a platform device relies on SOC-specific protocols implemented using this new mechanism, the platform bus proxy driver creates a PlatformProxyClient for each of the protocols and waits for them all to register their protocols via the ZX_PROTOCOL_PLATFORM_PROXY protocol before creating the ProxyDevice object to bind the platform device driver. Below illustrates the parts of the device tree is changed by this CL: BEFORE: [04:02:1] pid=1785 /boot/driver/platform-bus.so <04:02:1> pid=2881 /boot/driver/platform-bus.proxy.so [vim2-display] pid=2881 /boot/driver/vim-display.so [display-controller] pid=2881 /boot/driver/display.so AFTER: [04:02:1] pid=1850 /boot/driver/platform-bus.so <04:02:1> pid=3024 /boot/driver/platform-bus.proxy.so [ProxyClient[7043414e]] pid=3024 /boot/driver/platform-bus.proxy.so [aml-canvas-proxy] pid=3024 /boot/driver/aml-canvas.proxy.so [ProxyDevice] pid=3024 /boot/driver/platform-bus.proxy.so [vim2-display] pid=3024 /boot/driver/vim-display.so [display-controller] pid=3024 /boot/driver/display.so In the AFTER subtree, the platform proxy driver inserts a new root device that has both the aml-canvas and vim2-display drivers as children. TEST: manual testing on VIM2 and astro Change-Id: Ibfa925948491fb3793dd934ee5737ace7903edb9
|
#
0d71f953 |
|
21-Aug-2018 |
Mike Voydanoff <voydanoff@google.com> |
[dev][platform-bus] Clean-up and simplify platform bus protocol: - Remove "flags" parameter from pbus_device_add(). Now platform devices can only be started in new devhosts. - Add new API pbus_protocol_device_add(), for binding drivers that implement platform bus protocols like GPIO and I2C_IMPL. pbus_protocol_device_add() is equivalent to pbus_device_add(PDEV_ADD_PBUS_DEVHOST) followed by pbus_wait_protocol(). - Remove pbus_wait_protocol(). pbus_protocol_device_add() does the wait for you automatically. - Rename pbus_set_protocol() to pbus_register_protocol() These changes will hopefully make the platform bus protocol easier to understand and use. I found two places where people accidentally using PDEV_ADD_PBUS_DEVHOST inappropriately (probably copy & paste errors), which resulted in the entire network stack and storage stack running in the platform bus devhost. Hopefully this change will make it impossible for mistakes like that to happen again. While doing this I also noticed that the gauss nand driver and vim2 ethernet driver were running in the platform bus devhost. This change fixes that. Also removed some remnants of the pbus_device_enable() API, which has been removed previously. TEST: boot up on qemu, VIM2, gauss and astro and verified platform devices all start up properly Change-Id: I580269bc6f53a63348ba8ab580259b1ba56dd393
|