* [PATCH 2/3] celleb: add supporting for native CBE
@ 2007-12-04 8:38 Ishizaki Kou
2007-12-04 13:21 ` Arnd Bergmann
0 siblings, 1 reply; 4+ messages in thread
From: Ishizaki Kou @ 2007-12-04 8:38 UTC (permalink / raw)
To: paulus; +Cc: linuxppc-dev
This patch adds supporting for native CBE on Celleb. Many codes in
platforms/cell/ are used when native CBE environment.
Signed-off-by: Kou Ishizaki <Kou.Ishizaki@toshiba•co.jp>
---
Index: linux-powerpc-git/arch/powerpc/platforms/cell/iommu.c
===================================================================
--- linux-powerpc-git.orig/arch/powerpc/platforms/cell/iommu.c
+++ linux-powerpc-git/arch/powerpc/platforms/cell/iommu.c
@@ -34,6 +34,7 @@
#include <asm/udbg.h>
#include <asm/of_platform.h>
#include <asm/lmb.h>
+#include <asm/firmware.h>
#include <asm/cell-regs.h>
#include "interrupt.h"
@@ -699,7 +700,8 @@ static int __init cell_iommu_init(void)
{
struct device_node *np;
- if (!machine_is(cell))
+ if ((!machine_is(cell) && !machine_is(celleb)) ||
+ firmware_has_feature(FW_FEATURE_LPAR))
return -ENODEV;
/* If IOMMU is disabled or we have little enough RAM to not need
Index: linux-powerpc-git/arch/powerpc/platforms/celleb/Kconfig
===================================================================
--- linux-powerpc-git.orig/arch/powerpc/platforms/celleb/Kconfig
+++ linux-powerpc-git/arch/powerpc/platforms/celleb/Kconfig
@@ -2,6 +2,8 @@ config PPC_CELLEB
bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
depends on PPC_MULTIPLATFORM && PPC64
select PPC_CELL
+ select PPC_CELL_NATIVE
+ select PPC_RTAS
select PPC_INDIRECT_IO
select PPC_OF_PLATFORM_PCI
select HAS_TXX9_SERIAL
Index: linux-powerpc-git/arch/powerpc/platforms/celleb/iommu.c
===================================================================
--- linux-powerpc-git.orig/arch/powerpc/platforms/celleb/iommu.c
+++ linux-powerpc-git/arch/powerpc/platforms/celleb/iommu.c
@@ -24,6 +24,7 @@
#include <linux/pci.h>
#include <asm/of_platform.h>
+#include <asm/firmware.h>
#include "beat_wrapper.h"
@@ -91,7 +92,7 @@ static struct notifier_block celleb_of_b
static int __init celleb_init_iommu(void)
{
- if (!machine_is(celleb))
+ if (!firmware_has_feature(FW_FEATURE_BEAT))
return -ENODEV;
celleb_init_direct_mapping();
Index: linux-powerpc-git/arch/powerpc/platforms/celleb/setup.c
===================================================================
--- linux-powerpc-git.orig/arch/powerpc/platforms/celleb/setup.c
+++ linux-powerpc-git/arch/powerpc/platforms/celleb/setup.c
@@ -53,11 +53,16 @@
#include <asm/spu_priv1.h>
#include <asm/firmware.h>
#include <asm/of_platform.h>
+#include <asm/rtas.h>
+#include <asm/cell-regs.h>
#include "interrupt.h"
#include "beat_wrapper.h"
#include "beat.h"
#include "pci.h"
+#include "../cell/interrupt.h"
+#include "../cell/pervasive.h"
+#include "../cell/ras.h"
static char celleb_machine_type[128] = "Celleb";
@@ -88,16 +93,74 @@ static void celleb_progress(char *s, uns
printk("*** %04x : %s\n", hex, s ? s : "");
}
-static void __init celleb_setup_arch(void)
+static void __init celleb_init_IRQ_native(void)
+{
+ iic_init_IRQ();
+ spider_init_IRQ();
+}
+
+static void __init celleb_setup_arch_beat(void)
{
+ ppc_md.restart = beat_restart;
+ ppc_md.power_off = beat_power_off;
+ ppc_md.halt = beat_halt;
+ ppc_md.get_rtc_time = beat_get_rtc_time;
+ ppc_md.set_rtc_time = beat_set_rtc_time;
+ ppc_md.power_save = beat_power_save;
+ ppc_md.nvram_size = beat_nvram_get_size;
+ ppc_md.nvram_read = beat_nvram_read;
+ ppc_md.nvram_write = beat_nvram_write;
+ ppc_md.set_dabr = beat_set_xdabr;
+ ppc_md.init_IRQ = beatic_init_IRQ;
+ ppc_md.get_irq = beatic_get_irq;
+#ifdef CONFIG_KEXEC
+ ppc_md.kexec_cpu_down = beat_kexec_cpu_down;
+#endif
+
#ifdef CONFIG_SPU_BASE
- spu_priv1_ops = &spu_priv1_beat_ops;
- spu_management_ops = &spu_management_of_ops;
+ spu_priv1_ops = &spu_priv1_beat_ops;
+ spu_management_ops = &spu_management_of_ops;
#endif
#ifdef CONFIG_SMP
smp_init_celleb();
#endif
+}
+
+static void __init celleb_setup_arch_native(void)
+{
+ ppc_md.restart = rtas_restart;
+ ppc_md.power_off = rtas_power_off;
+ ppc_md.halt = rtas_halt;
+ ppc_md.get_boot_time = rtas_get_boot_time;
+ ppc_md.get_rtc_time = rtas_get_rtc_time;
+ ppc_md.set_rtc_time = rtas_set_rtc_time;
+ ppc_md.init_IRQ = celleb_init_IRQ_native;
+
+#ifdef CONFIG_SPU_BASE
+ spu_priv1_ops = &spu_priv1_mmio_ops;
+ spu_management_ops = &spu_management_of_ops;
+#endif
+
+ cbe_regs_init();
+
+#ifdef CONFIG_CBE_RAS
+ cbe_ras_init();
+#endif
+
+#ifdef CONFIG_SMP
+ smp_init_cell();
+#endif
+
+ cbe_pervasive_init();
+}
+
+static void __init celleb_setup_arch(void)
+{
+ if (firmware_has_feature(FW_FEATURE_BEAT))
+ celleb_setup_arch_beat();
+ else
+ celleb_setup_arch_native();
/* init to some ~sane value until calibrate_delay() runs */
loops_per_jiffy = 50000000;
@@ -111,12 +174,19 @@ static int __init celleb_probe(void)
{
unsigned long root = of_get_flat_dt_root();
- if (!of_flat_dt_is_compatible(root, "Beat"))
- return 0;
+ if (of_flat_dt_is_compatible(root, "Beat")) {
+ powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS
+ | FW_FEATURE_BEAT | FW_FEATURE_LPAR;
+ hpte_init_beat_v3();
+ return 1;
+ }
+ if (of_flat_dt_is_compatible(root, "TOSHIBA,Celleb")) {
+ powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS;
+ hpte_init_native();
+ return 1;
+ }
- powerpc_firmware_features |= FW_FEATURE_CELLEB_POSSIBLE;
- hpte_init_beat_v3();
- return 1;
+ return 0;
}
static struct of_device_id celleb_bus_ids[] __initdata = {
@@ -144,24 +214,11 @@ define_machine(celleb) {
.probe = celleb_probe,
.setup_arch = celleb_setup_arch,
.show_cpuinfo = celleb_show_cpuinfo,
- .restart = beat_restart,
- .power_off = beat_power_off,
- .halt = beat_halt,
- .get_rtc_time = beat_get_rtc_time,
- .set_rtc_time = beat_set_rtc_time,
.calibrate_decr = generic_calibrate_decr,
.progress = celleb_progress,
- .power_save = beat_power_save,
- .nvram_size = beat_nvram_get_size,
- .nvram_read = beat_nvram_read,
- .nvram_write = beat_nvram_write,
- .set_dabr = beat_set_xdabr,
- .init_IRQ = beatic_init_IRQ,
- .get_irq = beatic_get_irq,
.pci_probe_mode = celleb_pci_probe_mode,
.pci_setup_phb = celleb_setup_phb,
#ifdef CONFIG_KEXEC
- .kexec_cpu_down = beat_kexec_cpu_down,
.machine_kexec = default_machine_kexec,
.machine_kexec_prepare = default_machine_kexec_prepare,
.machine_crash_shutdown = default_machine_crash_shutdown,
Index: linux-powerpc-git/include/asm-powerpc/firmware.h
===================================================================
--- linux-powerpc-git.orig/include/asm-powerpc/firmware.h
+++ linux-powerpc-git/include/asm-powerpc/firmware.h
@@ -64,7 +64,7 @@ enum {
FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
FW_FEATURE_CELLEB_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
- FW_FEATURE_CELLEB_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
+ FW_FEATURE_CELLEB_ALWAYS = 0,
FW_FEATURE_NATIVE_POSSIBLE = 0,
FW_FEATURE_NATIVE_ALWAYS = 0,
FW_FEATURE_POSSIBLE =
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH 2/3] celleb: add supporting for native CBE
2007-12-04 8:38 [PATCH 2/3] celleb: add supporting for native CBE Ishizaki Kou
@ 2007-12-04 13:21 ` Arnd Bergmann
2007-12-06 6:43 ` Ishizaki Kou
0 siblings, 1 reply; 4+ messages in thread
From: Arnd Bergmann @ 2007-12-04 13:21 UTC (permalink / raw)
To: linuxppc-dev; +Cc: paulus
On Tuesday 04 December 2007, Ishizaki Kou wrote:
> This patch adds supporting for native CBE on Celleb. =A0Many codes in
> platforms/cell/ are used when native CBE environment.
>=20
> Signed-off-by: Kou Ishizaki <Kou.Ishizaki@toshiba•co.jp>
Ah, excellent to hear that this is now working!
I'd suggest doing the initialization in a different way, so that you don't
need to decide on so many attributes dynamically. The easiest way would
probably be to have two separate define_machine() calls in the celleb
definition, like
define_machine(celleb_beat) {
.probe =3D celleb_probe_beat,
.setup_arch =3D celleb_setup_arch_native,
.show_cpuinfo =3D celleb_show_cpuinfo,
.restart =3D beat_restart,
.power_off =3D beat_power_off,
.halt =3D beat_halt,
.get_rtc_time =3D beat_get_rtc_time,
.set_rtc_time =3D beat_set_rtc_time,
.calibrate_decr =3D generic_calibrate_decr,
.progress =3D celleb_progress,
.power_save =3D beat_power_save,
.nvram_size =3D beat_nvram_get_size,
.nvram_read =3D beat_nvram_read,
.nvram_write =3D beat_nvram_write,
.set_dabr =3D beat_set_xdabr,
.init_IRQ =3D beatic_init_IRQ,
.get_irq =3D beatic_get_irq,
.pci_probe_mode =3D celleb_pci_probe_mode,
.pci_setup_phb =3D celleb_setup_phb,
...
};
define_machine(celleb_native) {
.probe =3D celleb_probe_native,
.setup_arch =3D celleb_setup_arch_native,
.show_cpuinfo =3D celleb_show_cpuinfo,
.restart =3D rtas_restart,
.power_off =3D rtas_power_off,
.halt =3D rtas_halt,
.get_rtc_time =3D rtas_get_rtc_time,
.set_rtc_time =3D rtas_set_rtc_time,
.calibrate_decr =3D generic_calibrate_decr,
.progress =3D celleb_progress,
.init_IRQ =3D celleb_init_IRQ_native,
.get_irq =3D celleb_get_irq_native,
.pci_probe_mode =3D celleb_pci_probe_mode,
.pci_setup_phb =3D celleb_setup_phb,
...
};
=46or this, you can either have the two machine definitions in the
same celleb/setup.c, or split setup.c into machine specific files,
depending on how much ends up being shared in the end.
An interesting question still is how close the native celleb machine
definition is to the one from platforms/cell/setup.c. Maybe it's best
to have a common machine definition for these two in the end.
Arnd <><
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH 2/3] celleb: add supporting for native CBE
2007-12-04 13:21 ` Arnd Bergmann
@ 2007-12-06 6:43 ` Ishizaki Kou
2007-12-06 10:21 ` Arnd Bergmann
0 siblings, 1 reply; 4+ messages in thread
From: Ishizaki Kou @ 2007-12-06 6:43 UTC (permalink / raw)
To: arnd; +Cc: linuxppc-dev, paulus
Arnd Bergmann <arnd@arndb•de> wrote:
> On Tuesday 04 December 2007, Ishizaki Kou wrote:
> > This patch adds supporting for native CBE on Celleb. Many codes in
> > platforms/cell/ are used when native CBE environment.
> >
> > Signed-off-by: Kou Ishizaki <Kou.Ishizaki@toshiba•co.jp>
>
> Ah, excellent to hear that this is now working!
>
> I'd suggest doing the initialization in a different way, so that you don't
> need to decide on so many attributes dynamically. The easiest way would
> probably be to have two separate define_machine() calls in the celleb
> definition, like
>
> define_machine(celleb_beat) {
> .probe = celleb_probe_beat,
> .setup_arch = celleb_setup_arch_native,
> .show_cpuinfo = celleb_show_cpuinfo,
> .restart = beat_restart,
> .power_off = beat_power_off,
> .halt = beat_halt,
> .get_rtc_time = beat_get_rtc_time,
> .set_rtc_time = beat_set_rtc_time,
> .calibrate_decr = generic_calibrate_decr,
> .progress = celleb_progress,
> .power_save = beat_power_save,
> .nvram_size = beat_nvram_get_size,
> .nvram_read = beat_nvram_read,
> .nvram_write = beat_nvram_write,
> .set_dabr = beat_set_xdabr,
> .init_IRQ = beatic_init_IRQ,
> .get_irq = beatic_get_irq,
> .pci_probe_mode = celleb_pci_probe_mode,
> .pci_setup_phb = celleb_setup_phb,
> ...
> };
>
> define_machine(celleb_native) {
> .probe = celleb_probe_native,
> .setup_arch = celleb_setup_arch_native,
> .show_cpuinfo = celleb_show_cpuinfo,
> .restart = rtas_restart,
> .power_off = rtas_power_off,
> .halt = rtas_halt,
> .get_rtc_time = rtas_get_rtc_time,
> .set_rtc_time = rtas_set_rtc_time,
> .calibrate_decr = generic_calibrate_decr,
> .progress = celleb_progress,
> .init_IRQ = celleb_init_IRQ_native,
> .get_irq = celleb_get_irq_native,
> .pci_probe_mode = celleb_pci_probe_mode,
> .pci_setup_phb = celleb_setup_phb,
> ...
> };
>
> For this, you can either have the two machine definitions in the
> same celleb/setup.c, or split setup.c into machine specific files,
> depending on how much ends up being shared in the end.
Thanks for your suggestion. I'll try to split into two machine
definitions.
> An interesting question still is how close the native celleb machine
> definition is to the one from platforms/cell/setup.c. Maybe it's best
> to have a common machine definition for these two in the end.
You know celleb-native is between celleb-beat and cell blade. I also
think it's best if we can use a common machine definition and a common
setup code. But there are many differences mainly caused by their
firmwares, and this disturbs the integration. I think celleb-native is
closer to celleb-beat than to cell blade. So I put celleb-native code
in platforms/celleb.
> Arnd <><
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs•org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
Best regards,
Kou Ishizaki
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH 2/3] celleb: add supporting for native CBE
2007-12-06 6:43 ` Ishizaki Kou
@ 2007-12-06 10:21 ` Arnd Bergmann
0 siblings, 0 replies; 4+ messages in thread
From: Arnd Bergmann @ 2007-12-06 10:21 UTC (permalink / raw)
To: linuxppc-dev; +Cc: paulus
On Thursday 06 December 2007, Ishizaki Kou wrote:
> > An interesting question still is how close the native celleb machine
> > definition is to the one from platforms/cell/setup.c. Maybe it's best
> > to have a common machine definition for these two in the end.
>
> You know celleb-native is between celleb-beat and cell blade. I also
> think it's best if we can use a common machine definition and a common
> setup code. But there are many differences mainly caused by their
> firmwares, and this disturbs the integration. I think celleb-native is
> closer to celleb-beat than to cell blade. So I put celleb-native code
> in platforms/celleb.
Ok, fine with me then. Thanks,
Arnd <><
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-12-06 10:21 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-04 8:38 [PATCH 2/3] celleb: add supporting for native CBE Ishizaki Kou
2007-12-04 13:21 ` Arnd Bergmann
2007-12-06 6:43 ` Ishizaki Kou
2007-12-06 10:21 ` Arnd Bergmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox