[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;