Commit 94e2c131 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Linus Torvalds

[PATCH] m68k: HP300 core updates

Update of HP300 core support to use bootinfo etc. (from Kars de Jong)
Signed-off-by: default avatarKars de Jong <jongk@linux-m68k.org>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 1d94dc0b
...@@ -7,56 +7,272 @@ ...@@ -7,56 +7,272 @@
* called by setup.c. * called by setup.c.
*/ */
#include <linux/config.h> #include <linux/module.h>
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/kd.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/console.h>
#include <asm/bootinfo.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/blinken.h> #include <asm/blinken.h>
#include <asm/hwtest.h> /* hwreg_present() */ #include <asm/io.h> /* readb() and writeb() */
#include <asm/hp300hw.h>
#include <asm/rtc.h>
#include "ints.h" #include "ints.h"
#include "time.h" #include "time.h"
unsigned long hp300_model;
unsigned long hp300_uart_scode = -1;
unsigned char ledstate;
static char s_hp330[] __initdata = "330";
static char s_hp340[] __initdata = "340";
static char s_hp345[] __initdata = "345";
static char s_hp360[] __initdata = "360";
static char s_hp370[] __initdata = "370";
static char s_hp375[] __initdata = "375";
static char s_hp380[] __initdata = "380";
static char s_hp385[] __initdata = "385";
static char s_hp400[] __initdata = "400";
static char s_hp425t[] __initdata = "425t";
static char s_hp425s[] __initdata = "425s";
static char s_hp425e[] __initdata = "425e";
static char s_hp433t[] __initdata = "433t";
static char s_hp433s[] __initdata = "433s";
static char *hp300_models[] __initdata = {
[HP_320] = NULL,
[HP_330] = s_hp330,
[HP_340] = s_hp340,
[HP_345] = s_hp345,
[HP_350] = NULL,
[HP_360] = s_hp360,
[HP_370] = s_hp370,
[HP_375] = s_hp375,
[HP_380] = s_hp380,
[HP_385] = s_hp385,
[HP_400] = s_hp400,
[HP_425T] = s_hp425t,
[HP_425S] = s_hp425s,
[HP_425E] = s_hp425e,
[HP_433T] = s_hp433t,
[HP_433S] = s_hp433s,
};
static char hp300_model_name[13] = "HP9000/";
extern void hp300_reset(void); extern void hp300_reset(void);
extern irqreturn_t (*hp300_default_handler[])(int, void *, struct pt_regs *); extern irqreturn_t (*hp300_default_handler[])(int, void *, struct pt_regs *);
extern int show_hp300_interrupts(struct seq_file *, void *); extern int show_hp300_interrupts(struct seq_file *, void *);
#ifdef CONFIG_SERIAL_8250_CONSOLE
extern int hp300_setup_serial_console(void) __init;
#endif
int __init hp300_parse_bootinfo(const struct bi_record *record)
{
int unknown = 0;
const unsigned long *data = record->data;
switch (record->tag) {
case BI_HP300_MODEL:
hp300_model = *data;
break;
case BI_HP300_UART_SCODE:
hp300_uart_scode = *data;
break;
case BI_HP300_UART_ADDR:
/* serial port address: ignored here */
break;
default:
unknown = 1;
}
return unknown;
}
#ifdef CONFIG_HEARTBEAT #ifdef CONFIG_HEARTBEAT
static void hp300_pulse(int x) static void hp300_pulse(int x)
{ {
if (x) if (x)
blinken_leds(0xfe); blinken_leds(0x10, 0);
else else
blinken_leds(0xff); blinken_leds(0, 0x10);
} }
#endif #endif
static void hp300_get_model(char *model) static void hp300_get_model(char *model)
{ {
strcpy(model, "HP9000/300"); strcpy(model, hp300_model_name);
}
#define RTCBASE 0xf0420000
#define RTC_DATA 0x1
#define RTC_CMD 0x3
#define RTC_BUSY 0x02
#define RTC_DATA_RDY 0x01
#define rtc_busy() (in_8(RTCBASE + RTC_CMD) & RTC_BUSY)
#define rtc_data_available() (in_8(RTCBASE + RTC_CMD) & RTC_DATA_RDY)
#define rtc_status() (in_8(RTCBASE + RTC_CMD))
#define rtc_command(x) out_8(RTCBASE + RTC_CMD, (x))
#define rtc_read_data() (in_8(RTCBASE + RTC_DATA))
#define rtc_write_data(x) out_8(RTCBASE + RTC_DATA, (x))
#define RTC_SETREG 0xe0
#define RTC_WRITEREG 0xc2
#define RTC_READREG 0xc3
#define RTC_REG_SEC2 0
#define RTC_REG_SEC1 1
#define RTC_REG_MIN2 2
#define RTC_REG_MIN1 3
#define RTC_REG_HOUR2 4
#define RTC_REG_HOUR1 5
#define RTC_REG_WDAY 6
#define RTC_REG_DAY2 7
#define RTC_REG_DAY1 8
#define RTC_REG_MON2 9
#define RTC_REG_MON1 10
#define RTC_REG_YEAR2 11
#define RTC_REG_YEAR1 12
#define RTC_HOUR1_24HMODE 0x8
#define RTC_STAT_MASK 0xf0
#define RTC_STAT_RDY 0x40
static inline unsigned char hp300_rtc_read(unsigned char reg)
{
unsigned char s, ret;
unsigned long flags;
local_irq_save(flags);
while (rtc_busy());
rtc_command(RTC_SETREG);
while (rtc_busy());
rtc_write_data(reg);
while (rtc_busy());
rtc_command(RTC_READREG);
do {
while (!rtc_data_available());
s = rtc_status();
ret = rtc_read_data();
} while ((s & RTC_STAT_MASK) != RTC_STAT_RDY);
local_irq_restore(flags);
return ret;
}
static inline unsigned char hp300_rtc_write(unsigned char reg,
unsigned char val)
{
unsigned char s, ret;
unsigned long flags;
local_irq_save(flags);
while (rtc_busy());
rtc_command(RTC_SETREG);
while (rtc_busy());
rtc_write_data((val << 4) | reg);
while (rtc_busy());
rtc_command(RTC_WRITEREG);
while (rtc_busy());
rtc_command(RTC_READREG);
do {
while (!rtc_data_available());
s = rtc_status();
ret = rtc_read_data();
} while ((s & RTC_STAT_MASK) != RTC_STAT_RDY);
local_irq_restore(flags);
return ret;
}
static int hp300_hwclk(int op, struct rtc_time *t)
{
if (!op) { /* read */
t->tm_sec = hp300_rtc_read(RTC_REG_SEC1) * 10 +
hp300_rtc_read(RTC_REG_SEC2);
t->tm_min = hp300_rtc_read(RTC_REG_MIN1) * 10 +
hp300_rtc_read(RTC_REG_MIN2);
t->tm_hour = (hp300_rtc_read(RTC_REG_HOUR1) & 3) * 10 +
hp300_rtc_read(RTC_REG_HOUR2);
t->tm_wday = -1;
t->tm_mday = hp300_rtc_read(RTC_REG_DAY1) * 10 +
hp300_rtc_read(RTC_REG_DAY2);
t->tm_mon = hp300_rtc_read(RTC_REG_MON1) * 10 +
hp300_rtc_read(RTC_REG_MON2) - 1;
t->tm_year = hp300_rtc_read(RTC_REG_YEAR1) * 10 +
hp300_rtc_read(RTC_REG_YEAR2);
if (t->tm_year <= 69)
t->tm_year += 100;
} else {
hp300_rtc_write(RTC_REG_SEC1, t->tm_sec / 10);
hp300_rtc_write(RTC_REG_SEC2, t->tm_sec % 10);
hp300_rtc_write(RTC_REG_MIN1, t->tm_min / 10);
hp300_rtc_write(RTC_REG_MIN2, t->tm_min % 10);
hp300_rtc_write(RTC_REG_HOUR1,
((t->tm_hour / 10) & 3) | RTC_HOUR1_24HMODE);
hp300_rtc_write(RTC_REG_HOUR2, t->tm_hour % 10);
hp300_rtc_write(RTC_REG_DAY1, t->tm_mday / 10);
hp300_rtc_write(RTC_REG_DAY2, t->tm_mday % 10);
hp300_rtc_write(RTC_REG_MON1, (t->tm_mon + 1) / 10);
hp300_rtc_write(RTC_REG_MON2, (t->tm_mon + 1) % 10);
if (t->tm_year >= 100)
t->tm_year -= 100;
hp300_rtc_write(RTC_REG_YEAR1, t->tm_year / 10);
hp300_rtc_write(RTC_REG_YEAR2, t->tm_year % 10);
}
return 0;
}
static unsigned int hp300_get_ss(void)
{
return hp300_rtc_read(RTC_REG_SEC1) * 10 +
hp300_rtc_read(RTC_REG_SEC2);
} }
void __init config_hp300(void) void __init config_hp300(void)
{ {
mach_sched_init = hp300_sched_init; mach_sched_init = hp300_sched_init;
mach_init_IRQ = hp300_init_IRQ; mach_init_IRQ = hp300_init_IRQ;
mach_request_irq = hp300_request_irq; mach_request_irq = hp300_request_irq;
mach_free_irq = hp300_free_irq; mach_free_irq = hp300_free_irq;
mach_get_model = hp300_get_model; mach_get_model = hp300_get_model;
mach_get_irq_list = show_hp300_interrupts; mach_get_irq_list = show_hp300_interrupts;
mach_gettimeoffset = hp300_gettimeoffset; mach_gettimeoffset = hp300_gettimeoffset;
mach_default_handler = &hp300_default_handler; mach_default_handler = &hp300_default_handler;
mach_reset = hp300_reset; mach_hwclk = hp300_hwclk;
mach_get_ss = hp300_get_ss;
mach_reset = hp300_reset;
#ifdef CONFIG_HEARTBEAT #ifdef CONFIG_HEARTBEAT
mach_heartbeat = hp300_pulse; mach_heartbeat = hp300_pulse;
#endif #endif
#ifdef CONFIG_DUMMY_CONSOLE #ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif
mach_max_dma_address = 0xffffffff;
if (hp300_model >= HP_330 && hp300_model <= HP_433S && hp300_model != HP_350) {
printk(KERN_INFO "Detected HP9000 model %s\n", hp300_models[hp300_model-HP_320]);
strcat(hp300_model_name, hp300_models[hp300_model-HP_320]);
}
else {
panic("Unknown HP9000 Model");
}
#ifdef CONFIG_SERIAL_8250_CONSOLE
hp300_setup_serial_console();
#endif #endif
mach_max_dma_address = 0xffffffff;
} }
...@@ -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)
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
** 1998/08/30 David Kilzer: Added support for font_desc structures ** 1998/08/30 David Kilzer: Added support for font_desc structures
** for linux-2.1.115 ** for linux-2.1.115
** 9/02/11 Richard Zidlicky: added Q40 support (initial vesion 99/01/01) ** 9/02/11 Richard Zidlicky: added Q40 support (initial vesion 99/01/01)
** 2004/05/13 Kars de Jong: Finalised HP300 support
** **
** This file is subject to the terms and conditions of the GNU General Public ** This file is subject to the terms and conditions of the GNU General Public
** License. See the file README.legal in the main directory of this archive ** License. See the file README.legal in the main directory of this archive
...@@ -313,9 +314,6 @@ ...@@ -313,9 +314,6 @@
#ifdef CONFIG_Q40 #ifdef CONFIG_Q40
.globl q40_mem_cptr .globl q40_mem_cptr
#endif #endif
#ifdef CONFIG_HP300
.globl hp300_phys_ram_base
#endif
CPUTYPE_040 = 1 /* indicates an 040 */ CPUTYPE_040 = 1 /* indicates an 040 */
CPUTYPE_060 = 2 /* indicates an 060 */ CPUTYPE_060 = 2 /* indicates an 060 */
...@@ -467,7 +465,7 @@ func_define mmu_get_ptr_table_entry,2 ...@@ -467,7 +465,7 @@ func_define mmu_get_ptr_table_entry,2
func_define mmu_get_page_table_entry,2 func_define mmu_get_page_table_entry,2
func_define mmu_print func_define mmu_print
func_define get_new_page func_define get_new_page
#ifdef CONFIG_HP300 #if defined(CONFIG_HP300) || defined(CONFIG_APOLLO)
func_define set_leds func_define set_leds
#endif #endif
...@@ -594,6 +592,7 @@ ENTRY(_stext) ...@@ -594,6 +592,7 @@ ENTRY(_stext)
.long MACH_BVME6000, BVME6000_BOOTI_VERSION .long MACH_BVME6000, BVME6000_BOOTI_VERSION
.long MACH_MAC, MAC_BOOTI_VERSION .long MACH_MAC, MAC_BOOTI_VERSION
.long MACH_Q40, Q40_BOOTI_VERSION .long MACH_Q40, Q40_BOOTI_VERSION
.long MACH_HP300, HP300_BOOTI_VERSION
.long 0 .long 0
1: jra __start 1: jra __start
...@@ -605,65 +604,6 @@ ENTRY(_start) ...@@ -605,65 +604,6 @@ ENTRY(_start)
jra __start jra __start
__INIT __INIT
ENTRY(__start) ENTRY(__start)
#ifdef CONFIG_HP300
/* This is a hack. The HP NetBSD bootloader loads us at an arbitrary
address (apparently 0xff002000 in practice) which is not good if we need
to be able to map this to VA 0x1000. We could do it with pagetables but
a better solution seems to be to relocate the kernel in physical memory
before we start.
So, we copy the entire kernel image (code+data+bss) down to the 16MB
boundary that marks the start of RAM. This is slightly tricky because
we must not overwrite the copying code itself. :-) */
/* 15/5/98. The start address of physical RAM changes depending on how much
RAM is present. This is actually a blessing in disguise as it provides
a way for us to work out the RAM size rather than hardwiring it. */
lea %pc@(_start),%a0
movel %a0,%d6
and #0xffff0000, %d6
lea %pc@(hp300_phys_ram_base),%a0
movel %d6, %a0@
movel %pc@(L(custom)),%a3
moveb #0xfe,%d7
moveb %d7,%a3@(0x1ffff)
lea %pc@(Lcopystart),%a0
lea %pc@(Lcopyend),%a1
movel %d6,%a2 /* Start of physical RAM */
1: moveb %a0@+,%d0
moveb %d0,%a2@+
cmpl %a0,%a1
jbne 1b
movel %d6,%a2
moveb #0xfd,%d7
moveb %d7,%a3@(0x1ffff)
lea %pc@(_stext),%a0
lea %pc@(_end),%a1
jmp %a2@
Lcopystart:
moveb #0xf7,%d7
moveb %d7,%a3@(0x1ffff)
movel %d6,%a2 /* Start of kernel */
add #0x1000,%a2
1: moveb %a0@+,%d0
moveb %d0,%a2@+
cmpl %a0,%a1
jbne 1b
moveb #0,%d7
moveb %d7,%a3@(0x1ffff)
movel %d6,%a0
addl #Lstart1,%a0
jmp %a0@
Lcopyend:
Lstart1:
moveb #0x3f,%d7
moveb %d7,%a3@(0x1ffff)
#endif /* CONFIG_HP300 */
/* /*
* Setup initial stack pointer * Setup initial stack pointer
*/ */
...@@ -672,8 +612,6 @@ Lstart1: ...@@ -672,8 +612,6 @@ Lstart1:
/* /*
* Record the CPU and machine type. * Record the CPU and machine type.
*/ */
#ifndef CONFIG_HP300
get_bi_record BI_MACHTYPE get_bi_record BI_MACHTYPE
lea %pc@(m68k_machtype),%a1 lea %pc@(m68k_machtype),%a1
movel %a0@,%a1@ movel %a0@,%a1@
...@@ -689,23 +627,8 @@ Lstart1: ...@@ -689,23 +627,8 @@ Lstart1:
get_bi_record BI_CPUTYPE get_bi_record BI_CPUTYPE
lea %pc@(m68k_cputype),%a1 lea %pc@(m68k_cputype),%a1
movel %a0@,%a1@ movel %a0@,%a1@
#else /* CONFIG_HP300 */
/* FIXME HP300 doesn't use bootinfo yet */
movel #MACH_HP300,%d4
lea %pc@(m68k_machtype),%a0
movel %d4,%a0@
movel #FPU_68881,%d0
lea %pc@(m68k_fputype),%a0
movel %d0,%a0@
movel #MMU_68030,%d0
lea %pc@(m68k_mmutype),%a0
movel %d0,%a0@
movel #CPU_68030,%d0
lea %pc@(m68k_cputype),%a0
movel %d0,%a0@
leds(0x1) leds 0x1
#endif /* CONFIG_HP300 */
#ifdef CONFIG_MAC #ifdef CONFIG_MAC
/* /*
...@@ -956,6 +879,26 @@ L(gvtdone): ...@@ -956,6 +879,26 @@ L(gvtdone):
#endif #endif
#ifdef CONFIG_HP300
is_not_hp300(L(nothp))
/* Get the address of the UART for serial debugging */
get_bi_record BI_HP300_UART_ADDR
tstl %d0
jbmi 1f
movel %a0@,%d3
lea %pc@(L(uartbase)),%a0
movel %d3,%a0@
get_bi_record BI_HP300_UART_SCODE
tstl %d0
jbmi 1f
movel %a0@,%d3
lea %pc@(L(uart_scode)),%a0
movel %d3,%a0@
1:
L(nothp):
#endif
/* /*
* Initialize serial port * Initialize serial port
*/ */
...@@ -979,9 +922,7 @@ L(nocon): ...@@ -979,9 +922,7 @@ L(nocon):
putc '\n' putc '\n'
putc 'A' putc 'A'
#ifdef CONFIG_HP300 leds 0x2
leds(0x2)
#endif /* CONFIG_HP300 */
dputn %pc@(L(cputype)) dputn %pc@(L(cputype))
dputn %pc@(m68k_supervisor_cachemode) dputn %pc@(m68k_supervisor_cachemode)
dputn %pc@(m68k_pgtable_cachemode) dputn %pc@(m68k_pgtable_cachemode)
...@@ -1124,16 +1065,30 @@ L(notq40): ...@@ -1124,16 +1065,30 @@ L(notq40):
#ifdef CONFIG_HP300 #ifdef CONFIG_HP300
is_not_hp300(L(nothp300)) is_not_hp300(L(nothp300))
/* On the HP300, we map the ROM, INTIO and DIO regions (phys. 0x00xxxxxx) /* On the HP300, we map the ROM, INTIO and DIO regions (phys. 0x00xxxxxx)
by mapping 32MB from 0xf0xxxxxx -> 0x00xxxxxx) using an 030 early * by mapping 32MB (on 020/030) or 16 MB (on 040) from 0xf0xxxxxx -> 0x00xxxxxx).
termination page descriptor. The ROM mapping is needed because the LEDs * The ROM mapping is needed because the LEDs are mapped there too.
are mapped there too. */ */
is_040(1f)
/*
* 030: Map the 32Meg range physical 0x0 upto logical 0xf000.0000
*/
mmu_map #0xf0000000,#0,#0x02000000,#_PAGE_NOCACHE030 mmu_map #0xf0000000,#0,#0x02000000,#_PAGE_NOCACHE030
L(nothp300): jbra L(mmu_init_done)
#endif 1:
/*
* 040: Map the 16Meg range physical 0x0 upto logical 0xf000.0000
*/
mmu_map #0xf0000000,#0,#0x01000000,#_PAGE_NOCACHE_S
jbra L(mmu_init_done)
L(nothp300):
#endif /* CONFIG_HP300 */
#ifdef CONFIG_MVME147 #ifdef CONFIG_MVME147
...@@ -1480,15 +1435,23 @@ L(mmu_fixup_done): ...@@ -1480,15 +1435,23 @@ L(mmu_fixup_done):
#ifdef CONFIG_HP300 #ifdef CONFIG_HP300
is_not_hp300(1f) is_not_hp300(1f)
/* /*
* Fix up the custom register to point to the new location of the LEDs. * Fix up the iobase register to point to the new location of the LEDs.
*/ */
movel #0xf0000000,L(custom) movel #0xf0000000,L(iobase)
/* /*
* Energise the FPU and caches. * Energise the FPU and caches.
*/ */
is_040(1f)
movel #0x60,0xf05f400c movel #0x60,0xf05f400c
1: jbra 2f
/*
* 040: slightly different, apparently.
*/
1: movew #0,0xf05f400e
movew #0x64,0xf05f400e
2:
#endif #endif
#ifdef CONFIG_SUN3X #ifdef CONFIG_SUN3X
...@@ -1585,7 +1548,6 @@ func_start get_bi_record,%d1 ...@@ -1585,7 +1548,6 @@ func_start get_bi_record,%d1
movel ARG1,%d0 movel ARG1,%d0
lea %pc@(_end),%a0 lea %pc@(_end),%a0
#ifndef CONFIG_HP300
1: tstw %a0@(BIR_TAG) 1: tstw %a0@(BIR_TAG)
jeq 3f jeq 3f
cmpw %a0@(BIR_TAG),%d0 cmpw %a0@(BIR_TAG),%d0
...@@ -1599,7 +1561,6 @@ func_start get_bi_record,%d1 ...@@ -1599,7 +1561,6 @@ func_start get_bi_record,%d1
3: moveq #-1,%d0 3: moveq #-1,%d0
lea %a0@(BIR_SIZE),%a0 lea %a0@(BIR_SIZE),%a0
4: 4:
#endif /* CONFIG_HP300 */
func_return get_bi_record func_return get_bi_record
...@@ -3013,6 +2974,10 @@ L(serial_init_not_mac): ...@@ -3013,6 +2974,10 @@ L(serial_init_not_mac):
/* We count on the PROM initializing SIO1 */ /* We count on the PROM initializing SIO1 */
#endif #endif
#ifdef CONFIG_HP300
/* We count on the boot loader initialising the UART */
#endif
L(serial_init_done): L(serial_init_done):
func_return serial_init func_return serial_init
...@@ -3205,9 +3170,31 @@ func_start serial_putc,%d0/%d1/%a0/%a1 ...@@ -3205,9 +3170,31 @@ func_start serial_putc,%d0/%d1/%a0/%a1
1: moveb %a1@(LSRB0),%d0 1: moveb %a1@(LSRB0),%d0
andb #0x4,%d0 andb #0x4,%d0
beq 1b beq 1b
jbra L(serial_putc_done)
2: 2:
#endif #endif
#ifdef CONFIG_HP300
is_not_hp300(3f)
movl %pc@(L(iobase)),%a1
addl %pc@(L(uartbase)),%a1
movel %pc@(L(uart_scode)),%d1 /* Check the scode */
jmi 3f /* Unset? Exit */
cmpi #256,%d1 /* APCI scode? */
jeq 2f
1: moveb %a1@(DCALSR),%d1 /* Output to DCA */
andb #0x20,%d1
beq 1b
moveb %d0,%a1@(DCADATA)
jbra L(serial_putc_done)
2: moveb %a1@(APCILSR),%d1 /* Output to APCI */
andb #0x20,%d1
beq 2b
moveb %d0,%a1@(APCIDATA)
jbra L(serial_putc_done)
3:
#endif
L(serial_putc_done): L(serial_putc_done):
func_return serial_putc func_return serial_putc
...@@ -3295,7 +3282,7 @@ func_start set_leds,%d0/%a0 ...@@ -3295,7 +3282,7 @@ func_start set_leds,%d0/%a0
movel ARG1,%d0 movel ARG1,%d0
#ifdef CONFIG_HP300 #ifdef CONFIG_HP300
is_not_hp300(1f) is_not_hp300(1f)
movel %pc@(L(custom)),%a0 movel %pc@(L(iobase)),%a0
moveb %d0,%a0@(0x1ffff) moveb %d0,%a0@(0x1ffff)
jra 2f jra 2f
#endif #endif
...@@ -3829,10 +3816,6 @@ L(showtest): ...@@ -3829,10 +3816,6 @@ L(showtest):
__INITDATA __INITDATA
.align 4 .align 4
#ifdef CONFIG_HP300
hp300_phys_ram_base:
#endif
#if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA) || \ #if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA) || \
defined(CONFIG_HP300) || defined(CONFIG_APOLLO) defined(CONFIG_HP300) || defined(CONFIG_APOLLO)
L(custom): L(custom):
...@@ -3924,6 +3907,17 @@ LTHRB0 = 0x10416 ...@@ -3924,6 +3907,17 @@ LTHRB0 = 0x10416
LCPUCTRL = 0x10100 LCPUCTRL = 0x10100
#endif #endif
#if defined(CONFIG_HP300)
DCADATA = 0x11
DCALSR = 0x1b
APCIDATA = 0x00
APCILSR = 0x14
L(uartbase):
.long 0
L(uart_scode):
.long -1
#endif
__FINIT __FINIT
.data .data
.align 4 .align 4
......
...@@ -109,6 +109,7 @@ extern int q40_parse_bootinfo(const struct bi_record *); ...@@ -109,6 +109,7 @@ extern int q40_parse_bootinfo(const struct bi_record *);
extern int bvme6000_parse_bootinfo(const struct bi_record *); extern int bvme6000_parse_bootinfo(const struct bi_record *);
extern int mvme16x_parse_bootinfo(const struct bi_record *); extern int mvme16x_parse_bootinfo(const struct bi_record *);
extern int mvme147_parse_bootinfo(const struct bi_record *); extern int mvme147_parse_bootinfo(const struct bi_record *);
extern int hp300_parse_bootinfo(const struct bi_record *);
extern void config_amiga(void); extern void config_amiga(void);
extern void config_atari(void); extern void config_atari(void);
...@@ -175,6 +176,8 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) ...@@ -175,6 +176,8 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)
unknown = mvme16x_parse_bootinfo(record); unknown = mvme16x_parse_bootinfo(record);
else if (MACH_IS_MVME147) else if (MACH_IS_MVME147)
unknown = mvme147_parse_bootinfo(record); unknown = mvme147_parse_bootinfo(record);
else if (MACH_IS_HP300)
unknown = hp300_parse_bootinfo(record);
else else
unknown = 1; unknown = 1;
} }
...@@ -204,20 +207,8 @@ void __init setup_arch(char **cmdline_p) ...@@ -204,20 +207,8 @@ void __init setup_arch(char **cmdline_p)
int i; int i;
char *p, *q; char *p, *q;
if (!MACH_IS_HP300) { /* The bootinfo is located right after the kernel bss */
/* The bootinfo is located right after the kernel bss */ m68k_parse_bootinfo((const struct bi_record *)&_end);
m68k_parse_bootinfo((const struct bi_record *)&_end);
} else {
/* FIXME HP300 doesn't use bootinfo yet */
extern unsigned long hp300_phys_ram_base;
unsigned long hp300_mem_size = 0xffffffff-hp300_phys_ram_base;
m68k_cputype = CPU_68030;
m68k_fputype = FPU_68882;
m68k_memory[0].addr = hp300_phys_ram_base;
/* 0.5M fudge factor */
m68k_memory[0].size = hp300_mem_size-512*1024;
m68k_num_memory++;
}
if (CPU_IS_040) if (CPU_IS_040)
m68k_is040or060 = 4; m68k_is040or060 = 4;
......
...@@ -13,15 +13,20 @@ ...@@ -13,15 +13,20 @@
#define _M68K_BLINKEN_H #define _M68K_BLINKEN_H
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/io.h>
#define HP300_LEDS 0xf001ffff #define HP300_LEDS 0xf001ffff
static __inline__ void blinken_leds(int x) extern unsigned char ledstate;
static __inline__ void blinken_leds(int on, int off)
{ {
if (MACH_IS_HP300) if (MACH_IS_HP300)
{ {
*((volatile unsigned char *)HP300_LEDS) = (x); ledstate |= on;
} ledstate &= ~off;
out_8(HP300_LEDS, ~ledstate);
}
} }
#endif #endif
...@@ -213,7 +213,13 @@ extern struct mac_booter_data ...@@ -213,7 +213,13 @@ extern struct mac_booter_data
#define BI_APOLLO_MODEL 0x8000 /* model (u_long) */ #define BI_APOLLO_MODEL 0x8000 /* model (u_long) */
/*
* HP300-specific tags
*/
#define BI_HP300_MODEL 0x8000 /* model (u_long) */
#define BI_HP300_UART_SCODE 0x8001 /* UART select code (u_long) */
#define BI_HP300_UART_ADDR 0x8002 /* phys. addr of UART (u_long) */
/* /*
* Stuff for bootinfo interface versioning * Stuff for bootinfo interface versioning
...@@ -255,6 +261,7 @@ struct bootversion { ...@@ -255,6 +261,7 @@ struct bootversion {
#define MVME16x_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) #define MVME16x_BOOTI_VERSION MK_BI_VERSION( 2, 0 )
#define BVME6000_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) #define BVME6000_BOOTI_VERSION MK_BI_VERSION( 2, 0 )
#define Q40_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) #define Q40_BOOTI_VERSION MK_BI_VERSION( 2, 0 )
#define HP300_BOOTI_VERSION MK_BI_VERSION( 2, 0 )
#ifdef BOOTINFO_COMPAT_1_0 #ifdef BOOTINFO_COMPAT_1_0
......
#ifndef _M68K_HP300HW_H
#define _M68K_HP300HW_H
extern unsigned long hp300_model;
/* This information was taken from NetBSD */
#define HP_320 (0) /* 16MHz 68020+HP MMU+16K external cache */
#define HP_330 (1) /* 16MHz 68020+68851 MMU */
#define HP_340 (2) /* 16MHz 68030 */
#define HP_345 (3) /* 50MHz 68030+32K external cache */
#define HP_350 (4) /* 25MHz 68020+HP MMU+32K external cache */
#define HP_360 (5) /* 25MHz 68030 */
#define HP_370 (6) /* 33MHz 68030+64K external cache */
#define HP_375 (7) /* 50MHz 68030+32K external cache */
#define HP_380 (8) /* 25MHz 68040 */
#define HP_385 (9) /* 33MHz 68040 */
#define HP_400 (10) /* 50MHz 68030+32K external cache */
#define HP_425T (11) /* 25MHz 68040 - model 425t */
#define HP_425S (12) /* 25MHz 68040 - model 425s */
#define HP_425E (13) /* 25MHz 68040 - model 425e */
#define HP_433T (14) /* 33MHz 68040 - model 433t */
#define HP_433S (15) /* 33MHz 68040 - model 433s */
#endif /* _M68K_HP300HW_H */
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