Blame view
arch/ia64/kernel/cyclone.c
2.95 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 |
#include <linux/module.h> #include <linux/smp.h> #include <linux/time.h> #include <linux/errno.h> |
4e57b6817 [PATCH] fix missi... |
5 |
#include <linux/timex.h> |
0aa366f35 [IA64] Convert to... |
6 |
#include <linux/clocksource.h> |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <asm/io.h> /* IBM Summit (EXA) Cyclone counter code*/ #define CYCLONE_CBAR_ADDR 0xFEB00CD0 #define CYCLONE_PMCC_OFFSET 0x51A0 #define CYCLONE_MPMC_OFFSET 0x51D0 #define CYCLONE_MPCS_OFFSET 0x51A8 #define CYCLONE_TIMER_FREQ 100000000 int use_cyclone; void __init cyclone_setup(void) { use_cyclone = 1; } |
0aa366f35 [IA64] Convert to... |
21 |
static void __iomem *cyclone_mc; |
1da177e4c Linux-2.6.12-rc2 |
22 |
|
8e19608e8 clocksource: pass... |
23 |
static cycle_t read_cyclone(struct clocksource *cs) |
0aa366f35 [IA64] Convert to... |
24 25 26 27 28 29 30 31 32 |
{ return (cycle_t)readq((void __iomem *)cyclone_mc); } static struct clocksource clocksource_cyclone = { .name = "cyclone", .rating = 300, .read = read_cyclone, .mask = (1LL << 40) - 1, |
0aa366f35 [IA64] Convert to... |
33 |
.flags = CLOCK_SOURCE_IS_CONTINUOUS, |
1da177e4c Linux-2.6.12-rc2 |
34 35 36 37 |
}; int __init init_cyclone_clock(void) { |
6aa8b0497 cyclone.c: silly ... |
38 |
u64 __iomem *reg; |
1da177e4c Linux-2.6.12-rc2 |
39 40 41 |
u64 base; /* saved cyclone base address */ u64 offset; /* offset from pageaddr to cyclone_timer register */ int i; |
6aa8b0497 cyclone.c: silly ... |
42 |
u32 __iomem *cyclone_timer; /* Cyclone MPMC0 register */ |
1da177e4c Linux-2.6.12-rc2 |
43 44 |
if (!use_cyclone) |
6c5e62159 [IA64] don't repo... |
45 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
46 47 48 49 50 51 |
printk(KERN_INFO "Summit chipset: Starting Cyclone Counter. "); /* find base address */ offset = (CYCLONE_CBAR_ADDR); |
6aa8b0497 cyclone.c: silly ... |
52 |
reg = ioremap_nocache(offset, sizeof(u64)); |
1da177e4c Linux-2.6.12-rc2 |
53 |
if(!reg){ |
0aa366f35 [IA64] Convert to... |
54 55 56 |
printk(KERN_ERR "Summit chipset: Could not find valid CBAR" " register. "); |
1da177e4c Linux-2.6.12-rc2 |
57 58 59 60 |
use_cyclone = 0; return -ENODEV; } base = readq(reg); |
ddad53ee8 [IA64] Fix missin... |
61 |
iounmap(reg); |
1da177e4c Linux-2.6.12-rc2 |
62 |
if(!base){ |
0aa366f35 [IA64] Convert to... |
63 64 65 |
printk(KERN_ERR "Summit chipset: Could not find valid CBAR" " value. "); |
1da177e4c Linux-2.6.12-rc2 |
66 67 68 |
use_cyclone = 0; return -ENODEV; } |
1da177e4c Linux-2.6.12-rc2 |
69 70 71 |
/* setup PMCC */ offset = (base + CYCLONE_PMCC_OFFSET); |
6aa8b0497 cyclone.c: silly ... |
72 |
reg = ioremap_nocache(offset, sizeof(u64)); |
1da177e4c Linux-2.6.12-rc2 |
73 |
if(!reg){ |
0aa366f35 [IA64] Convert to... |
74 75 76 |
printk(KERN_ERR "Summit chipset: Could not find valid PMCC" " register. "); |
1da177e4c Linux-2.6.12-rc2 |
77 78 79 80 81 82 83 84 |
use_cyclone = 0; return -ENODEV; } writel(0x00000001,reg); iounmap(reg); /* setup MPCS */ offset = (base + CYCLONE_MPCS_OFFSET); |
6aa8b0497 cyclone.c: silly ... |
85 |
reg = ioremap_nocache(offset, sizeof(u64)); |
1da177e4c Linux-2.6.12-rc2 |
86 |
if(!reg){ |
0aa366f35 [IA64] Convert to... |
87 88 89 |
printk(KERN_ERR "Summit chipset: Could not find valid MPCS" " register. "); |
1da177e4c Linux-2.6.12-rc2 |
90 91 92 93 94 95 96 97 |
use_cyclone = 0; return -ENODEV; } writel(0x00000001,reg); iounmap(reg); /* map in cyclone_timer */ offset = (base + CYCLONE_MPMC_OFFSET); |
6aa8b0497 cyclone.c: silly ... |
98 |
cyclone_timer = ioremap_nocache(offset, sizeof(u32)); |
1da177e4c Linux-2.6.12-rc2 |
99 |
if(!cyclone_timer){ |
0aa366f35 [IA64] Convert to... |
100 101 102 |
printk(KERN_ERR "Summit chipset: Could not find valid MPMC" " register. "); |
1da177e4c Linux-2.6.12-rc2 |
103 104 105 106 107 108 109 110 111 112 |
use_cyclone = 0; return -ENODEV; } /*quick test to make sure its ticking*/ for(i=0; i<3; i++){ u32 old = readl(cyclone_timer); int stall = 100; while(stall--) barrier(); if(readl(cyclone_timer) == old){ |
0aa366f35 [IA64] Convert to... |
113 114 115 |
printk(KERN_ERR "Summit chipset: Counter not counting!" " DISABLED "); |
1da177e4c Linux-2.6.12-rc2 |
116 |
iounmap(cyclone_timer); |
6aa8b0497 cyclone.c: silly ... |
117 |
cyclone_timer = NULL; |
1da177e4c Linux-2.6.12-rc2 |
118 119 120 121 122 |
use_cyclone = 0; return -ENODEV; } } /* initialize last tick */ |
0aa366f35 [IA64] Convert to... |
123 |
cyclone_mc = cyclone_timer; |
574c44fa8 ia64: Replace clo... |
124 |
clocksource_cyclone.archdata.fsys_mmio = cyclone_timer; |
d60c30417 ia64: convert to ... |
125 |
clocksource_register_hz(&clocksource_cyclone, CYCLONE_TIMER_FREQ); |
1da177e4c Linux-2.6.12-rc2 |
126 127 128 129 130 |
return 0; } __initcall(init_cyclone_clock); |