[iwlwifi] Remove use of mmio_buffer_t

Only one BAR is ever mappable in the driver as currently implemented so
instead of using the C mmio_buffer_t interface, just expose a MMIO_PTR
to the C side of the driver.

Bug: 115988
Change-Id: I932bd30c021f6151424d877f8f86837374fff2f0
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/870677
Reviewed-by: Sakthi Vignesh Radhakrishnan <rsakthi@google.com>
Commit-Queue: Auto-Submit <auto-submit@fuchsia-infra.iam.gserviceaccount.com>
Fuchsia-Auto-Submit: Christopher Anderson <cja@google.com>
diff --git a/third_party/iwlwifi2/pcie/internal.h b/third_party/iwlwifi2/pcie/internal.h
index 42f224e..5668a6f 100644
--- a/third_party/iwlwifi2/pcie/internal.h
+++ b/third_party/iwlwifi2/pcie/internal.h
@@ -37,8 +37,8 @@
 #define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PCIE_INTERNAL_H_
 
 #include <lib/device-protocol/pci.h>
-#include <lib/mmio/mmio-buffer.h>
 #include <lib/sync/completion.h>
+#include <lib/mmio-ptr/mmio-ptr.h>
 #include <threads.h>
 #include <zircon/listnode.h>
 
@@ -443,7 +443,7 @@
   struct iwl_pci_dev* pci_dev;
   struct iwl_pci_fidl* pci;
   pci_interrupt_mode_t irq_mode;
-  mmio_buffer_t mmio;
+  MMIO_PTR void* mmio_vaddr;
 
   bool ucode_write_complete;
   bool sx_complete;
diff --git a/third_party/iwlwifi2/pcie/trans.c b/third_party/iwlwifi2/pcie/trans.c
index f77b4f0..ac3dd5b 100644
--- a/third_party/iwlwifi2/pcie/trans.c
+++ b/third_party/iwlwifi2/pcie/trans.c
@@ -1880,26 +1880,22 @@
 }
 
 static void iwl_trans_pcie_write8(struct iwl_trans* trans, uint32_t ofs, uint8_t val) {
-  uintptr_t addr = (uintptr_t)(IWL_TRANS_GET_PCIE_TRANS(trans)->mmio.vaddr) + ofs;
-  *(volatile uint8_t*)addr = val;
+  MmioWrite8(val, IWL_TRANS_GET_PCIE_TRANS(trans)->mmio_vaddr + ofs);
 }
 
 static void iwl_trans_pcie_write32(struct iwl_trans* trans, uint32_t ofs, uint32_t val) {
-  uintptr_t addr = (uintptr_t)(IWL_TRANS_GET_PCIE_TRANS(trans)->mmio.vaddr) + ofs;
-  *(volatile uint32_t*)addr = val;
+  MmioWrite32(val, IWL_TRANS_GET_PCIE_TRANS(trans)->mmio_vaddr + ofs);
 }
 
 static uint32_t iwl_trans_pcie_read32(struct iwl_trans* trans, uint32_t ofs) {
-  uintptr_t addr = (uintptr_t)(IWL_TRANS_GET_PCIE_TRANS(trans)->mmio.vaddr) + ofs;
-  return *(volatile uint32_t*)addr;
+  return MmioRead32(IWL_TRANS_GET_PCIE_TRANS(trans)->mmio_vaddr + ofs);
 }
 
 static uint32_t iwl_trans_pcie_prph_msk(struct iwl_trans* trans) {
   if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
     return 0x00FFFFFF;
-  } else {
-    return 0x000FFFFF;
   }
+  return 0x000FFFFF;
 }
 
 static uint32_t iwl_trans_pcie_read_prph(struct iwl_trans* trans, uint32_t reg) {
@@ -3535,7 +3531,7 @@
 #endif  // NEEDS_PORTING
 
   status = iwl_pci_map_bar_buffer(trans_pcie->pci, 0 /* bar_id */, ZX_CACHE_POLICY_UNCACHED_DEVICE,
-                              &trans_pcie->mmio);
+                              &trans_pcie->mmio_vaddr);
   if (status != ZX_OK) {
     IWL_ERR(trans, "Failed to map resources for BAR 0: %s\n", zx_status_get_string(status));
     goto out_no_pci;
diff --git a/third_party/iwlwifi2/platform/pci-fidl.cc b/third_party/iwlwifi2/platform/pci-fidl.cc
index 287fed8..3598a05 100644
--- a/third_party/iwlwifi2/platform/pci-fidl.cc
+++ b/third_party/iwlwifi2/platform/pci-fidl.cc
@@ -2,8 +2,11 @@
 
 #include <lib/device-protocol/pci.h>
 
+namespace fpci = fuchsia_hardware_pci::wire;
+
 struct iwl_pci_fidl {
   std::unique_ptr<ddk::Pci> pci;
+  std::optional<fdf::MmioBuffer> mmio;
 };
 
 void iwl_pci_ack_interrupt(const struct iwl_pci_fidl* fidl) { fidl->pci->AckInterrupt(); }
@@ -14,7 +17,7 @@
 }
 
 zx_status_t iwl_pci_get_device_info(const struct iwl_pci_fidl* fidl, pci_device_info_t* out_info) {
-  fuchsia_hardware_pci::wire::DeviceInfo info;
+  fpci::DeviceInfo info;
   zx_status_t status = fidl->pci->GetDeviceInfo(&info);
   if (status == ZX_OK) {
     *out_info = ddk::convert_device_info_to_banjo(info);
@@ -33,7 +36,7 @@
 
 void iwl_pci_get_interrupt_modes(const struct iwl_pci_fidl* fidl,
                                  pci_interrupt_modes_t* out_modes) {
-  fuchsia_hardware_pci::wire::InterruptModes modes;
+  fpci::InterruptModes modes;
   fidl->pci->GetInterruptModes(&modes);
   *out_modes = ddk::convert_interrupt_modes_to_banjo(modes);
 }
@@ -62,9 +65,14 @@
   return fidl->pci->WriteConfig8(offset, value);
 }
 
-zx_status_t iwl_pci_map_bar_buffer(const struct iwl_pci_fidl* fidl, uint32_t bar_id,
-                                   uint32_t cache_policy, mmio_buffer_t* buffer) {
-  return fidl->pci->MapMmio(bar_id, cache_policy, buffer);
+zx_status_t iwl_pci_map_bar_buffer(struct iwl_pci_fidl* fidl, uint32_t bar_id,
+                                   uint32_t cache_policy, MMIO_PTR void** buffer) {
+  ZX_DEBUG_ASSERT(bar_id < fpci::kBaseAddressCount);
+  zx_status_t status = fidl->pci->MapMmio(bar_id, cache_policy, &fidl->mmio);
+  if (status == ZX_OK) {
+    *buffer = fidl->mmio->get();
+  }
+  return status;
 }
 
 zx_status_t iwl_pci_connect_fragment_protocol(struct zx_device* parent, const char* fragment_name,
diff --git a/third_party/iwlwifi2/platform/pci-fidl.h b/third_party/iwlwifi2/platform/pci-fidl.h
index 4b500f5..8dd2617 100644
--- a/third_party/iwlwifi2/platform/pci-fidl.h
+++ b/third_party/iwlwifi2/platform/pci-fidl.h
@@ -6,7 +6,7 @@
 #define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_PCI_FIDL_H_
 
 #include <lib/device-protocol/pci.h>
-#include <lib/mmio/mmio-buffer.h>
+#include <lib/mmio-ptr/mmio-ptr.h>
 #include <zircon/types.h>
 
 #include "src/connectivity/wlan/drivers/third_party/intel/iwlwifi/platform/kernel.h"
@@ -32,8 +32,8 @@
 zx_status_t iwl_pci_map_interrupt(const struct iwl_pci_fidl* fidl, uint32_t which_irq,
                                   zx_handle_t* out_interrupt);
 zx_status_t iwl_pci_write_config8(const struct iwl_pci_fidl* fidl, uint16_t offset, uint8_t value);
-zx_status_t iwl_pci_map_bar_buffer(const struct iwl_pci_fidl* fidl, uint32_t bar_id,
-                                   uint32_t cache_policy, mmio_buffer_t* buffer);
+zx_status_t iwl_pci_map_bar_buffer(struct iwl_pci_fidl* fidl, uint32_t bar_id,
+                                   uint32_t cache_policy, MMIO_PTR void** buffer);
 
 struct zx_device;