[upci] Add addr() to print a config's bdf address
This design isn't necessarily something that will be kept long term, but
it's useful for bring-up of the port while things are solidifying.
Test: Used addr() in debug output.
Change-Id: I69112ae7e678e23ff4841e053efba212127743d7
diff --git a/system/dev/bus/pci/bus.cpp b/system/dev/bus/pci/bus.cpp
index 1b5bd72..79b981a 100644
--- a/system/dev/bus/pci/bus.cpp
+++ b/system/dev/bus/pci/bus.cpp
@@ -118,8 +118,8 @@
fbl::RefPtr<Config> config;
pci_bdf_t bdf = { static_cast<uint8_t>(bus_id), dev_id, func_id };
zx_status_t status = MakeConfig(bdf, &config);
- if (status == ZX_OK) {
- if (config->vendor_id() != 0xFFFF) {
+ if (status == ZX_OK) {
+ if (config->Read(Config::kVendorId) == PCI_INVALID_VENDOR_ID) {
pci_infof("found device at %02x:%02x.%1x\n", bus_id, dev_id, func_id);
}
}
diff --git a/system/dev/bus/pci/config.h b/system/dev/bus/pci/config.h
index 7082faf..cffdfa3 100644
--- a/system/dev/bus/pci/config.h
+++ b/system/dev/bus/pci/config.h
@@ -5,12 +5,13 @@
// https://opensource.org/licenses/MIT
#pragma once
-#include <ddktl/protocol/pciroot.h>
#include <ddk/mmio-buffer.h>
+#include <ddktl/protocol/pciroot.h>
#include <endian.h>
#include <fbl/intrusive_single_list.h>
#include <fbl/ref_counted.h>
#include <fbl/ref_ptr.h>
+#include <stdio.h>
#include <zircon/hw/pci.h>
#include <zircon/types.h>
@@ -122,13 +123,10 @@
//
// @return a pointer to a new Config instance on success, nullptr on failure.
//
- inline pci_bdf_t bdf() const { return bdf_; }
+ inline const pci_bdf_t& bdf() const { return bdf_; }
+ inline const char* addr(void) const { return addr_; };
virtual const char* type(void) const = 0;
- // Convenience
- uint16_t vendor_id() const { return Read(kVendorId); }
- uint16_t device_id() const { return Read(kDeviceId); }
-
// Virtuals
void DumpConfig(uint16_t len) const;
virtual uint8_t Read(const PciReg8 addr) const = 0;
@@ -140,9 +138,12 @@
virtual ~Config(){};
protected:
- Config(pci_bdf_t bdf)
- : bdf_(bdf) {}
+ Config(pci_bdf_t bdf) : bdf_(bdf) {
+ snprintf(addr_, sizeof(addr_), "%02x:%02x.%01x", bdf_.bus_id, bdf_.device_id,
+ bdf_.function_id);
+ }
const pci_bdf_t bdf_;
+ char addr_[8];
};
// MMIO config is the stardard method for accessing modern pci configuration space.
@@ -151,10 +152,10 @@
class MmioConfig final : public Config {
public:
static zx_status_t Create(pci_bdf_t bdf,
- mmio_buffer_t* ecam_,
- uint8_t start_bus,
- uint8_t end_bus,
- fbl::RefPtr<Config>* config);
+ mmio_buffer_t* ecam_,
+ uint8_t start_bus,
+ uint8_t end_bus,
+ fbl::RefPtr<Config>* config);
uint8_t Read(const PciReg8 addr) const final;
uint16_t Read(const PciReg16 addr) const final;
uint32_t Read(const PciReg32 addr) const final;