You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/paulus/ppc64-2.6
This commit is contained in:
@@ -31,7 +31,7 @@ obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o i8259.o prom_init.o prom.o
|
||||
|
||||
obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \
|
||||
pSeries_nvram.o rtasd.o ras.o pSeries_reconfig.o \
|
||||
pSeries_setup.o pSeries_iommu.o
|
||||
pSeries_setup.o pSeries_iommu.o udbg_16550.o
|
||||
|
||||
obj-$(CONFIG_PPC_BPA) += bpa_setup.o bpa_iommu.o bpa_nvram.o \
|
||||
bpa_iic.o spider-pic.o
|
||||
@@ -58,9 +58,11 @@ obj-$(CONFIG_XICS) += xics.o
|
||||
obj-$(CONFIG_MPIC) += mpic.o
|
||||
|
||||
obj-$(CONFIG_PPC_PMAC) += pmac_setup.o pmac_feature.o pmac_pci.o \
|
||||
pmac_time.o pmac_nvram.o pmac_low_i2c.o
|
||||
pmac_time.o pmac_nvram.o pmac_low_i2c.o \
|
||||
udbg_scc.o
|
||||
|
||||
obj-$(CONFIG_PPC_MAPLE) += maple_setup.o maple_pci.o maple_time.o
|
||||
obj-$(CONFIG_PPC_MAPLE) += maple_setup.o maple_pci.o maple_time.o \
|
||||
udbg_16550.o
|
||||
|
||||
obj-$(CONFIG_U3_DART) += u3_iommu.o
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
#include <asm/sections.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/oprofile_impl.h>
|
||||
#include <asm/cputable.h>
|
||||
|
||||
struct cpu_spec* cur_cpu_spec = NULL;
|
||||
@@ -54,24 +55,32 @@ struct cpu_spec cpu_specs[] = {
|
||||
.pvr_value = 0x00400000,
|
||||
.cpu_name = "POWER3 (630)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
|
||||
CPU_FTR_PMC8,
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power3,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/power3",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* Power3+ */
|
||||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x00410000,
|
||||
.cpu_name = "POWER3 (630+)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
|
||||
CPU_FTR_PMC8,
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power3,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/power3",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* Northstar */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -79,11 +88,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_name = "RS64-II (northstar)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
|
||||
CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power3,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/rs64",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* Pulsar */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -91,11 +105,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_name = "RS64-III (pulsar)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
|
||||
CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power3,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/rs64",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* I-star */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -103,11 +122,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_name = "RS64-III (icestar)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
|
||||
CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power3,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/rs64",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* S-star */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -115,11 +139,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_name = "RS64-IV (sstar)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
|
||||
CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
CPU_FTR_MMCRA | CPU_FTR_CTRL,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power3,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/rs64",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* Power4 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -127,11 +156,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_name = "POWER4 (gp)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power4,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/power4",
|
||||
.oprofile_model = &op_model_rs64,
|
||||
#endif
|
||||
},
|
||||
{ /* Power4+ */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -139,11 +173,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_name = "POWER4+ (gq)",
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA,
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_power4,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/power4",
|
||||
.oprofile_model = &op_model_power4,
|
||||
#endif
|
||||
},
|
||||
{ /* PPC970 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -152,12 +191,17 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
|
||||
CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
|
||||
CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
|
||||
.cpu_user_features = COMMON_USER_PPC64 |
|
||||
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_ppc970,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/970",
|
||||
.oprofile_model = &op_model_power4,
|
||||
#endif
|
||||
},
|
||||
{ /* PPC970FX */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -166,12 +210,17 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
|
||||
CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
|
||||
CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
|
||||
.cpu_user_features = COMMON_USER_PPC64 |
|
||||
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
.cpu_setup = __setup_cpu_ppc970,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/970",
|
||||
.oprofile_model = &op_model_power4,
|
||||
#endif
|
||||
},
|
||||
{ /* PPC970MP */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -180,12 +229,16 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_features = CPU_FTR_SPLIT_ID_CACHE |
|
||||
CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
|
||||
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
|
||||
CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
|
||||
CPU_FTR_CAN_NAP | CPU_FTR_MMCRA,
|
||||
.cpu_user_features = COMMON_USER_PPC64 |
|
||||
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.cpu_setup = __setup_cpu_ppc970,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/970",
|
||||
.oprofile_model = &op_model_power4,
|
||||
#endif
|
||||
},
|
||||
{ /* Power5 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -199,7 +252,12 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_power4,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/power5",
|
||||
.oprofile_model = &op_model_power4,
|
||||
#endif
|
||||
},
|
||||
{ /* Power5 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -213,7 +271,12 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_power4,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc64/power5",
|
||||
.oprofile_model = &op_model_power4,
|
||||
#endif
|
||||
},
|
||||
{ /* BE DD1.x */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -239,6 +302,7 @@ struct cpu_spec cpu_specs[] = {
|
||||
.cpu_user_features = COMMON_USER_PPC64,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_power4,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -400,15 +400,14 @@ BEGIN_FTR_SECTION
|
||||
cmpd cr1,r6,r9 /* or is new ESID the same as current ESID? */
|
||||
cror eq,4*cr1+eq,eq
|
||||
beq 2f /* if yes, don't slbie it */
|
||||
oris r0,r6,0x0800 /* set C (class) bit */
|
||||
|
||||
/* Bolt in the new stack SLB entry */
|
||||
ld r7,KSP_VSID(r4) /* Get new stack's VSID */
|
||||
oris r6,r6,(SLB_ESID_V)@h
|
||||
ori r6,r6,(SLB_NUM_BOLTED-1)@l
|
||||
slbie r0
|
||||
slbie r0 /* Workaround POWER5 < DD2.1 issue */
|
||||
slbmte r7,r6
|
||||
oris r0,r6,(SLB_ESID_V)@h
|
||||
ori r0,r0,(SLB_NUM_BOLTED-1)@l
|
||||
slbie r6
|
||||
slbie r6 /* Workaround POWER5 < DD2.1 issue */
|
||||
slbmte r7,r0
|
||||
isync
|
||||
|
||||
2:
|
||||
|
||||
@@ -1646,8 +1646,9 @@ _GLOBAL(__secondary_start)
|
||||
#else
|
||||
/* set the ASR */
|
||||
ld r3,systemcfg@got(r2) /* r3 = ptr to systemcfg */
|
||||
ld r3,0(r3)
|
||||
lwz r3,PLATFORM(r3) /* r3 = platform flags */
|
||||
cmpldi r3,PLATFORM_PSERIES_LPAR
|
||||
andi. r3,r3,PLATFORM_LPAR /* Test if bit 0 is set (LPAR bit) */
|
||||
bne 98f
|
||||
mfspr r3,PVR
|
||||
srwi r3,r3,16
|
||||
@@ -1809,8 +1810,9 @@ _STATIC(start_here_multiplatform)
|
||||
ld r3,PACASTABREAL(r13)
|
||||
ori r4,r3,1 /* turn on valid bit */
|
||||
ld r3,systemcfg@got(r2) /* r3 = ptr to systemcfg */
|
||||
ld r3,0(r3)
|
||||
lwz r3,PLATFORM(r3) /* r3 = platform flags */
|
||||
cmpldi r3,PLATFORM_PSERIES_LPAR
|
||||
andi. r3,r3,PLATFORM_LPAR /* Test if bit 0 is set (LPAR bit) */
|
||||
bne 98f
|
||||
mfspr r3,PVR
|
||||
srwi r3,r3,16
|
||||
@@ -1828,9 +1830,10 @@ _STATIC(start_here_multiplatform)
|
||||
99:
|
||||
/* Set SDR1 (hash table pointer) */
|
||||
ld r3,systemcfg@got(r2) /* r3 = ptr to systemcfg */
|
||||
ld r3,0(r3)
|
||||
lwz r3,PLATFORM(r3) /* r3 = platform flags */
|
||||
/* Test if bit 0 is set (LPAR bit) */
|
||||
andi. r3,r3,0x1
|
||||
andi. r3,r3,PLATFORM_LPAR
|
||||
bne 98f
|
||||
LOADADDR(r6,_SDR1) /* Only if NOT LPAR */
|
||||
sub r6,r6,r26
|
||||
|
||||
@@ -569,7 +569,7 @@ struct file_operations lparcfg_fops = {
|
||||
int __init lparcfg_init(void)
|
||||
{
|
||||
struct proc_dir_entry *ent;
|
||||
mode_t mode = S_IRUSR;
|
||||
mode_t mode = S_IRUSR | S_IRGRP | S_IROTH;
|
||||
|
||||
/* Allow writing if we have FW_FEATURE_SPLPAR */
|
||||
if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
|
||||
|
||||
@@ -207,9 +207,6 @@ static void __init maple_init_early(void)
|
||||
comport = (void *)ioremap(physport, 16);
|
||||
udbg_init_uart(comport, default_speed);
|
||||
|
||||
ppc_md.udbg_putc = udbg_putc;
|
||||
ppc_md.udbg_getc = udbg_getc;
|
||||
ppc_md.udbg_getc_poll = udbg_getc_poll;
|
||||
DBG("Hello World !\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -192,9 +192,9 @@ static unsigned char udbg_getcLP(void)
|
||||
void udbg_init_debug_lpar(void)
|
||||
{
|
||||
vtermno = 0;
|
||||
ppc_md.udbg_putc = udbg_putcLP;
|
||||
ppc_md.udbg_getc = udbg_getcLP;
|
||||
ppc_md.udbg_getc_poll = udbg_getc_pollLP;
|
||||
udbg_putc = udbg_putcLP;
|
||||
udbg_getc = udbg_getcLP;
|
||||
udbg_getc_poll = udbg_getc_pollLP;
|
||||
}
|
||||
|
||||
/* returns 0 if couldn't find or use /chosen/stdout as console */
|
||||
@@ -227,18 +227,18 @@ int find_udbg_vterm(void)
|
||||
termno = (u32 *)get_property(stdout_node, "reg", NULL);
|
||||
if (termno) {
|
||||
vtermno = termno[0];
|
||||
ppc_md.udbg_putc = udbg_putcLP;
|
||||
ppc_md.udbg_getc = udbg_getcLP;
|
||||
ppc_md.udbg_getc_poll = udbg_getc_pollLP;
|
||||
udbg_putc = udbg_putcLP;
|
||||
udbg_getc = udbg_getcLP;
|
||||
udbg_getc_poll = udbg_getc_pollLP;
|
||||
found = 1;
|
||||
}
|
||||
} else if (device_is_compatible(stdout_node, "hvterm-protocol")) {
|
||||
termno = (u32 *)get_property(stdout_node, "reg", NULL);
|
||||
if (termno) {
|
||||
vtermno = termno[0];
|
||||
ppc_md.udbg_putc = udbg_hvsi_putc;
|
||||
ppc_md.udbg_getc = udbg_hvsi_getc;
|
||||
ppc_md.udbg_getc_poll = udbg_hvsi_getc_poll;
|
||||
udbg_putc = udbg_hvsi_putc;
|
||||
udbg_getc = udbg_hvsi_getc;
|
||||
udbg_getc_poll = udbg_hvsi_getc_poll;
|
||||
found = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/adb.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
@@ -272,7 +272,7 @@ static int __init pSeries_init_panel(void)
|
||||
{
|
||||
/* Manually leave the kernel version on the panel. */
|
||||
ppc_md.progress("Linux ppc64\n", 0);
|
||||
ppc_md.progress(UTS_RELEASE, 0);
|
||||
ppc_md.progress(system_utsname.version, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -397,9 +397,6 @@ static void __init pSeries_init_early(void)
|
||||
comport = (void *)ioremap(physport, 16);
|
||||
udbg_init_uart(comport, default_speed);
|
||||
|
||||
ppc_md.udbg_putc = udbg_putc;
|
||||
ppc_md.udbg_getc = udbg_getc;
|
||||
ppc_md.udbg_getc_poll = udbg_getc_poll;
|
||||
DBG("Hello World !\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -274,16 +274,6 @@ static void __pmac pmac_halt(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
static int dummy_getc_poll(void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
static unsigned char dummy_getc(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void btext_putc(unsigned char c)
|
||||
{
|
||||
btext_drawchar(c);
|
||||
@@ -342,16 +332,13 @@ static void __init pmac_init_early(void)
|
||||
sccdbg = 1;
|
||||
udbg_init_scc(NULL);
|
||||
}
|
||||
|
||||
else {
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
else {
|
||||
init_boot_display();
|
||||
|
||||
ppc_md.udbg_putc = btext_putc;
|
||||
ppc_md.udbg_getc = dummy_getc;
|
||||
ppc_md.udbg_getc_poll = dummy_getc_poll;
|
||||
#endif /* CONFIG_BOOTX_TEXT */
|
||||
udbg_putc = btext_putc;
|
||||
}
|
||||
#endif /* CONFIG_BOOTX_TEXT */
|
||||
|
||||
/* Setup interrupt mapping options */
|
||||
ppc64_interrupt_controller = IC_OPEN_PIC;
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/root_dev.h>
|
||||
#include <linux/notifier.h>
|
||||
@@ -89,7 +89,7 @@ extern void udbg_init_maple_realmode(void);
|
||||
#define EARLY_DEBUG_INIT() udbg_init_maple_realmode()
|
||||
#define EARLY_DEBUG_INIT() udbg_init_pmac_realmode()
|
||||
#define EARLY_DEBUG_INIT() \
|
||||
do { ppc_md.udbg_putc = call_rtas_display_status_delay; } while(0)
|
||||
do { udbg_putc = call_rtas_display_status_delay; } while(0)
|
||||
#endif
|
||||
|
||||
/* extern void *stab; */
|
||||
@@ -108,7 +108,6 @@ int boot_cpuid = 0;
|
||||
int boot_cpuid_phys = 0;
|
||||
dev_t boot_dev;
|
||||
u64 ppc64_pft_size;
|
||||
u64 ppc64_debug_switch;
|
||||
|
||||
struct ppc64_caches ppc64_caches;
|
||||
EXPORT_SYMBOL_GPL(ppc64_caches);
|
||||
@@ -154,34 +153,6 @@ struct screen_info screen_info = {
|
||||
.orig_video_points = 16
|
||||
};
|
||||
|
||||
/*
|
||||
* Initialize the PPCDBG state. Called before relocation has been enabled.
|
||||
*/
|
||||
void __init ppcdbg_initialize(void)
|
||||
{
|
||||
ppc64_debug_switch = PPC_DEBUG_DEFAULT; /* | PPCDBG_BUSWALK | */
|
||||
/* PPCDBG_PHBINIT | PPCDBG_MM | PPCDBG_MMINIT | PPCDBG_TCEINIT | PPCDBG_TCE */;
|
||||
}
|
||||
|
||||
/*
|
||||
* Early boot console based on udbg
|
||||
*/
|
||||
static struct console udbg_console = {
|
||||
.name = "udbg",
|
||||
.write = udbg_console_write,
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = -1,
|
||||
};
|
||||
static int early_console_initialized;
|
||||
|
||||
void __init disable_early_printk(void)
|
||||
{
|
||||
if (!early_console_initialized)
|
||||
return;
|
||||
unregister_console(&udbg_console);
|
||||
early_console_initialized = 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PPC_MULTIPLATFORM) && defined(CONFIG_SMP)
|
||||
|
||||
static int smt_enabled_cmdline;
|
||||
@@ -425,12 +396,6 @@ void __init early_setup(unsigned long dt_ptr)
|
||||
}
|
||||
ppc_md = **mach;
|
||||
|
||||
/* our udbg callbacks got overriden by the above, let's put them
|
||||
* back in. Ultimately, I want those things to be split from the
|
||||
* main ppc_md
|
||||
*/
|
||||
EARLY_DEBUG_INIT();
|
||||
|
||||
DBG("Found, Initializing memory management...\n");
|
||||
|
||||
/*
|
||||
@@ -636,8 +601,7 @@ void __init setup_system(void)
|
||||
/*
|
||||
* Register early console
|
||||
*/
|
||||
early_console_initialized = 1;
|
||||
register_console(&udbg_console);
|
||||
register_early_udbg_console();
|
||||
|
||||
/* Save unparsed command line copy for /proc/cmdline */
|
||||
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
||||
@@ -657,7 +621,7 @@ void __init setup_system(void)
|
||||
smp_release_cpus();
|
||||
#endif /* defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES) */
|
||||
|
||||
printk("Starting Linux PPC64 %s\n", UTS_RELEASE);
|
||||
printk("Starting Linux PPC64 %s\n", system_utsname.version);
|
||||
|
||||
printk("-----------------------------------------------------\n");
|
||||
printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size);
|
||||
|
||||
+29
-19
@@ -215,18 +215,23 @@ static void register_cpu_online(unsigned int cpu)
|
||||
if (cpu_has_feature(CPU_FTR_MMCRA))
|
||||
sysdev_create_file(s, &attr_mmcra);
|
||||
|
||||
sysdev_create_file(s, &attr_pmc1);
|
||||
sysdev_create_file(s, &attr_pmc2);
|
||||
sysdev_create_file(s, &attr_pmc3);
|
||||
sysdev_create_file(s, &attr_pmc4);
|
||||
sysdev_create_file(s, &attr_pmc5);
|
||||
sysdev_create_file(s, &attr_pmc6);
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_PMC8)) {
|
||||
if (cur_cpu_spec->num_pmcs >= 1)
|
||||
sysdev_create_file(s, &attr_pmc1);
|
||||
if (cur_cpu_spec->num_pmcs >= 2)
|
||||
sysdev_create_file(s, &attr_pmc2);
|
||||
if (cur_cpu_spec->num_pmcs >= 3)
|
||||
sysdev_create_file(s, &attr_pmc3);
|
||||
if (cur_cpu_spec->num_pmcs >= 4)
|
||||
sysdev_create_file(s, &attr_pmc4);
|
||||
if (cur_cpu_spec->num_pmcs >= 5)
|
||||
sysdev_create_file(s, &attr_pmc5);
|
||||
if (cur_cpu_spec->num_pmcs >= 6)
|
||||
sysdev_create_file(s, &attr_pmc6);
|
||||
if (cur_cpu_spec->num_pmcs >= 7)
|
||||
sysdev_create_file(s, &attr_pmc7);
|
||||
if (cur_cpu_spec->num_pmcs >= 8)
|
||||
sysdev_create_file(s, &attr_pmc8);
|
||||
}
|
||||
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
sysdev_create_file(s, &attr_purr);
|
||||
}
|
||||
@@ -252,17 +257,22 @@ static void unregister_cpu_online(unsigned int cpu)
|
||||
if (cpu_has_feature(CPU_FTR_MMCRA))
|
||||
sysdev_remove_file(s, &attr_mmcra);
|
||||
|
||||
sysdev_remove_file(s, &attr_pmc1);
|
||||
sysdev_remove_file(s, &attr_pmc2);
|
||||
sysdev_remove_file(s, &attr_pmc3);
|
||||
sysdev_remove_file(s, &attr_pmc4);
|
||||
sysdev_remove_file(s, &attr_pmc5);
|
||||
sysdev_remove_file(s, &attr_pmc6);
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_PMC8)) {
|
||||
if (cur_cpu_spec->num_pmcs >= 1)
|
||||
sysdev_remove_file(s, &attr_pmc1);
|
||||
if (cur_cpu_spec->num_pmcs >= 2)
|
||||
sysdev_remove_file(s, &attr_pmc2);
|
||||
if (cur_cpu_spec->num_pmcs >= 3)
|
||||
sysdev_remove_file(s, &attr_pmc3);
|
||||
if (cur_cpu_spec->num_pmcs >= 4)
|
||||
sysdev_remove_file(s, &attr_pmc4);
|
||||
if (cur_cpu_spec->num_pmcs >= 5)
|
||||
sysdev_remove_file(s, &attr_pmc5);
|
||||
if (cur_cpu_spec->num_pmcs >= 6)
|
||||
sysdev_remove_file(s, &attr_pmc6);
|
||||
if (cur_cpu_spec->num_pmcs >= 7)
|
||||
sysdev_remove_file(s, &attr_pmc7);
|
||||
if (cur_cpu_spec->num_pmcs >= 8)
|
||||
sysdev_remove_file(s, &attr_pmc8);
|
||||
}
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
sysdev_remove_file(s, &attr_purr);
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
#include <asm/segment.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/nvram.h>
|
||||
|
||||
+57
-243
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* NS16550 Serial Port (uart) debugging stuff.
|
||||
* polling mode stateless debugging stuff, originally for NS16550 Serial Ports
|
||||
*
|
||||
* c 2001 PPC 64 Team, IBM Corp
|
||||
*
|
||||
@@ -13,249 +13,24 @@
|
||||
#define WANT_PPCDBG_TAB /* Only defined here */
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/console.h>
|
||||
#include <asm/ppcdebug.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/pmac_feature.h>
|
||||
|
||||
extern u8 real_readb(volatile u8 __iomem *addr);
|
||||
extern void real_writeb(u8 data, volatile u8 __iomem *addr);
|
||||
|
||||
struct NS16550 {
|
||||
/* this struct must be packed */
|
||||
unsigned char rbr; /* 0 */
|
||||
unsigned char ier; /* 1 */
|
||||
unsigned char fcr; /* 2 */
|
||||
unsigned char lcr; /* 3 */
|
||||
unsigned char mcr; /* 4 */
|
||||
unsigned char lsr; /* 5 */
|
||||
unsigned char msr; /* 6 */
|
||||
unsigned char scr; /* 7 */
|
||||
};
|
||||
|
||||
#define thr rbr
|
||||
#define iir fcr
|
||||
#define dll rbr
|
||||
#define dlm ier
|
||||
#define dlab lcr
|
||||
|
||||
#define LSR_DR 0x01 /* Data ready */
|
||||
#define LSR_OE 0x02 /* Overrun */
|
||||
#define LSR_PE 0x04 /* Parity error */
|
||||
#define LSR_FE 0x08 /* Framing error */
|
||||
#define LSR_BI 0x10 /* Break */
|
||||
#define LSR_THRE 0x20 /* Xmit holding register empty */
|
||||
#define LSR_TEMT 0x40 /* Xmitter empty */
|
||||
#define LSR_ERR 0x80 /* Error */
|
||||
|
||||
static volatile struct NS16550 __iomem *udbg_comport;
|
||||
|
||||
void udbg_init_uart(void __iomem *comport, unsigned int speed)
|
||||
{
|
||||
u16 dll = speed ? (115200 / speed) : 12;
|
||||
|
||||
if (comport) {
|
||||
udbg_comport = (struct NS16550 __iomem *)comport;
|
||||
out_8(&udbg_comport->lcr, 0x00);
|
||||
out_8(&udbg_comport->ier, 0xff);
|
||||
out_8(&udbg_comport->ier, 0x00);
|
||||
out_8(&udbg_comport->lcr, 0x80); /* Access baud rate */
|
||||
out_8(&udbg_comport->dll, dll & 0xff); /* 1 = 115200, 2 = 57600,
|
||||
3 = 38400, 12 = 9600 baud */
|
||||
out_8(&udbg_comport->dlm, dll >> 8); /* dll >> 8 which should be zero
|
||||
for fast rates; */
|
||||
out_8(&udbg_comport->lcr, 0x03); /* 8 data, 1 stop, no parity */
|
||||
out_8(&udbg_comport->mcr, 0x03); /* RTS/DTR */
|
||||
out_8(&udbg_comport->fcr ,0x07); /* Clear & enable FIFOs */
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
|
||||
#define SCC_TXRDY 4
|
||||
#define SCC_RXRDY 1
|
||||
|
||||
static volatile u8 __iomem *sccc;
|
||||
static volatile u8 __iomem *sccd;
|
||||
|
||||
static unsigned char scc_inittab[] = {
|
||||
13, 0, /* set baud rate divisor */
|
||||
12, 0,
|
||||
14, 1, /* baud rate gen enable, src=rtxc */
|
||||
11, 0x50, /* clocks = br gen */
|
||||
5, 0xea, /* tx 8 bits, assert DTR & RTS */
|
||||
4, 0x46, /* x16 clock, 1 stop */
|
||||
3, 0xc1, /* rx enable, 8 bits */
|
||||
};
|
||||
|
||||
void udbg_init_scc(struct device_node *np)
|
||||
{
|
||||
u32 *reg;
|
||||
unsigned long addr;
|
||||
int i, x;
|
||||
|
||||
if (np == NULL)
|
||||
np = of_find_node_by_name(NULL, "escc");
|
||||
if (np == NULL || np->parent == NULL)
|
||||
return;
|
||||
|
||||
udbg_printf("found SCC...\n");
|
||||
/* Get address within mac-io ASIC */
|
||||
reg = (u32 *)get_property(np, "reg", NULL);
|
||||
if (reg == NULL)
|
||||
return;
|
||||
addr = reg[0];
|
||||
udbg_printf("local addr: %lx\n", addr);
|
||||
/* Get address of mac-io PCI itself */
|
||||
reg = (u32 *)get_property(np->parent, "assigned-addresses", NULL);
|
||||
if (reg == NULL)
|
||||
return;
|
||||
addr += reg[2];
|
||||
udbg_printf("final addr: %lx\n", addr);
|
||||
|
||||
/* Setup for 57600 8N1 */
|
||||
addr += 0x20;
|
||||
sccc = (volatile u8 * __iomem) ioremap(addr & PAGE_MASK, PAGE_SIZE) ;
|
||||
sccc += addr & ~PAGE_MASK;
|
||||
sccd = sccc + 0x10;
|
||||
|
||||
udbg_printf("ioremap result sccc: %p\n", sccc);
|
||||
mb();
|
||||
|
||||
for (i = 20000; i != 0; --i)
|
||||
x = in_8(sccc);
|
||||
out_8(sccc, 0x09); /* reset A or B side */
|
||||
out_8(sccc, 0xc0);
|
||||
for (i = 0; i < sizeof(scc_inittab); ++i)
|
||||
out_8(sccc, scc_inittab[i]);
|
||||
|
||||
ppc_md.udbg_putc = udbg_putc;
|
||||
ppc_md.udbg_getc = udbg_getc;
|
||||
ppc_md.udbg_getc_poll = udbg_getc_poll;
|
||||
|
||||
udbg_puts("Hello World !\n");
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
static void udbg_real_putc(unsigned char c)
|
||||
{
|
||||
while ((real_readb(sccc) & SCC_TXRDY) == 0)
|
||||
;
|
||||
real_writeb(c, sccd);
|
||||
if (c == '\n')
|
||||
udbg_real_putc('\r');
|
||||
}
|
||||
|
||||
void udbg_init_pmac_realmode(void)
|
||||
{
|
||||
sccc = (volatile u8 __iomem *)0x80013020ul;
|
||||
sccd = (volatile u8 __iomem *)0x80013030ul;
|
||||
|
||||
ppc_md.udbg_putc = udbg_real_putc;
|
||||
ppc_md.udbg_getc = NULL;
|
||||
ppc_md.udbg_getc_poll = NULL;
|
||||
}
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
|
||||
#ifdef CONFIG_PPC_MAPLE
|
||||
void udbg_maple_real_putc(unsigned char c)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
|
||||
/* wait for idle */;
|
||||
real_writeb(c, &udbg_comport->thr); eieio();
|
||||
if (c == '\n') {
|
||||
/* Also put a CR. This is for convenience. */
|
||||
while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
|
||||
/* wait for idle */;
|
||||
real_writeb('\r', &udbg_comport->thr); eieio();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void udbg_init_maple_realmode(void)
|
||||
{
|
||||
udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
|
||||
|
||||
ppc_md.udbg_putc = udbg_maple_real_putc;
|
||||
ppc_md.udbg_getc = NULL;
|
||||
ppc_md.udbg_getc_poll = NULL;
|
||||
}
|
||||
#endif /* CONFIG_PPC_MAPLE */
|
||||
|
||||
void udbg_putc(unsigned char c)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
|
||||
/* wait for idle */;
|
||||
out_8(&udbg_comport->thr, c);
|
||||
if (c == '\n') {
|
||||
/* Also put a CR. This is for convenience. */
|
||||
while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
|
||||
/* wait for idle */;
|
||||
out_8(&udbg_comport->thr, '\r');
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
else if (sccc) {
|
||||
while ((in_8(sccc) & SCC_TXRDY) == 0)
|
||||
;
|
||||
out_8(sccd, c);
|
||||
if (c == '\n')
|
||||
udbg_putc('\r');
|
||||
}
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
}
|
||||
|
||||
int udbg_getc_poll(void)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
if ((in_8(&udbg_comport->lsr) & LSR_DR) != 0)
|
||||
return in_8(&udbg_comport->rbr);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
else if (sccc) {
|
||||
if ((in_8(sccc) & SCC_RXRDY) != 0)
|
||||
return in_8(sccd);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned char udbg_getc(void)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
while ((in_8(&udbg_comport->lsr) & LSR_DR) == 0)
|
||||
/* wait for char */;
|
||||
return in_8(&udbg_comport->rbr);
|
||||
}
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
else if (sccc) {
|
||||
while ((in_8(sccc) & SCC_RXRDY) == 0)
|
||||
;
|
||||
return in_8(sccd);
|
||||
}
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
return 0;
|
||||
}
|
||||
void (*udbg_putc)(unsigned char c);
|
||||
unsigned char (*udbg_getc)(void);
|
||||
int (*udbg_getc_poll)(void);
|
||||
|
||||
/* udbg library, used by xmon et al */
|
||||
void udbg_puts(const char *s)
|
||||
{
|
||||
if (ppc_md.udbg_putc) {
|
||||
if (udbg_putc) {
|
||||
char c;
|
||||
|
||||
if (s && *s != '\0') {
|
||||
while ((c = *s++) != '\0')
|
||||
ppc_md.udbg_putc(c);
|
||||
udbg_putc(c);
|
||||
}
|
||||
}
|
||||
#if 0
|
||||
@@ -270,12 +45,12 @@ int udbg_write(const char *s, int n)
|
||||
int remain = n;
|
||||
char c;
|
||||
|
||||
if (!ppc_md.udbg_putc)
|
||||
if (!udbg_putc)
|
||||
return 0;
|
||||
|
||||
if (s && *s != '\0') {
|
||||
while (((c = *s++) != '\0') && (remain-- > 0)) {
|
||||
ppc_md.udbg_putc(c);
|
||||
udbg_putc(c);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -287,12 +62,12 @@ int udbg_read(char *buf, int buflen)
|
||||
char c, *p = buf;
|
||||
int i;
|
||||
|
||||
if (!ppc_md.udbg_getc)
|
||||
if (!udbg_getc)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < buflen; ++i) {
|
||||
do {
|
||||
c = ppc_md.udbg_getc();
|
||||
c = udbg_getc();
|
||||
} while (c == 0x11 || c == 0x13);
|
||||
if (c == 0)
|
||||
break;
|
||||
@@ -302,11 +77,6 @@ int udbg_read(char *buf, int buflen)
|
||||
return i;
|
||||
}
|
||||
|
||||
void udbg_console_write(struct console *con, const char *s, unsigned int n)
|
||||
{
|
||||
udbg_write(s, n);
|
||||
}
|
||||
|
||||
#define UDBG_BUFSIZE 256
|
||||
void udbg_printf(const char *fmt, ...)
|
||||
{
|
||||
@@ -319,6 +89,10 @@ void udbg_printf(const char *fmt, ...)
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/* PPCDBG stuff */
|
||||
|
||||
u64 ppc64_debug_switch;
|
||||
|
||||
/* Special print used by PPCDBG() macro */
|
||||
void udbg_ppcdbg(unsigned long debug_flags, const char *fmt, ...)
|
||||
{
|
||||
@@ -358,3 +132,43 @@ unsigned long udbg_ifdebug(unsigned long flags)
|
||||
{
|
||||
return (flags & ppc64_debug_switch);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the PPCDBG state. Called before relocation has been enabled.
|
||||
*/
|
||||
void __init ppcdbg_initialize(void)
|
||||
{
|
||||
ppc64_debug_switch = PPC_DEBUG_DEFAULT; /* | PPCDBG_BUSWALK | */
|
||||
/* PPCDBG_PHBINIT | PPCDBG_MM | PPCDBG_MMINIT | PPCDBG_TCEINIT | PPCDBG_TCE */;
|
||||
}
|
||||
|
||||
/*
|
||||
* Early boot console based on udbg
|
||||
*/
|
||||
static void udbg_console_write(struct console *con, const char *s,
|
||||
unsigned int n)
|
||||
{
|
||||
udbg_write(s, n);
|
||||
}
|
||||
|
||||
static struct console udbg_console = {
|
||||
.name = "udbg",
|
||||
.write = udbg_console_write,
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
void __init disable_early_printk(void)
|
||||
{
|
||||
unregister_console(&udbg_console);
|
||||
}
|
||||
|
||||
/* called by setup_system */
|
||||
void register_early_udbg_console(void)
|
||||
{
|
||||
register_console(&udbg_console);
|
||||
}
|
||||
|
||||
#if 0 /* if you want to use this as a regular output console */
|
||||
console_initcall(register_udbg_console);
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* udbg for for NS16550 compatable serial ports
|
||||
*
|
||||
* Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
extern u8 real_readb(volatile u8 __iomem *addr);
|
||||
extern void real_writeb(u8 data, volatile u8 __iomem *addr);
|
||||
|
||||
struct NS16550 {
|
||||
/* this struct must be packed */
|
||||
unsigned char rbr; /* 0 */
|
||||
unsigned char ier; /* 1 */
|
||||
unsigned char fcr; /* 2 */
|
||||
unsigned char lcr; /* 3 */
|
||||
unsigned char mcr; /* 4 */
|
||||
unsigned char lsr; /* 5 */
|
||||
unsigned char msr; /* 6 */
|
||||
unsigned char scr; /* 7 */
|
||||
};
|
||||
|
||||
#define thr rbr
|
||||
#define iir fcr
|
||||
#define dll rbr
|
||||
#define dlm ier
|
||||
#define dlab lcr
|
||||
|
||||
#define LSR_DR 0x01 /* Data ready */
|
||||
#define LSR_OE 0x02 /* Overrun */
|
||||
#define LSR_PE 0x04 /* Parity error */
|
||||
#define LSR_FE 0x08 /* Framing error */
|
||||
#define LSR_BI 0x10 /* Break */
|
||||
#define LSR_THRE 0x20 /* Xmit holding register empty */
|
||||
#define LSR_TEMT 0x40 /* Xmitter empty */
|
||||
#define LSR_ERR 0x80 /* Error */
|
||||
|
||||
static volatile struct NS16550 __iomem *udbg_comport;
|
||||
|
||||
static void udbg_550_putc(unsigned char c)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
|
||||
/* wait for idle */;
|
||||
out_8(&udbg_comport->thr, c);
|
||||
if (c == '\n')
|
||||
udbg_550_putc('\r');
|
||||
}
|
||||
}
|
||||
|
||||
static int udbg_550_getc_poll(void)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
if ((in_8(&udbg_comport->lsr) & LSR_DR) != 0)
|
||||
return in_8(&udbg_comport->rbr);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static unsigned char udbg_550_getc(void)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
while ((in_8(&udbg_comport->lsr) & LSR_DR) == 0)
|
||||
/* wait for char */;
|
||||
return in_8(&udbg_comport->rbr);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void udbg_init_uart(void __iomem *comport, unsigned int speed)
|
||||
{
|
||||
u16 dll = speed ? (115200 / speed) : 12;
|
||||
|
||||
if (comport) {
|
||||
udbg_comport = (struct NS16550 __iomem *)comport;
|
||||
out_8(&udbg_comport->lcr, 0x00);
|
||||
out_8(&udbg_comport->ier, 0xff);
|
||||
out_8(&udbg_comport->ier, 0x00);
|
||||
out_8(&udbg_comport->lcr, 0x80); /* Access baud rate */
|
||||
out_8(&udbg_comport->dll, dll & 0xff); /* 1 = 115200, 2 = 57600,
|
||||
3 = 38400, 12 = 9600 baud */
|
||||
out_8(&udbg_comport->dlm, dll >> 8); /* dll >> 8 which should be zero
|
||||
for fast rates; */
|
||||
out_8(&udbg_comport->lcr, 0x03); /* 8 data, 1 stop, no parity */
|
||||
out_8(&udbg_comport->mcr, 0x03); /* RTS/DTR */
|
||||
out_8(&udbg_comport->fcr ,0x07); /* Clear & enable FIFOs */
|
||||
udbg_putc = udbg_550_putc;
|
||||
udbg_getc = udbg_550_getc;
|
||||
udbg_getc_poll = udbg_550_getc_poll;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_MAPLE
|
||||
void udbg_maple_real_putc(unsigned char c)
|
||||
{
|
||||
if (udbg_comport) {
|
||||
while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
|
||||
/* wait for idle */;
|
||||
real_writeb(c, &udbg_comport->thr); eieio();
|
||||
if (c == '\n')
|
||||
udbg_maple_real_putc('\r');
|
||||
}
|
||||
}
|
||||
|
||||
void udbg_init_maple_realmode(void)
|
||||
{
|
||||
udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
|
||||
|
||||
udbg_putc = udbg_maple_real_putc;
|
||||
udbg_getc = NULL;
|
||||
udbg_getc_poll = NULL;
|
||||
}
|
||||
#endif /* CONFIG_PPC_MAPLE */
|
||||
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* udbg for for zilog scc ports as found on Apple PowerMacs
|
||||
*
|
||||
* Copyright (C) 2001-2005 PPC 64 Team, IBM Corp
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/naca.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/pmac_feature.h>
|
||||
|
||||
extern u8 real_readb(volatile u8 __iomem *addr);
|
||||
extern void real_writeb(u8 data, volatile u8 __iomem *addr);
|
||||
|
||||
#define SCC_TXRDY 4
|
||||
#define SCC_RXRDY 1
|
||||
|
||||
static volatile u8 __iomem *sccc;
|
||||
static volatile u8 __iomem *sccd;
|
||||
|
||||
static void udbg_scc_putc(unsigned char c)
|
||||
{
|
||||
if (sccc) {
|
||||
while ((in_8(sccc) & SCC_TXRDY) == 0)
|
||||
;
|
||||
out_8(sccd, c);
|
||||
if (c == '\n')
|
||||
udbg_scc_putc('\r');
|
||||
}
|
||||
}
|
||||
|
||||
static int udbg_scc_getc_poll(void)
|
||||
{
|
||||
if (sccc) {
|
||||
if ((in_8(sccc) & SCC_RXRDY) != 0)
|
||||
return in_8(sccd);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static unsigned char udbg_scc_getc(void)
|
||||
{
|
||||
if (sccc) {
|
||||
while ((in_8(sccc) & SCC_RXRDY) == 0)
|
||||
;
|
||||
return in_8(sccd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned char scc_inittab[] = {
|
||||
13, 0, /* set baud rate divisor */
|
||||
12, 0,
|
||||
14, 1, /* baud rate gen enable, src=rtxc */
|
||||
11, 0x50, /* clocks = br gen */
|
||||
5, 0xea, /* tx 8 bits, assert DTR & RTS */
|
||||
4, 0x46, /* x16 clock, 1 stop */
|
||||
3, 0xc1, /* rx enable, 8 bits */
|
||||
};
|
||||
|
||||
void udbg_init_scc(struct device_node *np)
|
||||
{
|
||||
u32 *reg;
|
||||
unsigned long addr;
|
||||
int i, x;
|
||||
|
||||
if (np == NULL)
|
||||
np = of_find_node_by_name(NULL, "escc");
|
||||
if (np == NULL || np->parent == NULL)
|
||||
return;
|
||||
|
||||
udbg_printf("found SCC...\n");
|
||||
/* Get address within mac-io ASIC */
|
||||
reg = (u32 *)get_property(np, "reg", NULL);
|
||||
if (reg == NULL)
|
||||
return;
|
||||
addr = reg[0];
|
||||
udbg_printf("local addr: %lx\n", addr);
|
||||
/* Get address of mac-io PCI itself */
|
||||
reg = (u32 *)get_property(np->parent, "assigned-addresses", NULL);
|
||||
if (reg == NULL)
|
||||
return;
|
||||
addr += reg[2];
|
||||
udbg_printf("final addr: %lx\n", addr);
|
||||
|
||||
/* Setup for 57600 8N1 */
|
||||
addr += 0x20;
|
||||
sccc = (volatile u8 * __iomem) ioremap(addr & PAGE_MASK, PAGE_SIZE) ;
|
||||
sccc += addr & ~PAGE_MASK;
|
||||
sccd = sccc + 0x10;
|
||||
|
||||
udbg_printf("ioremap result sccc: %p\n", sccc);
|
||||
mb();
|
||||
|
||||
for (i = 20000; i != 0; --i)
|
||||
x = in_8(sccc);
|
||||
out_8(sccc, 0x09); /* reset A or B side */
|
||||
out_8(sccc, 0xc0);
|
||||
for (i = 0; i < sizeof(scc_inittab); ++i)
|
||||
out_8(sccc, scc_inittab[i]);
|
||||
|
||||
udbg_putc = udbg_scc_putc;
|
||||
udbg_getc = udbg_scc_getc;
|
||||
udbg_getc_poll = udbg_scc_getc_poll;
|
||||
|
||||
udbg_puts("Hello World !\n");
|
||||
}
|
||||
|
||||
static void udbg_real_scc_putc(unsigned char c)
|
||||
{
|
||||
while ((real_readb(sccc) & SCC_TXRDY) == 0)
|
||||
;
|
||||
real_writeb(c, sccd);
|
||||
if (c == '\n')
|
||||
udbg_real_scc_putc('\r');
|
||||
}
|
||||
|
||||
void udbg_init_pmac_realmode(void)
|
||||
{
|
||||
sccc = (volatile u8 __iomem *)0x80013020ul;
|
||||
sccd = (volatile u8 __iomem *)0x80013030ul;
|
||||
|
||||
udbg_putc = udbg_real_scc_putc;
|
||||
udbg_getc = NULL;
|
||||
udbg_getc_poll = NULL;
|
||||
}
|
||||
@@ -144,7 +144,8 @@ static void flush_low_segments(void *parm)
|
||||
for (i = 0; i < NUM_LOW_AREAS; i++) {
|
||||
if (! (areas & (1U << i)))
|
||||
continue;
|
||||
asm volatile("slbie %0" : : "r" (i << SID_SHIFT));
|
||||
asm volatile("slbie %0"
|
||||
: : "r" ((i << SID_SHIFT) | SLBIE_C));
|
||||
}
|
||||
|
||||
asm volatile("isync" : : : "memory");
|
||||
@@ -164,7 +165,8 @@ static void flush_high_segments(void *parm)
|
||||
continue;
|
||||
for (j = 0; j < (1UL << (HTLB_AREA_SHIFT-SID_SHIFT)); j++)
|
||||
asm volatile("slbie %0"
|
||||
:: "r" ((i << HTLB_AREA_SHIFT) + (j << SID_SHIFT)));
|
||||
:: "r" (((i << HTLB_AREA_SHIFT)
|
||||
+ (j << SID_SHIFT)) | SLBIE_C));
|
||||
}
|
||||
|
||||
asm volatile("isync" : : : "memory");
|
||||
|
||||
@@ -392,6 +392,7 @@ void free_initmem(void)
|
||||
|
||||
addr = (unsigned long)__init_begin;
|
||||
for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) {
|
||||
memset((void *)addr, 0xcc, PAGE_SIZE);
|
||||
ClearPageReserved(virt_to_page(addr));
|
||||
set_page_count(virt_to_page(addr), 1);
|
||||
free_page(addr);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user