ppc32: (Updated) Pegasos support
PATCH 1/1 ppc32: (Updated) Pegasos support
Hi Andrew !
Here's an updated version of the pegasos support patch for ppc32, fixing a typo in the previous one. Driver patches to come soon.
arch/ppc/syslib/prom_init.c +17 -5
@@ -810,6 +810,9 @@char *p, *d;unsigned long phys;void *result[3 ]; +char model[32 ]; +phandle node; +int rc;/* Default */ phys = (unsigned long ) &_stext;
@@ -866,11 +869,20 @@ klimit = (char *) (mem - offset); -/* If we are already running at 0xc0000000, we assume we were -* loaded by an OF bootloader which did set a BAT for us. -* This breaks OF translate so we force phys to be 0. -*/ -if (offset ==0 ) { + node =call_prom ("finddevice" ,1 ,1 ,"/" ); + rc =call_prom ("getprop" ,4 ,1 , node,"model" , model,sizeof (model)); +if (rc >0 && !strncmp (model,"Pegasos" ,7 ) + &&strncmp (model,"Pegasos2" ,8 )) { +/* Pegasos 1 has a broken translate method in the OF, +* and furthermore the BATs are mapped 1:1 so the phys +* address calculated above is correct, so let's use +* it directly. +*/ + }else if (offset ==0 ) { +/* If we are already running at 0xc0000000, we assume we were +* loaded by an OF bootloader which did set a BAT for us. +* This breaks OF translate so we force phys to be 0. +*/ prom_print ("(already at 0xc0000000) phys=0\n" ); phys =0 ; } else if ((int) call_prom("getprop", 4, 1, prom_chosen, "mmu",
arch/ppc/platforms/chrp_pci.c +34 -4
@@ -97,8 +97,10 @@ rtas_read_config(struct pci_bus *bus, unsigned int devfn, int offset, int len, u32 *val) { + struct pci_controller *hose = bus->sysdata;unsigned long addr = (offset &0xff ) | ((devfn &0xff ) <<8 ) - | ((bus->number &0xff ) <<16 ); + | (((bus->number - hose->first_busno) &0xff ) <<16 ) + | (hose->index <<24 );unsigned long ret = ~0UL ;int rval;
@@ -111,8 +113,10 @@ rtas_write_config(struct pci_bus *bus, unsigned int devfn, int offset, int len, u32 val) { + struct pci_controller *hose = bus->sysdata;unsigned long addr = (offset &0xff ) | ((devfn &0xff ) <<8 ) - | ((bus->number &0xff ) <<16 ); + | (((bus->number - hose->first_busno) &0xff ) <<16 ) + | (hose->index <<24 );int rval; rval =call_rtas ("write-pci-config" ,3 ,1 ,NULL , addr, len, val);
@@ -186,6 +190,22 @@iounmap (reg); } +/* Marvell Discovery II based Pegasos 2 */ +static void __init setup_peg2 (struct pci_controller *hose,struct device_node *dev) +{ +struct device_node *root =find_path_device ("/" ); +struct device_node *rtas; + + rtas =of_find_node_by_name (root,"rtas" ); +if (rtas) { + hose->ops = &rtas_pci_ops; + }else { +printk ("RTAS supporting Pegasos OF not found, please upgrade" +" your firmware\n" ); + } + pci_assign_all_busses =1 ; +} +void __init chrp_find_bridges (void ) {
@@ -195,7 +215,7 @@struct pci_controller *hose;unsigned int *dma;char *model, *machine; -int is_longtrail =0 , is_mot =0 ; +int is_longtrail =0 , is_mot =0 , is_pegasos =0 ;struct device_node *root =find_path_device ("/" );/*
@@ -207,6 +227,10 @@if (machine !=NULL ) { is_longtrail =strncmp (machine,"IBM,LongTrail" ,13 ) ==0 ; is_mot =strncmp (machine,"MOT" ,3 ) ==0 ; +if (strncmp (machine,"Pegasos2" ,8 ) ==0 ) + is_pegasos =2 ; +else if (strncmp (machine,"Pegasos" ,7 ) ==0 ) + is_pegasos =1 ; }for (dev = root->child; dev !=NULL ; dev = dev->sibling) {if (dev->type ==NULL ||strcmp (dev->type,"pci" ) !=0 )
@@ -257,6 +281,10 @@ hose->ops = &gg2_pci_ops; hose->cfg_data = p; gg2_pci_config_base = p; + }else if (is_pegasos ==1 ) { +setup_indirect_pci (hose,0xfec00cf8 ,0xfee00cfc ); + }else if (is_pegasos ==2 ) { +setup_peg2 (hose, dev); }else {printk ("No methods for %s (model %s), using RTAS\n" , dev->full_name, model);
@@ -275,5 +303,7 @@ } } - ppc_md.pcibios_fixup = chrp_pcibios_fixup; +/* Do not fixup interrupts from OF tree on pegasos */ +if (is_pegasos ==0 ) + ppc_md.pcibios_fixup = chrp_pcibios_fixup; }
arch/ppc/platforms/chrp_time.c +2 -0
@@ -41,6 +41,8 @@int base; rtcs =find_compatible_devices ("rtc" ,"pnpPNP,b00" ); +if (rtcs ==NULL ) + rtcs =find_compatible_devices ("rtc" ,"ds1385-rtc" );if (rtcs ==NULL || rtcs->addrs ==NULL )return 0 ; base = rtcs->addrs[0 ].address;
arch/ppc/platforms/chrp_setup.c +65 -11
124 lines not on this page · raw message
include/asm-ppc/processor.h +2 -0
@@ -34,6 +34,7 @@/* these are arbitrary */ #define _CHRP_Motorola 0x04/* motorola chrp, the cobra */ #define _CHRP_IBM 0x05/* IBM chrp, the longtrail and longtrail 2 */ +#define _CHRP_Pegasos 0x06/* Genesi/bplan's Pegasos and Pegasos2 */ #define _GLOBAL (n)\ .stabs __stringify(n:F-1),N_FUN,0,0,n;\
@@ -54,6 +55,7 @@/* what kind of prep workstation we are */ extern int _prep_type; +extern int _chrp_type;/* * This is used to identify the board type from a given PReP board
Quoted 3 lines · Benjamin Herrenschmidt
Here's an updated version of the pegasos support patch for ppc32, fixing a typo in the previous one.
I already sent the first version to Linus. That's reason 42 for preferring incremental diffs ;)
From: Benjamin Herrenschmidt <[email protected]>
Here's an updated version of the pegasos support patch for ppc32, fixing a typo in the previous one. Driver patches to come soon.
---
25-akpm/arch/ppc/platforms/chrp_pci.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-)
arch/ppc/platforms/chrp_pci.c renamed from arch/ppc/platforms/chrp_pci.c~ppc32-updated-pegasos-support +1 -1
@@ -304,6 +304,6 @@ chrp_find_bridges(void) }/* Do not fixup interrupts from OF tree on pegasos */ -if (is_pegasos !=0 ) +if (is_pegasos ==0 ) ppc_md.pcibios_fixup = chrp_pcibios_fixup; }
_
Quoted 7 lines · Andrew Morton
Quoted 3 lines · Benjamin Herrenschmidt
Here's an updated version of the pegasos support patch for ppc32, fixing a typo in the previous one.
I already sent the first version to Linus. That's reason 42 for preferring incremental diffs ;)
Heh, no worries, it's a oneliner fix anyway, I'll send it tomorrow.
Ben.