|
@@ -0,0 +1,118 @@
|
|
|
+/*
|
|
|
+ * linux/arch/alpha/kernel/core_marvel.c
|
|
|
+ *
|
|
|
+ * Code common to all Marvel based systems.
|
|
|
+ */
|
|
|
+
|
|
|
+#define __EXTERN_INLINE inline
|
|
|
+#include <asm/io.h>
|
|
|
+#include <asm/core_marvel.h>
|
|
|
+#undef __EXTERN_INLINE
|
|
|
+
|
|
|
+#include <linux/types.h>
|
|
|
+#include <linux/pci.h>
|
|
|
+#include <linux/sched.h>
|
|
|
+#include <linux/init.h>
|
|
|
+#include <linux/vmalloc.h>
|
|
|
+#include <linux/mc146818rtc.h>
|
|
|
+#include <linux/rtc.h>
|
|
|
+#include <linux/module.h>
|
|
|
+#include <linux/bootmem.h>
|
|
|
+
|
|
|
+#include <asm/ptrace.h>
|
|
|
+#include <asm/smp.h>
|
|
|
+#include <asm/gct.h>
|
|
|
+#include <asm/pgalloc.h>
|
|
|
+#include <asm/tlbflush.h>
|
|
|
+#include <asm/rtc.h>
|
|
|
+#include <asm/vga.h>
|
|
|
+
|
|
|
+#include "proto.h"
|
|
|
+#include "pci_impl.h"
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Debug helpers
|
|
|
+ */
|
|
|
+#define DEBUG_CONFIG 0
|
|
|
+
|
|
|
+#if DEBUG_CONFIG
|
|
|
+# define DBG_CFG(args) printk args
|
|
|
+#else
|
|
|
+# define DBG_CFG(args)
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Private data
|
|
|
+ */
|
|
|
+static struct io7 *io7_head = NULL;
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Helper functions
|
|
|
+ */
|
|
|
+static unsigned long __attribute__ ((unused))
|
|
|
+read_ev7_csr(int pe, unsigned long offset)
|
|
|
+{
|
|
|
+ ev7_csr *ev7csr = EV7_CSR_KERN(pe, offset);
|
|
|
+ unsigned long q;
|
|
|
+
|
|
|
+ mb();
|
|
|
+ q = ev7csr->csr;
|
|
|
+ mb();
|
|
|
+
|
|
|
+ return q;
|
|
|
+}
|
|
|
+
|
|
|
+static void __attribute__ ((unused))
|
|
|
+write_ev7_csr(int pe, unsigned long offset, unsigned long q)
|
|
|
+{
|
|
|
+ ev7_csr *ev7csr = EV7_CSR_KERN(pe, offset);
|
|
|
+
|
|
|
+ mb();
|
|
|
+ ev7csr->csr = q;
|
|
|
+ mb();
|
|
|
+}
|
|
|
+
|
|
|
+static char * __init
|
|
|
+mk_resource_name(int pe, int port, char *str)
|
|
|
+{
|
|
|
+ char tmp[80];
|
|
|
+ char *name;
|
|
|
+
|
|
|
+ sprintf(tmp, "PCI %s PE %d PORT %d", str, pe, port);
|
|
|
+ name = alloc_bootmem(strlen(tmp) + 1);
|
|
|
+ strcpy(name, tmp);
|
|
|
+
|
|
|
+ return name;
|
|
|
+}
|
|
|
+
|
|
|
+inline struct io7 *
|
|
|
+marvel_next_io7(struct io7 *prev)
|
|
|
+{
|
|
|
+ return (prev ? prev->next : io7_head);
|
|
|
+}
|
|
|
+
|
|
|
+struct io7 *
|
|
|
+marvel_find_io7(int pe)
|
|
|
+{
|
|
|
+ struct io7 *io7;
|
|
|
+
|
|
|
+ for (io7 = io7_head; io7 && io7->pe != pe; io7 = io7->next)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ return io7;
|
|
|
+}
|
|
|
+
|
|
|
+static struct io7 * __init
|
|
|
+alloc_io7(unsigned int pe)
|
|
|
+{
|
|
|
+ struct io7 *io7;
|
|
|
+ struct io7 *insp;
|
|
|
+ int h;
|
|
|
+
|
|
|
+ if (marvel_find_io7(pe)) {
|
|
|
+ printk(KERN_WARNING "IO7 at PE %d already allocated!\n", pe);
|
|
|
+ return NULL;
|
|
|
+ }
|