blob: 37737f1a5803f96e6ee31aa7cd63f712e29f7d63 [file] [log] [blame]
// 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.
// !!! THIS FILE IS NOT YET USED !!!
// See //zircon/system/public/zircon/syscalls.banjo.
// !!! THIS FILE IS NOT YET USED !!!
library zz;
// TODO(cja): This makes some assumptions that anything in an arch's PIO region
// is going to be defined as a base address and size. This will need to be
// updated to a per-platform structure in the event that doesn't pan out
// in the future.
struct PciBar {
uint32 id;
uint32 type;
usize size;
// TODO(scottmg): Unnamed union.
//union {
// uintptr_t addr;
// zx_handle_t handle;
//};
};
// Defines and structures related to zx_pci_*()
// Info returned to dev manager for PCIe devices when probing.
struct PcieDeviceInfo {
uint16 vendor_id;
uint16 device_id;
uint8 base_class;
uint8 sub_class;
uint8 program_interface;
uint8 revision_id;
uint8 bus_id;
uint8 dev_id;
uint8 func_id;
};
// TODO(scottmg): Lots of constants here.
// TODO(scottmg): This one is hard.
struct PciInitArg {
// TODO(scottmg): [][][] array.
// zx_pci_irq_swizzle_lut_t dev_pin_to_global_irq;
uint32 num_irqs;
//struct {
//uint32_t global_irq;
//bool level_triggered;
//bool active_high;
//} irqs[ZX_PCI_MAX_IRQS];
uint32 addr_window_count;
// TODO(scottmg): struct-hack sized.
//struct {
//uint64_t base;
//size_t size;
//uint8_t bus_start;
//uint8_t bus_end;
//uint8_t cfg_space_type;
//bool has_ecam;
//} addr_windows[];
};
[Transport="Syscall"]
protocol Pci {
[In0="handle<resource>:kind=ROOT",
Out2="handle<pcidevice>:acquire"]
GetNthDevice(handle<resource> handle, uint32 index) ->
(status status, PcieDeviceInfo out_info, handle out_handle);
[In0="handle<pcidevice>:rights=WRITE"]
EnableBusMaster(handle<pcidevice> handle, bool enable) -> (status status);
[rights="handle must be of type ZX_OBJ_TYPE_PCI_DEVICE and have ZX_RIGHT_WRITE."]
ResetDevice(handle<pcidevice> handle) -> (status status);
[In0="handle<pcidevice>:rights=READ,WRITE"]
ConfigRead(handle<pcidevice> handle, uint16 offset, usize width) ->
(status status, uint32 out_val);
[In0=",andle<pcidevice>:rights=READ,WRITE"]
ConfigWrite(handle<pcidevice> handle, uint16 offset, usize width, uint32 val) ->
(status status);
[In0="handle<resource>:kind=ROOT",
In5="mutable<int32>"]
CfgPioRw(handle<resource> handle,
uint8 bus,
uint8 dev,
uint8 func,
uint8 offset,
uint32 val,
usize width,
bool write) ->
(status status);
// TODO(scottmg): type of out_handle?
[In0="handle<pcidevice>:rights=READ,WRITE",
Out2="handle:acquire"]
GetBar(handle<pcidevice> handle, uint32 bar_num) ->
(status status, PciBar out_bar, handle out_handle);
[In0="handle<pcidevice>:rights=READ",
Out1="handle:acquire"]
MapInterrupt(handle<pcidevice> handle, int32 which_irq) -> (status status, handle out_handle);
[In0="handle<pcidevice>:rights=READ"]
QueryIrqMode(handle<pcidevice> handle, uint32 mode) -> (status status, uint32 out_max_irqs);
[In0="handle<pcidevice>:rights=WRITE"]
SetIrqMode(handle<pcidevice> handle, uint32 mode, uint32 requested_irq_count) ->
(status status);
// TODO(scottmg): vector size is uint32, not size_t.
[In0="handle<resource>:kind=ROOT"]
Init(handle<resource> handle, vector<PciInitArg> init_buf) -> (status status);
[In0="handle<resource>:kind=ROOT"]
AddSubtractIoRange(handle<resource> handle, bool mmio, uint64 base, uint64 len, bool add) ->
(status status);
};