| // Copyright 2017 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #ifndef ZIRCON_KERNEL_LIB_PCI_INCLUDE_LIB_PCI_PIO_H_ |
| #define ZIRCON_KERNEL_LIB_PCI_INCLUDE_LIB_PCI_PIO_H_ |
| |
| #include <stdint.h> |
| #include <zircon/types.h> |
| |
| namespace Pci { |
| // Returns the BDF address without the bottom two bits masked off. |
| constexpr uint32_t PciBdfRawAddr(uint8_t bus, uint8_t dev, uint8_t func, uint8_t off) { |
| return (((bus & 0xFF) << 16) | // bits 23-16 bus |
| ((dev & 0x1F) << 11) | // bits 15-11 device |
| ((func & 0x7) << 8) | // bifs 10-8 func |
| (off & 0xFF)); // bits 7-2 register, WITH bottom two bits as well |
| } |
| |
| // Return BDF address with bottom two bits masked off. |
| constexpr uint32_t PciBdfAddr(uint8_t bus, uint8_t dev, uint8_t func, uint8_t off) { |
| // Bits 1 & 0 must be zero |
| return PciBdfRawAddr(bus, dev, func, off) & ~0x3; |
| } |
| |
| // |addr| is expected to NOT have the bottom to bits masked off |
| zx_status_t PioCfgRead(uint32_t addr, uint32_t* val, size_t width); |
| zx_status_t PioCfgRead(uint8_t bus, uint8_t dev, uint8_t func, uint8_t offset, uint32_t* val, |
| size_t width); |
| |
| // |addr| is expected to NOT have the bottom to bits masked off |
| zx_status_t PioCfgWrite(uint32_t addr, uint32_t val, size_t width); |
| zx_status_t PioCfgWrite(uint8_t bus, uint8_t dev, uint8_t func, uint8_t offset, uint32_t val, |
| size_t width); |
| } // namespace Pci |
| |
| #endif // ZIRCON_KERNEL_LIB_PCI_INCLUDE_LIB_PCI_PIO_H_ |