| // Copyright 2020 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 <lib/ddk/binding.h> |
| #include <lib/ddk/debug.h> |
| #include <lib/ddk/device.h> |
| #include <lib/ddk/platform-defs.h> |
| |
| #include <array> |
| |
| #include <bind/fuchsia/cpp/bind.h> |
| #include <bind/fuchsia/google/platform/cpp/bind.h> |
| #include <bind/fuchsia/hardware/goldfish/cpp/bind.h> |
| #include <bind/fuchsia/hardware/goldfish/pipe/cpp/bind.h> |
| #include <bind/fuchsia/hardware/sysmem/cpp/bind.h> |
| |
| #include "src/devices/board/drivers/x86/x86.h" |
| |
| #define PCI_VID_GOLDFISH_ADDRESS_SPACE 0x607D |
| #define PCI_DID_GOLDFISH_ADDRESS_SPACE 0xF153 |
| |
| namespace x86 { |
| |
| const ddk::BindRule kGoldfishPipeRules[] = { |
| ddk::MakeAcceptBindRule(bind_fuchsia_hardware_goldfish_pipe::SERVICE, |
| bind_fuchsia_hardware_goldfish_pipe::SERVICE_ZIRCONTRANSPORT), |
| ddk::MakeAcceptBindRule(bind_fuchsia::PLATFORM_DEV_VID, |
| bind_fuchsia_google_platform::BIND_PLATFORM_DEV_VID_GOOGLE), |
| ddk::MakeAcceptBindRule(bind_fuchsia::PLATFORM_DEV_PID, |
| bind_fuchsia_google_platform::BIND_PLATFORM_DEV_PID_GOLDFISH), |
| ddk::MakeAcceptBindRule( |
| bind_fuchsia::PLATFORM_DEV_DID, |
| bind_fuchsia_google_platform::BIND_PLATFORM_DEV_DID_GOLDFISH_PIPE_CONTROL), |
| |
| }; |
| |
| const device_bind_prop_t kGoldfishPipeProperties[] = { |
| ddk::MakeProperty(bind_fuchsia_hardware_goldfish_pipe::SERVICE, |
| bind_fuchsia_hardware_goldfish_pipe::SERVICE_ZIRCONTRANSPORT), |
| ddk::MakeProperty(bind_fuchsia::PLATFORM_DEV_VID, |
| bind_fuchsia_google_platform::BIND_PLATFORM_DEV_VID_GOOGLE), |
| ddk::MakeProperty(bind_fuchsia::PLATFORM_DEV_PID, |
| bind_fuchsia_google_platform::BIND_PLATFORM_DEV_PID_GOLDFISH), |
| ddk::MakeProperty(bind_fuchsia::PLATFORM_DEV_DID, |
| bind_fuchsia_google_platform::BIND_PLATFORM_DEV_DID_GOLDFISH_PIPE_CONTROL), |
| }; |
| |
| const ddk::BindRule kGoldfishAddressSpaceRules[] = { |
| ddk::MakeAcceptBindRule(bind_fuchsia_hardware_goldfish::ADDRESSSPACESERVICE, |
| bind_fuchsia_hardware_goldfish::ADDRESSSPACESERVICE_ZIRCONTRANSPORT), |
| }; |
| |
| const device_bind_prop_t kGoldfishAddressSpaceProperties[] = { |
| ddk::MakeProperty(bind_fuchsia_hardware_goldfish::ADDRESSSPACESERVICE, |
| bind_fuchsia_hardware_goldfish::ADDRESSSPACESERVICE_ZIRCONTRANSPORT), |
| }; |
| |
| const ddk::BindRule kGoldfishSyncRules[] = { |
| ddk::MakeAcceptBindRule(bind_fuchsia_hardware_goldfish::SYNCSERVICE, |
| bind_fuchsia_hardware_goldfish::SYNCSERVICE_ZIRCONTRANSPORT), |
| }; |
| |
| const device_bind_prop_t kGoldfishSyncProperties[] = { |
| ddk::MakeProperty(bind_fuchsia_hardware_goldfish::SYNCSERVICE, |
| bind_fuchsia_hardware_goldfish::SYNCSERVICE_ZIRCONTRANSPORT), |
| }; |
| |
| const ddk::BindRule kSysmemRules[] = { |
| ddk::MakeAcceptBindRule(bind_fuchsia_hardware_sysmem::SERVICE, |
| bind_fuchsia_hardware_sysmem::SERVICE_ZIRCONTRANSPORT), |
| }; |
| |
| const device_bind_prop_t kSysmemProperties[] = { |
| ddk::MakeProperty(bind_fuchsia_hardware_sysmem::SERVICE, |
| bind_fuchsia_hardware_sysmem::SERVICE_ZIRCONTRANSPORT), |
| }; |
| |
| zx_status_t X86::GoldfishControlInit() { |
| zx_status_t status = DdkAddCompositeNodeSpec( |
| "goldfish-control-2", |
| ddk::CompositeNodeSpec(kGoldfishPipeRules, kGoldfishPipeProperties) |
| .AddParentSpec(kGoldfishAddressSpaceRules, kGoldfishAddressSpaceProperties) |
| .AddParentSpec(kGoldfishSyncRules, kGoldfishSyncProperties) |
| .AddParentSpec(kSysmemRules, kSysmemProperties)); |
| |
| if (status != ZX_OK) { |
| zxlogf(ERROR, "goldfish-control-2: DdkAddCompositeNodeSpec failed: %s", |
| zx_status_get_string(status)); |
| return status; |
| } |
| return status; |
| } |
| |
| } // namespace x86 |