[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;