[libpciaccess,1/2] Add map_legacy interface

Submitted by Adam Jackson on May 11, 2011, 4:56 a.m.

Details

Message ID 1305064595-9260-1-git-send-email-ajax@redhat.com
State Superseded, archived
Headers show

Not browsing as part of any series.

Commit Message

Adam Jackson May 11, 2011, 4:56 a.m.
This allows platforms to hand back mmaps of the low 1M (ISA) address
space on a per-domain basis.

Signed-off-by: Adam Jackson <ajax@redhat.com>
---
 include/pciaccess.h     |    8 ++++++++
 src/common_interface.c  |   43 +++++++++++++++++++++++++++++++++++++++++++
 src/pciaccess_private.h |    3 +++
 3 files changed, 54 insertions(+), 0 deletions(-)

Patch hide | download patch | download mbox

diff --git a/include/pciaccess.h b/include/pciaccess.h
index 88515e2..b7795b9 100644
--- a/include/pciaccess.h
+++ b/include/pciaccess.h
@@ -526,4 +526,12 @@  void pci_io_write32(struct pci_io_handle *handle, uint32_t reg, uint32_t data);
 void pci_io_write16(struct pci_io_handle *handle, uint32_t reg, uint16_t data);
 void pci_io_write8(struct pci_io_handle *handle, uint32_t reg, uint8_t data);
 
+/*
+ * Legacy memory access
+ */
+
+int pci_device_map_legacy(struct pci_device *dev, pciaddr_t base,
+			  pciaddr_t size, int write_enable, void **addr);
+int pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size);
+
 #endif /* PCIACCESS_H */
diff --git a/src/common_interface.c b/src/common_interface.c
index 4af772a..fe3c1af 100644
--- a/src/common_interface.c
+++ b/src/common_interface.c
@@ -32,6 +32,7 @@ 
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <sys/mman.h>
 
 #include "pciaccess.h"
 #include "pciaccess_private.h"
@@ -654,3 +655,45 @@  pci_device_enable(struct pci_device *dev)
     if (pci_sys->methods->enable)
 	pci_sys->methods->enable(dev);
 }
+
+/**
+ * Map the legacy memory space for the PCI domain containing \c dev.
+ *
+ * \param dev          Device whose memory region is to be mapped.
+ * \param base         Base address of the range to be mapped.
+ * \param size         Size of the range to be mapped.
+ * \param write_enable Map for writing (non-zero).
+ * \param addr         Location to store the mapped address.
+ *
+ * \returns
+ * Zero on success or an \c errno value on failure.
+ */
+int
+pci_device_map_legacy(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
+		      int write_enable, void **addr)
+{
+    if (base > 1048576 || base + size > 1048576)
+	return EINVAL;
+
+    if (!pci_sys->methods->map_legacy)
+	return ENOSYS;
+
+    return pci_sys->methods->map_legacy(dev, base, size, write_enable, addr);
+}
+
+/**
+ * Unmap the legacy memory space for the PCI domain containing \c dev.
+ *
+ * \param dev          Device whose memory region is to be unmapped.
+ * \param addr         Location of the mapped address.
+ * \param size         Size of the range to be unmapped.
+ *
+ * \returns
+ * Zero on success or an \c errno value on failure.
+ */
+int
+pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size)
+{
+    /* Maybe vtable this?  Meh. */
+    return munmap(addr, size);
+}
diff --git a/src/pciaccess_private.h b/src/pciaccess_private.h
index 1111ef0..7870395 100644
--- a/src/pciaccess_private.h
+++ b/src/pciaccess_private.h
@@ -77,6 +77,9 @@  struct pci_system_methods {
     void (*write16)( struct pci_io_handle *handle, uint32_t reg,
 		     uint16_t data );
     void (*write8)( struct pci_io_handle *handle, uint32_t reg, uint8_t data );
+
+    int (*map_legacy)(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
+		      int write_enable, void **addr);
 };
 
 struct pci_device_mapping {

Comments

> From: Adam Jackson <ajax@redhat.com>
> Date: Tue, 10 May 2011 17:56:34 -0400
> 
> This allows platforms to hand back mmaps of the low 1M (ISA) address
> space on a per-domain basis.

Any reason why you chose to have an explicit "write_enable" flag
instead of using the standard "map_flags" used in the non-legacy
pci_device_map_range() interface?

> Signed-off-by: Adam Jackson <ajax@redhat.com>
> ---
>  include/pciaccess.h     |    8 ++++++++
>  src/common_interface.c  |   43 +++++++++++++++++++++++++++++++++++++++++++
>  src/pciaccess_private.h |    3 +++
>  3 files changed, 54 insertions(+), 0 deletions(-)
> 
> diff --git a/include/pciaccess.h b/include/pciaccess.h
> index 88515e2..b7795b9 100644
> --- a/include/pciaccess.h
> +++ b/include/pciaccess.h
> @@ -526,4 +526,12 @@ void pci_io_write32(struct pci_io_handle *handle, uint32_t reg, uint32_t data);
>  void pci_io_write16(struct pci_io_handle *handle, uint32_t reg, uint16_t data);
>  void pci_io_write8(struct pci_io_handle *handle, uint32_t reg, uint8_t data);
>  
> +/*
> + * Legacy memory access
> + */
> +
> +int pci_device_map_legacy(struct pci_device *dev, pciaddr_t base,
> +			  pciaddr_t size, int write_enable, void **addr);
> +int pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size);
> +
>  #endif /* PCIACCESS_H */
> diff --git a/src/common_interface.c b/src/common_interface.c
> index 4af772a..fe3c1af 100644
> --- a/src/common_interface.c
> +++ b/src/common_interface.c
> @@ -32,6 +32,7 @@
>  #include <stdlib.h>
>  #include <string.h>
>  #include <errno.h>
> +#include <sys/mman.h>
>  
>  #include "pciaccess.h"
>  #include "pciaccess_private.h"
> @@ -654,3 +655,45 @@ pci_device_enable(struct pci_device *dev)
>      if (pci_sys->methods->enable)
>  	pci_sys->methods->enable(dev);
>  }
> +
> +/**
> + * Map the legacy memory space for the PCI domain containing \c dev.
> + *
> + * \param dev          Device whose memory region is to be mapped.
> + * \param base         Base address of the range to be mapped.
> + * \param size         Size of the range to be mapped.
> + * \param write_enable Map for writing (non-zero).
> + * \param addr         Location to store the mapped address.
> + *
> + * \returns
> + * Zero on success or an \c errno value on failure.
> + */
> +int
> +pci_device_map_legacy(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
> +		      int write_enable, void **addr)
> +{
> +    if (base > 1048576 || base + size > 1048576)
> +	return EINVAL;
> +
> +    if (!pci_sys->methods->map_legacy)
> +	return ENOSYS;
> +
> +    return pci_sys->methods->map_legacy(dev, base, size, write_enable, addr);
> +}
> +
> +/**
> + * Unmap the legacy memory space for the PCI domain containing \c dev.
> + *
> + * \param dev          Device whose memory region is to be unmapped.
> + * \param addr         Location of the mapped address.
> + * \param size         Size of the range to be unmapped.
> + *
> + * \returns
> + * Zero on success or an \c errno value on failure.
> + */
> +int
> +pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size)
> +{
> +    /* Maybe vtable this?  Meh. */
> +    return munmap(addr, size);
> +}
> diff --git a/src/pciaccess_private.h b/src/pciaccess_private.h
> index 1111ef0..7870395 100644
> --- a/src/pciaccess_private.h
> +++ b/src/pciaccess_private.h
> @@ -77,6 +77,9 @@ struct pci_system_methods {
>      void (*write16)( struct pci_io_handle *handle, uint32_t reg,
>  		     uint16_t data );
>      void (*write8)( struct pci_io_handle *handle, uint32_t reg, uint8_t data );
> +
> +    int (*map_legacy)(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
> +		      int write_enable, void **addr);
>  };
>  
>  struct pci_device_mapping {
> -- 
> 1.7.5
> 
> _______________________________________________
> xorg-devel@lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
On May 10, 2011, at 23:23, Mark Kettenis wrote:

>> From: Adam Jackson <ajax@redhat.com>
>> Date: Tue, 10 May 2011 17:56:34 -0400
>> 
>> This allows platforms to hand back mmaps of the low 1M (ISA) address
>> space on a per-domain basis.
> 
> Any reason why you chose to have an explicit "write_enable" flag
> instead of using the standard "map_flags" used in the non-legacy
> pci_device_map_range() interface?

I'd also like to see the corresponding vtable changes for

pci_sys->methods->unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size)



> 
>> Signed-off-by: Adam Jackson <ajax@redhat.com>
>> ---
>> include/pciaccess.h     |    8 ++++++++
>> src/common_interface.c  |   43 +++++++++++++++++++++++++++++++++++++++++++
>> src/pciaccess_private.h |    3 +++
>> 3 files changed, 54 insertions(+), 0 deletions(-)
>> 
>> diff --git a/include/pciaccess.h b/include/pciaccess.h
>> index 88515e2..b7795b9 100644
>> --- a/include/pciaccess.h
>> +++ b/include/pciaccess.h
>> @@ -526,4 +526,12 @@ void pci_io_write32(struct pci_io_handle *handle, uint32_t reg, uint32_t data);
>> void pci_io_write16(struct pci_io_handle *handle, uint32_t reg, uint16_t data);
>> void pci_io_write8(struct pci_io_handle *handle, uint32_t reg, uint8_t data);
>> 
>> +/*
>> + * Legacy memory access
>> + */
>> +
>> +int pci_device_map_legacy(struct pci_device *dev, pciaddr_t base,
>> +			  pciaddr_t size, int write_enable, void **addr);
>> +int pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size);
>> +
>> #endif /* PCIACCESS_H */
>> diff --git a/src/common_interface.c b/src/common_interface.c
>> index 4af772a..fe3c1af 100644
>> --- a/src/common_interface.c
>> +++ b/src/common_interface.c
>> @@ -32,6 +32,7 @@
>> #include <stdlib.h>
>> #include <string.h>
>> #include <errno.h>
>> +#include <sys/mman.h>
>> 
>> #include "pciaccess.h"
>> #include "pciaccess_private.h"
>> @@ -654,3 +655,45 @@ pci_device_enable(struct pci_device *dev)
>>     if (pci_sys->methods->enable)
>> 	pci_sys->methods->enable(dev);
>> }
>> +
>> +/**
>> + * Map the legacy memory space for the PCI domain containing \c dev.
>> + *
>> + * \param dev          Device whose memory region is to be mapped.
>> + * \param base         Base address of the range to be mapped.
>> + * \param size         Size of the range to be mapped.
>> + * \param write_enable Map for writing (non-zero).
>> + * \param addr         Location to store the mapped address.
>> + *
>> + * \returns
>> + * Zero on success or an \c errno value on failure.
>> + */
>> +int
>> +pci_device_map_legacy(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
>> +		      int write_enable, void **addr)
>> +{
>> +    if (base > 1048576 || base + size > 1048576)
>> +	return EINVAL;
>> +
>> +    if (!pci_sys->methods->map_legacy)
>> +	return ENOSYS;
>> +
>> +    return pci_sys->methods->map_legacy(dev, base, size, write_enable, addr);
>> +}
>> +
>> +/**
>> + * Unmap the legacy memory space for the PCI domain containing \c dev.
>> + *
>> + * \param dev          Device whose memory region is to be unmapped.
>> + * \param addr         Location of the mapped address.
>> + * \param size         Size of the range to be unmapped.
>> + *
>> + * \returns
>> + * Zero on success or an \c errno value on failure.
>> + */
>> +int
>> +pci_device_unmap_legacy(struct pci_device *dev, void *addr, pciaddr_t size)
>> +{
>> +    /* Maybe vtable this?  Meh. */
>> +    return munmap(addr, size);
>> +}
>> diff --git a/src/pciaccess_private.h b/src/pciaccess_private.h
>> index 1111ef0..7870395 100644
>> --- a/src/pciaccess_private.h
>> +++ b/src/pciaccess_private.h
>> @@ -77,6 +77,9 @@ struct pci_system_methods {
>>     void (*write16)( struct pci_io_handle *handle, uint32_t reg,
>> 		     uint16_t data );
>>     void (*write8)( struct pci_io_handle *handle, uint32_t reg, uint8_t data );
>> +
>> +    int (*map_legacy)(struct pci_device *dev, pciaddr_t base, pciaddr_t size,
>> +		      int write_enable, void **addr);
>> };
>> 
>> struct pci_device_mapping {
>> -- 
>> 1.7.5
>> 
>> _______________________________________________
>> xorg-devel@lists.x.org: X.Org development
>> Archives: http://lists.x.org/archives/xorg-devel
>> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>> 
> _______________________________________________
> xorg-devel@lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>