* Re: [PATCH 1/3] POWERPC: Added devicetree for mpc8272ads board
From: Kumar Gala @ 2006-09-22 4:55 UTC (permalink / raw)
To: Vitaly Bordug; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <20060922024827.27185.39986.stgit@localhost.localdomain>
On Sep 21, 2006, at 9:48 PM, Vitaly Bordug wrote:
>
> This adds current dts file used with MPC8272ADS,
> introducing new mdio bitbang defines, as well as
> fully-CPM2-SoC board design.
>
> Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
> ---
>
> arch/powerpc/boot/dts/mpc8272ads.dts | 236 +++++++++++++++++++++++
> +++++++++++
> 1 files changed, 236 insertions(+), 0 deletions(-)
>
> diff --git a/arch/powerpc/boot/dts/mpc8272ads.dts b/arch/powerpc/
> boot/dts/mpc8272ads.dts
> new file mode 100644
> index 0000000..6d72b7d
> --- /dev/null
> +++ b/arch/powerpc/boot/dts/mpc8272ads.dts
> @@ -0,0 +1,236 @@
> +/*
> + * MPC8272 ADS Device Tree Source
> + *
> + * Copyright 2005 Freescale Semiconductor Inc.
> + *
> + * This program is free software; you can redistribute it and/or
> modify it
> + * under the terms of the GNU General Public License as
> published by the
> + * Free Software Foundation; either version 2 of the License, or
> (at your
> + * option) any later version.
> + */
> +
> +
> +/*
> +/memreserve/ 00000000 4000000;
> +*/
Is this needed?
> +
> +/ {
> + model = "MPC8272ADS";
> + compatible = "MPC8260ADS";
> + #address-cells = <1>;
> + #size-cells = <1>;
> + linux,phandle = <100>;
> +
> + cpus {
> + #cpus = <1>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> + linux,phandle = <200>;
> +
> + PowerPC,8272@0 {
> + device_type = "cpu";
> + reg = <0>;
> + d-cache-line-size = <20>; // 32 bytes
> + i-cache-line-size = <20>; // 32 bytes
> + d-cache-size = <4000>; // L1, 16K
> + i-cache-size = <4000>; // L1, 16K
> + timebase-frequency = <17d7840>;
> + bus-frequency = <5f5e100>;
> + clock-frequency = <17D78400>;
Are the freq's really fixed? if not having these values as 0, maybe
be better.
> + 32-bit;
> + linux,phandle = <201>;
> + linux,boot-cpu;
> + };
> + };
> +
> + interrupt-controller@f8200000 {
> + linux,phandle = <f8200000>;
> + #address-cells = <0>;
> + #interrupt-cells = <2>;
> + interrupt-controller;
> + reg = <f8200000 f8200004>;
> + built-in;
> + device_type = "pci-pic";
> + };
> + memory {
> + device_type = "memory";
> + linux,phandle = <300>;
> + reg = <00000000 4000000 f4500000 00000020>;
> + };
> +
> + chosen {
> + name = "chosen";
> + bootargs = "root=/dev/nfs rw ip=on";
Seems bad form to put bootargs in the .dts directly like this.
> + linux,stdout-path = "/dev/ttyCPM0";
I thought this was the 'of' path, not a dev path.
> + linux,platform = <0>;
> + interrupt-controller = <10c00>;
> + linux,phandle = <400>;
> + };
> +
> + soc8272@f0000000 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + #interrupt-cells = <2>;
> + device_type = "soc";
> + ranges = < 0 0 2 00000000 f0000000 00053000>;
> + reg = <f0000000 0>;
> +
> + mdio@0 {
> + device_type = "mdio";
> + compatible = "fs_enet";
> + reg = <0 0>;
> + linux,phandle = <24520>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> + ethernet-phy@0 {
> + linux,phandle = <2452000>;
> + interrupt-parent = <10c00>;
> + interrupts = <19 1>;
> + reg = <0>;
> + bitbang = [ 12 12 13 02 02 01 ];
> + device_type = "ethernet-phy";
> + };
> + ethernet-phy@1 {
> + linux,phandle = <2452001>;
> + interrupt-parent = <10c00>;
> + interrupts = <19 1>;
> + bitbang = [ 12 12 13 02 02 01 ];
> + reg = <3>;
> + device_type = "ethernet-phy";
> + };
> + };
> +
> + ethernet@24000 {
> + #address-cells = <1>;
> + #size-cells = <0>;
> + device_type = "network";
> + device-id = <2>;
> + compatible = "fs_enet";
> + model = "FCC";
> + reg = <11300 20 8400 100 11380 30>;
> + mac-address = [ 00 11 2F 99 43 54 ];
> + interrupts = <20 2>;
> + interrupt-parent = <10c00>;
> + phy-handle = <2452000>;
> + rx-clock = <13>;
> + tx-clock = <12>;
> + };
> +
> + ethernet@25000 {
> + device_type = "network";
> + device-id = <3>;
> + compatible = "fs_enet";
> + model = "FCC";
> + reg = <11320 20 8500 100 113b0 30>;
> + mac-address = [ 00 11 2F 99 44 54 ];
> + interrupts = <21 2>;
> + interrupt-parent = <10c00>;
> + phy-handle = <2452001>;
> + rx-clock = <17>;
> + tx-clock = <18>;
> + };
> +
> + cpm@f0000000 {
> + linux,phandle = <f0000000>;
> + #address-cells = <1>;
> + #size-cells = <1>;
> + #interrupt-cells = <2>;
> + device_type = "cpm";
> + model = "CPM2";
> + ranges = <00000000 00000000 3ffff>;
> + reg = <10d80 3280>;
> + command-proc = <119c0>;
> + brg-frequency = <17D7840>;
> + cpm_clk = <BEBC200>;
> +
> + scc@11a00 {
> + device_type = "serial";
> + compatible = "cpm_uart";
> + model = "SCC";
> + device-id = <2>;
> + reg = <11a00 20 8000 100>;
> + current-speed = <1c200>;
> + interrupts = <28 2>;
> + interrupt-parent = <10c00>;
> + clock-setup = <0 00ffffff>;
> + rx-clock = <1>;
> + tx-clock = <1>;
> + };
> +
> + scc@11a60 {
> + device_type = "serial";
> + compatible = "cpm_uart";
> + model = "SCC";
> + device-id = <5>;
> + reg = <11a60 20 8300 100>;
> + current-speed = <1c200>;
> + interrupts = <2b 2>;
> + interrupt-parent = <10c00>;
> + clock-setup = <1b ffffff00>;
> + rx-clock = <4>;
> + tx-clock = <4>;
> + };
> +
> + };
> + interrupt-controller@10c00 {
> + linux,phandle = <10c00>;
> + #address-cells = <0>;
> + #interrupt-cells = <2>;
> + interrupt-controller;
> + reg = <10c00 80>;
> + built-in;
> + device_type = "cpm-pic";
> + };
Do we need to distinguish cpm2-pic from cpm-pic (8xx)?
> + pci@0500 {
> + linux,phandle = <0500>;
> + #interrupt-cells = <1>;
> + #size-cells = <2>;
> + #address-cells = <3>;
> + compatible = "8272";
> + device_type = "pci";
> + reg = <10430 4dc>;
> + clock-frequency = <3f940aa>;
> + interrupt-map-mask = <f800 0 0 7>;
> + interrupt-map = <
> +
> + /* IDSEL 0x16 */
> + b000 0 0 1 f8200000 40 0
> + b000 0 0 2 f8200000 41 0
> + b000 0 0 3 f8200000 42 0
> + b000 0 0 4 f8200000 43 0
> +
> + /* IDSEL 0x17 */
> + b800 0 0 1 f8200000 43 0
> + b800 0 0 2 f8200000 40 0
> + b800 0 0 3 f8200000 41 0
> + b800 0 0 4 f8200000 42 0
> +
> + /* IDSEL 0x18 */
> + c000 0 0 1 f8200000 42 0
> + c000 0 0 2 f8200000 43 0
> + c000 0 0 3 f8200000 40 0
> + c000 0 0 4 f8200000 41 0>;
> + interrupt-parent = <10c00>;
> + interrupts = <14 3>;
> + bus-range = <0 0>;
> + ranges = <02000000 0 80000000 80000000 0
> 40000000
> + 01000000 0 00000000 f6000000 0
> 02000000>;
> + };
> +
> +/* May need to remove if on a part without crypto engine */
> + crypto@30000 {
> + device_type = "crypto";
> + model = "SEC2";
> + compatible = "talitos";
> + reg = <30000 10000>;
> + interrupts = <b 0>;
> + interrupt-parent = <10c00>;
> + num-channels = <4>;
> + channel-fifo-len = <18>;
> + exec-units-mask = <0000007e>;
> +/* desc mask is for rev1.x, we need runtime fixup for >=2.x */
> + descriptor-types-mask = <01010ebf>;
> + };
> +
> + };
> +};
^ permalink raw reply
* Re: [PATCH 0/11] Add support for QE and 8360EMDS board
From: Kumar Gala @ 2006-09-22 5:01 UTC (permalink / raw)
To: Li Yang; +Cc: linuxppc-dev
In-Reply-To: <451282DA.2080508@freescale.com>
On Sep 21, 2006, at 7:17 AM, Li Yang wrote:
> The series of patches add generic QE infrastructure called
> qe_lib, and MPC8360EMDS board support. Qe_lib is used by
> QE device drivers such as ucc_geth driver.
>
> This version updates QE interrupt controller to use new irq
> mapping mechanism ,addresses all the comments received with
> last submission and includes some style fixes.
Wasn't there a patch for the docs that described the QE additions to
the flat dev tree?
- k
^ permalink raw reply
* Re: Linux not booting consistantly
From: Stefan Roese @ 2006-09-22 4:50 UTC (permalink / raw)
To: linuxppc-embedded
In-Reply-To: <20060922010445.20750.qmail@web33408.mail.mud.yahoo.com>
Hi Jeff,
On Friday 22 September 2006 03:04, Jeff Stevens wrote:
> ## Booting image at 00200000 ...
> Image Name: Linux-2.6.15
> Image Type: PowerPC Linux Kernel Image (gzip
> compressed)
> Data Size: 1067371 Bytes = 1 MB
> Load Address: 00000000
> Entry Point: 00000000
> Verifying Checksum ... OK
> Uncompressing Kernel Image ... OK
>
> Could this be a memory issue (i.e. bad memory
> configuration)? Though, if it were a memory issue,
> wouldn't the kernel fail to uncompress successfully?
No, not necessarily. U-Boot normally hasn't D-cache enabled on 440 platforms,
so while uncompressing the kernel no bursts are generated to the SDRAM. And
with the bursts the "real fun" begins. ;-)
So, yes: I also think you have a memory problem.
> Does anyone have any ideas why it would work about
> once every 10 - 20 resets?
Did you try to analyze where it crashes?
http://www.denx.de/wiki/view/DULG/LinuxPostMortemAnalysis
Best regards,
Stefan
^ permalink raw reply
* RE: [PATCH 4/11] qe_lib: Add QE I/O ports API
From: Li Yang-r58472 @ 2006-09-22 6:29 UTC (permalink / raw)
To: Vitaly Bordug, Joakim Tjernlund; +Cc: linuxppc-dev
In-Reply-To: <20060921192137.5c6af005@vitb.ru.mvista.com>
> -----Original Message-----
> From: Vitaly Bordug [mailto:vbordug@ru.mvista.com]
> Sent: Thursday, September 21, 2006 11:22 PM
> To: Joakim Tjernlund
> Cc: Li Yang-r58472; linuxppc-dev@ozlabs.org
> Subject: Re: [PATCH 4/11] qe_lib: Add QE I/O ports API
>=20
> On Thu, 21 Sep 2006 16:52:14 +0200
> "Joakim Tjernlund" <joakim.tjernlund@transmode.se> wrote:
>=20
> > Hi Leo
> >
> > As you know I working with your earlier patches, trying to adopt
them
> > for
> > 8321. Everthing works but ethernet on UCC2 and UCC4, ethernet on
UCC3
> > works though.
> >
> > Anyhow I found some minor changes I had to do to match 8321 that is
> > generic 83xx code.
> > Below is the first:
> > > ---
> > > arch/powerpc/sysdev/qe_lib/qe_io.c | 272
> > > +#define NUM_OF_PAR_IOS 7
> >
> > NUM_OF_PAR_IOS is 4 on 8321
> >
> > > +static int qe_irq_ports[NUM_OF_PAR_IOS][NUM_OF_PINS] =3D {
> > > + /* 0-7 */ /* 8-15 */ /* 16 - 23 */ /*
> > > 24 - 31 */
> > > + {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,
> > > 0,0,0,0,0,1,1,0},
> > > + {0,0,0,1,0,1,0,0, 0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,0,
> > > 0,0,1,1,0,0,0,0},
> > > + {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
> > > 0,0,0,1,1,1,0,0},
> > > + {0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0, 1,1,0,0,0,0,0,0,
> > > 0,0,1,1,0,0,0,0},
> > > + {0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,0,
> > > 1,1,1,1,0,0,0,1},
> > > + {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,
> > > 0,0,0,0,0,0,0,0},
> > > + {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
> > > 0,0,0,0,0,0,0,1}
> > > +};
> >
> > qe_irq_ports is diffrent on 8321 not only the number of rows.
> >
> > These needs to configuruable based on CPU model and/or type of
board.
> >
>=20
> Well, eventually this stuff aims to serve not 83xx/qe, but for
cpm(1,2)-equipped
> stuff
> too. Apparently, we'll have to do something wise to afford that...
>=20
> OTOH, this is good as a starting point I guess.
I agree. I will remove the I/O port interrupt stuff for now. Anyway,
it is not used by any code in kernel for now.
- Leo
^ permalink raw reply
* Please pull powerpc.git 'master' branch
From: Paul Mackerras @ 2006-09-22 6:39 UTC (permalink / raw)
To: torvalds; +Cc: linuxppc-dev
Linus,
Please do:
git pull \
git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc.git
to get a PowerPC update for 2.6.19-rc1.
Thanks,
Paul.
MAINTAINERS | 7
arch/powerpc/Kconfig | 14
arch/powerpc/Kconfig.debug | 16 +
arch/powerpc/boot/Makefile | 7
arch/powerpc/boot/dts/mpc8349emds.dts | 16 -
arch/powerpc/boot/flatdevtree.h | 46 ++
arch/powerpc/boot/main.c | 250 +++++----
arch/powerpc/boot/of.c | 283 ++++++++++
arch/powerpc/boot/ops.h | 100 ++++
arch/powerpc/boot/prom.c | 165 ------
arch/powerpc/boot/prom.h | 41 -
arch/powerpc/boot/stdio.c | 4
arch/powerpc/boot/stdio.h | 8
arch/powerpc/boot/types.h | 23 +
arch/powerpc/configs/maple_defconfig | 2
arch/powerpc/kernel/Makefile | 4
arch/powerpc/kernel/asm-offsets.c | 17 +
arch/powerpc/kernel/btext.c | 24 -
arch/powerpc/kernel/cpu_setup_ppc970.S | 103 +---
arch/powerpc/kernel/cputable.c | 21 +
arch/powerpc/kernel/crash_dump.c | 2
arch/powerpc/kernel/dma_64.c | 65 +-
arch/powerpc/kernel/entry_64.S | 8
arch/powerpc/kernel/head_64.S | 54 +-
arch/powerpc/kernel/ibmebus.c | 6
arch/powerpc/kernel/io.c | 131 +++++
arch/powerpc/kernel/irq.c | 5
arch/powerpc/kernel/legacy_serial.c | 35 +
arch/powerpc/kernel/lparcfg.c | 30 +
arch/powerpc/kernel/machine_kexec_64.c | 10
arch/powerpc/kernel/misc.S | 159 ------
arch/powerpc/kernel/of_device.c | 24 -
arch/powerpc/kernel/paca.c | 15 -
arch/powerpc/kernel/pci_32.c | 39 +
arch/powerpc/kernel/pci_64.c | 67 +-
arch/powerpc/kernel/pci_dn.c | 13
arch/powerpc/kernel/ppc_ksyms.c | 19 -
arch/powerpc/kernel/prom.c | 44 --
arch/powerpc/kernel/prom_init.c | 10
arch/powerpc/kernel/prom_parse.c | 90 ++-
arch/powerpc/kernel/rtas-proc.c | 25 -
arch/powerpc/kernel/rtas.c | 47 +-
arch/powerpc/kernel/rtas_pci.c | 28 -
arch/powerpc/kernel/setup-common.c | 32 +
arch/powerpc/kernel/setup_64.c | 23 -
arch/powerpc/kernel/sysfs.c | 9
arch/powerpc/kernel/time.c | 8
arch/powerpc/kernel/traps.c | 25 +
arch/powerpc/kernel/vio.c | 16 -
arch/powerpc/lib/Makefile | 1
arch/powerpc/lib/e2a.c | 116 ----
arch/powerpc/lib/locks.c | 27 -
arch/powerpc/mm/numa.c | 31 -
arch/powerpc/mm/slb.c | 37 +
arch/powerpc/mm/tlb_64.c | 1
arch/powerpc/platforms/83xx/mpc834x_itx.c | 4
arch/powerpc/platforms/83xx/mpc834x_sys.c | 4
arch/powerpc/platforms/83xx/pci.c | 4
arch/powerpc/platforms/85xx/mpc85xx_ads.c | 4
arch/powerpc/platforms/85xx/mpc85xx_cds.c | 4
arch/powerpc/platforms/85xx/pci.c | 4
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c | 4
arch/powerpc/platforms/86xx/pci.c | 4
arch/powerpc/platforms/Makefile | 1
arch/powerpc/platforms/cell/cbe_regs.c | 8
arch/powerpc/platforms/cell/interrupt.c | 25 -
arch/powerpc/platforms/cell/iommu.c | 22 -
arch/powerpc/platforms/cell/setup.c | 4
arch/powerpc/platforms/cell/smp.c | 4
arch/powerpc/platforms/cell/spider-pic.c | 10
arch/powerpc/platforms/cell/spu_base.c | 18 -
arch/powerpc/platforms/chrp/nvram.c | 5
arch/powerpc/platforms/chrp/pci.c | 53 ++
arch/powerpc/platforms/chrp/setup.c | 48 +-
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c | 8
arch/powerpc/platforms/iseries/Kconfig | 8
arch/powerpc/platforms/iseries/dt.c | 45 +-
arch/powerpc/platforms/iseries/hvlpconfig.c | 13
arch/powerpc/platforms/iseries/iommu.c | 19 +
arch/powerpc/platforms/iseries/it_exp_vpd_panel.h | 6
arch/powerpc/platforms/iseries/it_lp_naca.h | 6
arch/powerpc/platforms/iseries/lpardata.c | 6
arch/powerpc/platforms/iseries/lpevents.c | 2
arch/powerpc/platforms/iseries/main_store.h | 126 ++--
arch/powerpc/platforms/iseries/pci.c | 289 ++++++++--
arch/powerpc/platforms/iseries/setup.c | 1
arch/powerpc/platforms/iseries/viopath.c | 28 +
arch/powerpc/platforms/iseries/vpdinfo.c | 22 -
arch/powerpc/platforms/maple/pci.c | 70 +-
arch/powerpc/platforms/maple/setup.c | 27 -
arch/powerpc/platforms/pasemi/Makefile | 1
arch/powerpc/platforms/pasemi/pasemi.h | 8
arch/powerpc/platforms/pasemi/pci.c | 198 +++++++
arch/powerpc/platforms/pasemi/setup.c | 188 +++++++
arch/powerpc/platforms/pasemi/time.c | 29 +
arch/powerpc/platforms/powermac/backlight.c | 3
arch/powerpc/platforms/powermac/cpufreq_32.c | 23 -
arch/powerpc/platforms/powermac/cpufreq_64.c | 27 -
arch/powerpc/platforms/powermac/feature.c | 30 +
arch/powerpc/platforms/powermac/low_i2c.c | 24 -
arch/powerpc/platforms/powermac/pci.c | 37 +
arch/powerpc/platforms/powermac/pfunc_base.c | 2
arch/powerpc/platforms/powermac/pfunc_core.c | 5
arch/powerpc/platforms/powermac/setup.c | 18 -
arch/powerpc/platforms/powermac/smp.c | 7
arch/powerpc/platforms/powermac/udbg_scc.c | 10
arch/powerpc/platforms/pseries/Makefile | 1
arch/powerpc/platforms/pseries/eeh.c | 96 +++
arch/powerpc/platforms/pseries/eeh_cache.c | 17 -
arch/powerpc/platforms/pseries/eeh_driver.c | 112 +++-
arch/powerpc/platforms/pseries/eeh_event.c | 4
arch/powerpc/platforms/pseries/firmware.c | 2
arch/powerpc/platforms/pseries/hvCall.S | 273 ++++------
arch/powerpc/platforms/pseries/hvCall_inst.c | 129 +++++
arch/powerpc/platforms/pseries/hvconsole.c | 5
arch/powerpc/platforms/pseries/iommu.c | 13
arch/powerpc/platforms/pseries/lpar.c | 46 +-
arch/powerpc/platforms/pseries/nvram.c | 5
arch/powerpc/platforms/pseries/pci.c | 2
arch/powerpc/platforms/pseries/plpar_wrappers.h | 107 +++-
arch/powerpc/platforms/pseries/ras.c | 4
arch/powerpc/platforms/pseries/rtasd.c | 4
arch/powerpc/platforms/pseries/setup.c | 42 +
arch/powerpc/platforms/pseries/smp.c | 12
arch/powerpc/platforms/pseries/xics.c | 44 --
arch/powerpc/sysdev/fsl_soc.c | 28 -
arch/powerpc/sysdev/fsl_soc.h | 2
arch/powerpc/sysdev/i8259.c | 2
arch/powerpc/sysdev/ipic.c | 42 +
arch/powerpc/sysdev/mmio_nvram.c | 4
arch/powerpc/sysdev/tsi108_pci.c | 4
arch/powerpc/xmon/xmon.c | 10
arch/ppc/Kconfig | 6
arch/ppc/kernel/misc.S | 88 ---
arch/ppc/kernel/ppc_ksyms.c | 9
arch/ppc/kernel/setup.c | 17 -
arch/ppc/platforms/85xx/sbc8560.h | 1
arch/ppc/platforms/85xx/sbc85xx.h | 18 +
arch/ppc/syslib/m8260_pci_erratum9.c | 16 -
arch/ppc/xmon/start.c | 28 +
arch/ppc/xmon/xmon.c | 28 +
drivers/char/Kconfig | 22 +
drivers/char/Makefile | 2
drivers/char/agp/uninorth-agp.c | 4
drivers/char/briq_panel.c | 268 +++++++++
drivers/char/hvc_console.c | 18 -
drivers/char/hvc_console.h | 2
drivers/char/hvc_iseries.c | 594 +++++++++++++++++++++
drivers/char/hvc_rtas.c | 2
drivers/char/hvc_vio.c | 7
drivers/char/hvsi.c | 7
drivers/char/tpm/tpm_atmel.h | 4
drivers/char/viocons.c | 31 -
drivers/char/viotape.c | 6
drivers/i2c/busses/i2c-powermac.c | 3
drivers/ide/ppc/pmac.c | 8
drivers/macintosh/macio_asic.c | 10
drivers/macintosh/macio_sysfs.c | 8
drivers/macintosh/smu.c | 19 -
drivers/macintosh/therm_adt746x.c | 8
drivers/macintosh/therm_pm72.c | 14
drivers/macintosh/therm_windtunnel.c | 4
drivers/macintosh/via-cuda.c | 4
drivers/macintosh/via-pmu-led.c | 2
drivers/macintosh/via-pmu.c | 10
drivers/macintosh/windfarm_pm81.c | 4
drivers/macintosh/windfarm_pm91.c | 2
drivers/macintosh/windfarm_smu_controls.c | 13
drivers/macintosh/windfarm_smu_sat.c | 8
drivers/macintosh/windfarm_smu_sensors.c | 12
drivers/net/bmac.c | 13
drivers/net/ibmveth.c | 3
drivers/net/ibmveth.h | 27 +
drivers/net/mace.c | 2
drivers/net/spider_net.c | 12
drivers/net/sungem.c | 2
drivers/pci/hotplug/rpaphp_core.c | 32 +
drivers/scsi/ibmvscsi/rpa_vscsi.c | 11
drivers/scsi/mac53c94.c | 2
drivers/scsi/mesh.c | 5
drivers/scsi/sata_svw.c | 2
drivers/serial/pmac_zilog.c | 9
drivers/video/S3triofb.c | 12
drivers/video/aty/radeon_base.c | 8
drivers/video/aty/radeon_monitor.c | 12
drivers/video/aty/radeon_pm.c | 4
drivers/video/nvidia/nv_of.c | 12
drivers/video/offb.c | 22 -
drivers/video/riva/fbdev.c | 5
include/asm-powerpc/cputable.h | 27 +
include/asm-powerpc/hvcall.h | 121 +---
include/asm-powerpc/ibmebus.h | 2
include/asm-powerpc/ide.h | 12
include/asm-powerpc/io.h | 183 +++---
include/asm-powerpc/irq.h | 24 -
include/asm-powerpc/iseries/hv_call_xm.h | 17 -
include/asm-powerpc/iseries/hv_lp_config.h | 13
include/asm-powerpc/iseries/iseries_io.h | 60 --
include/asm-powerpc/iseries/it_lp_queue.h | 2
include/asm-powerpc/iseries/vio.h | 28 +
include/asm-powerpc/lppaca.h | 23 +
include/asm-powerpc/paca.h | 3
include/asm-powerpc/page.h | 6
include/asm-powerpc/ppc-pci.h | 11
include/asm-powerpc/processor.h | 1
include/asm-powerpc/prom.h | 40 +
include/asm-powerpc/ptrace.h | 4
include/asm-powerpc/reg.h | 1
include/asm-powerpc/rtas.h | 16 +
include/asm-powerpc/smu.h | 2
include/asm-powerpc/spu.h | 2
include/asm-powerpc/system.h | 5
include/asm-powerpc/vio.h | 4
include/asm-ppc/io.h | 26 -
include/asm-ppc/mpc8260_pci9.h | 4
include/asm-ppc/reg_booke.h | 16 -
scripts/checkstack.pl | 2
sound/aoa/core/snd-aoa-gpio-feature.c | 2
sound/oss/dmasound/dmasound_awacs.c | 11
sound/ppc/tumbler.c | 15 -
220 files changed, 4503 insertions(+), 2611 deletions(-)
create mode 100644 arch/powerpc/boot/flatdevtree.h
create mode 100644 arch/powerpc/boot/of.c
create mode 100644 arch/powerpc/boot/ops.h
delete mode 100644 arch/powerpc/boot/prom.c
delete mode 100644 arch/powerpc/boot/prom.h
create mode 100644 arch/powerpc/boot/types.h
rename arch/powerpc/kernel/{cpu_setup_power4.S => cpu_setup_ppc970.S} (74%)
create mode 100644 arch/powerpc/kernel/io.c
delete mode 100644 arch/powerpc/lib/e2a.c
rename include/asm-powerpc/iseries/it_exp_vpd_panel.h => arch/powerpc/platforms/iseries/it_exp_vpd_panel.h (90%)
rename include/asm-powerpc/iseries/it_lp_naca.h => arch/powerpc/platforms/iseries/it_lp_naca.h (96%)
create mode 100644 arch/powerpc/platforms/pasemi/Makefile
create mode 100644 arch/powerpc/platforms/pasemi/pasemi.h
create mode 100644 arch/powerpc/platforms/pasemi/pci.c
create mode 100644 arch/powerpc/platforms/pasemi/setup.c
create mode 100644 arch/powerpc/platforms/pasemi/time.c
create mode 100644 arch/powerpc/platforms/pseries/hvCall_inst.c
create mode 100644 drivers/char/briq_panel.c
create mode 100644 drivers/char/hvc_iseries.c
delete mode 100644 include/asm-powerpc/iseries/iseries_io.h
Amos Waterland:
[POWERPC] Turn on tigon3 support in maple_defconfig
Amy Fong:
[POWERPC] Fix compile error in sbc8560
Andrew Morton:
[POWERPC] briq_panel Kconfig fix
Anton Blanchard:
[POWERPC] clean up pseries hcall interfaces
Arnd Bergmann:
[POWERPC] powerpc: fix building gdb against asm/ptrace.h
Benjamin Herrenschmidt:
[POWERPC] Workaround Pegasos incorrect ISA "ranges"
[POWERPC] Fix 32 bits warning in prom_init.c
[POWERPC] Fix non-MPIC CHRPs with CONFIG_SMP set
[POWERPC] Fix default clock for udbg_16550
[POWERPC] Fix legacy_serial.c error handling on 32 bits
[POWERPC] Add briq support to CHRP
[POWERPC] Add support for briq front panel
[POWERPC] More offb/bootx fixes
[POWERPC] Xserve G5 thermal control fixes
[POWERPC] Add cpufreq support for Xserve G5
[POWERPC] Fix ohare IDE irq workaround on old powermacs
Corey Minyard:
[POWERPC] Make function of pm_power_off consistent with x86
David Howells:
[POWERPC] Export copy_4K_page()
Geoff Levand:
[POWERPC] cell: interrupt.c whitespace clean up
Jake Moilanen:
[POWERPC] Export msi symbols
Jeremy Kerr:
[POWERPC] Remove linux,device properties
[POWERPC] Use const qualifiers for prom parsing utilites
[POWERPC] Remove linux,pci-domain properties
[POWERPC] Constify & voidify get_property()
[POWERPC] pseries: Constify & voidify get_property()
[POWERPC] iseries: Constify & voidify get_property()
[POWERPC] mpc: Constify & voidify get_property()
[POWERPC] cell: Constify & voidify get_property()
[POWERPC] chrp: Constify & voidify get_property()
[POWERPC] maple: Constify & voidify get_property()
[POWERPC] powermac: Constify & voidify get_property()
[POWERPC] video & agp: Constify & voidify get_property()
[POWERPC] scsi: Constify & voidify get_property()
[POWERPC] netdevices: Constify & voidify get_property()
[POWERPC] sound: Constify & voidify get_property()
[POWERPC] tmp_atmel: Constify & voidify get_property()
[POWERPC] sata_svw: Constify & voidify get_property()
[POWERPC] tsi108: Constify & voidify get_property()
[POWERPC] Make get_property() return a const void *
[POWERPC] Simplify dma_ops bug conditions
Johannes Berg:
[POWERPC] fix up front-LED Kconfig
[POWERPC] make checkstack work with ARCH=powerpc
Jon Loeliger:
[POWERPC] Rewrite the PPC 86xx IRQ handling to use Flat Device Tree
[POWERPC] Add MPC8641 HPCN Device Tree Source file.
[POWERPC] Allow MPC8641 HPCN to build with CONFIG_PCI disabled too.
Josh Boyer:
[POWERPC] PPC 4xx: Enable XMON on PPC 4xx boards
[POWERPC] PPC: Fix Kconfig whitespace warnings
[POWERPC] PPC: Fix xmon stack frame address in backtrace
[POWERPC] 40x: Fix debug status register defines
Kim Phillips:
[POWERPC] Fix MPC8349EMDS dts PCI interrupt-map values for IDSEL 0x18
Linas Vepstas:
[POWERPC] EEH: balance pcidev_get/put calls
[POWERPC] EEH: code comment cleanup
[POWERPC] EEH: enable MMIO/DMA on frozen slot
[POWERPC] EEH: support MMIO enable recovery step
[POWERPC] EEH: Power4 systems sometimes need multiple resets.
Mark A. Greer:
[POWERPC] Start arch/powerpc/boot code reorganization
Matt Porter:
[POWERPC] Remove flush_dcache_all export
[POWERPC] Fix powerpc 44x_mmu build
Michael Ellerman:
[POWERPC] Fix mem= handling when the memory limit is > RMO size
[POWERPC] iseries: Use device tree /system-id in /proc/iSeries/config
[POWERPC] iseries: Move e2a()/strne2a() into their only caller
[POWERPC] iseries: Cleanup e2a() and strne2a()
[POWERPC] iseries: Make ItExtVpdPanel private to iSeries
[POWERPC] iseries: Make HvLpConfig_get(Primary)LpIndex functions
[POWERPC] iseries: Move ItLpNaca into platforms/iseries
[POWERPC] iseries: Fix a compiler warning in platforms/iseries/vpdinfo.c
[POWERPC] iseries: Fix a compiler warning in platforms/iseries/vpdinfo.c
[POWERPC] Fix a compiler warning in mm/tlb_64.c
[POWERPC] iseries: Move iommu_table_cb into platforms/iseries
[POWERPC] Make doc comments extractable
[POWERPC] Add a helper for calculating RTAS "config_addr" parameters
[POWERPC] Split out vpa unregister logic from pseries_kexec_cpu_down_xics()
[POWERPC] Remove DISCONTIGMEM cruft from page.h
Michael Neuling:
[POWERPC] Enable PURR sysfs entry correctly
[POWERPC] Implement SLB shadow buffer
[POWERPC] Update lppaca offset comments
[POWERPC] SLB shadow buffer cleanup
[POWERPC] powerpc: Make RTAS console init generic
Mike Kravetz:
[POWERPC] Instrument Hypervisor Calls: merge headers
[POWERPC] powerpc: Instrument Hypervisor Calls
Nathan Lynch:
[POWERPC] Maple U3 HT - reject inappropriate config space access
[POWERPC] Demacrofy arch/powerpc/platforms/maple/pci.c
Niels Kristian Bech Jensen:
[POWERPC] Add -fno-stack-protector to BOOTCFLAGS in arch/powerpc/boot/Makefile.
Olaf Hering:
[POWERPC] reboot when panic_timout is set
[POWERPC] print backtrace when entering xmon
Olof Johansson:
[POWERPC] Rename cpu_setup_power4.S to cpu_setup_ppc970.S
[POWERPC] Cleanup CPU inits
[POWERPC] powerpc: Reduce default cacheline size to 64 bytes
[POWERPC] powerpc: Divorce CPU_FTR_CTRL from CPU_FTR_PPCAS_ARCH_V2_BASE
[POWERPC] powerpc: PA6T cputable entry, PVR value
[POWERPC] powerpc: PA Semi PWRficient platform support
[POWERPC] powerpc: PA Semi PWRficient MAINTAINER entry
[POWERPC] Quiet hvc_console console output on failed opens
[POWERPC] Fix non-smp build
Paul Mackerras:
[POWERPC] Only offer CONFIG_BRIQ_PANEL if CONFIG_PPC_CHRP is enabled
[POWERPC] Define of_read_ulong helper
Peter Bergner:
[POWERPC] Add AT_PLATFORM value for Xilinx Virtex-4 FX
Scott Wood:
[POWERPC] Fix IPIC pending register assignments
[POWERPC] Include <asm/mmu.h> in arch/powerpc/sysdev/fsl_soc.h for phys_addr_t.
Stephen Rothwell:
[POWERPC] iseries: A new iSeries console
[POWERPC] Make the hvc_console output buffer size settable
[POWERPC] iseries: Small viotape cleanup allowed by devfs removal
[POWERPC] iseries: Remove unnecessary include of iseries/hv_lp_event.h
[POWERPC] iseries: remove const warning
[POWERPC] iseries: remove some gcc 4.1 warnings
[POWERPC] make spinlocks work in a combined kernel
[POWERPC] silence a warning
[POWERPC] remove unused io accessors
[POWERPC] remove unused asm routines
[POWERPC] clean up ide io accessors
[POWERPC] convert string i/o operations to C
[POWERPC] iseries: eliminate a couple of warnings
[POWERPC] Merge iSeries i/o operations with the rest
Will Schmidt:
[POWERPC] Emulate power5 popcntb instruction
^ permalink raw reply
* Re: [Fastboot] [PATCH] kdump: don't call __ioremap() for pfn = 0
From: Michael Ellerman @ 2006-09-22 6:55 UTC (permalink / raw)
To: vgoyal; +Cc: linuxppc-dev, paulus, Fastboot mailing list
In-Reply-To: <20060921141049.GB1542@in.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 1256 bytes --]
On Thu, 2006-09-21 at 10:10 -0400, Vivek Goyal wrote:
> On Thu, Sep 21, 2006 at 09:02:37PM +1000, Michael Ellerman wrote:
> > +
> > +static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize,
> > + unsigned long offset, int userbuf)
> > +{
> > + if (userbuf) {
> > + if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
> > + return -EFAULT;
> > + }
>
> Probably you can get rid of above pair of braces as there is only single
> statement under if.
Yep.
> >
> > - if (userbuf) {
> > - if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
> > - iounmap(vaddr);
> > - return -EFAULT;
> > - }
> > - } else
> > - memcpy(buf, (vaddr + offset), csize);
> > + if (pfn < max_pfn) {
>
> Should this be (pfn <= max_pfn) ?
No, max_pfn is badly named. It seems to actually be the total number of
pages == the first pfn past the end of the linear mapping.
But it'd be cleaner to use page_is_ram(), I'll do a new patch.
cheers
--
Michael Ellerman
OzLabs, IBM Australia Development Lab
wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)
We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 191 bytes --]
^ permalink raw reply
* Re: [PATCH 1/3] POWERPC: Added devicetree for mpc8272ads board
From: Vitaly Bordug @ 2006-09-22 8:00 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <DBDA0C60-A5F4-4F8A-BF98-FE232EAAA010@kernel.crashing.org>
[-- Attachment #1: Type: text/plain, Size: 12314 bytes --]
Kumar,
Thanks a lot for extracting some time and glance at this approach...
My comments below.
On Thu, 21 Sep 2006 23:55:36 -0500
Kumar Gala wrote:
>
> On Sep 21, 2006, at 9:48 PM, Vitaly Bordug wrote:
>
> >
> > This adds current dts file used with MPC8272ADS,
> > introducing new mdio bitbang defines, as well as
> > fully-CPM2-SoC board design.
> >
> > Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
> > ---
> >
> > arch/powerpc/boot/dts/mpc8272ads.dts | 236
> > +++++++++++++++++++++++ +++++++++++
> > 1 files changed, 236 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/powerpc/boot/dts/mpc8272ads.dts b/arch/powerpc/
> > boot/dts/mpc8272ads.dts
> > new file mode 100644
> > index 0000000..6d72b7d
> > --- /dev/null
> > +++ b/arch/powerpc/boot/dts/mpc8272ads.dts
> > @@ -0,0 +1,236 @@
> > +/*
> > + * MPC8272 ADS Device Tree Source
> > + *
> > + * Copyright 2005 Freescale Semiconductor Inc.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > modify it
> > + * under the terms of the GNU General Public License as
> > published by the
> > + * Free Software Foundation; either version 2 of the License,
> > or (at your
> > + * option) any later version.
> > + */
> > +
> > +
> > +/*
> > +/memreserve/ 00000000 4000000;
> > +*/
>
> Is this needed?
>
not necessarily-will clean up.
> > +
> > +/ {
> > + model = "MPC8272ADS";
> > + compatible = "MPC8260ADS";
> > + #address-cells = <1>;
> > + #size-cells = <1>;
> > + linux,phandle = <100>;
> > +
> > + cpus {
> > + #cpus = <1>;
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > + linux,phandle = <200>;
> > +
> > + PowerPC,8272@0 {
> > + device_type = "cpu";
> > + reg = <0>;
> > + d-cache-line-size = <20>; // 32 bytes
> > + i-cache-line-size = <20>; // 32 bytes
> > + d-cache-size = <4000>; // L1, 16K
> > + i-cache-size = <4000>; // L1, 16K
> > + timebase-frequency = <17d7840>;
> > + bus-frequency = <5f5e100>;
> > + clock-frequency = <17D78400>;
>
> Are the freq's really fixed? if not having these values as 0, maybe
> be better.
>
On some path u-boot messed the frequencies, that's why here resides fixed approach. Eventually will be put back to <0> once it will definitely work.
> > + 32-bit;
> > + linux,phandle = <201>;
> > + linux,boot-cpu;
> > + };
> > + };
> > +
> > + interrupt-controller@f8200000 {
> > + linux,phandle = <f8200000>;
> > + #address-cells = <0>;
> > + #interrupt-cells = <2>;
> > + interrupt-controller;
> > + reg = <f8200000 f8200004>;
> > + built-in;
> > + device_type = "pci-pic";
> > + };
> > + memory {
> > + device_type = "memory";
> > + linux,phandle = <300>;
> > + reg = <00000000 4000000 f4500000 00000020>;
> > + };
> > +
> > + chosen {
> > + name = "chosen";
> > + bootargs = "root=/dev/nfs rw ip=on";
>
> Seems bad form to put bootargs in the .dts directly like this.
>
> > + linux,stdout-path = "/dev/ttyCPM0";
>
> I thought this was the 'of' path, not a dev path.
>
I was about to remove the upper stuff, and at the last moment missed that. Will clean up.
> > + linux,platform = <0>;
> > + interrupt-controller = <10c00>;
> > + linux,phandle = <400>;
> > + };
> > +
> > + soc8272@f0000000 {
> > + #address-cells = <1>;
> > + #size-cells = <1>;
> > + #interrupt-cells = <2>;
> > + device_type = "soc";
> > + ranges = < 0 0 2 00000000 f0000000 00053000>;
> > + reg = <f0000000 0>;
> > +
> > + mdio@0 {
> > + device_type = "mdio";
> > + compatible = "fs_enet";
> > + reg = <0 0>;
> > + linux,phandle = <24520>;
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > + ethernet-phy@0 {
> > + linux,phandle = <2452000>;
> > + interrupt-parent = <10c00>;
> > + interrupts = <19 1>;
> > + reg = <0>;
> > + bitbang = [ 12 12 13 02 02 01 ];
> > + device_type = "ethernet-phy";
> > + };
> > + ethernet-phy@1 {
> > + linux,phandle = <2452001>;
> > + interrupt-parent = <10c00>;
> > + interrupts = <19 1>;
> > + bitbang = [ 12 12 13 02 02 01 ];
> > + reg = <3>;
> > + device_type = "ethernet-phy";
> > + };
> > + };
> > +
> > + ethernet@24000 {
> > + #address-cells = <1>;
> > + #size-cells = <0>;
> > + device_type = "network";
> > + device-id = <2>;
> > + compatible = "fs_enet";
> > + model = "FCC";
> > + reg = <11300 20 8400 100 11380 30>;
> > + mac-address = [ 00 11 2F 99 43 54 ];
> > + interrupts = <20 2>;
> > + interrupt-parent = <10c00>;
> > + phy-handle = <2452000>;
> > + rx-clock = <13>;
> > + tx-clock = <12>;
> > + };
> > +
> > + ethernet@25000 {
> > + device_type = "network";
> > + device-id = <3>;
> > + compatible = "fs_enet";
> > + model = "FCC";
> > + reg = <11320 20 8500 100 113b0 30>;
> > + mac-address = [ 00 11 2F 99 44 54 ];
> > + interrupts = <21 2>;
> > + interrupt-parent = <10c00>;
> > + phy-handle = <2452001>;
> > + rx-clock = <17>;
> > + tx-clock = <18>;
> > + };
> > +
> > + cpm@f0000000 {
> > + linux,phandle = <f0000000>;
> > + #address-cells = <1>;
> > + #size-cells = <1>;
> > + #interrupt-cells = <2>;
> > + device_type = "cpm";
> > + model = "CPM2";
> > + ranges = <00000000 00000000 3ffff>;
> > + reg = <10d80 3280>;
> > + command-proc = <119c0>;
> > + brg-frequency = <17D7840>;
> > + cpm_clk = <BEBC200>;
> > +
> > + scc@11a00 {
> > + device_type = "serial";
> > + compatible = "cpm_uart";
> > + model = "SCC";
> > + device-id = <2>;
> > + reg = <11a00 20 8000 100>;
> > + current-speed = <1c200>;
> > + interrupts = <28 2>;
> > + interrupt-parent = <10c00>;
> > + clock-setup = <0 00ffffff>;
> > + rx-clock = <1>;
> > + tx-clock = <1>;
> > + };
> > +
> > + scc@11a60 {
> > + device_type = "serial";
> > + compatible = "cpm_uart";
> > + model = "SCC";
> > + device-id = <5>;
> > + reg = <11a60 20 8300 100>;
> > + current-speed = <1c200>;
> > + interrupts = <2b 2>;
> > + interrupt-parent = <10c00>;
> > + clock-setup = <1b ffffff00>;
> > + rx-clock = <4>;
> > + tx-clock = <4>;
> > + };
> > +
> > + };
> > + interrupt-controller@10c00 {
> > + linux,phandle = <10c00>;
> > + #address-cells = <0>;
> > + #interrupt-cells = <2>;
> > + interrupt-controller;
> > + reg = <10c00 80>;
> > + built-in;
> > + device_type = "cpm-pic";
> > + };
>
> Do we need to distinguish cpm2-pic from cpm-pic (8xx)?
>
IIRC, no, but I'll double-check.
> > + pci@0500 {
> > + linux,phandle = <0500>;
> > + #interrupt-cells = <1>;
> > + #size-cells = <2>;
> > + #address-cells = <3>;
> > + compatible = "8272";
> > + device_type = "pci";
> > + reg = <10430 4dc>;
> > + clock-frequency = <3f940aa>;
> > + interrupt-map-mask = <f800 0 0 7>;
> > + interrupt-map = <
> > +
> > + /* IDSEL 0x16 */
> > + b000 0 0 1 f8200000 40 0
> > + b000 0 0 2 f8200000 41 0
> > + b000 0 0 3 f8200000 42 0
> > + b000 0 0 4 f8200000 43 0
> > +
> > + /* IDSEL 0x17 */
> > + b800 0 0 1 f8200000 43 0
> > + b800 0 0 2 f8200000 40 0
> > + b800 0 0 3 f8200000 41 0
> > + b800 0 0 4 f8200000 42 0
> > +
> > + /* IDSEL 0x18 */
> > + c000 0 0 1 f8200000 42 0
> > + c000 0 0 2 f8200000 43 0
> > + c000 0 0 3 f8200000 40 0
> > + c000 0 0 4 f8200000 41 0>;
> > + interrupt-parent = <10c00>;
> > + interrupts = <14 3>;
> > + bus-range = <0 0>;
> > + ranges = <02000000 0 80000000 80000000 0
> > 40000000
> > + 01000000 0 00000000 f6000000 0
> > 02000000>;
> > + };
> > +
> > +/* May need to remove if on a part without crypto engine */
> > + crypto@30000 {
> > + device_type = "crypto";
> > + model = "SEC2";
> > + compatible = "talitos";
> > + reg = <30000 10000>;
> > + interrupts = <b 0>;
> > + interrupt-parent = <10c00>;
> > + num-channels = <4>;
> > + channel-fifo-len = <18>;
> > + exec-units-mask = <0000007e>;
> > +/* desc mask is for rev1.x, we need runtime fixup for >=2.x */
> > + descriptor-types-mask = <01010ebf>;
> > + };
> > +
> > + };
> > +};
>
>
Sincerely, Vitaly
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* Re: [PATCH 0/11] Add support for QE and 8360EMDS board
From: Vitaly Bordug @ 2006-09-22 8:04 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev, Li Yang
In-Reply-To: <360F0BE4-6E0B-47EB-8A6C-0640F167FF82@kernel.crashing.org>
[-- Attachment #1: Type: text/plain, Size: 778 bytes --]
On Fri, 22 Sep 2006 00:01:50 -0500
Kumar Gala wrote:
>
> On Sep 21, 2006, at 7:17 AM, Li Yang wrote:
>
> > The series of patches add generic QE infrastructure called
> > qe_lib, and MPC8360EMDS board support. Qe_lib is used by
> > QE device drivers such as ucc_geth driver.
> >
> > This version updates QE interrupt controller to use new irq
> > mapping mechanism ,addresses all the comments received with
> > last submission and includes some style fixes.
>
> Wasn't there a patch for the docs that described the QE additions to
> the flat dev tree?
>
Yes, there was one,
but this time I will submit it together with cpm stuff in addition to QE,
once I'll validate that 8xx does not need anything defined but undocumented.
--
Sincerely, Vitaly
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* [PATCH12/11] qe_lib: Fix QE I/O ports API
From: Li Yang @ 2006-09-22 8:15 UTC (permalink / raw)
To: linuxppc-dev
Remove QE I/O ports interrupt code. Read register base and
I/O ports number from device tree.
Signed-off-by: Li Yang <leoli@freescale.com>
---
This patch is patched on [PATCH 0/11] Add support for QE and
8360EMDS board series.
arch/powerpc/boot/dts/mpc8360emds.dts | 2
arch/powerpc/platforms/83xx/mpc8360e_pb.c | 9 +-
arch/powerpc/platforms/83xx/mpc8360e_pb.h | 1
arch/powerpc/sysdev/qe_lib/qe_io.c | 160 +++++++++++------------------
4 files changed, 69 insertions(+), 103 deletions(-)
diff --git a/arch/powerpc/boot/dts/mpc8360emds.dts b/arch/powerpc/boot/dts/mpc8360emds.dts
index ad3beec..afa953e 100644
--- a/arch/powerpc/boot/dts/mpc8360emds.dts
+++ b/arch/powerpc/boot/dts/mpc8360emds.dts
@@ -188,6 +188,8 @@
par_io@1400 {
reg = <1400 100>;
device_type = "par_io";
+ num-ports = <7>;
+
ucc_pin@01 {
linux,phandle = <140001>;
pio-map = <
diff --git a/arch/powerpc/platforms/83xx/mpc8360e_pb.c b/arch/powerpc/platforms/83xx/mpc8360e_pb.c
index b4692d7..9d101ae 100644
--- a/arch/powerpc/platforms/83xx/mpc8360e_pb.c
+++ b/arch/powerpc/platforms/83xx/mpc8360e_pb.c
@@ -98,8 +98,13 @@ #endif
#ifdef CONFIG_QUICC_ENGINE
qe_reset();
- for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;)
- par_io_of_config(np);
+ if ((np = of_find_node_by_name(np, "par_io")) != NULL) {
+ par_io_init(np);
+ of_node_put(np);
+
+ for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;)
+ par_io_of_config(np);
+ }
if ((np = of_find_compatible_node(NULL, "network", "ucc_geth"))
!= NULL){
diff --git a/arch/powerpc/platforms/83xx/mpc8360e_pb.h b/arch/powerpc/platforms/83xx/mpc8360e_pb.h
index 84282e5..c83bb88 100644
--- a/arch/powerpc/platforms/83xx/mpc8360e_pb.h
+++ b/arch/powerpc/platforms/83xx/mpc8360e_pb.h
@@ -25,6 +25,7 @@ #define BCSR_SIZE ((uint)(32 * 1024))
#ifdef CONFIG_QUICC_ENGINE
extern void qe_reset(void);
+extern int par_io_init(struct device_node *np);
extern int par_io_of_config(struct device_node *np);
#endif /* CONFIG_QUICC_ENGINE */
diff --git a/arch/powerpc/sysdev/qe_lib/qe_io.c b/arch/powerpc/sysdev/qe_lib/qe_io.c
index e905d35..d31dafa 100644
--- a/arch/powerpc/sysdev/qe_lib/qe_io.c
+++ b/arch/powerpc/sysdev/qe_lib/qe_io.c
@@ -19,6 +19,7 @@ #include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/module.h>
+#include <linux/ioport.h>
#include <asm/io.h>
#include <asm/prom.h>
@@ -26,84 +27,60 @@ #include <sysdev/fsl_soc.h>
#undef DEBUG
#define NUM_OF_PINS 32
-#define NUM_OF_PAR_IOS 7
-typedef struct par_io {
- struct {
+struct port_regs {
u32 cpodr; /* Open drain register */
u32 cpdata; /* Data register */
u32 cpdir1; /* Direction register */
u32 cpdir2; /* Direction register */
u32 cppar1; /* Pin assignment register */
u32 cppar2; /* Pin assignment register */
- } io_regs[NUM_OF_PAR_IOS];
-} par_io_t;
-
-typedef struct qe_par_io {
- u8 res[0xc];
- u32 cepier; /* QE ports interrupt event register */
- u32 cepimr; /* QE ports mask event register */
- u32 cepicr; /* QE ports control event register */
-} qe_par_io_t;
-
-static int qe_irq_ports[NUM_OF_PAR_IOS][NUM_OF_PINS] = {
- /* 0-7 */ /* 8-15 */ /* 16 - 23 */ /* 24 - 31 */
- {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,0},
- {0,0,0,1,0,1,0,0, 0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,0},
- {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0},
- {0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0, 1,1,0,0,0,0,0,0, 0,0,1,1,0,0,0,0},
- {0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,1},
- {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1}
};
+static struct port_regs *par_io = NULL;
+static int num_par_io_ports = 0;
-static u8 get_irq_num(u8 port, u8 pin)
+int par_io_init(struct device_node *np)
{
- int i, j;
- u8 num = 0;
+ struct resource res;
+ int ret;
+ u32 *num_ports;
- if (qe_irq_ports[port][pin] == 0)
- return -1;
- for (j = 0; j <= port; j++)
- for (i = 0; i < pin; i++)
- if (qe_irq_ports[j][i])
- num++;
- return num;
-}
+ /* Map Parallel I/O ports registers */
+ ret = of_address_to_resource(np, 0, &res);
+ if (ret)
+ return ret;
+ par_io = (struct port_regs *)ioremap(res.start, res.end - res.start + 1);
+
+ num_ports = get_property(np, "num-ports", NULL);
+ if (num_ports)
+ num_par_io_ports = *num_ports;
-static par_io_t *par_io = NULL;
-static qe_par_io_t *qe_par_io = NULL;
+ return 0;
+}
int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
int assignment, int has_irq)
{
u32 pinMask1bit, pinMask2bits, newMask2bits, tmp_val;
- if (!par_io) {
- par_io = (par_io_t *) ioremap(get_immrbase() + 0x1400,
- sizeof(par_io_t));
- qe_par_io = (qe_par_io_t *) ioremap(get_immrbase() + 0xC00,
- sizeof(qe_par_io_t));
-
- /* clear event bits in the event register of the QE ports */
- out_be32(&qe_par_io->cepier, 0xFFFFFFFF);
- }
-
+ if (!par_io)
+ return -1;
+
/* calculate pin location for single and 2 bits information */
pinMask1bit = (u32) (1 << (NUM_OF_PINS - (pin + 1)));
/* Set open drain, if required */
- tmp_val = in_be32(&par_io->io_regs[port].cpodr);
+ tmp_val = in_be32(&par_io[port].cpodr);
if (open_drain)
- out_be32(&par_io->io_regs[port].cpodr, pinMask1bit | tmp_val);
+ out_be32(&par_io[port].cpodr, pinMask1bit | tmp_val);
else
- out_be32(&par_io->io_regs[port].cpodr, ~pinMask1bit & tmp_val);
+ out_be32(&par_io[port].cpodr, ~pinMask1bit & tmp_val);
/* define direction */
tmp_val = (pin > (NUM_OF_PINS / 2) - 1) ?
- in_be32(&par_io->io_regs[port].cpdir2) :
- in_be32(&par_io->io_regs[port].cpdir1);
+ in_be32(&par_io[port].cpdir2) :
+ in_be32(&par_io[port].cpdir1);
/* get all bits mask for 2 bit per port */
pinMask2bits = (u32) (0x3 <<
@@ -117,50 +94,34 @@ int par_io_config_pin(u8 port, u8 pin, i
/* clear and set 2 bits mask */
if (pin > (NUM_OF_PINS / 2) - 1) {
- out_be32(&par_io->io_regs[port].cpdir2,
+ out_be32(&par_io[port].cpdir2,
~pinMask2bits & tmp_val);
tmp_val &= ~pinMask2bits;
- out_be32(&par_io->io_regs[port].cpdir2, newMask2bits | tmp_val);
+ out_be32(&par_io[port].cpdir2, newMask2bits | tmp_val);
} else {
- out_be32(&par_io->io_regs[port].cpdir1,
+ out_be32(&par_io[port].cpdir1,
~pinMask2bits & tmp_val);
tmp_val &= ~pinMask2bits;
- out_be32(&par_io->io_regs[port].cpdir1, newMask2bits | tmp_val);
+ out_be32(&par_io[port].cpdir1, newMask2bits | tmp_val);
}
/* define pin assignment */
tmp_val = (pin > (NUM_OF_PINS / 2) - 1) ?
- in_be32(&par_io->io_regs[port].cppar2) :
- in_be32(&par_io->io_regs[port].cppar1);
+ in_be32(&par_io[port].cppar2) :
+ in_be32(&par_io[port].cppar1);
newMask2bits = (u32) (assignment << (NUM_OF_PINS -
(pin % (NUM_OF_PINS / 2) + 1) * 2));
/* clear and set 2 bits mask */
if (pin > (NUM_OF_PINS / 2) - 1) {
- out_be32(&par_io->io_regs[port].cppar2,
+ out_be32(&par_io[port].cppar2,
~pinMask2bits & tmp_val);
tmp_val &= ~pinMask2bits;
- out_be32(&par_io->io_regs[port].cppar2, newMask2bits | tmp_val);
+ out_be32(&par_io[port].cppar2, newMask2bits | tmp_val);
} else {
- out_be32(&par_io->io_regs[port].cppar1,
+ out_be32(&par_io[port].cppar1,
~pinMask2bits & tmp_val);
tmp_val &= ~pinMask2bits;
- out_be32(&par_io->io_regs[port].cppar1, newMask2bits | tmp_val);
- }
-
- /* Set interrupt mask if the pin generates interrupt */
- if (has_irq) {
- int irq = get_irq_num(port, pin);
- u32 mask = 0;
-
- if (irq == -1) {
- printk(KERN_WARNING "Port %d, pin %d is can't be "
- "interrupt\n", port, pin);
- return -EINVAL;
- }
- mask = 0x80000000 >> irq;
-
- tmp_val = in_be32(&qe_par_io->cepimr);
- out_be32(&qe_par_io->cepimr, mask | tmp_val);
+ out_be32(&par_io[port].cppar1, newMask2bits | tmp_val);
}
return 0;
@@ -172,19 +133,19 @@ int par_io_data_set(u8 port, u8 pin, u8
{
u32 pin_mask, tmp_val;
- if (port >= NUM_OF_PAR_IOS)
+ if (port >= num_par_io_ports)
return -EINVAL;
if (pin >= NUM_OF_PINS)
return -EINVAL;
/* calculate pin location */
pin_mask = (u32) (1 << (NUM_OF_PINS - 1 - pin));
- tmp_val = in_be32(&par_io->io_regs[port].cpdata);
+ tmp_val = in_be32(&par_io[port].cpdata);
if (val == 0) /* clear */
- out_be32(&par_io->io_regs[port].cpdata, ~pin_mask & tmp_val);
+ out_be32(&par_io[port].cpdata, ~pin_mask & tmp_val);
else /* set */
- out_be32(&par_io->io_regs[port].cpdata, pin_mask | tmp_val);
+ out_be32(&par_io[port].cpdata, pin_mask | tmp_val);
return 0;
}
@@ -197,6 +158,11 @@ int par_io_of_config(struct device_node
phandle *ph;
int pio_map_len;
unsigned int *pio_map;
+
+ if (par_io == NULL) {
+ printk(KERN_ERR "par_io not initialized \n");
+ return -1;
+ }
ph = (phandle *) get_property(np, "pio-handle", NULL);
if (ph == 0) {
@@ -237,35 +203,27 @@ static void dump_par_io(void)
printk(KERN_INFO "PAR IO registars:\n");
printk(KERN_INFO "Base address: 0x%08x\n", (u32) par_io);
- for (i = 0; i < NUM_OF_PAR_IOS; i++) {
+ for (i = 0; i < num_par_io_ports; i++) {
printk(KERN_INFO "cpodr[%d] : addr - 0x%08x, val - 0x%08x\n",
- i, (u32) & par_io->io_regs[i].cpodr,
- in_be32(&par_io->io_regs[i].cpodr));
+ i, (u32) & par_io[i].cpodr,
+ in_be32(&par_io[i].cpodr));
printk(KERN_INFO "cpdata[%d]: addr - 0x%08x, val - 0x%08x\n",
- i, (u32) & par_io->io_regs[i].cpdata,
- in_be32(&par_io->io_regs[i].cpdata));
+ i, (u32) & par_io[i].cpdata,
+ in_be32(&par_io[i].cpdata));
printk(KERN_INFO "cpdir1[%d]: addr - 0x%08x, val - 0x%08x\n",
- i, (u32) & par_io->io_regs[i].cpdir1,
- in_be32(&par_io->io_regs[i].cpdir1));
+ i, (u32) & par_io[i].cpdir1,
+ in_be32(&par_io[i].cpdir1));
printk(KERN_INFO "cpdir2[%d]: addr - 0x%08x, val - 0x%08x\n",
- i, (u32) & par_io->io_regs[i].cpdir2,
- in_be32(&par_io->io_regs[i].cpdir2));
+ i, (u32) & par_io[i].cpdir2,
+ in_be32(&par_io[i].cpdir2));
printk(KERN_INFO "cppar1[%d]: addr - 0x%08x, val - 0x%08x\n",
- i, (u32) & par_io->io_regs[i].cppar1,
- in_be32(&par_io->io_regs[i].cppar1));
+ i, (u32) & par_io[i].cppar1,
+ in_be32(&par_io[i].cppar1));
printk(KERN_INFO "cppar2[%d]: addr - 0x%08x, val - 0x%08x\n",
- i, (u32) & par_io->io_regs[i].cppar2,
- in_be32(&par_io->io_regs[i].cppar2));
+ i, (u32) & par_io[i].cppar2,
+ in_be32(&par_io[i].cppar2));
}
- printk(KERN_INFO "QE PAR IO registars:\n");
- printk(KERN_INFO "Base address: 0x%08x\n", (u32) qe_par_io);
- printk(KERN_INFO "cepier : addr - 0x%08x, val - 0x%08x\n",
- (u32) & qe_par_io->cepier, in_be32(&qe_par_io->cepier));
- printk(KERN_INFO "cepimr : addr - 0x%08x, val - 0x%08x\n",
- (u32) & qe_par_io->cepimr, in_be32(&qe_par_io->cepimr));
- printk(KERN_INFO "cepicr : addr - 0x%08x, val - 0x%08x\n",
- (u32) & qe_par_io->cepicr, in_be32(&qe_par_io->cepicr));
}
EXPORT_SYMBOL(dump_par_io);
^ permalink raw reply related
* [PATCH] Fix audit syscall success/failure reporting on PowerPC
From: David Woodhouse @ 2006-09-22 8:23 UTC (permalink / raw)
To: paulus; +Cc: linuxppc-dev, viro
Due to my stupidity, we were checking for the wrong bit in CCR when
attempting to determine whether a syscall succeeded or not. Remedy the
symptom, if not the cause.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index dea75d7..cf1d1bc 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -553,7 +553,7 @@ #ifdef CONFIG_PPC32
#endif
if (unlikely(current->audit_context))
- audit_syscall_exit((regs->ccr&0x1000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
+ audit_syscall_exit((regs->ccr&0x10000000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
regs->result);
if ((test_thread_flag(TIF_SYSCALL_TRACE)
--
dwmw2
^ permalink raw reply related
* [PATCH] Always call cede in pseries dedicated idle loop
From: Anton Blanchard @ 2006-09-22 8:26 UTC (permalink / raw)
To: paulus; +Cc: linuxppc-dev
The smt_snooze_delay logic changed a bit when the idle loops were
consolidated. A value of 0 used to mean we always polled, now it means
we always sleep. Instead of restoring the old behaviour, lets put a
reasonable default in smt_snooze_delay. This means we spin for a bit (in
case an external interrupt comes in) and then sleep.
Also the pseries dedicated idle loop currently does not cede both
threads in an SMT pair. The hypervisor wants us to call in so it can
power manage, so lets do that.
Signed-off-by: Anton Blanchard <anton@samba.org>
---
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index 31867a7..00231ac 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -456,8 +456,8 @@ static int __init pSeries_probe(void)
return 1;
}
-
-DECLARE_PER_CPU(unsigned long, smt_snooze_delay);
+/* Time in microseconds we delay before sleeping in the idle loop */
+DECLARE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 };
static void pseries_dedicated_idle_sleep(void)
{
@@ -498,24 +498,7 @@ static void pseries_dedicated_idle_sleep
goto out;
}
- /*
- * If not SMT, cede processor. If CPU is running SMT
- * cede if the other thread is not idle, so that it can
- * go single-threaded. If the other thread is idle,
- * we ask the hypervisor if it has pending work it
- * wants to do and cede if it does. Otherwise we keep
- * polling in order to reduce interrupt latency.
- *
- * Doing the cede when the other thread is active will
- * result in this thread going dormant, meaning the other
- * thread gets to run in single-threaded (ST) mode, which
- * is slightly faster than SMT mode with this thread at
- * very low priority. The cede enables interrupts, which
- * doesn't matter here.
- */
- if (!cpu_has_feature(CPU_FTR_SMT) || !lppaca[cpu ^ 1].idle
- || poll_pending() == H_PENDING)
- cede_processor();
+ cede_processor();
out:
HMT_medium();
^ permalink raw reply related
* [PATCH] Fix PPC32 SECCOMP, unexport do_syscall_trace_{enter,leave}
From: David Woodhouse @ 2006-09-22 8:32 UTC (permalink / raw)
To: paulus; +Cc: linuxppc-dev
The secure_computing() call which automatically aborts a process if it
tries to execute a syscall it shouldn't is much more useful if we
actually do it _before_ the syscall, rather than afterwards. PPC64 got
this right, but the original incorrect behaviour inherited from arch/ppc
was preserved by ifdefs. Make it the same on PPC32 too.
Also, I see no need to export do_syscall_trace_{leave,enter} on ppc32 --
they were only exported because the old do_syscall_trace() (which they
replaced) used to be.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index dea75d7..9c78009 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -526,9 +526,7 @@ static void do_syscall_trace(void)
void do_syscall_trace_enter(struct pt_regs *regs)
{
-#ifdef CONFIG_PPC64
secure_computing(regs->gpr[0]);
-#endif
if (test_thread_flag(TIF_SYSCALL_TRACE)
&& (current->ptrace & PT_PTRACED))
@@ -548,10 +546,6 @@ #endif
void do_syscall_trace_leave(struct pt_regs *regs)
{
-#ifdef CONFIG_PPC32
- secure_computing(regs->gpr[0]);
-#endif
-
if (unlikely(current->audit_context))
audit_syscall_exit((regs->ccr&0x10000000)?AUDITSC_FAILURE:AUDITSC_SUCCESS,
regs->result);
@@ -561,8 +555,3 @@ #endif
&& (current->ptrace & PT_PTRACED))
do_syscall_trace();
}
-
-#ifdef CONFIG_PPC32
-EXPORT_SYMBOL(do_syscall_trace_enter);
-EXPORT_SYMBOL(do_syscall_trace_leave);
-#endif
--
dwmw2
^ permalink raw reply related
* Re: [PATCH] Start arch/powerpc/boot code reorganization
From: Segher Boessenkool @ 2006-09-22 8:43 UTC (permalink / raw)
To: Mark A. Greer; +Cc: Paul Mackerras, Matt Porter, linuxppc-dev
In-Reply-To: <20060922012408.GA13820@mag.az.mvista.com>
>> How about you check whether the "64-bit" property exists in the CPU
>> nodes?
>
> That seemed like the right thing until I realized, its still
> specifying
> the physical size, not the virtual size.
No, it says that the CPU supports the full PowerPC arch, not just the
32-bit subset. Every 64-bit PowerPC has a 64-bit effective address,
every 32-bit PowerPC has a 32-bit effective address. There's no way
around that unless you change most of the instruction set ;-)
Segher
^ permalink raw reply
* RE: [PATCH 2/11] qe_lib: Add common files
From: Joakim Tjernlund @ 2006-09-22 9:57 UTC (permalink / raw)
To: Li Yang-r58472, linuxppc-dev
> > -----Original Message-----
> > From: Joakim Tjernlund [mailto:joakim.tjernlund@transmode.se]
> > Sent: Thursday, September 21, 2006 11:22 PM
> > To: Li Yang-r58472; linuxppc-dev@ozlabs.org
> > Subject: RE: [PATCH 2/11] qe_lib: Add common files
> >=20
> > > diff --git a/include/asm-powerpc/qe.h b/include/asm-powerpc/qe.h
> > > +#define QE_MURAM_DATAONLY_BASE ((uint)0x0)
> > > +#define QE_MURAM_NOSPACE ((uint)0x7fffffff)
> > > +#define QE_MURAM_DATAONLY_SIZE ((uint)(48 * 1024) -
> > > QE_MURAM_DATAONLY_BASE)
> >=20
> > QE_MURAM_DATAONLY_SIZE is 16*1024 on 8321
> >=20
> > Also, you have line wrapping that has mangled all long lines in all
> > patches.
>=20
> No, not for this time. Maybe your mail client wrapped them.
Yes, you are corrrect. It was my client that messed up this time. Sorry
for the noise.
Jocke
^ permalink raw reply
* [PATCH] Always call cede in pseries dedicated idle loop
From: Anton Blanchard @ 2006-09-22 10:30 UTC (permalink / raw)
To: paulus; +Cc: linuxppc-dev
In-Reply-To: <20060922082636.GC22420@krispykreme>
Not sure what I was thinking, heres something that actually builds.
--
The smt_snooze_delay logic changed a bit when the idle loops were
consolidated. A value of 0 used to mean we always polled, now it means
we always sleep. Instead of restoring the old behaviour, lets put a
reasonable default in smt_snooze_delay. This means we spin for a bit (in
case an external interrupt comes in) and then sleep.
Also the pseries dedicated idle loop currently does not cede both
threads in an SMT pair. The hypervisor wants us to call in so it can
power manage, so lets do that.
Signed-off-by: Anton Blanchard <anton@samba.org>
---
Index: build/arch/powerpc/platforms/pseries/setup.c
===================================================================
--- build.orig/arch/powerpc/platforms/pseries/setup.c 2006-09-22 19:04:56.000000000 +1000
+++ build/arch/powerpc/platforms/pseries/setup.c 2006-09-22 20:21:01.000000000 +1000
@@ -477,7 +477,6 @@ static void pseries_dedicated_idle_sleep
{
unsigned int cpu = smp_processor_id();
unsigned long start_snooze;
- unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay);
/*
* Indicate to the HV that we are idle. Now would be
@@ -490,9 +489,9 @@ static void pseries_dedicated_idle_sleep
* has been checked recently. If we should poll for a little
* while, do so.
*/
- if (*smt_snooze_delay) {
+ if (__get_cpu_var(smt_snooze_delay)) {
start_snooze = get_tb() +
- *smt_snooze_delay * tb_ticks_per_usec;
+ __get_cpu_var(smt_snooze_delay) * tb_ticks_per_usec;
local_irq_enable();
set_thread_flag(TIF_POLLING_NRFLAG);
@@ -512,24 +511,7 @@ static void pseries_dedicated_idle_sleep
goto out;
}
- /*
- * If not SMT, cede processor. If CPU is running SMT
- * cede if the other thread is not idle, so that it can
- * go single-threaded. If the other thread is idle,
- * we ask the hypervisor if it has pending work it
- * wants to do and cede if it does. Otherwise we keep
- * polling in order to reduce interrupt latency.
- *
- * Doing the cede when the other thread is active will
- * result in this thread going dormant, meaning the other
- * thread gets to run in single-threaded (ST) mode, which
- * is slightly faster than SMT mode with this thread at
- * very low priority. The cede enables interrupts, which
- * doesn't matter here.
- */
- if (!cpu_has_feature(CPU_FTR_SMT) || !lppaca[cpu ^ 1].idle
- || poll_pending() == H_PENDING)
- cede_processor();
+ cede_processor();
out:
HMT_medium();
Index: build/arch/powerpc/kernel/sysfs.c
===================================================================
--- build.orig/arch/powerpc/kernel/sysfs.c 2006-09-22 20:19:43.000000000 +1000
+++ build/arch/powerpc/kernel/sysfs.c 2006-09-22 20:20:17.000000000 +1000
@@ -25,8 +25,8 @@ static DEFINE_PER_CPU(struct cpu, cpu_de
/* SMT stuff */
#ifdef CONFIG_PPC_MULTIPLATFORM
-/* default to snooze disabled */
-DEFINE_PER_CPU(unsigned long, smt_snooze_delay);
+/* Time in microseconds we delay before sleeping in the idle loop */
+DEFINE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 };
static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf,
size_t count)
^ permalink raw reply
* Re: [POWERPC] mark BUG() as noreturn
From: Jimi Xenidis @ 2006-09-22 10:58 UTC (permalink / raw)
To: michael; +Cc: Stephen Rothwell, paulus, Hollis Blanchard, ppc-dev
In-Reply-To: <1158886446.8109.2.camel@localhost.localdomain>
[-- Attachment #1: Type: text/plain, Size: 1188 bytes --]
On Sep 21, 2006, at 8:54 PM, Michael Ellerman wrote:
> On Thu, 2006-09-21 at 08:18 -0400, Jimi Xenidis wrote:
>> On Sep 21, 2006, at 12:55 AM, Stephen Rothwell wrote:
>>
>>> From an idea from Michael Ellerman.
>>>
>>> We finish the BUG() macro with a call to a function marked with
>>> attribute
>>> "noreturn" so that the compiler will know that BUG() and BUG_ON()
>>> (with a constant, non-zero argument) will not return.
>>
>> But BUG() _can_ return, if I have a probe, xmon or kgdb configured it
>> is possible to play with the state of the world and try to continue/
>> recover, (xmon "x" command). IMHO, this is a powerful debugging
>> scenario.
>
> Hmm, ok I hadn't thought of that. Personally I've never tried to
> recover
> from a BUG(), do people really do that much?
Oh, do it once and your hooked :)
>
>> Why are we concerned with the performance of this anyway?
>
> Not so much the performance, more that it gives the compiler more
> information about what's happening and allows it to elide code in some
> circumstances - but it's not _that_ important.
>
> Having it configurable might be an option, dunno.
I would not object to making depend on CONFIG_DEBUG_KERNEL
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 186 bytes --]
^ permalink raw reply
* Re: [PATCH 3/3] POWERPC: mpc8272ads merge: board-specific/platform stuff
From: Vitaly Bordug @ 2006-09-22 13:12 UTC (permalink / raw)
To: Vitaly Bordug; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <20060922024843.27185.45085.stgit@localhost.localdomain>
Paul,
Sorry, this patch is broken - something screwed up git commit it seems...
I'll resend ASAP.
-Vitaly
On Fri, 22 Sep 2006 06:48:44 +0400
Vitaly Bordug <vbordug@ru.mvista.com> wrote:
>
> This intruduces 82xx family in arch/powerpc/platforms,
> and has all the board-specific code to represent regression-less
> transaction from ppc. The functionality is apparently the same, including
> PCI controller.
>
> Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
> ---
>
> arch/powerpc/Kconfig | 1
> arch/powerpc/boot/dts/mpc8272ads.dts | 236 ----------------------------------
> arch/powerpc/sysdev/cpm2_pic.c | 2
> arch/powerpc/sysdev/cpm2_pic.h | 2
> arch/powerpc/sysdev/fsl_soc.c | 68 +---------
> 5 files changed, 9 insertions(+), 300 deletions(-)
>
> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 1810216..de1ef2f 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -594,7 +594,6 @@ endmenu
>
> source arch/powerpc/platforms/embedded6xx/Kconfig
> source arch/powerpc/platforms/4xx/Kconfig
> -source arch/powerpc/platforms/82xx/Kconfig
> source arch/powerpc/platforms/83xx/Kconfig
> source arch/powerpc/platforms/85xx/Kconfig
> source arch/powerpc/platforms/86xx/Kconfig
> diff --git a/arch/powerpc/boot/dts/mpc8272ads.dts b/arch/powerpc/boot/dts/mpc8272ads.dts
> deleted file mode 100644
> index 6d72b7d..0000000
> --- a/arch/powerpc/boot/dts/mpc8272ads.dts
> +++ /dev/null
> @@ -1,236 +0,0 @@
> -/*
> - * MPC8272 ADS Device Tree Source
> - *
> - * Copyright 2005 Freescale Semiconductor Inc.
> - *
> - * This program is free software; you can redistribute it and/or modify it
> - * under the terms of the GNU General Public License as published by the
> - * Free Software Foundation; either version 2 of the License, or (at your
> - * option) any later version.
> - */
> -
> -
> -/*
> -/memreserve/ 00000000 4000000;
> -*/
> -
> -/ {
> - model = "MPC8272ADS";
> - compatible = "MPC8260ADS";
> - #address-cells = <1>;
> - #size-cells = <1>;
> - linux,phandle = <100>;
> -
> - cpus {
> - #cpus = <1>;
> - #address-cells = <1>;
> - #size-cells = <0>;
> - linux,phandle = <200>;
> -
> - PowerPC,8272@0 {
> - device_type = "cpu";
> - reg = <0>;
> - d-cache-line-size = <20>; // 32 bytes
> - i-cache-line-size = <20>; // 32 bytes
> - d-cache-size = <4000>; // L1, 16K
> - i-cache-size = <4000>; // L1, 16K
> - timebase-frequency = <17d7840>;
> - bus-frequency = <5f5e100>;
> - clock-frequency = <17D78400>;
> - 32-bit;
> - linux,phandle = <201>;
> - linux,boot-cpu;
> - };
> - };
> -
> - interrupt-controller@f8200000 {
> - linux,phandle = <f8200000>;
> - #address-cells = <0>;
> - #interrupt-cells = <2>;
> - interrupt-controller;
> - reg = <f8200000 f8200004>;
> - built-in;
> - device_type = "pci-pic";
> - };
> - memory {
> - device_type = "memory";
> - linux,phandle = <300>;
> - reg = <00000000 4000000 f4500000 00000020>;
> - };
> -
> - chosen {
> - name = "chosen";
> - bootargs = "root=/dev/nfs rw ip=on";
> - linux,stdout-path = "/dev/ttyCPM0";
> - linux,platform = <0>;
> - interrupt-controller = <10c00>;
> - linux,phandle = <400>;
> - };
> -
> - soc8272@f0000000 {
> - #address-cells = <1>;
> - #size-cells = <1>;
> - #interrupt-cells = <2>;
> - device_type = "soc";
> - ranges = < 0 0 2 00000000 f0000000 00053000>;
> - reg = <f0000000 0>;
> -
> - mdio@0 {
> - device_type = "mdio";
> - compatible = "fs_enet";
> - reg = <0 0>;
> - linux,phandle = <24520>;
> - #address-cells = <1>;
> - #size-cells = <0>;
> - ethernet-phy@0 {
> - linux,phandle = <2452000>;
> - interrupt-parent = <10c00>;
> - interrupts = <19 1>;
> - reg = <0>;
> - bitbang = [ 12 12 13 02 02 01 ];
> - device_type = "ethernet-phy";
> - };
> - ethernet-phy@1 {
> - linux,phandle = <2452001>;
> - interrupt-parent = <10c00>;
> - interrupts = <19 1>;
> - bitbang = [ 12 12 13 02 02 01 ];
> - reg = <3>;
> - device_type = "ethernet-phy";
> - };
> - };
> -
> - ethernet@24000 {
> - #address-cells = <1>;
> - #size-cells = <0>;
> - device_type = "network";
> - device-id = <2>;
> - compatible = "fs_enet";
> - model = "FCC";
> - reg = <11300 20 8400 100 11380 30>;
> - mac-address = [ 00 11 2F 99 43 54 ];
> - interrupts = <20 2>;
> - interrupt-parent = <10c00>;
> - phy-handle = <2452000>;
> - rx-clock = <13>;
> - tx-clock = <12>;
> - };
> -
> - ethernet@25000 {
> - device_type = "network";
> - device-id = <3>;
> - compatible = "fs_enet";
> - model = "FCC";
> - reg = <11320 20 8500 100 113b0 30>;
> - mac-address = [ 00 11 2F 99 44 54 ];
> - interrupts = <21 2>;
> - interrupt-parent = <10c00>;
> - phy-handle = <2452001>;
> - rx-clock = <17>;
> - tx-clock = <18>;
> - };
> -
> - cpm@f0000000 {
> - linux,phandle = <f0000000>;
> - #address-cells = <1>;
> - #size-cells = <1>;
> - #interrupt-cells = <2>;
> - device_type = "cpm";
> - model = "CPM2";
> - ranges = <00000000 00000000 3ffff>;
> - reg = <10d80 3280>;
> - command-proc = <119c0>;
> - brg-frequency = <17D7840>;
> - cpm_clk = <BEBC200>;
> -
> - scc@11a00 {
> - device_type = "serial";
> - compatible = "cpm_uart";
> - model = "SCC";
> - device-id = <2>;
> - reg = <11a00 20 8000 100>;
> - current-speed = <1c200>;
> - interrupts = <28 2>;
> - interrupt-parent = <10c00>;
> - clock-setup = <0 00ffffff>;
> - rx-clock = <1>;
> - tx-clock = <1>;
> - };
> -
> - scc@11a60 {
> - device_type = "serial";
> - compatible = "cpm_uart";
> - model = "SCC";
> - device-id = <5>;
> - reg = <11a60 20 8300 100>;
> - current-speed = <1c200>;
> - interrupts = <2b 2>;
> - interrupt-parent = <10c00>;
> - clock-setup = <1b ffffff00>;
> - rx-clock = <4>;
> - tx-clock = <4>;
> - };
> -
> - };
> - interrupt-controller@10c00 {
> - linux,phandle = <10c00>;
> - #address-cells = <0>;
> - #interrupt-cells = <2>;
> - interrupt-controller;
> - reg = <10c00 80>;
> - built-in;
> - device_type = "cpm-pic";
> - };
> - pci@0500 {
> - linux,phandle = <0500>;
> - #interrupt-cells = <1>;
> - #size-cells = <2>;
> - #address-cells = <3>;
> - compatible = "8272";
> - device_type = "pci";
> - reg = <10430 4dc>;
> - clock-frequency = <3f940aa>;
> - interrupt-map-mask = <f800 0 0 7>;
> - interrupt-map = <
> -
> - /* IDSEL 0x16 */
> - b000 0 0 1 f8200000 40 0
> - b000 0 0 2 f8200000 41 0
> - b000 0 0 3 f8200000 42 0
> - b000 0 0 4 f8200000 43 0
> -
> - /* IDSEL 0x17 */
> - b800 0 0 1 f8200000 43 0
> - b800 0 0 2 f8200000 40 0
> - b800 0 0 3 f8200000 41 0
> - b800 0 0 4 f8200000 42 0
> -
> - /* IDSEL 0x18 */
> - c000 0 0 1 f8200000 42 0
> - c000 0 0 2 f8200000 43 0
> - c000 0 0 3 f8200000 40 0
> - c000 0 0 4 f8200000 41 0>;
> - interrupt-parent = <10c00>;
> - interrupts = <14 3>;
> - bus-range = <0 0>;
> - ranges = <02000000 0 80000000 80000000 0 40000000
> - 01000000 0 00000000 f6000000 0 02000000>;
> - };
> -
> -/* May need to remove if on a part without crypto engine */
> - crypto@30000 {
> - device_type = "crypto";
> - model = "SEC2";
> - compatible = "talitos";
> - reg = <30000 10000>;
> - interrupts = <b 0>;
> - interrupt-parent = <10c00>;
> - num-channels = <4>;
> - channel-fifo-len = <18>;
> - exec-units-mask = <0000007e>;
> -/* desc mask is for rev1.x, we need runtime fixup for >=2.x */
> - descriptor-types-mask = <01010ebf>;
> - };
> -
> - };
> -};
> diff --git a/arch/powerpc/sysdev/cpm2_pic.c b/arch/powerpc/sysdev/cpm2_pic.c
> index 28b0189..5175299 100644
> --- a/arch/powerpc/sysdev/cpm2_pic.c
> +++ b/arch/powerpc/sysdev/cpm2_pic.c
> @@ -147,7 +147,7 @@ static struct irq_chip cpm2_pic = {
> .end = cpm2_end_irq,
> };
>
> -unsigned int cpm2_get_irq(struct pt_regs *regs)
> +int cpm2_get_irq(struct pt_regs *regs)
> {
> int irq;
> unsigned long bits;
> diff --git a/arch/powerpc/sysdev/cpm2_pic.h b/arch/powerpc/sysdev/cpm2_pic.h
> index 3c513e5..d63e45d 100644
> --- a/arch/powerpc/sysdev/cpm2_pic.h
> +++ b/arch/powerpc/sysdev/cpm2_pic.h
> @@ -3,7 +3,7 @@ #define _PPC_KERNEL_CPM2_H
>
> extern intctl_cpm2_t *cpm2_intctl;
>
> -extern unsigned int cpm2_get_irq(struct pt_regs *regs);
> +extern int cpm2_get_irq(struct pt_regs *regs);
>
> extern void cpm2_pic_init(struct device_node*);
>
> diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
> index 39b76f9..022ed27 100644
> --- a/arch/powerpc/sysdev/fsl_soc.c
> +++ b/arch/powerpc/sysdev/fsl_soc.c
> @@ -37,7 +37,6 @@ #include <mm/mmu_decl.h>
> #include <asm/cpm2.h>
>
> extern void init_fcc_ioports(struct fs_platform_info*);
> -extern void init_scc_ioports(struct fs_uart_platform_info*);
> static phys_addr_t immrbase = -1;
>
> phys_addr_t get_immrbase(void)
> @@ -567,7 +566,7 @@ static int __init fs_enet_of_init(void)
> struct resource r[4];
> struct device_node *phy, *mdio;
> struct fs_platform_info fs_enet_data;
> - const unsigned int *id, *phy_addr, phy_irq;
> + const unsigned int *id, *phy_addr;
> const void *mac_addr;
> const phandle *ph;
> const char *model;
> @@ -589,7 +588,6 @@ static int __init fs_enet_of_init(void)
> if (ret)
> goto err;
> r[2].name = fcc_regs_c;
> - fs_enet_data.fcc_regs_c = r[2].start;
>
> r[3].start = r[3].end = irq_of_parse_and_map(np, 0);
> r[3].flags = IORESOURCE_IRQ;
> @@ -622,8 +620,6 @@ static int __init fs_enet_of_init(void)
> phy_addr = get_property(phy, "reg", NULL);
> fs_enet_data.phy_addr = *phy_addr;
>
> - phy_irq = get_property(phy, "interrupts", NULL);
> -
> id = get_property(np, "device-id", NULL);
> fs_enet_data.fs_no = *id;
> strcpy(fs_enet_data.fs_type, model);
> @@ -641,7 +637,6 @@ static int __init fs_enet_of_init(void)
>
> if (strstr(model, "FCC")) {
> int fcc_index = *id - 1;
> - unsigned char* mdio_bb_prop;
>
> fs_enet_data.dpram_offset = (u32)cpm_dpram_addr(0);
> fs_enet_data.rx_ring = 32;
> @@ -657,63 +652,14 @@ static int __init fs_enet_of_init(void)
> (u32)res.start, fs_enet_data.phy_addr);
> fs_enet_data.bus_id = (char*)&bus_id[(*id)];
> fs_enet_data.init_ioports = init_fcc_ioports;
> + }
>
> - mdio_bb_prop = get_property(phy, "bitbang", NULL);
> - if (mdio_bb_prop) {
> - struct platform_device *fs_enet_mdio_bb_dev;
> - struct fs_mii_bb_platform_info fs_enet_mdio_bb_data;
> -
> - fs_enet_mdio_bb_dev =
> - platform_device_register_simple("fsl-bb-mdio",
> - i, NULL, 0);
> - memset(&fs_enet_mdio_bb_data, 0,
> - sizeof(struct fs_mii_bb_platform_info));
> - fs_enet_mdio_bb_data.mdio_dat.bit =
> - mdio_bb_prop[0];
> - fs_enet_mdio_bb_data.mdio_dir.bit =
> - mdio_bb_prop[1];
> - fs_enet_mdio_bb_data.mdc_dat.bit =
> - mdio_bb_prop[2];
> - fs_enet_mdio_bb_data.mdio_port =
> - mdio_bb_prop[3];
> - fs_enet_mdio_bb_data.mdc_port =
> - mdio_bb_prop[4];
> - fs_enet_mdio_bb_data.delay =
> - mdio_bb_prop[5];
> -
> - fs_enet_mdio_bb_data.irq[0] = phy_irq[0];
> - fs_enet_mdio_bb_data.irq[1] = -1;
> - fs_enet_mdio_bb_data.irq[2] = -1;
> - fs_enet_mdio_bb_data.irq[3] = phy_irq[0];
> - fs_enet_mdio_bb_data.irq[31] = -1;
> -
> - fs_enet_mdio_bb_data.mdio_dat.offset =
> - (u32)&cpm2_immr->im_ioport.iop_pdatc;
> - fs_enet_mdio_bb_data.mdio_dir.offset =
> - (u32)&cpm2_immr->im_ioport.iop_pdirc;
> - fs_enet_mdio_bb_data.mdc_dat.offset =
> - (u32)&cpm2_immr->im_ioport.iop_pdatc;
> -
> - ret = platform_device_add_data(
> - fs_enet_mdio_bb_dev,
> - &fs_enet_mdio_bb_data,
> - sizeof(struct fs_mii_bb_platform_info));
> - if (ret)
> - goto unreg;
> - } else {
> - printk(KERN_ERR
> - "mii-properties isn't found in device tree\n");
> - ret = -ENODEV;
> - goto unreg;
> - }
> - }
> -
> - of_node_put(phy);
> - of_node_put(mdio);
> + of_node_put(phy);
> + of_node_put(mdio);
>
> - ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
> - sizeof(struct
> - fs_platform_info));
> + ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
> + sizeof(struct
> + fs_platform_info));
> if (ret)
> goto unreg;
> }
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
>
>
--
Sincerely,
Vitaly
^ permalink raw reply
* [PATCH] POWERPC: mpc82xx merge: board-specific/platform stuff(resend)
From: Vitaly Bordug @ 2006-09-22 13:50 UTC (permalink / raw)
To: Paul Mackerras; +Cc: linuxppc-dev
This intruduces 82xx family in arch/powerpc/platforms,
and has all the board-specific code to represent regression-less
transaction from ppc. The functionality is apparently the same, including
PCI controller.
Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
---
arch/powerpc/platforms/82xx/Kconfig | 21 +
arch/powerpc/platforms/82xx/Makefile | 5
arch/powerpc/platforms/82xx/m82xx_pci.h | 19 +
arch/powerpc/platforms/82xx/mpc82xx.c | 111 +++++
arch/powerpc/platforms/82xx/mpc82xx_ads.c | 661 +++++++++++++++++++++++++++++
arch/powerpc/platforms/82xx/pq2ads.h | 67 +++
6 files changed, 884 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/platforms/82xx/Kconfig b/arch/powerpc/platforms/82xx/Kconfig
new file mode 100644
index 0000000..47d841e
--- /dev/null
+++ b/arch/powerpc/platforms/82xx/Kconfig
@@ -0,0 +1,21 @@
+menu "Platform support"
+ depends on PPC_82xx
+
+choice
+ prompt "Machine Type"
+ default MPC82xx_ADS
+
+config MPC82xx_ADS
+ bool "Freescale MPC82xx ADS"
+ select DEFAULT_UIMAGE
+ select PQ2ADS
+ select 8272
+ select 8260
+ select CPM2
+ select FSL_SOC
+ help
+ This option enables support for the MPC8272 ADS board
+
+endchoice
+
+endmenu
diff --git a/arch/powerpc/platforms/82xx/Makefile b/arch/powerpc/platforms/82xx/Makefile
new file mode 100644
index 0000000..d9fd4c8
--- /dev/null
+++ b/arch/powerpc/platforms/82xx/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for the PowerPC 82xx linux kernel.
+#
+obj-$(CONFIG_PPC_82xx) += mpc82xx.o
+obj-$(CONFIG_MPC82xx_ADS) += mpc82xx_ads.o
diff --git a/arch/powerpc/platforms/82xx/m82xx_pci.h b/arch/powerpc/platforms/82xx/m82xx_pci.h
new file mode 100644
index 0000000..9cd8893
--- /dev/null
+++ b/arch/powerpc/platforms/82xx/m82xx_pci.h
@@ -0,0 +1,19 @@
+#ifndef _PPC_KERNEL_M82XX_PCI_H
+#define _PPC_KERNEL_M82XX_PCI_H
+
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <asm/m8260_pci.h>
+
+#define SIU_INT_IRQ1 ((uint)0x13 + CPM_IRQ_OFFSET)
+
+#ifndef _IO_BASE
+#define _IO_BASE isa_io_base
+#endif
+
+#endif /* _PPC_KERNEL_M8260_PCI_H */
diff --git a/arch/powerpc/platforms/82xx/mpc82xx.c b/arch/powerpc/platforms/82xx/mpc82xx.c
new file mode 100644
index 0000000..89d702d
--- /dev/null
+++ b/arch/powerpc/platforms/82xx/mpc82xx.c
@@ -0,0 +1,111 @@
+/*
+ * MPC82xx setup and early boot code plus other random bits.
+ *
+ * Author: Vitaly Bordug <vbordug@ru.mvista.com>
+ *
+ * Copyright (c) 2006 MontaVista Software, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/reboot.h>
+#include <linux/pci.h>
+#include <linux/interrupt.h>
+#include <linux/kdev_t.h>
+#include <linux/major.h>
+#include <linux/console.h>
+#include <linux/delay.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+#include <linux/initrd.h>
+#include <linux/module.h>
+#include <linux/fsl_devices.h>
+#include <linux/fs_uart_pd.h>
+
+#include <asm/system.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+#include <asm/atomic.h>
+#include <asm/time.h>
+#include <asm/io.h>
+#include <asm/machdep.h>
+#include <asm/bootinfo.h>
+#include <asm/pci-bridge.h>
+#include <asm/mpc8260.h>
+#include <asm/irq.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/cpm2.h>
+#include <asm/udbg.h>
+#include <asm/i8259.h>
+#include <linux/fs_enet_pd.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/cpm2_pic.h>
+
+#include "pq2ads_pd.h"
+
+static int __init get_freq(char *name, unsigned long *val)
+{
+ struct device_node *cpu;
+ 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);
+ if (fp) {
+ found = 1;
+ *val = *fp++;
+ }
+
+ of_node_put(cpu);
+ }
+
+ return found;
+}
+
+void __init m82xx_calibrate_decr(void)
+{
+ ppc_tb_freq = 125000000;
+ if (!get_freq("bus-frequency", &ppc_tb_freq)) {
+ printk(KERN_ERR "WARNING: Estimating decrementer frequency "
+ "(not found)\n");
+ }
+ ppc_tb_freq /= 4;
+ ppc_proc_freq = 1000000000;
+ if (!get_freq("clock-frequency", &ppc_proc_freq))
+ printk(KERN_ERR "WARNING: Estimating processor frequency"
+ "(not found)\n");
+}
+
+void mpc82xx_ads_show_cpuinfo(struct seq_file *m)
+{
+ uint pvid, svid, phid1;
+ uint memsize = total_memory;
+
+ pvid = mfspr(SPRN_PVR);
+ svid = mfspr(SPRN_SVR);
+
+ seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n");
+ seq_printf(m, "Machine\t\t: %s\n", CPUINFO_MACHINE);
+ seq_printf(m, "PVR\t\t: 0x%x\n", pvid);
+ seq_printf(m, "SVR\t\t: 0x%x\n", svid);
+
+ /* Display cpu Pll setting */
+ phid1 = mfspr(SPRN_HID1);
+ seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));
+
+ /* Display the amount of memory */
+ seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
+}
diff --git a/arch/powerpc/platforms/82xx/mpc82xx_ads.c b/arch/powerpc/platforms/82xx/mpc82xx_ads.c
new file mode 100644
index 0000000..cd2d0db
--- /dev/null
+++ b/arch/powerpc/platforms/82xx/mpc82xx_ads.c
@@ -0,0 +1,661 @@
+/*
+ * MPC82xx_ads setup and early boot code plus other random bits.
+ *
+ * Author: Vitaly Bordug <vbordug@ru.mvista.com>
+ * m82xx_restart fix by Wade Farnsworth <wfarnsworth@mvista.com>
+ *
+ * Copyright (c) 2006 MontaVista Software, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/reboot.h>
+#include <linux/pci.h>
+#include <linux/interrupt.h>
+#include <linux/kdev_t.h>
+#include <linux/major.h>
+#include <linux/console.h>
+#include <linux/delay.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+#include <linux/initrd.h>
+#include <linux/module.h>
+#include <linux/fsl_devices.h>
+#include <linux/fs_uart_pd.h>
+
+#include <asm/system.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+#include <asm/atomic.h>
+#include <asm/time.h>
+#include <asm/io.h>
+#include <asm/machdep.h>
+#include <asm/bootinfo.h>
+#include <asm/pci-bridge.h>
+#include <asm/mpc8260.h>
+#include <asm/irq.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/cpm2.h>
+#include <asm/udbg.h>
+#include <asm/i8259.h>
+#include <linux/fs_enet_pd.h>
+
+#include <sysdev/fsl_soc.h>
+#include <../sysdev/cpm2_pic.h>
+
+#include "pq2ads_pd.h"
+
+#ifdef CONFIG_PCI
+static uint pci_clk_frq;
+static struct {
+ unsigned long *pci_int_stat_reg;
+ unsigned long *pci_int_mask_reg;
+} pci_regs;
+
+static unsigned long pci_int_base;
+static struct irq_host *pci_pic_host;
+static struct device_node *pci_pic_node;
+#endif
+
+static void __init mpc82xx_ads_pic_init(void)
+{
+ struct device_node *np = of_find_node_by_type(NULL, "cpm-pic");
+ struct resource r;
+ cpm2_map_t *cpm_reg;
+
+ if (np == NULL) {
+ printk(KERN_ERR "PIC init: can not find cpm-pic node\n");
+ return;
+ }
+ if (of_address_to_resource(np, 0, &r)) {
+ printk(KERN_ERR "PIC init: invalid resource\n");
+ of_node_put(np);
+ return;
+ }
+ cpm2_pic_init(np);
+ of_node_put(np);
+
+ /* Initialize the default interrupt mapping priorities,
+ * in case the boot rom changed something on us.
+ */
+ cpm_reg = (cpm2_map_t *) ioremap(get_immrbase(), sizeof(cpm2_map_t));
+ cpm_reg->im_intctl.ic_siprr = 0x05309770;
+ iounmap(cpm_reg);
+#ifdef CONFIG_PCI
+ /* Initialize stuff for the 82xx CPLD IC and install demux */
+ m82xx_pci_init_irq();
+#endif
+}
+
+static void init_fcc1_ioports(struct fs_platform_info *fpi)
+{
+ struct io_port *io;
+ u32 tempval;
+ cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
+ struct device_node *np;
+ struct resource r;
+ u32 *bcsr;
+
+ np = of_find_node_by_type(NULL, "memory");
+ if (!np) {
+ printk(KERN_INFO "No memory node in device tree\n");
+ return;
+ }
+ if (of_address_to_resource(np, 1, &r)) {
+ printk(KERN_INFO "No memory reg property [1] in devicetree\n");
+ return;
+ }
+ of_node_put(np);
+ bcsr = ioremap(r.start + 4, sizeof(u32));
+ io = &immap->im_ioport;
+
+ /* Enable the PHY */
+ clrbits32(bcsr, BCSR1_FETHIEN);
+ setbits32(bcsr, BCSR1_FETH_RST);
+
+ /* FCC1 pins are on port A/C. */
+ /* Configure port A and C pins for FCC1 Ethernet. */
+
+ tempval = in_be32(&io->iop_pdira);
+ tempval &= ~PA1_DIRA0;
+ tempval |= PA1_DIRA1;
+ out_be32(&io->iop_pdira, tempval);
+
+ tempval = in_be32(&io->iop_psora);
+ tempval &= ~PA1_PSORA0;
+ tempval |= PA1_PSORA1;
+ out_be32(&io->iop_psora, tempval);
+
+ setbits32(&io->iop_ppara, PA1_DIRA0 | PA1_DIRA1);
+
+ /* Alter clocks */
+ tempval = PC_CLK(fpi->clk_tx - 8) | PC_CLK(fpi->clk_rx - 8);
+
+ clrbits32(&io->iop_psorc, tempval);
+ clrbits32(&io->iop_pdirc, tempval);
+ setbits32(&io->iop_pparc, tempval);
+
+ cpm2_clk_setup(CPM_CLK_FCC1, fpi->clk_rx, CPM_CLK_RX);
+ cpm2_clk_setup(CPM_CLK_FCC1, fpi->clk_tx, CPM_CLK_TX);
+
+ iounmap(bcsr);
+ iounmap(immap);
+}
+
+static void init_fcc2_ioports(struct fs_platform_info *fpi)
+{
+ cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
+ struct device_node *np;
+ struct resource r;
+ u32 *bcsr;
+
+ struct io_port *io;
+ u32 tempval;
+
+ np = of_find_node_by_type(NULL, "memory");
+ if (!np) {
+ printk(KERN_INFO "No memory node in device tree\n");
+ return;
+ }
+ if (of_address_to_resource(np, 1, &r)) {
+ printk(KERN_INFO "No memory reg property [1] in devicetree\n");
+ return;
+ }
+ of_node_put(np);
+ io = &immap->im_ioport;
+ bcsr = ioremap(r.start + 12, sizeof(u32));
+
+ /* Enable the PHY */
+ clrbits32(bcsr, BCSR3_FETHIEN2);
+ setbits32(bcsr, BCSR3_FETH2_RST);
+
+ /* FCC2 are port B/C. */
+ /* Configure port A and C pins for FCC2 Ethernet. */
+
+ tempval = in_be32(&io->iop_pdirb);
+ tempval &= ~PB2_DIRB0;
+ tempval |= PB2_DIRB1;
+ out_be32(&io->iop_pdirb, tempval);
+
+ tempval = in_be32(&io->iop_psorb);
+ tempval &= ~PB2_PSORB0;
+ tempval |= PB2_PSORB1;
+ out_be32(&io->iop_psorb, tempval);
+
+ setbits32(&io->iop_pparb, PB2_DIRB0 | PB2_DIRB1);
+
+ tempval = PC_CLK(fpi->clk_tx - 8) | PC_CLK(fpi->clk_rx - 8);
+
+ /* Alter clocks */
+ clrbits32(&io->iop_psorc, tempval);
+ clrbits32(&io->iop_pdirc, tempval);
+ setbits32(&io->iop_pparc, tempval);
+
+ cpm2_clk_setup(CPM_CLK_FCC2, fpi->clk_rx, CPM_CLK_RX);
+ cpm2_clk_setup(CPM_CLK_FCC2, fpi->clk_tx, CPM_CLK_TX);
+
+ iounmap(bcsr);
+ iounmap(immap);
+}
+
+void init_fcc_ioports(struct fs_platform_info *fpi)
+{
+ int fcc_no = fs_get_fcc_index(fpi->fs_no);
+
+ switch (fcc_no) {
+ case 0:
+ init_fcc1_ioports(fpi);
+ break;
+ case 1:
+ init_fcc2_ioports(fpi);
+ break;
+ default:
+ printk(KERN_ERR "init_fcc_ioports: invalid FCC number\n");
+ return;
+ }
+}
+
+static void init_scc1_uart_ioports(struct fs_uart_platform_info *data)
+{
+ cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
+
+ /* SCC1 is only on port D */
+ setbits32(&immap->im_ioport.iop_ppard, 0x00000003);
+ clrbits32(&immap->im_ioport.iop_psord, 0x00000001);
+ setbits32(&immap->im_ioport.iop_psord, 0x00000002);
+ clrbits32(&immap->im_ioport.iop_pdird, 0x00000001);
+ setbits32(&immap->im_ioport.iop_pdird, 0x00000002);
+
+ clrbits32(&immap->im_cpmux.cmx_scr, (0x00000007 << (4 - data->clk_tx)));
+ clrbits32(&immap->im_cpmux.cmx_scr, (0x00000038 << (4 - data->clk_rx)));
+ setbits32(&immap->im_cpmux.cmx_scr,
+ ((data->clk_tx - 1) << (4 - data->clk_tx)));
+ setbits32(&immap->im_cpmux.cmx_scr,
+ ((data->clk_rx - 1) << (4 - data->clk_rx)));
+
+ iounmap(immap);
+}
+
+static void init_scc4_uart_ioports(struct fs_uart_platform_info *data)
+{
+ cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
+
+ setbits32(&immap->im_ioport.iop_ppard, 0x00000600);
+ clrbits32(&immap->im_ioport.iop_psord, 0x00000600);
+ clrbits32(&immap->im_ioport.iop_pdird, 0x00000200);
+ setbits32(&immap->im_ioport.iop_pdird, 0x00000400);
+
+ clrbits32(&immap->im_cpmux.cmx_scr, (0x00000007 << (4 - data->clk_tx)));
+ clrbits32(&immap->im_cpmux.cmx_scr, (0x00000038 << (4 - data->clk_rx)));
+ setbits32(&immap->im_cpmux.cmx_scr,
+ ((data->clk_tx - 1) << (4 - data->clk_tx)));
+ setbits32(&immap->im_cpmux.cmx_scr,
+ ((data->clk_rx - 1) << (4 - data->clk_rx)));
+
+ iounmap(immap);
+}
+
+void init_scc_ioports(struct fs_uart_platform_info *data)
+{
+ int scc_no = fs_get_scc_index(data->fs_no);
+
+ switch (scc_no) {
+ case 0:
+ init_scc1_uart_ioports(data);
+ data->brg = data->clk_rx;
+ break;
+ case 3:
+ init_scc4_uart_ioports(data);
+ data->brg = data->clk_rx;
+ break;
+ default:
+ printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
+ return;
+ }
+}
+
+void __init m82xx_board_setup(void)
+{
+ cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
+ struct device_node *np;
+ struct resource r;
+ u32 *bcsr;
+
+ np = of_find_node_by_type(NULL, "memory");
+ if (!np) {
+ printk(KERN_INFO "No memory node in device tree\n");
+ return;
+ }
+ if (of_address_to_resource(np, 1, &r)) {
+ printk(KERN_INFO "No memory reg property [1] in devicetree\n");
+ return;
+ }
+ of_node_put(np);
+ bcsr = ioremap(r.start + 4, sizeof(u32));
+ /* Enable the 2nd UART port */
+ clrbits32(bcsr, BCSR1_RS232_EN2);
+
+#ifdef CONFIG_SERIAL_CPM_SCC1
+ clrbits32((u32 *) & immap->im_scc[0].scc_sccm,
+ UART_SCCM_TX | UART_SCCM_RX);
+ clrbits32((u32 *) & immap->im_scc[0].scc_gsmrl,
+ SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+#endif
+
+#ifdef CONFIG_SERIAL_CPM_SCC2
+ clrbits32((u32 *) & immap->im_scc[1].scc_sccm,
+ UART_SCCM_TX | UART_SCCM_RX);
+ clrbits32((u32 *) & immap->im_scc[1].scc_gsmrl,
+ SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+#endif
+
+#ifdef CONFIG_SERIAL_CPM_SCC3
+ clrbits32((u32 *) & immap->im_scc[2].scc_sccm,
+ UART_SCCM_TX | UART_SCCM_RX);
+ clrbits32((u32 *) & immap->im_scc[2].scc_gsmrl,
+ SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+#endif
+
+#ifdef CONFIG_SERIAL_CPM_SCC4
+ clrbits32((u32 *) & immap->im_scc[3].scc_sccm,
+ UART_SCCM_TX | UART_SCCM_RX);
+ clrbits32((u32 *) & immap->im_scc[3].scc_gsmrl,
+ SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+#endif
+
+ iounmap(bcsr);
+ iounmap(immap);
+}
+
+#ifdef CONFIG_PCI
+static void m82xx_pci_mask_irq(unsigned int irq)
+{
+ int bit = irq - pci_int_base;
+
+ *pci_regs.pci_int_mask_reg |= (1 << (31 - bit));
+ return;
+}
+
+static void m82xx_pci_unmask_irq(unsigned int irq)
+{
+ int bit = irq - pci_int_base;
+
+ *pci_regs.pci_int_mask_reg &= ~(1 << (31 - bit));
+ return;
+}
+
+static void m82xx_pci_mask_and_ack(unsigned int irq)
+{
+ int bit = irq - pci_int_base;
+
+ *pci_regs.pci_int_mask_reg |= (1 << (31 - bit));
+ return;
+}
+
+static void m82xx_pci_end_irq(unsigned int irq)
+{
+ int bit = irq - pci_int_base;
+
+ *pci_regs.pci_int_mask_reg &= ~(1 << (31 - bit));
+ return;
+}
+
+struct hw_interrupt_type m82xx_pci_ic = {
+ .typename = "MPC82xx ADS PCI",
+ .name = "MPC82xx ADS PCI",
+ .enable = m82xx_pci_unmask_irq,
+ .disable = m82xx_pci_mask_irq,
+ .ack = m82xx_pci_mask_and_ack,
+ .end = m82xx_pci_end_irq,
+ .mask = m82xx_pci_mask_irq,
+ .mask_ack = m82xx_pci_mask_and_ack,
+ .unmask = m82xx_pci_unmask_irq,
+ .eoi = m82xx_pci_end_irq,
+};
+
+static void
+m82xx_pci_irq_demux(unsigned int irq, struct irq_desc *desc,
+ struct pt_regs *regs)
+{
+ unsigned long stat, mask, pend;
+ int bit;
+
+ for (;;) {
+ stat = *pci_regs.pci_int_stat_reg;
+ mask = *pci_regs.pci_int_mask_reg;
+ pend = stat & ~mask & 0xf0000000;
+ if (!pend)
+ break;
+ for (bit = 0; pend != 0; ++bit, pend <<= 1) {
+ if (pend & 0x80000000)
+ __do_IRQ(pci_int_base + bit, regs);
+ }
+ }
+}
+
+static int pci_pic_host_match(struct irq_host *h, struct device_node *node)
+{
+ return node == pci_pic_node;
+}
+
+static int pci_pic_host_map(struct irq_host *h, unsigned int virq,
+ irq_hw_number_t hw)
+{
+ get_irq_desc(virq)->status |= IRQ_LEVEL;
+ set_irq_chip(virq, &m82xx_pci_ic);
+ return 0;
+}
+
+static void pci_host_unmap(struct irq_host *h, unsigned int virq)
+{
+ /* remove chip and handler */
+ set_irq_chip(virq, NULL);
+}
+
+static struct irq_host_ops pci_pic_host_ops = {
+ .match = pci_pic_host_match,
+ .map = pci_pic_host_map,
+ .unmap = pci_host_unmap,
+};
+
+void m82xx_pci_init_irq(void)
+{
+ int irq;
+ cpm2_map_t *immap;
+ struct device_node *np;
+ struct resource r;
+ const u32 *regs;
+ unsigned int size;
+ const u32 *irq_map;
+ int i;
+ unsigned int irq_max, irq_min;
+
+ if ((np = of_find_node_by_type(NULL, "soc")) == NULL) {
+ printk(KERN_INFO "No SOC node in device tree\n");
+ return;
+ }
+ memset(&r, 0, sizeof(r));
+ if (of_address_to_resource(np, 0, &r)) {
+ printk(KERN_INFO "No SOC reg property in device tree\n");
+ return;
+ }
+ immap = ioremap(r.start, sizeof(*immap));
+ of_node_put(np);
+
+ /* install the demultiplexer for the PCI cascade interrupt */
+ np = of_find_node_by_type(NULL, "pci");
+ if (!np) {
+ printk(KERN_INFO "No pci node on device tree\n");
+ iounmap(immap);
+ return;
+ }
+ irq_map = get_property(np, "interrupt-map", &size);
+ if ((!irq_map) || (size <= 7)) {
+ printk(KERN_INFO "No interrupt-map property of pci node\n");
+ iounmap(immap);
+ return;
+ }
+ size /= sizeof(irq_map[0]);
+ for (i = 0, irq_max = 0, irq_min = 512; i < size; i += 7, irq_map += 7) {
+ if (irq_map[5] < irq_min)
+ irq_min = irq_map[5];
+ if (irq_map[5] > irq_max)
+ irq_max = irq_map[5];
+ }
+ pci_int_base = irq_min;
+ irq = irq_of_parse_and_map(np, 0);
+ set_irq_chained_handler(irq, m82xx_pci_irq_demux);
+ of_node_put(np);
+ np = of_find_node_by_type(NULL, "pci-pic");
+ if (!np) {
+ printk(KERN_INFO "No pci pic node on device tree\n");
+ iounmap(immap);
+ return;
+ }
+ pci_pic_node = of_node_get(np);
+ /* PCI interrupt controller registers: status and mask */
+ regs = get_property(np, "reg", &size);
+ if ((!regs) || (size <= 2)) {
+ printk(KERN_INFO "No reg property in pci pic node\n");
+ iounmap(immap);
+ return;
+ }
+ pci_regs.pci_int_stat_reg =
+ ioremap(regs[0], sizeof(*pci_regs.pci_int_stat_reg));
+ pci_regs.pci_int_mask_reg =
+ ioremap(regs[1], sizeof(*pci_regs.pci_int_mask_reg));
+ of_node_put(np);
+ /* configure chip select for PCI interrupt controller */
+ immap->im_memctl.memc_br3 = regs[0] | 0x00001801;
+ immap->im_memctl.memc_or3 = 0xffff8010;
+ /* make PCI IRQ level sensitive */
+ immap->im_intctl.ic_siexr &= ~(1 << (14 - (irq - SIU_INT_IRQ1)));
+
+ /* mask all PCI interrupts */
+ *pci_regs.pci_int_mask_reg |= 0xfff00000;
+ iounmap(immap);
+ pci_pic_host =
+ irq_alloc_host(IRQ_HOST_MAP_LINEAR, irq_max - irq_min + 1,
+ &pci_pic_host_ops, irq_max + 1);
+ return;
+}
+
+static int m82xx_pci_exclude_device(u_char bus, u_char devfn)
+{
+ if (bus == 0 && PCI_SLOT(devfn) == 0)
+ return PCIBIOS_DEVICE_NOT_FOUND;
+ else
+ return PCIBIOS_SUCCESSFUL;
+}
+
+static void
+__init mpc82xx_pcibios_fixup(void)
+{
+ struct pci_dev *dev = NULL;
+
+ for_each_pci_dev(dev) {
+ pci_read_irq_line(dev);
+ }
+}
+
+void __init add_bridge(struct device_node *np)
+{
+ int len;
+ struct pci_controller *hose;
+ struct resource r;
+ const int *bus_range;
+ const void *ptr;
+
+ memset(&r, 0, sizeof(r));
+ if (of_address_to_resource(np, 0, &r)) {
+ printk(KERN_INFO "No PCI reg property in device tree\n");
+ return;
+ }
+ if (!(ptr = get_property(np, "clock-frequency", NULL))) {
+ printk(KERN_INFO "No clock-frequency property in PCI node");
+ return;
+ }
+ pci_clk_frq = *(uint *) ptr;
+ of_node_put(np);
+ bus_range = get_property(np, "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", np->full_name);
+ }
+
+ pci_assign_all_buses = 1;
+
+ hose = pcibios_alloc_controller();
+
+ if (!hose)
+ return;
+
+ hose->arch_data = np;
+ hose->set_cfg_type = 1;
+
+ hose->first_busno = bus_range ? bus_range[0] : 0;
+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
+ hose->bus_offset = 0;
+
+ hose->set_cfg_type = 1;
+
+ setup_indirect_pci(hose,
+ r.start + offsetof(pci_cpm2_t, pci_cfg_addr),
+ r.start + offsetof(pci_cpm2_t, pci_cfg_data));
+
+ pci_process_bridge_OF_ranges(hose, np, 1);
+}
+#endif
+
+/*
+ * Setup the architecture
+ */
+static void __init mpc82xx_ads_setup_arch(void)
+{
+#ifdef CONFIG_PCI
+ struct device_node *np;
+#endif
+
+ if (ppc_md.progress)
+ ppc_md.progress("mpc82xx_ads_setup_arch()", 0);
+ cpm2_reset();
+
+ /* Map I/O region to a 256MB BAT */
+
+ m82xx_board_setup();
+
+#ifdef CONFIG_PCI
+ ppc_md.pci_exclude_device = m82xx_pci_exclude_device;
+ for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+ add_bridge(np);
+
+ of_node_put(np);
+ ppc_md.pci_map_irq = NULL;
+ ppc_md.pcibios_fixup = mpc82xx_pcibios_fixup;
+ ppc_md.pcibios_fixup_bus = NULL;
+#endif
+
+#ifdef CONFIG_ROOT_NFS
+ ROOT_DEV = Root_NFS;
+#else
+ ROOT_DEV = Root_HDA1;
+#endif
+
+ if (ppc_md.progress)
+ ppc_md.progress("mpc82xx_ads_setup_arch(), finish", 0);
+}
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init mpc82xx_ads_probe(void)
+{
+ /* We always match for now, eventually we should look at
+ * the flat dev tree to ensure this is the board we are
+ * supposed to run on
+ */
+ return 1;
+}
+
+#define RMR_CSRE 0x00000001
+static void m82xx_restart(char *cmd)
+{
+ __volatile__ unsigned char dummy;
+
+ local_irq_disable();
+ ((cpm2_map_t *) cpm2_immr)->im_clkrst.car_rmr |= RMR_CSRE;
+
+ /* Clear the ME,EE,IR & DR bits in MSR to cause checkstop */
+ mtmsr(mfmsr() & ~(MSR_ME | MSR_EE | MSR_IR | MSR_DR));
+ dummy = ((cpm2_map_t *) cpm2_immr)->im_clkrst.res[0];
+ printk("Restart failed\n");
+ while (1) ;
+}
+
+static void m82xx_halt(void)
+{
+ local_irq_disable();
+ while (1) ;
+}
+
+define_machine(mpc82xx_ads)
+{
+ .name = "MPC82xx ADS",
+ .probe = mpc82xx_ads_probe,
+ .setup_arch = mpc82xx_ads_setup_arch,
+ .init_IRQ = mpc82xx_ads_pic_init,
+ .show_cpuinfo = mpc82xx_ads_show_cpuinfo,
+ .get_irq = cpm2_get_irq,
+ .calibrate_decr = m82xx_calibrate_decr,
+ .restart = m82xx_restart,.halt = m82xx_halt,
+};
diff --git a/arch/powerpc/platforms/82xx/pq2ads.h b/arch/powerpc/platforms/82xx/pq2ads.h
new file mode 100644
index 0000000..a734821
--- /dev/null
+++ b/arch/powerpc/platforms/82xx/pq2ads.h
@@ -0,0 +1,67 @@
+/*
+ * PQ2/mpc8260 board-specific stuff
+ *
+ * A collection of structures, addresses, and values associated with
+ * the Freescale MPC8260ADS/MPC8266ADS-PCI boards.
+ * Copied from the RPX-Classic and SBS8260 stuff.
+ *
+ * Author: Vitaly Bordug <vbordug@ru.mvista.com>
+ *
+ * Originally written by Dan Malek for Motorola MPC8260 family
+ *
+ * Copyright (c) 2001 Dan Malek <dan@embeddedalley.com>
+ * Copyright (c) 2006 MontaVista Software, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#ifdef __KERNEL__
+#ifndef __MACH_ADS8260_DEFS
+#define __MACH_ADS8260_DEFS
+
+#include <linux/config.h>
+
+#include <asm/ppcboot.h>
+
+/* For our show_cpuinfo hooks. */
+#define CPUINFO_VENDOR "Freescale Semiconductor"
+#define CPUINFO_MACHINE "PQ2 ADS PowerPC"
+
+/* Backword-compatibility stuff for the drivers */
+#define CPM_MAP_ADDR ((uint)0xf0000000)
+#define CPM_IRQ_OFFSET 0
+
+/* The ADS8260 has 16, 32-bit wide control/status registers, accessed
+ * only on word boundaries.
+ * Not all are used (yet), or are interesting to us (yet).
+ */
+
+/* Things of interest in the CSR.
+ */
+#define BCSR0_LED0 ((uint)0x02000000) /* 0 == on */
+#define BCSR0_LED1 ((uint)0x01000000) /* 0 == on */
+#define BCSR1_FETHIEN ((uint)0x08000000) /* 0 == enable*/
+#define BCSR1_FETH_RST ((uint)0x04000000) /* 0 == reset */
+#define BCSR1_RS232_EN1 ((uint)0x02000000) /* 0 ==enable */
+#define BCSR1_RS232_EN2 ((uint)0x01000000) /* 0 ==enable */
+#define BCSR3_FETHIEN2 ((uint)0x10000000) /* 0 == enable*/
+#define BCSR3_FETH2_RS ((uint)0x80000000) /* 0 == reset */
+
+/* cpm serial driver works with constants below */
+
+#define SIU_INT_SMC1 ((uint)0x04+CPM_IRQ_OFFSET)
+#define SIU_INT_SMC2i ((uint)0x05+CPM_IRQ_OFFSET)
+#define SIU_INT_SCC1 ((uint)0x28+CPM_IRQ_OFFSET)
+#define SIU_INT_SCC2 ((uint)0x29+CPM_IRQ_OFFSET)
+#define SIU_INT_SCC3 ((uint)0x2a+CPM_IRQ_OFFSET)
+#define SIU_INT_SCC4 ((uint)0x2b+CPM_IRQ_OFFSET)
+
+void m82xx_pci_init_irq(void);
+void mpc82xx_ads_show_cpuinfo(struct seq_file*);
+void m82xx_calibrate_decr(void);
+
+#endif /* __MACH_ADS8260_DEFS */
+#endif /* __KERNEL__ */
^ permalink raw reply related
* Re: [Fastboot] [PATCH] kexec: remove memory reserve patching for powerpc device tree
From: Vivek Goyal @ 2006-09-22 14:23 UTC (permalink / raw)
To: Michael Neuling; +Cc: Jon Loeliger, Fastboot mailing list, linuxppc-dev, Horms
In-Reply-To: <20060922011153.39DD867B79@ozlabs.org>
On Fri, Sep 22, 2006 at 10:41:51AM +0930, Michael Neuling wrote:
> In message <20060921143253.GC1542@in.ibm.com> you wrote:
> > On Thu, Sep 21, 2006 at 09:18:39AM -0500, Jon Loeliger wrote:
> > > So, like, the other day Vivek Goyal mumbled:
> > > >
> > > > Now with distros adopting kexce-tools, I am in for maintaining the backwa
> rd
> > > > compatibility as far as possible. Putting a note in the code is good that
> > > > down the line, get rid of this code.
> > >
> > > Perhaps scheduling it as an entry in
> > >
> > > Documentation/feature-removal-schedule.txt
> > >
> > > just so people (distros) can plan around it?
> >
> > Perfect. In kexec-tools it can go in doc/feature-removal-schedule.txt.
>
> It doesn't really need to go in the kernel source as the kernel has
> already changed and besides, we were adding a feature to the kernel, not
> removing one.
>
> At this stage, it's just a kexec tools feature removal.
>
Well, what I meant is that a similar file can go in kexec-tools/doc/ dir.
-Vivek
^ permalink raw reply
* mpc885 PCMCIA question
From: Ryan Esty @ 2006-09-22 14:18 UTC (permalink / raw)
To: linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 4281 bytes --]
I was wondering if anyone on this list has had any experience with running PCMCIA on a recent kernel with a mpc885ads board? We have been using 2.6.18-rc6 and haven't been having a lot of luck with getting PCMCIA to function. We can use pccardctl from pcmciautils and see our compact flash there but the block device doesn't show up in /proc/devices and we can't mount the device. It looks like there is a problem between ide-cs and pcmcia because of what pccardctrl info turns up. We also have a 2.4 kernel from Arabella that works so we know it isn't a hardware problem. Does anyone have any suggestions on what other things we should look into? Below is the kernel boot up with pcmcia ide relavence and pccardctl, /proc/devices and dump_cis. We compiled everything into the kernel so there are no modules for ide-cs or any of the pcmcia code. Sorry if this is too PCMCIA specific I was going to post on lists.infradead.org but the list seems to be down. Any help would be appreciated.
###kernel boot sequence
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
PCMCIA slot A: phys mem e0000000...ec000000 (size 0c000000)
Card ID: STI Flash 7.2.0
Fixed Disk Card
IDE interface
[silicon] [unique] [single] [sleep] [standby] [idle] [low power]
ide-floppy driver 0.99.newide
m8xx_pcmcia: Version 0.06, Aug 2005
m8xx_pcmcia: MPC885ADS using SLOT_A with IRQ 13.
[snip...]
pccard: PCMCIA card inserted into slot 0
pcmcia: registering new device pcmcia0.0
###pccardctl info
PRODID_1="STI"
PRODID_2="Flash 7.2.0"
PRODID_3=""
PRODID_4=""
MANFID=014d,0100
FUNCID=4
###pccardctl ls
Socket 0 Bridge: [m8xx-pcmcia] (bus ID: m8xx-pcmcia.0)
Socket 0 Device 0: [-- no driver --] (bus ID: 0.0)
###/proc/devices
Character devices:
1 mem
5 /dev/tty
5 /dev/console
5 /dev/ptmx
10 misc
128 ptm
136 pts
204 ttyCPM
249 dsxsram
250 dsxcpu
251 dsxdsp
252 dsxwd
254 rtc
Block devices:
1 ramdisk
###dump_cis
Socket 0
offset 0x02, tuple 0x01, link 0x03
d9 01 ff
dev_info
fn_specific 250ns, 2kb
offset 0x07, tuple 0x1c, link 0x04
03 d9 01 ff
invalid tuple
offset 0x0d, tuple 0x18, link 0x02
df 01
common_jedec 0xdf 0x01
offset 0x11, tuple 0x20, link 0x04
4d 01 00 01
manfid 0x014d, 0x0100
offset 0x17, tuple 0x15, link 0x13
04 01 53 54 49 00 46 6c 61 73 68 20 37 2e 32 2e
30 00 ff
vers_1 4.1, "STI", "Flash 7.2.0"
offset 0x2c, tuple 0x21, link 0x02
04 01
funcid fixed_disk [post]
offset 0x30, tuple 0x22, link 0x02
01 01
disk_interface [ide]
offset 0x34, tuple 0x22, link 0x03
02 0c 0f
disk_features [silicon] [unique] [single]
[sleep] [standby] [idle] [low power]
offset 0x39, tuple 0x1a, link 0x05
01 03 00 02 0f
config base 0x0200 mask 0x000f last_index 0x03
offset 0x40, tuple 0x1b, link 0x08
c0 c0 a1 01 55 08 00 20
cftable_entry 0x00 [default]
[rdybsy] [mwait] [pwrdown]
Vcc Vnom 5V
memory 0x0000-0x07ff @ 0x0000
offset 0x4a, tuple 0x1b, link 0x06
00 01 21 b5 1e 4d
cftable_entry 0x00
Vcc Vnom 3300mV Ipeak 45mA
offset 0x52, tuple 0x1b, link 0x0a
c1 41 99 01 55 64 f0 ff ff 20
cftable_entry 0x01 [default]
[rdybsy] [pwrdown]
Vcc Vnom 5V
io 0x0000-0x000f [lines=4] [8bit] [16bit]
irq mask 0xffff [level] [pulse] [shared]
offset 0x5e, tuple 0x1b, link 0x06
01 01 21 b5 1e 4d
cftable_entry 0x01
Vcc Vnom 3300mV Ipeak 45mA
offset 0x66, tuple 0x1b, link 0x0f
c2 41 99 01 55 ea 61 f0 01 07 f6 03 01 ee 20
cftable_entry 0x02 [default]
[rdybsy] [pwrdown]
Vcc Vnom 5V
io 0x01f0-0x01f7, 0x03f6-0x03f7 [lines=10] [8bit] [16bit] [range]
irq 14 [level] [pulse] [shared]
offset 0x77, tuple 0x1b, link 0x06
02 01 21 b5 1e 4d
cftable_entry 0x02
Vcc Vnom 3300mV Ipeak 45mA
offset 0x7f, tuple 0x1b, link 0x0f
c3 41 99 01 55 ea 61 70 01 07 76 03 01 ee 20
cftable_entry 0x03 [default]
[rdybsy] [pwrdown]
Vcc Vnom 5V
io 0x0170-0x0177, 0x0376-0x0377 [lines=10] [8bit] [16bit] [range]
irq 14 [level] [pulse] [shared]
offset 0x90, tuple 0x1b, link 0x06
03 01 21 b5 1e 4d
cftable_entry 0x03
Vcc Vnom 3300mV Ipeak 45mA
offset 0x98, tuple 0x14, link 0x00
no_long_link
[-- Attachment #2: Type: text/html, Size: 5644 bytes --]
^ permalink raw reply
* [PATCH 2.6.19-rc1] ehca firmware interface based on Anton Blanchard's new hvcall interface
From: Hoang-Nam Nguyen @ 2006-09-22 15:20 UTC (permalink / raw)
To: rolandd, linux-kernel, linuxppc-dev, openib-general,
openfabrics-ewg
Cc: raisch, pmac
[-- Attachment #1: Type: text/plain, Size: 40941 bytes --]
Hello Roland!
Below is the patch of ehca according to Anton's new hvcall interface, which has been
committed in Paul's git tree:
git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc.git
Besides the changes above this patch contains some coding style updates.
I created this patch against your git tree, branch for-2.6.19.
Thanks!
Hoang-Nam Nguyen
Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
---
ehca_main.c | 9
hcp_if.c | 845 ++++++++++++++++++++---------------------------------------- hcp_if.h | 2
hipz_hw.h | 2
ipz_pt_fn.h | 7
5 files changed, 300 insertions(+), 565 deletions(-)
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 159b0be..0a0248f 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -5,6 +5,7 @@
*
* Authors: Heiko J Schick <schickhj@de.ibm.com>
* Hoang-Nam Nguyen <hnguyen@de.ibm.com>
+ * Joachim Fenkes <fenkes@de.ibm.com>
*
* Copyright (c) 2005 IBM Corporation
*
@@ -48,7 +49,7 @@ #include "hcp_if.h"
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
-MODULE_VERSION("SVNEHCA_0015");
+MODULE_VERSION("SVNEHCA_0016");
int ehca_open_aqp1 = 0;
int ehca_debug_level = 0;
@@ -268,7 +269,7 @@ int ehca_register_device(struct ehca_shc
(1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) |
(1ull << IB_USER_VERBS_CMD_DETACH_MCAST);
- shca->ib_device.node_type = RDMA_NODE_IB_CA;
+ shca->ib_device.node_type = IB_NODE_CA;
shca->ib_device.phys_port_cnt = shca->num_ports;
shca->ib_device.dma_device = &shca->ibmebus_dev->ofdev.dev;
shca->ib_device.query_device = ehca_query_device;
@@ -446,7 +447,7 @@ static ssize_t ehca_show_##name(struct
kfree(rblock); \
return 0; \
} \
- \
+ \
data = rblock->name; \
kfree(rblock); \
\
@@ -749,7 +750,7 @@ int __init ehca_module_init(void)
int ret;
printk(KERN_INFO "eHCA Infiniband Device Driver "
- "(Rel.: SVNEHCA_0015)\n");
+ "(Rel.: SVNEHCA_0016)\n");
idr_init(&ehca_qp_idr);
idr_init(&ehca_cq_idr);
spin_lock_init(&ehca_qp_idr_lock);
diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c
index 260e82a..3fb46e6 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.c
+++ b/drivers/infiniband/hw/ehca/hcp_if.c
@@ -48,27 +48,27 @@ #include "hcp_phyp.h"
#include "hipz_fns.h"
#include "ipz_pt_fn.h"
-#define H_ALL_RES_QP_ENHANCED_OPS EHCA_BMASK_IBM(9,11)
-#define H_ALL_RES_QP_PTE_PIN EHCA_BMASK_IBM(12,12)
-#define H_ALL_RES_QP_SERVICE_TYPE EHCA_BMASK_IBM(13,15)
-#define H_ALL_RES_QP_LL_RQ_CQE_POSTING EHCA_BMASK_IBM(18,18)
-#define H_ALL_RES_QP_LL_SQ_CQE_POSTING EHCA_BMASK_IBM(19,21)
-#define H_ALL_RES_QP_SIGNALING_TYPE EHCA_BMASK_IBM(22,23)
-#define H_ALL_RES_QP_UD_AV_LKEY_CTRL EHCA_BMASK_IBM(31,31)
-#define H_ALL_RES_QP_RESOURCE_TYPE EHCA_BMASK_IBM(56,63)
-
-#define H_ALL_RES_QP_MAX_OUTST_SEND_WR EHCA_BMASK_IBM(0,15)
-#define H_ALL_RES_QP_MAX_OUTST_RECV_WR EHCA_BMASK_IBM(16,31)
-#define H_ALL_RES_QP_MAX_SEND_SGE EHCA_BMASK_IBM(32,39)
-#define H_ALL_RES_QP_MAX_RECV_SGE EHCA_BMASK_IBM(40,47)
-
-#define H_ALL_RES_QP_ACT_OUTST_SEND_WR EHCA_BMASK_IBM(16,31)
-#define H_ALL_RES_QP_ACT_OUTST_RECV_WR EHCA_BMASK_IBM(48,63)
-#define H_ALL_RES_QP_ACT_SEND_SGE EHCA_BMASK_IBM(8,15)
-#define H_ALL_RES_QP_ACT_RECV_SGE EHCA_BMASK_IBM(24,31)
-
-#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0,31)
-#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32,63)
+#define H_ALL_RES_QP_ENHANCED_OPS EHCA_BMASK_IBM(9, 11)
+#define H_ALL_RES_QP_PTE_PIN EHCA_BMASK_IBM(12, 12)
+#define H_ALL_RES_QP_SERVICE_TYPE EHCA_BMASK_IBM(13, 15)
+#define H_ALL_RES_QP_LL_RQ_CQE_POSTING EHCA_BMASK_IBM(18, 18)
+#define H_ALL_RES_QP_LL_SQ_CQE_POSTING EHCA_BMASK_IBM(19, 21)
+#define H_ALL_RES_QP_SIGNALING_TYPE EHCA_BMASK_IBM(22, 23)
+#define H_ALL_RES_QP_UD_AV_LKEY_CTRL EHCA_BMASK_IBM(31, 31)
+#define H_ALL_RES_QP_RESOURCE_TYPE EHCA_BMASK_IBM(56, 63)
+
+#define H_ALL_RES_QP_MAX_OUTST_SEND_WR EHCA_BMASK_IBM(0, 15)
+#define H_ALL_RES_QP_MAX_OUTST_RECV_WR EHCA_BMASK_IBM(16, 31)
+#define H_ALL_RES_QP_MAX_SEND_SGE EHCA_BMASK_IBM(32, 39)
+#define H_ALL_RES_QP_MAX_RECV_SGE EHCA_BMASK_IBM(40, 47)
+
+#define H_ALL_RES_QP_ACT_OUTST_SEND_WR EHCA_BMASK_IBM(16, 31)
+#define H_ALL_RES_QP_ACT_OUTST_RECV_WR EHCA_BMASK_IBM(48, 63)
+#define H_ALL_RES_QP_ACT_SEND_SGE EHCA_BMASK_IBM(8, 15)
+#define H_ALL_RES_QP_ACT_RECV_SGE EHCA_BMASK_IBM(24, 31)
+
+#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0, 31)
+#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32, 63)
/* direct access qp controls */
#define DAQP_CTRL_ENABLE 0x01
@@ -95,35 +95,25 @@ static u32 get_longbusy_msecs(int longbu
}
}
-static long ehca_hcall_7arg_7ret(unsigned long opcode,
- unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3,
- unsigned long arg4,
- unsigned long arg5,
- unsigned long arg6,
- unsigned long arg7,
- unsigned long *out1,
- unsigned long *out2,
- unsigned long *out3,
- unsigned long *out4,
- unsigned long *out5,
- unsigned long *out6,
- unsigned long *out7)
+static long ehca_plpar_hcall_norets(unsigned long opcode,
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3,
+ unsigned long arg4,
+ unsigned long arg5,
+ unsigned long arg6,
+ unsigned long arg7)
{
long ret;
int i, sleep_msecs;
- ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx arg5=%lx "
- "arg6=%lx arg7=%lx", opcode, arg1, arg2, arg3, arg4, arg5,
- arg6, arg7);
+ ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx "
+ "arg5=%lx arg6=%lx arg7=%lx",
+ opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
for (i = 0; i < 5; i++) {
- ret = plpar_hcall_7arg_7ret(opcode,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7,
- out1, out2, out3, out4,
- out5, out6,out7);
+ ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4,
+ arg5, arg6, arg7);
if (H_IS_LONG_BUSY(ret)) {
sleep_msecs = get_longbusy_msecs(ret);
@@ -134,44 +124,30 @@ static long ehca_hcall_7arg_7ret(unsigne
if (ret < H_SUCCESS)
ehca_gen_err("opcode=%lx ret=%lx"
" arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
- " arg5=%lx arg6=%lx arg7=%lx"
- " out1=%lx out2=%lx out3=%lx out4=%lx"
- " out5=%lx out6=%lx out7=%lx",
+ " arg5=%lx arg6=%lx arg7=%lx ",
opcode, ret,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7,
- *out1, *out2, *out3, *out4,
- *out5, *out6, *out7);
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7);
- ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx "
- "out4=%lx out5=%lx out6=%lx out7=%lx",
- opcode, ret, *out1, *out2, *out3, *out4, *out5,
- *out6, *out7);
+ ehca_gen_dbg("opcode=%lx ret=%lx", opcode, ret);
return ret;
+
}
return H_BUSY;
}
-static long ehca_hcall_9arg_9ret(unsigned long opcode,
- unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3,
- unsigned long arg4,
- unsigned long arg5,
- unsigned long arg6,
- unsigned long arg7,
- unsigned long arg8,
- unsigned long arg9,
- unsigned long *out1,
- unsigned long *out2,
- unsigned long *out3,
- unsigned long *out4,
- unsigned long *out5,
- unsigned long *out6,
- unsigned long *out7,
- unsigned long *out8,
- unsigned long *out9)
+static long ehca_plpar_hcall9(unsigned long opcode,
+ unsigned long *outs, /* array of 9 outputs */
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3,
+ unsigned long arg4,
+ unsigned long arg5,
+ unsigned long arg6,
+ unsigned long arg7,
+ unsigned long arg8,
+ unsigned long arg9)
{
long ret;
int i, sleep_msecs;
@@ -182,13 +158,9 @@ static long ehca_hcall_9arg_9ret(unsigne
arg8, arg9);
for (i = 0; i < 5; i++) {
- ret = plpar_hcall_9arg_9ret(opcode,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7, arg8,
- arg9,
- out1, out2, out3, out4,
- out5, out6, out7, out8,
- out9);
+ ret = plpar_hcall9(opcode, outs,
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9);
if (H_IS_LONG_BUSY(ret)) {
sleep_msecs = get_longbusy_msecs(ret);
@@ -205,37 +177,35 @@ static long ehca_hcall_9arg_9ret(unsigne
" out5=%lx out6=%lx out7=%lx out8=%lx"
" out9=%lx",
opcode, ret,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7, arg8,
- arg9,
- *out1, *out2, *out3, *out4,
- *out5, *out6, *out7, *out8,
- *out9);
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9,
+ outs[0], outs[1], outs[2], outs[3],
+ outs[4], outs[5], outs[6], outs[7],
+ outs[8]);
ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx "
"out4=%lx out5=%lx out6=%lx out7=%lx out8=%lx "
- "out9=%lx", opcode, ret,*out1, *out2, *out3, *out4,
- *out5, *out6, *out7, *out8, *out9);
+ "out9=%lx",
+ opcode, ret, outs[0], outs[1], outs[2], outs[3],
+ outs[4], outs[5], outs[6], outs[7], outs[8]);
return ret;
}
return H_BUSY;
}
-
u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle,
struct ehca_pfeq *pfeq,
const u32 neq_control,
const u32 number_of_entries,
struct ipz_eq_handle *eq_handle,
- u32 * act_nr_of_entries,
- u32 * act_pages,
- u32 * eq_ist)
+ u32 *act_nr_of_entries,
+ u32 *act_pages,
+ u32 *eq_ist)
{
u64 ret;
- u64 dummy;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
u64 allocate_controls;
- u64 act_nr_of_entries_out, act_pages_out, eq_ist_out;
/* resource type */
allocate_controls = 3ULL;
@@ -246,22 +216,15 @@ u64 hipz_h_alloc_resource_eq(const struc
else /* notification event queue */
allocate_controls = (1ULL << 63) | allocate_controls;
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- allocate_controls, /* r5 */
- number_of_entries, /* r6 */
- 0, 0, 0, 0,
- &eq_handle->handle, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &act_nr_of_entries_out, /* r7 */
- &act_pages_out, /* r8 */
- &eq_ist_out, /* r8 */
- &dummy);
-
- *act_nr_of_entries = (u32)act_nr_of_entries_out;
- *act_pages = (u32)act_pages_out;
- *eq_ist = (u32)eq_ist_out;
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ allocate_controls, /* r5 */
+ number_of_entries, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ eq_handle->handle = outs[0];
+ *act_nr_of_entries = (u32)outs[3];
+ *act_pages = (u32)outs[4];
+ *eq_ist = (u32)outs[5];
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Not enough resource - ret=%lx ", ret);
@@ -273,20 +236,11 @@ u64 hipz_h_reset_event(const struct ipz_
struct ipz_eq_handle eq_handle,
const u64 event_mask)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_RESET_EVENTS,
- adapter_handle.handle, /* r4 */
- eq_handle.handle, /* r5 */
- event_mask, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_RESET_EVENTS,
+ adapter_handle.handle, /* r4 */
+ eq_handle.handle, /* r5 */
+ event_mask, /* r6 */
+ 0, 0, 0, 0);
}
u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle,
@@ -294,30 +248,21 @@ u64 hipz_h_alloc_resource_cq(const struc
struct ehca_alloc_cq_parms *param)
{
u64 ret;
- u64 dummy;
- u64 act_nr_of_entries_out, act_pages_out;
- u64 g_la_privileged_out, g_la_user_out;
-
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- 2, /* r5 */
- param->eq_handle.handle, /* r6 */
- cq->token, /* r7 */
- param->nr_cqe, /* r8 */
- 0, 0,
- &cq->ipz_cq_handle.handle, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &act_nr_of_entries_out, /* r7 */
- &act_pages_out, /* r8 */
- &g_la_privileged_out, /* r9 */
- &g_la_user_out); /* r10 */
-
- param->act_nr_of_entries = (u32)act_nr_of_entries_out;
- param->act_pages = (u32)act_pages_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ 2, /* r5 */
+ param->eq_handle.handle, /* r6 */
+ cq->token, /* r7 */
+ param->nr_cqe, /* r8 */
+ 0, 0, 0, 0);
+ cq->ipz_cq_handle.handle = outs[0];
+ param->act_nr_of_entries = (u32)outs[3];
+ param->act_pages = (u32)outs[4];
if (ret == H_SUCCESS)
- hcp_galpas_ctor(&cq->galpas, g_la_privileged_out, g_la_user_out);
+ hcp_galpas_ctor(&cq->galpas, outs[5], outs[6]);
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Not enough resources. ret=%lx", ret);
@@ -330,8 +275,9 @@ u64 hipz_h_alloc_resource_qp(const struc
struct ehca_alloc_qp_parms *parms)
{
u64 ret;
- u64 dummy, allocate_controls, max_r10_reg;
- u64 qp_nr_out, r6_out, r7_out, r8_out, g_la_user_out, r11_out;
+ u64 allocate_controls;
+ u64 max_r10_reg;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
u16 max_nr_receive_wqes = qp->init_attr.cap.max_recv_wr + 1;
u16 max_nr_send_wqes = qp->init_attr.cap.max_send_wr + 1;
int daqp_ctrl = parms->daqp_ctrl;
@@ -360,48 +306,36 @@ u64 hipz_h_alloc_resource_qp(const struc
| EHCA_BMASK_SET(H_ALL_RES_QP_MAX_RECV_SGE,
parms->max_recv_sge);
-
- ret = ehca_hcall_9arg_9ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- allocate_controls, /* r5 */
- qp->send_cq->ipz_cq_handle.handle,
- qp->recv_cq->ipz_cq_handle.handle,
- parms->ipz_eq_handle.handle,
- ((u64)qp->token << 32) | parms->pd.value,
- max_r10_reg, /* r10 */
- parms->ud_av_l_key_ctl, /* r11 */
- 0,
- &qp->ipz_qp_handle.handle,
- &qp_nr_out, /* r5 */
- &r6_out, /* r6 */
- &r7_out, /* r7 */
- &r8_out, /* r8 */
- &dummy, /* r9 */
- &g_la_user_out, /* r10 */
- &r11_out,
- &dummy);
-
- /* extract outputs */
- qp->real_qp_num = (u32)qp_nr_out;
-
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ allocate_controls, /* r5 */
+ qp->send_cq->ipz_cq_handle.handle,
+ qp->recv_cq->ipz_cq_handle.handle,
+ parms->ipz_eq_handle.handle,
+ ((u64)qp->token << 32) | parms->pd.value,
+ max_r10_reg, /* r10 */
+ parms->ud_av_l_key_ctl, /* r11 */
+ 0);
+ qp->ipz_qp_handle.handle = outs[0];
+ qp->real_qp_num = (u32)outs[1];
parms->act_nr_send_sges =
- (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, r6_out);
+ (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, outs[2]);
parms->act_nr_recv_wqes =
- (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, r6_out);
+ (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, outs[2]);
parms->act_nr_send_sges =
- (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_SEND_SGE, r7_out);
+ (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_SEND_SGE, outs[3]);
parms->act_nr_recv_sges =
- (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_RECV_SGE, r7_out);
+ (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_RECV_SGE, outs[3]);
parms->nr_sq_pages =
- (u32)EHCA_BMASK_GET(H_ALL_RES_QP_SQUEUE_SIZE_PAGES, r8_out);
+ (u32)EHCA_BMASK_GET(H_ALL_RES_QP_SQUEUE_SIZE_PAGES, outs[4]);
parms->nr_rq_pages =
- (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, r8_out);
+ (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, outs[4]);
if (ret == H_SUCCESS)
- hcp_galpas_ctor(&qp->galpas, g_la_user_out, g_la_user_out);
+ hcp_galpas_ctor(&qp->galpas, outs[6], outs[6]);
if (ret == H_NOT_ENOUGH_RESOURCES)
- ehca_gen_err("Not enough resources. ret=%lx",ret);
+ ehca_gen_err("Not enough resources. ret=%lx", ret);
return ret;
}
@@ -411,7 +345,6 @@ u64 hipz_h_query_port(const struct ipz_a
struct hipz_query_port *query_port_response_block)
{
u64 ret;
- u64 dummy;
u64 r_cb = virt_to_abs(query_port_response_block);
if (r_cb & (EHCA_PAGESIZE-1)) {
@@ -419,18 +352,11 @@ u64 hipz_h_query_port(const struct ipz_a
return H_PARAMETER;
}
- ret = ehca_hcall_7arg_7ret(H_QUERY_PORT,
- adapter_handle.handle, /* r4 */
- port_id, /* r5 */
- r_cb, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall_norets(H_QUERY_PORT,
+ adapter_handle.handle, /* r4 */
+ port_id, /* r5 */
+ r_cb, /* r6 */
+ 0, 0, 0, 0);
if (ehca_debug_level)
ehca_dmp(query_port_response_block, 64, "response_block");
@@ -441,7 +367,6 @@ u64 hipz_h_query_port(const struct ipz_a
u64 hipz_h_query_hca(const struct ipz_adapter_handle adapter_handle,
struct hipz_query_hca *query_hca_rblock)
{
- u64 dummy;
u64 r_cb = virt_to_abs(query_hca_rblock);
if (r_cb & (EHCA_PAGESIZE-1)) {
@@ -450,17 +375,10 @@ u64 hipz_h_query_hca(const struct ipz_ad
return H_PARAMETER;
}
- return ehca_hcall_7arg_7ret(H_QUERY_HCA,
- adapter_handle.handle, /* r4 */
- r_cb, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_QUERY_HCA,
+ adapter_handle.handle, /* r4 */
+ r_cb, /* r5 */
+ 0, 0, 0, 0, 0);
}
u64 hipz_h_register_rpage(const struct ipz_adapter_handle adapter_handle,
@@ -470,22 +388,13 @@ u64 hipz_h_register_rpage(const struct i
const u64 logical_address_of_page,
u64 count)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_REGISTER_RPAGES,
- adapter_handle.handle, /* r4 */
- queue_type | pagesize << 8, /* r5 */
- resource_handle, /* r6 */
- logical_address_of_page, /* r7 */
- count, /* r8 */
- 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_REGISTER_RPAGES,
+ adapter_handle.handle, /* r4 */
+ queue_type | pagesize << 8, /* r5 */
+ resource_handle, /* r6 */
+ logical_address_of_page, /* r7 */
+ count, /* r8 */
+ 0, 0);
}
u64 hipz_h_register_rpage_eq(const struct ipz_adapter_handle adapter_handle,
@@ -507,23 +416,14 @@ u64 hipz_h_register_rpage_eq(const struc
logical_address_of_page, count);
}
-u32 hipz_h_query_int_state(const struct ipz_adapter_handle adapter_handle,
+u64 hipz_h_query_int_state(const struct ipz_adapter_handle adapter_handle,
u32 ist)
{
- u32 ret;
- u64 dummy;
-
- ret = ehca_hcall_7arg_7ret(H_QUERY_INT_STATE,
- adapter_handle.handle, /* r4 */
- ist, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ u64 ret;
+ ret = ehca_plpar_hcall_norets(H_QUERY_INT_STATE,
+ adapter_handle.handle, /* r4 */
+ ist, /* r5 */
+ 0, 0, 0, 0, 0);
if (ret != H_SUCCESS && ret != H_BUSY)
ehca_gen_err("Could not query interrupt state.");
@@ -576,25 +476,20 @@ u64 hipz_h_disable_and_get_wqe(const str
void **log_addr_next_rq_wqe2processed,
int dis_and_get_function_code)
{
- u64 dummy, dummy1, dummy2;
-
- if (!log_addr_next_sq_wqe2processed)
- log_addr_next_sq_wqe2processed = (void**)&dummy1;
- if (!log_addr_next_rq_wqe2processed)
- log_addr_next_rq_wqe2processed = (void**)&dummy2;
-
- return ehca_hcall_7arg_7ret(H_DISABLE_AND_GETC,
- adapter_handle.handle, /* r4 */
- dis_and_get_function_code, /* r5 */
- qp_handle.handle, /* r6 */
- 0, 0, 0, 0,
- (void*)log_addr_next_sq_wqe2processed,
- (void*)log_addr_next_rq_wqe2processed,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ u64 ret;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_DISABLE_AND_GETC, outs,
+ adapter_handle.handle, /* r4 */
+ dis_and_get_function_code, /* r5 */
+ qp_handle.handle, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ if (log_addr_next_sq_wqe2processed)
+ *log_addr_next_sq_wqe2processed = (void*)outs[0];
+ if (log_addr_next_rq_wqe2processed)
+ *log_addr_next_rq_wqe2processed = (void*)outs[1];
+
+ return ret;
}
u64 hipz_h_modify_qp(const struct ipz_adapter_handle adapter_handle,
@@ -605,22 +500,13 @@ u64 hipz_h_modify_qp(const struct ipz_ad
struct h_galpa gal)
{
u64 ret;
- u64 dummy;
- u64 invalid_attribute_identifier, rc_attrib_mask;
-
- ret = ehca_hcall_7arg_7ret(H_MODIFY_QP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- update_mask, /* r6 */
- virt_to_abs(mqpcb), /* r7 */
- 0, 0, 0,
- &invalid_attribute_identifier, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &dummy, /* r7 */
- &dummy, /* r8 */
- &rc_attrib_mask, /* r9 */
- &dummy);
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+ ret = ehca_plpar_hcall9(H_MODIFY_QP, outs,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ update_mask, /* r6 */
+ virt_to_abs(mqpcb), /* r7 */
+ 0, 0, 0, 0, 0);
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Insufficient resources ret=%lx", ret);
@@ -634,61 +520,37 @@ u64 hipz_h_query_qp(const struct ipz_ada
struct hcp_modify_qp_control_block *qqpcb,
struct h_galpa gal)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_QUERY_QP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- virt_to_abs(qqpcb), /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_QUERY_QP,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ virt_to_abs(qqpcb), /* r6 */
+ 0, 0, 0, 0);
}
u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle,
struct ehca_qp *qp)
{
u64 ret;
- u64 dummy;
- u64 ladr_next_sq_wqe_out, ladr_next_rq_wqe_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
ret = hcp_galpas_dtor(&qp->galpas);
if (ret) {
ehca_gen_err("Could not destruct qp->galpas");
return H_RESOURCE;
}
- ret = ehca_hcall_7arg_7ret(H_DISABLE_AND_GETC,
- adapter_handle.handle, /* r4 */
- /* function code */
- 1, /* r5 */
- qp->ipz_qp_handle.handle, /* r6 */
- 0, 0, 0, 0,
- &ladr_next_sq_wqe_out, /* r4 */
- &ladr_next_rq_wqe_out, /* r5 */
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall9(H_DISABLE_AND_GETC, outs,
+ adapter_handle.handle, /* r4 */
+ /* function code */
+ 1, /* r5 */
+ qp->ipz_qp_handle.handle, /* r6 */
+ 0, 0, 0, 0, 0, 0);
if (ret == H_HARDWARE)
ehca_gen_err("HCA not operational. ret=%lx", ret);
- ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- qp->ipz_qp_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ qp->ipz_qp_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
if (ret == H_RESOURCE)
ehca_gen_err("Resource still in use. ret=%lx", ret);
@@ -701,20 +563,11 @@ u64 hipz_h_define_aqp0(const struct ipz_
struct h_galpa gal,
u32 port)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_DEFINE_AQP0,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- port, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_DEFINE_AQP0,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ port, /* r6 */
+ 0, 0, 0, 0);
}
u64 hipz_h_define_aqp1(const struct ipz_adapter_handle adapter_handle,
@@ -724,24 +577,15 @@ u64 hipz_h_define_aqp1(const struct ipz_
u32 * bma_qp_nr)
{
u64 ret;
- u64 dummy;
- u64 pma_qp_nr_out, bma_qp_nr_out;
-
- ret = ehca_hcall_7arg_7ret(H_DEFINE_AQP1,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- port, /* r6 */
- 0, 0, 0, 0,
- &pma_qp_nr_out, /* r4 */
- &bma_qp_nr_out, /* r5 */
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
-
- *pma_qp_nr = (u32)pma_qp_nr_out;
- *bma_qp_nr = (u32)bma_qp_nr_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_DEFINE_AQP1, outs,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ port, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ *pma_qp_nr = (u32)outs[0];
+ *bma_qp_nr = (u32)outs[1];
if (ret == H_ALIAS_EXIST)
ehca_gen_err("AQP1 already exists. ret=%lx", ret);
@@ -756,22 +600,14 @@ u64 hipz_h_attach_mcqp(const struct ipz_
u64 subnet_prefix, u64 interface_id)
{
u64 ret;
- u64 dummy;
-
- ret = ehca_hcall_7arg_7ret(H_ATTACH_MCQP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- mcg_dlid, /* r6 */
- interface_id, /* r7 */
- subnet_prefix, /* r8 */
- 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+
+ ret = ehca_plpar_hcall_norets(H_ATTACH_MCQP,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ mcg_dlid, /* r6 */
+ interface_id, /* r7 */
+ subnet_prefix, /* r8 */
+ 0, 0);
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Not enough resources. ret=%lx", ret);
@@ -785,22 +621,13 @@ u64 hipz_h_detach_mcqp(const struct ipz_
u16 mcg_dlid,
u64 subnet_prefix, u64 interface_id)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_DETACH_MCQP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- mcg_dlid, /* r6 */
- interface_id, /* r7 */
- subnet_prefix, /* r8 */
- 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_DETACH_MCQP,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ mcg_dlid, /* r6 */
+ interface_id, /* r7 */
+ subnet_prefix, /* r8 */
+ 0, 0);
}
u64 hipz_h_destroy_cq(const struct ipz_adapter_handle adapter_handle,
@@ -808,7 +635,6 @@ u64 hipz_h_destroy_cq(const struct ipz_a
u8 force_flag)
{
u64 ret;
- u64 dummy;
ret = hcp_galpas_dtor(&cq->galpas);
if (ret) {
@@ -816,18 +642,11 @@ u64 hipz_h_destroy_cq(const struct ipz_a
return H_RESOURCE;
}
- ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- cq->ipz_cq_handle.handle, /* r5 */
- force_flag != 0 ? 1L : 0L, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ cq->ipz_cq_handle.handle, /* r5 */
+ force_flag != 0 ? 1L : 0L, /* r6 */
+ 0, 0, 0, 0);
if (ret == H_RESOURCE)
ehca_gen_err("H_FREE_RESOURCE failed ret=%lx ", ret);
@@ -839,7 +658,6 @@ u64 hipz_h_destroy_eq(const struct ipz_a
struct ehca_eq *eq)
{
u64 ret;
- u64 dummy;
ret = hcp_galpas_dtor(&eq->galpas);
if (ret) {
@@ -847,18 +665,10 @@ u64 hipz_h_destroy_eq(const struct ipz_a
return H_RESOURCE;
}
- ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- eq->ipz_eq_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
-
+ ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ eq->ipz_eq_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
if (ret == H_RESOURCE)
ehca_gen_err("Resource in use. ret=%lx ", ret);
@@ -875,27 +685,19 @@ u64 hipz_h_alloc_resource_mr(const struc
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 lkey_out;
- u64 rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- 5, /* r5 */
- vaddr, /* r6 */
- length, /* r7 */
- (((u64)access_ctrl) << 32ULL), /* r8 */
- pd.value, /* r9 */
- 0,
- &(outparms->handle.handle), /* r4 */
- &dummy, /* r5 */
- &lkey_out, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
- outparms->lkey = (u32)lkey_out;
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ 5, /* r5 */
+ vaddr, /* r6 */
+ length, /* r7 */
+ (((u64)access_ctrl) << 32ULL), /* r8 */
+ pd.value, /* r9 */
+ 0, 0, 0);
+ outparms->handle.handle = outs[0];
+ outparms->lkey = (u32)outs[2];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -923,7 +725,6 @@ u64 hipz_h_register_rpage_mr(const struc
queue_type,
mr->ipz_mr_handle.handle,
logical_address_of_page, count);
-
return ret;
}
@@ -932,24 +733,17 @@ u64 hipz_h_query_mr(const struct ipz_ada
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 remote_len_out, remote_vaddr_out, acc_ctrl_pd_out, r9_out;
-
- ret = ehca_hcall_7arg_7ret(H_QUERY_MR,
- adapter_handle.handle, /* r4 */
- mr->ipz_mr_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &outparms->len, /* r4 */
- &outparms->vaddr, /* r5 */
- &remote_len_out, /* r6 */
- &remote_vaddr_out, /* r7 */
- &acc_ctrl_pd_out, /* r8 */
- &r9_out,
- &dummy);
-
- outparms->acl = acc_ctrl_pd_out >> 32;
- outparms->lkey = (u32)(r9_out >> 32);
- outparms->rkey = (u32)(r9_out & (0xffffffff));
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_QUERY_MR, outs,
+ adapter_handle.handle, /* r4 */
+ mr->ipz_mr_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0, 0, 0);
+ outparms->len = outs[0];
+ outparms->vaddr = outs[1];
+ outparms->acl = outs[4] >> 32;
+ outparms->lkey = (u32)(outs[5] >> 32);
+ outparms->rkey = (u32)(outs[5] & (0xffffffff));
return ret;
}
@@ -957,19 +751,10 @@ u64 hipz_h_query_mr(const struct ipz_ada
u64 hipz_h_free_resource_mr(const struct ipz_adapter_handle adapter_handle,
const struct ehca_mr *mr)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- mr->ipz_mr_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ mr->ipz_mr_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
}
u64 hipz_h_reregister_pmr(const struct ipz_adapter_handle adapter_handle,
@@ -982,28 +767,20 @@ u64 hipz_h_reregister_pmr(const struct i
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 lkey_out, rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_REREGISTER_PMR,
- adapter_handle.handle, /* r4 */
- mr->ipz_mr_handle.handle, /* r5 */
- vaddr_in, /* r6 */
- length, /* r7 */
- /* r8 */
- ((((u64)access_ctrl) << 32ULL) | pd.value),
- mr_addr_cb, /* r9 */
- 0,
- &dummy, /* r4 */
- &outparms->vaddr, /* r5 */
- &lkey_out, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
-
- outparms->lkey = (u32)lkey_out;
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_REREGISTER_PMR, outs,
+ adapter_handle.handle, /* r4 */
+ mr->ipz_mr_handle.handle, /* r5 */
+ vaddr_in, /* r6 */
+ length, /* r7 */
+ /* r8 */
+ ((((u64)access_ctrl) << 32ULL) | pd.value),
+ mr_addr_cb, /* r9 */
+ 0, 0, 0);
+ outparms->vaddr = outs[1];
+ outparms->lkey = (u32)outs[2];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1017,25 +794,18 @@ u64 hipz_h_register_smr(const struct ipz
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 lkey_out, rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_REGISTER_SMR,
- adapter_handle.handle, /* r4 */
- orig_mr->ipz_mr_handle.handle, /* r5 */
- vaddr_in, /* r6 */
- (((u64)access_ctrl) << 32ULL), /* r7 */
- pd.value, /* r8 */
- 0, 0,
- &(outparms->handle.handle), /* r4 */
- &dummy, /* r5 */
- &lkey_out, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
- outparms->lkey = (u32)lkey_out;
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_REGISTER_SMR, outs,
+ adapter_handle.handle, /* r4 */
+ orig_mr->ipz_mr_handle.handle, /* r5 */
+ vaddr_in, /* r6 */
+ (((u64)access_ctrl) << 32ULL), /* r7 */
+ pd.value, /* r8 */
+ 0, 0, 0, 0);
+ outparms->handle.handle = outs[0];
+ outparms->lkey = (u32)outs[2];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1046,23 +816,15 @@ u64 hipz_h_alloc_resource_mw(const struc
struct ehca_mw_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- 6, /* r5 */
- pd.value, /* r6 */
- 0, 0, 0, 0,
- &(outparms->handle.handle), /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
-
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ 6, /* r5 */
+ pd.value, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ outparms->handle.handle = outs[0];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1072,21 +834,13 @@ u64 hipz_h_query_mw(const struct ipz_ada
struct ehca_mw_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 pd_out, rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_QUERY_MW,
- adapter_handle.handle, /* r4 */
- mw->ipz_mw_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &rkey_out, /* r7 */
- &pd_out, /* r8 */
- &dummy,
- &dummy);
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_QUERY_MW, outs,
+ adapter_handle.handle, /* r4 */
+ mw->ipz_mw_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0, 0, 0);
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1094,19 +848,10 @@ u64 hipz_h_query_mw(const struct ipz_ada
u64 hipz_h_free_resource_mw(const struct ipz_adapter_handle adapter_handle,
const struct ehca_mw *mw)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- mw->ipz_mw_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ mw->ipz_mw_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
}
u64 hipz_h_error_data(const struct ipz_adapter_handle adapter_handle,
@@ -1114,7 +859,6 @@ u64 hipz_h_error_data(const struct ipz_a
void *rblock,
unsigned long *byte_count)
{
- u64 dummy;
u64 r_cb = virt_to_abs(rblock);
if (r_cb & (EHCA_PAGESIZE-1)) {
@@ -1122,16 +866,9 @@ u64 hipz_h_error_data(const struct ipz_a
return H_PARAMETER;
}
- return ehca_hcall_7arg_7ret(H_ERROR_DATA,
- adapter_handle.handle,
- ressource_handle,
- r_cb,
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_ERROR_DATA,
+ adapter_handle.handle,
+ ressource_handle,
+ r_cb,
+ 0, 0, 0, 0);
}
diff --git a/drivers/infiniband/hw/ehca/hcp_if.h b/drivers/infiniband/hw/ehca/hcp_if.h
index 39956d8..587ebd4 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.h
+++ b/drivers/infiniband/hw/ehca/hcp_if.h
@@ -107,7 +107,7 @@ u64 hipz_h_register_rpage_eq(const struc
const u64 logical_address_of_page,
const u64 count);
-u32 hipz_h_query_int_state(const struct ipz_adapter_handle
+u64 hipz_h_query_int_state(const struct ipz_adapter_handle
hcp_adapter_handle,
u32 ist);
diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h
index f5f4871..3fc92b0 100644
--- a/drivers/infiniband/hw/ehca/hipz_hw.h
+++ b/drivers/infiniband/hw/ehca/hipz_hw.h
@@ -184,8 +184,6 @@ struct hipz_mrmwmm {
};
-#define MRX_HCR_LPARID_VALID EHCA_BMASK_IBM(0,0)
-
#define MRMWMM_OFFSET(x) offsetof(struct hipz_mrmwmm,x)
struct hipz_qpedmm {
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.h b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
index 7e55a31..2f13509 100644
--- a/drivers/infiniband/hw/ehca/ipz_pt_fn.h
+++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
@@ -226,10 +226,9 @@ static inline void *ipz_eqit_eq_get_inc_
{
void *ret = ipz_qeit_get(queue);
u32 qe = *(u8 *) ret;
- if ((qe >> 7) == (queue->toggle_state & 1))
- ipz_qeit_eq_get_inc(queue); /* this is a good one */
- else
- ret = NULL;
+ if ((qe >> 7) != (queue->toggle_state & 1))
+ return NULL;
+ ipz_qeit_eq_get_inc(queue); /* this is a good one */
return ret;
}
[-- Attachment #2: svnehca_0016_roland_git.patch --]
[-- Type: text/x-diff, Size: 40307 bytes --]
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
index 159b0be..0a0248f 100644
--- a/drivers/infiniband/hw/ehca/ehca_main.c
+++ b/drivers/infiniband/hw/ehca/ehca_main.c
@@ -5,6 +5,7 @@
*
* Authors: Heiko J Schick <schickhj@de.ibm.com>
* Hoang-Nam Nguyen <hnguyen@de.ibm.com>
+ * Joachim Fenkes <fenkes@de.ibm.com>
*
* Copyright (c) 2005 IBM Corporation
*
@@ -48,7 +49,7 @@ #include "hcp_if.h"
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>");
MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver");
-MODULE_VERSION("SVNEHCA_0015");
+MODULE_VERSION("SVNEHCA_0016");
int ehca_open_aqp1 = 0;
int ehca_debug_level = 0;
@@ -268,7 +269,7 @@ int ehca_register_device(struct ehca_shc
(1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) |
(1ull << IB_USER_VERBS_CMD_DETACH_MCAST);
- shca->ib_device.node_type = RDMA_NODE_IB_CA;
+ shca->ib_device.node_type = IB_NODE_CA;
shca->ib_device.phys_port_cnt = shca->num_ports;
shca->ib_device.dma_device = &shca->ibmebus_dev->ofdev.dev;
shca->ib_device.query_device = ehca_query_device;
@@ -446,7 +447,7 @@ static ssize_t ehca_show_##name(struct
kfree(rblock); \
return 0; \
} \
- \
+ \
data = rblock->name; \
kfree(rblock); \
\
@@ -749,7 +750,7 @@ int __init ehca_module_init(void)
int ret;
printk(KERN_INFO "eHCA Infiniband Device Driver "
- "(Rel.: SVNEHCA_0015)\n");
+ "(Rel.: SVNEHCA_0016)\n");
idr_init(&ehca_qp_idr);
idr_init(&ehca_cq_idr);
spin_lock_init(&ehca_qp_idr_lock);
diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c
index 260e82a..3fb46e6 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.c
+++ b/drivers/infiniband/hw/ehca/hcp_if.c
@@ -48,27 +48,27 @@ #include "hcp_phyp.h"
#include "hipz_fns.h"
#include "ipz_pt_fn.h"
-#define H_ALL_RES_QP_ENHANCED_OPS EHCA_BMASK_IBM(9,11)
-#define H_ALL_RES_QP_PTE_PIN EHCA_BMASK_IBM(12,12)
-#define H_ALL_RES_QP_SERVICE_TYPE EHCA_BMASK_IBM(13,15)
-#define H_ALL_RES_QP_LL_RQ_CQE_POSTING EHCA_BMASK_IBM(18,18)
-#define H_ALL_RES_QP_LL_SQ_CQE_POSTING EHCA_BMASK_IBM(19,21)
-#define H_ALL_RES_QP_SIGNALING_TYPE EHCA_BMASK_IBM(22,23)
-#define H_ALL_RES_QP_UD_AV_LKEY_CTRL EHCA_BMASK_IBM(31,31)
-#define H_ALL_RES_QP_RESOURCE_TYPE EHCA_BMASK_IBM(56,63)
-
-#define H_ALL_RES_QP_MAX_OUTST_SEND_WR EHCA_BMASK_IBM(0,15)
-#define H_ALL_RES_QP_MAX_OUTST_RECV_WR EHCA_BMASK_IBM(16,31)
-#define H_ALL_RES_QP_MAX_SEND_SGE EHCA_BMASK_IBM(32,39)
-#define H_ALL_RES_QP_MAX_RECV_SGE EHCA_BMASK_IBM(40,47)
-
-#define H_ALL_RES_QP_ACT_OUTST_SEND_WR EHCA_BMASK_IBM(16,31)
-#define H_ALL_RES_QP_ACT_OUTST_RECV_WR EHCA_BMASK_IBM(48,63)
-#define H_ALL_RES_QP_ACT_SEND_SGE EHCA_BMASK_IBM(8,15)
-#define H_ALL_RES_QP_ACT_RECV_SGE EHCA_BMASK_IBM(24,31)
-
-#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0,31)
-#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32,63)
+#define H_ALL_RES_QP_ENHANCED_OPS EHCA_BMASK_IBM(9, 11)
+#define H_ALL_RES_QP_PTE_PIN EHCA_BMASK_IBM(12, 12)
+#define H_ALL_RES_QP_SERVICE_TYPE EHCA_BMASK_IBM(13, 15)
+#define H_ALL_RES_QP_LL_RQ_CQE_POSTING EHCA_BMASK_IBM(18, 18)
+#define H_ALL_RES_QP_LL_SQ_CQE_POSTING EHCA_BMASK_IBM(19, 21)
+#define H_ALL_RES_QP_SIGNALING_TYPE EHCA_BMASK_IBM(22, 23)
+#define H_ALL_RES_QP_UD_AV_LKEY_CTRL EHCA_BMASK_IBM(31, 31)
+#define H_ALL_RES_QP_RESOURCE_TYPE EHCA_BMASK_IBM(56, 63)
+
+#define H_ALL_RES_QP_MAX_OUTST_SEND_WR EHCA_BMASK_IBM(0, 15)
+#define H_ALL_RES_QP_MAX_OUTST_RECV_WR EHCA_BMASK_IBM(16, 31)
+#define H_ALL_RES_QP_MAX_SEND_SGE EHCA_BMASK_IBM(32, 39)
+#define H_ALL_RES_QP_MAX_RECV_SGE EHCA_BMASK_IBM(40, 47)
+
+#define H_ALL_RES_QP_ACT_OUTST_SEND_WR EHCA_BMASK_IBM(16, 31)
+#define H_ALL_RES_QP_ACT_OUTST_RECV_WR EHCA_BMASK_IBM(48, 63)
+#define H_ALL_RES_QP_ACT_SEND_SGE EHCA_BMASK_IBM(8, 15)
+#define H_ALL_RES_QP_ACT_RECV_SGE EHCA_BMASK_IBM(24, 31)
+
+#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0, 31)
+#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32, 63)
/* direct access qp controls */
#define DAQP_CTRL_ENABLE 0x01
@@ -95,35 +95,25 @@ static u32 get_longbusy_msecs(int longbu
}
}
-static long ehca_hcall_7arg_7ret(unsigned long opcode,
- unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3,
- unsigned long arg4,
- unsigned long arg5,
- unsigned long arg6,
- unsigned long arg7,
- unsigned long *out1,
- unsigned long *out2,
- unsigned long *out3,
- unsigned long *out4,
- unsigned long *out5,
- unsigned long *out6,
- unsigned long *out7)
+static long ehca_plpar_hcall_norets(unsigned long opcode,
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3,
+ unsigned long arg4,
+ unsigned long arg5,
+ unsigned long arg6,
+ unsigned long arg7)
{
long ret;
int i, sleep_msecs;
- ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx arg5=%lx "
- "arg6=%lx arg7=%lx", opcode, arg1, arg2, arg3, arg4, arg5,
- arg6, arg7);
+ ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx "
+ "arg5=%lx arg6=%lx arg7=%lx",
+ opcode, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
for (i = 0; i < 5; i++) {
- ret = plpar_hcall_7arg_7ret(opcode,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7,
- out1, out2, out3, out4,
- out5, out6,out7);
+ ret = plpar_hcall_norets(opcode, arg1, arg2, arg3, arg4,
+ arg5, arg6, arg7);
if (H_IS_LONG_BUSY(ret)) {
sleep_msecs = get_longbusy_msecs(ret);
@@ -134,44 +124,30 @@ static long ehca_hcall_7arg_7ret(unsigne
if (ret < H_SUCCESS)
ehca_gen_err("opcode=%lx ret=%lx"
" arg1=%lx arg2=%lx arg3=%lx arg4=%lx"
- " arg5=%lx arg6=%lx arg7=%lx"
- " out1=%lx out2=%lx out3=%lx out4=%lx"
- " out5=%lx out6=%lx out7=%lx",
+ " arg5=%lx arg6=%lx arg7=%lx ",
opcode, ret,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7,
- *out1, *out2, *out3, *out4,
- *out5, *out6, *out7);
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7);
- ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx "
- "out4=%lx out5=%lx out6=%lx out7=%lx",
- opcode, ret, *out1, *out2, *out3, *out4, *out5,
- *out6, *out7);
+ ehca_gen_dbg("opcode=%lx ret=%lx", opcode, ret);
return ret;
+
}
return H_BUSY;
}
-static long ehca_hcall_9arg_9ret(unsigned long opcode,
- unsigned long arg1,
- unsigned long arg2,
- unsigned long arg3,
- unsigned long arg4,
- unsigned long arg5,
- unsigned long arg6,
- unsigned long arg7,
- unsigned long arg8,
- unsigned long arg9,
- unsigned long *out1,
- unsigned long *out2,
- unsigned long *out3,
- unsigned long *out4,
- unsigned long *out5,
- unsigned long *out6,
- unsigned long *out7,
- unsigned long *out8,
- unsigned long *out9)
+static long ehca_plpar_hcall9(unsigned long opcode,
+ unsigned long *outs, /* array of 9 outputs */
+ unsigned long arg1,
+ unsigned long arg2,
+ unsigned long arg3,
+ unsigned long arg4,
+ unsigned long arg5,
+ unsigned long arg6,
+ unsigned long arg7,
+ unsigned long arg8,
+ unsigned long arg9)
{
long ret;
int i, sleep_msecs;
@@ -182,13 +158,9 @@ static long ehca_hcall_9arg_9ret(unsigne
arg8, arg9);
for (i = 0; i < 5; i++) {
- ret = plpar_hcall_9arg_9ret(opcode,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7, arg8,
- arg9,
- out1, out2, out3, out4,
- out5, out6, out7, out8,
- out9);
+ ret = plpar_hcall9(opcode, outs,
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9);
if (H_IS_LONG_BUSY(ret)) {
sleep_msecs = get_longbusy_msecs(ret);
@@ -205,37 +177,35 @@ static long ehca_hcall_9arg_9ret(unsigne
" out5=%lx out6=%lx out7=%lx out8=%lx"
" out9=%lx",
opcode, ret,
- arg1, arg2, arg3, arg4,
- arg5, arg6, arg7, arg8,
- arg9,
- *out1, *out2, *out3, *out4,
- *out5, *out6, *out7, *out8,
- *out9);
+ arg1, arg2, arg3, arg4, arg5,
+ arg6, arg7, arg8, arg9,
+ outs[0], outs[1], outs[2], outs[3],
+ outs[4], outs[5], outs[6], outs[7],
+ outs[8]);
ehca_gen_dbg("opcode=%lx ret=%lx out1=%lx out2=%lx out3=%lx "
"out4=%lx out5=%lx out6=%lx out7=%lx out8=%lx "
- "out9=%lx", opcode, ret,*out1, *out2, *out3, *out4,
- *out5, *out6, *out7, *out8, *out9);
+ "out9=%lx",
+ opcode, ret, outs[0], outs[1], outs[2], outs[3],
+ outs[4], outs[5], outs[6], outs[7], outs[8]);
return ret;
}
return H_BUSY;
}
-
u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle,
struct ehca_pfeq *pfeq,
const u32 neq_control,
const u32 number_of_entries,
struct ipz_eq_handle *eq_handle,
- u32 * act_nr_of_entries,
- u32 * act_pages,
- u32 * eq_ist)
+ u32 *act_nr_of_entries,
+ u32 *act_pages,
+ u32 *eq_ist)
{
u64 ret;
- u64 dummy;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
u64 allocate_controls;
- u64 act_nr_of_entries_out, act_pages_out, eq_ist_out;
/* resource type */
allocate_controls = 3ULL;
@@ -246,22 +216,15 @@ u64 hipz_h_alloc_resource_eq(const struc
else /* notification event queue */
allocate_controls = (1ULL << 63) | allocate_controls;
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- allocate_controls, /* r5 */
- number_of_entries, /* r6 */
- 0, 0, 0, 0,
- &eq_handle->handle, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &act_nr_of_entries_out, /* r7 */
- &act_pages_out, /* r8 */
- &eq_ist_out, /* r8 */
- &dummy);
-
- *act_nr_of_entries = (u32)act_nr_of_entries_out;
- *act_pages = (u32)act_pages_out;
- *eq_ist = (u32)eq_ist_out;
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ allocate_controls, /* r5 */
+ number_of_entries, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ eq_handle->handle = outs[0];
+ *act_nr_of_entries = (u32)outs[3];
+ *act_pages = (u32)outs[4];
+ *eq_ist = (u32)outs[5];
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Not enough resource - ret=%lx ", ret);
@@ -273,20 +236,11 @@ u64 hipz_h_reset_event(const struct ipz_
struct ipz_eq_handle eq_handle,
const u64 event_mask)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_RESET_EVENTS,
- adapter_handle.handle, /* r4 */
- eq_handle.handle, /* r5 */
- event_mask, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_RESET_EVENTS,
+ adapter_handle.handle, /* r4 */
+ eq_handle.handle, /* r5 */
+ event_mask, /* r6 */
+ 0, 0, 0, 0);
}
u64 hipz_h_alloc_resource_cq(const struct ipz_adapter_handle adapter_handle,
@@ -294,30 +248,21 @@ u64 hipz_h_alloc_resource_cq(const struc
struct ehca_alloc_cq_parms *param)
{
u64 ret;
- u64 dummy;
- u64 act_nr_of_entries_out, act_pages_out;
- u64 g_la_privileged_out, g_la_user_out;
-
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- 2, /* r5 */
- param->eq_handle.handle, /* r6 */
- cq->token, /* r7 */
- param->nr_cqe, /* r8 */
- 0, 0,
- &cq->ipz_cq_handle.handle, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &act_nr_of_entries_out, /* r7 */
- &act_pages_out, /* r8 */
- &g_la_privileged_out, /* r9 */
- &g_la_user_out); /* r10 */
-
- param->act_nr_of_entries = (u32)act_nr_of_entries_out;
- param->act_pages = (u32)act_pages_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ 2, /* r5 */
+ param->eq_handle.handle, /* r6 */
+ cq->token, /* r7 */
+ param->nr_cqe, /* r8 */
+ 0, 0, 0, 0);
+ cq->ipz_cq_handle.handle = outs[0];
+ param->act_nr_of_entries = (u32)outs[3];
+ param->act_pages = (u32)outs[4];
if (ret == H_SUCCESS)
- hcp_galpas_ctor(&cq->galpas, g_la_privileged_out, g_la_user_out);
+ hcp_galpas_ctor(&cq->galpas, outs[5], outs[6]);
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Not enough resources. ret=%lx", ret);
@@ -330,8 +275,9 @@ u64 hipz_h_alloc_resource_qp(const struc
struct ehca_alloc_qp_parms *parms)
{
u64 ret;
- u64 dummy, allocate_controls, max_r10_reg;
- u64 qp_nr_out, r6_out, r7_out, r8_out, g_la_user_out, r11_out;
+ u64 allocate_controls;
+ u64 max_r10_reg;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
u16 max_nr_receive_wqes = qp->init_attr.cap.max_recv_wr + 1;
u16 max_nr_send_wqes = qp->init_attr.cap.max_send_wr + 1;
int daqp_ctrl = parms->daqp_ctrl;
@@ -360,48 +306,36 @@ u64 hipz_h_alloc_resource_qp(const struc
| EHCA_BMASK_SET(H_ALL_RES_QP_MAX_RECV_SGE,
parms->max_recv_sge);
-
- ret = ehca_hcall_9arg_9ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- allocate_controls, /* r5 */
- qp->send_cq->ipz_cq_handle.handle,
- qp->recv_cq->ipz_cq_handle.handle,
- parms->ipz_eq_handle.handle,
- ((u64)qp->token << 32) | parms->pd.value,
- max_r10_reg, /* r10 */
- parms->ud_av_l_key_ctl, /* r11 */
- 0,
- &qp->ipz_qp_handle.handle,
- &qp_nr_out, /* r5 */
- &r6_out, /* r6 */
- &r7_out, /* r7 */
- &r8_out, /* r8 */
- &dummy, /* r9 */
- &g_la_user_out, /* r10 */
- &r11_out,
- &dummy);
-
- /* extract outputs */
- qp->real_qp_num = (u32)qp_nr_out;
-
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ allocate_controls, /* r5 */
+ qp->send_cq->ipz_cq_handle.handle,
+ qp->recv_cq->ipz_cq_handle.handle,
+ parms->ipz_eq_handle.handle,
+ ((u64)qp->token << 32) | parms->pd.value,
+ max_r10_reg, /* r10 */
+ parms->ud_av_l_key_ctl, /* r11 */
+ 0);
+ qp->ipz_qp_handle.handle = outs[0];
+ qp->real_qp_num = (u32)outs[1];
parms->act_nr_send_sges =
- (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, r6_out);
+ (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_SEND_WR, outs[2]);
parms->act_nr_recv_wqes =
- (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, r6_out);
+ (u16)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_OUTST_RECV_WR, outs[2]);
parms->act_nr_send_sges =
- (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_SEND_SGE, r7_out);
+ (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_SEND_SGE, outs[3]);
parms->act_nr_recv_sges =
- (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_RECV_SGE, r7_out);
+ (u8)EHCA_BMASK_GET(H_ALL_RES_QP_ACT_RECV_SGE, outs[3]);
parms->nr_sq_pages =
- (u32)EHCA_BMASK_GET(H_ALL_RES_QP_SQUEUE_SIZE_PAGES, r8_out);
+ (u32)EHCA_BMASK_GET(H_ALL_RES_QP_SQUEUE_SIZE_PAGES, outs[4]);
parms->nr_rq_pages =
- (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, r8_out);
+ (u32)EHCA_BMASK_GET(H_ALL_RES_QP_RQUEUE_SIZE_PAGES, outs[4]);
if (ret == H_SUCCESS)
- hcp_galpas_ctor(&qp->galpas, g_la_user_out, g_la_user_out);
+ hcp_galpas_ctor(&qp->galpas, outs[6], outs[6]);
if (ret == H_NOT_ENOUGH_RESOURCES)
- ehca_gen_err("Not enough resources. ret=%lx",ret);
+ ehca_gen_err("Not enough resources. ret=%lx", ret);
return ret;
}
@@ -411,7 +345,6 @@ u64 hipz_h_query_port(const struct ipz_a
struct hipz_query_port *query_port_response_block)
{
u64 ret;
- u64 dummy;
u64 r_cb = virt_to_abs(query_port_response_block);
if (r_cb & (EHCA_PAGESIZE-1)) {
@@ -419,18 +352,11 @@ u64 hipz_h_query_port(const struct ipz_a
return H_PARAMETER;
}
- ret = ehca_hcall_7arg_7ret(H_QUERY_PORT,
- adapter_handle.handle, /* r4 */
- port_id, /* r5 */
- r_cb, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall_norets(H_QUERY_PORT,
+ adapter_handle.handle, /* r4 */
+ port_id, /* r5 */
+ r_cb, /* r6 */
+ 0, 0, 0, 0);
if (ehca_debug_level)
ehca_dmp(query_port_response_block, 64, "response_block");
@@ -441,7 +367,6 @@ u64 hipz_h_query_port(const struct ipz_a
u64 hipz_h_query_hca(const struct ipz_adapter_handle adapter_handle,
struct hipz_query_hca *query_hca_rblock)
{
- u64 dummy;
u64 r_cb = virt_to_abs(query_hca_rblock);
if (r_cb & (EHCA_PAGESIZE-1)) {
@@ -450,17 +375,10 @@ u64 hipz_h_query_hca(const struct ipz_ad
return H_PARAMETER;
}
- return ehca_hcall_7arg_7ret(H_QUERY_HCA,
- adapter_handle.handle, /* r4 */
- r_cb, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_QUERY_HCA,
+ adapter_handle.handle, /* r4 */
+ r_cb, /* r5 */
+ 0, 0, 0, 0, 0);
}
u64 hipz_h_register_rpage(const struct ipz_adapter_handle adapter_handle,
@@ -470,22 +388,13 @@ u64 hipz_h_register_rpage(const struct i
const u64 logical_address_of_page,
u64 count)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_REGISTER_RPAGES,
- adapter_handle.handle, /* r4 */
- queue_type | pagesize << 8, /* r5 */
- resource_handle, /* r6 */
- logical_address_of_page, /* r7 */
- count, /* r8 */
- 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_REGISTER_RPAGES,
+ adapter_handle.handle, /* r4 */
+ queue_type | pagesize << 8, /* r5 */
+ resource_handle, /* r6 */
+ logical_address_of_page, /* r7 */
+ count, /* r8 */
+ 0, 0);
}
u64 hipz_h_register_rpage_eq(const struct ipz_adapter_handle adapter_handle,
@@ -507,23 +416,14 @@ u64 hipz_h_register_rpage_eq(const struc
logical_address_of_page, count);
}
-u32 hipz_h_query_int_state(const struct ipz_adapter_handle adapter_handle,
+u64 hipz_h_query_int_state(const struct ipz_adapter_handle adapter_handle,
u32 ist)
{
- u32 ret;
- u64 dummy;
-
- ret = ehca_hcall_7arg_7ret(H_QUERY_INT_STATE,
- adapter_handle.handle, /* r4 */
- ist, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ u64 ret;
+ ret = ehca_plpar_hcall_norets(H_QUERY_INT_STATE,
+ adapter_handle.handle, /* r4 */
+ ist, /* r5 */
+ 0, 0, 0, 0, 0);
if (ret != H_SUCCESS && ret != H_BUSY)
ehca_gen_err("Could not query interrupt state.");
@@ -576,25 +476,20 @@ u64 hipz_h_disable_and_get_wqe(const str
void **log_addr_next_rq_wqe2processed,
int dis_and_get_function_code)
{
- u64 dummy, dummy1, dummy2;
-
- if (!log_addr_next_sq_wqe2processed)
- log_addr_next_sq_wqe2processed = (void**)&dummy1;
- if (!log_addr_next_rq_wqe2processed)
- log_addr_next_rq_wqe2processed = (void**)&dummy2;
-
- return ehca_hcall_7arg_7ret(H_DISABLE_AND_GETC,
- adapter_handle.handle, /* r4 */
- dis_and_get_function_code, /* r5 */
- qp_handle.handle, /* r6 */
- 0, 0, 0, 0,
- (void*)log_addr_next_sq_wqe2processed,
- (void*)log_addr_next_rq_wqe2processed,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ u64 ret;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_DISABLE_AND_GETC, outs,
+ adapter_handle.handle, /* r4 */
+ dis_and_get_function_code, /* r5 */
+ qp_handle.handle, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ if (log_addr_next_sq_wqe2processed)
+ *log_addr_next_sq_wqe2processed = (void*)outs[0];
+ if (log_addr_next_rq_wqe2processed)
+ *log_addr_next_rq_wqe2processed = (void*)outs[1];
+
+ return ret;
}
u64 hipz_h_modify_qp(const struct ipz_adapter_handle adapter_handle,
@@ -605,22 +500,13 @@ u64 hipz_h_modify_qp(const struct ipz_ad
struct h_galpa gal)
{
u64 ret;
- u64 dummy;
- u64 invalid_attribute_identifier, rc_attrib_mask;
-
- ret = ehca_hcall_7arg_7ret(H_MODIFY_QP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- update_mask, /* r6 */
- virt_to_abs(mqpcb), /* r7 */
- 0, 0, 0,
- &invalid_attribute_identifier, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &dummy, /* r7 */
- &dummy, /* r8 */
- &rc_attrib_mask, /* r9 */
- &dummy);
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+ ret = ehca_plpar_hcall9(H_MODIFY_QP, outs,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ update_mask, /* r6 */
+ virt_to_abs(mqpcb), /* r7 */
+ 0, 0, 0, 0, 0);
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Insufficient resources ret=%lx", ret);
@@ -634,61 +520,37 @@ u64 hipz_h_query_qp(const struct ipz_ada
struct hcp_modify_qp_control_block *qqpcb,
struct h_galpa gal)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_QUERY_QP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- virt_to_abs(qqpcb), /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_QUERY_QP,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ virt_to_abs(qqpcb), /* r6 */
+ 0, 0, 0, 0);
}
u64 hipz_h_destroy_qp(const struct ipz_adapter_handle adapter_handle,
struct ehca_qp *qp)
{
u64 ret;
- u64 dummy;
- u64 ladr_next_sq_wqe_out, ladr_next_rq_wqe_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
ret = hcp_galpas_dtor(&qp->galpas);
if (ret) {
ehca_gen_err("Could not destruct qp->galpas");
return H_RESOURCE;
}
- ret = ehca_hcall_7arg_7ret(H_DISABLE_AND_GETC,
- adapter_handle.handle, /* r4 */
- /* function code */
- 1, /* r5 */
- qp->ipz_qp_handle.handle, /* r6 */
- 0, 0, 0, 0,
- &ladr_next_sq_wqe_out, /* r4 */
- &ladr_next_rq_wqe_out, /* r5 */
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall9(H_DISABLE_AND_GETC, outs,
+ adapter_handle.handle, /* r4 */
+ /* function code */
+ 1, /* r5 */
+ qp->ipz_qp_handle.handle, /* r6 */
+ 0, 0, 0, 0, 0, 0);
if (ret == H_HARDWARE)
ehca_gen_err("HCA not operational. ret=%lx", ret);
- ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- qp->ipz_qp_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ qp->ipz_qp_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
if (ret == H_RESOURCE)
ehca_gen_err("Resource still in use. ret=%lx", ret);
@@ -701,20 +563,11 @@ u64 hipz_h_define_aqp0(const struct ipz_
struct h_galpa gal,
u32 port)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_DEFINE_AQP0,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- port, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_DEFINE_AQP0,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ port, /* r6 */
+ 0, 0, 0, 0);
}
u64 hipz_h_define_aqp1(const struct ipz_adapter_handle adapter_handle,
@@ -724,24 +577,15 @@ u64 hipz_h_define_aqp1(const struct ipz_
u32 * bma_qp_nr)
{
u64 ret;
- u64 dummy;
- u64 pma_qp_nr_out, bma_qp_nr_out;
-
- ret = ehca_hcall_7arg_7ret(H_DEFINE_AQP1,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- port, /* r6 */
- 0, 0, 0, 0,
- &pma_qp_nr_out, /* r4 */
- &bma_qp_nr_out, /* r5 */
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
-
- *pma_qp_nr = (u32)pma_qp_nr_out;
- *bma_qp_nr = (u32)bma_qp_nr_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_DEFINE_AQP1, outs,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ port, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ *pma_qp_nr = (u32)outs[0];
+ *bma_qp_nr = (u32)outs[1];
if (ret == H_ALIAS_EXIST)
ehca_gen_err("AQP1 already exists. ret=%lx", ret);
@@ -756,22 +600,14 @@ u64 hipz_h_attach_mcqp(const struct ipz_
u64 subnet_prefix, u64 interface_id)
{
u64 ret;
- u64 dummy;
-
- ret = ehca_hcall_7arg_7ret(H_ATTACH_MCQP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- mcg_dlid, /* r6 */
- interface_id, /* r7 */
- subnet_prefix, /* r8 */
- 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+
+ ret = ehca_plpar_hcall_norets(H_ATTACH_MCQP,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ mcg_dlid, /* r6 */
+ interface_id, /* r7 */
+ subnet_prefix, /* r8 */
+ 0, 0);
if (ret == H_NOT_ENOUGH_RESOURCES)
ehca_gen_err("Not enough resources. ret=%lx", ret);
@@ -785,22 +621,13 @@ u64 hipz_h_detach_mcqp(const struct ipz_
u16 mcg_dlid,
u64 subnet_prefix, u64 interface_id)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_DETACH_MCQP,
- adapter_handle.handle, /* r4 */
- qp_handle.handle, /* r5 */
- mcg_dlid, /* r6 */
- interface_id, /* r7 */
- subnet_prefix, /* r8 */
- 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_DETACH_MCQP,
+ adapter_handle.handle, /* r4 */
+ qp_handle.handle, /* r5 */
+ mcg_dlid, /* r6 */
+ interface_id, /* r7 */
+ subnet_prefix, /* r8 */
+ 0, 0);
}
u64 hipz_h_destroy_cq(const struct ipz_adapter_handle adapter_handle,
@@ -808,7 +635,6 @@ u64 hipz_h_destroy_cq(const struct ipz_a
u8 force_flag)
{
u64 ret;
- u64 dummy;
ret = hcp_galpas_dtor(&cq->galpas);
if (ret) {
@@ -816,18 +642,11 @@ u64 hipz_h_destroy_cq(const struct ipz_a
return H_RESOURCE;
}
- ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- cq->ipz_cq_handle.handle, /* r5 */
- force_flag != 0 ? 1L : 0L, /* r6 */
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ cq->ipz_cq_handle.handle, /* r5 */
+ force_flag != 0 ? 1L : 0L, /* r6 */
+ 0, 0, 0, 0);
if (ret == H_RESOURCE)
ehca_gen_err("H_FREE_RESOURCE failed ret=%lx ", ret);
@@ -839,7 +658,6 @@ u64 hipz_h_destroy_eq(const struct ipz_a
struct ehca_eq *eq)
{
u64 ret;
- u64 dummy;
ret = hcp_galpas_dtor(&eq->galpas);
if (ret) {
@@ -847,18 +665,10 @@ u64 hipz_h_destroy_eq(const struct ipz_a
return H_RESOURCE;
}
- ret = ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- eq->ipz_eq_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
-
+ ret = ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ eq->ipz_eq_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
if (ret == H_RESOURCE)
ehca_gen_err("Resource in use. ret=%lx ", ret);
@@ -875,27 +685,19 @@ u64 hipz_h_alloc_resource_mr(const struc
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 lkey_out;
- u64 rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- 5, /* r5 */
- vaddr, /* r6 */
- length, /* r7 */
- (((u64)access_ctrl) << 32ULL), /* r8 */
- pd.value, /* r9 */
- 0,
- &(outparms->handle.handle), /* r4 */
- &dummy, /* r5 */
- &lkey_out, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
- outparms->lkey = (u32)lkey_out;
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ 5, /* r5 */
+ vaddr, /* r6 */
+ length, /* r7 */
+ (((u64)access_ctrl) << 32ULL), /* r8 */
+ pd.value, /* r9 */
+ 0, 0, 0);
+ outparms->handle.handle = outs[0];
+ outparms->lkey = (u32)outs[2];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -923,7 +725,6 @@ u64 hipz_h_register_rpage_mr(const struc
queue_type,
mr->ipz_mr_handle.handle,
logical_address_of_page, count);
-
return ret;
}
@@ -932,24 +733,17 @@ u64 hipz_h_query_mr(const struct ipz_ada
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 remote_len_out, remote_vaddr_out, acc_ctrl_pd_out, r9_out;
-
- ret = ehca_hcall_7arg_7ret(H_QUERY_MR,
- adapter_handle.handle, /* r4 */
- mr->ipz_mr_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &outparms->len, /* r4 */
- &outparms->vaddr, /* r5 */
- &remote_len_out, /* r6 */
- &remote_vaddr_out, /* r7 */
- &acc_ctrl_pd_out, /* r8 */
- &r9_out,
- &dummy);
-
- outparms->acl = acc_ctrl_pd_out >> 32;
- outparms->lkey = (u32)(r9_out >> 32);
- outparms->rkey = (u32)(r9_out & (0xffffffff));
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_QUERY_MR, outs,
+ adapter_handle.handle, /* r4 */
+ mr->ipz_mr_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0, 0, 0);
+ outparms->len = outs[0];
+ outparms->vaddr = outs[1];
+ outparms->acl = outs[4] >> 32;
+ outparms->lkey = (u32)(outs[5] >> 32);
+ outparms->rkey = (u32)(outs[5] & (0xffffffff));
return ret;
}
@@ -957,19 +751,10 @@ u64 hipz_h_query_mr(const struct ipz_ada
u64 hipz_h_free_resource_mr(const struct ipz_adapter_handle adapter_handle,
const struct ehca_mr *mr)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- mr->ipz_mr_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ mr->ipz_mr_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
}
u64 hipz_h_reregister_pmr(const struct ipz_adapter_handle adapter_handle,
@@ -982,28 +767,20 @@ u64 hipz_h_reregister_pmr(const struct i
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 lkey_out, rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_REREGISTER_PMR,
- adapter_handle.handle, /* r4 */
- mr->ipz_mr_handle.handle, /* r5 */
- vaddr_in, /* r6 */
- length, /* r7 */
- /* r8 */
- ((((u64)access_ctrl) << 32ULL) | pd.value),
- mr_addr_cb, /* r9 */
- 0,
- &dummy, /* r4 */
- &outparms->vaddr, /* r5 */
- &lkey_out, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
-
- outparms->lkey = (u32)lkey_out;
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_REREGISTER_PMR, outs,
+ adapter_handle.handle, /* r4 */
+ mr->ipz_mr_handle.handle, /* r5 */
+ vaddr_in, /* r6 */
+ length, /* r7 */
+ /* r8 */
+ ((((u64)access_ctrl) << 32ULL) | pd.value),
+ mr_addr_cb, /* r9 */
+ 0, 0, 0);
+ outparms->vaddr = outs[1];
+ outparms->lkey = (u32)outs[2];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1017,25 +794,18 @@ u64 hipz_h_register_smr(const struct ipz
struct ehca_mr_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 lkey_out, rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_REGISTER_SMR,
- adapter_handle.handle, /* r4 */
- orig_mr->ipz_mr_handle.handle, /* r5 */
- vaddr_in, /* r6 */
- (((u64)access_ctrl) << 32ULL), /* r7 */
- pd.value, /* r8 */
- 0, 0,
- &(outparms->handle.handle), /* r4 */
- &dummy, /* r5 */
- &lkey_out, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
- outparms->lkey = (u32)lkey_out;
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_REGISTER_SMR, outs,
+ adapter_handle.handle, /* r4 */
+ orig_mr->ipz_mr_handle.handle, /* r5 */
+ vaddr_in, /* r6 */
+ (((u64)access_ctrl) << 32ULL), /* r7 */
+ pd.value, /* r8 */
+ 0, 0, 0, 0);
+ outparms->handle.handle = outs[0];
+ outparms->lkey = (u32)outs[2];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1046,23 +816,15 @@ u64 hipz_h_alloc_resource_mw(const struc
struct ehca_mw_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_ALLOC_RESOURCE,
- adapter_handle.handle, /* r4 */
- 6, /* r5 */
- pd.value, /* r6 */
- 0, 0, 0, 0,
- &(outparms->handle.handle), /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &rkey_out, /* r7 */
- &dummy,
- &dummy,
- &dummy);
-
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_ALLOC_RESOURCE, outs,
+ adapter_handle.handle, /* r4 */
+ 6, /* r5 */
+ pd.value, /* r6 */
+ 0, 0, 0, 0, 0, 0);
+ outparms->handle.handle = outs[0];
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1072,21 +834,13 @@ u64 hipz_h_query_mw(const struct ipz_ada
struct ehca_mw_hipzout_parms *outparms)
{
u64 ret;
- u64 dummy;
- u64 pd_out, rkey_out;
-
- ret = ehca_hcall_7arg_7ret(H_QUERY_MW,
- adapter_handle.handle, /* r4 */
- mw->ipz_mw_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy, /* r4 */
- &dummy, /* r5 */
- &dummy, /* r6 */
- &rkey_out, /* r7 */
- &pd_out, /* r8 */
- &dummy,
- &dummy);
- outparms->rkey = (u32)rkey_out;
+ u64 outs[PLPAR_HCALL9_BUFSIZE];
+
+ ret = ehca_plpar_hcall9(H_QUERY_MW, outs,
+ adapter_handle.handle, /* r4 */
+ mw->ipz_mw_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0, 0, 0);
+ outparms->rkey = (u32)outs[3];
return ret;
}
@@ -1094,19 +848,10 @@ u64 hipz_h_query_mw(const struct ipz_ada
u64 hipz_h_free_resource_mw(const struct ipz_adapter_handle adapter_handle,
const struct ehca_mw *mw)
{
- u64 dummy;
-
- return ehca_hcall_7arg_7ret(H_FREE_RESOURCE,
- adapter_handle.handle, /* r4 */
- mw->ipz_mw_handle.handle, /* r5 */
- 0, 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_FREE_RESOURCE,
+ adapter_handle.handle, /* r4 */
+ mw->ipz_mw_handle.handle, /* r5 */
+ 0, 0, 0, 0, 0);
}
u64 hipz_h_error_data(const struct ipz_adapter_handle adapter_handle,
@@ -1114,7 +859,6 @@ u64 hipz_h_error_data(const struct ipz_a
void *rblock,
unsigned long *byte_count)
{
- u64 dummy;
u64 r_cb = virt_to_abs(rblock);
if (r_cb & (EHCA_PAGESIZE-1)) {
@@ -1122,16 +866,9 @@ u64 hipz_h_error_data(const struct ipz_a
return H_PARAMETER;
}
- return ehca_hcall_7arg_7ret(H_ERROR_DATA,
- adapter_handle.handle,
- ressource_handle,
- r_cb,
- 0, 0, 0, 0,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy,
- &dummy);
+ return ehca_plpar_hcall_norets(H_ERROR_DATA,
+ adapter_handle.handle,
+ ressource_handle,
+ r_cb,
+ 0, 0, 0, 0);
}
diff --git a/drivers/infiniband/hw/ehca/hcp_if.h b/drivers/infiniband/hw/ehca/hcp_if.h
index 39956d8..587ebd4 100644
--- a/drivers/infiniband/hw/ehca/hcp_if.h
+++ b/drivers/infiniband/hw/ehca/hcp_if.h
@@ -107,7 +107,7 @@ u64 hipz_h_register_rpage_eq(const struc
const u64 logical_address_of_page,
const u64 count);
-u32 hipz_h_query_int_state(const struct ipz_adapter_handle
+u64 hipz_h_query_int_state(const struct ipz_adapter_handle
hcp_adapter_handle,
u32 ist);
diff --git a/drivers/infiniband/hw/ehca/hipz_hw.h b/drivers/infiniband/hw/ehca/hipz_hw.h
index f5f4871..3fc92b0 100644
--- a/drivers/infiniband/hw/ehca/hipz_hw.h
+++ b/drivers/infiniband/hw/ehca/hipz_hw.h
@@ -184,8 +184,6 @@ struct hipz_mrmwmm {
};
-#define MRX_HCR_LPARID_VALID EHCA_BMASK_IBM(0,0)
-
#define MRMWMM_OFFSET(x) offsetof(struct hipz_mrmwmm,x)
struct hipz_qpedmm {
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.h b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
index 7e55a31..2f13509 100644
--- a/drivers/infiniband/hw/ehca/ipz_pt_fn.h
+++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.h
@@ -226,10 +226,9 @@ static inline void *ipz_eqit_eq_get_inc_
{
void *ret = ipz_qeit_get(queue);
u32 qe = *(u8 *) ret;
- if ((qe >> 7) == (queue->toggle_state & 1))
- ipz_qeit_eq_get_inc(queue); /* this is a good one */
- else
- ret = NULL;
+ if ((qe >> 7) != (queue->toggle_state & 1))
+ return NULL;
+ ipz_qeit_eq_get_inc(queue); /* this is a good one */
return ret;
}
^ permalink raw reply related
* Re: [PATCH 2.6.19-rc1] ehca firmware interface based on Anton Blanchard's new hvcall interface
From: Roland Dreier @ 2006-09-22 15:27 UTC (permalink / raw)
To: Hoang-Nam Nguyen
Cc: pmac, linux-kernel, openib-general, openfabrics-ewg, linuxppc-dev,
raisch
In-Reply-To: <200609221720.24191.hnguyen@de.ibm.com>
> - shca->ib_device.node_type = RDMA_NODE_IB_CA;
> + shca->ib_device.node_type = IB_NODE_CA;
Did you test this at all? I can't see how this would build against my
for-2.6.19 tree...
Please resend a patch that you know is working.
- R.
^ permalink raw reply
* RE: bsp for Linux kernel 2.6
From: Yang, Steve @ 2006-09-22 12:57 UTC (permalink / raw)
To: shenbagaraj; +Cc: linuxppc-embedded
Shen,
Wind River Linux 1.3 has BSP support for this board. The kernel version
is 2.6.14.
Regards,=20
Steve Yang
-----Original Message-----
From: linuxppc-embedded-bounces+syang=3Dwindriver.com@ozlabs.org
[mailto:linuxppc-embedded-bounces+syang=3Dwindriver.com@ozlabs.org] On
Behalf Of shenbagaraj
Sent: Thursday, September 21, 2006 5:07 PM
To: linuxppc-embedded@ozlabs.org
Subject: bsp for Linux kernel 2.6=20
Hi,
I ma working on Windriver powerquicc board 8260.where do i get the
required patches for linux 2.6.11.11.
regards,
shen
_______________________________________________
Linuxppc-embedded mailing list
Linuxppc-embedded@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-embedded
^ permalink raw reply
* Re: [PATCH] POWERPC: mpc82xx merge: board-specific/platform stuff(resend)
From: Jon Loeliger @ 2006-09-22 17:20 UTC (permalink / raw)
To: Vitaly Bordug; +Cc: linuxppc-dev, Paul Mackerras
In-Reply-To: <20060922135057.2859.29388.stgit@localhost.localdomain>
So, like, the other day Vitaly Bordug mumbled:
>
> This intruduces 82xx family in arch/powerpc/platforms,
> and has all the board-specific code to represent regression-less
> transaction from ppc. The functionality is apparently the same, including
> PCI controller.
>
> Signed-off-by: Vitaly Bordug <vbordug@ru.mvista.com>
Excellent! Thanks!
> +++ b/arch/powerpc/platforms/82xx/mpc82xx_ads.c
> +/*
> + * Called very early, device-tree isn't unflattened
> + */
> +static int __init mpc82xx_ads_probe(void)
> +{
> + /* We always match for now, eventually we should look at
> + * the flat dev tree to ensure this is the board we are
> + * supposed to run on
> + */
> + return 1;
> +}
Please implement this routine fully. Something down this line:
{
unsigned long root = of_get_flat_dt_root();
if (of_flat_dt_is_compatible(root, "mpc82xx"))
return 1; /* Looks good */
return 0;
}
And with that, ACK me:
Acked-by: Jon Loeliger <jdl@freescale.com>
Thanks,
jdl
^ permalink raw reply
* Re: Please pull upstream branch of linux-2.6-PQ.git...
From: Jon Loeliger @ 2006-09-22 17:24 UTC (permalink / raw)
To: Vitaly Bordug; +Cc: linuxppc-dev@ozlabs.org, Paul Mackerras
In-Reply-To: <20060922063700.79251139@localhost.localdomain>
So, like, the other day Vitaly Bordug mumbled:
>
> Paul,
>
> Refined 8560 series can be found in=20
>
> git://git.kernel.org/pub/scm/linux/kernel/git/vitb/linux-2.6-PQ.git, upstream branch.
Modulo ensuring the documentation is up-to-date, sign me:
Acked-by: Jon Loeliger <jdl@freescale.com>
Thanks,
jdl
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox