Merge branch 'merge'
Paul Mackerras [Thu, 31 Aug 2006 05:45:48 +0000 (15:45 +1000)]
172 files changed:
arch/powerpc/Kconfig
arch/powerpc/boot/Makefile
arch/powerpc/configs/maple_defconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/btext.c
arch/powerpc/kernel/cpu_setup_ppc970.S [moved from arch/powerpc/kernel/cpu_setup_power4.S with 73% similarity]
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/crash_dump.c
arch/powerpc/kernel/dma_64.c
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/ibmebus.c
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/machine_kexec_64.c
arch/powerpc/kernel/of_device.c
arch/powerpc/kernel/paca.c
arch/powerpc/kernel/pci_32.c
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/pci_dn.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/prom_parse.c
arch/powerpc/kernel/rtas-proc.c
arch/powerpc/kernel/rtas.c
arch/powerpc/kernel/rtas_pci.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/vio.c
arch/powerpc/lib/Makefile
arch/powerpc/lib/e2a.c [deleted file]
arch/powerpc/mm/numa.c
arch/powerpc/mm/slb.c
arch/powerpc/mm/tlb_64.c
arch/powerpc/platforms/83xx/mpc834x_itx.c
arch/powerpc/platforms/83xx/mpc834x_sys.c
arch/powerpc/platforms/83xx/pci.c
arch/powerpc/platforms/85xx/mpc85xx_ads.c
arch/powerpc/platforms/85xx/mpc85xx_cds.c
arch/powerpc/platforms/85xx/pci.c
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
arch/powerpc/platforms/86xx/pci.c
arch/powerpc/platforms/cell/cbe_regs.c
arch/powerpc/platforms/cell/interrupt.c
arch/powerpc/platforms/cell/iommu.c
arch/powerpc/platforms/cell/setup.c
arch/powerpc/platforms/cell/smp.c
arch/powerpc/platforms/cell/spider-pic.c
arch/powerpc/platforms/cell/spu_base.c
arch/powerpc/platforms/chrp/nvram.c
arch/powerpc/platforms/chrp/pci.c
arch/powerpc/platforms/chrp/setup.c
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
arch/powerpc/platforms/iseries/Kconfig
arch/powerpc/platforms/iseries/dt.c
arch/powerpc/platforms/iseries/hvlpconfig.c
arch/powerpc/platforms/iseries/iommu.c
arch/powerpc/platforms/iseries/it_exp_vpd_panel.h [moved from include/asm-powerpc/iseries/it_exp_vpd_panel.h with 89% similarity]
arch/powerpc/platforms/iseries/it_lp_naca.h [moved from include/asm-powerpc/iseries/it_lp_naca.h with 96% similarity]
arch/powerpc/platforms/iseries/lpardata.c
arch/powerpc/platforms/iseries/lpevents.c
arch/powerpc/platforms/iseries/main_store.h
arch/powerpc/platforms/iseries/pci.c
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/iseries/viopath.c
arch/powerpc/platforms/iseries/vpdinfo.c
arch/powerpc/platforms/maple/pci.c
arch/powerpc/platforms/maple/setup.c
arch/powerpc/platforms/powermac/backlight.c
arch/powerpc/platforms/powermac/cpufreq_32.c
arch/powerpc/platforms/powermac/cpufreq_64.c
arch/powerpc/platforms/powermac/feature.c
arch/powerpc/platforms/powermac/low_i2c.c
arch/powerpc/platforms/powermac/pci.c
arch/powerpc/platforms/powermac/pfunc_base.c
arch/powerpc/platforms/powermac/pfunc_core.c
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/powermac/smp.c
arch/powerpc/platforms/powermac/udbg_scc.c
arch/powerpc/platforms/pseries/eeh.c
arch/powerpc/platforms/pseries/eeh_driver.c
arch/powerpc/platforms/pseries/eeh_event.c
arch/powerpc/platforms/pseries/firmware.c
arch/powerpc/platforms/pseries/hvCall.S
arch/powerpc/platforms/pseries/hvconsole.c
arch/powerpc/platforms/pseries/iommu.c
arch/powerpc/platforms/pseries/lpar.c
arch/powerpc/platforms/pseries/nvram.c
arch/powerpc/platforms/pseries/pci.c
arch/powerpc/platforms/pseries/plpar_wrappers.h
arch/powerpc/platforms/pseries/ras.c
arch/powerpc/platforms/pseries/rtasd.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/platforms/pseries/xics.c
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/i8259.c
arch/powerpc/sysdev/mmio_nvram.c
arch/powerpc/sysdev/tsi108_pci.c
drivers/char/Kconfig
drivers/char/Makefile
drivers/char/agp/uninorth-agp.c
drivers/char/briq_panel.c [new file with mode: 0644]
drivers/char/hvc_console.c
drivers/char/hvc_console.h
drivers/char/hvc_iseries.c [new file with mode: 0644]
drivers/char/hvc_rtas.c
drivers/char/hvc_vio.c
drivers/char/hvsi.c
drivers/char/tpm/tpm_atmel.h
drivers/char/viocons.c
drivers/char/viotape.c
drivers/i2c/busses/i2c-powermac.c
drivers/ide/ppc/pmac.c
drivers/macintosh/macio_asic.c
drivers/macintosh/macio_sysfs.c
drivers/macintosh/smu.c
drivers/macintosh/therm_adt746x.c
drivers/macintosh/therm_pm72.c
drivers/macintosh/therm_windtunnel.c
drivers/macintosh/via-cuda.c
drivers/macintosh/via-pmu-led.c
drivers/macintosh/via-pmu.c
drivers/macintosh/windfarm_pm81.c
drivers/macintosh/windfarm_pm91.c
drivers/macintosh/windfarm_smu_controls.c
drivers/macintosh/windfarm_smu_sat.c
drivers/macintosh/windfarm_smu_sensors.c
drivers/net/bmac.c
drivers/net/ibmveth.c
drivers/net/ibmveth.h
drivers/net/mace.c
drivers/net/spider_net.c
drivers/net/sungem.c
drivers/pci/hotplug/rpaphp_core.c
drivers/scsi/ibmvscsi/rpa_vscsi.c
drivers/scsi/mac53c94.c
drivers/scsi/mesh.c
drivers/scsi/sata_svw.c
drivers/serial/pmac_zilog.c
drivers/video/S3triofb.c
drivers/video/aty/radeon_base.c
drivers/video/aty/radeon_monitor.c
drivers/video/aty/radeon_pm.c
drivers/video/nvidia/nv_of.c
drivers/video/offb.c
drivers/video/riva/fbdev.c
include/asm-powerpc/cputable.h
include/asm-powerpc/hvcall.h
include/asm-powerpc/ibmebus.h
include/asm-powerpc/irq.h
include/asm-powerpc/iseries/hv_call_xm.h
include/asm-powerpc/iseries/hv_lp_config.h
include/asm-powerpc/iseries/it_lp_queue.h
include/asm-powerpc/iseries/vio.h
include/asm-powerpc/lppaca.h
include/asm-powerpc/paca.h
include/asm-powerpc/processor.h
include/asm-powerpc/prom.h
include/asm-powerpc/rtas.h
include/asm-powerpc/smu.h
include/asm-powerpc/spu.h
include/asm-powerpc/system.h
include/asm-powerpc/vio.h
scripts/checkstack.pl
sound/aoa/core/snd-aoa-gpio-feature.c
sound/oss/dmasound/dmasound_awacs.c
sound/ppc/tumbler.c

index 4d4b6fb..904798f 100644 (file)
@@ -432,7 +432,8 @@ config PPC_IBM_CELL_BLADE
        select UDBG_RTAS_CONSOLE
 
 config UDBG_RTAS_CONSOLE
-       bool
+       bool "RTAS based debug console"
+       depends on PPC_RTAS
        default n
 
 config XICS
index d961bfe..afc776f 100644 (file)
@@ -41,6 +41,10 @@ src-boot += $(zlib)
 src-boot := $(addprefix $(obj)/, $(src-boot))
 obj-boot := $(addsuffix .o, $(basename $(src-boot)))
 
+ifeq ($(call cc-option-yn, -fstack-protector),y)
+BOOTCFLAGS     += -fno-stack-protector
+endif
+
 BOOTCFLAGS     += -I$(obj) -I$(srctree)/$(obj)
 
 quiet_cmd_copy_zlib = COPY    $@
index 80a0db4..27b18ca 100644 (file)
@@ -474,7 +474,7 @@ CONFIG_E1000=y
 # CONFIG_SKY2 is not set
 # CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
-# CONFIG_TIGON3 is not set
+CONFIG_TIGON3=y
 # CONFIG_BNX2 is not set
 # CONFIG_MV643XX_ETH is not set
 
index 956c2e5..d2ab294 100644 (file)
@@ -16,7 +16,7 @@ obj-y                         := semaphore.o cputable.o ptrace.o syscalls.o \
 obj-y                          += vdso32/
 obj-$(CONFIG_PPC64)            += setup_64.o binfmt_elf32.o sys_ppc32.o \
                                   signal_64.o ptrace32.o \
-                                  paca.o cpu_setup_power4.o \
+                                  paca.o cpu_setup_ppc970.o \
                                   firmware.o sysfs.o
 obj-$(CONFIG_PPC64)            += vdso64/
 obj-$(CONFIG_ALTIVEC)          += vecemu.o vector.o
index 7ee8496..c53acd2 100644 (file)
@@ -40,9 +40,9 @@
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
 #include <asm/lppaca.h>
-#include <asm/iseries/hv_lp_event.h>
 #include <asm/cache.h>
 #include <asm/compat.h>
+#include <asm/mmu.h>
 #endif
 
 #define DEFINE(sym, val) \
@@ -136,11 +136,17 @@ int main(void)
        DEFINE(PACA_STARTPURR, offsetof(struct paca_struct, startpurr));
        DEFINE(PACA_USER_TIME, offsetof(struct paca_struct, user_time));
        DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
+       DEFINE(PACA_SLBSHADOWPTR, offsetof(struct paca_struct, slb_shadow_ptr));
 
+       DEFINE(SLBSHADOW_STACKVSID,
+              offsetof(struct slb_shadow, save_area[SLB_NUM_BOLTED - 1].vsid));
+       DEFINE(SLBSHADOW_STACKESID,
+              offsetof(struct slb_shadow, save_area[SLB_NUM_BOLTED - 1].esid));
        DEFINE(LPPACASRR0, offsetof(struct lppaca, saved_srr0));
        DEFINE(LPPACASRR1, offsetof(struct lppaca, saved_srr1));
        DEFINE(LPPACAANYINT, offsetof(struct lppaca, int_dword.any_int));
        DEFINE(LPPACADECRINT, offsetof(struct lppaca, int_dword.fields.decr_int));
+       DEFINE(SLBSHADOW_SAVEAREA, offsetof(struct slb_shadow, save_area));
 #endif /* CONFIG_PPC64 */
 
        /* RTAS */
@@ -240,6 +246,7 @@ int main(void)
        DEFINE(CPU_SPEC_PVR_VALUE, offsetof(struct cpu_spec, pvr_value));
        DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
        DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
+       DEFINE(CPU_SPEC_RESTORE, offsetof(struct cpu_spec, cpu_restore));
 
 #ifndef CONFIG_PPC64
        DEFINE(pbe_address, offsetof(struct pbe, address));
index f4e5e14..995fcef 100644 (file)
@@ -158,35 +158,35 @@ int btext_initialize(struct device_node *np)
 {
        unsigned int width, height, depth, pitch;
        unsigned long address = 0;
-       u32 *prop;
+       const u32 *prop;
 
-       prop = (u32 *)get_property(np, "linux,bootx-width", NULL);
+       prop = get_property(np, "linux,bootx-width", NULL);
        if (prop == NULL)
-               prop = (u32 *)get_property(np, "width", NULL);
+               prop = get_property(np, "width", NULL);
        if (prop == NULL)
                return -EINVAL;
        width = *prop;
-       prop = (u32 *)get_property(np, "linux,bootx-height", NULL);
+       prop = get_property(np, "linux,bootx-height", NULL);
        if (prop == NULL)
-               prop = (u32 *)get_property(np, "height", NULL);
+               prop = get_property(np, "height", NULL);
        if (prop == NULL)
                return -EINVAL;
        height = *prop;
-       prop = (u32 *)get_property(np, "linux,bootx-depth", NULL);
+       prop = get_property(np, "linux,bootx-depth", NULL);
        if (prop == NULL)
-               prop = (u32 *)get_property(np, "depth", NULL);
+               prop = get_property(np, "depth", NULL);
        if (prop == NULL)
                return -EINVAL;
        depth = *prop;
        pitch = width * ((depth + 7) / 8);
-       prop = (u32 *)get_property(np, "linux,bootx-linebytes", NULL);
+       prop = get_property(np, "linux,bootx-linebytes", NULL);
        if (prop == NULL)
-               prop = (u32 *)get_property(np, "linebytes", NULL);
+               prop = get_property(np, "linebytes", NULL);
        if (prop)
                pitch = *prop;
        if (pitch == 1)
                pitch = 0x1000;
-       prop = (u32 *)get_property(np, "address", NULL);
+       prop = get_property(np, "address", NULL);
        if (prop)
                address = *prop;
 
@@ -214,11 +214,11 @@ int btext_initialize(struct device_node *np)
 
 int __init btext_find_display(int allow_nonstdout)
 {
-       char *name;
+       const char *name;
        struct device_node *np = NULL; 
        int rc = -ENODEV;
 
-       name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
+       name = get_property(of_chosen, "linux,stdout-path", NULL);
        if (name != NULL) {
                np = of_find_node_by_path(name);
                if (np != NULL) {
similarity index 73%
rename from arch/powerpc/kernel/cpu_setup_power4.S
rename to arch/powerpc/kernel/cpu_setup_ppc970.S
index 76e97aa..6525948 100644 (file)
 #include <asm/asm-offsets.h>
 #include <asm/cache.h>
 
-_GLOBAL(__970_cpu_preinit)
-       /*
-        * Do nothing if not running in HV mode
-        */
+_GLOBAL(__cpu_preinit_ppc970)
+       /* Do nothing if not running in HV mode */
        mfmsr   r0
        rldicl. r0,r0,4,63
        beqlr
 
-       /*
-        * Deal only with PPC970 and PPC970FX.
-        */
-       mfspr   r0,SPRN_PVR
-       srwi    r0,r0,16
-       cmpwi   r0,0x39
-       beq     1f
-       cmpwi   r0,0x3c
-       beq     1f
-       cmpwi   r0,0x44
-       bnelr
-1:
-
        /* Make sure HID4:rm_ci is off before MMU is turned off, that large
         * pages are enabled with HID4:61 and clear HID5:DCBZ_size and
         * HID5:DCBZ32_ill
@@ -72,23 +57,6 @@ _GLOBAL(__970_cpu_preinit)
        isync
        blr
 
-_GLOBAL(__setup_cpu_ppc970)
-       mfspr   r0,SPRN_HID0
-       li      r11,5                   /* clear DOZE and SLEEP */
-       rldimi  r0,r11,52,8             /* set NAP and DPM */
-       li      r11,0
-       rldimi  r0,r11,32,31            /* clear EN_ATTN */
-       mtspr   SPRN_HID0,r0
-       mfspr   r0,SPRN_HID0
-       mfspr   r0,SPRN_HID0
-       mfspr   r0,SPRN_HID0
-       mfspr   r0,SPRN_HID0
-       mfspr   r0,SPRN_HID0
-       mfspr   r0,SPRN_HID0
-       sync
-       isync
-       blr
-
 /* Definitions for the table use to save CPU states */
 #define CS_HID0                0
 #define CS_HID1                8
@@ -103,33 +71,30 @@ cpu_state_storage:
        .balign L1_CACHE_BYTES,0
        .text
 
-/* Called in normal context to backup CPU 0 state. This
- * does not include cache settings. This function is also
- * called for machine sleep. This does not include the MMU
- * setup, BATs, etc... but rather the "special" registers
- * like HID0, HID1, HID4, etc...
- */
-_GLOBAL(__save_cpu_setup)
-       /* Some CR fields are volatile, we back it up all */
-       mfcr    r7
-
-       /* Get storage ptr */
-       LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
 
-       /* We only deal with 970 for now */
-       mfspr   r0,SPRN_PVR
-       srwi    r0,r0,16
-       cmpwi   r0,0x39
-       beq     1f
-       cmpwi   r0,0x3c
-       beq     1f
-       cmpwi   r0,0x44
-       bne     2f
-
-1:     /* skip if not running in HV mode */
+_GLOBAL(__setup_cpu_ppc970)
+       /* Do nothing if not running in HV mode */
        mfmsr   r0
        rldicl. r0,r0,4,63
-       beq     2f
+       beqlr
+
+       mfspr   r0,SPRN_HID0
+       li      r11,5                   /* clear DOZE and SLEEP */
+       rldimi  r0,r11,52,8             /* set NAP and DPM */
+       li      r11,0
+       rldimi  r0,r11,32,31            /* clear EN_ATTN */
+       mtspr   SPRN_HID0,r0
+       mfspr   r0,SPRN_HID0
+       mfspr   r0,SPRN_HID0
+       mfspr   r0,SPRN_HID0
+       mfspr   r0,SPRN_HID0
+       mfspr   r0,SPRN_HID0
+       mfspr   r0,SPRN_HID0
+       sync
+       isync
+
+       /* Save away cpu state */
+       LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
 
        /* Save HID0,1,4 and 5 */
        mfspr   r3,SPRN_HID0
@@ -141,35 +106,19 @@ _GLOBAL(__save_cpu_setup)
        mfspr   r3,SPRN_HID5
        std     r3,CS_HID5(r5)
 
-2:
-       mtcr    r7
        blr
 
 /* Called with no MMU context (typically MSR:IR/DR off) to
  * restore CPU state as backed up by the previous
  * function. This does not include cache setting
  */
-_GLOBAL(__restore_cpu_setup)
-       /* Get storage ptr (FIXME when using anton reloc as we
-        * are running with translation disabled here
-        */
-       LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
-
-       /* We only deal with 970 for now */
-       mfspr   r0,SPRN_PVR
-       srwi    r0,r0,16
-       cmpwi   r0,0x39
-       beq     1f
-       cmpwi   r0,0x3c
-       beq     1f
-       cmpwi   r0,0x44
-       bnelr
-
-1:     /* skip if not running in HV mode */
+_GLOBAL(__restore_cpu_ppc970)
+       /* Do nothing if not running in HV mode */
        mfmsr   r0
        rldicl. r0,r0,4,63
        beqlr
 
+       LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
        /* Before accessing memory, we make sure rm_ci is clear */
        li      r0,0
        mfspr   r3,SPRN_HID4
index 272e436..306da4c 100644 (file)
@@ -39,7 +39,10 @@ extern void __setup_cpu_7400(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_7410(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
 #endif /* CONFIG_PPC32 */
+#ifdef CONFIG_PPC64
 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
+extern void __restore_cpu_ppc970(void);
+#endif /* CONFIG_PPC64 */
 
 /* This table only contains "desktop" CPUs, it need to be filled with embedded
  * ones as well...
@@ -184,6 +187,7 @@ struct cpu_spec     cpu_specs[] = {
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_ppc970,
+               .cpu_restore            = __restore_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .platform               = "ppc970",
@@ -199,6 +203,7 @@ struct cpu_spec     cpu_specs[] = {
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_ppc970,
+               .cpu_restore            = __restore_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .platform               = "ppc970",
@@ -214,6 +219,7 @@ struct cpu_spec     cpu_specs[] = {
                .dcache_bsize           = 128,
                .num_pmcs               = 8,
                .cpu_setup              = __setup_cpu_ppc970,
+               .cpu_restore            = __restore_cpu_ppc970,
                .oprofile_cpu_type      = "ppc64/970",
                .oprofile_type          = PPC_OPROFILE_POWER4,
                .platform               = "ppc970",
index 371973b..2f6f5a7 100644 (file)
@@ -80,7 +80,7 @@ static int __init parse_savemaxmem(char *p)
 }
 __setup("savemaxmem=", parse_savemaxmem);
 
-/*
+/**
  * copy_oldmem_page - copy one page from "oldmem"
  * @pfn: page frame number to be copied
  * @buf: target memory address for the copy; this can be in kernel address
index 36aaa76..6c168f6 100644 (file)
@@ -35,10 +35,9 @@ int dma_supported(struct device *dev, u64 mask)
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               return dma_ops->dma_supported(dev, mask);
-       BUG();
-       return 0;
+       BUG_ON(!dma_ops);
+
+       return dma_ops->dma_supported(dev, mask);
 }
 EXPORT_SYMBOL(dma_supported);
 
@@ -66,10 +65,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               return dma_ops->alloc_coherent(dev, size, dma_handle, flag);
-       BUG();
-       return NULL;
+       BUG_ON(!dma_ops);
+
+       return dma_ops->alloc_coherent(dev, size, dma_handle, flag);
 }
 EXPORT_SYMBOL(dma_alloc_coherent);
 
@@ -78,10 +76,9 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
-       else
-               BUG();
+       BUG_ON(!dma_ops);
+
+       dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
 }
 EXPORT_SYMBOL(dma_free_coherent);
 
@@ -90,10 +87,9 @@ dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, size_t size,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               return dma_ops->map_single(dev, cpu_addr, size, direction);
-       BUG();
-       return (dma_addr_t)0;
+       BUG_ON(!dma_ops);
+
+       return dma_ops->map_single(dev, cpu_addr, size, direction);
 }
 EXPORT_SYMBOL(dma_map_single);
 
@@ -102,10 +98,9 @@ void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               dma_ops->unmap_single(dev, dma_addr, size, direction);
-       else
-               BUG();
+       BUG_ON(!dma_ops);
+
+       dma_ops->unmap_single(dev, dma_addr, size, direction);
 }
 EXPORT_SYMBOL(dma_unmap_single);
 
@@ -115,11 +110,10 @@ dma_addr_t dma_map_page(struct device *dev, struct page *page,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               return dma_ops->map_single(dev,
-                               (page_address(page) + offset), size, direction);
-       BUG();
-       return (dma_addr_t)0;
+       BUG_ON(!dma_ops);
+
+       return dma_ops->map_single(dev, page_address(page) + offset, size,
+                       direction);
 }
 EXPORT_SYMBOL(dma_map_page);
 
@@ -128,10 +122,9 @@ void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               dma_ops->unmap_single(dev, dma_address, size, direction);
-       else
-               BUG();
+       BUG_ON(!dma_ops);
+
+       dma_ops->unmap_single(dev, dma_address, size, direction);
 }
 EXPORT_SYMBOL(dma_unmap_page);
 
@@ -140,10 +133,9 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               return dma_ops->map_sg(dev, sg, nents, direction);
-       BUG();
-       return 0;
+       BUG_ON(!dma_ops);
+
+       return dma_ops->map_sg(dev, sg, nents, direction);
 }
 EXPORT_SYMBOL(dma_map_sg);
 
@@ -152,9 +144,8 @@ void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
 {
        struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
 
-       if (dma_ops)
-               dma_ops->unmap_sg(dev, sg, nhwentries, direction);
-       else
-               BUG();
+       BUG_ON(!dma_ops);
+
+       dma_ops->unmap_sg(dev, sg, nhwentries, direction);
 }
 EXPORT_SYMBOL(dma_unmap_sg);
index 54d9f5c..2cd872b 100644 (file)
@@ -375,6 +375,14 @@ BEGIN_FTR_SECTION
        ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
        oris    r0,r6,(SLB_ESID_V)@h
        ori     r0,r0,(SLB_NUM_BOLTED-1)@l
+
+       /* Update the last bolted SLB */
+       ld      r9,PACA_SLBSHADOWPTR(r13)
+       li      r12,0
+       std     r12,SLBSHADOW_STACKESID(r9) /* Clear ESID */
+       std     r7,SLBSHADOW_STACKVSID(r9)  /* Save VSID */
+       std     r0,SLBSHADOW_STACKESID(r9)  /* Save ESID */
+
        slbie   r6
        slbie   r6              /* Workaround POWER5 < DD2.1 issue */
        slbmte  r7,r0
index 6ff3cf5..e9963d9 100644 (file)
@@ -132,7 +132,7 @@ _GLOBAL(__secondary_hold)
        bne     100b
 
 #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
-       LOAD_REG_IMMEDIATE(r4, .pSeries_secondary_smp_init)
+       LOAD_REG_IMMEDIATE(r4, .generic_secondary_smp_init)
        mtctr   r4
        mr      r3,r24
        bctr
@@ -1484,19 +1484,17 @@ fwnmi_data_area:
         . = 0x8000
 
 /*
- * On pSeries, secondary processors spin in the following code.
+ * On pSeries and most other platforms, secondary processors spin
+ * in the following code.
  * At entry, r3 = this processor's number (physical cpu id)
  */
-_GLOBAL(pSeries_secondary_smp_init)
+_GLOBAL(generic_secondary_smp_init)
        mr      r24,r3
        
        /* turn on 64-bit mode */
        bl      .enable_64b_mode
        isync
 
-       /* Copy some CPU settings from CPU 0 */
-       bl      .__restore_cpu_setup
-
        /* Set up a paca value for this processor. Since we have the
         * physical cpu id in r24, we need to search the pacas to find
         * which logical id maps to our physical one.
@@ -1522,15 +1520,28 @@ _GLOBAL(pSeries_secondary_smp_init)
                                        /* start.                        */
        sync
 
-       /* Create a temp kernel stack for use before relocation is on.  */
+#ifndef CONFIG_SMP
+       b       3b                      /* Never go on non-SMP           */
+#else
+       cmpwi   0,r23,0
+       beq     3b                      /* Loop until told to go         */
+
+       /* See if we need to call a cpu state restore handler */
+       LOAD_REG_IMMEDIATE(r23, cur_cpu_spec)
+       ld      r23,0(r23)
+       ld      r23,CPU_SPEC_RESTORE(r23)
+       cmpdi   0,r23,0
+       beq     4f
+       ld      r23,0(r23)
+       mtctr   r23
+       bctrl
+
+4:     /* Create a temp kernel stack for use before relocation is on.  */
        ld      r1,PACAEMERGSP(r13)
        subi    r1,r1,STACK_FRAME_OVERHEAD
 
-       cmpwi   0,r23,0
-#ifdef CONFIG_SMP
-       bne     .__secondary_start
+       b       .__secondary_start
 #endif
-       b       3b                      /* Loop until told to go         */
 
 #ifdef CONFIG_PPC_ISERIES
 _STATIC(__start_initialization_iSeries)
@@ -1611,7 +1622,16 @@ _GLOBAL(__start_initialization_multiplatform)
        bl      .enable_64b_mode
 
        /* Setup some critical 970 SPRs before switching MMU off */
-       bl      .__970_cpu_preinit
+       mfspr   r0,SPRN_PVR
+       srwi    r0,r0,16
+       cmpwi   r0,0x39         /* 970 */
+       beq     1f
+       cmpwi   r0,0x3c         /* 970FX */
+       beq     1f
+       cmpwi   r0,0x44         /* 970MP */
+       bne     2f
+1:     bl      .__cpu_preinit_ppc970
+2:
 
        /* Switch off MMU if not already */
        LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE)
@@ -1782,7 +1802,7 @@ _GLOBAL(pmac_secondary_start)
        isync
 
        /* Copy some CPU settings from CPU 0 */
-       bl      .__restore_cpu_setup
+       bl      .__restore_cpu_ppc970
 
        /* pSeries do that early though I don't think we really need it */
        mfmsr   r3
@@ -1932,12 +1952,6 @@ _STATIC(start_here_multiplatform)
        mr      r5,r26
        bl      .identify_cpu
 
-       /* Save some low level config HIDs of CPU0 to be copied to
-        * other CPUs later on, or used for suspend/resume
-        */
-       bl      .__save_cpu_setup
-       sync
-
        /* Do very early kernel initializations, including initial hash table,
         * stab and slb setup before we turn on relocation.     */
 
index 68e5ab0..124dbcb 100644 (file)
@@ -167,7 +167,7 @@ static DEVICE_ATTR(name, S_IRUSR | S_IRGRP | S_IROTH, ibmebusdev_show_name,
                   NULL);
 
 static struct ibmebus_dev* __devinit ibmebus_register_device_common(
-       struct ibmebus_dev *dev, char *name)
+       struct ibmebus_dev *dev, const char *name)
 {
        int err = 0;
 
@@ -194,10 +194,10 @@ static struct ibmebus_dev* __devinit ibmebus_register_device_node(
        struct device_node *dn)
 {
        struct ibmebus_dev *dev;
-       char *loc_code;
+       const char *loc_code;
        int length;
 
-       loc_code = (char *)get_property(dn, "ibm,loc-code", NULL);
+       loc_code = get_property(dn, "ibm,loc-code", NULL);
        if (!loc_code) {
                 printk(KERN_WARNING "%s: node %s missing 'ibm,loc-code'\n",
                       __FUNCTION__, dn->name ? dn->name : "<unknown>");
index 12c5971..b443233 100644 (file)
@@ -52,6 +52,7 @@
 #include <linux/radix-tree.h>
 #include <linux/mutex.h>
 #include <linux/bootmem.h>
+#include <linux/pci.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -875,12 +876,14 @@ int pci_enable_msi(struct pci_dev * pdev)
        else
                return -1;
 }
+EXPORT_SYMBOL(pci_enable_msi);
 
 void pci_disable_msi(struct pci_dev * pdev)
 {
        if (ppc_md.disable_msi)
                ppc_md.disable_msi(pdev);
 }
+EXPORT_SYMBOL(pci_disable_msi);
 
 void pci_scan_msi_device(struct pci_dev *dev) {}
 int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) {return -1;}
@@ -888,6 +891,8 @@ void pci_disable_msix(struct pci_dev *dev) {}
 void msi_remove_pci_irq_vectors(struct pci_dev *dev) {}
 void disable_msi_mode(struct pci_dev *dev, int pos, int type) {}
 void pci_no_msi(void) {}
+EXPORT_SYMBOL(pci_enable_msix);
+EXPORT_SYMBOL(pci_disable_msix);
 
 #endif
 
index 40a3929..5e6ddfa 100644 (file)
@@ -39,16 +39,17 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
                                  phys_addr_t taddr, unsigned long irq,
                                  upf_t flags, int irq_check_parent)
 {
-       u32 *clk, *spd, clock = BASE_BAUD * 16;
+       const u32 *clk, *spd;
+       u32 clock = BASE_BAUD * 16;
        int index;
 
        /* get clock freq. if present */
-       clk = (u32 *)get_property(np, "clock-frequency", NULL);
+       clk = get_property(np, "clock-frequency", NULL);
        if (clk && *clk)
                clock = *clk;
 
        /* get default speed if present */
-       spd = (u32 *)get_property(np, "current-speed", NULL);
+       spd = get_property(np, "current-speed", NULL);
 
        /* If we have a location index, then try to use it */
        if (want_index >= 0 && want_index < MAX_LEGACY_SERIAL_PORTS)
@@ -113,7 +114,7 @@ static int __init add_legacy_soc_port(struct device_node *np,
                                      struct device_node *soc_dev)
 {
        u64 addr;
-       u32 *addrp;
+       const u32 *addrp;
        upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
        struct device_node *tsi = of_get_parent(np);
 
@@ -144,15 +145,15 @@ static int __init add_legacy_soc_port(struct device_node *np,
 static int __init add_legacy_isa_port(struct device_node *np,
                                      struct device_node *isa_brg)
 {
-       u32 *reg;
-       char *typep;
+       const u32 *reg;
+       const char *typep;
        int index = -1;
        u64 taddr;
 
        DBG(" -> add_legacy_isa_port(%s)\n", np->full_name);
 
        /* Get the ISA port number */
-       reg = (u32 *)get_property(np, "reg", NULL);
+       reg = get_property(np, "reg", NULL);
        if (reg == NULL)
                return -1;
 
@@ -163,7 +164,7 @@ static int __init add_legacy_isa_port(struct device_node *np,
        /* Now look for an "ibm,aix-loc" property that gives us ordering
         * if any...
         */
-       typep = (char *)get_property(np, "ibm,aix-loc", NULL);
+       typep = get_property(np, "ibm,aix-loc", NULL);
 
        /* If we have a location index, then use it */
        if (typep && *typep == 'S')
@@ -188,7 +189,7 @@ static int __init add_legacy_pci_port(struct device_node *np,
                                      struct device_node *pci_dev)
 {
        u64 addr, base;
-       u32 *addrp;
+       const u32 *addrp;
        unsigned int flags;
        int iotype, index = -1, lindex = 0;
 
@@ -227,7 +228,7 @@ static int __init add_legacy_pci_port(struct device_node *np,
         * we get to their "reg" property
         */
        if (np != pci_dev) {
-               u32 *reg = (u32 *)get_property(np, "reg", NULL);
+               const u32 *reg = get_property(np, "reg", NULL);
                if (reg && (*reg < 4))
                        index = lindex = *reg;
        }
@@ -285,13 +286,13 @@ static void __init setup_legacy_serial_console(int console)
 void __init find_legacy_serial_ports(void)
 {
        struct device_node *np, *stdout = NULL;
-       char *path;
+       const char *path;
        int index;
 
        DBG(" -> find_legacy_serial_port()\n");
 
        /* Now find out if one of these is out firmware console */
-       path = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
+       path = get_property(of_chosen, "linux,stdout-path", NULL);
        if (path != NULL) {
                stdout = of_find_node_by_path(path);
                if (stdout)
@@ -491,8 +492,8 @@ static int __init check_legacy_serial_console(void)
 {
        struct device_node *prom_stdout = NULL;
        int speed = 0, offset = 0;
-       char *name;
-       u32 *spd;
+       const char *name;
+       const u32 *spd;
 
        DBG(" -> check_legacy_serial_console()\n");
 
@@ -513,7 +514,7 @@ static int __init check_legacy_serial_console(void)
        }
        /* We are getting a weird phandle from OF ... */
        /* ... So use the full path instead */
-       name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
+       name = get_property(of_chosen, "linux,stdout-path", NULL);
        if (name == NULL) {
                DBG(" no linux,stdout-path !\n");
                return -ENODEV;
@@ -525,12 +526,12 @@ static int __init check_legacy_serial_console(void)
        }
        DBG("stdout is %s\n", prom_stdout->full_name);
 
-       name = (char *)get_property(prom_stdout, "name", NULL);
+       name = get_property(prom_stdout, "name", NULL);
        if (!name) {
                DBG(" stdout package has no name !\n");
                goto not_found;
        }
-       spd = (u32 *)get_property(prom_stdout, "current-speed", NULL);
+       spd = get_property(prom_stdout, "current-speed", NULL);
        if (spd)
                speed = *spd;
 
index 23f34da..41c05dc 100644 (file)
@@ -32,7 +32,6 @@
 #include <asm/rtas.h>
 #include <asm/system.h>
 #include <asm/time.h>
-#include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/prom.h>
 #include <asm/vdso_datapage.h>
 
@@ -183,8 +182,14 @@ static unsigned int h_get_ppp(unsigned long *entitled,
                              unsigned long *resource)
 {
        unsigned long rc;
-       rc = plpar_hcall_4out(H_GET_PPP, 0, 0, 0, 0, entitled, unallocated,
-                             aggregation, resource);
+       unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+       rc = plpar_hcall(H_GET_PPP, retbuf);
+
+       *entitled = retbuf[0];
+       *unallocated = retbuf[1];
+       *aggregation = retbuf[2];
+       *resource = retbuf[3];
 
        log_plpar_hcall_return(rc, "H_GET_PPP");
 
@@ -194,8 +199,12 @@ static unsigned int h_get_ppp(unsigned long *entitled,
 static void h_pic(unsigned long *pool_idle_time, unsigned long *num_procs)
 {
        unsigned long rc;
-       unsigned long dummy;
-       rc = plpar_hcall(H_PIC, 0, 0, 0, 0, pool_idle_time, num_procs, &dummy);
+       unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
+
+       rc = plpar_hcall(H_PIC, retbuf);
+
+       *pool_idle_time = retbuf[0];
+       *num_procs = retbuf[1];
 
        if (rc != H_AUTHORITY)
                log_plpar_hcall_return(rc, "H_PIC");
@@ -310,12 +319,11 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
        int partition_potential_processors;
        int partition_active_processors;
        struct device_node *rtas_node;
-       int *lrdrp = NULL;
+       const int *lrdrp = NULL;
 
        rtas_node = find_path_device("/rtas");
        if (rtas_node)
-               lrdrp = (int *)get_property(rtas_node, "ibm,lrdr-capacity",
-                                           NULL);
+               lrdrp = get_property(rtas_node, "ibm,lrdr-capacity", NULL);
 
        if (lrdrp == NULL) {
                partition_potential_processors = vdso_data->processorCount;
@@ -520,7 +528,8 @@ static int lparcfg_data(struct seq_file *m, void *v)
        const char *model = "";
        const char *system_id = "";
        const char *tmp;
-       unsigned int *lp_index_ptr, lp_index = 0;
+       const unsigned int *lp_index_ptr;
+       unsigned int lp_index = 0;
 
        seq_printf(m, "%s %s \n", MODULE_NAME, MODULE_VERS);
 
@@ -540,8 +549,7 @@ static int lparcfg_data(struct seq_file *m, void *v)
                        if (firmware_has_feature(FW_FEATURE_ISERIES))
                                system_id += 4;
                }
-               lp_index_ptr = (unsigned int *)
-                       get_property(rootdn, "ibm,partition-no", NULL);
+               lp_index_ptr = get_property(rootdn, "ibm,partition-no", NULL);
                if (lp_index_ptr)
                        lp_index = *lp_index_ptr;
        }
index be58985..a24b09c 100644 (file)
@@ -31,8 +31,8 @@ int default_machine_kexec_prepare(struct kimage *image)
        unsigned long begin, end;       /* limits of segment */
        unsigned long low, high;        /* limits of blocked memory range */
        struct device_node *node;
-       unsigned long *basep;
-       unsigned int *sizep;
+       const unsigned long *basep;
+       const unsigned int *sizep;
 
        if (!ppc_md.hpte_clear_all)
                return -ENOENT;
@@ -72,10 +72,8 @@ int default_machine_kexec_prepare(struct kimage *image)
        /* We also should not overwrite the tce tables */
        for (node = of_find_node_by_type(NULL, "pci"); node != NULL;
                        node = of_find_node_by_type(node, "pci")) {
-               basep = (unsigned long *)get_property(node, "linux,tce-base",
-                                                       NULL);
-               sizep = (unsigned int *)get_property(node, "linux,tce-size",
-                                                       NULL);
+               basep = get_property(node, "linux,tce-base", NULL);
+               sizep = get_property(node, "linux,tce-size", NULL);
                if (basep == NULL || sizep == NULL)
                        continue;
 
index 3262b73..397c83e 100644 (file)
@@ -189,27 +189,9 @@ void of_release_dev(struct device *dev)
 int of_device_register(struct of_device *ofdev)
 {
        int rc;
-       struct of_device **odprop;
 
        BUG_ON(ofdev->node == NULL);
 
-       odprop = (struct of_device **)get_property(ofdev->node, "linux,device", NULL);
-       if (!odprop) {
-               struct property *new_prop;
-       
-               new_prop = kmalloc(sizeof(struct property) + sizeof(struct of_device *),
-                       GFP_KERNEL);
-               if (new_prop == NULL)
-                       return -ENOMEM;
-               new_prop->name = "linux,device";
-               new_prop->length = sizeof(sizeof(struct of_device *));
-               new_prop->value = (unsigned char *)&new_prop[1];
-               odprop = (struct of_device **)new_prop->value;
-               *odprop = NULL;
-               prom_add_property(ofdev->node, new_prop);
-       }
-       *odprop = ofdev;
-
        rc = device_register(&ofdev->dev);
        if (rc)
                return rc;
@@ -221,14 +203,8 @@ int of_device_register(struct of_device *ofdev)
 
 void of_device_unregister(struct of_device *ofdev)
 {
-       struct of_device **odprop;
-
        device_remove_file(&ofdev->dev, &dev_attr_devspec);
 
-       odprop = (struct of_device **)get_property(ofdev->node, "linux,device", NULL);
-       if (odprop)
-               *odprop = NULL;
-
        device_unregister(&ofdev->dev);
 }
 
index c68741f..55f1a25 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/lppaca.h>
 #include <asm/iseries/it_lp_reg_save.h>
 #include <asm/paca.h>
+#include <asm/mmu.h>
 
 
 /* This symbol is provided by the linker - let it fill in the paca
@@ -45,6 +46,17 @@ struct lppaca lppaca[] = {
        },
 };
 
+/*
+ * 3 persistent SLBs are registered here.  The buffer will be zero
+ * initially, hence will all be invaild until we actually write them.
+ */
+struct slb_shadow slb_shadow[] __cacheline_aligned = {
+       [0 ... (NR_CPUS-1)] = {
+               .persistent = SLB_NUM_BOLTED,
+               .buffer_length = sizeof(struct slb_shadow),
+       },
+};
+
 /* The Paca is an array with one entry per processor.  Each contains an
  * lppaca, which contains the information shared between the
  * hypervisor and Linux.
@@ -59,7 +71,8 @@ struct lppaca lppaca[] = {
        .lock_token = 0x8000,                                               \
        .paca_index = (number),         /* Paca Index */                    \
        .kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL,             \
-       .hw_cpu_id = 0xffff,
+       .hw_cpu_id = 0xffff,                                                \
+       .slb_shadow_ptr = &slb_shadow[number],
 
 #ifdef CONFIG_PPC_ISERIES
 #define PACA_INIT_ISERIES(number)                                          \
index 09b1e1b..9b49f86 100644 (file)
@@ -633,12 +633,12 @@ pcibios_alloc_controller(void)
 static void
 make_one_node_map(struct device_node* node, u8 pci_bus)
 {
-       int *bus_range;
+       const int *bus_range;
        int len;
 
        if (pci_bus >= pci_bus_count)
                return;
-       bus_range = (int *) get_property(node, "bus-range", &len);
+       bus_range = 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);
@@ -648,13 +648,13 @@ make_one_node_map(struct device_node* node, u8 pci_bus)
 
        for (node=node->child; node != 0;node = node->sibling) {
                struct pci_dev* dev;
-               unsigned int *class_code, *reg;
+               const unsigned int *class_code, *reg;
        
-               class_code = (unsigned int *) get_property(node, "class-code", NULL);
+               class_code = 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);
+               reg = get_property(node, "reg", NULL);
                if (!reg)
                        continue;
                dev = pci_find_slot(pci_bus, ((reg[0] >> 8) & 0xff));
@@ -669,7 +669,7 @@ pcibios_make_OF_bus_map(void)
 {
        int i;
        struct pci_controller* hose;
-       u8* of_prop_map;
+       struct property *map_prop;
 
        pci_to_OF_bus_map = (u8*)kmalloc(pci_bus_count, GFP_KERNEL);
        if (!pci_to_OF_bus_map) {
@@ -691,9 +691,12 @@ pcibios_make_OF_bus_map(void)
                        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);
+       map_prop = of_find_property(find_path_device("/"),
+                       "pci-OF-bus-map", NULL);
+       if (map_prop) {
+               BUG_ON(pci_bus_count > map_prop->length);
+               memcpy(map_prop->value, pci_to_OF_bus_map, pci_bus_count);
+       }
 #ifdef DEBUG
        printk("PCI->OF bus map:\n");
        for (i=0; i<pci_bus_count; i++) {
@@ -712,7 +715,7 @@ scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void*
        struct device_node* sub_node;
 
        for (; node != 0;node = node->sibling) {
-               unsigned int *class_code;
+               const unsigned int *class_code;
        
                if (filter(node, data))
                        return node;
@@ -722,7 +725,7 @@ scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void*
                 * 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);
+               class_code = 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"))
@@ -737,10 +740,10 @@ scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void*
 static int
 scan_OF_pci_childs_iterator(struct device_node* node, void* data)
 {
-       unsigned int *reg;
+       const unsigned int *reg;
        u8* fdata = (u8*)data;
        
-       reg = (unsigned int *) get_property(node, "reg", NULL);
+       reg = get_property(node, "reg", NULL);
        if (reg && ((reg[0] >> 8) & 0xff) == fdata[1]
                && ((reg[0] >> 16) & 0xff) == fdata[0])
                return 1;
@@ -841,7 +844,7 @@ find_OF_pci_device_filter(struct device_node* node, void* data)
 int
 pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn)
 {
-       unsigned int *reg;
+       const unsigned int *reg;
        struct pci_controller* hose;
        struct pci_dev* dev = NULL;
        
@@ -854,7 +857,7 @@ pci_device_from_OF_node(struct device_node* node, u8* bus, u8* devfn)
        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);
+       reg = get_property(node, "reg", NULL);
        if (!reg)
                return -ENODEV;
        *bus = (reg[0] >> 16) & 0xff;
@@ -885,8 +888,8 @@ 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;
+       const unsigned int *dt_ranges;
+       unsigned int *lc_ranges, *ranges, *prev, size;
        int rlen = 0, orig_rlen;
        int memno = 0;
        struct resource *res;
@@ -897,7 +900,7 @@ pci_process_bridge_OF_ranges(struct pci_controller *hose,
         * that can have more than 3 ranges, fortunately using contiguous
         * addresses -- BenH
         */
-       dt_ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
+       dt_ranges = get_property(dev, "ranges", &rlen);
        if (!dt_ranges)
                return;
        /* Sanity check, though hopefully that never happens */
index 138134c..c1b1e14 100644 (file)
@@ -185,34 +185,6 @@ static void __devinit pci_setup_pci_controller(struct pci_controller *hose)
        spin_unlock(&hose_spinlock);
 }
 
-static void add_linux_pci_domain(struct device_node *dev,
-                                struct pci_controller *phb)
-{
-       struct property *of_prop;
-       unsigned int size;
-
-       of_prop = (struct property *)
-               get_property(dev, "linux,pci-domain", &size);
-       if (of_prop != NULL)
-               return;
-       WARN_ON(of_prop && size < sizeof(int));
-       if (of_prop && size < sizeof(int))
-               of_prop = NULL;
-       size = sizeof(struct property) + sizeof(int);
-       if (of_prop == NULL) {
-               if (mem_init_done)
-                       of_prop = kmalloc(size, GFP_KERNEL);
-               else
-                       of_prop = alloc_bootmem(size);
-       }
-       memset(of_prop, 0, sizeof(struct property));
-       of_prop->name = "linux,pci-domain";
-       of_prop->length = sizeof(int);
-       of_prop->value = (unsigned char *)&of_prop[1];
-       *((int *)of_prop->value) = phb->global_number;
-       prom_add_property(dev, of_prop);
-}
-
 struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
 {
        struct pci_controller *phb;
@@ -226,22 +198,13 @@ struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
        pci_setup_pci_controller(phb);
        phb->arch_data = dev;
        phb->is_dynamic = mem_init_done;
-       if (dev) {
+       if (dev)
                PHB_SET_NODE(phb, of_node_to_nid(dev));
-               add_linux_pci_domain(dev, phb);
-       }
        return phb;
 }
 
 void pcibios_free_controller(struct pci_controller *phb)
 {
-       if (phb->arch_data) {
-               struct device_node *np = phb->arch_data;
-               int *domain = (int *)get_property(np,
-                                                 "linux,pci-domain", NULL);
-               if (domain)
-                       *domain = -1;
-       }
        if (phb->is_dynamic)
                kfree(phb);
 }
@@ -283,10 +246,10 @@ static void __init pcibios_claim_of_setup(void)
 #ifdef CONFIG_PPC_MULTIPLATFORM
 static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
 {
-       u32 *prop;
+       const u32 *prop;
        int len;
 
-       prop = (u32 *) get_property(np, name, &len);
+       prop = get_property(np, name, &len);
        if (prop && len >= 4)
                return *prop;
        return def;
@@ -315,10 +278,11 @@ static void pci_parse_of_addrs(struct device_node *node, struct pci_dev *dev)
        u64 base, size;
        unsigned int flags;
        struct resource *res;
-       u32 *addrs, i;
+       const u32 *addrs;
+       u32 i;
        int proplen;
 
-       addrs = (u32 *) get_property(node, "assigned-addresses", &proplen);
+       addrs = get_property(node, "assigned-addresses", &proplen);
        if (!addrs)
                return;
        DBG("    parse addresses (%d bytes) @ %p\n", proplen, addrs);
@@ -418,7 +382,7 @@ void __devinit of_scan_bus(struct device_node *node,
                                  struct pci_bus *bus)
 {
        struct device_node *child = NULL;
-       u32 *reg;
+       const u32 *reg;
        int reglen, devfn;
        struct pci_dev *dev;
 
@@ -426,7 +390,7 @@ void __devinit of_scan_bus(struct device_node *node,
 
        while ((child = of_get_next_child(node, child)) != NULL) {
                DBG("  * %s\n", child->full_name);
-               reg = (u32 *) get_property(child, "reg", &reglen);
+               reg = get_property(child, "reg", &reglen);
                if (reg == NULL || reglen < 20)
                        continue;
                devfn = (reg[0] >> 8) & 0xff;
@@ -450,7 +414,7 @@ void __devinit of_scan_pci_bridge(struct device_node *node,
                                struct pci_dev *dev)
 {
        struct pci_bus *bus;
-       u32 *busrange, *ranges;
+       const u32 *busrange, *ranges;
        int len, i, mode;
        struct resource *res;
        unsigned int flags;
@@ -459,13 +423,13 @@ void __devinit of_scan_pci_bridge(struct device_node *node,
        DBG("of_scan_pci_bridge(%s)\n", node->full_name);
 
        /* parse bus-range property */
-       busrange = (u32 *) get_property(node, "bus-range", &len);
+       busrange = get_property(node, "bus-range", &len);
        if (busrange == NULL || len != 8) {
                printk(KERN_DEBUG "Can't get bus-range for PCI-PCI bridge %s\n",
                       node->full_name);
                return;
        }
-       ranges = (u32 *) get_property(node, "ranges", &len);
+       ranges = get_property(node, "ranges", &len);
        if (ranges == NULL) {
                printk(KERN_DEBUG "Can't get ranges for PCI-PCI bridge %s\n",
                       node->full_name);
@@ -929,13 +893,13 @@ static void __devinit pci_process_ISA_OF_ranges(struct device_node *isa_node,
                unsigned int size;
        };
 
-       struct isa_range *range;
+       const struct isa_range *range;
        unsigned long pci_addr;
        unsigned int isa_addr;
        unsigned int size;
        int rlen = 0;
 
-       range = (struct isa_range *) get_property(isa_node, "ranges", &rlen);
+       range = get_property(isa_node, "ranges", &rlen);
        if (range == NULL || (rlen < sizeof(struct isa_range))) {
                printk(KERN_ERR "no ISA ranges or unexpected isa range size,"
                       "mapping 64k\n");
@@ -976,7 +940,8 @@ static void __devinit pci_process_ISA_OF_ranges(struct device_node *isa_node,
 void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
                                            struct device_node *dev, int prim)
 {
-       unsigned int *ranges, pci_space;
+       const unsigned int *ranges;
+       unsigned int pci_space;
        unsigned long size;
        int rlen = 0;
        int memno = 0;
@@ -994,7 +959,7 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
         *                      (size depending on dev->n_addr_cells)
         *   cells 4+5 or 5+6:  the size of the range
         */
-       ranges = (unsigned int *) get_property(dev, "ranges", &rlen);
+       ranges = get_property(dev, "ranges", &rlen);
        if (ranges == NULL)
                return;
        hose->io_base_phys = 0;
index 1c18953..68df018 100644 (file)
@@ -40,8 +40,8 @@
 static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
 {
        struct pci_controller *phb = data;
-       int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL);
-       u32 *regs;
+       const int *type = get_property(dn, "ibm,pci-config-space-type", NULL);
+       const u32 *regs;
        struct pci_dn *pdn;
 
        if (mem_init_done)
@@ -54,14 +54,14 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
        dn->data = pdn;
        pdn->node = dn;
        pdn->phb = phb;
-       regs = (u32 *)get_property(dn, "reg", NULL);
+       regs = get_property(dn, "reg", NULL);
        if (regs) {
                /* First register entry is addr (00BBSS00)  */
                pdn->busno = (regs[0] >> 16) & 0xff;
                pdn->devfn = (regs[0] >> 8) & 0xff;
        }
        if (firmware_has_feature(FW_FEATURE_ISERIES)) {
-               u32 *busp = (u32 *)get_property(dn, "linux,subbus", NULL);
+               const u32 *busp = get_property(dn, "linux,subbus", NULL);
                if (busp)
                        pdn->bussubno = *busp;
        }
@@ -96,10 +96,11 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
 
        /* We started with a phb, iterate all childs */
        for (dn = start->child; dn; dn = nextdn) {
-               u32 *classp, class;
+               const u32 *classp;
+               u32 class;
 
                nextdn = NULL;
-               classp = (u32 *)get_property(dn, "class-code", NULL);
+               classp = get_property(dn, "class-code", NULL);
                class = classp ? *classp : 0;
 
                if (pre && ((ret = pre(dn, data)) != NULL))
index a1787ff..bf2005b 100644 (file)
@@ -942,11 +942,11 @@ void __init early_init_devtree(void *params)
 int
 prom_n_addr_cells(struct device_node* np)
 {
-       int* ip;
+       const int *ip;
        do {
                if (np->parent)
                        np = np->parent;
-               ip = (int *) get_property(np, "#address-cells", NULL);
+               ip = get_property(np, "#address-cells", NULL);
                if (ip != NULL)
                        return *ip;
        } while (np->parent);
@@ -958,11 +958,11 @@ EXPORT_SYMBOL(prom_n_addr_cells);
 int
 prom_n_size_cells(struct device_node* np)
 {
-       int* ip;
+       const int* ip;
        do {
                if (np->parent)
                        np = np->parent;
-               ip = (int *) get_property(np, "#size-cells", NULL);
+               ip = get_property(np, "#size-cells", NULL);
                if (ip != NULL)
                        return *ip;
        } while (np->parent);
@@ -1034,7 +1034,7 @@ int device_is_compatible(struct device_node *device, const char *compat)
        const char* cp;
        int cplen, l;
 
-       cp = (char *) get_property(device, "compatible", &cplen);
+       cp = get_property(device, "compatible", &cplen);
        if (cp == NULL)
                return 0;
        while (cplen > 0) {
@@ -1449,7 +1449,7 @@ static int of_finish_dynamic_node(struct device_node *node)
 {
        struct device_node *parent = of_get_parent(node);
        int err = 0;
-       phandle *ibm_phandle;
+       const phandle *ibm_phandle;
 
        node->name = get_property(node, "name", NULL);
        node->type = get_property(node, "device_type", NULL);
@@ -1466,8 +1466,7 @@ static int of_finish_dynamic_node(struct device_node *node)
                return -ENODEV;
 
        /* fix up new node's linux_phandle field */
-       if ((ibm_phandle = (unsigned int *)get_property(node,
-                                                       "ibm,phandle", NULL)))
+       if ((ibm_phandle = get_property(node, "ibm,phandle", NULL)))
                node->linux_phandle = *ibm_phandle;
 
 out:
@@ -1528,7 +1527,7 @@ struct property *of_find_property(struct device_node *np, const char *name,
  * Find a property with a given name for a given node
  * and return the value.
  */
-void *get_property(struct device_node *np, const char *name, int *lenp)
+const void *get_property(struct device_node *np, const char *name, int *lenp)
 {
        struct property *pp = of_find_property(np,name,lenp);
        return pp ? pp->value : NULL;
@@ -1658,16 +1657,16 @@ struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
        hardid = get_hard_smp_processor_id(cpu);
 
        for_each_node_by_type(np, "cpu") {
-               u32 *intserv;
+               const u32 *intserv;
                unsigned int plen, t;
 
                /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist
                 * fallback to "reg" property and assume no threads
                 */
-               intserv = (u32 *)get_property(np, "ibm,ppc-interrupt-server#s",
-                                             &plen);
+               intserv = get_property(np, "ibm,ppc-interrupt-server#s",
+                               &plen);
                if (intserv == NULL) {
-                       u32 *reg = (u32 *)get_property(np, "reg", NULL);
+                       const u32 *reg = get_property(np, "reg", NULL);
                        if (reg == NULL)
                                continue;
                        if (*reg == hardid) {
index 4394e54..b917616 100644 (file)
@@ -2033,16 +2033,22 @@ static void __init fixup_device_tree_maple(void)
 #endif
 
 #ifdef CONFIG_PPC_CHRP
-/* Pegasos lacks the "ranges" property in the isa node */
+/* Pegasos and BriQ lacks the "ranges" property in the isa node */
 static void __init fixup_device_tree_chrp(void)
 {
        phandle isa;
        u32 isa_ranges[6];
+       u32 rloc = 0x01006000; /* IO space; PCI device = 12 */
        char *name;
        int rc;
 
        name = "/pci@80000000/isa@c";
        isa = call_prom("finddevice", 1, 1, ADDR(name));
+       if (!PHANDLE_VALID(isa)) {
+               name = "/pci@ff500000/isa@6";
+               isa = call_prom("finddevice", 1, 1, ADDR(name));
+               rloc = 0x01003000; /* IO space; PCI device = 6 */
+       }
        if (!PHANDLE_VALID(isa))
                return;
 
@@ -2054,7 +2060,7 @@ static void __init fixup_device_tree_chrp(void)
 
        isa_ranges[0] = 0x1;
        isa_ranges[1] = 0x0;
-       isa_ranges[2] = 0x01006000;
+       isa_ranges[2] = rloc;
        isa_ranges[3] = 0x0;
        isa_ranges[4] = 0x0;
        isa_ranges[5] = 0x00010000;
index a10825a..603dff3 100644 (file)
@@ -27,7 +27,7 @@
 
 /* Debug utility */
 #ifdef DEBUG
-static void of_dump_addr(const char *s, u32 *addr, int na)
+static void of_dump_addr(const char *s, const u32 *addr, int na)
 {
        printk("%s", s);
        while(na--)
@@ -35,7 +35,7 @@ static void of_dump_addr(const char *s, u32 *addr, int na)
        printk("\n");
 }
 #else
-static void of_dump_addr(const char *s, u32 *addr, int na) { }
+static void of_dump_addr(const char *s, const u32 *addr, int na) { }
 #endif
 
 
@@ -46,9 +46,10 @@ struct of_bus {
        int             (*match)(struct device_node *parent);
        void            (*count_cells)(struct device_node *child,
                                       int *addrc, int *sizec);
-       u64             (*map)(u32 *addr, u32 *range, int na, int ns, int pna);
+       u64             (*map)(u32 *addr, const u32 *range,
+                               int na, int ns, int pna);
        int             (*translate)(u32 *addr, u64 offset, int na);
-       unsigned int    (*get_flags)(u32 *addr);
+       unsigned int    (*get_flags)(const u32 *addr);
 };
 
 
@@ -65,7 +66,8 @@ static void of_bus_default_count_cells(struct device_node *dev,
                *sizec = prom_n_size_cells(dev);
 }
 
-static u64 of_bus_default_map(u32 *addr, u32 *range, int na, int ns, int pna)
+static u64 of_bus_default_map(u32 *addr, const u32 *range,
+               int na, int ns, int pna)
 {
        u64 cp, s, da;
 
@@ -93,7 +95,7 @@ static int of_bus_default_translate(u32 *addr, u64 offset, int na)
        return 0;
 }
 
-static unsigned int of_bus_default_get_flags(u32 *addr)
+static unsigned int of_bus_default_get_flags(const u32 *addr)
 {
        return IORESOURCE_MEM;
 }
@@ -118,7 +120,7 @@ static void of_bus_pci_count_cells(struct device_node *np,
                *sizec = 2;
 }
 
-static u64 of_bus_pci_map(u32 *addr, u32 *range, int na, int ns, int pna)
+static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
 {
        u64 cp, s, da;
 
@@ -143,7 +145,7 @@ static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
        return of_bus_default_translate(addr + 1, offset, na - 1);
 }
 
-static unsigned int of_bus_pci_get_flags(u32 *addr)
+static unsigned int of_bus_pci_get_flags(const u32 *addr)
 {
        unsigned int flags = 0;
        u32 w = addr[0];
@@ -178,7 +180,7 @@ static void of_bus_isa_count_cells(struct device_node *child,
                *sizec = 1;
 }
 
-static u64 of_bus_isa_map(u32 *addr, u32 *range, int na, int ns, int pna)
+static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna)
 {
        u64 cp, s, da;
 
@@ -203,7 +205,7 @@ static int of_bus_isa_translate(u32 *addr, u64 offset, int na)
        return of_bus_default_translate(addr + 1, offset, na - 1);
 }
 
-static unsigned int of_bus_isa_get_flags(u32 *addr)
+static unsigned int of_bus_isa_get_flags(const u32 *addr)
 {
        unsigned int flags = 0;
        u32 w = addr[0];
@@ -268,7 +270,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
                            struct of_bus *pbus, u32 *addr,
                            int na, int ns, int pna)
 {
-       u32 *ranges;
+       const u32 *ranges;
        unsigned int rlen;
        int rone;
        u64 offset = OF_BAD_ADDR;
@@ -285,7 +287,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
         * to translate addresses that aren't supposed to be translated in
         * the first place. --BenH.
         */
-       ranges = (u32 *)get_property(parent, "ranges", &rlen);
+       ranges = get_property(parent, "ranges", &rlen);
        if (ranges == NULL || rlen == 0) {
                offset = of_read_number(addr, na);
                memset(addr, 0, pna * 4);
@@ -328,7 +330,7 @@ static int of_translate_one(struct device_node *parent, struct of_bus *bus,
  * that can be mapped to a cpu physical address). This is not really specified
  * that way, but this is traditionally the way IBM at least do things
  */
-u64 of_translate_address(struct device_node *dev, u32 *in_addr)
+u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
 {
        struct device_node *parent = NULL;
        struct of_bus *bus, *pbus;
@@ -405,10 +407,10 @@ u64 of_translate_address(struct device_node *dev, u32 *in_addr)
 }
 EXPORT_SYMBOL(of_translate_address);
 
-u32 *of_get_address(struct device_node *dev, int index, u64 *size,
+const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
                    unsigned int *flags)
 {
-       u32 *prop;
+       const u32 *prop;
        unsigned int psize;
        struct device_node *parent;
        struct of_bus *bus;
@@ -425,7 +427,7 @@ u32 *of_get_address(struct device_node *dev, int index, u64 *size,
                return NULL;
 
        /* Get "reg" or "assigned-addresses" property */
-       prop = (u32 *)get_property(dev, bus->addresses, &psize);
+       prop = get_property(dev, bus->addresses, &psize);
        if (prop == NULL)
                return NULL;
        psize /= 4;
@@ -443,10 +445,10 @@ u32 *of_get_address(struct device_node *dev, int index, u64 *size,
 }
 EXPORT_SYMBOL(of_get_address);
 
-u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
+const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
                        unsigned int *flags)
 {
-       u32 *prop;
+       const u32 *prop;
        unsigned int psize;
        struct device_node *parent;
        struct of_bus *bus;
@@ -467,7 +469,7 @@ u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
                return NULL;
 
        /* Get "reg" or "assigned-addresses" property */
-       prop = (u32 *)get_property(dev, bus->addresses, &psize);
+       prop = get_property(dev, bus->addresses, &psize);
        if (prop == NULL)
                return NULL;
        psize /= 4;
@@ -485,7 +487,7 @@ u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
 }
 EXPORT_SYMBOL(of_get_pci_address);
 
-static int __of_address_to_resource(struct device_node *dev, u32 *addrp,
+static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
                                    u64 size, unsigned int flags,
                                    struct resource *r)
 {
@@ -516,7 +518,7 @@ static int __of_address_to_resource(struct device_node *dev, u32 *addrp,
 int of_address_to_resource(struct device_node *dev, int index,
                           struct resource *r)
 {
-       u32             *addrp;
+       const u32       *addrp;
        u64             size;
        unsigned int    flags;
 
@@ -530,7 +532,7 @@ EXPORT_SYMBOL_GPL(of_address_to_resource);
 int of_pci_address_to_resource(struct device_node *dev, int bar,
                               struct resource *r)
 {
-       u32             *addrp;
+       const u32       *addrp;
        u64             size;
        unsigned int    flags;
 
@@ -541,13 +543,14 @@ int of_pci_address_to_resource(struct device_node *dev, int bar,
 }
 EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
 
-void of_parse_dma_window(struct device_node *dn, unsigned char *dma_window_prop,
+void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
                unsigned long *busno, unsigned long *phys, unsigned long *size)
 {
-       u32 *dma_window, cells;
-       unsigned char *prop;
+       const u32 *dma_window;
+       u32 cells;
+       const unsigned char *prop;
 
-       dma_window = (u32 *)dma_window_prop;
+       dma_window = dma_window_prop;
 
        /* busno is always one cell */
        *busno = *(dma_window++);
@@ -576,13 +579,13 @@ static struct device_node *of_irq_dflt_pic;
 static struct device_node *of_irq_find_parent(struct device_node *child)
 {
        struct device_node *p;
-       phandle *parp;
+       const phandle *parp;
 
        if (!of_node_get(child))
                return NULL;
 
        do {
-               parp = (phandle *)get_property(child, "interrupt-parent", NULL);
+               parp = get_property(child, "interrupt-parent", NULL);
                if (parp == NULL)
                        p = of_get_parent(child);
                else {
@@ -639,11 +642,11 @@ void of_irq_map_init(unsigned int flags)
 
 }
 
-int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 ointsize,
-                  u32 *addr, struct of_irq *out_irq)
+int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize,
+               const u32 *addr, struct of_irq *out_irq)
 {
        struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
-       u32 *tmp, *imap, *imask;
+       const u32 *tmp, *imap, *imask;
        u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
        int imaplen, match, i;
 
@@ -657,7 +660,7 @@ int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 ointsize,
         * is none, we are nice and just walk up the tree
         */
        do {
-               tmp = (u32 *)get_property(ipar, "#interrupt-cells", NULL);
+               tmp = get_property(ipar, "#interrupt-cells", NULL);
                if (tmp != NULL) {
                        intsize = *tmp;
                        break;
@@ -681,7 +684,7 @@ int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 ointsize,
         */
        old = of_node_get(ipar);
        do {
-               tmp = (u32 *)get_property(old, "#address-cells", NULL);
+               tmp = get_property(old, "#address-cells", NULL);
                tnode = of_get_parent(old);
                of_node_put(old);
                old = tnode;
@@ -708,7 +711,7 @@ int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 ointsize,
                }
 
                /* Now look for an interrupt-map */
-               imap = (u32 *)get_property(ipar, "interrupt-map", &imaplen);
+               imap = get_property(ipar, "interrupt-map", &imaplen);
                /* No interrupt map, check for an interrupt parent */
                if (imap == NULL) {
                        DBG(" -> no map, getting parent\n");
@@ -718,7 +721,7 @@ int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 ointsize,
                imaplen /= sizeof(u32);
 
                /* Look for a mask */
-               imask = (u32 *)get_property(ipar, "interrupt-map-mask", NULL);
+               imask = get_property(ipar, "interrupt-map-mask", NULL);
 
                /* If we were passed no "reg" property and we attempt to parse
                 * an interrupt-map, then #address-cells must be 0.
@@ -765,14 +768,14 @@ int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 ointsize,
                        /* Get #interrupt-cells and #address-cells of new
                         * parent
                         */
-                       tmp = (u32 *)get_property(newpar, "#interrupt-cells",
+                       tmp = get_property(newpar, "#interrupt-cells",
                                                  NULL);
                        if (tmp == NULL) {
                                DBG(" -> parent lacks #interrupt-cells !\n");
                                goto fail;
                        }
                        newintsize = *tmp;
-                       tmp = (u32 *)get_property(newpar, "#address-cells",
+                       tmp = get_property(newpar, "#address-cells",
                                                  NULL);
                        newaddrsize = (tmp == NULL) ? 0 : *tmp;
 
@@ -818,14 +821,14 @@ EXPORT_SYMBOL_GPL(of_irq_map_raw);
 static int of_irq_map_oldworld(struct device_node *device, int index,
                               struct of_irq *out_irq)
 {
-       u32 *ints;
+       const u32 *ints;
        int intlen;
 
        /*
         * Old machines just have a list of interrupt numbers
         * and no interrupt-controller nodes.
         */
-       ints = (u32 *) get_property(device, "AAPL,interrupts", &intlen);
+       ints = get_property(device, "AAPL,interrupts", &intlen);
        if (ints == NULL)
                return -EINVAL;
        intlen /= sizeof(u32);
@@ -850,7 +853,8 @@ static int of_irq_map_oldworld(struct device_node *device, int index,
 int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq)
 {
        struct device_node *p;
-       u32 *intspec, *tmp, intsize, intlen, *addr;
+       const u32 *intspec, *tmp, *addr;
+       u32 intsize, intlen;
        int res;
 
        DBG("of_irq_map_one: dev=%s, index=%d\n", device->full_name, index);
@@ -860,13 +864,13 @@ int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq
                return of_irq_map_oldworld(device, index, out_irq);
 
        /* Get the interrupts property */
-       intspec = (u32 *)get_property(device, "interrupts", &intlen);
+       intspec = get_property(device, "interrupts", &intlen);
        if (intspec == NULL)
                return -EINVAL;
        intlen /= sizeof(u32);
 
        /* Get the reg property (if any) */
-       addr = (u32 *)get_property(device, "reg", NULL);
+       addr = get_property(device, "reg", NULL);
 
        /* Look for the interrupt parent. */
        p = of_irq_find_parent(device);
@@ -874,7 +878,7 @@ int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq
                return -EINVAL;
 
        /* Get size of interrupt specifier */
-       tmp = (u32 *)get_property(p, "#interrupt-cells", NULL);
+       tmp = get_property(p, "#interrupt-cells", NULL);
        if (tmp == NULL) {
                of_node_put(p);
                return -EINVAL;
index 9c9ad1f..2fe82ab 100644 (file)
@@ -246,12 +246,12 @@ struct file_operations ppc_rtas_rmo_buf_ops = {
 
 static int ppc_rtas_find_all_sensors(void);
 static void ppc_rtas_process_sensor(struct seq_file *m,
-       struct individual_sensor *s, int state, int error, char *loc);
+       struct individual_sensor *s, int state, int error, const char *loc);
 static char *ppc_rtas_process_error(int error);
 static void get_location_code(struct seq_file *m,
-       struct individual_sensor *s, char *loc);
-static void check_location_string(struct seq_file *m, char *c);
-static void check_location(struct seq_file *m, char *c);
+       struct individual_sensor *s, const char *loc);
+static void check_location_string(struct seq_file *m, const char *c);
+static void check_location(struct seq_file *m, const char *c);
 
 static int __init proc_rtas_init(void)
 {
@@ -446,11 +446,11 @@ static int ppc_rtas_sensors_show(struct seq_file *m, void *v)
        for (i=0; i<sensors.quant; i++) {
                struct individual_sensor *p = &sensors.sensor[i];
                char rstr[64];
-               char *loc;
+               const char *loc;
                int llen, offs;
 
                sprintf (rstr, SENSOR_PREFIX"%04d", p->token);
-               loc = (char *) get_property(rtas_node, rstr, &llen);
+               loc = get_property(rtas_node, rstr, &llen);
 
                /* A sensor may have multiple instances */
                for (j = 0, offs = 0; j <= p->quant; j++) {
@@ -474,10 +474,10 @@ static int ppc_rtas_sensors_show(struct seq_file *m, void *v)
 
 static int ppc_rtas_find_all_sensors(void)
 {
-       unsigned int *utmp;
+       const unsigned int *utmp;
        int len, i;
 
-       utmp = (unsigned int *) get_property(rtas_node, "rtas-sensors", &len);
+       utmp = get_property(rtas_node, "rtas-sensors", &len);
        if (utmp == NULL) {
                printk (KERN_ERR "error: could not get rtas-sensors\n");
                return 1;
@@ -530,7 +530,7 @@ static char *ppc_rtas_process_error(int error)
  */
 
 static void ppc_rtas_process_sensor(struct seq_file *m,
-       struct individual_sensor *s, int state, int error, char *loc)
+       struct individual_sensor *s, int state, int error, const char *loc)
 {
        /* Defined return vales */
        const char * key_switch[]        = { "Off\t", "Normal\t", "Secure\t", 
@@ -682,7 +682,7 @@ static void ppc_rtas_process_sensor(struct seq_file *m,
 
 /* ****************************************************************** */
 
-static void check_location(struct seq_file *m, char *c)
+static void check_location(struct seq_file *m, const char *c)
 {
        switch (c[0]) {
                case LOC_PLANAR:
@@ -719,7 +719,7 @@ static void check_location(struct seq_file *m, char *c)
  * ${LETTER}${NUMBER}[[-/]${LETTER}${NUMBER} [ ... ] ]
  * the '.' may be an abbrevation
  */
-static void check_location_string(struct seq_file *m, char *c)
+static void check_location_string(struct seq_file *m, const char *c)
 {
        while (*c) {
                if (isalpha(*c) || *c == '.')
@@ -733,7 +733,8 @@ static void check_location_string(struct seq_file *m, char *c)
 
 /* ****************************************************************** */
 
-static void get_location_code(struct seq_file *m, struct individual_sensor *s, char *loc)
+static void get_location_code(struct seq_file *m, struct individual_sensor *s,
+               const char *loc)
 {
        if (!loc || !*loc) {
                seq_printf(m, "---");/* does not have a location */
index 77f1e06..6ef80d4 100644 (file)
@@ -177,10 +177,12 @@ void __init udbg_init_rtas_console(void)
 void rtas_progress(char *s, unsigned short hex)
 {
        struct device_node *root;
-       int width, *p;
+       int width;
+       const int *p;
        char *os;
        static int display_character, set_indicator;
-       static int display_width, display_lines, *row_width, form_feed;
+       static int display_width, display_lines, form_feed;
+       const static int *row_width;
        static DEFINE_SPINLOCK(progress_lock);
        static int current_line;
        static int pending_newline = 0;  /* did last write end with unprinted newline? */
@@ -191,16 +193,16 @@ void rtas_progress(char *s, unsigned short hex)
        if (display_width == 0) {
                display_width = 0x10;
                if ((root = find_path_device("/rtas"))) {
-                       if ((p = (unsigned int *)get_property(root,
+                       if ((p = get_property(root,
                                        "ibm,display-line-length", NULL)))
                                display_width = *p;
-                       if ((p = (unsigned int *)get_property(root,
+                       if ((p = get_property(root,
                                        "ibm,form-feed", NULL)))
                                form_feed = *p;
-                       if ((p = (unsigned int *)get_property(root,
+                       if ((p = get_property(root,
                                        "ibm,display-number-of-lines", NULL)))
                                display_lines = *p;
-                       row_width = (unsigned int *)get_property(root,
+                       row_width = get_property(root,
                                        "ibm,display-truncation-length", NULL);
                }
                display_character = rtas_token("display-character");
@@ -293,10 +295,10 @@ EXPORT_SYMBOL(rtas_progress);             /* needed by rtas_flash module */
 
 int rtas_token(const char *service)
 {
-       int *tokp;
+       const int *tokp;
        if (rtas.dev == NULL)
                return RTAS_UNKNOWN_SERVICE;
-       tokp = (int *) get_property(rtas.dev, service, NULL);
+       tokp = get_property(rtas.dev, service, NULL);
        return tokp ? *tokp : RTAS_UNKNOWN_SERVICE;
 }
 EXPORT_SYMBOL(rtas_token);
@@ -626,6 +628,9 @@ void rtas_os_term(char *str)
 {
        int status;
 
+       if (panic_timeout)
+               return;
+
        if (RTAS_UNKNOWN_SERVICE == rtas_token("ibm,os-term"))
                return;
 
@@ -687,15 +692,14 @@ static int rtas_ibm_suspend_me(struct rtas_args *args)
        int i;
        long state;
        long rc;
-       unsigned long dummy;
-
+       unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
        struct rtas_suspend_me_data data;
 
        /* Make sure the state is valid */
-       rc = plpar_hcall(H_VASI_STATE,
-                        ((u64)args->args[0] << 32) | args->args[1],
-                        0, 0, 0,
-                        &state, &dummy, &dummy);
+       rc = plpar_hcall(H_VASI_STATE, retbuf,
+                        ((u64)args->args[0] << 32) | args->args[1]);
+
+       state = retbuf[0];
 
        if (rc) {
                printk(KERN_ERR "rtas_ibm_suspend_me: vasi_state returned %ld\n",rc);
@@ -845,15 +849,15 @@ void __init rtas_initialize(void)
         */
        rtas.dev = of_find_node_by_name(NULL, "rtas");
        if (rtas.dev) {
-               u32 *basep, *entryp;
-               u32 *sizep;
+               const u32 *basep, *entryp, *sizep;
 
-               basep = (u32 *)get_property(rtas.dev, "linux,rtas-base", NULL);
-               sizep = (u32 *)get_property(rtas.dev, "rtas-size", NULL);
+               basep = get_property(rtas.dev, "linux,rtas-base", NULL);
+               sizep = get_property(rtas.dev, "rtas-size", NULL);
                if (basep != NULL && sizep != NULL) {
                        rtas.base = *basep;
                        rtas.size = *sizep;
-                       entryp = (u32 *)get_property(rtas.dev, "linux,rtas-entry", NULL);
+                       entryp = get_property(rtas.dev,
+                                       "linux,rtas-entry", NULL);
                        if (entryp == NULL) /* Ugh */
                                rtas.entry = rtas.base;
                        else
@@ -909,6 +913,11 @@ int __init early_init_dt_scan_rtas(unsigned long node,
        basep = of_get_flat_dt_prop(node, "get-term-char", NULL);
        if (basep)
                rtas_getchar_token = *basep;
+
+       if (rtas_putchar_token != RTAS_UNKNOWN_SERVICE &&
+           rtas_getchar_token != RTAS_UNKNOWN_SERVICE)
+               udbg_init_rtas_console();
+
 #endif
 
        /* break now */
index cda0226..b4a0de7 100644 (file)
@@ -57,7 +57,7 @@ static inline int config_access_valid(struct pci_dn *dn, int where)
 
 static int of_device_available(struct device_node * dn)
 {
-        char * status;
+        const char *status;
 
         status = get_property(dn, "status", NULL);
 
@@ -81,8 +81,7 @@ int rtas_read_config(struct pci_dn *pdn, int where, int size, u32 *val)
        if (!config_access_valid(pdn, where))
                return PCIBIOS_BAD_REGISTER_NUMBER;
 
-       addr = ((where & 0xf00) << 20) | (pdn->busno << 16) |
-               (pdn->devfn << 8) | (where & 0xff);
+       addr = rtas_config_addr(pdn->busno, pdn->devfn, where);
        buid = pdn->phb->buid;
        if (buid) {
                ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval,
@@ -134,8 +133,7 @@ int rtas_write_config(struct pci_dn *pdn, int where, int size, u32 val)
        if (!config_access_valid(pdn, where))
                return PCIBIOS_BAD_REGISTER_NUMBER;
 
-       addr = ((where & 0xf00) << 20) | (pdn->busno << 16) |
-               (pdn->devfn << 8) | (where & 0xff);
+       addr = rtas_config_addr(pdn->busno, pdn->devfn, where);
        buid = pdn->phb->buid;
        if (buid) {
                ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr,
@@ -178,7 +176,7 @@ struct pci_ops rtas_pci_ops = {
 
 int is_python(struct device_node *dev)
 {
-       char *model = (char *)get_property(dev, "model", NULL);
+       const char *model = get_property(dev, "model", NULL);
 
        if (model && strstr(model, "Python"))
                return 1;
@@ -234,7 +232,7 @@ void __init init_pci_config_tokens (void)
 unsigned long __devinit get_phb_buid (struct device_node *phb)
 {
        int addr_cells;
-       unsigned int *buid_vals;
+       const unsigned int *buid_vals;
        unsigned int len;
        unsigned long buid;
 
@@ -247,7 +245,7 @@ unsigned long __devinit get_phb_buid (struct device_node *phb)
        if (phb->parent->parent)
                return 0;
 
-       buid_vals = (unsigned int *) get_property(phb, "reg", &len);
+       buid_vals = get_property(phb, "reg", &len);
        if (buid_vals == NULL)
                return 0;
 
@@ -264,10 +262,10 @@ unsigned long __devinit get_phb_buid (struct device_node *phb)
 static int phb_set_bus_ranges(struct device_node *dev,
                              struct pci_controller *phb)
 {
-       int *bus_range;
+       const int *bus_range;
        unsigned int len;
 
-       bus_range = (int *) get_property(dev, "bus-range", &len);
+       bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                return 1;
        }
@@ -325,15 +323,15 @@ unsigned long __init find_and_init_phbs(void)
         * in chosen.
         */
        if (of_chosen) {
-               int *prop;
+               const int *prop;
 
-               prop = (int *)get_property(of_chosen, "linux,pci-probe-only",
-                                          NULL);
+               prop = get_property(of_chosen,
+                               "linux,pci-probe-only", NULL);
                if (prop)
                        pci_probe_only = *prop;
 
-               prop = (int *)get_property(of_chosen,
-                                          "linux,pci-assign-all-buses", NULL);
+               prop = get_property(of_chosen,
+                               "linux,pci-assign-all-buses", NULL);
                if (prop)
                        pci_assign_all_buses = *prop;
        }
index 499c386..d57930d 100644 (file)
@@ -304,16 +304,15 @@ struct seq_operations cpuinfo_op = {
 void __init check_for_initrd(void)
 {
 #ifdef CONFIG_BLK_DEV_INITRD
-       unsigned long *prop;
+       const unsigned long *prop;
 
        DBG(" -> check_for_initrd()\n");
 
        if (of_chosen) {
-               prop = (unsigned long *)get_property(of_chosen,
-                               "linux,initrd-start", NULL);
+               prop = get_property(of_chosen, "linux,initrd-start", NULL);
                if (prop != NULL) {
                        initrd_start = (unsigned long)__va(*prop);
-                       prop = (unsigned long *)get_property(of_chosen,
+                       prop = get_property(of_chosen,
                                        "linux,initrd-end", NULL);
                        if (prop != NULL) {
                                initrd_end = (unsigned long)__va(*prop);
@@ -366,15 +365,14 @@ void __init smp_setup_cpu_maps(void)
        int cpu = 0;
 
        while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
-               int *intserv;
+               const int *intserv;
                int j, len = sizeof(u32), nthreads = 1;
 
-               intserv = (int *)get_property(dn, "ibm,ppc-interrupt-server#s",
-                                             &len);
+               intserv = get_property(dn, "ibm,ppc-interrupt-server#s", &len);
                if (intserv)
                        nthreads = len / sizeof(int);
                else {
-                       intserv = (int *) get_property(dn, "reg", NULL);
+                       intserv = get_property(dn, "reg", NULL);
                        if (!intserv)
                                intserv = &cpu; /* assume logical == phys */
                }
@@ -395,13 +393,12 @@ void __init smp_setup_cpu_maps(void)
        if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) &&
            (dn = of_find_node_by_path("/rtas"))) {
                int num_addr_cell, num_size_cell, maxcpus;
-               unsigned int *ireg;
+               const unsigned int *ireg;
 
                num_addr_cell = prom_n_addr_cells(dn);
                num_size_cell = prom_n_size_cells(dn);
 
-               ireg = (unsigned int *)
-                       get_property(dn, "ibm,lrdr-capacity", NULL);
+               ireg = get_property(dn, "ibm,lrdr-capacity", NULL);
 
                if (!ireg)
                        goto out;
index fd1785e..77efe19 100644 (file)
@@ -56,7 +56,6 @@
 #include <asm/page.h>
 #include <asm/mmu.h>
 #include <asm/lmb.h>
-#include <asm/iseries/it_lp_naca.h>
 #include <asm/firmware.h>
 #include <asm/xmon.h>
 #include <asm/udbg.h>
@@ -107,7 +106,7 @@ static int smt_enabled_cmdline;
 static void check_smt_enabled(void)
 {
        struct device_node *dn;
-       char *smt_option;
+       const char *smt_option;
 
        /* Allow the command line to overrule the OF option */
        if (smt_enabled_cmdline)
@@ -116,7 +115,7 @@ static void check_smt_enabled(void)
        dn = of_find_node_by_path("/options");
 
        if (dn) {
-               smt_option = (char *)get_property(dn, "ibm,smt-enabled", NULL);
+               smt_option = get_property(dn, "ibm,smt-enabled", NULL);
 
                 if (smt_option) {
                        if (!strcmp(smt_option, "on"))
@@ -293,7 +292,7 @@ static void __init initialize_cache_info(void)
                 */
 
                if ( num_cpus == 1 ) {
-                       u32 *sizep, *lsizep;
+                       const u32 *sizep, *lsizep;
                        u32 size, lsize;
                        const char *dc, *ic;
 
@@ -308,10 +307,10 @@ static void __init initialize_cache_info(void)
 
                        size = 0;
                        lsize = cur_cpu_spec->dcache_bsize;
-                       sizep = (u32 *)get_property(np, "d-cache-size", NULL);
+                       sizep = get_property(np, "d-cache-size", NULL);
                        if (sizep != NULL)
                                size = *sizep;
-                       lsizep = (u32 *) get_property(np, dc, NULL);
+                       lsizep = get_property(np, dc, NULL);
                        if (lsizep != NULL)
                                lsize = *lsizep;
                        if (sizep == 0 || lsizep == 0)
@@ -325,10 +324,10 @@ static void __init initialize_cache_info(void)
 
                        size = 0;
                        lsize = cur_cpu_spec->icache_bsize;
-                       sizep = (u32 *)get_property(np, "i-cache-size", NULL);
+                       sizep = get_property(np, "i-cache-size", NULL);
                        if (sizep != NULL)
                                size = *sizep;
-                       lsizep = (u32 *)get_property(np, ic, NULL);
+                       lsizep = get_property(np, ic, NULL);
                        if (lsizep != NULL)
                                lsize = *lsizep;
                        if (sizep == 0 || lsizep == 0)
index fec228c..406f308 100644 (file)
@@ -60,7 +60,7 @@ static int smt_snooze_cmdline;
 static int __init smt_setup(void)
 {
        struct device_node *options;
-       unsigned int *val;
+       const unsigned int *val;
        unsigned int cpu;
 
        if (!cpu_has_feature(CPU_FTR_SMT))
@@ -70,8 +70,7 @@ static int __init smt_setup(void)
        if (!options)
                return -ENODEV;
 
-       val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay",
-                                          NULL);
+       val = get_property(options, "ibm,smt-snooze-delay", NULL);
        if (!smt_snooze_cmdline && val) {
                for_each_possible_cpu(cpu)
                        per_cpu(smt_snooze_delay, cpu) = *val;
@@ -231,7 +230,7 @@ static void register_cpu_online(unsigned int cpu)
        if (cur_cpu_spec->num_pmcs >= 8)
                sysdev_create_file(s, &attr_pmc8);
 
-       if (cpu_has_feature(CPU_FTR_SMT))
+       if (cpu_has_feature(CPU_FTR_PURR))
                sysdev_create_file(s, &attr_purr);
 }
 
@@ -273,7 +272,7 @@ static void unregister_cpu_online(unsigned int cpu)
        if (cur_cpu_spec->num_pmcs >= 8)
                sysdev_remove_file(s, &attr_pmc8);
 
-       if (cpu_has_feature(CPU_FTR_SMT))
+       if (cpu_has_feature(CPU_FTR_PURR))
                sysdev_remove_file(s, &attr_purr);
 }
 #endif /* CONFIG_HOTPLUG_CPU */
index a124499..b9a2061 100644 (file)
@@ -860,14 +860,14 @@ EXPORT_SYMBOL(do_settimeofday);
 static int __init get_freq(char *name, int cells, unsigned long *val)
 {
        struct device_node *cpu;
-       unsigned int *fp;
+       const unsigned int *fp;
        int found = 0;
 
        /* The cpu node should have timebase and clock frequency properties */
        cpu = of_find_node_by_type(NULL, "cpu");
 
        if (cpu) {
-               fp = (unsigned int *)get_property(cpu, name, NULL);
+               fp = get_property(cpu, name, NULL);
                if (fp) {
                        found = 1;
                        *val = 0;
index fad8580..cb87e71 100644 (file)
@@ -77,7 +77,7 @@ static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev)
        } else
 #endif
        {
-               unsigned char *dma_window;
+               const unsigned char *dma_window;
                struct iommu_table *tbl;
                unsigned long offset, size;
 
@@ -217,7 +217,7 @@ static void __devinit vio_dev_release(struct device *dev)
 struct vio_dev * __devinit vio_register_device_node(struct device_node *of_node)
 {
        struct vio_dev *viodev;
-       unsigned int *unit_address;
+       const unsigned int *unit_address;
 
        /* we need the 'device_type' property, in order to match with drivers */
        if (of_node->type == NULL) {
@@ -227,7 +227,7 @@ struct vio_dev * __devinit vio_register_device_node(struct device_node *of_node)
                return NULL;
        }
 
-       unit_address = (unsigned int *)get_property(of_node, "reg", NULL);
+       unit_address = get_property(of_node, "reg", NULL);
        if (unit_address == NULL) {
                printk(KERN_WARNING "%s: node %s missing 'reg'\n",
                                __FUNCTION__,
@@ -249,7 +249,7 @@ struct vio_dev * __devinit vio_register_device_node(struct device_node *of_node)
        viodev->type = of_node->type;
        viodev->unit_address = *unit_address;
        if (firmware_has_feature(FW_FEATURE_ISERIES)) {
-               unit_address = (unsigned int *)get_property(of_node,
+               unit_address = get_property(of_node,
                                "linux,unit_address", NULL);
                if (unit_address != NULL)
                        viodev->unit_address = *unit_address;
@@ -423,7 +423,7 @@ static int vio_hotplug(struct device *dev, char **envp, int num_envp,
 {
        const struct vio_dev *vio_dev = to_vio_dev(dev);
        struct device_node *dn = dev->platform_data;
-       char *cp;
+       const char *cp;
        int length;
 
        if (!num_envp)
@@ -431,7 +431,7 @@ static int vio_hotplug(struct device *dev, char **envp, int num_envp,
 
        if (!dn)
                return -ENODEV;
-       cp = (char *)get_property(dn, "compatible", &length);
+       cp = get_property(dn, "compatible", &length);
        if (!cp)
                return -ENODEV;
 
@@ -493,11 +493,11 @@ static struct vio_dev *vio_find_name(const char *kobj_name)
  */
 struct vio_dev *vio_find_node(struct device_node *vnode)
 {
-       uint32_t *unit_address;
+       const uint32_t *unit_address;
        char kobj_name[BUS_ID_SIZE];
 
        /* construct the kobject name from the device node */
-       unit_address = (uint32_t *)get_property(vnode, "reg", NULL);
+       unit_address = get_property(vnode, "reg", NULL);
        if (!unit_address)
                return NULL;
        snprintf(kobj_name, BUS_ID_SIZE, "%x", *unit_address);
index ff70964..336dd19 100644 (file)
@@ -14,7 +14,6 @@ endif
 obj-$(CONFIG_PPC64)    += checksum_64.o copypage_64.o copyuser_64.o \
                           memcpy_64.o usercopy_64.o mem_64.o string.o \
                           strcase.o
-obj-$(CONFIG_PPC_ISERIES) += e2a.o
 obj-$(CONFIG_XMON)     += sstep.o
 
 ifeq ($(CONFIG_PPC64),y)
diff --git a/arch/powerpc/lib/e2a.c b/arch/powerpc/lib/e2a.c
deleted file mode 100644 (file)
index 4b72ed8..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  EBCDIC to ASCII conversion
- *
- * This function moved here from arch/powerpc/platforms/iseries/viopath.c 
- *
- * (C) Copyright 2000-2004 IBM Corporation
- *
- * 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) anyu later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <linux/module.h>
-
-unsigned char e2a(unsigned char x)
-{
-       switch (x) {
-       case 0xF0:
-               return '0';
-       case 0xF1:
-               return '1';
-       case 0xF2:
-               return '2';
-       case 0xF3:
-               return '3';
-       case 0xF4:
-               return '4';
-       case 0xF5:
-               return '5';
-       case 0xF6:
-               return '6';
-       case 0xF7:
-               return '7';
-       case 0xF8:
-               return '8';
-       case 0xF9:
-               return '9';
-       case 0xC1:
-               return 'A';
-       case 0xC2:
-               return 'B';
-       case 0xC3:
-               return 'C';
-       case 0xC4:
-               return 'D';
-       case 0xC5:
-               return 'E';
-       case 0xC6:
-               return 'F';
-       case 0xC7:
-               return 'G';
-       case 0xC8:
-               return 'H';
-       case 0xC9:
-               return 'I';
-       case 0xD1:
-               return 'J';
-       case 0xD2:
-               return 'K';
-       case 0xD3:
-               return 'L';
-       case 0xD4:
-               return 'M';
-       case 0xD5:
-               return 'N';
-       case 0xD6:
-               return 'O';
-       case 0xD7:
-               return 'P';
-       case 0xD8:
-               return 'Q';
-       case 0xD9:
-               return 'R';
-       case 0xE2:
-               return 'S';
-       case 0xE3:
-               return 'T';
-       case 0xE4:
-               return 'U';
-       case 0xE5:
-               return 'V';
-       case 0xE6:
-               return 'W';
-       case 0xE7:
-               return 'X';
-       case 0xE8:
-               return 'Y';
-       case 0xE9:
-               return 'Z';
-       }
-       return ' ';
-}
-EXPORT_SYMBOL(e2a);
-
-unsigned char* strne2a(unsigned char *dest, const unsigned char *src, size_t n)
-{
-       int i;
-
-       n = strnlen(src, n);
-
-       for (i = 0; i < n; i++)
-               dest[i] = e2a(src[i]);
-
-       return dest;
-}
index fbe2393..6c0f1c7 100644 (file)
@@ -159,12 +159,12 @@ static struct device_node * __cpuinit find_cpu_node(unsigned int cpu)
 {
        unsigned int hw_cpuid = get_hard_smp_processor_id(cpu);
        struct device_node *cpu_node = NULL;
-       unsigned int *interrupt_server, *reg;
+       const unsigned int *interrupt_server, *reg;
        int len;
 
        while ((cpu_node = of_find_node_by_type(cpu_node, "cpu")) != NULL) {
                /* Try interrupt server first */
-               interrupt_server = (unsigned int *)get_property(cpu_node,
+               interrupt_server = get_property(cpu_node,
                                        "ibm,ppc-interrupt-server#s", &len);
 
                len = len / sizeof(u32);
@@ -175,8 +175,7 @@ static struct device_node * __cpuinit find_cpu_node(unsigned int cpu)
                                        return cpu_node;
                        }
                } else {
-                       reg = (unsigned int *)get_property(cpu_node,
-                                                          "reg", &len);
+                       reg = get_property(cpu_node, "reg", &len);
                        if (reg && (len > 0) && (reg[0] == hw_cpuid))
                                return cpu_node;
                }
@@ -186,9 +185,9 @@ static struct device_node * __cpuinit find_cpu_node(unsigned int cpu)
 }
 
 /* must hold reference to node during call */
-static int *of_get_associativity(struct device_node *dev)
+static const int *of_get_associativity(struct device_node *dev)
 {
-       return (unsigned int *)get_property(dev, "ibm,associativity", NULL);
+       return get_property(dev, "ibm,associativity", NULL);
 }
 
 /* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
@@ -197,7 +196,7 @@ static int *of_get_associativity(struct device_node *dev)
 static int of_node_to_nid_single(struct device_node *device)
 {
        int nid = -1;
-       unsigned int *tmp;
+       const unsigned int *tmp;
 
        if (min_common_depth == -1)
                goto out;
@@ -255,7 +254,7 @@ EXPORT_SYMBOL_GPL(of_node_to_nid);
 static int __init find_min_common_depth(void)
 {
        int depth;
-       unsigned int *ref_points;
+       const unsigned int *ref_points;
        struct device_node *rtas_root;
        unsigned int len;
 
@@ -270,7 +269,7 @@ static int __init find_min_common_depth(void)
         * configuration (should be all 0's) and the second is for a normal
         * NUMA configuration.
         */
-       ref_points = (unsigned int *)get_property(rtas_root,
+       ref_points = get_property(rtas_root,
                        "ibm,associativity-reference-points", &len);
 
        if ((len >= 1) && ref_points) {
@@ -297,7 +296,7 @@ static void __init get_n_mem_cells(int *n_addr_cells, int *n_size_cells)
        of_node_put(memory);
 }
 
-static unsigned long __devinit read_n_cells(int n, unsigned int **buf)
+static unsigned long __devinit read_n_cells(int n, const unsigned int **buf)
 {
        unsigned long result = 0;
 
@@ -435,15 +434,13 @@ static int __init parse_numa_properties(void)
                unsigned long size;
                int nid;
                int ranges;
-               unsigned int *memcell_buf;
+               const unsigned int *memcell_buf;
                unsigned int len;
 
-               memcell_buf = (unsigned int *)get_property(memory,
+               memcell_buf = get_property(memory,
                        "linux,usable-memory", &len);
                if (!memcell_buf || len <= 0)
-                       memcell_buf =
-                               (unsigned int *)get_property(memory, "reg",
-                                       &len);
+                       memcell_buf = get_property(memory, "reg", &len);
                if (!memcell_buf || len <= 0)
                        continue;
 
@@ -787,10 +784,10 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
        while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
                unsigned long start, size;
                int ranges;
-               unsigned int *memcell_buf;
+               const unsigned int *memcell_buf;
                unsigned int len;
 
-               memcell_buf = (unsigned int *)get_property(memory, "reg", &len);
+               memcell_buf = get_property(memory, "reg", &len);
                if (!memcell_buf || len <= 0)
                        continue;
 
index de0c884..d373391 100644 (file)
@@ -22,6 +22,8 @@
 #include <asm/paca.h>
 #include <asm/cputable.h>
 #include <asm/cacheflush.h>
+#include <asm/smp.h>
+#include <linux/compiler.h>
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -50,9 +52,32 @@ static inline unsigned long mk_vsid_data(unsigned long ea, unsigned long flags)
        return (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | flags;
 }
 
-static inline void create_slbe(unsigned long ea, unsigned long flags,
-                              unsigned long entry)
+static inline void slb_shadow_update(unsigned long esid, unsigned long vsid,
+                                    unsigned long entry)
 {
+       /*
+        * Clear the ESID first so the entry is not valid while we are
+        * updating it.
+        */
+       get_slb_shadow()->save_area[entry].esid = 0;
+       barrier();
+       get_slb_shadow()->save_area[entry].vsid = vsid;
+       barrier();
+       get_slb_shadow()->save_area[entry].esid = esid;
+
+}
+
+static inline void create_shadowed_slbe(unsigned long ea, unsigned long flags,
+                                       unsigned long entry)
+{
+       /*
+        * Updating the shadow buffer before writing the SLB ensures
+        * we don't get a stale entry here if we get preempted by PHYP
+        * between these two statements.
+        */
+       slb_shadow_update(mk_esid_data(ea, entry), mk_vsid_data(ea, flags),
+                         entry);
+
        asm volatile("slbmte  %0,%1" :
                     : "r" (mk_vsid_data(ea, flags)),
                       "r" (mk_esid_data(ea, entry))
@@ -77,6 +102,10 @@ void slb_flush_and_rebolt(void)
        if ((ksp_esid_data & ESID_MASK) == PAGE_OFFSET)
                ksp_esid_data &= ~SLB_ESID_V;
 
+       /* Only third entry (stack) may change here so only resave that */
+       slb_shadow_update(ksp_esid_data,
+                         mk_vsid_data(ksp_esid_data, lflags), 2);
+
        /* We need to do this all in asm, so we're sure we don't touch
         * the stack between the slbia and rebolting it. */
        asm volatile("isync\n"
@@ -209,9 +238,9 @@ void slb_initialize(void)
        asm volatile("isync":::"memory");
        asm volatile("slbmte  %0,%0"::"r" (0) : "memory");
        asm volatile("isync; slbia; isync":::"memory");
-       create_slbe(PAGE_OFFSET, lflags, 0);
+       create_shadowed_slbe(PAGE_OFFSET, lflags, 0);
 
-       create_slbe(VMALLOC_START, vflags, 1);
+       create_shadowed_slbe(VMALLOC_START, vflags, 1);
 
        /* We don't bolt the stack for the time being - we're in boot,
         * so the stack is in the bolted segment.  By the time it goes
index f6eef78..b58baa6 100644 (file)
@@ -146,6 +146,7 @@ void hpte_update(struct mm_struct *mm, unsigned long addr,
                psize = mmu_huge_psize;
 #else
                BUG();
+               psize = pte_pagesize_index(pte); /* shutup gcc */
 #endif
        } else
                psize = pte_pagesize_index(pte);
index cf3967a..969fbb6 100644 (file)
@@ -60,8 +60,8 @@ static void __init mpc834x_itx_setup_arch(void)
 
        np = of_find_node_by_type(NULL, "cpu");
        if (np != 0) {
-               unsigned int *fp =
-                   (int *)get_property(np, "clock-frequency", NULL);
+               const unsigned int *fp =
+                       get_property(np, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
index 32df239..6771961 100644 (file)
@@ -57,8 +57,8 @@ static void __init mpc834x_sys_setup_arch(void)
 
        np = of_find_node_by_type(NULL, "cpu");
        if (np != 0) {
-               unsigned int *fp =
-                   (int *)get_property(np, "clock-frequency", NULL);
+               const unsigned int *fp =
+                       get_property(np, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
index 5d84a9c..4557ac5 100644 (file)
@@ -59,7 +59,7 @@ int __init add_bridge(struct device_node *dev)
        int len;
        struct pci_controller *hose;
        struct resource rsrc;
-       int *bus_range;
+       const int *bus_range;
        int primary = 1, has_address = 0;
        phys_addr_t immr = get_immrbase();
 
@@ -69,7 +69,7 @@ int __init add_bridge(struct device_node *dev)
        has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
 
        /* Get bus range if any */
-       bus_range = (int *)get_property(dev, "bus-range", &len);
+       bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                       " bus 0\n", dev->full_name);
index 9d2acfb..cae6b73 100644 (file)
@@ -121,9 +121,9 @@ static void __init mpc85xx_ads_setup_arch(void)
 
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != 0) {
-               unsigned int *fp;
+               const unsigned int *fp;
 
-               fp = (int *)get_property(cpu, "clock-frequency", NULL);
+               fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
index 1d357d3..4c1fede 100644 (file)
@@ -241,9 +241,9 @@ mpc85xx_cds_setup_arch(void)
 
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != 0) {
-               unsigned int *fp;
+               const unsigned int *fp;
 
-               fp = (int *)get_property(cpu, "clock-frequency", NULL);
+               fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
index 1d51f32..05930ee 100644 (file)
@@ -41,7 +41,7 @@ int __init add_bridge(struct device_node *dev)
        int len;
        struct pci_controller *hose;
        struct resource rsrc;
-       int *bus_range;
+       const int *bus_range;
        int primary = 1, has_address = 0;
        phys_addr_t immr = get_immrbase();
 
@@ -51,7 +51,7 @@ int __init add_bridge(struct device_node *dev)
        has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
 
        /* Get bus range if any */
-       bus_range = (int *) get_property(dev, "bus-range", &len);
+       bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                       " bus 0\n", dev->full_name);
index 0b1b521..8e43310 100644 (file)
@@ -347,9 +347,9 @@ mpc86xx_hpcn_setup_arch(void)
 
        np = of_find_node_by_type(NULL, "cpu");
        if (np != 0) {
-               unsigned int *fp;
+               const unsigned int *fp;
 
-               fp = (int *)get_property(np, "clock-frequency", NULL);
+               fp = get_property(np, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
index a8c8f0a..481e18e 100644 (file)
@@ -153,7 +153,7 @@ int __init add_bridge(struct device_node *dev)
        int len;
        struct pci_controller *hose;
        struct resource rsrc;
-       int *bus_range;
+       const int *bus_range;
        int has_address = 0;
        int primary = 0;
 
@@ -163,7 +163,7 @@ int __init add_bridge(struct device_node *dev)
        has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
 
        /* Get bus range if any */
-       bus_range = (int *) get_property(dev, "bus-range", &len);
+       bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int))
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                       " bus 0\n", dev->full_name);
index ce696c1..3f3859d 100644 (file)
@@ -97,7 +97,7 @@ void __init cbe_regs_init(void)
                struct cbe_regs_map *map = &cbe_regs_maps[cbe_regs_map_count++];
 
                /* That hack must die die die ! */
-               struct address_prop {
+               const struct address_prop {
                        unsigned long address;
                        unsigned int len;
                } __attribute__((packed)) *prop;
@@ -114,13 +114,11 @@ void __init cbe_regs_init(void)
                        if (cbe_thread_map[i].cpu_node == cpu)
                                cbe_thread_map[i].regs = map;
 
-               prop = (struct address_prop *)get_property(cpu, "pervasive",
-                                                          NULL);
+               prop = get_property(cpu, "pervasive", NULL);
                if (prop != NULL)
                        map->pmd_regs = ioremap(prop->address, prop->len);
 
-               prop = (struct address_prop *)get_property(cpu, "iic",
-                                                          NULL);
+               prop = get_property(cpu, "iic", NULL);
                if (prop != NULL)
                        map->iic_regs = ioremap(prop->address, prop->len);
        }
index d7bbb61..6b57a47 100644 (file)
@@ -89,17 +89,17 @@ static struct irq_chip iic_chip = {
 /* Get an IRQ number from the pending state register of the IIC */
 static unsigned int iic_get_irq(struct pt_regs *regs)
 {
-       struct cbe_iic_pending_bits pending;
-       struct iic *iic;
-
-       iic = &__get_cpu_var(iic);
-       *(unsigned long *) &pending =
-               in_be64((unsigned long __iomem *) &iic->regs->pending_destr);
-       iic->eoi_stack[++iic->eoi_ptr] = pending.prio;
-       BUG_ON(iic->eoi_ptr > 15);
+       struct cbe_iic_pending_bits pending;
+       struct iic *iic;
+
+       iic = &__get_cpu_var(iic);
+       *(unsigned long *) &pending =
+               in_be64((unsigned long __iomem *) &iic->regs->pending_destr);
+       iic->eoi_stack[++iic->eoi_ptr] = pending.prio;
+       BUG_ON(iic->eoi_ptr > 15);
        if (pending.flags & CBE_IIC_IRQ_VALID)
                return irq_linear_revmap(iic->host,
-                                        iic_pending_to_hwnum(pending));
+                                        iic_pending_to_hwnum(pending));
        return NO_IRQ;
 }
 
@@ -250,16 +250,15 @@ static int __init setup_iic(void)
        struct resource r0, r1;
        struct irq_host *host;
        int found = 0;
-       u32 *np;
+       const u32 *np;
 
        for (dn = NULL;
             (dn = of_find_node_by_name(dn,"interrupt-controller")) != NULL;) {
                if (!device_is_compatible(dn,
                                     "IBM,CBEA-Internal-Interrupt-Controller"))
                        continue;
-               np = (u32 *)get_property(dn, "ibm,interrupt-server-ranges",
-                                        NULL);
-               if (np == NULL) {
+               np = get_property(dn, "ibm,interrupt-server-ranges", NULL);
+               if (np == NULL) {
                        printk(KERN_WARNING "IIC: CPU association not found\n");
                        of_node_put(dn);
                        return -ENODEV;
index a35004e..d2b20eb 100644 (file)
@@ -308,15 +308,16 @@ static void cell_do_map_iommu(struct cell_iommu *iommu,
 
 static void iommu_devnode_setup(struct device_node *d)
 {
-       unsigned int *ioid;
-       unsigned long *dma_window, map_start, map_size, token;
+       const unsigned int *ioid;
+       unsigned long map_start, map_size, token;
+       const unsigned long *dma_window;
        struct cell_iommu *iommu;
 
-       ioid = (unsigned int *)get_property(d, "ioid", NULL);
+       ioid = get_property(d, "ioid", NULL);
        if (!ioid)
                pr_debug("No ioid entry found !\n");
 
-       dma_window = (unsigned long *)get_property(d, "ibm,dma-window", NULL);
+       dma_window = get_property(d, "ibm,dma-window", NULL);
        if (!dma_window)
                pr_debug("No ibm,dma-window entry found !\n");
 
@@ -371,8 +372,9 @@ static int cell_map_iommu_hardcoded(int num_nodes)
 
 static int cell_map_iommu(void)
 {
-       unsigned int num_nodes = 0, *node_id;
-       unsigned long *base, *mmio_base;
+       unsigned int num_nodes = 0;
+       const unsigned int *node_id;
+       const unsigned long *base, *mmio_base;
        struct device_node *dn;
        struct cell_iommu *iommu = NULL;
 
@@ -381,7 +383,7 @@ static int cell_map_iommu(void)
        for(dn = of_find_node_by_type(NULL, "cpu");
            dn;
            dn = of_find_node_by_type(dn, "cpu")) {
-               node_id = (unsigned int *)get_property(dn, "node-id", NULL);
+               node_id = get_property(dn, "node-id", NULL);
 
                if (num_nodes < *node_id)
                        num_nodes = *node_id;
@@ -396,9 +398,9 @@ static int cell_map_iommu(void)
            dn;
            dn = of_find_node_by_type(dn, "cpu")) {
 
-               node_id = (unsigned int *)get_property(dn, "node-id", NULL);
-               base = (unsigned long *)get_property(dn, "ioc-cache", NULL);
-               mmio_base = (unsigned long *)get_property(dn, "ioc-translation", NULL);
+               node_id = get_property(dn, "node-id", NULL);
+               base = get_property(dn, "ioc-cache", NULL);
+               mmio_base = get_property(dn, "ioc-translation", NULL);
 
                if (!base || !mmio_base || !node_id)
                        return cell_map_iommu_hardcoded(num_nodes);
index 282987d..22c228a 100644 (file)
@@ -150,10 +150,6 @@ static int __init cell_probe(void)
            !of_flat_dt_is_compatible(root, "IBM,CPBW-1.0"))
                return 0;
 
-#ifdef CONFIG_UDBG_RTAS_CONSOLE
-       udbg_init_rtas_console();
-#endif
-
        hpte_init_native();
 
        return 1;
index 46aef06..1c0acba 100644 (file)
@@ -57,7 +57,7 @@
  */
 static cpumask_t of_spin_map;
 
-extern void pSeries_secondary_smp_init(unsigned long);
+extern void generic_secondary_smp_init(unsigned long);
 
 /**
  * smp_startup_cpu() - start the given cpu
@@ -74,7 +74,7 @@ static inline int __devinit smp_startup_cpu(unsigned int lcpu)
 {
        int status;
        unsigned long start_here = __pa((u32)*((unsigned long *)
-                                              pSeries_secondary_smp_init));
+                                              generic_secondary_smp_init));
        unsigned int pcpu;
        int start_cpu;
 
index 15217bb..742a032 100644 (file)
@@ -240,7 +240,7 @@ static void spider_irq_cascade(unsigned int irq, struct irq_desc *desc,
 static unsigned int __init spider_find_cascade_and_node(struct spider_pic *pic)
 {
        unsigned int virq;
-       u32 *imap, *tmp;
+       const u32 *imap, *tmp;
        int imaplen, intsize, unit;
        struct device_node *iic;
        struct irq_host *iic_host;
@@ -258,25 +258,25 @@ static unsigned int __init spider_find_cascade_and_node(struct spider_pic *pic)
 #endif
 
        /* Now do the horrible hacks */
-       tmp = (u32 *)get_property(pic->of_node, "#interrupt-cells", NULL);
+       tmp = get_property(pic->of_node, "#interrupt-cells", NULL);
        if (tmp == NULL)
                return NO_IRQ;
        intsize = *tmp;
-       imap = (u32 *)get_property(pic->of_node, "interrupt-map", &imaplen);
+       imap = get_property(pic->of_node, "interrupt-map", &imaplen);
        if (imap == NULL || imaplen < (intsize + 1))
                return NO_IRQ;
        iic = of_find_node_by_phandle(imap[intsize]);
        if (iic == NULL)
                return NO_IRQ;
        imap += intsize + 1;
-       tmp = (u32 *)get_property(iic, "#interrupt-cells", NULL);
+       tmp = get_property(iic, "#interrupt-cells", NULL);
        if (tmp == NULL)
                return NO_IRQ;
        intsize = *tmp;
        /* Assume unit is last entry of interrupt specifier */
        unit = imap[intsize - 1];
        /* Ok, we have a unit, now let's try to get the node */
-       tmp = (u32 *)get_property(iic, "ibm,interrupt-server-ranges", NULL);
+       tmp = get_property(iic, "ibm,interrupt-server-ranges", NULL);
        if (tmp == NULL) {
                of_node_put(iic);
                return NO_IRQ;
index d06042d..3bd36d4 100644 (file)
@@ -488,10 +488,10 @@ int spu_irq_class_1_bottom(struct spu *spu)
 
 static int __init find_spu_node_id(struct device_node *spe)
 {
-       unsigned int *id;
+       const unsigned int *id;
        struct device_node *cpu;
        cpu = spe->parent->parent;
-       id = (unsigned int *)get_property(cpu, "node-id", NULL);
+       id = get_property(cpu, "node-id", NULL);
        return id ? *id : 0;
 }
 
@@ -500,7 +500,7 @@ static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
 {
        static DEFINE_MUTEX(add_spumem_mutex);
 
-       struct address_prop {
+       const struct address_prop {
                unsigned long address;
                unsigned int len;
        } __attribute__((packed)) *p;
@@ -511,7 +511,7 @@ static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
        struct zone *zone;
        int ret;
 
-       p = (void*)get_property(spe, prop, &proplen);
+       p = get_property(spe, prop, &proplen);
        WARN_ON(proplen != sizeof (*p));
 
        start_pfn = p->address >> PAGE_SHIFT;
@@ -531,12 +531,12 @@ static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
 static void __iomem * __init map_spe_prop(struct spu *spu,
                struct device_node *n, const char *name)
 {
-       struct address_prop {
+       const struct address_prop {
                unsigned long address;
                unsigned int len;
        } __attribute__((packed)) *prop;
 
-       void *p;
+       const void *p;
        int proplen;
        void* ret = NULL;
        int err = 0;
@@ -570,14 +570,14 @@ static int __init spu_map_interrupts(struct spu *spu, struct device_node *np)
 {
        struct irq_host *host;
        unsigned int isrc;
-       u32 *tmp;
+       const u32 *tmp;
 
        host = iic_get_irq_host(spu->node);
        if (host == NULL)
                return -ENODEV;
 
        /* Get the interrupt source from the device-tree */
-       tmp = (u32 *)get_property(np, "isrc", NULL);
+       tmp = get_property(np, "isrc", NULL);
        if (!tmp)
                return -ENODEV;
        spu->isrc = isrc = tmp[0];
@@ -593,7 +593,7 @@ static int __init spu_map_interrupts(struct spu *spu, struct device_node *np)
 
 static int __init spu_map_device(struct spu *spu, struct device_node *node)
 {
-       char *prop;
+       const char *prop;
        int ret;
 
        ret = -ENODEV;
index 150f67d..0dd4a64 100644 (file)
@@ -67,13 +67,14 @@ static void chrp_nvram_write(int addr, unsigned char val)
 void __init chrp_nvram_init(void)
 {
        struct device_node *nvram;
-       unsigned int *nbytes_p, proplen;
+       const unsigned int *nbytes_p;
+       unsigned int proplen;
 
        nvram = of_find_node_by_type(NULL, "nvram");
        if (nvram == NULL)
                return;
 
-       nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen);
+       nbytes_p = get_property(nvram, "#bytes", &proplen);
        if (nbytes_p == NULL || proplen != sizeof(unsigned int))
                return;
 
index 6802cdc..0f43405 100644 (file)
@@ -214,11 +214,11 @@ void __init
 chrp_find_bridges(void)
 {
        struct device_node *dev;
-       int *bus_range;
+       const int *bus_range;
        int len, index = -1;
        struct pci_controller *hose;
-       unsigned int *dma;
-       char *model, *machine;
+       const unsigned int *dma;
+       const char *model, *machine;
        int is_longtrail = 0, is_mot = 0, is_pegasos = 0;
        struct device_node *root = find_path_device("/");
        struct resource r;
@@ -246,7 +246,7 @@ chrp_find_bridges(void)
                               dev->full_name);
                        continue;
                }
-               bus_range = (int *) get_property(dev, "bus-range", &len);
+               bus_range = get_property(dev, "bus-range", &len);
                if (bus_range == NULL || len < 2 * sizeof(int)) {
                        printk(KERN_WARNING "Can't get bus-range for %s\n",
                                dev->full_name);
@@ -257,7 +257,7 @@ chrp_find_bridges(void)
                else
                        printk(KERN_INFO "PCI buses %d..%d",
                               bus_range[0], bus_range[1]);
-               printk(" controlled by %s", dev->type);
+               printk(" controlled by %s", dev->full_name);
                if (!is_longtrail)
                        printk(" at %llx", (unsigned long long)r.start);
                printk("\n");
@@ -289,6 +289,19 @@ chrp_find_bridges(void)
                        setup_indirect_pci(hose, 0xfec00cf8, 0xfee00cfc);
                } else if (is_pegasos == 2) {
                        setup_peg2(hose, dev);
+               } else if (!strncmp(model, "IBM,CPC710", 10)) {
+                       setup_indirect_pci(hose,
+                                          r.start + 0x000f8000,
+                                          r.start + 0x000f8010);
+                       if (index == 0) {
+                               dma = get_property(dev, "system-dma-base",&len);
+                               if (dma && len >= sizeof(*dma)) {
+                                       dma = (unsigned int *)
+                                               (((unsigned long)dma) +
+                                               len - sizeof(*dma));
+                                               pci_dram_offset = *dma;
+                               }
+                       }
                } else {
                        printk("No methods for %s (model %s), using RTAS\n",
                               dev->full_name, model);
@@ -299,15 +312,35 @@ chrp_find_bridges(void)
 
                /* check the first bridge for a property that we can
                   use to set pci_dram_offset */
-               dma = (unsigned int *)
-                       get_property(dev, "ibm,dma-ranges", &len);
+               dma = get_property(dev, "ibm,dma-ranges", &len);
                if (index == 0 && dma != NULL && len >= 6 * sizeof(*dma)) {
                        pci_dram_offset = dma[2] - dma[3];
                        printk("pci_dram_offset = %lx\n", pci_dram_offset);
                }
        }
+}
+
+/* SL82C105 IDE Control/Status Register */
+#define SL82C105_IDECSR                0x40
+
+/* Fixup for Winbond ATA quirk, required for briq */
+void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
+{
+       u8 progif;
 
-       /* Do not fixup interrupts from OF tree on pegasos */
-       if (is_pegasos)
-               ppc_md.pcibios_fixup = NULL;
+       /* If non-briq machines need that fixup too, please speak up */
+       if (!machine_is(chrp) || _chrp_type != _CHRP_briq)
+               return;
+
+       if ((sl82c105->class & 5) != 5) {
+               printk("W83C553: Switching SL82C105 IDE to PCI native mode\n");
+               /* Enable SL82C105 PCI native IDE mode */
+               pci_read_config_byte(sl82c105, PCI_CLASS_PROG, &progif);
+               pci_write_config_byte(sl82c105, PCI_CLASS_PROG, progif | 0x05);
+               sl82c105->class |= 0x05;
+               /* Disable SL82C105 second port */
+               pci_write_config_word(sl82c105, SL82C105_IDECSR, 0x0003);
+       }
 }
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
+               chrp_pci_fixup_winbond_ata);
index 9c08ff3..488dbd9 100644 (file)
@@ -74,6 +74,9 @@ extern irqreturn_t xmon_irq(int, void *, struct pt_regs *);
 
 extern unsigned long loops_per_jiffy;
 
+/* To be replaced by RTAS when available */
+static unsigned int *briq_SPOR;
+
 #ifdef CONFIG_SMP
 extern struct smp_ops_t chrp_smp_ops;
 #endif
@@ -92,6 +95,15 @@ static const char *gg2_cachemodes[4] = {
        "Disabled", "Write-Through", "Copy-Back", "Transparent Mode"
 };
 
+static const char *chrp_names[] = {
+       "Unknown",
+       "","","",
+       "Motorola",
+       "IBM or Longtrail",
+       "Genesi Pegasos",
+       "Total Impact Briq"
+};
+
 void chrp_show_cpuinfo(struct seq_file *m)
 {
        int i, sdramen;
@@ -214,8 +226,7 @@ static void __init pegasos_set_l2cr(void)
        /* Enable L2 cache if needed */
        np = find_type_devices("cpu");
        if (np != NULL) {
-               unsigned int *l2cr = (unsigned int *)
-                       get_property (np, "l2cr", NULL);
+               const unsigned int *l2cr = get_property(np, "l2cr", NULL);
                if (l2cr == NULL) {
                        printk ("Pegasos l2cr : no cpu l2cr property found\n");
                        return;
@@ -229,10 +240,18 @@ static void __init pegasos_set_l2cr(void)
        }
 }
 
+static void briq_restart(char *cmd)
+{
+       local_irq_disable();
+       if (briq_SPOR)
+               out_be32(briq_SPOR, 0);
+       for(;;);
+}
+
 void __init chrp_setup_arch(void)
 {
        struct device_node *root = find_path_device ("/");
-       char *machine = NULL;
+       const char *machine = NULL;
 
        /* init to some ~sane value until calibrate_delay() runs */
        loops_per_jiffy = 50000000/HZ;
@@ -245,11 +264,16 @@ void __init chrp_setup_arch(void)
                _chrp_type = _CHRP_IBM;
        } else if (machine && strncmp(machine, "MOT", 3) == 0) {
                _chrp_type = _CHRP_Motorola;
+       } else if (machine && strncmp(machine, "TotalImpact,BRIQ-1", 18) == 0) {
+               _chrp_type = _CHRP_briq;
+               /* Map the SPOR register on briq and change the restart hook */
+               briq_SPOR = (unsigned int *)ioremap(0xff0000e8, 4);
+               ppc_md.restart = briq_restart;
        } else {
                /* Let's assume it is an IBM chrp if all else fails */
                _chrp_type = _CHRP_IBM;
        }
-       printk("chrp type = %x\n", _chrp_type);
+       printk("chrp type = %x [%s]\n", _chrp_type, chrp_names[_chrp_type]);
 
        rtas_initialize();
        if (rtas_token("display-character") >= 0)
@@ -328,7 +352,7 @@ static void __init chrp_find_openpic(void)
        struct device_node *np, *root;
        int len, i, j;
        int isu_size, idu_size;
-       unsigned int *iranges, *opprop = NULL;
+       const unsigned int *iranges, *opprop = NULL;
        int oplen = 0;
        unsigned long opaddr;
        int na = 1;
@@ -338,8 +362,7 @@ static void __init chrp_find_openpic(void)
                return;
        root = of_find_node_by_path("/");
        if (root) {
-               opprop = (unsigned int *) get_property
-                       (root, "platform-open-pic", &oplen);
+               opprop = get_property(root, "platform-open-pic", &oplen);
                na = prom_n_addr_cells(root);
        }
        if (opprop && oplen >= na * sizeof(unsigned int)) {
@@ -356,7 +379,7 @@ static void __init chrp_find_openpic(void)
 
        printk(KERN_INFO "OpenPIC at %lx\n", opaddr);
 
-       iranges = (unsigned int *) get_property(np, "interrupt-ranges", &len);
+       iranges = get_property(np, "interrupt-ranges", &len);
        if (iranges == NULL)
                len = 0;        /* non-distributed mpic */
        else
@@ -442,8 +465,8 @@ static void __init chrp_find_8259(void)
         * from anyway
         */
        for (np = find_devices("pci"); np != NULL; np = np->next) {
-               unsigned int *addrp = (unsigned int *)
-                       get_property(np, "8259-interrupt-acknowledge", NULL);
+               const unsigned int *addrp = get_property(np,
+                               "8259-interrupt-acknowledge", NULL);
 
                if (addrp == NULL)
                        continue;
@@ -502,7 +525,7 @@ void __init
 chrp_init2(void)
 {
        struct device_node *device;
-       unsigned int *p = NULL;
+       const unsigned int *p = NULL;
 
 #ifdef CONFIG_NVRAM
        chrp_nvram_init();
@@ -520,8 +543,7 @@ chrp_init2(void)
         */
        device = find_devices("rtas");
        if (device)
-               p = (unsigned int *) get_property
-                       (device, "rtas-event-scan-rate", NULL);
+               p = get_property(device, "rtas-event-scan-rate", NULL);
        if (p && *p) {
                /*
                 * Arrange to call chrp_event_scan at least *p times
index 5d393eb..e4f2b9d 100644 (file)
@@ -95,7 +95,7 @@ void mpc7448_hpc2_fixup_irq(struct pci_dev *dev)
 {
        struct pci_controller *hose;
        struct device_node *node;
-       unsigned int *interrupt;
+       const unsigned int *interrupt;
        int busnr;
        int len;
        u8 slot;
@@ -112,7 +112,7 @@ void mpc7448_hpc2_fixup_irq(struct pci_dev *dev)
        if (!node)
                printk(KERN_ERR "No pci node found\n");
 
-       interrupt = (unsigned int *) get_property(node, "interrupt-map", &len);
+       interrupt = get_property(node, "interrupt-map", &len);
        slot = find_slot_by_devfn(interrupt, dev->devfn);
        pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
        if (pin == 0 || pin > 4)
@@ -141,9 +141,9 @@ static void __init mpc7448_hpc2_setup_arch(void)
 
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != 0) {
-               unsigned int *fp;
+               const unsigned int *fp;
 
-               fp = (int *)get_property(cpu, "clock-frequency", NULL);
+               fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
index 3d957a3..887b688 100644 (file)
@@ -3,13 +3,17 @@ menu "iSeries device drivers"
        depends on PPC_ISERIES
 
 config VIOCONS
-       tristate "iSeries Virtual Console Support"
+       tristate "iSeries Virtual Console Support (Obsolete)"
+       help
+         This is the old virtual console driver for legacy iSeries.
+         You should use the iSeries Hypervisor Virtual Console
+         support instead.
 
 config VIODASD
        tristate "iSeries Virtual I/O disk support"
        help
          If you are running on an iSeries system and you want to use
-         virtual disks created and managed by OS/400, say Y.
+         virtual disks created and managed by OS/400, say Y.
 
 config VIOCD
        tristate "iSeries Virtual I/O CD support"
index d194140..e305dee 100644 (file)
@@ -1,5 +1,6 @@
 /*
- *    Copyright (c) 2005-2006 Michael Ellerman, IBM Corporation
+ *    Copyright (C) 2005-2006 Michael Ellerman, IBM Corporation
+ *    Copyright (C) 2000-2004, IBM Corporation
  *
  *    Description:
  *      This file contains all the routines to build a flattened device
 #include <asm/iseries/hv_types.h>
 #include <asm/iseries/hv_lp_config.h>
 #include <asm/iseries/hv_call_xm.h>
-#include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/udbg.h>
 
 #include "processor_vpd.h"
 #include "call_hpt.h"
 #include "call_pci.h"
 #include "pci.h"
+#include "it_exp_vpd_panel.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -76,6 +77,43 @@ static char __initdata device_type_pci[] = "pci";
 static char __initdata device_type_vdevice[] = "vdevice";
 static char __initdata device_type_vscsi[] = "vscsi";
 
+
+/* EBCDIC to ASCII conversion routines */
+
+static unsigned char __init e2a(unsigned char x)
+{
+       switch (x) {
+       case 0x81 ... 0x89:
+               return x - 0x81 + 'a';
+       case 0x91 ... 0x99:
+               return x - 0x91 + 'j';
+       case 0xA2 ... 0xA9:
+               return x - 0xA2 + 's';
+       case 0xC1 ... 0xC9:
+               return x - 0xC1 + 'A';
+       case 0xD1 ... 0xD9:
+               return x - 0xD1 + 'J';
+       case 0xE2 ... 0xE9:
+               return x - 0xE2 + 'S';
+       case 0xF0 ... 0xF9:
+               return x - 0xF0 + '0';
+       }
+       return ' ';
+}
+
+static unsigned char * __init strne2a(unsigned char *dest,
+               const unsigned char *src, size_t n)
+{
+       int i;
+
+       n = strnlen(src, n);
+
+       for (i = 0; i < n; i++)
+               dest[i] = e2a(src[i]);
+
+       return dest;
+}
+
 static struct iseries_flat_dt * __init dt_init(void)
 {
        struct iseries_flat_dt *dt;
@@ -298,7 +336,8 @@ static void __init dt_vdevices(struct iseries_flat_dt *dt)
        dt_prop_u32(dt, "#address-cells", 1);
        dt_prop_u32(dt, "#size-cells", 0);
 
-       dt_do_vdevice(dt, "vty", reg, -1, device_type_serial, NULL, 1);
+       dt_do_vdevice(dt, "vty", reg, -1, device_type_serial,
+                       "IBM,iSeries-vty", 1);
        reg++;
 
        dt_do_vdevice(dt, "v-scsi", reg, -1, device_type_vscsi,
index 663a1af..f0475f0 100644 (file)
 
 #include <linux/module.h>
 #include <asm/iseries/hv_lp_config.h>
+#include "it_lp_naca.h"
 
 HvLpIndex HvLpConfig_getLpIndex_outline(void)
 {
        return HvLpConfig_getLpIndex();
 }
 EXPORT_SYMBOL(HvLpConfig_getLpIndex_outline);
+
+HvLpIndex HvLpConfig_getLpIndex(void)
+{
+       return itLpNaca.xLpIndex;
+}
+EXPORT_SYMBOL(HvLpConfig_getLpIndex);
+
+HvLpIndex HvLpConfig_getPrimaryLpIndex(void)
+{
+       return itLpNaca.xPrimaryLpIndex;
+}
+EXPORT_SYMBOL_GPL(HvLpConfig_getPrimaryLpIndex);
index e3bd201..f4cbbcf 100644 (file)
@@ -88,6 +88,23 @@ static void tce_free_iSeries(struct iommu_table *tbl, long index, long npages)
 }
 
 /*
+ * Structure passed to HvCallXm_getTceTableParms
+ */
+struct iommu_table_cb {
+       unsigned long   itc_busno;      /* Bus number for this tce table */
+       unsigned long   itc_start;      /* Will be NULL for secondary */
+       unsigned long   itc_totalsize;  /* Size (in pages) of whole table */
+       unsigned long   itc_offset;     /* Index into real tce table of the
+                                          start of our section */
+       unsigned long   itc_size;       /* Size (in pages) of our section */
+       unsigned long   itc_index;      /* Index of this tce table */
+       unsigned short  itc_maxtables;  /* Max num of tables for partition */
+       unsigned char   itc_virtbus;    /* Flag to indicate virtual bus */
+       unsigned char   itc_slotno;     /* IOA Tce Slot Index */
+       unsigned char   itc_rsvd[4];
+};
+
+/*
  * Call Hv with the architected data structure to get TCE table info.
  * info. Put the returned data into the Linux representation of the
  * TCE table data.
@@ -162,7 +179,7 @@ void iommu_devnode_init_iSeries(struct device_node *dn)
 {
        struct iommu_table *tbl;
        struct pci_dn *pdn = PCI_DN(dn);
-       u32 *lsn = (u32 *)get_property(dn, "linux,logical-slot-number", NULL);
+       const u32 *lsn = get_property(dn, "linux,logical-slot-number", NULL);
 
        BUG_ON(lsn == NULL);
 
@@ -15,8 +15,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
-#ifndef _ASM_POWERPC_ISERIES_IT_EXT_VPD_PANEL_H
-#define _ASM_POWERPC_ISERIES_IT_EXT_VPD_PANEL_H
+#ifndef _PLATFORMS_ISERIES_IT_EXT_VPD_PANEL_H
+#define _PLATFORMS_ISERIES_IT_EXT_VPD_PANEL_H
 
 /*
  *     This struct maps the panel information
@@ -48,4 +48,4 @@ struct ItExtVpdPanel {
 
 extern struct ItExtVpdPanel    xItExtVpdPanel;
 
-#endif /* _ASM_POWERPC_ISERIES_IT_EXT_VPD_PANEL_H */
+#endif /* _PLATFORMS_ISERIES_IT_EXT_VPD_PANEL_H */
similarity index 96%
rename from include/asm-powerpc/iseries/it_lp_naca.h
rename to arch/powerpc/platforms/iseries/it_lp_naca.h
index 4fdcf05..9bbf589 100644 (file)
@@ -15,8 +15,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
-#ifndef _ASM_POWERPC_ISERIES_IT_LP_NACA_H
-#define _ASM_POWERPC_ISERIES_IT_LP_NACA_H
+#ifndef _PLATFORMS_ISERIES_IT_LP_NACA_H
+#define _PLATFORMS_ISERIES_IT_LP_NACA_H
 
 #include <linux/types.h>
 
@@ -77,4 +77,4 @@ extern struct ItLpNaca                itLpNaca;
 #define ITLPNACA_HWSYNCEDTBS   0x20    /* Hardware synced TBs */
 #define ITLPNACA_HMTINT                0x10    /* Utilize MHT for interrupts */
 
-#endif /* _ASM_POWERPC_ISERIES_IT_LP_NACA_H */
+#endif /* _PLATFORMS_ISERIES_IT_LP_NACA_H */
index a776944..8162049 100644 (file)
 #include <asm/processor.h>
 #include <asm/ptrace.h>
 #include <asm/abs_addr.h>
-#include <asm/iseries/it_lp_naca.h>
 #include <asm/lppaca.h>
 #include <asm/iseries/it_lp_reg_save.h>
 #include <asm/paca.h>
 #include <asm/iseries/lpar_map.h>
-#include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/iseries/it_lp_queue.h>
 
 #include "naca.h"
@@ -27,6 +25,8 @@
 #include "ipl_parms.h"
 #include "processor_vpd.h"
 #include "release_data.h"
+#include "it_exp_vpd_panel.h"
+#include "it_lp_naca.h"
 
 /* The HvReleaseData is the root of the information shared between
  * the hypervisor and Linux.
@@ -127,14 +127,12 @@ struct ItLpNaca itLpNaca = {
                (u64)instruction_access_slb_iSeries /* 0x480 I-SLB */
        }
 };
-EXPORT_SYMBOL(itLpNaca);
 
 /* May be filled in by the hypervisor so cannot end up in the BSS */
 struct ItIplParmsReal xItIplParmsReal __attribute__((__section__(".data")));
 
 /* May be filled in by the hypervisor so cannot end up in the BSS */
 struct ItExtVpdPanel xItExtVpdPanel __attribute__((__section__(".data")));
-EXPORT_SYMBOL(xItExtVpdPanel);
 
 #define maxPhysicalProcessors 32
 
index 2a9f81e..98c1c24 100644 (file)
@@ -20,7 +20,7 @@
 #include <asm/iseries/it_lp_queue.h>
 #include <asm/iseries/hv_lp_event.h>
 #include <asm/iseries/hv_call_event.h>
-#include <asm/iseries/it_lp_naca.h>
+#include "it_lp_naca.h"
 
 /*
  * The LpQueue is used to pass event data from the hypervisor to
index 74f6889..1a7a3f5 100644 (file)
@@ -61,9 +61,9 @@ struct IoHriMainStoreSegment4 {
 };
 
 /* Main Store VPD for Power4 */
-struct IoHriMainStoreChipInfo1 {
-       u32     chipMfgID       __attribute((packed));
-       char    chipECLevel[4]  __attribute((packed));
+struct __attribute((packed)) IoHriMainStoreChipInfo1 {
+       u32     chipMfgID;
+       char    chipECLevel[4];
 };
 
 struct IoHriMainStoreVpdIdData {
@@ -73,72 +73,72 @@ struct IoHriMainStoreVpdIdData {
        char    serialNumber[12];
 };
 
-struct IoHriMainStoreVpdFruData {
-       char    fruLabel[8]     __attribute((packed));
-       u8      numberOfSlots   __attribute((packed));
-       u8      pluggingType    __attribute((packed));
-       u16     slotMapIndex    __attribute((packed));
+struct __attribute((packed)) IoHriMainStoreVpdFruData {
+       char    fruLabel[8];
+       u8      numberOfSlots;
+       u8      pluggingType;
+       u16     slotMapIndex;
 };
 
-struct IoHriMainStoreAdrRangeBlock {
-       void    *blockStart      __attribute((packed));
-       void    *blockEnd        __attribute((packed));
-       u32     blockProcChipId __attribute((packed));
+struct  __attribute((packed)) IoHriMainStoreAdrRangeBlock {
+       void    *blockStart;
+       void    *blockEnd;
+       u32     blockProcChipId;
 };
 
 #define MaxAreaAdrRangeBlocks 4
 
-struct IoHriMainStoreArea4 {
-       u32     msVpdFormat                     __attribute((packed));
-       u8      containedVpdType                __attribute((packed));
-       u8      reserved1                       __attribute((packed));
-       u16     reserved2                       __attribute((packed));
-
-       u64     msExists                        __attribute((packed));
-       u64     msFunctional                    __attribute((packed));
-
-       u32     memorySize                      __attribute((packed));
-       u32     procNodeId                      __attribute((packed));
-
-       u32     numAdrRangeBlocks               __attribute((packed));
-       struct IoHriMainStoreAdrRangeBlock xAdrRangeBlock[MaxAreaAdrRangeBlocks]        __attribute((packed));
-
-       struct IoHriMainStoreChipInfo1  chipInfo0       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo1       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo2       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo3       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo4       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo5       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo6       __attribute((packed));
-       struct IoHriMainStoreChipInfo1  chipInfo7       __attribute((packed));
-
-       void    *msRamAreaArray                 __attribute((packed));
-       u32     msRamAreaArrayNumEntries        __attribute((packed));
-       u32     msRamAreaArrayEntrySize         __attribute((packed));
-
-       u32     numaDimmExists                  __attribute((packed));
-       u32     numaDimmFunctional              __attribute((packed));
-       void    *numaDimmArray                  __attribute((packed));
-       u32     numaDimmArrayNumEntries         __attribute((packed));
-       u32     numaDimmArrayEntrySize          __attribute((packed));
-
-       struct IoHriMainStoreVpdIdData idData   __attribute((packed));
-
-       u64     powerData                       __attribute((packed));
-       u64     cardAssemblyPartNum             __attribute((packed));
-       u64     chipSerialNum                   __attribute((packed));
-
-       u64     reserved3                       __attribute((packed));
-       char    reserved4[16]                   __attribute((packed));
-
-       struct IoHriMainStoreVpdFruData fruData __attribute((packed));
-
-       u8      vpdPortNum                      __attribute((packed));
-       u8      reserved5                       __attribute((packed));
-       u8      frameId                         __attribute((packed));
-       u8      rackUnit                        __attribute((packed));
-       char    asciiKeywordVpd[256]            __attribute((packed));
-       u32     reserved6                       __attribute((packed));
+struct __attribute((packed)) IoHriMainStoreArea4 {
+       u32     msVpdFormat;
+       u8      containedVpdType;
+       u8      reserved1;
+       u16     reserved2;
+
+       u64     msExists;
+       u64     msFunctional;
+
+       u32     memorySize;
+       u32     procNodeId;
+
+       u32     numAdrRangeBlocks;
+       struct IoHriMainStoreAdrRangeBlock xAdrRangeBlock[MaxAreaAdrRangeBlocks];
+
+       struct IoHriMainStoreChipInfo1  chipInfo0;
+       struct IoHriMainStoreChipInfo1  chipInfo1;
+       struct IoHriMainStoreChipInfo1  chipInfo2;
+       struct IoHriMainStoreChipInfo1  chipInfo3;
+       struct IoHriMainStoreChipInfo1  chipInfo4;
+       struct IoHriMainStoreChipInfo1  chipInfo5;
+       struct IoHriMainStoreChipInfo1  chipInfo6;
+       struct IoHriMainStoreChipInfo1  chipInfo7;
+
+       void    *msRamAreaArray;
+       u32     msRamAreaArrayNumEntries;
+       u32     msRamAreaArrayEntrySize;
+
+       u32     numaDimmExists;
+       u32     numaDimmFunctional;
+       void    *numaDimmArray;
+       u32     numaDimmArrayNumEntries;
+       u32     numaDimmArrayEntrySize;
+
+       struct IoHriMainStoreVpdIdData idData;
+
+       u64     powerData;
+       u64     cardAssemblyPartNum;
+       u64     chipSerialNum;
+
+       u64     reserved3;
+       char    reserved4[16];
+
+       struct IoHriMainStoreVpdFruData fruData;
+
+       u8      vpdPortNum;
+       u8      reserved5;
+       u8      frameId;
+       u8      rackUnit;
+       char    asciiKeywordVpd[256];
+       u32     reserved6;
 };
 
 
index 35bcc98..f4d427a 100644 (file)
@@ -176,12 +176,12 @@ void iSeries_pcibios_init(void)
        }
        while ((node = of_get_next_child(root, node)) != NULL) {
                HvBusNumber bus;
-               u32 *busp;
+               const u32 *busp;
 
                if ((node->type == NULL) || (strcmp(node->type, "pci") != 0))
                        continue;
 
-               busp = (u32 *)get_property(node, "bus-range", NULL);
+               busp = get_property(node, "bus-range", NULL);
                if (busp == NULL)
                        continue;
                bus = *busp;
@@ -221,10 +221,9 @@ void __init iSeries_pci_final_fixup(void)
 
                if (node != NULL) {
                        struct pci_dn *pdn = PCI_DN(node);
-                       u32 *agent;
+                       const u32 *agent;
 
-                       agent = (u32 *)get_property(node, "linux,agent-id",
-                                       NULL);
+                       agent = get_property(node, "linux,agent-id", NULL);
                        if ((pdn != NULL) && (agent != NULL)) {
                                u8 irq = iSeries_allocate_IRQ(pdn->busno, 0,
                                                pdn->bussubno);
index c9605d7..7f19530 100644 (file)
@@ -59,6 +59,7 @@
 #include "irq.h"
 #include "vpd_areas.h"
 #include "processor_vpd.h"
+#include "it_lp_naca.h"
 #include "main_store.h"
 #include "call_sm.h"
 #include "call_hpt.h"
index 622a301..9baa4ee 100644 (file)
@@ -41,8 +41,8 @@
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
+#include <asm/prom.h>
 #include <asm/iseries/hv_types.h>
-#include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/iseries/hv_lp_event.h>
 #include <asm/iseries/hv_lp_config.h>
 #include <asm/iseries/mf.h>
@@ -116,6 +116,8 @@ static int proc_viopath_show(struct seq_file *m, void *v)
        dma_addr_t handle;
        HvLpEvent_Rc hvrc;
        DECLARE_MUTEX_LOCKED(Semaphore);
+       struct device_node *node;
+       const char *sysid;
 
        buf = kmalloc(HW_PAGE_SIZE, GFP_KERNEL);
        if (!buf)
@@ -143,20 +145,26 @@ static int proc_viopath_show(struct seq_file *m, void *v)
 
        buf[HW_PAGE_SIZE-1] = '\0';
        seq_printf(m, "%s", buf);
-       seq_printf(m, "AVAILABLE_VETH=%x\n", vlanMap);
-       seq_printf(m, "SRLNBR=%c%c%c%c%c%c%c\n",
-                  e2a(xItExtVpdPanel.mfgID[2]),
-                  e2a(xItExtVpdPanel.mfgID[3]),
-                  e2a(xItExtVpdPanel.systemSerial[1]),
-                  e2a(xItExtVpdPanel.systemSerial[2]),
-                  e2a(xItExtVpdPanel.systemSerial[3]),
-                  e2a(xItExtVpdPanel.systemSerial[4]),
-                  e2a(xItExtVpdPanel.systemSerial[5]));
 
        dma_unmap_single(iSeries_vio_dev, handle, HW_PAGE_SIZE,
                         DMA_FROM_DEVICE);
        kfree(buf);
 
+       seq_printf(m, "AVAILABLE_VETH=%x\n", vlanMap);
+
+       node = of_find_node_by_path("/");
+       sysid = NULL;
+       if (node != NULL)
+               sysid = get_property(node, "system-id", NULL);
+
+       if (sysid == NULL)
+               seq_printf(m, "SRLNBR=<UNKNOWN>\n");
+       else
+               /* Skip "IBM," on front of serial number, see dt.c */
+               seq_printf(m, "SRLNBR=%s\n", sysid + 4);
+
+       of_node_put(node);
+
        return 0;
 }
 
index 23a6d1e..9f83878 100644 (file)
@@ -188,7 +188,7 @@ static void __init iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
 {
        u8 *TagPtr = VpdData;
        int DataLen = VpdDataLen - 3;
-       u8 PhbId;
+       u8 PhbId = 0xff;
 
        while ((*TagPtr != VpdEndOfAreaTag) && (DataLen > 0)) {
                int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256);
@@ -205,15 +205,16 @@ static void __init iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
        }
 }
 
-static void __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
+static int __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
                u8 *frame, char card[4])
 {
+       int status = 0;
        int BusVpdLen = 0;
        u8 *BusVpdPtr = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
 
        if (BusVpdPtr == NULL) {
                printk("PCI: Bus VPD Buffer allocation failure.\n");
-               return;
+               return 0;
        }
        BusVpdLen = HvCallPci_getBusVpd(bus, iseries_hv_addr(BusVpdPtr),
                                        BUS_VPDSIZE);
@@ -228,8 +229,10 @@ static void __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
                goto out_free;
        }
        iSeries_Parse_Vpd(BusVpdPtr, BusVpdLen, agent, frame, card);
+       status = 1;
 out_free:
        kfree(BusVpdPtr);
+       return status;
 }
 
 /*
@@ -246,7 +249,7 @@ void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
        struct device_node *DevNode = PciDev->sysdata;
        struct pci_dn *pdn;
        u16 bus;
-       u8 frame;
+       u8 frame = 0;
        char card[4];
        HvSubBusNumber subbus;
        HvAgentId agent;
@@ -262,10 +265,11 @@ void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
        subbus = pdn->bussubno;
        agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
                        ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
-       iSeries_Get_Location_Code(bus, agent, &frame, card);
 
-       printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s  ",
-                       count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor,
-                       frame, card);
-       printk("0x%04X\n", (int)(PciDev->class >> 8));
+       if (iSeries_Get_Location_Code(bus, agent, &frame, card)) {
+               printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, "
+                       "Card %4s  0x%04X\n", count, bus,
+                       PCI_SLOT(PciDev->devfn), PciDev->vendor, frame,
+                       card, (int)(PciDev->class >> 8));
+       }
 }
index 63a1670..dc05af5 100644 (file)
@@ -38,16 +38,16 @@ static struct pci_controller *u3_agp, *u3_ht;
 static int __init fixup_one_level_bus_range(struct device_node *node, int higher)
 {
        for (; node != 0;node = node->sibling) {
-               int * bus_range;
-               unsigned int *class_code;
+               const int *bus_range;
+               const unsigned int *class_code;
                int len;
 
                /* For PCI<->PCI bridges or CardBus bridges, we go down */
-               class_code = (unsigned int *) get_property(node, "class-code", NULL);
+               class_code = get_property(node, "class-code", NULL);
                if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
                        (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS))
                        continue;
-               bus_range = (int *) get_property(node, "bus-range", &len);
+               bus_range = get_property(node, "bus-range", &len);
                if (bus_range != NULL && len > 2 * sizeof(int)) {
                        if (bus_range[1] > higher)
                                higher = bus_range[1];
@@ -65,16 +65,18 @@ static int __init fixup_one_level_bus_range(struct device_node *node, int higher
  */
 static void __init fixup_bus_range(struct device_node *bridge)
 {
-       int * bus_range;
+       int *bus_range;
+       struct property *prop;
        int len;
 
        /* Lookup the "bus-range" property for the hose */
-       bus_range = (int *) get_property(bridge, "bus-range", &len);
-       if (bus_range == NULL || len < 2 * sizeof(int)) {
+       prop = of_find_property(bridge, "bus-range", &len);
+       if (prop == NULL  || prop->value == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s\n",
                               bridge->full_name);
                return;
        }
+       bus_range = (int *)prop->value;
        bus_range[1] = fixup_one_level_bus_range(bridge->child, bus_range[1]);
 }
 
@@ -314,12 +316,12 @@ static int __init add_bridge(struct device_node *dev)
        int len;
        struct pci_controller *hose;
        char* disp_name;
-       int *bus_range;
+       const int *bus_range;
        int primary = 1;
 
        DBG("Adding PCI host bridge %s\n", dev->full_name);
 
-       bus_range = (int *) get_property(dev, "bus-range", &len);
+       bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s, assume bus 0\n",
                dev->full_name);
index 57567df..fe6b9bf 100644 (file)
@@ -99,8 +99,7 @@ static unsigned long maple_find_nvram_base(void)
 static void maple_restart(char *cmd)
 {
        unsigned int maple_nvram_base;
-       unsigned int maple_nvram_offset;
-       unsigned int maple_nvram_command;
+       const unsigned int *maple_nvram_offset, *maple_nvram_command;
        struct device_node *sp;
 
        maple_nvram_base = maple_find_nvram_base();
@@ -113,14 +112,12 @@ static void maple_restart(char *cmd)
                printk(KERN_EMERG "Maple: Unable to find Service Processor\n");
                goto fail;
        }
-       maple_nvram_offset = *(unsigned int*) get_property(sp,
-                       "restart-addr", NULL);
-       maple_nvram_command = *(unsigned int*) get_property(sp,
-                       "restart-value", NULL);
+       maple_nvram_offset = get_property(sp, "restart-addr", NULL);
+       maple_nvram_command = get_property(sp, "restart-value", NULL);
        of_node_put(sp);
 
        /* send command */
-       outb_p(maple_nvram_command, maple_nvram_base + maple_nvram_offset);
+       outb_p(*maple_nvram_command, maple_nvram_base + *maple_nvram_offset);
        for (;;) ;
  fail:
        printk(KERN_EMERG "Maple: Manual Restart Required\n");
@@ -129,8 +126,7 @@ static void maple_restart(char *cmd)
 static void maple_power_off(void)
 {
        unsigned int maple_nvram_base;
-       unsigned int maple_nvram_offset;
-       unsigned int maple_nvram_command;
+       const unsigned int *maple_nvram_offset, *maple_nvram_command;
        struct device_node *sp;
 
        maple_nvram_base = maple_find_nvram_base();
@@ -143,14 +139,12 @@ static void maple_power_off(void)
                printk(KERN_EMERG "Maple: Unable to find Service Processor\n");
                goto fail;
        }
-       maple_nvram_offset = *(unsigned int*) get_property(sp,
-                       "power-off-addr", NULL);
-       maple_nvram_command = *(unsigned int*) get_property(sp,
-                       "power-off-value", NULL);
+       maple_nvram_offset = get_property(sp, "power-off-addr", NULL);
+       maple_nvram_command = get_property(sp, "power-off-value", NULL);
        of_node_put(sp);
 
        /* send command */
-       outb_p(maple_nvram_command, maple_nvram_base + maple_nvram_offset);
+       outb_p(*maple_nvram_command, maple_nvram_base + *maple_nvram_offset);
        for (;;) ;
  fail:
        printk(KERN_EMERG "Maple: Manual Power-Down Required\n");
@@ -211,7 +205,7 @@ static void __init maple_init_early(void)
 static void __init maple_init_IRQ(void)
 {
        struct device_node *root, *np, *mpic_node = NULL;
-       unsigned int *opprop;
+       const unsigned int *opprop;
        unsigned long openpic_addr = 0;
        int naddr, n, i, opplen, has_isus = 0;
        struct mpic *mpic;
@@ -241,8 +235,7 @@ static void __init maple_init_IRQ(void)
        /* Find address list in /platform-open-pic */
        root = of_find_node_by_path("/");
        naddr = prom_n_addr_cells(root);
-       opprop = (unsigned int *) get_property(root, "platform-open-pic",
-                                              &opplen);
+       opprop = get_property(root, "platform-open-pic", &opplen);
        if (opprop != 0) {
                openpic_addr = of_read_number(opprop, naddr);
                has_isus = (opplen > naddr);
index d664154..afa593a 100644 (file)
@@ -60,7 +60,8 @@ int pmac_has_backlight_type(const char *type)
        struct device_node* bk_node = find_devices("backlight");
 
        if (bk_node) {
-               char *prop = get_property(bk_node, "backlight-control", NULL);
+               const char *prop = get_property(bk_node,
+                               "backlight-control", NULL);
                if (prop && strncmp(prop, type, strlen(type)) == 0)
                        return 1;
        }
index 6292624..c2b6b41 100644 (file)
@@ -421,7 +421,7 @@ static int pmac_cpufreq_cpu_init(struct cpufreq_policy *policy)
 
 static u32 read_gpio(struct device_node *np)
 {
-       u32 *reg = (u32 *)get_property(np, "reg", NULL);
+       const u32 *reg = get_property(np, "reg", NULL);
        u32 offset;
 
        if (reg == NULL)
@@ -497,7 +497,7 @@ static int pmac_cpufreq_init_MacRISC3(struct device_node *cpunode)
                                                                "frequency-gpio");
        struct device_node *slew_done_gpio_np = of_find_node_by_name(NULL,
                                                                     "slewing-done");
-       u32 *value;
+       const u32 *value;
 
        /*
         * Check to see if it's GPIO driven or PMU only
@@ -519,15 +519,15 @@ static int pmac_cpufreq_init_MacRISC3(struct device_node *cpunode)
         */
        if (frequency_gpio && slew_done_gpio) {
                int lenp, rc;
-               u32 *freqs, *ratio;
+               const u32 *freqs, *ratio;
 
-               freqs = (u32 *)get_property(cpunode, "bus-frequencies", &lenp);
+               freqs = get_property(cpunode, "bus-frequencies", &lenp);
                lenp /= sizeof(u32);
                if (freqs == NULL || lenp != 2) {
                        printk(KERN_ERR "cpufreq: bus-frequencies incorrect or missing\n");
                        return 1;
                }
-               ratio = (u32 *)get_property(cpunode, "processor-to-bus-ratio*2", NULL);
+               ratio = get_property(cpunode, "processor-to-bus-ratio*2", NULL);
                if (ratio == NULL) {
                        printk(KERN_ERR "cpufreq: processor-to-bus-ratio*2 missing\n");
                        return 1;
@@ -562,7 +562,7 @@ static int pmac_cpufreq_init_MacRISC3(struct device_node *cpunode)
        /* If we use the PMU, look for the min & max frequencies in the
         * device-tree
         */
-       value = (u32 *)get_property(cpunode, "min-clock-frequency", NULL);
+       value = get_property(cpunode, "min-clock-frequency", NULL);
        if (!value)
                return 1;
        low_freq = (*value) / 1000;
@@ -571,7 +571,7 @@ static int pmac_cpufreq_init_MacRISC3(struct device_node *cpunode)
        if (low_freq < 100000)
                low_freq *= 10;
 
-       value = (u32 *)get_property(cpunode, "max-clock-frequency", NULL);
+       value = get_property(cpunode, "max-clock-frequency", NULL);
        if (!value)
                return 1;
        hi_freq = (*value) / 1000;
@@ -611,13 +611,14 @@ static int pmac_cpufreq_init_7447A(struct device_node *cpunode)
 static int pmac_cpufreq_init_750FX(struct device_node *cpunode)
 {
        struct device_node *volt_gpio_np;
-       u32 pvr, *value;
+       u32 pvr;
+       const u32 *value;
 
        if (get_property(cpunode, "dynamic-power-step", NULL) == NULL)
                return 1;
 
        hi_freq = cur_freq;
-       value = (u32 *)get_property(cpunode, "reduced-clock-frequency", NULL);
+       value = get_property(cpunode, "reduced-clock-frequency", NULL);
        if (!value)
                return 1;
        low_freq = (*value) / 1000;
@@ -650,7 +651,7 @@ static int pmac_cpufreq_init_750FX(struct device_node *cpunode)
 static int __init pmac_cpufreq_setup(void)
 {
        struct device_node      *cpunode;
-       u32                     *value;
+       const u32               *value;
 
        if (strstr(cmd_line, "nocpufreq"))
                return 0;
@@ -661,7 +662,7 @@ static int __init pmac_cpufreq_setup(void)
                goto out;
 
        /* Get current cpu clock freq */
-       value = (u32 *)get_property(cpunode, "clock-frequency", NULL);
+       value = get_property(cpunode, "clock-frequency", NULL);
        if (!value)
                goto out;
        cur_freq = (*value) / 1000;
index 7b1156e..167cd3c 100644 (file)
@@ -391,7 +391,8 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
        unsigned int psize, ssize;
        unsigned long max_freq;
        char *freq_method, *volt_method;
-       u32 *valp, pvr_hi;
+       const u32 *valp;
+       u32 pvr_hi;
        int use_volts_vdnap = 0;
        int use_volts_smu = 0;
        int rc = -ENODEV;
@@ -409,8 +410,7 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
        /* Get first CPU node */
        for (cpunode = NULL;
             (cpunode = of_get_next_child(cpus, cpunode)) != NULL;) {
-               u32 *reg =
-                       (u32 *)get_property(cpunode, "reg", NULL);
+               const u32 *reg = get_property(cpunode, "reg", NULL);
                if (reg == NULL || (*reg) != 0)
                        continue;
                if (!strcmp(cpunode->type, "cpu"))
@@ -422,7 +422,7 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
        }
 
        /* Check 970FX for now */
-       valp = (u32 *)get_property(cpunode, "cpu-version", NULL);
+       valp = get_property(cpunode, "cpu-version", NULL);
        if (!valp) {
                DBG("No cpu-version property !\n");
                goto bail_noprops;
@@ -434,7 +434,7 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
        }
 
        /* Look for the powertune data in the device-tree */
-       g5_pmode_data = (u32 *)get_property(cpunode, "power-mode-data",&psize);
+       g5_pmode_data = get_property(cpunode, "power-mode-data",&psize);
        if (!g5_pmode_data) {
                DBG("No power-mode-data !\n");
                goto bail_noprops;
@@ -442,7 +442,7 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
        g5_pmode_max = psize / sizeof(u32) - 1;
 
        if (use_volts_smu) {
-               struct smu_sdbp_header *shdr;
+               const struct smu_sdbp_header *shdr;
 
                /* Look for the FVT table */
                shdr = smu_get_sdb_partition(SMU_SDB_FVT_ID, NULL);
@@ -493,7 +493,7 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
         * half freq in this version. So far, I haven't yet seen a machine
         * supporting anything else.
         */
-       valp = (u32 *)get_property(cpunode, "clock-frequency", NULL);
+       valp = get_property(cpunode, "clock-frequency", NULL);
        if (!valp)
                return -ENODEV;
        max_freq = (*valp)/1000;
@@ -541,8 +541,8 @@ static int __init g5_neo2_cpufreq_init(struct device_node *cpus)
 static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
 {
        struct device_node *cpuid = NULL, *hwclock = NULL, *cpunode = NULL;
-       u8 *eeprom = NULL;
-       u32 *valp;
+       const u8 *eeprom = NULL;
+       const u32 *valp;
        u64 max_freq, min_freq, ih, il;
        int has_volt = 1, rc = 0;
 
@@ -563,7 +563,7 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
        /* Lookup the cpuid eeprom node */
         cpuid = of_find_node_by_path("/u3@0,f8000000/i2c@f8001000/cpuid@a0");
        if (cpuid != NULL)
-               eeprom = (u8 *)get_property(cpuid, "cpuid", NULL);
+               eeprom = get_property(cpuid, "cpuid", NULL);
        if (eeprom == NULL) {
                printk(KERN_ERR "cpufreq: Can't find cpuid EEPROM !\n");
                rc = -ENODEV;
@@ -573,7 +573,8 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
        /* Lookup the i2c hwclock */
        for (hwclock = NULL;
             (hwclock = of_find_node_by_name(hwclock, "i2c-hwclock")) != NULL;){
-               char *loc = get_property(hwclock, "hwctrl-location", NULL);
+               const char *loc = get_property(hwclock,
+                               "hwctrl-location", NULL);
                if (loc == NULL)
                        continue;
                if (strcmp(loc, "CPU CLOCK"))
@@ -637,7 +638,7 @@ static int __init g5_pm72_cpufreq_init(struct device_node *cpus)
         */
 
        /* Get max frequency from device-tree */
-       valp = (u32 *)get_property(cpunode, "clock-frequency", NULL);
+       valp = get_property(cpunode, "clock-frequency", NULL);
        if (!valp) {
                printk(KERN_ERR "cpufreq: Can't find CPU frequency !\n");
                rc = -ENODEV;
index f8313bf..13fcaf5 100644 (file)
@@ -1058,8 +1058,8 @@ core99_reset_cpu(struct device_node *node, long param, long value)
        if (np == NULL)
                return -ENODEV;
        for (np = np->child; np != NULL; np = np->sibling) {
-               u32 *num = (u32 *)get_property(np, "reg", NULL);
-               u32 *rst = (u32 *)get_property(np, "soft-reset", NULL);
+               u32 *num = get_property(np, "reg", NULL);
+               u32 *rst = get_property(np, "soft-reset", NULL);
                if (num == NULL || rst == NULL)
                        continue;
                if (param == *num) {
@@ -1087,7 +1087,7 @@ core99_usb_enable(struct device_node *node, long param, long value)
 {
        struct macio_chip *macio;
        unsigned long flags;
-       char *prop;
+       const char *prop;
        int number;
        u32 reg;
 
@@ -1096,7 +1096,7 @@ core99_usb_enable(struct device_node *node, long param, long value)
            macio->type != macio_intrepid)
                return -ENODEV;
 
-       prop = (char *)get_property(node, "AAPL,clock-id", NULL);
+       prop = get_property(node, "AAPL,clock-id", NULL);
        if (!prop)
                return -ENODEV;
        if (strncmp(prop, "usb0u048", 8) == 0)
@@ -1507,8 +1507,8 @@ static long g5_reset_cpu(struct device_node *node, long param, long value)
        if (np == NULL)
                return -ENODEV;
        for (np = np->child; np != NULL; np = np->sibling) {
-               u32 *num = (u32 *)get_property(np, "reg", NULL);
-               u32 *rst = (u32 *)get_property(np, "soft-reset", NULL);
+               const u32 *num = get_property(np, "reg", NULL);
+               const u32 *rst = get_property(np, "soft-reset", NULL);
                if (num == NULL || rst == NULL)
                        continue;
                if (param == *num) {
@@ -2408,7 +2408,7 @@ static int __init probe_motherboard(void)
         */
        dt = find_devices("device-tree");
        if (dt != NULL)
-               model = (const char *) get_property(dt, "model", NULL);
+               model = get_property(dt, "model", NULL);
        for(i=0; model && i<(sizeof(pmac_mb_defs)/sizeof(struct pmac_mb_def)); i++) {
            if (strcmp(model, pmac_mb_defs[i].model_string) == 0) {
                pmac_mb = pmac_mb_defs[i];
@@ -2536,7 +2536,7 @@ found:
  */
 static void __init probe_uninorth(void)
 {
-       u32 *addrp;
+       const u32 *addrp;
        phys_addr_t address;
        unsigned long actrl;
 
@@ -2555,7 +2555,7 @@ static void __init probe_uninorth(void)
        if (uninorth_node == NULL)
                return;
 
-       addrp = (u32 *)get_property(uninorth_node, "reg", NULL);
+       addrp = get_property(uninorth_node, "reg", NULL);
        if (addrp == NULL)
                return;
        address = of_translate_address(uninorth_node, addrp);
@@ -2596,7 +2596,7 @@ static void __init probe_one_macio(const char *name, const char *compat, int typ
        struct device_node*     node;
        int                     i;
        volatile u32 __iomem    *base;
-       u32                     *addrp, *revp;
+       const u32               *addrp, *revp;
        phys_addr_t             addr;
        u64                     size;
 
@@ -2639,7 +2639,7 @@ static void __init probe_one_macio(const char *name, const char *compat, int typ
                return;
        }
        if (type == macio_keylargo || type == macio_keylargo2) {
-               u32 *did = (u32 *)get_property(node, "device-id", NULL);
+               const u32 *did = get_property(node, "device-id", NULL);
                if (*did == 0x00000025)
                        type = macio_pangea;
                if (*did == 0x0000003e)
@@ -2652,7 +2652,7 @@ static void __init probe_one_macio(const char *name, const char *compat, int typ
        macio_chips[i].base     = base;
        macio_chips[i].flags    = MACIO_FLAG_SCCB_ON | MACIO_FLAG_SCCB_ON;
        macio_chips[i].name     = macio_names[type];
-       revp = (u32 *)get_property(node, "revision-id", NULL);
+       revp = get_property(node, "revision-id", NULL);
        if (revp)
                macio_chips[i].rev = *revp;
        printk(KERN_INFO "Found a %s mac-io controller, rev: %d, mapped at 0x%p\n",
@@ -2695,15 +2695,15 @@ static void __init
 initial_serial_shutdown(struct device_node *np)
 {
        int len;
-       struct slot_names_prop {
+       const struct slot_names_prop {
                int     count;
                char    name[1];
        } *slots;
-       char *conn;
+       const char *conn;
        int port_type = PMAC_SCC_ASYNC;
        int modem = 0;
 
-       slots = (struct slot_names_prop *)get_property(np, "slot-names", &len);
+       slots = get_property(np, "slot-names", &len);
        conn = get_property(np, "AAPL,connector", &len);
        if (conn && (strcmp(conn, "infrared") == 0))
                port_type = PMAC_SCC_IRDA;
index 8677f50..c2c7cf7 100644 (file)
@@ -477,7 +477,8 @@ static int kw_i2c_xfer(struct pmac_i2c_bus *bus, u8 addrdir, int subsize,
 static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np)
 {
        struct pmac_i2c_host_kw *host;
-       u32                     *psteps, *prate, *addrp, steps;
+       const u32               *psteps, *prate, *addrp;
+       u32                     steps;
 
        host = kzalloc(sizeof(struct pmac_i2c_host_kw), GFP_KERNEL);
        if (host == NULL) {
@@ -490,7 +491,7 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np)
         * on all i2c keywest nodes so far ... we would have to fallback
         * to macio parsing if that wasn't the case
         */
-       addrp = (u32 *)get_property(np, "AAPL,address", NULL);
+       addrp = get_property(np, "AAPL,address", NULL);
        if (addrp == NULL) {
                printk(KERN_ERR "low_i2c: Can't find address for %s\n",
                       np->full_name);
@@ -504,13 +505,13 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np)
        host->timeout_timer.function = kw_i2c_timeout;
        host->timeout_timer.data = (unsigned long)host;
 
-       psteps = (u32 *)get_property(np, "AAPL,address-step", NULL);
+       psteps = get_property(np, "AAPL,address-step", NULL);
        steps = psteps ? (*psteps) : 0x10;
        for (host->bsteps = 0; (steps & 0x01) == 0; host->bsteps++)
                steps >>= 1;
        /* Select interface rate */
        host->speed = KW_I2C_MODE_25KHZ;
-       prate = (u32 *)get_property(np, "AAPL,i2c-rate", NULL);
+       prate = get_property(np, "AAPL,i2c-rate", NULL);
        if (prate) switch(*prate) {
        case 100:
                host->speed = KW_I2C_MODE_100KHZ;
@@ -618,8 +619,8 @@ static void __init kw_i2c_probe(void)
                } else {
                        for (child = NULL;
                             (child = of_get_next_child(np, child)) != NULL;) {
-                               u32 *reg =
-                                       (u32 *)get_property(child, "reg", NULL);
+                               const u32 *reg = get_property(child,
+                                               "reg", NULL);
                                if (reg == NULL)
                                        continue;
                                kw_i2c_add(host, np, child, *reg);
@@ -881,7 +882,7 @@ static void __init smu_i2c_probe(void)
 {
        struct device_node *controller, *busnode;
        struct pmac_i2c_bus *bus;
-       u32 *reg;
+       const u32 *reg;
        int sz;
 
        if (!smu_present())
@@ -904,7 +905,7 @@ static void __init smu_i2c_probe(void)
                if (strcmp(busnode->type, "i2c") &&
                    strcmp(busnode->type, "i2c-bus"))
                        continue;
-               reg = (u32 *)get_property(busnode, "reg", NULL);
+               reg = get_property(busnode, "reg", NULL);
                if (reg == NULL)
                        continue;
 
@@ -948,9 +949,8 @@ struct pmac_i2c_bus *pmac_i2c_find_bus(struct device_node *node)
                list_for_each_entry(bus, &pmac_i2c_busses, link) {
                        if (p == bus->busnode) {
                                if (prev && bus->flags & pmac_i2c_multibus) {
-                                       u32 *reg;
-                                       reg = (u32 *)get_property(prev, "reg",
-                                                                 NULL);
+                                       const u32 *reg;
+                                       reg = get_property(prev, "reg", NULL);
                                        if (!reg)
                                                continue;
                                        if (((*reg) >> 8) != bus->channel)
@@ -971,7 +971,7 @@ EXPORT_SYMBOL_GPL(pmac_i2c_find_bus);
 
 u8 pmac_i2c_get_dev_addr(struct device_node *device)
 {
-       u32 *reg = (u32 *)get_property(device, "reg", NULL);
+       const u32 *reg = get_property(device, "reg", NULL);
 
        if (reg == NULL)
                return 0;
index 205d044..9923adc 100644 (file)
@@ -66,16 +66,16 @@ struct device_node *k2_skiplist[2];
 static int __init fixup_one_level_bus_range(struct device_node *node, int higher)
 {
        for (; node != 0;node = node->sibling) {
-               int * bus_range;
-               unsigned int *class_code;
+               const int * bus_range;
+               const unsigned int *class_code;
                int len;
 
                /* For PCI<->PCI bridges or CardBus bridges, we go down */
-               class_code = (unsigned int *) get_property(node, "class-code", NULL);
+               class_code = get_property(node, "class-code", NULL);
                if (!class_code || ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI &&
                        (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS))
                        continue;
-               bus_range = (int *) get_property(node, "bus-range", &len);
+               bus_range = get_property(node, "bus-range", &len);
                if (bus_range != NULL && len > 2 * sizeof(int)) {
                        if (bus_range[1] > higher)
                                higher = bus_range[1];
@@ -93,13 +93,15 @@ static int __init fixup_one_level_bus_range(struct device_node *node, int higher
  */
 static void __init fixup_bus_range(struct device_node *bridge)
 {
-       int * bus_range;
-       int len;
+       int *bus_range, len;
+       struct property *prop;
 
        /* Lookup the "bus-range" property for the hose */
-       bus_range = (int *) get_property(bridge, "bus-range", &len);
-       if (bus_range == NULL || len < 2 * sizeof(int))
+       prop = of_find_property(bridge, "bus-range", &len);
+       if (prop == NULL || prop->length < 2 * sizeof(int))
                return;
+
+       bus_range = (int *)prop->value;
        bus_range[1] = fixup_one_level_bus_range(bridge->child, bus_range[1]);
 }
 
@@ -237,7 +239,7 @@ static struct pci_ops macrisc_pci_ops =
 static int chaos_validate_dev(struct pci_bus *bus, int devfn, int offset)
 {
        struct device_node *np;
-       u32 *vendor, *device;
+       const u32 *vendor, *device;
 
        if (offset >= 0x100)
                return  PCIBIOS_BAD_REGISTER_NUMBER;
@@ -245,8 +247,8 @@ static int chaos_validate_dev(struct pci_bus *bus, int devfn, int offset)
        if (np == NULL)
                return PCIBIOS_DEVICE_NOT_FOUND;
 
-       vendor = (u32 *)get_property(np, "vendor-id", NULL);
-       device = (u32 *)get_property(np, "device-id", NULL);
+       vendor = get_property(np, "vendor-id", NULL);
+       device = get_property(np, "device-id", NULL);
        if (vendor == NULL || device == NULL)
                return PCIBIOS_DEVICE_NOT_FOUND;
 
@@ -686,20 +688,21 @@ static void __init fixup_nec_usb2(void)
 
        for (nec = NULL; (nec = of_find_node_by_name(nec, "usb")) != NULL;) {
                struct pci_controller *hose;
-               u32 data, *prop;
+               u32 data;
+               const u32 *prop;
                u8 bus, devfn;
 
-               prop = (u32 *)get_property(nec, "vendor-id", NULL);
+               prop = get_property(nec, "vendor-id", NULL);
                if (prop == NULL)
                        continue;
                if (0x1033 != *prop)
                        continue;
-               prop = (u32 *)get_property(nec, "device-id", NULL);
+               prop = get_property(nec, "device-id", NULL);
                if (prop == NULL)
                        continue;
                if (0x0035 != *prop)
                        continue;
-               prop = (u32 *)get_property(nec, "reg", NULL);
+               prop = get_property(nec, "reg", NULL);
                if (prop == NULL)
                        continue;
                devfn = (prop[0] >> 8) & 0xff;
@@ -898,7 +901,7 @@ static int __init add_bridge(struct device_node *dev)
        struct pci_controller *hose;
        struct resource rsrc;
        char *disp_name;
-       int *bus_range;
+       const int *bus_range;
        int primary = 1, has_address = 0;
 
        DBG("Adding PCI host bridge %s\n", dev->full_name);
@@ -907,7 +910,7 @@ static int __init add_bridge(struct device_node *dev)
        has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
 
        /* Get bus range if any */
-       bus_range = (int *) get_property(dev, "bus-range", &len);
+       bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                       " bus 0\n", dev->full_name);
index 6d66359..829dace 100644 (file)
@@ -114,7 +114,7 @@ static void macio_gpio_init_one(struct macio_chip *macio)
         * we just create them all
         */
        for (gp = NULL; (gp = of_get_next_child(gparent, gp)) != NULL;) {
-               u32 *reg = (u32 *)get_property(gp, "reg", NULL);
+               const u32 *reg = get_property(gp, "reg", NULL);
                unsigned long offset;
                if (reg == NULL)
                        continue;
index b117adb..7651f27 100644 (file)
@@ -813,14 +813,15 @@ struct pmf_function *__pmf_find_function(struct device_node *target,
        struct pmf_device *dev;
        struct pmf_function *func, *result = NULL;
        char fname[64];
-       u32 *prop, ph;
+       const u32 *prop;
+       u32 ph;
 
        /*
         * Look for a "platform-*" function reference. If we can't find
         * one, then we fallback to a direct call attempt
         */
        snprintf(fname, 63, "platform-%s", name);
-       prop = (u32 *)get_property(target, fname, NULL);
+       prop = get_property(target, fname, NULL);
        if (prop == NULL)
                goto find_it;
        ph = *prop;
index 31a9da7..824a618 100644 (file)
@@ -116,7 +116,7 @@ extern struct smp_ops_t core99_smp_ops;
 static void pmac_show_cpuinfo(struct seq_file *m)
 {
        struct device_node *np;
-       char *pp;
+       const char *pp;
        int plen;
        int mbmodel;
        unsigned int mbflags;
@@ -134,12 +134,12 @@ static void pmac_show_cpuinfo(struct seq_file *m)
        seq_printf(m, "machine\t\t: ");
        np = of_find_node_by_path("/");
        if (np != NULL) {
-               pp = (char *) get_property(np, "model", NULL);
+               pp = get_property(np, "model", NULL);
                if (pp != NULL)
                        seq_printf(m, "%s\n", pp);
                else
                        seq_printf(m, "PowerMac\n");
-               pp = (char *) get_property(np, "compatible", &plen);
+               pp = get_property(np, "compatible", &plen);
                if (pp != NULL) {
                        seq_printf(m, "motherboard\t:");
                        while (plen > 0) {
@@ -163,10 +163,8 @@ static void pmac_show_cpuinfo(struct seq_file *m)
        if (np == NULL)
                np = of_find_node_by_type(NULL, "cache");
        if (np != NULL) {
-               unsigned int *ic = (unsigned int *)
-                       get_property(np, "i-cache-size", NULL);
-               unsigned int *dc = (unsigned int *)
-                       get_property(np, "d-cache-size", NULL);
+               const unsigned int *ic = get_property(np, "i-cache-size", NULL);
+               const unsigned int *dc = get_property(np, "d-cache-size", NULL);
                seq_printf(m, "L2 cache\t:");
                has_l2cache = 1;
                if (get_property(np, "cache-unified", NULL) != 0 && dc) {
@@ -254,7 +252,7 @@ static void __init l2cr_init(void)
                if (np == 0)
                        np = find_type_devices("cpu");
                if (np != 0) {
-                       unsigned int *l2cr = (unsigned int *)
+                       const unsigned int *l2cr =
                                get_property(np, "l2cr-value", NULL);
                        if (l2cr != 0) {
                                ppc_override_l2cr = 1;
@@ -277,7 +275,7 @@ static void __init l2cr_init(void)
 static void __init pmac_setup_arch(void)
 {
        struct device_node *cpu, *ic;
-       int *fp;
+       const int *fp;
        unsigned long pvr;
 
        pvr = PVR_VER(mfspr(SPRN_PVR));
@@ -287,7 +285,7 @@ static void __init pmac_setup_arch(void)
        loops_per_jiffy = 50000000 / HZ;
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != NULL) {
-               fp = (int *) get_property(cpu, "clock-frequency", NULL);
+               fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != NULL) {
                        if (pvr >= 0x30 && pvr < 0x80)
                                /* PPC970 etc. */
index 827b712..653eeb6 100644 (file)
@@ -548,7 +548,7 @@ static void __init smp_core99_setup_i2c_hwsync(int ncpus)
        struct device_node *cc = NULL;  
        struct device_node *p;
        const char *name = NULL;
-       u32 *reg;
+       const u32 *reg;
        int ok;
 
        /* Look for the clock chip */
@@ -562,7 +562,7 @@ static void __init smp_core99_setup_i2c_hwsync(int ncpus)
                pmac_tb_clock_chip_host = pmac_i2c_find_bus(cc);
                if (pmac_tb_clock_chip_host == NULL)
                        continue;
-               reg = (u32 *)get_property(cc, "reg", NULL);
+               reg = get_property(cc, "reg", NULL);
                if (reg == NULL)
                        continue;
                switch (*reg) {
@@ -707,8 +707,7 @@ static void __init smp_core99_setup(int ncpus)
                core99_tb_gpio = KL_GPIO_TB_ENABLE;     /* default value */
                cpu = of_find_node_by_type(NULL, "cpu");
                if (cpu != NULL) {
-                       tbprop = (u32 *)get_property(cpu, "timebase-enable",
-                                                    NULL);
+                       tbprop = get_property(cpu, "timebase-enable", NULL);
                        if (tbprop)
                                core99_tb_gpio = *tbprop;
                        of_node_put(cpu);
index 37e5b1e..ce1a235 100644 (file)
@@ -68,11 +68,11 @@ static unsigned char scc_inittab[] = {
 
 void udbg_scc_init(int force_scc)
 {
-       u32 *reg;
+       const u32 *reg;
        unsigned long addr;
        struct device_node *stdout = NULL, *escc = NULL, *macio = NULL;
        struct device_node *ch, *ch_def = NULL, *ch_a = NULL;
-       char *path;
+       const char *path;
        int i, x;
 
        escc = of_find_node_by_name(NULL, "escc");
@@ -81,7 +81,7 @@ void udbg_scc_init(int force_scc)
        macio = of_get_parent(escc);
        if (macio == NULL)
                goto bail;
-       path = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
+       path = get_property(of_chosen, "linux,stdout-path", NULL);
        if (path != NULL)
                stdout = of_find_node_by_path(path);
        for (ch = NULL; (ch = of_get_next_child(escc, ch)) != NULL;) {
@@ -96,13 +96,13 @@ void udbg_scc_init(int force_scc)
        ch = ch_def ? ch_def : ch_a;
 
        /* Get address within mac-io ASIC */
-       reg = (u32 *)get_property(escc, "reg", NULL);
+       reg = get_property(escc, "reg", NULL);
        if (reg == NULL)
                goto bail;
        addr = reg[0];
 
        /* Get address of mac-io PCI itself */
-       reg = (u32 *)get_property(macio, "assigned-addresses", NULL);
+       reg = get_property(macio, "assigned-addresses", NULL);
        if (reg == NULL)
                goto bail;
        addr += reg[2];
index 32eaddf..5a23ce5 100644 (file)
@@ -691,11 +691,11 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
 {
        struct eeh_early_enable_info *info = data;
        int ret;
-       char *status = get_property(dn, "status", NULL);
-       u32 *class_code = (u32 *)get_property(dn, "class-code", NULL);
-       u32 *vendor_id = (u32 *)get_property(dn, "vendor-id", NULL);
-       u32 *device_id = (u32 *)get_property(dn, "device-id", NULL);
-       u32 *regs;
+       const char *status = get_property(dn, "status", NULL);
+       const u32 *class_code = get_property(dn, "class-code", NULL);
+       const u32 *vendor_id = get_property(dn, "vendor-id", NULL);
+       const u32 *device_id = get_property(dn, "device-id", NULL);
+       const u32 *regs;
        int enable;
        struct pci_dn *pdn = PCI_DN(dn);
 
@@ -737,7 +737,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
 
        /* Ok... see if this device supports EEH.  Some do, some don't,
         * and the only way to find out is to check each and every one. */
-       regs = (u32 *)get_property(dn, "reg", NULL);
+       regs = get_property(dn, "reg", NULL);
        if (regs) {
                /* First register entry is addr (00BBSS00)  */
                /* Try to enable eeh */
index aaad2c0..3269d2c 100644 (file)
@@ -268,14 +268,14 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event)
 
        if (!frozen_dn) {
 
-               location = (char *) get_property(event->dn, "ibm,loc-code", NULL);
+               location = get_property(event->dn, "ibm,loc-code", NULL);
                location = location ? location : "unknown";
                printk(KERN_ERR "EEH: Error: Cannot find partition endpoint "
                                "for location=%s pci addr=%s\n",
                        location, pci_name(event->dev));
                return NULL;
        }
-       location = (char *) get_property(frozen_dn, "ibm,loc-code", NULL);
+       location = get_property(frozen_dn, "ibm,loc-code", NULL);
        location = location ? location : "unknown";
 
        /* There are two different styles for coming up with the PE.
index 45ccc68..1370774 100644 (file)
@@ -124,11 +124,11 @@ int eeh_send_failure_event (struct device_node *dn,
 {
        unsigned long flags;
        struct eeh_event *event;
-       char *location;
+       const char *location;
 
        if (!mem_init_done) {
                printk(KERN_ERR "EEH: event during early boot not handled\n");
-               location = (char *) get_property(dn, "ibm,loc-code", NULL);
+               location = get_property(dn, "ibm,loc-code", NULL);
                printk(KERN_ERR "EEH: device node = %s\n", dn->full_name);
                printk(KERN_ERR "EEH: PCI location = %s\n", location);
                return 1;
index c01d8f0..1c7b2ba 100644 (file)
@@ -68,7 +68,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = {
 void __init fw_feature_init(void)
 {
        struct device_node *dn;
-       char *hypertas, *s;
+       const char *hypertas, *s;
        int len, i;
 
        DBG(" -> fw_feature_init()\n");
index c9ff547..9a99b05 100644 (file)
@@ -1,7 +1,6 @@
 /*
  * This file contains the generic code to perform a call to the
  * pSeries LPAR hypervisor.
- * NOTE: this file will go away when we move to inline this work.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 
        .text
 
-/* long plpar_hcall(unsigned long opcode,              R3
-                       unsigned long arg1,             R4
-                       unsigned long arg2,             R5
-                       unsigned long arg3,             R6
-                       unsigned long arg4,             R7
-                       unsigned long *out1,            R8
-                       unsigned long *out2,            R9
-                       unsigned long *out3);           R10
- */
-_GLOBAL(plpar_hcall)
-       HMT_MEDIUM
-
-       mfcr    r0
-
-       std     r8,STK_PARM(r8)(r1)     /* Save out ptrs */
-       std     r9,STK_PARM(r9)(r1)
-       std     r10,STK_PARM(r10)(r1)
-
-       stw     r0,8(r1)
-
-       HVSC                            /* invoke the hypervisor */
-
-       lwz     r0,8(r1)
-
-       ld      r8,STK_PARM(r8)(r1)     /* Fetch r4-r6 ret args */
-       ld      r9,STK_PARM(r9)(r1)
-       ld      r10,STK_PARM(r10)(r1)
-       std     r4,0(r8)
-       std     r5,0(r9)
-       std     r6,0(r10)
-
-       mtcrf   0xff,r0
-       blr                             /* return r3 = status */
-
-
-/* Simple interface with no output values (other than status) */
 _GLOBAL(plpar_hcall_norets)
        HMT_MEDIUM
 
@@ -64,164 +27,64 @@ _GLOBAL(plpar_hcall_norets)
        mtcrf   0xff,r0
        blr                             /* return r3 = status */
 
-
-/* long plpar_hcall_8arg_2ret(unsigned long opcode,    R3
-                       unsigned long arg1,             R4
-                       unsigned long arg2,             R5
-                       unsigned long arg3,             R6
-                       unsigned long arg4,             R7
-                       unsigned long arg5,             R8
-                       unsigned long arg6,             R9
-                       unsigned long arg7,             R10
-                       unsigned long arg8,             112(R1)
-                       unsigned long *out1);           120(R1)
- */
-_GLOBAL(plpar_hcall_8arg_2ret)
+_GLOBAL(plpar_hcall)
        HMT_MEDIUM
 
        mfcr    r0
-       ld      r11,STK_PARM(r11)(r1)   /* put arg8 in R11 */
        stw     r0,8(r1)
 
-       HVSC                            /* invoke the hypervisor */
-
-       lwz     r0,8(r1)
-       ld      r10,STK_PARM(r12)(r1)   /* Fetch r4 ret arg */
-       std     r4,0(r10)
-       mtcrf   0xff,r0
-       blr                             /* return r3 = status */
-
-
-/* long plpar_hcall_4out(unsigned long opcode,         R3
-                       unsigned long arg1,             R4
-                       unsigned long arg2,             R5
-                       unsigned long arg3,             R6
-                       unsigned long arg4,             R7
-                       unsigned long *out1,            R8
-                       unsigned long *out2,            R9
-                       unsigned long *out3,            R10
-                       unsigned long *out4);           112(R1)
- */
-_GLOBAL(plpar_hcall_4out)
-       HMT_MEDIUM
-
-       mfcr    r0
-       stw     r0,8(r1)
+       std     r4,STK_PARM(r4)(r1)     /* Save ret buffer */
 
-       std     r8,STK_PARM(r8)(r1)     /* Save out ptrs */
-       std     r9,STK_PARM(r9)(r1)
-       std     r10,STK_PARM(r10)(r1)
+       mr      r4,r5
+       mr      r5,r6
+       mr      r6,r7
+       mr      r7,r8
+       mr      r8,r9
+       mr      r9,r10
 
        HVSC                            /* invoke the hypervisor */
 
-       lwz     r0,8(r1)
-
-       ld      r8,STK_PARM(r8)(r1)     /* Fetch r4-r7 ret args */
-       ld      r9,STK_PARM(r9)(r1)
-       ld      r10,STK_PARM(r10)(r1)
-       ld      r11,STK_PARM(r11)(r1)
-       std     r4,0(r8)
-       std     r5,0(r9)
-       std     r6,0(r10)
-       std     r7,0(r11)
-
-       mtcrf   0xff,r0
-       blr                             /* return r3 = status */
-
-/* plpar_hcall_7arg_7ret(unsigned long opcode,         R3
-                        unsigned long arg1,            R4
-                        unsigned long arg2,            R5
-                        unsigned long arg3,            R6
-                        unsigned long arg4,            R7
-                        unsigned long arg5,            R8
-                        unsigned long arg6,            R9
-                        unsigned long arg7,            R10
-                        unsigned long *out1,           112(R1)
-                        unsigned long *out2,           110(R1)
-                        unsigned long *out3,           108(R1)
-                        unsigned long *out4,           106(R1)
-                        unsigned long *out5,           104(R1)
-                        unsigned long *out6,           102(R1)
-                        unsigned long *out7);          100(R1)
-*/
-_GLOBAL(plpar_hcall_7arg_7ret)
-       HMT_MEDIUM
-
-       mfcr    r0
-       stw     r0,8(r1)
-
-       HVSC                            /* invoke the hypervisor */
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+       std     r6, 16(r12)
+       std     r7, 24(r12)
 
        lwz     r0,8(r1)
-
-       ld      r11,STK_PARM(r11)(r1)   /* Fetch r4 ret arg */
-       std     r4,0(r11)
-       ld      r11,STK_PARM(r12)(r1)   /* Fetch r5 ret arg */
-       std     r5,0(r11)
-       ld      r11,STK_PARM(r13)(r1)   /* Fetch r6 ret arg */
-       std     r6,0(r11)
-       ld      r11,STK_PARM(r14)(r1)   /* Fetch r7 ret arg */
-       std     r7,0(r11)
-       ld      r11,STK_PARM(r15)(r1)   /* Fetch r8 ret arg */
-       std     r8,0(r11)
-       ld      r11,STK_PARM(r16)(r1)   /* Fetch r9 ret arg */
-       std     r9,0(r11)
-       ld      r11,STK_PARM(r17)(r1)   /* Fetch r10 ret arg */
-       std     r10,0(r11)
-
        mtcrf   0xff,r0
 
        blr                             /* return r3 = status */
 
-/* plpar_hcall_9arg_9ret(unsigned long opcode,         R3
-                        unsigned long arg1,            R4
-                        unsigned long arg2,            R5
-                        unsigned long arg3,            R6
-                        unsigned long arg4,            R7
-                        unsigned long arg5,            R8
-                        unsigned long arg6,            R9
-                        unsigned long arg7,            R10
-                        unsigned long arg8,            112(R1)
-                        unsigned long arg9,            110(R1)
-                        unsigned long *out1,           108(R1)
-                        unsigned long *out2,           106(R1)
-                        unsigned long *out3,           104(R1)
-                        unsigned long *out4,           102(R1)
-                        unsigned long *out5,           100(R1)
-                        unsigned long *out6,            98(R1)
-                        unsigned long *out7);           96(R1)
-                        unsigned long *out8,            94(R1)
-                        unsigned long *out9,            92(R1)
-*/
-_GLOBAL(plpar_hcall_9arg_9ret)
+_GLOBAL(plpar_hcall9)
        HMT_MEDIUM
 
        mfcr    r0
        stw     r0,8(r1)
 
-       ld      r11,STK_PARM(r11)(r1)    /* put arg8 in R11 */
-       ld      r12,STK_PARM(r12)(r1)    /* put arg9 in R12 */
+       std     r4,STK_PARM(r4)(r1)     /* Save ret buffer */
+
+       mr      r4,r5
+       mr      r5,r6
+       mr      r6,r7
+       mr      r7,r8
+       mr      r8,r9
+       mr      r9,r10
+       ld      r10,STK_PARM(r11)(r1)    /* put arg7 in R10 */
+       ld      r11,STK_PARM(r12)(r1)    /* put arg8 in R11 */
+       ld      r12,STK_PARM(r13)(r1)    /* put arg9 in R12 */
 
        HVSC                            /* invoke the hypervisor */
 
-       ld      r0,STK_PARM(r13)(r1)    /* Fetch r4 ret arg */
-       stdx    r4,r0,r0
-       ld      r0,STK_PARM(r14)(r1)    /* Fetch r5 ret arg */
-       stdx    r5,r0,r0
-       ld      r0,STK_PARM(r15)(r1)    /* Fetch r6 ret arg */
-       stdx    r6,r0,r0
-       ld      r0,STK_PARM(r16)(r1)    /* Fetch r7 ret arg */
-       stdx    r7,r0,r0
-       ld      r0,STK_PARM(r17)(r1)    /* Fetch r8 ret arg */
-       stdx    r8,r0,r0
-       ld      r0,STK_PARM(r18)(r1)    /* Fetch r9 ret arg */
-       stdx    r9,r0,r0
-       ld      r0,STK_PARM(r19)(r1)    /* Fetch r10 ret arg */
-       stdx    r10,r0,r0
-       ld      r0,STK_PARM(r20)(r1)    /* Fetch r11 ret arg */
-       stdx    r11,r0,r0
-       ld      r0,STK_PARM(r21)(r1)    /* Fetch r12 ret arg */
-       stdx    r12,r0,r0
+       ld      r12,STK_PARM(r4)(r1)
+       std     r4,  0(r12)
+       std     r5,  8(r12)
+       std     r6, 16(r12)
+       std     r7, 24(r12)
+       std     r8, 32(r12)
+       std     r9, 40(r12)
+       std     r10,48(r12)
+       std     r11,56(r12)
+       std     r12,64(r12)
 
        lwz     r0,8(r1)
        mtcrf   0xff,r0
index a72a987..3f6a89b 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/module.h>
 #include <asm/hvcall.h>
 #include <asm/hvconsole.h>
+#include "plpar_wrappers.h"
 
 /**
  * hvc_get_chars - retrieve characters from firmware for denoted vterm adatper
@@ -40,9 +41,9 @@ int hvc_get_chars(uint32_t vtermno, char *buf, int count)
 {
        unsigned long got;
 
-       if (plpar_hcall(H_GET_TERM_CHAR, vtermno, 0, 0, 0, &got,
-               (unsigned long *)buf, (unsigned long *)buf+1) == H_SUCCESS)
+       if (plpar_get_term_char(vtermno, &got, buf) == H_SUCCESS)
                return got;
+
        return 0;
 }
 
index d67af2c..bbf2e34 100644 (file)
@@ -267,13 +267,12 @@ static void iommu_table_setparms(struct pci_controller *phb,
                                 struct iommu_table *tbl)
 {
        struct device_node *node;
-       unsigned long *basep;
-       unsigned int *sizep;
+       const unsigned long *basep, *sizep;
 
        node = (struct device_node *)phb->arch_data;
 
-       basep = (unsigned long *)get_property(node, "linux,tce-base", NULL);
-       sizep = (unsigned int *)get_property(node, "linux,tce-size", NULL);
+       basep = get_property(node, "linux,tce-base", NULL);
+       sizep = get_property(node, "linux,tce-size", NULL);
        if (basep == NULL || sizep == NULL) {
                printk(KERN_ERR "PCI_DMA: iommu_table_setparms: %s has "
                                "missing tce entries !\n", dn->full_name);
@@ -315,7 +314,7 @@ static void iommu_table_setparms(struct pci_controller *phb,
 static void iommu_table_setparms_lpar(struct pci_controller *phb,
                                      struct device_node *dn,
                                      struct iommu_table *tbl,
-                                     unsigned char *dma_window)
+                                     const void *dma_window)
 {
        unsigned long offset, size;
 
@@ -415,7 +414,7 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus)
        struct iommu_table *tbl;
        struct device_node *dn, *pdn;
        struct pci_dn *ppci;
-       unsigned char *dma_window = NULL;
+       const void *dma_window = NULL;
 
        DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self);
 
@@ -519,7 +518,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev)
 {
        struct device_node *pdn, *dn;
        struct iommu_table *tbl;
-       unsigned char *dma_window = NULL;
+       const void *dma_window = NULL;
        struct pci_dn *pci;
 
        DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, pci_name(dev));
index 3aeb406..1820a0b 100644 (file)
 #define DBG_LOW(fmt...) do { } while(0)
 #endif
 
-/* in pSeries_hvCall.S */
+/* in hvCall.S */
 EXPORT_SYMBOL(plpar_hcall);
-EXPORT_SYMBOL(plpar_hcall_4out);
+EXPORT_SYMBOL(plpar_hcall9);
 EXPORT_SYMBOL(plpar_hcall_norets);
-EXPORT_SYMBOL(plpar_hcall_8arg_2ret);
-EXPORT_SYMBOL(plpar_hcall_7arg_7ret);
-EXPORT_SYMBOL(plpar_hcall_9arg_9ret);
+
 extern void pSeries_find_serial_port(void);
 
 
@@ -204,20 +202,20 @@ void __init udbg_init_debug_lpar(void)
 void __init find_udbg_vterm(void)
 {
        struct device_node *stdout_node;
-       u32 *termno;
-       char *name;
+       const u32 *termno;
+       const char *name;
        int add_console;
 
        /* find the boot console from /chosen/stdout */
        if (!of_chosen)
                return;
-       name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
+       name = get_property(of_chosen, "linux,stdout-path", NULL);
        if (name == NULL)
                return;
        stdout_node = of_find_node_by_path(name);
        if (!stdout_node)
                return;
-       name = (char *)get_property(stdout_node, "name", NULL);
+       name = get_property(stdout_node, "name", NULL);
        if (!name) {
                printk(KERN_WARNING "stdout node missing 'name' property!\n");
                goto out;
@@ -228,7 +226,7 @@ void __init find_udbg_vterm(void)
        /* Check if it's a virtual terminal */
        if (strncmp(name, "vty", 3) != 0)
                goto out;
-       termno = (u32 *)get_property(stdout_node, "reg", NULL);
+       termno = get_property(stdout_node, "reg", NULL);
        if (termno == NULL)
                goto out;
        vtermno = termno[0];
@@ -254,18 +252,34 @@ out:
 void vpa_init(int cpu)
 {
        int hwcpu = get_hard_smp_processor_id(cpu);
-       unsigned long vpa = __pa(&lppaca[cpu]);
+       unsigned long addr;
        long ret;
 
        if (cpu_has_feature(CPU_FTR_ALTIVEC))
                lppaca[cpu].vmxregs_in_use = 1;
 
-       ret = register_vpa(hwcpu, vpa);
+       addr = __pa(&lppaca[cpu]);
+       ret = register_vpa(hwcpu, addr);
 
-       if (ret)
+       if (ret) {
                printk(KERN_ERR "WARNING: vpa_init: VPA registration for "
                                "cpu %d (hw %d) of area %lx returns %ld\n",
-                               cpu, hwcpu, vpa, ret);
+                               cpu, hwcpu, addr, ret);
+               return;
+       }
+       /*
+        * PAPR says this feature is SLB-Buffer but firmware never
+        * reports that.  All SPLPAR support SLB shadow buffer.
+        */
+       addr = __pa(&slb_shadow[cpu]);
+       if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
+               ret = register_slb_shadow(hwcpu, addr);
+               if (ret)
+                       printk(KERN_ERR
+                              "WARNING: vpa_init: SLB shadow buffer "
+                              "registration for cpu %d (hw %d) of area %lx "
+                              "returns %ld\n", cpu, hwcpu, addr, ret);
+       }
 }
 
 long pSeries_lpar_hpte_insert(unsigned long hpte_group,
@@ -277,7 +291,6 @@ long pSeries_lpar_hpte_insert(unsigned long hpte_group,
        unsigned long flags;
        unsigned long slot;
        unsigned long hpte_v, hpte_r;
-       unsigned long dummy0, dummy1;
 
        if (!(vflags & HPTE_V_BOLTED))
                DBG_LOW("hpte_insert(group=%lx, va=%016lx, pa=%016lx, "
@@ -302,8 +315,7 @@ long pSeries_lpar_hpte_insert(unsigned long hpte_group,
        if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE))
                hpte_r &= ~_PAGE_COHERENT;
 
-       lpar_rc = plpar_hcall(H_ENTER, flags, hpte_group, hpte_v,
-                             hpte_r, &slot, &dummy0, &dummy1);
+       lpar_rc = plpar_pte_enter(flags, hpte_group, hpte_v, hpte_r, &slot);
        if (unlikely(lpar_rc == H_PTEG_FULL)) {
                if (!(vflags & HPTE_V_BOLTED))
                        DBG_LOW(" full\n");
index 18abfb1..64163ce 100644 (file)
@@ -123,13 +123,14 @@ static ssize_t pSeries_nvram_get_size(void)
 int __init pSeries_nvram_init(void)
 {
        struct device_node *nvram;
-       unsigned int *nbytes_p, proplen;
+       const unsigned int *nbytes_p;
+       unsigned int proplen;
 
        nvram = of_find_node_by_type(NULL, "nvram");
        if (nvram == NULL)
                return -ENODEV;
 
-       nbytes_p = (unsigned int *)get_property(nvram, "#bytes", &proplen);
+       nbytes_p = get_property(nvram, "#bytes", &proplen);
        if (nbytes_p == NULL || proplen != sizeof(unsigned int))
                return -EIO;
 
index e97e67f..410a6bc 100644 (file)
@@ -60,7 +60,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_name_device);
 static void __devinit check_s7a(void)
 {
        struct device_node *root;
-       char *model;
+       const char *model;
 
        s7a_workaround = 0;
        root = of_find_node_by_path("/");
index 3bd1b3e..3eb7b29 100644 (file)
@@ -5,20 +5,17 @@
 
 static inline long poll_pending(void)
 {
-       unsigned long dummy;
-       return plpar_hcall(H_POLL_PENDING, 0, 0, 0, 0, &dummy, &dummy, &dummy);
+       return plpar_hcall_norets(H_POLL_PENDING);
 }
 
 static inline long prod_processor(void)
 {
-       plpar_hcall_norets(H_PROD);
-       return 0;
+       return plpar_hcall_norets(H_PROD);
 }
 
 static inline long cede_processor(void)
 {
-       plpar_hcall_norets(H_CEDE);
-       return 0;
+       return plpar_hcall_norets(H_CEDE);
 }
 
 static inline long vpa_call(unsigned long flags, unsigned long cpu,