Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
582f31c5
Commit
582f31c5
authored
Sep 12, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/sparc-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
d8c94048
16c186ac
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
164 additions
and
261 deletions
+164
-261
arch/sparc64/Kconfig
arch/sparc64/Kconfig
+4
-0
arch/sparc64/kernel/etrap.S
arch/sparc64/kernel/etrap.S
+151
-150
arch/sparc64/kernel/time.c
arch/sparc64/kernel/time.c
+9
-111
No files found.
arch/sparc64/Kconfig
View file @
582f31c5
...
...
@@ -12,6 +12,10 @@ config MMU
bool
default y
config TIME_INTERPOLATION
bool
default y
source "init/Kconfig"
menu "General machine setup"
...
...
arch/sparc64/kernel/etrap.S
View file @
582f31c5
This diff is collapsed.
Click to expand it.
arch/sparc64/kernel/time.c
View file @
582f31c5
...
...
@@ -431,7 +431,6 @@ static struct sparc64_tick_ops hbtick_operations = {
unsigned
long
timer_tick_offset
;
unsigned
long
timer_tick_compare
;
static
unsigned
long
timer_ticks_per_usec_quotient
;
static
unsigned
long
timer_ticks_per_nsec_quotient
;
#define TICK_SIZE (tick_nsec / 1000)
...
...
@@ -1025,18 +1024,22 @@ static int sparc64_cpufreq_notifier(struct notifier_block *nb, unsigned long val
static
struct
notifier_block
sparc64_cpufreq_notifier_block
=
{
.
notifier_call
=
sparc64_cpufreq_notifier
};
#endif
#endif
/* CONFIG_CPU_FREQ */
static
struct
time_interpolator
sparc64_cpu_interpolator
=
{
.
source
=
TIME_SOURCE_CPU
,
.
shift
=
16
,
};
/* The quotient formula is taken from the IA64 port. */
#define SPARC64_USEC_PER_CYC_SHIFT 30UL
#define SPARC64_NSEC_PER_CYC_SHIFT 30UL
void
__init
time_init
(
void
)
{
unsigned
long
clock
=
sparc64_init_timers
(
timer_interrupt
);
timer_ticks_per_usec_quotient
=
(((
1000000UL
<<
SPARC64_USEC_PER_CYC_SHIFT
)
+
(
clock
/
2
))
/
clock
);
sparc64_cpu_interpolator
.
frequency
=
clock
;
register_time_interpolator
(
&
sparc64_cpu_interpolator
);
timer_ticks_per_nsec_quotient
=
(((
NSEC_PER_SEC
<<
SPARC64_NSEC_PER_CYC_SHIFT
)
+
...
...
@@ -1048,17 +1051,6 @@ void __init time_init(void)
#endif
}
static
__inline__
unsigned
long
do_gettimeoffset
(
void
)
{
unsigned
long
ticks
=
tick_ops
->
get_tick
();
ticks
+=
timer_tick_offset
;
ticks
-=
timer_tick_compare
;
return
(
ticks
*
timer_ticks_per_usec_quotient
)
>>
SPARC64_USEC_PER_CYC_SHIFT
;
}
unsigned
long
long
sched_clock
(
void
)
{
unsigned
long
ticks
=
tick_ops
->
get_tick
();
...
...
@@ -1067,100 +1059,6 @@ unsigned long long sched_clock(void)
>>
SPARC64_NSEC_PER_CYC_SHIFT
;
}
int
do_settimeofday
(
struct
timespec
*
tv
)
{
time_t
wtm_sec
,
sec
=
tv
->
tv_sec
;
long
wtm_nsec
,
nsec
=
tv
->
tv_nsec
;
if
((
unsigned
long
)
tv
->
tv_nsec
>=
NSEC_PER_SEC
)
return
-
EINVAL
;
if
(
this_is_starfire
)
return
0
;
write_seqlock_irq
(
&
xtime_lock
);
/*
* This is revolting. We need to set "xtime" correctly. However, the
* value in this location is the value at the most recent update of
* wall time. Discover what correction gettimeofday() would have
* made, and then undo it!
*/
nsec
-=
do_gettimeoffset
()
*
1000
;
nsec
-=
(
jiffies
-
wall_jiffies
)
*
(
NSEC_PER_SEC
/
HZ
);
wtm_sec
=
wall_to_monotonic
.
tv_sec
+
(
xtime
.
tv_sec
-
sec
);
wtm_nsec
=
wall_to_monotonic
.
tv_nsec
+
(
xtime
.
tv_nsec
-
nsec
);
set_normalized_timespec
(
&
xtime
,
sec
,
nsec
);
set_normalized_timespec
(
&
wall_to_monotonic
,
wtm_sec
,
wtm_nsec
);
time_adjust
=
0
;
/* stop active adjtime() */
time_status
|=
STA_UNSYNC
;
time_maxerror
=
NTP_PHASE_LIMIT
;
time_esterror
=
NTP_PHASE_LIMIT
;
write_sequnlock_irq
(
&
xtime_lock
);
clock_was_set
();
return
0
;
}
EXPORT_SYMBOL
(
do_settimeofday
);
/* Ok, my cute asm atomicity trick doesn't work anymore.
* There are just too many variables that need to be protected
* now (both members of xtime, wall_jiffies, et al.)
*/
void
do_gettimeofday
(
struct
timeval
*
tv
)
{
unsigned
long
seq
;
unsigned
long
usec
,
sec
;
unsigned
long
max_ntp_tick
=
tick_usec
-
tickadj
;
do
{
unsigned
long
lost
;
seq
=
read_seqbegin
(
&
xtime_lock
);
usec
=
do_gettimeoffset
();
lost
=
jiffies
-
wall_jiffies
;
/*
* If time_adjust is negative then NTP is slowing the clock
* so make sure not to go into next possible interval.
* Better to lose some accuracy than have time go backwards..
*/
if
(
unlikely
(
time_adjust
<
0
))
{
usec
=
min
(
usec
,
max_ntp_tick
);
if
(
lost
)
usec
+=
lost
*
max_ntp_tick
;
}
else
if
(
unlikely
(
lost
))
usec
+=
lost
*
tick_usec
;
sec
=
xtime
.
tv_sec
;
/* Believe it or not, this divide shows up on
* kernel profiles. The problem is that it is
* both 64-bit and signed. Happily, 32-bits
* of precision is all we really need and in
* doing so gcc ends up emitting a cheap multiply.
*
* XXX Why is tv_nsec 'long' and 'signed' in
* XXX the first place, can it even be negative?
*/
usec
+=
((
unsigned
int
)
xtime
.
tv_nsec
/
1000U
);
}
while
(
read_seqretry
(
&
xtime_lock
,
seq
));
while
(
usec
>=
1000000
)
{
usec
-=
1000000
;
sec
++
;
}
tv
->
tv_sec
=
sec
;
tv
->
tv_usec
=
usec
;
}
EXPORT_SYMBOL
(
do_gettimeofday
);
static
int
set_rtc_mmss
(
unsigned
long
nowtime
)
{
int
real_seconds
,
real_minutes
,
chip_minutes
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment