Commit c82281c0 authored by Dave Airlie's avatar Dave Airlie

Merge starflyer.(none):/home/airlied/bitkeeper/linux-2.5

into starflyer.(none):/home/airlied/bitkeeper/drm-test
parents cf092993 f2ddba8c
...@@ -35,8 +35,8 @@ CR31 (TR 7) Temporary register, used in various places ...@@ -35,8 +35,8 @@ CR31 (TR 7) Temporary register, used in various places
SR0 temporary space register SR0 temporary space register
SR4-SR7 set to 0 SR4-SR7 set to 0
SR1 temporary space register SR1 temporary space register
SR2 unused SR2 kernel should not clobber this
SR3 used for userspace accesses (current process)* SR3 used for userspace accesses (current process)
Space Registers (user mode) Space Registers (user mode)
...@@ -78,13 +78,8 @@ Shadow Registers used by interruption handler code ...@@ -78,13 +78,8 @@ Shadow Registers used by interruption handler code
TOC enable bit 1 TOC enable bit 1
========================================================================= =========================================================================
Info from John Marvin: Register usage notes, originally from John Marvin, with some additional
notes from Randolph Chung.
From: "John Marvin" <jsm@udlkern.fc.hp.com>
To: randolf@tausq.org
Subject: Re: parisc asm questions
[...]
For the general registers: For the general registers:
...@@ -111,9 +106,10 @@ that you should be aware of: ...@@ -111,9 +106,10 @@ that you should be aware of:
don't care about the values that were passed in anymore. don't care about the values that were passed in anymore.
r28,r29: are ret0 and ret1. They are what you pass return values r28,r29: are ret0 and ret1. They are what you pass return values
in. r28 is the primary return. I'm not sure I remember in. r28 is the primary return. When returning small structures
under what circumstances stuff is returned in r29 (millicode r29 may also be used to pass data back to the caller.
perhaps).
r30: stack pointer
r31: the ble instruction puts the return pointer in here. r31: the ble instruction puts the return pointer in here.
...@@ -123,6 +119,3 @@ r3-r18,r27,r30 need to be saved and restored. r3-r18 are just ...@@ -123,6 +119,3 @@ r3-r18,r27,r30 need to be saved and restored. r3-r18 are just
used to make references to global variables easier. r30 is used to make references to global variables easier. r30 is
the stack pointer. the stack pointer.
John
...@@ -9,32 +9,33 @@ The architecture specific code typically provides gettimeofday and ...@@ -9,32 +9,33 @@ The architecture specific code typically provides gettimeofday and
settimeofday under Linux. The time interpolator provides both if an arch settimeofday under Linux. The time interpolator provides both if an arch
defines CONFIG_TIME_INTERPOLATION. The arch still must set up timer tick defines CONFIG_TIME_INTERPOLATION. The arch still must set up timer tick
operations and call the necessary functions to advance the clock. operations and call the necessary functions to advance the clock.
With the time interpolator a standardized interface exists for time With the time interpolator a standardized interface exists for time
interpolation between ticks which also allows the determination interpolation between ticks. The provided logic is highly scalable
of time in a hardware independent way. The provided logic is highly scalable
and has been tested in SMP situations of up to 512 CPUs. and has been tested in SMP situations of up to 512 CPUs.
If CONFIG_TIME_INTERPOLATION is defined then the architecture specific code If CONFIG_TIME_INTERPOLATION is defined then the architecture specific code
(or the device drivers - like HPET) must register time interpolators. (or the device drivers - like HPET) may register time interpolators.
These are typically defined in the following way: These are typically defined in the following way:
static struct time_interpolator my_interpolator; static struct time_interpolator my_interpolator {
.frequency = MY_FREQUENCY,
.source = TIME_SOURCE_MMIO32,
.shift = 8, /* scaling for higher accuracy */
.drift = -1, /* Unknown drift */
.jitter = 0 /* time source is stable */
};
void time_init(void) void time_init(void)
{ {
.... ....
/* Initialization of the timer *. /* Initialization of the timer *.
my_interpolator.frequency = MY_FREQUENCY;
my_interpolator.source = TIME_SOURCE_MMIO32;
my_interpolator.address = &my_timer; my_interpolator.address = &my_timer;
my_interpolator.shift = 32; /* increase accuracy of scaling */
my_interpolator.drift = -1; /* Unknown */
my_interpolator.jitter = 0; /* A stable time source */
register_time_interpolator(&my_interpolator); register_time_interpolator(&my_interpolator);
.... ....
} }
For more details see include/linux/timex.h. For more details see include/linux/timex.h and kernel/timer.c.
Christoph Lameter <christoph@lameter.com>, September 8, 2004 Christoph Lameter <christoph@lameter.com>, October 31, 2004
...@@ -161,7 +161,6 @@ ...@@ -161,7 +161,6 @@
#define UDIV_NEEDS_NORMALIZATION 1 #define UDIV_NEEDS_NORMALIZATION 1
#define udiv_qrnnd __udiv_qrnnd_c #define udiv_qrnnd __udiv_qrnnd_c
extern const UQItype __clz_tab[];
#define count_leading_zeros(count, x) \ #define count_leading_zeros(count, x) \
do { \ do { \
USItype __xr = (x); \ USItype __xr = (x); \
......
if ARCH_H720X
menu "h720x Implementations" menu "h720x Implementations"
config ARCH_H7201 config ARCH_H7201
...@@ -25,3 +27,5 @@ config CPU_H7202 ...@@ -25,3 +27,5 @@ config CPU_H7202
bool bool
help help
Select code specific to h7202 variants Select code specific to h7202 variants
endif
...@@ -28,7 +28,6 @@ unsigned long iop3xx_pcibios_min_mem = 0; ...@@ -28,7 +28,6 @@ unsigned long iop3xx_pcibios_min_mem = 0;
* Default power-off for EP80219 * Default power-off for EP80219
*/ */
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/hardware.h>
static inline void ep80219_send_to_pic(__u8 c) { static inline void ep80219_send_to_pic(__u8 c) {
} }
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/device.h> #include <linux/device.h>
......
...@@ -33,10 +33,8 @@ ...@@ -33,10 +33,8 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/hardware.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/mach-types.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
......
...@@ -26,9 +26,6 @@ ...@@ -26,9 +26,6 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/delay.h> #include <linux/delay.h>
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <asm/system.h> #include <asm/system.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/sizes.h>
/* /*
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/hardware.h> /* io_p2v() */
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/hardware.h> /* io_p2v() */
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
......
/*
* linux/arch/arm/mach-pxa/ssp.c
*
* based on linux/arch/arm/mach-sa1100/ssp.c by Russell King
*
* Copyright (C) 2003 Russell King.
* Copyright (C) 2003 Wolfson Microelectronics PLC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* PXA2xx SSP driver. This provides the generic core for simple
* IO-based SSP applications and allows easy port setup for DMA access.
*
* Author: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
*
* Revision history:
* 22nd Aug 2003 Initial version.
*
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/hardware.h>
#include <asm/arch/ssp.h>
#include <asm/arch/pxa-regs.h>
static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct ssp_dev *dev = (struct ssp_dev*) dev_id;
unsigned int status = SSSR_P(dev->port);
SSSR_P(dev->port) = status; /* clear status bits */
if (status & SSSR_ROR)
printk(KERN_WARNING "SSP(%d): receiver overrun\n", dev->port);
if (status & SSSR_TUR)
printk(KERN_WARNING "SSP(%d): transmitter underrun\n", dev->port);
if (status & SSSR_BCE)
printk(KERN_WARNING "SSP(%d): bit count error\n", dev->port);
return IRQ_HANDLED;
}
/**
* ssp_write_word - write a word to the SSP port
* @data: 32-bit, MSB justified data to write.
*
* Wait for a free entry in the SSP transmit FIFO, and write a data
* word to the SSP port.
*
* The caller is expected to perform the necessary locking.
*
* Returns:
* %-ETIMEDOUT timeout occurred (for future)
* 0 success
*/
int ssp_write_word(struct ssp_dev *dev, u32 data)
{
while (!(SSSR_P(dev->port) & SSSR_TNF))
cpu_relax();
SSDR_P(dev->port) = data;
return 0;
}
/**
* ssp_read_word - read a word from the SSP port
*
* Wait for a data word in the SSP receive FIFO, and return the
* received data. Data is LSB justified.
*
* Note: Currently, if data is not expected to be received, this
* function will wait for ever.
*
* The caller is expected to perform the necessary locking.
*
* Returns:
* %-ETIMEDOUT timeout occurred (for future)
* 32-bit data success
*/
int ssp_read_word(struct ssp_dev *dev)
{
while (!(SSSR_P(dev->port) & SSSR_RNE))
cpu_relax();
return SSDR_P(dev->port);
}
/**
* ssp_flush - flush the transmit and receive FIFOs
*
* Wait for the SSP to idle, and ensure that the receive FIFO
* is empty.
*
* The caller is expected to perform the necessary locking.
*/
void ssp_flush(struct ssp_dev *dev)
{
do {
while (SSSR_P(dev->port) & SSSR_RNE) {
(void) SSDR_P(dev->port);
}
} while (SSSR_P(dev->port) & SSSR_BSY);
}
/**
* ssp_enable - enable the SSP port
*
* Turn on the SSP port.
*/
void ssp_enable(struct ssp_dev *dev)
{
SSCR0_P(dev->port) |= SSCR0_SSE;
}
/**
* ssp_disable - shut down the SSP port
*
* Turn off the SSP port, optionally powering it down.
*/
void ssp_disable(struct ssp_dev *dev)
{
SSCR0_P(dev->port) &= ~SSCR0_SSE;
}
/**
* ssp_save_state - save the SSP configuration
* @ssp: pointer to structure to save SSP configuration
*
* Save the configured SSP state for suspend.
*/
void ssp_save_state(struct ssp_dev *dev, struct ssp_state *ssp)
{
ssp->cr0 = SSCR0_P(dev->port);
ssp->cr1 = SSCR1_P(dev->port);
ssp->to = SSTO_P(dev->port);
ssp->psp = SSPSP_P(dev->port);
SSCR0_P(dev->port) &= ~SSCR0_SSE;
}
/**
* ssp_restore_state - restore a previously saved SSP configuration
* @ssp: pointer to configuration saved by ssp_save_state
*
* Restore the SSP configuration saved previously by ssp_save_state.
*/
void ssp_restore_state(struct ssp_dev *dev, struct ssp_state *ssp)
{
SSSR_P(dev->port) = SSSR_ROR | SSSR_TUR | SSSR_BCE;
SSCR0_P(dev->port) = ssp->cr0 & ~SSCR0_SSE;
SSCR1_P(dev->port) = ssp->cr1;
SSTO_P(dev->port) = ssp->to;
SSPSP_P(dev->port) = ssp->psp;
SSCR0_P(dev->port) = ssp->cr0;
}
/**
* ssp_init - setup the SSP port
*
* initialise and claim resources for the SSP port.
*
* Returns:
* %-ENODEV if the SSP port is unavailable
* %-EBUSY if the resources are already in use
* %0 on success
*/
int ssp_init(struct ssp_dev *dev, u32 port, u32 mode, u32 flags, u32 psp_flags,
u32 speed)
{
int ret, irq;
if (!request_mem_region(__PREG(SSCR0_P(dev->port)), 0x2c, "SSP")) {
return -EBUSY;
}
switch (port) {
case 1:
irq = IRQ_SSP;
break;
#if defined (CONFIG_PXA27x)
case 2:
irq = IRQ_SSP2;
break;
case 3:
irq = IRQ_SSP3;
break;
#else
case 2:
irq = IRQ_NSSP;
break;
case 3:
irq = IRQ_ASSP;
break;
#endif
default:
return -ENODEV;
}
dev->port = port;
dev->mode = mode;
dev->flags = flags;
dev->psp_flags = psp_flags;
dev->speed = speed;
/* set up port type, speed, port settings */
SSCR0_P(dev->port) = (dev->speed | dev->mode);
SSCR1_P(dev->port) = dev->flags;
SSPSP_P(dev->port) = dev->psp_flags;
ret = request_irq(irq, ssp_interrupt, 0, "SSP", dev);
if (ret)
goto out_region;
/* turn on SSP port clock */
switch (dev->port) {
#if defined (CONFIG_PXA27x)
case 1:
pxa_set_cken(CKEN23_SSP1, 1);
break;
case 2:
pxa_set_cken(CKEN3_SSP2, 1);
break;
case 3:
pxa_set_cken(CKEN4_SSP3, 1);
break;
#else
case 1:
pxa_set_cken(CKEN3_SSP, 1);
break;
case 2:
pxa_set_cken(CKEN9_NSSP, 1);
break;
case 3:
pxa_set_cken(CKEN10_ASSP, 1);
break;
#endif
}
return 0;
out_region:
release_mem_region(__PREG(SSCR0_P(dev->port)), 0x2c);
return ret;
}
/**
* ssp_exit - undo the effects of ssp_init
*
* release and free resources for the SSP port.
*/
void ssp_exit(struct ssp_dev *dev)
{
int irq;
SSCR0_P(dev->port) &= ~SSCR0_SSE;
/* find irq, save power and turn off SSP port clock */
switch (dev->port) {
#if defined (CONFIG_PXA27x)
case 1:
irq = IRQ_SSP;
pxa_set_cken(CKEN23_SSP1, 0);
break;
case 2:
irq = IRQ_SSP2;
pxa_set_cken(CKEN3_SSP2, 0);
break;
case 3:
irq = IRQ_SSP3;
pxa_set_cken(CKEN4_SSP3, 0);
break;
#else
case 1:
irq = IRQ_SSP;
pxa_set_cken(CKEN3_SSP, 0);
break;
case 2:
irq = IRQ_NSSP;
pxa_set_cken(CKEN9_NSSP, 0);
break;
case 3:
irq = IRQ_ASSP;
pxa_set_cken(CKEN10_ASSP, 0);
break;
#endif
default:
printk(KERN_WARNING "SSP: tried to close invalid port\n");
return;
}
free_irq(irq, dev);
release_mem_region(__PREG(SSCR0_P(dev->port)), 0x2c);
}
EXPORT_SYMBOL(ssp_write_word);
EXPORT_SYMBOL(ssp_read_word);
EXPORT_SYMBOL(ssp_flush);
EXPORT_SYMBOL(ssp_enable);
EXPORT_SYMBOL(ssp_disable);
EXPORT_SYMBOL(ssp_save_state);
EXPORT_SYMBOL(ssp_restore_state);
EXPORT_SYMBOL(ssp_init);
EXPORT_SYMBOL(ssp_exit);
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <asm/elf.h> #include <asm/elf.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -65,11 +66,11 @@ __tagtable(ATAG_ACORN, parse_tag_acorn); ...@@ -65,11 +66,11 @@ __tagtable(ATAG_ACORN, parse_tag_acorn);
static struct map_desc rpc_io_desc[] __initdata = { static struct map_desc rpc_io_desc[] __initdata = {
{ SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */ { SCREEN_BASE, SCREEN_START, 2*1048576, MT_DEVICE }, /* VRAM */
{ IO_BASE, IO_START, IO_SIZE , MT_DEVICE }, /* IO space */ { IO_BASE, IO_START, IO_SIZE , MT_DEVICE }, /* IO space */
{ EASI_BASE, EASI_START, EASI_SIZE, MT_DEVICE } /* EASI space */ { EASI_BASE, EASI_START, EASI_SIZE, MT_DEVICE } /* EASI space */
}; };
void __init rpc_map_io(void) static void __init rpc_map_io(void)
{ {
iotable_init(rpc_io_desc, ARRAY_SIZE(rpc_io_desc)); iotable_init(rpc_io_desc, ARRAY_SIZE(rpc_io_desc));
...@@ -84,6 +85,64 @@ void __init rpc_map_io(void) ...@@ -84,6 +85,64 @@ void __init rpc_map_io(void)
elf_hwcap &= ~HWCAP_HALF; elf_hwcap &= ~HWCAP_HALF;
} }
static struct resource acornfb_resources[] = {
{ /* VIDC */
.start = 0x03400000,
.end = 0x035fffff,
.flags = IORESOURCE_MEM,
}, {
.start = IRQ_VSYNCPULSE,
.end = IRQ_VSYNCPULSE,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device acornfb_device = {
.name = "acornfb",
.id = -1,
.dev = {
.coherent_dma_mask = 0xffffffff,
},
.num_resources = ARRAY_SIZE(acornfb_resources),
.resource = acornfb_resources,
};
static struct resource iomd_resources[] = {
{
.start = 0x03200000,
.end = 0x0320ffff,
.flags = IORESOURCE_MEM,
},
};
static struct platform_device iomd_device = {
.name = "iomd",
.id = -1,
.num_resources = ARRAY_SIZE(iomd_resources),
.resource = iomd_resources,
};
static struct platform_device kbd_device = {
.name = "kart",
.id = -1,
.dev = {
.parent = &iomd_device.dev,
},
};
static struct platform_device *devs[] __initdata = {
&iomd_device,
&kbd_device,
&acornfb_device,
};
static int __init rpc_init(void)
{
return platform_add_devices(devs, ARRAY_SIZE(devs));
}
arch_initcall(rpc_init);
extern struct sys_timer ioc_timer; extern struct sys_timer ioc_timer;
MACHINE_START(RISCPC, "Acorn-RiscPC") MACHINE_START(RISCPC, "Acorn-RiscPC")
......
...@@ -75,7 +75,11 @@ static float64 float64_mnf(float64 rFm) ...@@ -75,7 +75,11 @@ static float64 float64_mnf(float64 rFm)
union float64_components u; union float64_components u;
u.f64 = rFm; u.f64 = rFm;
#ifdef __ARMEB__
u.i[0] ^= 0x80000000;
#else
u.i[1] ^= 0x80000000; u.i[1] ^= 0x80000000;
#endif
return u.f64; return u.f64;
} }
...@@ -85,7 +89,11 @@ static float64 float64_abs(float64 rFm) ...@@ -85,7 +89,11 @@ static float64 float64_abs(float64 rFm)
union float64_components u; union float64_components u;
u.f64 = rFm; u.f64 = rFm;
#ifdef __ARMEB__
u.i[0] &= 0x7fffffff;
#else
u.i[1] &= 0x7fffffff; u.i[1] &= 0x7fffffff;
#endif
return u.f64; return u.f64;
} }
......
...@@ -217,6 +217,7 @@ void foo(void) ...@@ -217,6 +217,7 @@ void foo(void)
DEFINE(IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET, offsetof (struct time_interpolator, last_cycle)); DEFINE(IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET, offsetof (struct time_interpolator, last_cycle));
DEFINE(IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET, offsetof (struct time_interpolator, last_counter)); DEFINE(IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET, offsetof (struct time_interpolator, last_counter));
DEFINE(IA64_TIME_INTERPOLATOR_JITTER_OFFSET, offsetof (struct time_interpolator, jitter)); DEFINE(IA64_TIME_INTERPOLATOR_JITTER_OFFSET, offsetof (struct time_interpolator, jitter));
DEFINE(IA64_TIME_INTERPOLATOR_MASK_OFFSET, offsetof (struct time_interpolator, mask));
DEFINE(IA64_TIME_SOURCE_CPU, TIME_SOURCE_CPU); DEFINE(IA64_TIME_SOURCE_CPU, TIME_SOURCE_CPU);
DEFINE(IA64_TIME_SOURCE_MMIO64, TIME_SOURCE_MMIO64); DEFINE(IA64_TIME_SOURCE_MMIO64, TIME_SOURCE_MMIO64);
DEFINE(IA64_TIME_SOURCE_MMIO32, TIME_SOURCE_MMIO32); DEFINE(IA64_TIME_SOURCE_MMIO32, TIME_SOURCE_MMIO32);
......
...@@ -19,10 +19,11 @@ void __init cyclone_setup(void) ...@@ -19,10 +19,11 @@ void __init cyclone_setup(void)
struct time_interpolator cyclone_interpolator = { struct time_interpolator cyclone_interpolator = {
.source = TIME_SOURCE_MMIO32, .source = TIME_SOURCE_MMIO64,
.shift = 32, .shift = 16,
.frequency = CYCLONE_TIMER_FREQ, .frequency = CYCLONE_TIMER_FREQ,
.drift = -100, .drift = -100,
.mask = (1LL << 40) - 1
}; };
int __init init_cyclone_clock(void) int __init init_cyclone_clock(void)
......
...@@ -177,7 +177,7 @@ ENTRY(fsys_gettimeofday) ...@@ -177,7 +177,7 @@ ENTRY(fsys_gettimeofday)
// r11 = preserved: saved ar.pfs // r11 = preserved: saved ar.pfs
// r12 = preserved: memory stack // r12 = preserved: memory stack
// r13 = preserved: thread pointer // r13 = preserved: thread pointer
// r14 = debug pointer / usable // r14 = address of mask / mask
// r15 = preserved: system call number // r15 = preserved: system call number
// r16 = preserved: current task pointer // r16 = preserved: current task pointer
// r17 = wall to monotonic use // r17 = wall to monotonic use
...@@ -226,7 +226,6 @@ ENTRY(fsys_gettimeofday) ...@@ -226,7 +226,6 @@ ENTRY(fsys_gettimeofday)
add r10 = IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET,r20 add r10 = IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET,r20
extr r3 = r21,32,32 // time_interpolator->nsec_per_cyc extr r3 = r21,32,32 // time_interpolator->nsec_per_cyc
extr r8 = r21,0,16 // time_interpolator->source extr r8 = r21,0,16 // time_interpolator->source
nop.i 123
cmp.ne p6, p0 = 0, r2 // Fallback if work is scheduled cmp.ne p6, p0 = 0, r2 // Fallback if work is scheduled
(p6) br.cond.spnt.many fsys_fallback_syscall (p6) br.cond.spnt.many fsys_fallback_syscall
;; ;;
...@@ -257,17 +256,20 @@ ENTRY(fsys_gettimeofday) ...@@ -257,17 +256,20 @@ ENTRY(fsys_gettimeofday)
add r24 = IA64_TIME_INTERPOLATOR_OFFSET_OFFSET,r20 add r24 = IA64_TIME_INTERPOLATOR_OFFSET_OFFSET,r20
(p15) ld8 r17 = [r19],IA64_TIMESPEC_TV_NSEC_OFFSET (p15) ld8 r17 = [r19],IA64_TIMESPEC_TV_NSEC_OFFSET
ld8 r9 = [r27],IA64_TIMESPEC_TV_NSEC_OFFSET ld8 r9 = [r27],IA64_TIMESPEC_TV_NSEC_OFFSET
nop.i 123 add r14 = IA64_TIME_INTERPOLATOR_MASK_OFFSET, r20
;; ;;
ld8 r18 = [r24] // time_interpolator->offset ld8 r18 = [r24] // time_interpolator->offset
ld8 r8 = [r27],-IA64_TIMESPEC_TV_NSEC_OFFSET // xtime.tv_nsec ld8 r8 = [r27],-IA64_TIMESPEC_TV_NSEC_OFFSET // xtime.tv_nsec
(p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm) (p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm)
;; ;;
ld8 r14 = [r14] // time_interpolator->mask
(p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared (p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared
sub r10 = r2,r26 // current_counter - last_counter sub r10 = r2,r26 // current_counter - last_counter
;; ;;
(p6) sub r10 = r25,r26 // time we got was less than last_cycle (p6) sub r10 = r25,r26 // time we got was less than last_cycle
(p7) mov ar.ccv = r25 // more than last_cycle. Prep for cmpxchg (p7) mov ar.ccv = r25 // more than last_cycle. Prep for cmpxchg
;;
and r10 = r10,r14 // Apply mask
;; ;;
setf.sig f8 = r10 setf.sig f8 = r10
nop.i 123 nop.i 123
......
...@@ -45,7 +45,11 @@ EXPORT_SYMBOL(last_cli_ip); ...@@ -45,7 +45,11 @@ EXPORT_SYMBOL(last_cli_ip);
#endif #endif
static struct time_interpolator itc_interpolator; static struct time_interpolator itc_interpolator = {
.shift = 16,
.mask = 0xffffffffffffffffLL,
.source = TIME_SOURCE_CPU
};
static irqreturn_t static irqreturn_t
timer_interrupt (int irq, void *dev_id, struct pt_regs *regs) timer_interrupt (int irq, void *dev_id, struct pt_regs *regs)
...@@ -206,9 +210,7 @@ ia64_init_itm (void) ...@@ -206,9 +210,7 @@ ia64_init_itm (void)
if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) { if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) {
itc_interpolator.frequency = local_cpu_data->itc_freq; itc_interpolator.frequency = local_cpu_data->itc_freq;
itc_interpolator.shift = 16;
itc_interpolator.drift = itc_drift; itc_interpolator.drift = itc_drift;
itc_interpolator.source = TIME_SOURCE_CPU;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* On IA64 in an SMP configuration ITCs are never accurately synchronized. /* On IA64 in an SMP configuration ITCs are never accurately synchronized.
* Jitter compensation requires a cmpxchg which may limit * Jitter compensation requires a cmpxchg which may limit
...@@ -222,7 +224,6 @@ ia64_init_itm (void) ...@@ -222,7 +224,6 @@ ia64_init_itm (void)
*/ */
if (!nojitter) itc_interpolator.jitter = 1; if (!nojitter) itc_interpolator.jitter = 1;
#endif #endif
itc_interpolator.addr = NULL;
register_time_interpolator(&itc_interpolator); register_time_interpolator(&itc_interpolator);
} }
......
...@@ -22,14 +22,16 @@ ...@@ -22,14 +22,16 @@
extern unsigned long sn_rtc_cycles_per_second; extern unsigned long sn_rtc_cycles_per_second;
static struct time_interpolator sn2_interpolator; static struct time_interpolator sn2_interpolator = {
.drift = -1,
.shift = 10,
.mask = (1LL << 55) - 1,
.source = TIME_SOURCE_MMIO64,
.addr = RTC_COUNTER_ADDR
};
void __init sn_timer_init(void) void __init sn_timer_init(void)
{ {
sn2_interpolator.frequency = sn_rtc_cycles_per_second; sn2_interpolator.frequency = sn_rtc_cycles_per_second;
sn2_interpolator.drift = -1; /* unknown */
sn2_interpolator.shift = 10; /* RTC is 54 bits maximum shift is 10 */
sn2_interpolator.addr = RTC_COUNTER_ADDR;
sn2_interpolator.source = TIME_SOURCE_MMIO64;
register_time_interpolator(&sn2_interpolator); register_time_interpolator(&sn2_interpolator);
} }
...@@ -185,17 +185,19 @@ config BVME6000 ...@@ -185,17 +185,19 @@ config BVME6000
drivers for SCSI, Ethernet and serial ports later on. drivers for SCSI, Ethernet and serial ports later on.
config HP300 config HP300
bool "HP9000/300 support" bool "HP9000/300 and HP9000/400 support"
depends on !MMU_SUN3 depends on !MMU_SUN3
help help
This option enables support for the HP9000/300 series of This option enables support for the HP9000/300 and HP9000/400 series
workstations. Support for these machines is still very experimental. of workstations. Support for these machines is still somewhat
If you plan to try to use the kernel on such a machine say Y here. experimental. If you plan to try to use the kernel on such a machine
say Y here.
Everybody else says N. Everybody else says N.
config DIO config DIO
bool "DIO bus support" bool "DIO bus support"
depends on HP300 depends on HP300
default y
help help
Say Y here to enable support for the "DIO" expansion bus used in Say Y here to enable support for the "DIO" expansion bus used in
HP300 machines. If you are using such a system you almost certainly HP300 machines. If you are using such a system you almost certainly
...@@ -582,11 +584,18 @@ config ADB_KEYBOARD ...@@ -582,11 +584,18 @@ config ADB_KEYBOARD
config HPDCA config HPDCA
tristate "HP DCA serial support" tristate "HP DCA serial support"
depends on DIO depends on DIO && SERIAL_8250
help help
If you want to use the internal "DCA" serial ports on an HP300 If you want to use the internal "DCA" serial ports on an HP300
machine, say Y here. machine, say Y here.
config HPAPCI
tristate "HP APCI serial support"
depends on HP300 && SERIAL_8250 && EXPERIMENTAL
help
If you want to use the internal "APCI" serial ports on an HP400
machine, say Y here.
config MVME147_SCC config MVME147_SCC
bool "SCC support for MVME147 serial ports" bool "SCC support for MVME147 serial ports"
depends on MVME147 depends on MVME147
...@@ -623,7 +632,7 @@ config DN_SERIAL ...@@ -623,7 +632,7 @@ config DN_SERIAL
config SERIAL_CONSOLE config SERIAL_CONSOLE
bool "Support for serial port console" bool "Support for serial port console"
depends on (AMIGA || ATARI || MAC || HP300 || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || HPDCA=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL) depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
---help--- ---help---
If you say Y here, it will be possible to use a serial port as the If you say Y here, it will be possible to use a serial port as the
system console (the system console is the device which receives all system console (the system console is the device which receives all
......
...@@ -28,7 +28,7 @@ ifdef CONFIG_SUN3 ...@@ -28,7 +28,7 @@ ifdef CONFIG_SUN3
LDFLAGS_vmlinux = -N LDFLAGS_vmlinux = -N
endif endif
CHECKFLAGS += -D__mc68000__ -I$(shell $(CC) -print-file-name=include) CHECKFLAGS += -D__mc68000__
# without -fno-strength-reduce the 53c7xx.c driver fails ;-( # without -fno-strength-reduce the 53c7xx.c driver fails ;-(
CFLAGS += -pipe -fno-strength-reduce -ffixed-a2 CFLAGS += -pipe -fno-strength-reduce -ffixed-a2
......
...@@ -311,7 +311,7 @@ static void __init hades_fixup(int pci_modify) ...@@ -311,7 +311,7 @@ static void __init hades_fixup(int pci_modify)
* Go through all devices, fixing up irqs as we see fit: * Go through all devices, fixing up irqs as we see fit:
*/ */
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
{ {
if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE)
{ {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -57,14 +57,21 @@ static irqreturn_t hp300_int_handler(int irq, void *dev_id, struct pt_regs *fp) ...@@ -57,14 +57,21 @@ static irqreturn_t hp300_int_handler(int irq, void *dev_id, struct pt_regs *fp)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static irqreturn_t hp300_badint(int irq, void *dev_id, struct pt_regs *fp)
{
num_spurious += 1;
return IRQ_NONE;
}
irqreturn_t (*hp300_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = { irqreturn_t (*hp300_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
[0] = hp300_int_handler, [0] = hp300_badint,
[1] = hp300_int_handler, [1] = hp300_int_handler,
[2] = hp300_int_handler, [2] = hp300_int_handler,
[3] = hp300_int_handler, [3] = hp300_int_handler,
[4] = hp300_int_handler, [4] = hp300_int_handler,
[5] = hp300_int_handler, [5] = hp300_int_handler,
[6] = hp300_int_handler, [6] = hp300_int_handler,
[7] = hp300_int_handler
}; };
/* dev_id had better be unique to each handler because it's the only way we have /* dev_id had better be unique to each handler because it's the only way we have
......
...@@ -13,23 +13,4 @@ ...@@ -13,23 +13,4 @@
.globl hp300_reset .globl hp300_reset
hp300_reset: hp300_reset:
.chip 68030 jmp hp300_reset
oriw #0x0700,%sr /* cli() */
movel hp300_phys_ram_base, %d1
movel #0, %d0
movec %d0, %vbr /* reset vector table */
lea zero, %a0
lea 1f, %a1
add %d1, %a0
add %d1, %a1
pmove %tc, %a0@
bclr #7, %a0@
pmove %a0@, %tc /* goodbye MMU */
jmp %a1@
1: movel #0x808, %d0
movec %d0, %cacr /* cache off */
moveb #0, 0x1ffff
movel #0x1a4, %a0
jmp %a0@
zero: .quad 0
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/blinken.h>
#include "ints.h" #include "ints.h"
/* Clock hardware definitions */ /* Clock hardware definitions */
...@@ -38,11 +39,13 @@ ...@@ -38,11 +39,13 @@
static irqreturn_t hp300_tick(int irq, void *dev_id, struct pt_regs *regs) static irqreturn_t hp300_tick(int irq, void *dev_id, struct pt_regs *regs)
{ {
unsigned long tmp; unsigned long tmp;
irqreturn_t (*vector)(int, void *, struct pt_regs *) = dev_id; irqreturn_t (*vector)(int, void *, struct pt_regs *) = dev_id;
in_8(CLOCKBASE + CLKSR); in_8(CLOCKBASE + CLKSR);
asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE)); asm volatile ("movpw %1@(5),%0" : "=d" (tmp) : "a" (CLOCKBASE));
return vector(irq, NULL, regs); /* Turn off the network and SCSI leds */
blinken_leds(0, 0xe0);
return vector(irq, NULL, regs);
} }
unsigned long hp300_gettimeoffset(void) unsigned long hp300_gettimeoffset(void)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
* *
*/ */
#include <linux/config.h>
#include <linux/signal.h> #include <linux/signal.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h> #include <linux/mm.h>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment