[dev][platform-bus] Move proxying of Sysmem and Amlogic Canvas protocols to platform bus

First step in transitioning platform bus to use composite device support.

Bug: ZX-3746

TEST: astro boots into full UI.

Change-Id: I66f0a3f55a02f97cbd8ba1b90006f8b5f6ef7c95
diff --git a/zircon/system/dev/bus/platform/BUILD.gn b/zircon/system/dev/bus/platform/BUILD.gn
index 3a66cb2..d1d343c 100644
--- a/zircon/system/dev/bus/platform/BUILD.gn
+++ b/zircon/system/dev/bus/platform/BUILD.gn
@@ -19,6 +19,7 @@
     "platform-protocol-device.cpp",
   ]
   deps = [
+    "$zx/system/banjo/ddk-protocol-amlogiccanvas",
     "$zx/system/banjo/ddk-protocol-clock",
     "$zx/system/banjo/ddk-protocol-gpio",
     "$zx/system/banjo/ddk-protocol-gpioimpl",
@@ -29,6 +30,7 @@
     "$zx/system/banjo/ddk-protocol-platform-device",
     "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/banjo/ddk-protocol-powerimpl",
+    "$zx/system/banjo/ddk-protocol-sysmem",
     "$zx/system/fidl/fuchsia-sysinfo:c",
     "$zx/system/ulib/ddk",
     "$zx/system/ulib/ddktl",
@@ -47,6 +49,7 @@
     "platform-proxy.cpp",
   ]
   deps = [
+    "$zx/system/banjo/ddk-protocol-amlogiccanvas",
     "$zx/system/banjo/ddk-protocol-clock",
     "$zx/system/banjo/ddk-protocol-gpio",
     "$zx/system/banjo/ddk-protocol-gpioimpl",
@@ -56,6 +59,7 @@
     "$zx/system/banjo/ddk-protocol-platform-device",
     "$zx/system/banjo/ddk-protocol-platform-proxy",
     "$zx/system/banjo/ddk-protocol-powerimpl",
+    "$zx/system/banjo/ddk-protocol-sysmem",
     "$zx/system/ulib/ddk",
     "$zx/system/ulib/ddktl",
     "$zx/system/ulib/fbl",
diff --git a/zircon/system/dev/bus/platform/device-resources.cpp b/zircon/system/dev/bus/platform/device-resources.cpp
index ad48408..30379f25 100644
--- a/zircon/system/dev/bus/platform/device-resources.cpp
+++ b/zircon/system/dev/bus/platform/device-resources.cpp
@@ -39,8 +39,11 @@
         !CopyResources(pdev->bti_count, pdev->bti_list, &btis_) ||
         !CopyResources(pdev->smc_count, pdev->smc_list, &smcs_) ||
         !CopyResources(pdev->metadata_count, pdev->metadata_list, &metadata_) ||
-        !CopyResources(pdev->boot_metadata_count, pdev->boot_metadata_list, &boot_metadata_) ||
-        !CopyResources(pdev->protocol_count, pdev->protocol_list, &protocols_)) {
+        !CopyResources(pdev->boot_metadata_count, pdev->boot_metadata_list, &boot_metadata_)
+/* Ignore protocol_list for now. We will remove this completely in the next pass.
+         || !CopyResources(pdev->protocol_count, pdev->protocol_list, &protocols_)
+*/
+        ) {
         return ZX_ERR_NO_MEMORY;
     }
 
diff --git a/zircon/system/dev/bus/platform/platform-bus.cpp b/zircon/system/dev/bus/platform/platform-bus.cpp
index 5e418f4..417f4d4 100644
--- a/zircon/system/dev/bus/platform/platform-bus.cpp
+++ b/zircon/system/dev/bus/platform/platform-bus.cpp
@@ -107,6 +107,21 @@
         iommu_ = ddk::IommuProtocolClient(static_cast<const iommu_protocol_t*>(protocol));
         break;
     }
+    case ZX_PROTOCOL_SYSMEM: {
+        if (proxy_cb->callback != nullptr) {
+            return ZX_ERR_INVALID_ARGS;
+        }
+        sysmem_ = ddk::SysmemProtocolClient(static_cast<const sysmem_protocol_t*>(protocol));
+        break;
+    }
+    case ZX_PROTOCOL_AMLOGIC_CANVAS: {
+        if (proxy_cb->callback != nullptr) {
+            return ZX_ERR_INVALID_ARGS;
+        }
+        canvas_ = ddk::AmlogicCanvasProtocolClient(
+                                        static_cast<const amlogic_canvas_protocol_t*>(protocol));
+        break;
+    }
     default: {
         if (proxy_cb->callback == nullptr) {
             return ZX_ERR_NOT_SUPPORTED;
@@ -253,6 +268,18 @@
             return ZX_OK;
         }
         break;
+    case ZX_PROTOCOL_SYSMEM:
+        if (sysmem_) {
+            sysmem_->GetProto(static_cast<sysmem_protocol_t*>(out));
+            return ZX_OK;
+        }
+        break;
+    case ZX_PROTOCOL_AMLOGIC_CANVAS:
+        if (canvas_) {
+            canvas_->GetProto(static_cast<amlogic_canvas_protocol_t*>(out));
+            return ZX_OK;
+        }
+        break;
     case ZX_PROTOCOL_IOMMU:
         if (iommu_) {
             iommu_->GetProto(static_cast<iommu_protocol_t*>(out));
diff --git a/zircon/system/dev/bus/platform/platform-bus.h b/zircon/system/dev/bus/platform/platform-bus.h
index a450a87..c7ee308 100644
--- a/zircon/system/dev/bus/platform/platform-bus.h
+++ b/zircon/system/dev/bus/platform/platform-bus.h
@@ -6,12 +6,14 @@
 
 #include <ddk/device.h>
 #include <ddktl/device.h>
+#include <ddktl/protocol/amlogiccanvas.h>
 #include <ddktl/protocol/clock.h>
 #include <ddktl/protocol/gpioimpl.h>
 #include <ddktl/protocol/powerimpl.h>
 #include <ddktl/protocol/i2cimpl.h>
 #include <ddktl/protocol/iommu.h>
 #include <ddktl/protocol/platform/bus.h>
+#include <ddktl/protocol/sysmem.h>
 #include <fbl/array.h>
 #include <fbl/intrusive_wavl_tree.h>
 #include <fbl/mutex.h>
@@ -80,10 +82,12 @@
                                uint32_t* out_size);
 
     // Protocol accessors for PlatformDevice.
+    inline ddk::AmlogicCanvasProtocolClient* canvas() { return &*canvas_; }
     inline ddk::ClockProtocolClient* clk() { return &*clk_; }
     inline ddk::GpioImplProtocolClient* gpio() { return &*gpio_; }
     inline ddk::I2cImplProtocolClient* i2c() { return &*i2c_; }
     inline ddk::PowerImplProtocolClient* power() { return &*power_; }
+    inline ddk::SysmemProtocolClient* sysmem() { return &*sysmem_; }
 
     pbus_sys_suspend_t suspend_cb() { return suspend_cb_; }
 
@@ -134,11 +138,13 @@
     pdev_board_info_t board_info_;
 
     // Protocols that are optionally provided by the board driver.
+    std::optional<ddk::AmlogicCanvasProtocolClient> canvas_;
     std::optional<ddk::ClockProtocolClient> clk_;
     std::optional<ddk::GpioImplProtocolClient> gpio_;
     std::optional<ddk::IommuProtocolClient> iommu_;
     std::optional<ddk::I2cImplProtocolClient> i2c_;
     std::optional<ddk::PowerImplProtocolClient> power_;
+    std::optional<ddk::SysmemProtocolClient> sysmem_;
 
     // Completion used by WaitProtocol().
     sync_completion_t proto_completion_ __TA_GUARDED(proto_completion_mutex_);
diff --git a/zircon/system/dev/bus/platform/platform-device.cpp b/zircon/system/dev/bus/platform/platform-device.cpp
index cd11f59..d20c63c 100644
--- a/zircon/system/dev/bus/platform/platform-device.cpp
+++ b/zircon/system/dev/bus/platform/platform-device.cpp
@@ -431,6 +431,30 @@
     return bus_->power()->GetPowerDomainStatus(dr->power_domain(index).power_domain, status);
 }
 
+zx_status_t PlatformDevice::RpcSysmemConnect(zx::channel allocator2_request) {
+    if (bus_->sysmem() == nullptr) {
+        return ZX_ERR_NOT_SUPPORTED;
+    }
+    return bus_->sysmem()->Connect(std::move(allocator2_request));
+}
+
+zx_status_t PlatformDevice::RpcCanvasConfig(zx::vmo vmo, size_t offset, const canvas_info_t* info,
+                                            uint8_t* out_canvas_idx) {
+    if (bus_->canvas() == nullptr) {
+        return ZX_ERR_NOT_SUPPORTED;
+    }
+
+    return bus_->canvas()->Config(std::move(vmo), offset, info, out_canvas_idx);
+}
+
+zx_status_t PlatformDevice::RpcCanvasFree(uint8_t canvas_index) {
+    if (bus_->canvas() == nullptr) {
+        return ZX_ERR_NOT_SUPPORTED;
+    }
+
+    return bus_->canvas()->Free(canvas_index);
+}
+
 zx_status_t PlatformDevice::DdkRxrpc(zx_handle_t channel) {
     if (channel == ZX_HANDLE_INVALID) {
         // proxy device has connected
@@ -467,7 +491,7 @@
     case ZX_PROTOCOL_PDEV: {
         auto req = reinterpret_cast<rpc_pdev_req_t*>(&req_buf);
         if (actual < sizeof(*req)) {
-            zxlogf(ERROR, "%s received %u, expecting %zu\n", __FUNCTION__, actual, sizeof(*req));
+            zxlogf(ERROR, "%s received %u, expecting %zu\n", __func__, actual, sizeof(*req));
             return ZX_ERR_INTERNAL;
         }
         auto resp = reinterpret_cast<rpc_pdev_rsp_t*>(&resp_buf);
@@ -521,7 +545,7 @@
     case ZX_PROTOCOL_GPIO: {
         auto req = reinterpret_cast<rpc_gpio_req_t*>(&req_buf);
         if (actual < sizeof(*req)) {
-            zxlogf(ERROR, "%s received %u, expecting %zu\n", __FUNCTION__, actual, sizeof(*req));
+            zxlogf(ERROR, "%s received %u, expecting %zu\n", __func__, actual, sizeof(*req));
             return ZX_ERR_INTERNAL;
         }
         auto resp = reinterpret_cast<rpc_gpio_rsp_t*>(&resp_buf);
@@ -587,7 +611,7 @@
     case ZX_PROTOCOL_I2C: {
         auto req = reinterpret_cast<rpc_i2c_req_t*>(&req_buf);
         if (actual < sizeof(*req)) {
-            zxlogf(ERROR, "%s received %u, expecting %zu\n", __FUNCTION__, actual, sizeof(*req));
+            zxlogf(ERROR, "%s received %u, expecting %zu\n", __func__, actual, sizeof(*req));
             return ZX_ERR_INTERNAL;
         }
         auto resp = reinterpret_cast<rpc_i2c_rsp_t*>(&resp_buf);
@@ -615,7 +639,7 @@
     case ZX_PROTOCOL_CLOCK: {
         auto req = reinterpret_cast<rpc_clk_req_t*>(&req_buf);
         if (actual < sizeof(*req)) {
-            zxlogf(ERROR, "%s received %u, expecting %zu\n", __FUNCTION__, actual, sizeof(*req));
+            zxlogf(ERROR, "%s received %u, expecting %zu\n", __func__, actual, sizeof(*req));
             return ZX_ERR_INTERNAL;
         }
         resp_len = sizeof(*resp_header);
@@ -633,6 +657,54 @@
         }
         break;
     }
+    case ZX_PROTOCOL_SYSMEM: {
+        auto req = reinterpret_cast<platform_proxy_req_t*>(&req_buf);
+        if (actual < sizeof(*req)) {
+            zxlogf(ERROR, "%s received %u, expecting %zu\n", __func__, actual, sizeof(*req));
+            return ZX_ERR_INTERNAL;
+        }
+        if (req_handle_count != 1) {
+            zxlogf(ERROR, "%s received %u handles, expecting 1\n", __func__, req_handle_count);
+            return ZX_ERR_INTERNAL;
+        }
+        resp_len = sizeof(*resp_header);
+
+        switch (req_header->op) {
+        case SYSMEM_CONNECT:
+            status = RpcSysmemConnect(zx::channel(req_handles[0]));
+            break;
+        default:
+            zxlogf(ERROR, "%s: unknown clk op %u\n", __func__, req_header->op);
+            return ZX_ERR_INTERNAL;
+        }
+        break;
+    }
+    case ZX_PROTOCOL_AMLOGIC_CANVAS: {
+        auto req = reinterpret_cast<rpc_amlogic_canvas_req_t*>(&req_buf);
+        if (actual < sizeof(*req)) {
+            zxlogf(ERROR, "%s received %u, expecting %zu\n", __func__, actual, sizeof(*req));
+            return ZX_ERR_INTERNAL;
+        }
+        if (req_handle_count != 1) {
+            zxlogf(ERROR, "%s received %u handles, expecting 1\n", __func__, req_handle_count);
+            return ZX_ERR_INTERNAL;
+        }
+        auto resp = reinterpret_cast<rpc_amlogic_canvas_rsp_t*>(&resp_buf);
+        resp_len = sizeof(*resp);
+
+        switch (req_header->op) {
+        case AMLOGIC_CANVAS_CONFIG:
+            status = RpcCanvasConfig(zx::vmo(req_handles[0]), req->offset, &req->info, &resp->canvas_idx);
+            break;
+        case AMLOGIC_CANVAS_FREE:
+            status = RpcCanvasFree(req->canvas_idx);
+            break;
+        default:
+            zxlogf(ERROR, "%s: unknown clk op %u\n", __func__, req_header->op);
+            return ZX_ERR_INTERNAL;
+        }
+        break;
+    }
     default: {
         size_t resp_actual = 0;
         size_t resp_handle_actual = 0;
diff --git a/zircon/system/dev/bus/platform/platform-device.h b/zircon/system/dev/bus/platform/platform-device.h
index 48e9915..89f2942 100644
--- a/zircon/system/dev/bus/platform/platform-device.h
+++ b/zircon/system/dev/bus/platform/platform-device.h
@@ -7,6 +7,7 @@
 #include <ddktl/device.h>
 #include <fbl/unique_ptr.h>
 #include <fbl/vector.h>
+#include <lib/zx/channel.h>
 
 #include "device-resources.h"
 #include "proxy-protocol.h"
@@ -87,6 +88,10 @@
                                          size_t* out_size);
     zx_status_t RpcClockEnable(const DeviceResources* dr, uint32_t index);
     zx_status_t RpcClockDisable(const DeviceResources* dr, uint32_t index);
+    zx_status_t RpcSysmemConnect(zx::channel allocator2_request);
+    zx_status_t RpcCanvasConfig(zx::vmo vmo, size_t offset, const canvas_info_t* info,
+                                uint8_t* out_canvas_idx);
+    zx_status_t RpcCanvasFree(uint8_t canvas_index);
 
     zx_status_t RpcPowerDomainEnable(const DeviceResources* dr, uint32_t index);
     zx_status_t RpcPowerDomainDisable(const DeviceResources* dr, uint32_t index);
diff --git a/zircon/system/dev/bus/platform/platform-proxy-device.cpp b/zircon/system/dev/bus/platform/platform-proxy-device.cpp
index f48d50b..0fb12c2 100644
--- a/zircon/system/dev/bus/platform/platform-proxy-device.cpp
+++ b/zircon/system/dev/bus/platform/platform-proxy-device.cpp
@@ -287,6 +287,47 @@
     return status;
 }
 
+zx_status_t ProxySysmem::SysmemConnect(zx::channel allocator2_request) {
+    platform_proxy_req_t req = {};
+    platform_proxy_rsp_t resp = {};
+    req.proto_id = ZX_PROTOCOL_SYSMEM;
+    req.op = SYSMEM_CONNECT;
+    zx_handle_t handle = allocator2_request.release();
+
+    return proxy_->Rpc(device_id_, &req, sizeof(req), &resp, sizeof(resp), &handle, 1, nullptr, 0,
+                       nullptr);
+}
+
+zx_status_t ProxyAmlogicCanvas::AmlogicCanvasConfig(zx::vmo vmo, size_t offset,
+                                                    const canvas_info_t* info,
+                                                    uint8_t* out_canvas_idx) {
+    rpc_amlogic_canvas_req_t req = {};
+    rpc_amlogic_canvas_rsp_t resp = {};
+    req.header.proto_id = ZX_PROTOCOL_AMLOGIC_CANVAS;
+    req.header.op = AMLOGIC_CANVAS_CONFIG;
+    req.offset = offset;
+    req.info = *info;
+    zx_handle_t handle = vmo.release();
+
+    auto status = proxy_->Rpc(device_id_, &req.header, sizeof(req), &resp.header, sizeof(resp),
+                              &handle, 1, nullptr, 0, nullptr);
+    if (status != ZX_OK) {
+        return status;
+    }
+    *out_canvas_idx = resp.canvas_idx;
+    return ZX_OK;
+}
+
+zx_status_t ProxyAmlogicCanvas::AmlogicCanvasFree(uint8_t canvas_idx) {
+    rpc_amlogic_canvas_req_t req = {};
+    rpc_amlogic_canvas_rsp_t resp = {};
+    req.header.proto_id = ZX_PROTOCOL_AMLOGIC_CANVAS;
+    req.header.op = AMLOGIC_CANVAS_FREE;
+    req.canvas_idx = canvas_idx;
+
+    return proxy_->Rpc(device_id_, &req.header, sizeof(req), &resp.header, sizeof(resp));
+}
+
 zx_status_t ProxyDevice::PDevGetMmio(uint32_t index, pdev_mmio_t* out_mmio) {
     if (index >= mmios_.size()) {
         return ZX_ERR_OUT_OF_RANGE;
@@ -703,6 +744,16 @@
         clk_.GetProtocol(proto);
         return ZX_OK;
     }
+    case ZX_PROTOCOL_SYSMEM: {
+        auto* proto = static_cast<sysmem_protocol_t*>(out);
+        sysmem_.GetProtocol(proto);
+        return ZX_OK;
+    }
+    case ZX_PROTOCOL_AMLOGIC_CANVAS: {
+        auto* proto = static_cast<amlogic_canvas_protocol_t*>(out);
+        canvas_.GetProtocol(proto);
+        return ZX_OK;
+    }
     default:
         return proxy_->GetProtocol(proto_id, out);;
     }
diff --git a/zircon/system/dev/bus/platform/platform-proxy-device.h b/zircon/system/dev/bus/platform/platform-proxy-device.h
index 997122e2..6c9fd7b 100644
--- a/zircon/system/dev/bus/platform/platform-proxy-device.h
+++ b/zircon/system/dev/bus/platform/platform-proxy-device.h
@@ -7,11 +7,13 @@
 #include "platform-proxy-device.h"
 
 #include <ddktl/device.h>
+#include <ddktl/protocol/amlogiccanvas.h>
 #include <ddktl/protocol/clock.h>
 #include <ddktl/protocol/gpio.h>
 #include <ddktl/protocol/i2c.h>
 #include <ddktl/protocol/power.h>
 #include <ddktl/protocol/platform/device.h>
+#include <ddktl/protocol/sysmem.h>
 #include <fbl/ref_ptr.h>
 #include <fbl/unique_ptr.h>
 #include <fbl/vector.h>
@@ -111,6 +113,44 @@
     fbl::RefPtr<PlatformProxy> proxy_;
 };
 
+class ProxySysmem : public ddk::SysmemProtocol<ProxySysmem> {
+public:
+    explicit ProxySysmem(uint32_t device_id, fbl::RefPtr<PlatformProxy> proxy)
+        : device_id_(device_id), proxy_(proxy) {}
+
+    // Sysmem protocol implementation.
+    zx_status_t SysmemConnect(zx::channel allocator2_request);
+
+    void GetProtocol(sysmem_protocol_t* proto) {
+        proto->ops = &sysmem_protocol_ops_;
+        proto->ctx = this;
+    }
+
+private:
+    uint32_t device_id_;
+    fbl::RefPtr<PlatformProxy> proxy_;
+};
+
+class ProxyAmlogicCanvas : public ddk::AmlogicCanvasProtocol<ProxyAmlogicCanvas> {
+public:
+    explicit ProxyAmlogicCanvas(uint32_t device_id, fbl::RefPtr<PlatformProxy> proxy)
+        : device_id_(device_id), proxy_(proxy) {}
+
+    // Amlogic Canvas protocol implementation.
+    zx_status_t AmlogicCanvasConfig(zx::vmo vmo, size_t offset, const canvas_info_t* info,
+                                    uint8_t* out_canvas_idx);
+    zx_status_t AmlogicCanvasFree(uint8_t canvas_idx);
+
+    void GetProtocol(amlogic_canvas_protocol_t* proto) {
+        proto->ops = &amlogic_canvas_protocol_ops_;
+        proto->ctx = this;
+    }
+
+private:
+    uint32_t device_id_;
+    fbl::RefPtr<PlatformProxy> proxy_;
+};
+
 class ProxyDevice;
 using ProxyDeviceType = ddk::FullDevice<ProxyDevice>;
 
@@ -118,7 +158,8 @@
                     public ddk::PDevProtocol<ProxyDevice, ddk::base_protocol> {
 public:
     explicit ProxyDevice(zx_device_t* parent, uint32_t device_id, fbl::RefPtr<PlatformProxy> proxy)
-        : ProxyDeviceType(parent), device_id_(device_id), proxy_(proxy), clk_(device_id, proxy) {}
+        : ProxyDeviceType(parent), device_id_(device_id), proxy_(proxy), clk_(device_id, proxy),
+          sysmem_(device_id, proxy), canvas_(device_id, proxy) {}
 
     // Creates a ProxyDevice to be the root platform device.
     static zx_status_t CreateRoot(zx_device_t* parent, fbl::RefPtr<PlatformProxy> proxy);
@@ -183,6 +224,8 @@
     fbl::Vector<ProxyPower> power_domains_;
     fbl::Vector<ProxyI2c> i2cs_;
     ProxyClock clk_;
+    ProxySysmem sysmem_;
+    ProxyAmlogicCanvas canvas_;
 
     char name_[ZX_MAX_NAME_LEN];
     uint32_t metadata_count_;
diff --git a/zircon/system/dev/bus/platform/proxy-protocol.h b/zircon/system/dev/bus/platform/proxy-protocol.h
index 3e83b65..6287910 100644
--- a/zircon/system/dev/bus/platform/proxy-protocol.h
+++ b/zircon/system/dev/bus/platform/proxy-protocol.h
@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include <ddk/protocol/amlogiccanvas.h>
 #include <ddk/protocol/i2c.h>
 #include <ddk/protocol/platform/device.h>
 #include <ddk/protocol/platform/proxy.h>
@@ -144,4 +145,27 @@
     power_domain_status_t status;
 } rpc_power_rsp_t;
 
+// ZX_PROTOCOL_SYSMEM proxy support.
+enum {
+    SYSMEM_CONNECT,
+};
+
+// ZX_PROTOCOL_AMLOGIC_CANVAS proxy support.
+enum {
+    AMLOGIC_CANVAS_CONFIG,
+    AMLOGIC_CANVAS_FREE,
+};
+
+typedef struct {
+    platform_proxy_req_t header;
+    size_t offset;
+    canvas_info_t info;
+    uint8_t canvas_idx;
+} rpc_amlogic_canvas_req_t;
+
+typedef struct {
+    platform_proxy_rsp_t header;
+    uint8_t canvas_idx;
+} rpc_amlogic_canvas_rsp_t;
+
 } // namespace platform_bus
diff --git a/zircon/system/dev/display/aml-canvas/BUILD.gn b/zircon/system/dev/display/aml-canvas/BUILD.gn
index d6fbc97..c16dcaa 100644
--- a/zircon/system/dev/display/aml-canvas/BUILD.gn
+++ b/zircon/system/dev/display/aml-canvas/BUILD.gn
@@ -14,21 +14,4 @@
     "$zx/system/ulib/ddk",
     "$zx/system/ulib/zircon",
   ]
-  data_deps = [
-    ":aml-canvas.proxy",
-  ]
-}
-
-driver("aml-canvas.proxy") {
-  sources = [
-    "aml-canvas-proxy-client.c",
-  ]
-  deps = [
-    "$zx/system/banjo/ddk-protocol-amlogiccanvas",
-    "$zx/system/banjo/ddk-protocol-platform-bus",
-    "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
-    "$zx/system/ulib/ddk",
-    "$zx/system/ulib/zircon",
-  ]
 }
diff --git a/zircon/system/dev/display/aml-canvas/aml-canvas-proxy-client.c b/zircon/system/dev/display/aml-canvas/aml-canvas-proxy-client.c
deleted file mode 100644
index e826b69..0000000
--- a/zircon/system/dev/display/aml-canvas/aml-canvas-proxy-client.c
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <threads.h>
-#include <unistd.h>
-
-#include <ddk/binding.h>
-#include <ddk/debug.h>
-#include <ddk/device.h>
-#include <ddk/driver.h>
-#include <ddk/platform-defs.h>
-#include <ddk/protocol/amlogiccanvas.h>
-#include <ddk/protocol/platform/device.h>
-#include <ddk/protocol/platform/proxy.h>
-#include <zircon/pixelformat.h>
-
-#include "aml-canvas.h"
-
-static zx_status_t aml_canvas_proxy_config(void* ctx, zx_handle_t vmo,
-                                           size_t offset, const canvas_info_t* info,
-                                           uint8_t* canvas_idx) {
-    aml_canvas_proxy_t* proxy = ctx;
-    rpc_canvas_req_t req = {
-        .header = {
-            .proto_id = ZX_PROTOCOL_AMLOGIC_CANVAS,
-            .op = CANVAS_CONFIG,
-        },
-        .offset = offset,
-    };
-    rpc_canvas_rsp_t resp;
-
-    memcpy((void*)&req.info, info, sizeof(canvas_info_t));
-
-    size_t size_actual, handle_count_actual;
-    zx_status_t status = platform_proxy_proxy(&proxy->proxy, &req, sizeof(req), &vmo, 1, &resp,
-                                              sizeof(resp), &size_actual, NULL, 0,
-                                              &handle_count_actual);
-    if (status == ZX_OK && size_actual == sizeof(resp)) {
-        *canvas_idx = resp.idx;
-    }
-    return status;
-}
-
-static zx_status_t aml_canvas_proxy_free(void* ctx, uint8_t canvas_idx) {
-    aml_canvas_proxy_t* proxy = ctx;
-    rpc_canvas_req_t req = {
-        .header = {
-            .proto_id = ZX_PROTOCOL_AMLOGIC_CANVAS,
-            .op = CANVAS_FREE,
-        },
-        .idx = canvas_idx,
-    };
-    rpc_canvas_rsp_t resp;
-
-    size_t size_actual, handle_count_actual;
-    return platform_proxy_proxy(&proxy->proxy, &req, sizeof(req), NULL, 0, &resp, sizeof(resp),
-                                &size_actual, NULL, 0, &handle_count_actual);
-}
-
-static amlogic_canvas_protocol_ops_t canvas_proxy_ops = {
-    .config = aml_canvas_proxy_config,
-    .free   = aml_canvas_proxy_free,
-};
-
-static void aml_canvas_proxy_release(void* ctx) {
-    free(ctx);
-}
-
-static zx_protocol_device_t proxy_device_protocol = {
-    .version = DEVICE_OPS_VERSION,
-    .release = aml_canvas_proxy_release,
-};
-
-static zx_status_t aml_canvas_proxy_bind(void* ctx, zx_device_t* parent) {
-    platform_proxy_protocol_t proxy;
-
-    zx_status_t status = device_get_protocol(parent, ZX_PROTOCOL_PLATFORM_PROXY, &proxy);
-    if (status != ZX_OK) {
-        return status;
-    }
-
-    aml_canvas_proxy_t* canvas = calloc(1, sizeof(aml_canvas_proxy_t));
-    if (!canvas) {
-        return ZX_ERR_NO_MEMORY;
-    }
-    memcpy(&canvas->proxy, &proxy, sizeof(proxy));
-    canvas->canvas.ctx = canvas;
-    canvas->canvas.ops = &canvas_proxy_ops;
-
-    device_add_args_t args = {
-        .version = DEVICE_ADD_ARGS_VERSION,
-        .name = "aml-canvas-proxy",
-        .ctx = canvas,
-        .ops = &proxy_device_protocol,
-        .flags = DEVICE_ADD_NON_BINDABLE,
-    };
-
-    status = device_add(parent, &args, &canvas->zxdev);
-    if (status != ZX_OK) {
-        free(canvas);
-        return status;
-    }
-
-    status = platform_proxy_register_protocol(&proxy, ZX_PROTOCOL_AMLOGIC_CANVAS,
-                                              &canvas->canvas, sizeof(canvas->canvas));
-    if (status != ZX_OK) {
-        device_remove(canvas->zxdev);
-        return status;
-    }
-
-    return ZX_OK;
-}
-
-static zx_driver_ops_t aml_canvas_proxy_driver_ops = {
-    .version    = DRIVER_OPS_VERSION,
-    .bind       = aml_canvas_proxy_bind,
-};
-
-ZIRCON_DRIVER_BEGIN(aml_canvas_proxy, aml_canvas_proxy_driver_ops, "zircon", "0.1", 2)
-    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_PLATFORM_PROXY),
-    BI_MATCH_IF(EQ, BIND_PLATFORM_PROTO, ZX_PROTOCOL_AMLOGIC_CANVAS),
-ZIRCON_DRIVER_END(aml_canvas_proxy)
diff --git a/zircon/system/dev/display/aml-canvas/aml-canvas.c b/zircon/system/dev/display/aml-canvas/aml-canvas.c
index e7f996f..dd2dc2a8 100644
--- a/zircon/system/dev/display/aml-canvas/aml-canvas.c
+++ b/zircon/system/dev/display/aml-canvas/aml-canvas.c
@@ -165,55 +165,6 @@
     .free = aml_canvas_free,
 };
 
-static void aml_canvas_proxy_cb(void* cookie, const void* req_buffer, size_t req_size,
-                                const zx_handle_t* req_handle_list, size_t req_handle_count,
-                                void* out_resp_buffer, size_t resp_size, size_t* out_resp_actual,
-                                zx_handle_t* out_resp_handle_list, size_t resp_handle_count,
-                                size_t* out_resp_handle_actual) {
-    const rpc_canvas_req_t* req = (rpc_canvas_req_t*)req_buffer;
-    rpc_canvas_rsp_t* resp = (rpc_canvas_rsp_t*)out_resp_buffer;
-
-    if (req_size < sizeof(*req) || resp_size < sizeof(*resp)) {
-        resp->header.status = ZX_ERR_BUFFER_TOO_SMALL;
-        return;
-    }
-
-    if (req->header.proto_id != ZX_PROTOCOL_AMLOGIC_CANVAS) {
-        resp->header.status = ZX_ERR_NOT_SUPPORTED;
-        return;
-    }
-    *out_resp_actual = sizeof(*resp);
-    *out_resp_handle_actual = 0;
-    uint32_t handles_consumed = 0;
-
-    switch (req->header.op) {
-    case CANVAS_CONFIG: {
-        if (req_handle_count < 1) {
-            resp->header.status = ZX_ERR_BUFFER_TOO_SMALL;
-            return;
-        }
-        resp->header.status = aml_canvas_config(cookie, req_handle_list[0], req->offset,
-                                                &req->info, &resp->idx);
-        handles_consumed = 1;
-        break;
-    }
-    case CANVAS_FREE: {
-        resp->header.status = aml_canvas_free(cookie, req->idx);
-        break;
-    }
-    default:
-        for (uint32_t i = 0; i < req_handle_count; i++) {
-            zx_handle_close(req_handle_list[i]);
-        }
-        resp->header.status = ZX_ERR_NOT_SUPPORTED;
-        return;
-    }
-    for (uint32_t i = handles_consumed; i < req_handle_count; i++) {
-        zx_handle_close(req_handle_list[i]);
-    }
-    resp->header.status = ZX_OK;
-}
-
 static zx_status_t aml_canvas_bind(void* ctx, zx_device_t* parent) {
     zx_status_t status = ZX_OK;
 
@@ -258,7 +209,7 @@
         .name = "aml-canvas",
         .ctx = canvas,
         .ops = &aml_canvas_device_protocol,
-        .proto_id = ZX_PROTOCOL_AMLOGIC_CANVAS,
+        .flags = DEVICE_ADD_NON_BINDABLE,
     };
 
     status = device_add(parent, &args, &canvas->zxdev);
@@ -270,7 +221,7 @@
     canvas->canvas.ctx = canvas;
 
     // Register the canvas protocol with the platform bus
-    const platform_proxy_cb_t callback = {aml_canvas_proxy_cb, canvas};
+    const platform_proxy_cb_t callback = {NULL, NULL};
     pbus_register_protocol(&pbus, ZX_PROTOCOL_AMLOGIC_CANVAS, &canvas->canvas,
                            sizeof(canvas->canvas), &callback);
     return ZX_OK;
diff --git a/zircon/system/dev/display/aml-canvas/aml-canvas.h b/zircon/system/dev/display/aml-canvas/aml-canvas.h
index d3aedd8..052f6a3 100644
--- a/zircon/system/dev/display/aml-canvas/aml-canvas.h
+++ b/zircon/system/dev/display/aml-canvas/aml-canvas.h
@@ -51,26 +51,6 @@
 #define DMC_CAV_YWRAP                       (1<<23)
 #define DMC_CAV_XWRAP                       (1<<22)
 
-// Proxy request IDs.
-enum {
-    CANVAS_CONFIG,
-    CANVAS_FREE,
-};
-
-// Proxy request.
-typedef struct {
-    platform_proxy_req_t header;
-    canvas_info_t info;
-    size_t offset;
-    uint8_t idx;
-} rpc_canvas_req_t;
-
-// Proxy response.
-typedef struct {
-    platform_proxy_rsp_t header;
-    uint8_t idx;
-} rpc_canvas_rsp_t;
-
 // Context for driver implementation.
 typedef struct {
     zx_device_t* zxdev;
@@ -81,10 +61,3 @@
     zx_handle_t bti;
     zx_handle_t pmt_handle[NUM_CANVAS_ENTRIES];
 } aml_canvas_t;
-
-// Context for driver proxy.
-typedef struct {
-    zx_device_t* zxdev;
-    platform_proxy_protocol_t proxy;
-    amlogic_canvas_protocol_t canvas;
-} aml_canvas_proxy_t;
diff --git a/zircon/system/dev/sysmem/sysmem/BUILD.gn b/zircon/system/dev/sysmem/sysmem/BUILD.gn
index 38486c9..e7f5c5b 100644
--- a/zircon/system/dev/sysmem/sysmem/BUILD.gn
+++ b/zircon/system/dev/sysmem/sysmem/BUILD.gn
@@ -38,23 +38,6 @@
     "$zx/system/ulib/zx",
     "$zx/system/ulib/zxcpp",
   ]
-  data_deps = [
-    ":sysmem.proxy",
-  ]
-}
-
-driver("sysmem.proxy") {
-  sources = [
-    "sysmem-proxy-client.c",
-  ]
-  deps = [
-    "$zx/system/banjo/ddk-protocol-platform-bus",
-    "$zx/system/banjo/ddk-protocol-platform-device",
-    "$zx/system/banjo/ddk-protocol-platform-proxy",
-    "$zx/system/banjo/ddk-protocol-sysmem",
-    "$zx/system/ulib/ddk",
-    "$zx/system/ulib/zircon",
-  ]
 }
 
 test("sysmem-unittest") {
diff --git a/zircon/system/dev/sysmem/sysmem/device.cpp b/zircon/system/dev/sysmem/sysmem/device.cpp
index 062d0e4d..3a052bf 100644
--- a/zircon/system/dev/sysmem/sysmem/device.cpp
+++ b/zircon/system/dev/sysmem/sysmem/device.cpp
@@ -8,7 +8,6 @@
 #include "amlogic_memory_allocator.h"
 #include "buffer_collection_token.h"
 #include "macros.h"
-#include "sysmem-proxy.h"
 
 #include <ddk/device.h>
 #include <ddk/platform-defs.h>
@@ -59,55 +58,6 @@
     .connect = in_proc_sysmem_Connect,
 };
 
-// This function is used as a platform_proxy_cb.callback.
-void sysmem_proxy_cb(void* ctx, const void* req_buffer, size_t req_size,
-                     const zx_handle_t* req_handle_list,
-                     size_t req_handle_count, void* out_resp_buffer,
-                     size_t resp_size, size_t* out_resp_actual,
-                     zx_handle_t* out_resp_handle_list,
-                     size_t resp_handle_count, size_t* out_resp_handle_actual) {
-    // Consume or close all the incoming handles, regardless of how far we get.
-    // If we consume the first few handles (or first handle), don't close those.
-    uint32_t handles_consumed = 0;
-    auto close_extra_handles = fit::defer(
-        [req_handle_list, req_handle_count, &handles_consumed]{
-        for (uint32_t i = handles_consumed; i < req_handle_count; i++) {
-            zx_handle_close(req_handle_list[i]);
-        }
-    });
-
-    const rpc_sysmem_req_t* req = (rpc_sysmem_req_t*)req_buffer;
-    rpc_sysmem_rsp_t* resp = (rpc_sysmem_rsp_t*)out_resp_buffer;
-
-    if (req_size < sizeof(*req) || resp_size < sizeof(*resp)) {
-        resp->header.status = ZX_ERR_BUFFER_TOO_SMALL;
-        return;
-    }
-
-    if (req->header.proto_id != ZX_PROTOCOL_SYSMEM) {
-        resp->header.status = ZX_ERR_NOT_SUPPORTED;
-        return;
-    }
-
-    *out_resp_actual = sizeof(*resp);
-    *out_resp_handle_actual = 0;
-
-    switch (req->header.op) {
-    case SYSMEM_CONNECT: {
-        if (req_handle_count < 1) {
-            resp->header.status = ZX_ERR_BUFFER_TOO_SMALL;
-            return;
-        }
-        resp->header.status = in_proc_sysmem_Connect(ctx, req_handle_list[0]);
-        handles_consumed = 1;
-        break;
-    }
-    default:
-        resp->header.status = ZX_ERR_NOT_SUPPORTED;
-        return;
-    }
-}
-
 } // namespace
 
 Device::Device(zx_device_t* parent_device, Driver* parent_driver)
@@ -200,7 +150,7 @@
     // We should only pbus_register_protocol() if device_add() succeeded, but if
     // pbus_register_protocol() fails, we should remove the device without it
     // ever being visible.
-    const platform_proxy_cb_t callback = {sysmem_proxy_cb, this};
+    const platform_proxy_cb_t callback = {nullptr, nullptr};
     status = pbus_register_protocol(
         &pbus, ZX_PROTOCOL_SYSMEM, &in_proc_sysmem_protocol_,
         sizeof(in_proc_sysmem_protocol_), &callback);
diff --git a/zircon/system/dev/sysmem/sysmem/sysmem-proxy-client.c b/zircon/system/dev/sysmem/sysmem/sysmem-proxy-client.c
deleted file mode 100644
index bbbd8ff..0000000
--- a/zircon/system/dev/sysmem/sysmem/sysmem-proxy-client.c
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2019 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <threads.h>
-#include <unistd.h>
-
-#include <ddk/binding.h>
-#include <ddk/debug.h>
-#include <ddk/device.h>
-#include <ddk/driver.h>
-#include <ddk/platform-defs.h>
-#include <ddk/protocol/sysmem.h>
-#include <ddk/protocol/platform/device.h>
-#include <ddk/protocol/platform/proxy.h>
-
-#include "sysmem-proxy.h"
-
-static zx_status_t sysmem_proxy_connect(void* ctx, zx_handle_t allocator_request) {
-    sysmem_proxy_t* proxy = ctx;
-    rpc_sysmem_req_t req = {
-        .header = {
-            .proto_id = ZX_PROTOCOL_SYSMEM,
-            .op = SYSMEM_CONNECT,
-        },
-    };
-    rpc_sysmem_rsp_t resp;
-
-    size_t size_actual, handle_count_actual;
-    zx_status_t status = platform_proxy_proxy(
-        &proxy->proxy, &req, sizeof(req), &allocator_request, 1,
-        &resp, sizeof(resp), &size_actual, NULL, 0, &handle_count_actual);
-    return status;
-}
-
-static sysmem_protocol_ops_t sysmem_proxy_ops = {
-    .connect = sysmem_proxy_connect,
-};
-
-static void sysmem_proxy_release(void* ctx) {
-    free(ctx);
-}
-
-static zx_protocol_device_t proxy_device_protocol = {
-    .version = DEVICE_OPS_VERSION,
-    .release = sysmem_proxy_release,
-};
-
-static zx_status_t sysmem_proxy_bind(void* ctx, zx_device_t* parent) {
-    platform_proxy_protocol_t proxy;
-
-    zx_status_t status = device_get_protocol(
-        parent, ZX_PROTOCOL_PLATFORM_PROXY, &proxy);
-    if (status != ZX_OK) {
-        return status;
-    }
-
-    sysmem_proxy_t* sysmem_proxy = calloc(1, sizeof(sysmem_proxy_t));
-    if (!sysmem_proxy) {
-        return ZX_ERR_NO_MEMORY;
-    }
-
-    memcpy(&sysmem_proxy->proxy, &proxy, sizeof(proxy));
-    sysmem_proxy->sysmem.ctx = sysmem_proxy;
-    sysmem_proxy->sysmem.ops = &sysmem_proxy_ops;
-
-    device_add_args_t args = {
-        .version = DEVICE_ADD_ARGS_VERSION,
-        .name = "sysmem-proxy",
-        .ctx = sysmem_proxy,
-        .ops = &proxy_device_protocol,
-        .flags = DEVICE_ADD_NON_BINDABLE,
-    };
-
-    status = device_add(parent, &args, &sysmem_proxy->zxdev);
-    if (status != ZX_OK) {
-        free(sysmem_proxy);
-        return status;
-    }
-
-    status = platform_proxy_register_protocol(
-        &proxy, ZX_PROTOCOL_SYSMEM,
-        &sysmem_proxy->sysmem, sizeof(sysmem_proxy->sysmem));
-    if (status != ZX_OK) {
-        device_remove(sysmem_proxy->zxdev);
-        return status;
-    }
-
-    return ZX_OK;
-}
-
-static zx_driver_ops_t sysmem_proxy_driver_ops = {
-    .version    = DRIVER_OPS_VERSION,
-    .bind       = sysmem_proxy_bind,
-};
-
-// clang-format off
-ZIRCON_DRIVER_BEGIN(sysmem_proxy, sysmem_proxy_driver_ops, "zircon", "0.1", 2)
-    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_PLATFORM_PROXY),
-    BI_MATCH_IF(EQ, BIND_PLATFORM_PROTO, ZX_PROTOCOL_SYSMEM),
-ZIRCON_DRIVER_END(sysmem_proxy)
-// clang-format on
diff --git a/zircon/system/dev/sysmem/sysmem/sysmem-proxy.h b/zircon/system/dev/sysmem/sysmem/sysmem-proxy.h
deleted file mode 100644
index f3b68d6..0000000
--- a/zircon/system/dev/sysmem/sysmem/sysmem-proxy.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2019 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#pragma once
-
-#include <ddk/protocol/platform/proxy.h>
-#include <ddk/protocol/sysmem.h>
-
-// Proxy request IDs.
-enum {
-    SYSMEM_CONNECT,
-};
-
-// Proxy request.
-typedef struct {
-    platform_proxy_req_t header;
-
-    // We don't need any sysmem-specific fields, since the handle is delivered
-    // separately.
-} rpc_sysmem_req_t;
-
-// Proxy response.
-typedef struct {
-    platform_proxy_rsp_t header;
-
-    // We don't need any sysmem-specific fields.
-} rpc_sysmem_rsp_t;
-
-// Context for driver proxy.
-typedef struct {
-    zx_device_t* zxdev;
-    platform_proxy_protocol_t proxy;
-    sysmem_protocol_t sysmem;
-} sysmem_proxy_t;