ppc: Remove CHRP, POWER3 and POWER4 support from arch/ppc
32-bit CHRP machines are now supported only in arch/powerpc, as are all 64-bit PowerPC processors. This means that we don't use Open Firmware on any platform in arch/ppc any more. This makes PReP support a single-platform option like every other platform support option in arch/ppc now, thus CONFIG_PPC_MULTIPLATFORM is gone from arch/ppc. CONFIG_PPC_PREP is the option that selects PReP support and is generally what has replaced CONFIG_PPC_MULTIPLATFORM within arch/ppc. _machine is all but dead now, being #defined to 0. Updated Makefiles, comments and Kconfig options generally to reflect these changes. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
@@ -930,55 +930,3 @@ END_FTR_SECTION_IFSET(CPU_FTR_601)
|
||||
b 4b
|
||||
|
||||
.comm ee_restarts,4
|
||||
|
||||
/*
|
||||
* PROM code for specific machines follows. Put it
|
||||
* here so it's easy to add arch-specific sections later.
|
||||
* -- Cort
|
||||
*/
|
||||
#ifdef CONFIG_PPC_OF
|
||||
/*
|
||||
* On CHRP, the Run-Time Abstraction Services (RTAS) have to be
|
||||
* called with the MMU off.
|
||||
*/
|
||||
_GLOBAL(enter_rtas)
|
||||
stwu r1,-INT_FRAME_SIZE(r1)
|
||||
mflr r0
|
||||
stw r0,INT_FRAME_SIZE+4(r1)
|
||||
lis r4,rtas_data@ha
|
||||
lwz r4,rtas_data@l(r4)
|
||||
lis r6,1f@ha /* physical return address for rtas */
|
||||
addi r6,r6,1f@l
|
||||
tophys(r6,r6)
|
||||
tophys(r7,r1)
|
||||
lis r8,rtas_entry@ha
|
||||
lwz r8,rtas_entry@l(r8)
|
||||
mfmsr r9
|
||||
stw r9,8(r1)
|
||||
LOAD_MSR_KERNEL(r0,MSR_KERNEL)
|
||||
SYNC /* disable interrupts so SRR0/1 */
|
||||
MTMSRD(r0) /* don't get trashed */
|
||||
li r9,MSR_KERNEL & ~(MSR_IR|MSR_DR)
|
||||
mtlr r6
|
||||
CLR_TOP32(r7)
|
||||
mtspr SPRN_SPRG2,r7
|
||||
mtspr SPRN_SRR0,r8
|
||||
mtspr SPRN_SRR1,r9
|
||||
RFI
|
||||
1: tophys(r9,r1)
|
||||
lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */
|
||||
lwz r9,8(r9) /* original msr value */
|
||||
FIX_SRR1(r9,r0)
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
li r0,0
|
||||
mtspr SPRN_SPRG2,r0
|
||||
mtspr SPRN_SRR0,r8
|
||||
mtspr SPRN_SRR1,r9
|
||||
RFI /* return to caller */
|
||||
|
||||
.globl machine_check_in_rtas
|
||||
machine_check_in_rtas:
|
||||
twi 31,0,0
|
||||
/* XXX load up BATs and panic */
|
||||
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
|
@@ -37,19 +37,6 @@
|
||||
#include <asm/amigappc.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
#define LOAD_BAT(n, reg, RA, RB) \
|
||||
ld RA,(n*32)+0(reg); \
|
||||
ld RB,(n*32)+8(reg); \
|
||||
mtspr SPRN_IBAT##n##U,RA; \
|
||||
mtspr SPRN_IBAT##n##L,RB; \
|
||||
ld RA,(n*32)+16(reg); \
|
||||
ld RB,(n*32)+24(reg); \
|
||||
mtspr SPRN_DBAT##n##U,RA; \
|
||||
mtspr SPRN_DBAT##n##L,RB; \
|
||||
|
||||
#else /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/* 601 only have IBAT; cr0.eq is set on 601 when using this macro */
|
||||
#define LOAD_BAT(n, reg, RA, RB) \
|
||||
/* see the comment for clear_bats() -- Cort */ \
|
||||
@@ -66,7 +53,6 @@
|
||||
mtspr SPRN_DBAT##n##U,RA; \
|
||||
mtspr SPRN_DBAT##n##L,RB; \
|
||||
1:
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
.text
|
||||
.stabs "arch/ppc/kernel/",N_SO,0,0,0f
|
||||
@@ -129,11 +115,6 @@ _start:
|
||||
|
||||
.globl __start
|
||||
__start:
|
||||
/*
|
||||
* We have to do any OF calls before we map ourselves to KERNELBASE,
|
||||
* because OF may have I/O devices mapped into that area
|
||||
* (particularly on CHRP).
|
||||
*/
|
||||
mr r31,r3 /* save parameters */
|
||||
mr r30,r4
|
||||
mr r29,r5
|
||||
@@ -148,14 +129,6 @@ __start:
|
||||
*/
|
||||
bl early_init
|
||||
|
||||
/*
|
||||
* On POWER4, we first need to tweak some CPU configuration registers
|
||||
* like real mode cache inhibit or exception base
|
||||
*/
|
||||
#ifdef CONFIG_POWER4
|
||||
bl __970_cpu_preinit
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
#ifdef CONFIG_APUS
|
||||
/* On APUS the __va/__pa constants need to be set to the correct
|
||||
* values before continuing.
|
||||
@@ -169,7 +142,6 @@ __start:
|
||||
*/
|
||||
bl mmu_off
|
||||
__after_mmu_off:
|
||||
#ifndef CONFIG_POWER4
|
||||
bl clear_bats
|
||||
bl flush_tlbs
|
||||
|
||||
@@ -177,10 +149,6 @@ __after_mmu_off:
|
||||
#if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT)
|
||||
bl setup_disp_bat
|
||||
#endif
|
||||
#else /* CONFIG_POWER4 */
|
||||
bl reloc_offset
|
||||
bl initial_mm_power4
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
/*
|
||||
* Call setup_cpu for CPU 0 and initialize 6xx Idle
|
||||
@@ -192,18 +160,11 @@ __after_mmu_off:
|
||||
bl reloc_offset
|
||||
bl init_idle_6xx
|
||||
#endif /* CONFIG_6xx */
|
||||
#ifdef CONFIG_POWER4
|
||||
bl reloc_offset
|
||||
bl init_idle_power4
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
|
||||
#ifndef CONFIG_APUS
|
||||
/*
|
||||
* We need to run with _start at physical address 0.
|
||||
* On CHRP, we are loaded at 0x10000 since OF on CHRP uses
|
||||
* the exception vectors at 0 (and therefore this copy
|
||||
* overwrites OF's exception vectors with our own).
|
||||
* If the MMU is already turned on, we copy stuff to KERNELBASE,
|
||||
* otherwise we copy it to 0.
|
||||
*/
|
||||
@@ -358,51 +319,19 @@ i##n: \
|
||||
#endif
|
||||
|
||||
/* Machine check */
|
||||
/*
|
||||
* On CHRP, this is complicated by the fact that we could get a
|
||||
* machine check inside RTAS, and we have no guarantee that certain
|
||||
* critical registers will have the values we expect. The set of
|
||||
* registers that might have bad values includes all the GPRs
|
||||
* and all the BATs. We indicate that we are in RTAS by putting
|
||||
* a non-zero value, the address of the exception frame to use,
|
||||
* in SPRG2. The machine check handler checks SPRG2 and uses its
|
||||
* value if it is non-zero. If we ever needed to free up SPRG2,
|
||||
* we could use a field in the thread_info or thread_struct instead.
|
||||
* (Other exception handlers assume that r1 is a valid kernel stack
|
||||
* pointer when we take an exception from supervisor mode.)
|
||||
* -- paulus.
|
||||
*/
|
||||
. = 0x200
|
||||
mtspr SPRN_SPRG0,r10
|
||||
mtspr SPRN_SPRG1,r11
|
||||
mfcr r10
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
mfspr r11,SPRN_SPRG2
|
||||
cmpwi 0,r11,0
|
||||
bne 7f
|
||||
#endif /* CONFIG_PPC_CHRP */
|
||||
EXCEPTION_PROLOG_1
|
||||
7: EXCEPTION_PROLOG_2
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
mfspr r4,SPRN_SPRG2
|
||||
cmpwi cr1,r4,0
|
||||
bne cr1,1f
|
||||
#endif
|
||||
EXC_XFER_STD(0x200, machine_check_exception)
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
1: b machine_check_in_rtas
|
||||
#endif
|
||||
|
||||
/* Data access exception. */
|
||||
. = 0x300
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
b DataAccess
|
||||
DataAccessCont:
|
||||
#else
|
||||
DataAccess:
|
||||
EXCEPTION_PROLOG
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
mfspr r10,SPRN_DSISR
|
||||
andis. r0,r10,0xa470 /* weird error? */
|
||||
bne 1f /* if not, try to put a PTE */
|
||||
@@ -414,21 +343,10 @@ DataAccess:
|
||||
mfspr r4,SPRN_DAR
|
||||
EXC_XFER_EE_LITE(0x300, handle_page_fault)
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* SLB fault on data access. */
|
||||
. = 0x380
|
||||
b DataSegment
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/* Instruction access exception. */
|
||||
. = 0x400
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
b InstructionAccess
|
||||
InstructionAccessCont:
|
||||
#else
|
||||
InstructionAccess:
|
||||
EXCEPTION_PROLOG
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
andis. r0,r9,0x4000 /* no pte found? */
|
||||
beq 1f /* if so, try to put a PTE */
|
||||
li r3,0 /* into the hash table */
|
||||
@@ -438,12 +356,6 @@ InstructionAccess:
|
||||
mr r5,r9
|
||||
EXC_XFER_EE_LITE(0x400, handle_page_fault)
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* SLB fault on instruction access. */
|
||||
. = 0x480
|
||||
b InstructionSegment
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
/* External interrupt */
|
||||
EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
|
||||
|
||||
@@ -708,15 +620,9 @@ DataStoreTLBMiss:
|
||||
EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_EE)
|
||||
EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
|
||||
#ifdef CONFIG_POWER4
|
||||
EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1700, Trap_17, altivec_assist_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1800, Trap_18, TAUException, EXC_XFER_STD)
|
||||
#else /* !CONFIG_POWER4 */
|
||||
EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD)
|
||||
EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
|
||||
#endif /* CONFIG_POWER4 */
|
||||
EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_EE)
|
||||
@@ -754,28 +660,6 @@ AltiVecUnavailable:
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception)
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
DataAccess:
|
||||
EXCEPTION_PROLOG
|
||||
b DataAccessCont
|
||||
|
||||
InstructionAccess:
|
||||
EXCEPTION_PROLOG
|
||||
b InstructionAccessCont
|
||||
|
||||
DataSegment:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
mfspr r4,SPRN_DAR
|
||||
stw r4,_DAR(r11)
|
||||
EXC_XFER_STD(0x380, unknown_exception)
|
||||
|
||||
InstructionSegment:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0x480, unknown_exception)
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* Note that the AltiVec support is closely modeled after the FP
|
||||
* support. Changes to one are likely to be applicable to the
|
||||
@@ -1048,13 +932,6 @@ __secondary_start_pmac_0:
|
||||
|
||||
.globl __secondary_start
|
||||
__secondary_start:
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
mfmsr r0
|
||||
clrldi r0,r0,1 /* make sure it's in 32-bit mode */
|
||||
SYNC
|
||||
MTMSRD(r0)
|
||||
isync
|
||||
#endif
|
||||
/* Copy some CPU settings from CPU 0 */
|
||||
bl __restore_cpu_setup
|
||||
|
||||
@@ -1065,10 +942,6 @@ __secondary_start:
|
||||
lis r3,-KERNELBASE@h
|
||||
bl init_idle_6xx
|
||||
#endif /* CONFIG_6xx */
|
||||
#ifdef CONFIG_POWER4
|
||||
lis r3,-KERNELBASE@h
|
||||
bl init_idle_power4
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
/* get current_thread_info and current */
|
||||
lis r1,secondary_ti@ha
|
||||
@@ -1109,12 +982,12 @@ __secondary_start:
|
||||
* Those generic dummy functions are kept for CPUs not
|
||||
* included in CONFIG_6xx
|
||||
*/
|
||||
#if !defined(CONFIG_6xx) && !defined(CONFIG_POWER4)
|
||||
#if !defined(CONFIG_6xx)
|
||||
_GLOBAL(__save_cpu_setup)
|
||||
blr
|
||||
_GLOBAL(__restore_cpu_setup)
|
||||
blr
|
||||
#endif /* !defined(CONFIG_6xx) && !defined(CONFIG_POWER4) */
|
||||
#endif /* !defined(CONFIG_6xx) */
|
||||
|
||||
|
||||
/*
|
||||
@@ -1132,11 +1005,6 @@ load_up_mmu:
|
||||
tophys(r6,r6)
|
||||
lwz r6,_SDR1@l(r6)
|
||||
mtspr SPRN_SDR1,r6
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* clear the ASR so we only use the pseudo-segment registers. */
|
||||
li r6,0
|
||||
mtasr r6
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
li r0,16 /* load up segment register values */
|
||||
mtctr r0 /* for context 0 */
|
||||
lis r3,0x2000 /* Ku = 1, VSID = 0 */
|
||||
@@ -1145,7 +1013,7 @@ load_up_mmu:
|
||||
addi r3,r3,0x111 /* increment VSID */
|
||||
addis r4,r4,0x1000 /* address of next segment */
|
||||
bdnz 3b
|
||||
#ifndef CONFIG_POWER4
|
||||
|
||||
/* Load the BAT registers with the values set up by MMU_init.
|
||||
MMU_init takes care of whether we're on a 601 or not. */
|
||||
mfpvr r3
|
||||
@@ -1158,7 +1026,7 @@ load_up_mmu:
|
||||
LOAD_BAT(1,r3,r4,r5)
|
||||
LOAD_BAT(2,r3,r4,r5)
|
||||
LOAD_BAT(3,r3,r4,r5)
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
blr
|
||||
|
||||
/*
|
||||
@@ -1269,9 +1137,6 @@ _GLOBAL(set_context)
|
||||
li r4,0
|
||||
isync
|
||||
3:
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
slbie r4
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
mtsrin r3,r4
|
||||
addi r3,r3,0x111 /* next VSID */
|
||||
rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */
|
||||
@@ -1358,7 +1223,6 @@ mmu_off:
|
||||
sync
|
||||
RFI
|
||||
|
||||
#ifndef CONFIG_POWER4
|
||||
/*
|
||||
* Use the first pair of BAT registers to map the 1st 16MB
|
||||
* of RAM to KERNELBASE. From this point on we can't safely
|
||||
@@ -1366,7 +1230,6 @@ mmu_off:
|
||||
*/
|
||||
initial_bats:
|
||||
lis r11,KERNELBASE@h
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
mfspr r9,SPRN_PVR
|
||||
rlwinm r9,r9,16,16,31 /* r9 = 1 for 601, 4 for 604 */
|
||||
cmpwi 0,r9,1
|
||||
@@ -1381,7 +1244,6 @@ initial_bats:
|
||||
mtspr SPRN_IBAT1L,r10
|
||||
isync
|
||||
blr
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
|
||||
4: tophys(r8,r11)
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -1395,11 +1257,6 @@ initial_bats:
|
||||
ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */
|
||||
#endif /* CONFIG_APUS */
|
||||
|
||||
#ifdef CONFIG_PPC64BRIDGE
|
||||
/* clear out the high 32 bits in the BAT */
|
||||
clrldi r11,r11,32
|
||||
clrldi r8,r8,32
|
||||
#endif /* CONFIG_PPC64BRIDGE */
|
||||
mtspr SPRN_DBAT0L,r8 /* N.B. 6xx (not 601) have valid */
|
||||
mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */
|
||||
mtspr SPRN_IBAT0L,r8
|
||||
@@ -1432,38 +1289,6 @@ setup_disp_bat:
|
||||
|
||||
#endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */
|
||||
|
||||
#else /* CONFIG_POWER4 */
|
||||
/*
|
||||
* Load up the SDR1 and segment register values now
|
||||
* since we don't have the BATs.
|
||||
* Also make sure we are running in 32-bit mode.
|
||||
*/
|
||||
|
||||
initial_mm_power4:
|
||||
addis r14,r3,_SDR1@ha /* get the value from _SDR1 */
|
||||
lwz r14,_SDR1@l(r14) /* assume hash table below 4GB */
|
||||
mtspr SPRN_SDR1,r14
|
||||
slbia
|
||||
lis r4,0x2000 /* set pseudo-segment reg 12 */
|
||||
ori r5,r4,0x0ccc
|
||||
mtsr 12,r5
|
||||
#if 0
|
||||
ori r5,r4,0x0888 /* set pseudo-segment reg 8 */
|
||||
mtsr 8,r5 /* (for access to serial port) */
|
||||
#endif
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
ori r5,r4,0x0999 /* set pseudo-segment reg 9 */
|
||||
mtsr 9,r5 /* (for access to screen) */
|
||||
#endif
|
||||
mfmsr r0
|
||||
clrldi r0,r0,1
|
||||
sync
|
||||
mtmsr r0
|
||||
isync
|
||||
blr
|
||||
|
||||
#endif /* CONFIG_POWER4 */
|
||||
|
||||
#ifdef CONFIG_8260
|
||||
/* Jump into the system reset for the rom.
|
||||
* We first disable the MMU, and then jump to the ROM reset address.
|
||||
|
@@ -46,9 +46,6 @@ static void pcibios_fixup_resources(struct pci_dev* dev);
|
||||
static void fixup_broken_pcnet32(struct pci_dev* dev);
|
||||
static int reparent_resources(struct resource *parent, struct resource *res);
|
||||
static void fixup_cpc710_pci64(struct pci_dev* dev);
|
||||
#ifdef CONFIG_PPC_OF
|
||||
static u8* pci_to_OF_bus_map;
|
||||
#endif
|
||||
|
||||
/* By default, we don't re-assign bus numbers.
|
||||
*/
|
||||
@@ -625,406 +622,13 @@ pcibios_alloc_controller(void)
|
||||
return hose;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
/*
|
||||
* Functions below are used on OpenFirmware machines.
|
||||
*/
|
||||
static void
|
||||
make_one_node_map(struct device_node* node, u8 pci_bus)
|
||||
{
|
||||
int *bus_range;
|
||||
int len;
|
||||
|
||||
if (pci_bus >= pci_bus_count)
|
||||
return;
|
||||
bus_range = (int *) get_property(node, "bus-range", &len);
|
||||
if (bus_range == NULL || len < 2 * sizeof(int)) {
|
||||
printk(KERN_WARNING "Can't get bus-range for %s, "
|
||||
"assuming it starts at 0\n", node->full_name);
|
||||
pci_to_OF_bus_map[pci_bus] = 0;
|
||||
} else
|
||||
pci_to_OF_bus_map[pci_bus] = bus_range[0];
|
||||
|
||||
for (node=node->child; node != 0;node = node->sibling) {
|
||||
struct pci_dev* dev;
|
||||
unsigned int *class_code, *reg;
|
||||
|
||||
class_code = (unsigned int *) get_property(node, "class-code", NULL);
|
||||
if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
|
||||
(*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS))
|
||||
continue;
|
||||
reg = (unsigned int *)get_property(node, "reg", NULL);
|
||||
if (!reg)
|
||||
continue;
|
||||
dev = pci_find_slot(pci_bus, ((reg[0] >> 8) & 0xff));
|
||||
if (!dev || !dev->subordinate)
|
||||
continue;
|
||||
make_one_node_map(node, dev->subordinate->number);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pcibios_make_OF_bus_map(void)
|
||||
{
|
||||
int i;
|
||||
struct pci_controller* hose;
|
||||
u8* of_prop_map;
|
||||
|
||||
pci_to_OF_bus_map = (u8*)kmalloc(pci_bus_count, GFP_KERNEL);
|
||||
if (!pci_to_OF_bus_map) {
|
||||
printk(KERN_ERR "Can't allocate OF bus map !\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* We fill the bus map with invalid values, that helps
|
||||
* debugging.
|
||||
*/
|
||||
for (i=0; i<pci_bus_count; i++)
|
||||
pci_to_OF_bus_map[i] = 0xff;
|
||||
|
||||
/* For each hose, we begin searching bridges */
|
||||
for(hose=hose_head; hose; hose=hose->next) {
|
||||
struct device_node* node;
|
||||
node = (struct device_node *)hose->arch_data;
|
||||
if (!node)
|
||||
continue;
|
||||
make_one_node_map(node, hose->first_busno);
|
||||
}
|
||||
of_prop_map = get_property(find_path_device("/"), "pci-OF-bus-map", NULL);
|
||||
if (of_prop_map)
|
||||
memcpy(of_prop_map, pci_to_OF_bus_map, pci_bus_count);
|
||||
#ifdef DEBUG
|
||||
printk("PCI->OF bus map:\n");
|
||||
for (i=0; i<pci_bus_count; i++) {
|
||||
if (pci_to_OF_bus_map[i] == 0xff)
|
||||
continue;
|
||||
printk("%d -> %d\n", i, pci_to_OF_bus_map[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data);
|
||||
|
||||
static struct device_node*
|
||||
scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data)
|
||||
{
|
||||
struct device_node* sub_node;
|
||||
|
||||
for (; node != 0;node = node->sibling) {
|
||||
unsigned int *class_code;
|
||||
|
||||
if (filter(node, data))
|
||||
return node;
|
||||
|
||||
/* For PCI<->PCI bridges or CardBus bridges, we go down
|
||||
* Note: some OFs create a parent node "multifunc-device" as
|
||||
* a fake root for all functions of a multi-function device,
|
||||
* we go down them as well.
|
||||
*/
|
||||
class_code = (unsigned int *) get_property(node, "class-code", NULL);
|
||||
if ((!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
|
||||
(*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) &&
|
||||
strcmp(node->name, "multifunc-device"))
|
||||
continue;
|
||||
sub_node = scan_OF_pci_childs(node->child, filter, data);
|
||||
if (sub_node)
|
||||
return sub_node;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
scan_OF_pci_childs_iterator(struct device_node* node, void* data)
|
||||
{
|
||||
unsigned int *reg;
|
||||
u8* fdata = (u8*)data;
|
||||
|
||||
reg = (unsigned int *) get_property(node, "reg", NULL);
|
||||
if (reg && ((reg[0] >> 8) & 0xff) == fdata[1]
|
||||
&& ((reg[0] >> 16) & 0xff) == fdata[0])
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct device_node*
|
||||
scan_OF_childs_for_device(struct device_node* node, u8 bus, u8 dev_fn)
|
||||
{
|
||||
u8 filter_data[2] = {bus, dev_fn};
|
||||
|
||||
return scan_OF_pci_childs(node, scan_OF_pci_childs_iterator, filter_data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Scans the OF tree for a device node matching a PCI device
|
||||
*/
|
||||
struct device_node *
|
||||
pci_busdev_to_OF_node(struct pci_bus *bus, int devfn)
|
||||
{
|
||||
struct pci_controller *hose;
|
||||
struct device_node *node;
|
||||
int busnr;
|
||||
|
||||
if (!have_of)
|
||||
return NULL;
|
||||
|
||||
/* Lookup the hose */
|
||||
busnr = bus->number;
|
||||
hose = pci_bus_to_hose(busnr);
|
||||
if (!hose)
|
||||
return NULL;
|
||||
|
||||
/* Check it has an OF node associated */
|
||||
node = (struct device_node *) hose->arch_data;
|
||||
if (!node)
|
||||
return NULL;
|
||||
|
||||
/* Fixup bus number according to what OF think it is. */
|
||||
if (pci_to_OF_bus_map)
|
||||
busnr = pci_to_OF_bus_map[busnr];
|
||||
if (busnr == 0xff)
|
||||
return NULL;
|
||||
|
||||
/* Now, lookup childs of the hose */
|
||||
return scan_OF_childs_for_device(node->child, busnr, devfn);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_busdev_to_OF_node);
|
||||
|
||||
struct device_node*
|
||||
pci_device_to_OF_node(struct pci_dev *dev)
|
||||
{
|
||||
return pci_busdev_to_OF_node(dev->bus, dev->devfn);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_device_to_OF_node);
|
||||
|
||||
/* This routine is meant to be used early during boot, when the
|
||||
* PCI bus numbers have not yet been assigned, and you need to
|
||||
* issue PCI config cycles to an OF device.
|
||||
* It could also be used to "fix" RTAS config cycles if you want
|
||||
* to set pci_assign_all_buses to 1 and still use RTAS for PCI
|
||||
* config cycles.
|
||||
*/
|
||||
struct pci_controller* pci_find_hose_for_OF_device(struct device_node* node)
|
||||
{
|
||||
if (!have_of)
|
||||
return NULL;
|
||||
while(node) {
|
||||
struct pci_controller* hose;
|
||||
for (hose=hose_head;hose;hose=hose->next)
|
||||
if (hose->arch_data == node)
|
||||
return hose;
|
||||
node=node->parent;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
find_OF_pci_device_filter(struct device_node* node, void* data)
|
||||
{
|
||||
return ((void *)node == data);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the PCI device matching a given OF node
|
||||
*/
|
||||
int
|
||||
pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn)
|
||||
{
|
||||
unsigned int *reg;
|
||||
struct pci_controller* hose;
|
||||
struct pci_dev* dev = NULL;
|
||||
|
||||
if (!have_of)
|
||||
return -ENODEV;
|
||||
/* Make sure it's really a PCI device */
|
||||
hose = pci_find_hose_for_OF_device(node);
|
||||
if (!hose || !hose->arch_data)
|
||||
return -ENODEV;
|
||||
if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child,
|
||||
find_OF_pci_device_filter, (void *)node))
|
||||
return -ENODEV;
|
||||
reg = (unsigned int *) get_property(node, "reg", NULL);
|
||||
if (!reg)
|
||||
return -ENODEV;
|
||||
*bus = (reg[0] >> 16) & 0xff;
|
||||
*devfn = ((reg[0] >> 8) & 0xff);
|
||||
|
||||
/* Ok, here we need some tweak. If we have already renumbered
|
||||
* all busses, we can't rely on the OF bus number any more.
|
||||
* the pci_to_OF_bus_map is not enough as several PCI busses
|
||||
* may match the same OF bus number.
|
||||
*/
|
||||
if (!pci_to_OF_bus_map)
|
||||
return 0;
|
||||
|
||||
for_each_pci_dev(dev)
|
||||
if (pci_to_OF_bus_map[dev->bus->number] == *bus &&
|
||||
dev->devfn == *devfn) {
|
||||
*bus = dev->bus->number;
|
||||
pci_dev_put(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_device_from_OF_node);
|
||||
|
||||
void __init
|
||||
pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||
struct device_node *dev, int primary)
|
||||
{
|
||||
static unsigned int static_lc_ranges[256] __initdata;
|
||||
unsigned int *dt_ranges, *lc_ranges, *ranges, *prev;
|
||||
unsigned int size;
|
||||
int rlen = 0, orig_rlen;
|
||||
int memno = 0;
|
||||
struct resource *res;
|
||||
int np, na = prom_n_addr_cells(dev);
|
||||
np = na + 5;
|
||||
|
||||
/* First we try to merge ranges to fix a problem with some pmacs
|
||||
* that can have more than 3 ranges, fortunately using contiguous
|
||||
* addresses -- BenH
|
||||
*/
|
||||
dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
|
||||
if (!dt_ranges)
|
||||
return;
|
||||
/* Sanity check, though hopefully that never happens */
|
||||
if (rlen > sizeof(static_lc_ranges)) {
|
||||
printk(KERN_WARNING "OF ranges property too large !\n");
|
||||
rlen = sizeof(static_lc_ranges);
|
||||
}
|
||||
lc_ranges = static_lc_ranges;
|
||||
memcpy(lc_ranges, dt_ranges, rlen);
|
||||
orig_rlen = rlen;
|
||||
|
||||
/* Let's work on a copy of the "ranges" property instead of damaging
|
||||
* the device-tree image in memory
|
||||
*/
|
||||
ranges = lc_ranges;
|
||||
prev = NULL;
|
||||
while ((rlen -= np * sizeof(unsigned int)) >= 0) {
|
||||
if (prev) {
|
||||
if (prev[0] == ranges[0] && prev[1] == ranges[1] &&
|
||||
(prev[2] + prev[na+4]) == ranges[2] &&
|
||||
(prev[na+2] + prev[na+4]) == ranges[na+2]) {
|
||||
prev[na+4] += ranges[na+4];
|
||||
ranges[0] = 0;
|
||||
ranges += np;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
prev = ranges;
|
||||
ranges += np;
|
||||
}
|
||||
|
||||
/*
|
||||
* The ranges property is laid out as an array of elements,
|
||||
* each of which comprises:
|
||||
* cells 0 - 2: a PCI address
|
||||
* cells 3 or 3+4: a CPU physical address
|
||||
* (size depending on dev->n_addr_cells)
|
||||
* cells 4+5 or 5+6: the size of the range
|
||||
*/
|
||||
ranges = lc_ranges;
|
||||
rlen = orig_rlen;
|
||||
while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) {
|
||||
res = NULL;
|
||||
size = ranges[na+4];
|
||||
switch ((ranges[0] >> 24) & 0x3) {
|
||||
case 1: /* I/O space */
|
||||
if (ranges[2] != 0)
|
||||
break;
|
||||
hose->io_base_phys = ranges[na+2];
|
||||
/* limit I/O space to 16MB */
|
||||
if (size > 0x01000000)
|
||||
size = 0x01000000;
|
||||
hose->io_base_virt = ioremap(ranges[na+2], size);
|
||||
if (primary)
|
||||
isa_io_base = (unsigned long) hose->io_base_virt;
|
||||
res = &hose->io_resource;
|
||||
res->flags = IORESOURCE_IO;
|
||||
res->start = ranges[2];
|
||||
DBG("PCI: IO 0x%lx -> 0x%lx\n",
|
||||
res->start, res->start + size - 1);
|
||||
break;
|
||||
case 2: /* memory space */
|
||||
memno = 0;
|
||||
if (ranges[1] == 0 && ranges[2] == 0
|
||||
&& ranges[na+4] <= (16 << 20)) {
|
||||
/* 1st 16MB, i.e. ISA memory area */
|
||||
if (primary)
|
||||
isa_mem_base = ranges[na+2];
|
||||
memno = 1;
|
||||
}
|
||||
while (memno < 3 && hose->mem_resources[memno].flags)
|
||||
++memno;
|
||||
if (memno == 0)
|
||||
hose->pci_mem_offset = ranges[na+2] - ranges[2];
|
||||
if (memno < 3) {
|
||||
res = &hose->mem_resources[memno];
|
||||
res->flags = IORESOURCE_MEM;
|
||||
if(ranges[0] & 0x40000000)
|
||||
res->flags |= IORESOURCE_PREFETCH;
|
||||
res->start = ranges[na+2];
|
||||
DBG("PCI: MEM[%d] 0x%lx -> 0x%lx\n", memno,
|
||||
res->start, res->start + size - 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (res != NULL) {
|
||||
res->name = dev->full_name;
|
||||
res->end = res->start + size - 1;
|
||||
res->parent = NULL;
|
||||
res->sibling = NULL;
|
||||
res->child = NULL;
|
||||
}
|
||||
ranges += np;
|
||||
}
|
||||
}
|
||||
|
||||
/* We create the "pci-OF-bus-map" property now so it appears in the
|
||||
* /proc device tree
|
||||
*/
|
||||
void __init
|
||||
pci_create_OF_bus_map(void)
|
||||
{
|
||||
struct property* of_prop;
|
||||
|
||||
of_prop = (struct property*) alloc_bootmem(sizeof(struct property) + 256);
|
||||
if (of_prop && find_path_device("/")) {
|
||||
memset(of_prop, -1, sizeof(struct property) + 256);
|
||||
of_prop->name = "pci-OF-bus-map";
|
||||
of_prop->length = 256;
|
||||
of_prop->value = (unsigned char *)&of_prop[1];
|
||||
prom_add_property(find_path_device("/"), of_prop);
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t pci_show_devspec(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
struct device_node *np;
|
||||
|
||||
pdev = to_pci_dev (dev);
|
||||
np = pci_device_to_OF_node(pdev);
|
||||
if (np == NULL || np->full_name == NULL)
|
||||
return 0;
|
||||
return sprintf(buf, "%s", np->full_name);
|
||||
}
|
||||
static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL);
|
||||
|
||||
#else /* CONFIG_PPC_OF */
|
||||
void pcibios_make_OF_bus_map(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
|
||||
/* Add sysfs properties */
|
||||
void pcibios_add_platform_entries(struct pci_dev *pdev)
|
||||
{
|
||||
#ifdef CONFIG_PPC_OF
|
||||
device_create_file(&pdev->dev, &dev_attr_devspec);
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
}
|
||||
|
||||
|
||||
|
@@ -104,7 +104,7 @@ static char *pmc2_lookup(unsigned long mmcr0)
|
||||
static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
{
|
||||
unsigned long mmcr0 = 0, pmc1 = 0, pmc2 = 0;
|
||||
#if defined(CONFIG_PPC_STD_MMU) && !defined(CONFIG_PPC64BRIDGE)
|
||||
#if defined(CONFIG_PPC_STD_MMU)
|
||||
unsigned int kptes = 0, uptes = 0;
|
||||
PTE *ptr;
|
||||
#endif /* CONFIG_PPC_STD_MMU */
|
||||
@@ -133,7 +133,6 @@ static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
for (ptr = Hash; ptr < Hash_end; ptr++) {
|
||||
unsigned int mctx, vsid;
|
||||
|
||||
@@ -147,7 +146,6 @@ static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
else
|
||||
uptes++;
|
||||
}
|
||||
#endif
|
||||
|
||||
seq_printf(m,
|
||||
"PTE Hash Table Information\n"
|
||||
@@ -155,20 +153,16 @@ static int ppc_htab_show(struct seq_file *m, void *v)
|
||||
"Buckets\t\t: %lu\n"
|
||||
"Address\t\t: %08lx\n"
|
||||
"Entries\t\t: %lu\n"
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
"User ptes\t: %u\n"
|
||||
"Kernel ptes\t: %u\n"
|
||||
"Percent full\t: %lu%%\n"
|
||||
#endif
|
||||
, (unsigned long)(Hash_size>>10),
|
||||
(Hash_size/(sizeof(PTE)*8)),
|
||||
(unsigned long)Hash,
|
||||
Hash_size/sizeof(PTE)
|
||||
#ifndef CONFIG_PPC64BRIDGE
|
||||
, uptes,
|
||||
kptes,
|
||||
((kptes+uptes)*100) / (Hash_size/sizeof(PTE))
|
||||
#endif
|
||||
);
|
||||
|
||||
seq_printf(m,
|
||||
|
@@ -29,7 +29,6 @@
|
||||
#include <linux/adb.h>
|
||||
#include <linux/cuda.h>
|
||||
#include <linux/pmu.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -207,27 +206,6 @@ EXPORT_SYMBOL(adb_try_handler_change);
|
||||
EXPORT_SYMBOL(cuda_request);
|
||||
EXPORT_SYMBOL(cuda_poll);
|
||||
#endif /* CONFIG_ADB_CUDA */
|
||||
#ifdef CONFIG_PPC_OF
|
||||
EXPORT_SYMBOL(find_devices);
|
||||
EXPORT_SYMBOL(find_type_devices);
|
||||
EXPORT_SYMBOL(find_compatible_devices);
|
||||
EXPORT_SYMBOL(find_path_device);
|
||||
EXPORT_SYMBOL(device_is_compatible);
|
||||
EXPORT_SYMBOL(machine_is_compatible);
|
||||
EXPORT_SYMBOL(find_all_nodes);
|
||||
EXPORT_SYMBOL(get_property);
|
||||
EXPORT_SYMBOL(request_OF_resource);
|
||||
EXPORT_SYMBOL(release_OF_resource);
|
||||
EXPORT_SYMBOL(of_find_node_by_name);
|
||||
EXPORT_SYMBOL(of_find_node_by_type);
|
||||
EXPORT_SYMBOL(of_find_compatible_node);
|
||||
EXPORT_SYMBOL(of_find_node_by_path);
|
||||
EXPORT_SYMBOL(of_find_all_nodes);
|
||||
EXPORT_SYMBOL(of_get_parent);
|
||||
EXPORT_SYMBOL(of_get_next_child);
|
||||
EXPORT_SYMBOL(of_node_get);
|
||||
EXPORT_SYMBOL(of_node_put);
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
#if defined(CONFIG_BOOTX_TEXT)
|
||||
EXPORT_SYMBOL(btext_update_display);
|
||||
#endif
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Common prep/chrp boot and setup code.
|
||||
* Common prep boot and setup code.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
@@ -72,17 +72,12 @@ unsigned long ISA_DMA_THRESHOLD;
|
||||
unsigned int DMA_MODE_READ;
|
||||
unsigned int DMA_MODE_WRITE;
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
int _machine = 0;
|
||||
EXPORT_SYMBOL(_machine);
|
||||
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
extern void prep_init(unsigned long r3, unsigned long r4,
|
||||
unsigned long r5, unsigned long r6, unsigned long r7);
|
||||
extern void chrp_init(unsigned long r3, unsigned long r4,
|
||||
unsigned long r5, unsigned long r6, unsigned long r7);
|
||||
|
||||
dev_t boot_dev;
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
#endif /* CONFIG_PPC_PREP */
|
||||
|
||||
int have_of;
|
||||
EXPORT_SYMBOL(have_of);
|
||||
@@ -319,72 +314,12 @@ early_init(int r3, int r4, int r5)
|
||||
identify_cpu(offset, 0);
|
||||
do_cpu_ftr_fixups(offset);
|
||||
|
||||
#if defined(CONFIG_PPC_OF)
|
||||
reloc_got2(offset);
|
||||
|
||||
/*
|
||||
* don't do anything on prep
|
||||
* for now, don't use bootinfo because it breaks yaboot 0.5
|
||||
* and assume that if we didn't find a magic number, we have OF
|
||||
*/
|
||||
if (*(unsigned long *)(0) != 0xdeadc0de)
|
||||
phys = prom_init(r3, r4, (prom_entry)r5);
|
||||
|
||||
reloc_got2(-offset);
|
||||
#endif
|
||||
|
||||
return phys;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
/*
|
||||
* Assume here that all clock rates are the same in a
|
||||
* smp system. -- Cort
|
||||
*/
|
||||
int
|
||||
of_show_percpuinfo(struct seq_file *m, int i)
|
||||
{
|
||||
struct device_node *cpu_node;
|
||||
u32 *fp;
|
||||
int s;
|
||||
|
||||
cpu_node = find_type_devices("cpu");
|
||||
if (!cpu_node)
|
||||
return 0;
|
||||
for (s = 0; s < i && cpu_node->next; s++)
|
||||
cpu_node = cpu_node->next;
|
||||
fp = (u32 *)get_property(cpu_node, "clock-frequency", NULL);
|
||||
if (fp)
|
||||
seq_printf(m, "clock\t\t: %dMHz\n", *fp / 1000000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init
|
||||
intuit_machine_type(void)
|
||||
{
|
||||
char *model;
|
||||
struct device_node *root;
|
||||
|
||||
/* ask the OF info if we're a chrp or pmac */
|
||||
root = find_path_device("/");
|
||||
if (root != 0) {
|
||||
/* assume pmac unless proven to be chrp -- Cort */
|
||||
_machine = _MACH_Pmac;
|
||||
model = get_property(root, "device_type", NULL);
|
||||
if (model && !strncmp("chrp", model, 4))
|
||||
_machine = _MACH_chrp;
|
||||
else {
|
||||
model = get_property(root, "model", NULL);
|
||||
if (model && !strncmp(model, "IBM", 3))
|
||||
_machine = _MACH_chrp;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
/*
|
||||
* The PPC_MULTIPLATFORM version of platform_init...
|
||||
* The PPC_PREP version of platform_init...
|
||||
*/
|
||||
void __init
|
||||
platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
@@ -399,161 +334,9 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
|
||||
parse_bootinfo(find_bootinfo());
|
||||
|
||||
/* if we didn't get any bootinfo telling us what we are... */
|
||||
if (_machine == 0) {
|
||||
/* prep boot loader tells us if we're prep or not */
|
||||
if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) )
|
||||
_machine = _MACH_prep;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_PREP
|
||||
/* not much more to do here, if prep */
|
||||
if (_machine == _MACH_prep) {
|
||||
prep_init(r3, r4, r5, r6, r7);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
have_of = 1;
|
||||
|
||||
/* prom_init has already been called from __start */
|
||||
if (boot_infos)
|
||||
relocate_nodes();
|
||||
|
||||
/* If we aren't PReP, we can find out if we're Pmac
|
||||
* or CHRP with this. */
|
||||
if (_machine == 0)
|
||||
intuit_machine_type();
|
||||
|
||||
/* finish_device_tree may need _machine defined. */
|
||||
finish_device_tree();
|
||||
|
||||
/*
|
||||
* If we were booted via quik, r3 points to the physical
|
||||
* address of the command-line parameters.
|
||||
* If we were booted from an xcoff image (i.e. netbooted or
|
||||
* booted from floppy), we get the command line from the
|
||||
* bootargs property of the /chosen node.
|
||||
* If an initial ramdisk is present, r3 and r4
|
||||
* are used for initrd_start and initrd_size,
|
||||
* otherwise they contain 0xdeadbeef.
|
||||
*/
|
||||
if (r3 >= 0x4000 && r3 < 0x800000 && r4 == 0) {
|
||||
strlcpy(cmd_line, (char *)r3 + KERNELBASE,
|
||||
sizeof(cmd_line));
|
||||
} else if (boot_infos != 0) {
|
||||
/* booted by BootX - check for ramdisk */
|
||||
if (boot_infos->kernelParamsOffset != 0)
|
||||
strlcpy(cmd_line, (char *) boot_infos
|
||||
+ boot_infos->kernelParamsOffset,
|
||||
sizeof(cmd_line));
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (boot_infos->ramDisk) {
|
||||
initrd_start = (unsigned long) boot_infos
|
||||
+ boot_infos->ramDisk;
|
||||
initrd_end = initrd_start + boot_infos->ramDiskSize;
|
||||
initrd_below_start_ok = 1;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
struct device_node *chosen;
|
||||
char *p;
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (r3 && r4 && r4 != 0xdeadbeef) {
|
||||
if (r3 < KERNELBASE)
|
||||
r3 += KERNELBASE;
|
||||
initrd_start = r3;
|
||||
initrd_end = r3 + r4;
|
||||
ROOT_DEV = Root_RAM0;
|
||||
initrd_below_start_ok = 1;
|
||||
}
|
||||
#endif
|
||||
chosen = find_devices("chosen");
|
||||
if (chosen != NULL) {
|
||||
p = get_property(chosen, "bootargs", NULL);
|
||||
if (p && *p) {
|
||||
strlcpy(cmd_line, p, sizeof(cmd_line));
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_ADB
|
||||
if (strstr(cmd_line, "adb_sync")) {
|
||||
extern int __adb_probe_sync;
|
||||
__adb_probe_sync = 1;
|
||||
}
|
||||
#endif /* CONFIG_ADB */
|
||||
|
||||
switch (_machine) {
|
||||
#ifdef CONFIG_PPC_CHRP
|
||||
case _MACH_chrp:
|
||||
chrp_init(r3, r4, r5, r6, r7);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
prep_init(r3, r4, r5, r6, r7);
|
||||
}
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
#ifdef CONFIG_PPC_OF
|
||||
#ifdef CONFIG_SERIAL_CORE_CONSOLE
|
||||
extern char *of_stdout_device;
|
||||
|
||||
static int __init set_preferred_console(void)
|
||||
{
|
||||
struct device_node *prom_stdout;
|
||||
char *name;
|
||||
int offset = 0;
|
||||
|
||||
if (of_stdout_device == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
/* The user has requested a console so this is already set up. */
|
||||
if (strstr(saved_command_line, "console="))
|
||||
return -EBUSY;
|
||||
|
||||
prom_stdout = find_path_device(of_stdout_device);
|
||||
if (!prom_stdout)
|
||||
return -ENODEV;
|
||||
|
||||
name = (char *)get_property(prom_stdout, "name", NULL);
|
||||
if (!name)
|
||||
return -ENODEV;
|
||||
|
||||
if (strcmp(name, "serial") == 0) {
|
||||
int i;
|
||||
u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i);
|
||||
if (i > 8) {
|
||||
switch (reg[1]) {
|
||||
case 0x3f8:
|
||||
offset = 0;
|
||||
break;
|
||||
case 0x2f8:
|
||||
offset = 1;
|
||||
break;
|
||||
case 0x898:
|
||||
offset = 2;
|
||||
break;
|
||||
case 0x890:
|
||||
offset = 3;
|
||||
break;
|
||||
default:
|
||||
/* We dont recognise the serial port */
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(name, "ch-a") == 0)
|
||||
offset = 0;
|
||||
else if (strcmp(name, "ch-b") == 0)
|
||||
offset = 1;
|
||||
else
|
||||
return -ENODEV;
|
||||
return add_preferred_console("ttyS", offset, NULL);
|
||||
}
|
||||
console_initcall(set_preferred_console);
|
||||
#endif /* CONFIG_SERIAL_CORE_CONSOLE */
|
||||
#endif /* CONFIG_PPC_OF */
|
||||
#endif /* CONFIG_PPC_PREP */
|
||||
|
||||
struct bi_record *find_bootinfo(void)
|
||||
{
|
||||
@@ -589,23 +372,6 @@ void parse_bootinfo(struct bi_record *rec)
|
||||
initrd_end = data[0] + data[1] + KERNELBASE;
|
||||
break;
|
||||
#endif /* CONFIG_BLK_DEV_INITRD */
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
case BI_MACHTYPE:
|
||||
/* Machine types changed with the merge. Since the
|
||||
* bootinfo are now deprecated, we can just hard code
|
||||
* the appropriate conversion here for when we are
|
||||
* called with yaboot which passes us a machine type
|
||||
* this way.
|
||||
*/
|
||||
switch(data[0]) {
|
||||
case 1: _machine = _MACH_prep; break;
|
||||
case 2: _machine = _MACH_Pmac; break;
|
||||
case 4: _machine = _MACH_chrp; break;
|
||||
default:
|
||||
_machine = data[0];
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case BI_MEMSIZE:
|
||||
boot_mem_size = data[0];
|
||||
break;
|
||||
@@ -631,9 +397,6 @@ machine_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||
#ifdef CONFIG_6xx
|
||||
ppc_md.power_save = ppc6xx_idle;
|
||||
#endif
|
||||
#ifdef CONFIG_POWER4
|
||||
ppc_md.power_save = power4_idle;
|
||||
#endif
|
||||
|
||||
platform_init(r3, r4, r5, r6, r7);
|
||||
|
||||
@@ -799,7 +562,4 @@ void __init setup_arch(char **cmdline_p)
|
||||
if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
|
||||
|
||||
paging_init();
|
||||
|
||||
/* this is for modules since _machine can be a define -- Cort */
|
||||
ppc_md.ppc_machine = _machine;
|
||||
}
|
||||
|
Reference in New Issue
Block a user