diff options
Diffstat (limited to 'arch/sparc64/kernel/starfire.c')
-rw-r--r-- | arch/sparc64/kernel/starfire.c | 116 |
1 files changed, 0 insertions, 116 deletions
diff --git a/arch/sparc64/kernel/starfire.c b/arch/sparc64/kernel/starfire.c deleted file mode 100644 index 060d0f3a6151..000000000000 --- a/arch/sparc64/kernel/starfire.c +++ /dev/null | |||
@@ -1,116 +0,0 @@ | |||
1 | /* | ||
2 | * starfire.c: Starfire/E10000 support. | ||
3 | * | ||
4 | * Copyright (C) 1998 David S. Miller (davem@redhat.com) | ||
5 | * Copyright (C) 2000 Anton Blanchard (anton@samba.org) | ||
6 | */ | ||
7 | |||
8 | #include <linux/kernel.h> | ||
9 | #include <linux/slab.h> | ||
10 | |||
11 | #include <asm/page.h> | ||
12 | #include <asm/oplib.h> | ||
13 | #include <asm/smp.h> | ||
14 | #include <asm/upa.h> | ||
15 | #include <asm/starfire.h> | ||
16 | |||
17 | /* | ||
18 | * A few places around the kernel check this to see if | ||
19 | * they need to call us to do things in a Starfire specific | ||
20 | * way. | ||
21 | */ | ||
22 | int this_is_starfire = 0; | ||
23 | |||
24 | void check_if_starfire(void) | ||
25 | { | ||
26 | int ssnode = prom_finddevice("/ssp-serial"); | ||
27 | if (ssnode != 0 && ssnode != -1) | ||
28 | this_is_starfire = 1; | ||
29 | } | ||
30 | |||
31 | int starfire_hard_smp_processor_id(void) | ||
32 | { | ||
33 | return upa_readl(0x1fff40000d0UL); | ||
34 | } | ||
35 | |||
36 | /* | ||
37 | * Each Starfire board has 32 registers which perform translation | ||
38 | * and delivery of traditional interrupt packets into the extended | ||
39 | * Starfire hardware format. Essentially UPAID's now have 2 more | ||
40 | * bits than in all previous Sun5 systems. | ||
41 | */ | ||
42 | struct starfire_irqinfo { | ||
43 | unsigned long imap_slots[32]; | ||
44 | unsigned long tregs[32]; | ||
45 | struct starfire_irqinfo *next; | ||
46 | int upaid, hwmid; | ||
47 | }; | ||
48 | |||
49 | static struct starfire_irqinfo *sflist = NULL; | ||
50 | |||
51 | /* Beam me up Scott(McNeil)y... */ | ||
52 | void starfire_hookup(int upaid) | ||
53 | { | ||
54 | struct starfire_irqinfo *p; | ||
55 | unsigned long treg_base, hwmid, i; | ||
56 | |||
57 | p = kmalloc(sizeof(*p), GFP_KERNEL); | ||
58 | if (!p) { | ||
59 | prom_printf("starfire_hookup: No memory, this is insane.\n"); | ||
60 | prom_halt(); | ||
61 | } | ||
62 | treg_base = 0x100fc000000UL; | ||
63 | hwmid = ((upaid & 0x3c) << 1) | | ||
64 | ((upaid & 0x40) >> 4) | | ||
65 | (upaid & 0x3); | ||
66 | p->hwmid = hwmid; | ||
67 | treg_base += (hwmid << 33UL); | ||
68 | treg_base += 0x200UL; | ||
69 | for (i = 0; i < 32; i++) { | ||
70 | p->imap_slots[i] = 0UL; | ||
71 | p->tregs[i] = treg_base + (i * 0x10UL); | ||
72 | /* Lets play it safe and not overwrite existing mappings */ | ||
73 | if (upa_readl(p->tregs[i]) != 0) | ||
74 | p->imap_slots[i] = 0xdeadbeaf; | ||
75 | } | ||
76 | p->upaid = upaid; | ||
77 | p->next = sflist; | ||
78 | sflist = p; | ||
79 | } | ||
80 | |||
81 | unsigned int starfire_translate(unsigned long imap, | ||
82 | unsigned int upaid) | ||
83 | { | ||
84 | struct starfire_irqinfo *p; | ||
85 | unsigned int bus_hwmid; | ||
86 | unsigned int i; | ||
87 | |||
88 | bus_hwmid = (((unsigned long)imap) >> 33) & 0x7f; | ||
89 | for (p = sflist; p != NULL; p = p->next) | ||
90 | if (p->hwmid == bus_hwmid) | ||
91 | break; | ||
92 | if (p == NULL) { | ||
93 | prom_printf("XFIRE: Cannot find irqinfo for imap %016lx\n", | ||
94 | ((unsigned long)imap)); | ||
95 | prom_halt(); | ||
96 | } | ||
97 | for (i = 0; i < 32; i++) { | ||
98 | if (p->imap_slots[i] == imap || | ||
99 | p->imap_slots[i] == 0UL) | ||
100 | break; | ||
101 | } | ||
102 | if (i == 32) { | ||
103 | printk("starfire_translate: Are you kidding me?\n"); | ||
104 | panic("Lucy in the sky...."); | ||
105 | } | ||
106 | p->imap_slots[i] = imap; | ||
107 | |||
108 | /* map to real upaid */ | ||
109 | upaid = (((upaid & 0x3c) << 1) | | ||
110 | ((upaid & 0x40) >> 4) | | ||
111 | (upaid & 0x3)); | ||
112 | |||
113 | upa_writel(upaid, p->tregs[i]); | ||
114 | |||
115 | return i; | ||
116 | } | ||