1da177e4c3
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
68 lines
1.3 KiB
C
68 lines
1.3 KiB
C
/*
|
|
* arch/sh/boards/saturn/smp.c
|
|
*
|
|
* SMP support for the Sega Saturn.
|
|
*
|
|
* Copyright (c) 2002 Paul Mundt
|
|
*
|
|
* Released under the terms of the GNU GPL v2.0.
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/smp.h>
|
|
|
|
#include <asm/saturn/smpc.h>
|
|
|
|
extern void start_secondary(void);
|
|
|
|
void __smp_send_ipi(unsigned int cpu, unsigned int action)
|
|
{
|
|
/* Nothing here yet .. */
|
|
}
|
|
|
|
unsigned int __smp_probe_cpus(void)
|
|
{
|
|
/*
|
|
* This is just a straightforward master/slave configuration,
|
|
* and probing isn't really supported..
|
|
*/
|
|
return 2;
|
|
}
|
|
|
|
/*
|
|
* We're only allowed to do byte-access to SMPC registers. In
|
|
* addition to which, we treat them as write-only, since
|
|
* reading from them will return undefined data.
|
|
*/
|
|
static inline void smpc_slave_stop(unsigned int cpu)
|
|
{
|
|
smpc_barrier();
|
|
ctrl_outb(1, SMPC_STATUS);
|
|
|
|
ctrl_outb(SMPC_CMD_SSHOFF, SMPC_COMMAND);
|
|
smpc_barrier();
|
|
}
|
|
|
|
static inline void smpc_slave_start(unsigned int cpu)
|
|
{
|
|
ctrl_outb(1, SMPC_STATUS);
|
|
ctrl_outb(SMPC_CMD_SSHON, SMPC_COMMAND);
|
|
|
|
smpc_barrier();
|
|
}
|
|
|
|
void __smp_slave_init(unsigned int cpu)
|
|
{
|
|
register unsigned long vbr;
|
|
void **entry;
|
|
|
|
__asm__ __volatile__ ("stc vbr, %0\n\t" : "=r" (vbr));
|
|
entry = (void **)(vbr + 0x310 + 0x94);
|
|
|
|
smpc_slave_stop(cpu);
|
|
|
|
*(void **)entry = (void *)start_secondary;
|
|
|
|
smpc_slave_start(cpu);
|
|
}
|
|
|