summaryrefslogtreecommitdiff
path: root/contrib/libdha/sysdep/pci_ia64.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libdha/sysdep/pci_ia64.c')
-rw-r--r--contrib/libdha/sysdep/pci_ia64.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/contrib/libdha/sysdep/pci_ia64.c b/contrib/libdha/sysdep/pci_ia64.c
new file mode 100644
index 000000000..ef2074ab2
--- /dev/null
+++ b/contrib/libdha/sysdep/pci_ia64.c
@@ -0,0 +1,123 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+static int pci_config_type( void )
+{
+ unsigned long tmplong1, tmplong2;
+ unsigned char tmp1, tmp2;
+ int retval;
+ retval = 0;
+
+ OUTPORT8(PCI_MODE2_ENABLE_REG, 0x00);
+ OUTPORT8(PCI_MODE2_FORWARD_REG, 0x00);
+ tmp1 = INPORT8(PCI_MODE2_ENABLE_REG);
+ tmp2 = INPORT8(PCI_MODE2_FORWARD_REG);
+ if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
+ retval = 2;
+ /*printf("PCI says configuration type 2\n");*/
+ } else {
+ tmplong1 = INPORT32(PCI_MODE1_ADDRESS_REG);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, PCI_EN);
+ tmplong2 = INPORT32(PCI_MODE1_ADDRESS_REG);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, tmplong1);
+ if (tmplong2 == PCI_EN) {
+ retval = 1;
+ /*printf("PCI says configuration type 1\n");*/
+ } else {
+ /*printf("No PCI !\n");*/
+ disable_app_io();
+ /*exit(1);*/
+ retval = 0xFFFF;
+ }
+ }
+ return retval;
+}
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd);
+ return INPORT32(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return INPORT32(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_word(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return INPORT16(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_byte(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return INPORT8(PCI_MODE1_DATA_REG);
+}
+
+static void pci_config_write_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd,
+ long val)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ OUTPORT32(PCI_MODE1_DATA_REG,val);
+}
+
+static void pci_config_write_word(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd,
+ long val)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ OUTPORT16(PCI_MODE1_DATA_REG,val);
+}
+
+static void pci_config_write_byte(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd,
+ long val)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ OUTPORT32(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ OUTPORT8(PCI_MODE1_DATA_REG,val);
+}