summaryrefslogtreecommitdiff
path: root/pci-arbiter/pci_access.h
diff options
context:
space:
mode:
authorJoan Lledó <joanlluislledo@gmail.com>2018-01-16 12:54:28 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-10-30 00:47:36 +0100
commita830bef66e689f6f1defa9988f257a7ec2bb034d (patch)
tree3d49249a05195148fc8a8e6a84f9c56b46dbab7b /pci-arbiter/pci_access.h
parent6783a1b124eff9383571dfd4b5e83a03ee63866a (diff)
PCI Arbiter
Diffstat (limited to 'pci-arbiter/pci_access.h')
-rw-r--r--pci-arbiter/pci_access.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/pci-arbiter/pci_access.h b/pci-arbiter/pci_access.h
new file mode 100644
index 00000000..cf42cf62
--- /dev/null
+++ b/pci-arbiter/pci_access.h
@@ -0,0 +1,187 @@
+/*
+ * (C) Copyright IBM Corporation 2006
+ * Copyright 2009 Red Hat, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+/*
+ * Copyright (c) 2007 Paulo R. Zanoni, Tiago Vignatti
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+/*
+ * PCI access general header.
+ *
+ * Following code is borrowed from libpciaccess:
+ * https://cgit.freedesktop.org/xorg/lib/libpciaccess/
+ */
+
+#ifndef PCI_ACCESS_H
+#define PCI_ACCESS_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <errno.h>
+
+typedef uint64_t pciaddr_t;
+
+/*
+ * BAR descriptor for a PCI device.
+ */
+struct pci_mem_region
+{
+ /*
+ * When the region is mapped, this is the pointer to the memory.
+ */
+ void *memory;
+
+ /*
+ * Base physical address of the region from the CPU's point of view.
+ *
+ * This address is typically passed to \c pci_device_map_range to create
+ * a mapping of the region to the CPU's virtual address space.
+ */
+ pciaddr_t base_addr;
+
+
+ /*
+ * Size, in bytes, of the region.
+ */
+ pciaddr_t size;
+
+
+ /*
+ * Is the region I/O ports or memory?
+ */
+ unsigned is_IO:1;
+
+ /*
+ * Is the memory region prefetchable?
+ *
+ * \note
+ * This can only be set if \c is_IO is not set.
+ */
+ unsigned is_prefetchable:1;
+
+
+ /*
+ * Is the memory at a 64-bit address?
+ *
+ * \note
+ * This can only be set if \c is_IO is not set.
+ */
+ unsigned is_64:1;
+};
+
+/*
+ * PCI device.
+ *
+ * Contains all of the information about a particular PCI device.
+ */
+struct pci_device
+{
+ /*
+ * Complete bus identification, including domain, of the device. On
+ * platforms that do not support PCI domains (e.g., 32-bit x86 hardware),
+ * the domain will always be zero.
+ */
+ uint16_t domain;
+ uint8_t bus;
+ uint8_t dev;
+ uint8_t func;
+
+ /*
+ * Device's class, subclass, and programming interface packed into a
+ * single 32-bit value. The class is at bits [23:16], subclass is at
+ * bits [15:8], and programming interface is at [7:0].
+ */
+ uint32_t device_class;
+
+ /*
+ * BAR descriptors for the device.
+ */
+ struct pci_mem_region regions[6];
+
+ /*
+ * Size, in bytes, of the device's expansion ROM.
+ */
+ pciaddr_t rom_size;
+
+ /*
+ * Physical address of the ROM
+ */
+ pciaddr_t rom_base;
+
+ /*
+ * Mapped ROM
+ */
+ void *rom_memory;
+
+ /*
+ * Size of the configuration space
+ */
+ size_t config_size;
+};
+
+typedef error_t (*pci_io_op_t) (unsigned bus, unsigned dev, unsigned func,
+ pciaddr_t reg, void *data, unsigned size);
+
+typedef error_t (*pci_refresh_dev_op_t) (struct pci_device * dev,
+ int num_region, int rom);
+
+/* Global PCI data */
+struct pci_system
+{
+ size_t num_devices;
+ struct pci_device *devices;
+
+ /* Callbacks */
+ pci_io_op_t read;
+ pci_io_op_t write;
+ pci_refresh_dev_op_t device_refresh;
+};
+
+struct pci_system *pci_sys;
+
+int pci_system_init (void);
+
+#endif /* PCI_ACCESS_H */