[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] pci-arbiter: Stop using deprecated region memory pointer
From: |
Joan Lledó |
Subject: |
[PATCH] pci-arbiter: Stop using deprecated region memory pointer |
Date: |
Sat, 8 Jan 2022 13:15:37 +0100 |
From: Joan Lledó <jlledom@member.fsf.org>
Use a internal array of pointers instead
* pci-arbiter/device_map.h:
* Update device_map_region() prototype
* Now it receives an output address as parameter
* pci-arbiter/device_map.c:
* Update device_map_region() definition to match the new prototype
* Support for legacy mappings
* When the base address is lower than 1 mb
* pci-arbiter/func_files.c:
* pci-arbiter/netfs_impl.c:
* Update calls to device_map_region to match the new prototype
* Use the internal array of pointers instead of region->memory
* pci-arbiter/pcifs.h:
* struct pcifs_dirent: Declare the internal array of pointers
---
pci-arbiter/device_map.c | 19 +++++++++++++++----
pci-arbiter/device_map.h | 2 +-
pci-arbiter/func_files.c | 6 +++---
pci-arbiter/netfs_impl.c | 8 +++++---
pci-arbiter/pcifs.h | 7 +++++++
5 files changed, 31 insertions(+), 11 deletions(-)
diff --git a/pci-arbiter/device_map.c b/pci-arbiter/device_map.c
index 216adfb9..1627746d 100644
--- a/pci-arbiter/device_map.c
+++ b/pci-arbiter/device_map.c
@@ -24,14 +24,25 @@
#include "device_map.h"
error_t
-device_map_region (struct pci_device *device, struct pci_mem_region *region)
+device_map_region (struct pci_device *device, struct pci_mem_region *region,
+ void **addr)
{
error_t err = 0;
- if (region->memory == 0)
+ if (*addr == 0)
{
- err = pci_device_map_range (device, region->base_addr, region->size,
- PCI_DEV_MAP_FLAG_WRITABLE, ®ion->memory);
+ /*
+ * We could use the non-legacy call for all ranges, but libpciaccess
+ * offers a call for ranges under 1Mb. We call it for those cases, even
+ * when there's no difference for us.
+ */
+ if (region->base_addr > 0x100000
+ || region->base_addr + region->size > 0x100000)
+ err = pci_device_map_range (device, region->base_addr, region->size,
+ PCI_DEV_MAP_FLAG_WRITABLE, addr);
+ else
+ err = pci_device_map_legacy (device, region->base_addr, region->size,
+ PCI_DEV_MAP_FLAG_WRITABLE, addr);
}
return err;
diff --git a/pci-arbiter/device_map.h b/pci-arbiter/device_map.h
index 9062e901..0d92650c 100644
--- a/pci-arbiter/device_map.h
+++ b/pci-arbiter/device_map.h
@@ -27,6 +27,6 @@
#include <pciaccess.h>
error_t device_map_region (struct pci_device *device,
- struct pci_mem_region *region);
+ struct pci_mem_region *region, void **addr);
#endif /* DEVICE_MAP_H */
diff --git a/pci-arbiter/func_files.c b/pci-arbiter/func_files.c
index 81ebfded..40706135 100644
--- a/pci-arbiter/func_files.c
+++ b/pci-arbiter/func_files.c
@@ -205,13 +205,13 @@ io_region_file (struct pcifs_dirent * e, off_t offset,
size_t * len,
else
{
/* Ensure the region is mapped */
- err = device_map_region (e->device, region);
+ err = device_map_region (e->device, region, &e->region_maps[reg_num]);
if (err)
return err;
if (read)
- memcpy (data, region->memory + offset, *len);
+ memcpy (data, e->region_maps[reg_num] + offset, *len);
else
- memcpy (region->memory + offset, data, *len);
+ memcpy (e->region_maps[reg_num] + offset, data, *len);
}
return err;
diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c
index 8b4bd22b..63f8354e 100644
--- a/pci-arbiter/netfs_impl.c
+++ b/pci-arbiter/netfs_impl.c
@@ -591,15 +591,17 @@ netfs_get_filemap (struct node *node, vm_prot_t prot)
region = &node->nn->ln->device->regions[reg_num];
/* Ensure the region is mapped */
- err = device_map_region (node->nn->ln->device, region);
+ err = device_map_region (node->nn->ln->device, region,
+ &node->nn->ln->region_maps[reg_num]);
if (err)
return err;
/* Create a new memory object proxy with the required protection */
max_prot = (VM_PROT_READ | VM_PROT_WRITE) & prot;
err =
- vm_region_create_proxy(mach_task_self (), (vm_address_t)region->memory,
- max_prot, region->size, &proxy);
+ vm_region_create_proxy(mach_task_self (),
+ (vm_address_t)node->nn->ln->region_maps[reg_num],
+ max_prot, region->size, &proxy);
if (err)
goto error;
diff --git a/pci-arbiter/pcifs.h b/pci-arbiter/pcifs.h
index 18f2141c..050c9e32 100644
--- a/pci-arbiter/pcifs.h
+++ b/pci-arbiter/pcifs.h
@@ -91,6 +91,13 @@ struct pcifs_dirent
* Only for entries having a full B/D/F address.
*/
struct pci_device *device;
+
+ /*
+ * Array of addresses where regions are mapped
+ *
+ * Only when a device is present
+ */
+ void *region_maps[6];
};
/*
--
2.31.1