- cleanup

- remove dead ppc code
- add support for probing hardware registers the way linux does (early, hook with VBR to trap faults)
- detect MFPs this way.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28031 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
François Revol
2008-10-13 12:56:16 +00:00
parent eaa9af9937
commit 7d49488b80
3 changed files with 89 additions and 167 deletions
@@ -436,6 +436,10 @@ extern void m68k_context_switch(void **_oldStackPointer, void *newStackPointer);
extern bool m68k_set_fault_handler(addr_t *handlerLocation, addr_t handler)
__attribute__((noinline));
extern bool m68k_is_hw_register_readable(addr_t address);
extern bool m68k_is_hw_register_writable(addr_t address, uint16 value);
// defined in kernel: arch/m68k/cpu_asm.S
#ifdef __cplusplus
}
#endif
+69 -159
View File
@@ -7,173 +7,83 @@
.text
#if 0 /* PPC stuff ahead... */
/* uint32 get_sdr1(void);
.cpu 68020
/*
* Those two probe hardware register for presence, trapping bus errors.
* inspired by the Linux version, cf.
* http://lxr.linux.no/linux+v2.6.27/arch/m68k/mm/hwtest.c
*
* though I'm not sure why the tests are on words only.
* Some regs are bytes only and the even byte is unmapped...
* but probably ignored.
*/
FUNCTION(get_sdr1):
mfsdr1 %r3
blr
/* void set_sdr1(uint32 value);
* r3
/* extern bool m68k_is_hw_register_readable(addr_t address);
*/
FUNCTION(set_sdr1):
mtsdr1 %r3
blr
FUNCTION(m68k_is_hw_register_readable):
/* a1: saved_vbr */
/* save sp */
move.l %sp,saved_sp
/* set our fault vector in the table */
move.l #trap_fault_r,fault_vector
/* uint32 get_sr(void *virtualAddress);
* r3
/* swap our table in */
movec %vbr,%a1
move.l #temp_vectors,%a0
movec %a0,%vbr
/* attempt the access */
move.l 4(%sp),%a0
moveq #0,%d0
move.w (%a0),%d1
nop /* flush the pipeline */
moveq #1,%d0
trap_fault_r:
/* restore */
movec %a1,%vbr
move.l saved_sp,%sp
rts
FUNCTION_END(m68k_is_hw_register_readable)
/* extern bool m68k_is_hw_register_writable(addr_t address, uint32 value);
*/
FUNCTION(get_sr):
mfsrin %r3, %r3
blr
FUNCTION(m68k_is_hw_register_writable):
/* a1: saved_vbr */
/* save sp */
move.l %sp,saved_sp
/* set our fault vector in the table */
move.l #trap_fault_w,fault_vector
/* void set_sr(void *virtualAddress, uint32 value);
* r3 r4
*/
FUNCTION(set_sr):
mtsrin %r4, %r3
blr
/* swap our table in */
movec %vbr,%a1
move.l #temp_vectors,%a0
movec %a0,%vbr
/* uint32 get_msr(void);
*/
FUNCTION(get_msr):
mfmsr %r3
blr
/* attempt the access */
move.l 4(%sp),%a0
move.l 8(%sp),%d1
moveq #0,%d0
move.w %d1,(%a0)
/* uint32 set_msr(uint32 value);
* r3
*/
FUNCTION(set_msr):
mtmsr %r3
blr
nop /* flush the pipeline */
moveq #1,%d0
trap_fault_w:
/* restore */
movec %a1,%vbr
move.l saved_sp,%sp
rts
FUNCTION_END(m68k_is_hw_register_writable)
/* uint32 get_pvr(void);
*/
FUNCTION(get_pvr):
mfpvr %r3
blr
/* scratch data for the 2 functions above */
saved_sp:
.long 0
temp_vectors:
.long 0 /* reset sp */
.long 0 /* reset pc */
fault_vector:
.long 0 /* fault */
#define get_ibat(num) \
mfibatu %r4, num; \
stw %r4, 0(%r3); \
mfibatl %r4, num; \
stw %r4, 4(%r3); \
#define set_ibat(num); \
lwz %r4, 0(%r3); \
mtibatu num, %r4; \
lwz %r4, 4(%r3); \
mtibatl num, %r4;
/* void get_ibat0-3(block_address_translation *bat);
* r3
*/
FUNCTION(get_ibat0):
get_ibat(0)
blr
FUNCTION(get_ibat1):
get_ibat(1)
blr
FUNCTION(get_ibat2):
get_ibat(2)
blr
FUNCTION(get_ibat3):
get_ibat(3)
blr
/* void set_ibat0-3(block_address_translation *bat);
* r3
*/
FUNCTION(set_ibat0):
set_ibat(0)
blr
FUNCTION(set_ibat1):
set_ibat(1)
blr
FUNCTION(set_ibat2):
set_ibat(2)
blr
FUNCTION(set_ibat3):
set_ibat(3)
blr
/* void reset_ibats(void)
*/
FUNCTION(reset_ibats):
li %r3, 0
mtibatu 0, %r3
mtibatl 0, %r3
mtibatu 1, %r3
mtibatl 1, %r3
mtibatu 2, %r3
mtibatl 2, %r3
mtibatu 3, %r3
mtibatl 3, %r3
blr
#define get_dbat(num) \
mfdbatu %r4, num; \
stw %r4, 0(%r3); \
mfdbatl %r4, num; \
stw %r4, 4(%r3);
#define set_dbat(num) \
lwz %r4, 0(%r3); \
mtdbatu num, %r4; \
lwz %r4, 4(%r3); \
mtdbatl num, %r4;
/* void get_dbat0-3(block_address_translation *bat);
* r3
*/
FUNCTION(get_dbat0):
get_dbat(0)
blr
FUNCTION(get_dbat1):
get_dbat(1)
blr
FUNCTION(get_dbat2):
get_dbat(2)
blr
FUNCTION(get_dbat3):
get_dbat(3)
blr
/* void set_dbat0-3(block_address_translation *bat);
* r3
*/
FUNCTION(set_dbat0):
set_dbat(0)
blr
FUNCTION(set_dbat1):
set_dbat(1)
blr
FUNCTION(set_dbat2):
set_dbat(2)
blr
FUNCTION(set_dbat3):
set_dbat(3)
blr
/* void reset_dbats(void)
*/
FUNCTION(reset_dbats):
li %r3, 0
mtdbatu 0, %r3
mtdbatl 0, %r3
mtdbatu 1, %r3
mtdbatl 1, %r3
mtdbatu 2, %r3
mtdbatl 2, %r3
mtdbatu 3, %r3
mtdbatl 3, %r3
blr
/* void __eieio(void)
*/
FUNCTION(__eieio):
eieio
blr
#endif
@@ -85,6 +85,9 @@ public:
uint32 Base() const { return fBase; };
int Vector() const { return fVector; };
uint8 ReadReg(uint32 reg) { return in8(fBase + reg); };
void WriteReg(uint32 reg, uint8 v) { out8(fBase + reg, v); };
void EnableIOInterrupt(int irq);
void DisableIOInterrupt(int irq);
bool AcknowledgeIOInterrupt(int irq);
@@ -261,6 +264,7 @@ M68KAtari::Init(struct kernel_args *kernelArgs)
fMFP[0] = NULL;
fMFP[1] = NULL;
// initialize ARAnyM NatFeatures
nfGetID =
kernelArgs->arch_args.plat_args.atari.nat_feat.nf_get_id;
nfCall =
@@ -268,6 +272,14 @@ M68KAtari::Init(struct kernel_args *kernelArgs)
nfPage = (char *)
kernelArgs->arch_args.plat_args.atari.nat_feat.nf_page;
// probe for hardware
if (m68k_is_hw_register_readable(MFP0_BASE))
fMFP[0] = new(sMFP0Buffer) M68KAtari::MFP(MFP0_BASE, MFP0_VECTOR_BASE);
else
panic("You MUST have an ST MFP! Wait, is that *really* an Atari ???");
if (m68k_is_hw_register_readable(MFP1_BASE))
fMFP[1] = new(sMFP1Buffer) M68KAtari::MFP(MFP1_BASE, MFP1_VECTOR_BASE);
//}
return B_OK;
}
@@ -304,10 +316,6 @@ M68KAtari::InitPostVM(struct kernel_args *kernelArgs)
status_t
M68KAtari::InitPIC(struct kernel_args *kernelArgs)
{
fMFP[0] = new(sMFP0Buffer) M68KAtari::MFP(MFP0_BASE, MFP0_VECTOR_BASE);
//if (kernelArgs->arch_args.machine == /*TT*/) {
fMFP[1] = new(sMFP1Buffer) M68KAtari::MFP(MFP1_BASE, MFP1_VECTOR_BASE);
//}
return B_NO_INIT;
}
@@ -326,7 +334,7 @@ status_t
M68KAtari::InitTimer(struct kernel_args *kernelArgs)
{
out8(fMFP[0]->Base() + MFP_TACR, 0); // stop it
fMFP[0]->WriteReg(MFP_TACR, 0); // stop it
install_io_interrupt_handler(fMFP[0]->Vector()+13, &MFPTimerInterrupt, fMFP[0], 0);
return B_OK;
}
@@ -547,15 +555,15 @@ M68KAtari::SetHardwareTimer(bigtime_t timeout)
{
uint8 counts = (uint8)(timeout & 0x0ff);
//XXX: SCALE
out8(fMFP[0]->Base() + MFP_TADR, counts);
out8(fMFP[0]->Base() + MFP_TACR, 0x01); // delay mode, device by 4
fMFP[0]->WriteReg(MFP_TADR, counts);
fMFP[0]->WriteReg(MFP_TACR, 0x01); // delay mode, device by 4
}
void
M68KAtari::ClearHardwareTimer(void)
{
out8(fMFP[0]->Base() + MFP_TACR, 0); // stop it
fMFP[0]->WriteReg(MFP_TACR, 0); // stop it
}