blob: 84f7bee5ca1b6a37f37da5ca6c72982133d3d764 [file] [log] [blame]
// Copyright 2021 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 <fidl/fuchsia.hardware.pci/cpp/wire.h>
#include <fuchsia/hardware/pciroot/cpp/banjo.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/component/outgoing/cpp/outgoing_directory.h>
#include <lib/ddk/device.h>
#include <lib/ddk/driver.h>
#include <lib/ddk/platform-defs.h>
#include <lib/device-protocol/pci.h>
#include <lib/device-protocol/pdev-fidl.h>
#include <ddktl/device.h>
#ifndef SRC_DEVICES_BUS_DRIVERS_PCI_KPCI_H_
#define SRC_DEVICES_BUS_DRIVERS_PCI_KPCI_H_
struct kpci_device {
zx_device_t* zxdev;
// only set for non-proxy devices
pciroot_protocol_t pciroot;
ddk::PDevFidl pdev;
// kernel pci handle, only set for shadow devices
zx_handle_t handle;
// nth device index
uint32_t index;
pci_device_info_t info;
char name[ZX_DEVICE_NAME_MAX];
};
namespace pci {
class KernelPci;
using KernelPciType = ddk::Device<pci::KernelPci>;
class KernelPci : public KernelPciType, public fidl::WireServer<fuchsia_hardware_pci::Device> {
public:
KernelPci(zx_device_t* parent, kpci_device device, async_dispatcher_t* dispatcher);
void DdkRelease();
static zx_status_t CreateComposite(zx_device_t* parent, kpci_device device, bool uses_acpi);
// Pci Protocol
void GetBar(GetBarRequestView request, GetBarCompleter::Sync& completer) override;
void SetBusMastering(SetBusMasteringRequestView request,
SetBusMasteringCompleter::Sync& completer) override;
void ResetDevice(ResetDeviceCompleter::Sync& completer) override;
void AckInterrupt(AckInterruptCompleter::Sync& completer) override;
void MapInterrupt(MapInterruptRequestView request,
MapInterruptCompleter::Sync& completer) override;
void GetInterruptModes(GetInterruptModesCompleter::Sync& completer) override;
void SetInterruptMode(SetInterruptModeRequestView request,
SetInterruptModeCompleter::Sync& completer) override;
void GetDeviceInfo(GetDeviceInfoCompleter::Sync& completer) override;
void ReadConfig8(ReadConfig8RequestView request, ReadConfig8Completer::Sync& completer) override;
void ReadConfig16(ReadConfig16RequestView request,
ReadConfig16Completer::Sync& completer) override;
void ReadConfig32(ReadConfig32RequestView request,
ReadConfig32Completer::Sync& completer) override;
void WriteConfig8(WriteConfig8RequestView request,
WriteConfig8Completer::Sync& completer) override;
void WriteConfig16(WriteConfig16RequestView request,
WriteConfig16Completer::Sync& completer) override;
void WriteConfig32(WriteConfig32RequestView request,
WriteConfig32Completer::Sync& completer) override;
void GetCapabilities(GetCapabilitiesRequestView request,
GetCapabilitiesCompleter::Sync& completer) override;
void GetExtendedCapabilities(GetExtendedCapabilitiesRequestView request,
GetExtendedCapabilitiesCompleter::Sync& completer) override;
void GetBti(GetBtiRequestView request, GetBtiCompleter::Sync& completer) override;
zx_status_t SetUpOutgoingDirectory(fidl::ServerEnd<fuchsia_io::Directory> sever_end);
private:
kpci_device device_;
fidl::ServerBindingGroup<fuchsia_hardware_pci::Device> bindings_;
async_dispatcher_t* dispatcher_;
component::OutgoingDirectory outgoing_;
};
} // namespace pci
#endif // SRC_DEVICES_BUS_DRIVERS_PCI_KPCI_H_