* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Thomas Gleixner @ 2012-04-06 11:17 UTC (permalink / raw)
To: Andreas Schwab
Cc: devicetree-discuss, linux-kernel, Milton Miller, Rob Herring,
linuxppc-dev, linux-arm-kernel
In-Reply-To: <m2r4w1akz4.fsf@igel.home>
On Fri, 6 Apr 2012, Andreas Schwab wrote:
> Grant Likely <grant.likely@secretlab.ca> writes:
>
> > Can you attach console output logs for each of configs above and also
> > with NR_IRQS=128? That might give me some clues as to which specific
> > code is causing the issues.
>
> It really looks like the issue starts when irq_expand_nr_irqs is called
> the first time to make nr_irqs bigger than NR_IRQS.
And it looks like the irqdomain code is the real culprit.
void irq_set_virq_count(unsigned int count)
{
pr_debug("irq: Trying to set virq count to %d\n", count);
BUG_ON(count < NUM_ISA_INTERRUPTS);
if (count < NR_IRQS)
irq_virq_count = count;
}
That looks simply wrong.....
s/NR_IRQS/nr_irqs/ should do the trick.
Thanks,
tglx
^ permalink raw reply
* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Andreas Schwab @ 2012-04-06 11:25 UTC (permalink / raw)
To: Thomas Gleixner
Cc: devicetree-discuss, linux-kernel, Milton Miller, Rob Herring,
linuxppc-dev, linux-arm-kernel
In-Reply-To: <alpine.LFD.2.02.1204061315040.2542@ionos>
Thomas Gleixner <tglx@linutronix.de> writes:
> And it looks like the irqdomain code is the real culprit.
>
> void irq_set_virq_count(unsigned int count)
> {
> pr_debug("irq: Trying to set virq count to %d\n", count);
>
> BUG_ON(count < NUM_ISA_INTERRUPTS);
> if (count < NR_IRQS)
> irq_virq_count = count;
> }
>
> That looks simply wrong.....
There is a single use of irq_set_virq_count, which is only relevant to
the PS3.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply
* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Thomas Gleixner @ 2012-04-06 11:28 UTC (permalink / raw)
To: Andreas Schwab
Cc: devicetree-discuss, linux-kernel, Milton Miller, Rob Herring,
linuxppc-dev, linux-arm-kernel
In-Reply-To: <m2bon59k68.fsf@igel.home>
On Fri, 6 Apr 2012, Andreas Schwab wrote:
> Thomas Gleixner <tglx@linutronix.de> writes:
>
> > And it looks like the irqdomain code is the real culprit.
> >
> > void irq_set_virq_count(unsigned int count)
> > {
> > pr_debug("irq: Trying to set virq count to %d\n", count);
> >
> > BUG_ON(count < NUM_ISA_INTERRUPTS);
> > if (count < NR_IRQS)
> > irq_virq_count = count;
> > }
> >
> > That looks simply wrong.....
>
> There is a single use of irq_set_virq_count, which is only relevant to
> the PS3.
Though irq_virq_count is statically initialized to NR_IRQS and it's
used in the code more than once.
^ permalink raw reply
* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Andreas Schwab @ 2012-04-06 11:51 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Russell King - ARM Linux, devicetree-discuss, linux-kernel,
Rob Herring, Milton Miller, Thomas Gleixner, linuxppc-dev,
linux-arm-kernel
In-Reply-To: <1333409927.30734.62.camel@pasglop>
Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
> Ok. Doesn't matter anyway, this shouldn't be the problem in this
> specific case. IE. we shouldn't be setting that interrupt to NONE.
After removinge the call to irq_set_irq_type in mpic_host_map the irq
problem disappears.
Instead of the irq_set_irq_type(,NONE) calls from mpic_host_map I see
corresponding irq_set_irq_type(,LEVEL_LOW) calls now.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply
* Re: [PATCH 1/1] [v3] Add support 2 SATA ports for Maui and change filename from sata_dwc_460ex.c to sata_dwc_4xx.c
From: Sergei Shtylyov @ 2012-04-06 12:10 UTC (permalink / raw)
To: Thang Q. Nguyen
Cc: Phong Vo, devicetree-discuss, linuxppc-dev, Rob Herring,
linux-kernel, linux-ide, Paul Mackerras, Jeff Garzik
In-Reply-To: <1333690265-27857-1-git-send-email-tqnguyen@apm.com>
Hello.
On 06-04-2012 9:31, Thang Q. Nguyen wrote:
> Signed-off-by: Thang Q. Nguyen<tqnguyen@apm.com>
> ---
> Changes for v2:
> - Use git rename feature to change the driver to the newname and for
> easier review.
> Changes for v3:
> - Remove materials not related to 2 SATA ports support. They will
> be added in another patches.
> drivers/ata/Makefile | 2 +-
> drivers/ata/{sata_dwc_460ex.c => sata_dwc_4xx.c} | 820 +++++++++++-----------
> 2 files changed, 430 insertions(+), 392 deletions(-)
> rename drivers/ata/{sata_dwc_460ex.c => sata_dwc_4xx.c} (73%)
> diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_4xx.c
> similarity index 73%
> rename from drivers/ata/sata_dwc_460ex.c
> rename to drivers/ata/sata_dwc_4xx.c
> index 69f7cde..07e9b36 100644
> --- a/drivers/ata/sata_dwc_460ex.c
> +++ b/drivers/ata/sata_dwc_4xx.c
[...]
> @@ -16,6 +14,15 @@
> * 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.
> + *
> + * CHANGES:
> + * - Version 1.4:
> + * + Change filename from sata_dwc_460ex.c to sata_dwc_4xx.c
> + * + This driver supports more than one SATA port. Each SATA port has its
> + * own private attribute. Move sata_dwc_host_priv structure to
> + * sata_dwc_device and sata_dwc_device_port structures.
> + * + Change to use ata_bmdma_qc_issue and ata_bmdma_error_handler because
> + * the ata_sff_qc_issue and ata_sff_error_handler no longer support DMA.
This modification looks like a bug fix, and so should be separated and
posted before the dual-port patch.
I'll try to do more deltailed review on the weekend.
MBR, Sergei
^ permalink raw reply
* Re: [PATCH] Use clockevent multiplier and shifter for decrementer
From: Scott Wood @ 2012-04-06 19:10 UTC (permalink / raw)
To: Bharat Bhushan; +Cc: Bharat Bhushan, linuxppc-dev, kvm, kvm-ppc
In-Reply-To: <1333522311-1390-1-git-send-email-bharat.bhushan@freescale.com>
On 04/04/2012 01:51 AM, Bharat Bhushan wrote:
> Time for which the hrtimer is started for decrementer emulation is
> calculated using tb_ticks_per_usec. While hrtimer uses the clockevent
> for DEC reprogramming (if needed) and which calculate timebase ticks
> using the multiplier and shifter mechanism implemented within
> clockevent layer. It was observed that this conversion
> (timebase->time->timebase) are not correct because the mechanism are
> not consistent. In our setup it adds 2% jitter.
>
> With this patch clockevent multiplier and shifter mechanism are used
> when starting hrtimer for decrementer emulation. Now the jitter is <
> 0.5%.
>
> Signed-off-by: Bharat Bhushan<bharat.bhushan@freescale.com>
> ---
> arch/powerpc/include/asm/time.h | 2 ++
> arch/powerpc/kernel/time.c | 6 ++++++
> arch/powerpc/kvm/emulate.c | 5 +++--
> 3 files changed, 11 insertions(+), 2 deletions(-)
Changes to arch/powerpc outside arch/powerpc/kvm need to
Cc: linuxppc-dev@lists.ozlabs.org
> diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
> index 7eb10fb..6d631b2 100644
> --- a/arch/powerpc/include/asm/time.h
> +++ b/arch/powerpc/include/asm/time.h
> @@ -202,6 +202,8 @@ extern u64 mulhdu(u64, u64);
> extern void div128_by_32(u64 dividend_high, u64 dividend_low,
> unsigned divisor, struct div_result *dr);
>
> +extern void get_clockevent_mult(u64 *multi, u64 *shift);
> +
> /* Used to store Processor Utilization register (purr) values */
>
> struct cpu_usage {
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 567dd7c..d229edd 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -910,6 +910,12 @@ static void __init init_decrementer_clockevent(void)
> register_decrementer_clockevent(cpu);
> }
>
> +void get_clockevent_mult(u64 *multi, u64 *shift)
> +{
> + *multi = decrementer_clockevent.mult;
> + *shift = decrementer_clockevent.shift;
> +}
Maybe just make decrmenter_clockevent non-static?
> diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
> index afc9154..4bfcaa1 100644
> --- a/arch/powerpc/kvm/emulate.c
> +++ b/arch/powerpc/kvm/emulate.c
> @@ -76,6 +76,7 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> {
> unsigned long dec_nsec;
> unsigned long long dec_time;
> + u64 mult, shift;
>
> pr_debug("mtDEC: %x\n", vcpu->arch.dec);
> hrtimer_try_to_cancel(&vcpu->arch.dec_timer);
> @@ -103,9 +104,9 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
> * host ticks.
> */
>
> + get_clockevent_mult(&mult,&shift);
> dec_time = vcpu->arch.dec;
> - dec_time *= 1000;
> - do_div(dec_time, tb_ticks_per_usec);
> + dec_time = (dec_time<< shift) / mult;
> dec_nsec = do_div(dec_time, NSEC_PER_SEC);
> hrtimer_start(&vcpu->arch.dec_timer,
> ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
-Scott
^ permalink raw reply
* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Benjamin Herrenschmidt @ 2012-04-06 23:37 UTC (permalink / raw)
To: Andreas Schwab
Cc: Russell King - ARM Linux, devicetree-discuss, linux-kernel,
Rob Herring, Milton Miller, Thomas Gleixner, linuxppc-dev,
linux-arm-kernel
In-Reply-To: <m24nsx9iz1.fsf@igel.home>
On Fri, 2012-04-06 at 13:51 +0200, Andreas Schwab wrote:
> Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
>
> > Ok. Doesn't matter anyway, this shouldn't be the problem in this
> > specific case. IE. we shouldn't be setting that interrupt to NONE.
>
> After removinge the call to irq_set_irq_type in mpic_host_map the irq
> problem disappears.
>
> Instead of the irq_set_irq_type(,NONE) calls from mpic_host_map I see
> corresponding irq_set_irq_type(,LEVEL_LOW) calls now.
It's arguable that this irq_set_irq_type(,NONE) shouln't be there but
still ... it's been around for ever and things worked :-) So something
-else- is causing the problem and I'd like to understand what exactly.
(When I say arguable, I do mean it. There are some reasons to keep it
even if we agree that it's not "setting a default" but marking the
interrupt as somewhat disabled as Russell wants, that's fine with me, an
MPIC external interrupt should -always- have a proper type set before
being used).
First we need to fix that business with NR_IRQS/nr_irqs everywhere, then
if the problem persists, check why we aren't calling the proper
irq_set_irq_type() after the mapping is established (we should be).
Cheers,
Ben.
^ permalink raw reply
* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Grant Likely @ 2012-04-07 1:29 UTC (permalink / raw)
To: Thomas Gleixner, Andreas Schwab
Cc: devicetree-discuss, linux-kernel, Milton Miller, Rob Herring,
linuxppc-dev, linux-arm-kernel
In-Reply-To: <alpine.LFD.2.02.1204061315040.2542@ionos>
On Fri, 6 Apr 2012 13:17:04 +0200 (CEST), Thomas Gleixner <tglx@linutronix.de> wrote:
> On Fri, 6 Apr 2012, Andreas Schwab wrote:
>
> > Grant Likely <grant.likely@secretlab.ca> writes:
> >
> > > Can you attach console output logs for each of configs above and also
> > > with NR_IRQS=128? That might give me some clues as to which specific
> > > code is causing the issues.
> >
> > It really looks like the issue starts when irq_expand_nr_irqs is called
> > the first time to make nr_irqs bigger than NR_IRQS.
>
> And it looks like the irqdomain code is the real culprit.
>
> void irq_set_virq_count(unsigned int count)
> {
> pr_debug("irq: Trying to set virq count to %d\n", count);
>
> BUG_ON(count < NUM_ISA_INTERRUPTS);
> if (count < NR_IRQS)
> irq_virq_count = count;
> }
>
> That looks simply wrong.....
>
> s/NR_IRQS/nr_irqs/ should do the trick.
Yeah, that code is wrong and I'll fix it, but the only purpose of that
code is to support the direct mapping on hardware that has limit on
the largest irq number that it can handle. That shouldn't be the
problem here.
g.
^ permalink raw reply
* Re: [PATCH v5 06/27] irq_domain/powerpc: eliminate irq_map; use irq_alloc_desc() instead
From: Andreas Schwab @ 2012-04-07 12:27 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Russell King - ARM Linux, devicetree-discuss, linux-kernel,
Rob Herring, Milton Miller, Thomas Gleixner, linuxppc-dev,
linux-arm-kernel
In-Reply-To: <1333755470.3040.38.camel@pasglop>
Benjamin Herrenschmidt <benh@kernel.crashing.org> writes:
> It's arguable that this irq_set_irq_type(,NONE) shouln't be there but
> still ... it's been around for ever and things worked :-) So something
> -else- is causing the problem and I'd like to understand what exactly.
AFAICS before a09b659cd68c10ec6a30cb91ebd2c327fcd5bfe5
irq_set_irq_type(,NONE) was actually a no-op.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply
* kernel3.2.13 cannot boot on my mpc8260 board using u-boot2011.12
From: jerry_dw @ 2012-04-08 12:56 UTC (permalink / raw)
To: linuxppc-dev
[-- Attachment #1: Type: text/plain, Size: 6874 bytes --]
Hi:
My board is a custom MPC8260 board, with 4MB flash,128MB SDRAM.
I modified pq2fads.dts and pq2fads_defconfig,
then compile the kernel.The kernel halt after displaying "Booting using OF flat tree.".
Serial Console:
U-Boot 2011.12 (Mar 30 2012 - 15:57:39)
MPC8260 Reset Status: External Soft, External Hard
MPC8260 Clock Configuration
- Bus-to-Core Mult 4.5x, VCO Div 2, 60x Bus Freq 22-65 , Core Freq 100-300
- dfbrg 1, corecnf 0x17, busdf 5, cpmdf 1, plldf 0, pllmf 2, pcidf 3
- vco_out 399999996, scc_clk 99999999, brg_clk 24999999
- cpu_clk 299999997, cpm_clk 199999998, bus_clk 66666666
CPU: MPC8260 (HiP4 Rev 14, Mask B.1 4K25A) at 300 MHz
Board: SJ3208 TDM to EtherNet
SDRAM: 128 MiB
Top of RAM usable for U-Boot at: 08000000
Reserving 261k for U-Boot at: 07fbe000
Reserving 256k for malloc() at: 07f7e000
Reserving 76 Bytes for Board Info at: 07f7dfb4
Reserving 108 Bytes for Global Data at: 07f7df48
Stack Pointer at: 07f7df28
New Stack Pointer is: 07f7df28
Now running in RAM - U-Boot at: 07fbe000
FLASH: flash_protect ON: from 0x20000000 to 0x2003BFFF
protect on 0
protect on 1
protect on 2
protect on 3
protect on 4
protect on 5
protect on 6
protect on 7
protect on 8
flash_protect ON: from 0x20060000 to 0x2007FFFF
protect on 10
4 MiB
*** Warning - bad CRC, using default environment
Destroy Hash Table: 07ffcf04 table = (null)
Create Hash Table: N=91
INSERT: table 07ffcf04, filled 1/97 rv 07f7e148 ==> name="bootargs" value="console=ttyCPM0,9600 root=/dev/ram0"
INSERT: table 07ffcf04, filled 2/97 rv 07f7e2bc ==> name="bootcmd" value="bootm 0x20080000 0x20240000"
INSERT: table 07ffcf04, filled 3/97 rv 07f7e2ec ==> name="bootdelay" value="5"
INSERT: table 07ffcf04, filled 4/97 rv 07f7e19c ==> name="baudrate" value="9600"
INSERT: table 07ffcf04, filled 5/97 rv 07f7e574 ==> name="ethaddr" value="00:10:EC:D0:30:88"
INSERT: table 07ffcf04, filled 6/97 rv 07f7e178 ==> name="ipaddr" value="12.13.38.221"
INSERT: table 07ffcf04, filled 7/97 rv 07f7e550 ==> name="serverip" value="12.13.38.222"
INSERT: table 07ffcf04, filled 8/97 rv 07f7e4d8 ==> name="gatewayip" value="12.13.38.254"
INSERT: table 07ffcf04, filled 9/97 rv 07f7e34c ==> name="netmask" value="255.255.255.0"
INSERT: free(data = 07f7e008)
INSERT: done
In: serial
Out: serial
Err: serial
U-Boot relocated to 07fbe000
Net: FCC1
Reset Ethernet PHY
### main_loop entered: bootdelay=5
### main_loop: bootcmd="bootm 0x20080000 0x20240000"
Hit any key to stop autoboot: 0
=> bootm 0x20080000 0x20240000 0x203ff000
## Current stack ends at 0x07f7dd10
* kernel: cmdline image address = 0x20080000
## Booting kernel from Legacy Image at 20080000 ...
Image Name: Linux-3.2.13.Jerry_Test_V1.1
Image Type: PowerPC Linux Kernel Image (gzip compressed)
Data Size: 1527637 Bytes = 1.5 MiB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
kernel data at 0x20080040, len = 0x00174f55 (1527637)
* ramdisk: cmdline image address = 0x20240000
## Loading init Ramdisk from Legacy Image at 20240000 ...
Image Name: SJ3208_Ramdisk_01
Image Type: PowerPC Linux RAMDisk Image (gzip compressed)
Data Size: 1730966 Bytes = 1.7 MiB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
ramdisk start = 0x20240040, ramdisk end = 0x203e69d6
* fdt: cmdline image address = 0x203ff000
## Checking for 'FDT'/'FDT Image' at 203ff000
* fdt: raw FDT blob
## Flattened Device Tree blob at 203ff000
Booting using the fdt blob at 0x203ff000
of_flat_tree at 0x203ff000 size 0x00000fbb
Uncompressing Kernel Image ... OK
kernel loaded at 0x00000000, end = 0x0030fda0
## initrd_high = 0xffffffff, copy_to_ram = 1
Loading Ramdisk to 07dd6000, end 07f7c996 ... OK
ramdisk load start = 0x07dd6000, ramdisk load end = 0x07f7c996
## device tree at 203ff000 ... 203fffba (len=16315 [0x3FBB])
Loading Device Tree to 003fc000, end 003fffba ... OK
Updating property '/soc@f0000000/cpm@119c0/ethernet@11320/mac-address' = 00 10 ec d0 30 88
Updating property '/soc@f0000000/cpm@119c0/ethernet@11320/local-mac-address' = 00 10 ec d0 30 88
Updating property 'clock-frequency' = 01 7d 78 3f
Updating property 'bus-frequency' = 03 f9 40 aa
Updating property 'timebase-frequency' = 00 fe 50 2a
Updating property 'clock-frequency' = 11 e1 a2 fd
## Transferring control to Linux (at address 00000000) ...
Booting using OF flat tree...
And Log_buf as follow:
20120331:log_buffer as follow
<6>Using Freescale PQ2FADS machine description.
<3>Cannot reserve gpages without hugetlb enabled.
<5>Linux version 3.2.13.Jerry_1.0_Test (jerry@jerry-desktop) (gcc version 4.2.2) #1 Fri Mar 30 1 1:07:35 CST 2012.
<4>Found initrd at 0xc7dd6000:0xc7f7c996.
<4>Machine check in kernel mode..
<4>Caused by (from SRR1=41030): Transfer error ack signal.
<4>Oops: Machine check, sig: 7 [#1].
<4>Freescale PQ2FADS.
<4>NIP: c00175c0 LR: c0328a9c CTR:00002710.
<4>REGS: c035bed0 TRAP 0200 Not tainted (3.2.13.Jerry_1.0_Test).
<4>MSR: 00041030 <ME,IR,DR> CR: 22022024 XER: 20000000.
<4>TASK =c0349478[0] 'swapper' THREAD: c035a000.
<4>GPR00: 00002710 c035bf80 c0349478 80010000 00000000 c037cefc f00095a90000a000 .
<4>GPR08: 00000008 fdfd19c0 00000000 c0360000 c036339c 02040000 00000000 00000000 .
<4>GPR16: 07ff0bac 07fe9728 00000000 00000000 00000000 00000000 00000000 00000000 .
<4>GPR24: 00000000 00000000 40000000 07ffcf88 c0360000 c03613ec c035e020 00001032 .
<4>NIP [c00175c0] cpm_command+0x4c/0xb0.
<4>LR [c0328a9c] pq2fads_setup_arch+0x3c/0x260.
<4>Call Trace:.
<4>[c035bf80] [c03613ec] ppc_md+0x0/0xd8 (unreliable).
<4>[c035bf90] [c0328a9c] pq2fads_setup_arch+0x3c/0x260.
<4>[c035bfb0] [c0324e58] setup_arch+0x150/0x18c.
<4>[c035bfc0] [c0320864] start_kernel+0x84/0x2e0.
<4>[c035bff0] [00003438] 0x3438.
<4>Instruction dump:.
<4>3d60c036 64630001 7c632378 812b00f4 7c0004ac 90690000 38002710 7c0903a6 .
<4>48000008 4240003c 812b00f4 7c0004ac.<80090000> 0c000000 4c00012c 74090001 .
<4>---[end trace 31fd0ba7d8756001 ]---.
<0>Kernel panic - not syncing: Attempted to kill the idle task!.
<4>Call Trace:.
<4>[c035bdb0] [c0007f08] show_stack+0x4c/0x16c (unreliable).
<4>[c035bdf0] [c001e714] panic+0xa8/0x1f4.
<4>[c035be40] [c00227a8] do_exit+0x5a4/0x658.
<4>[c035be80] [c000ba98] kerne l_bad_stack+0x0/0x4c.
<4>[c035bea0] [c000bcc0] machine_check_exception+0xe4/0x170
<4>[c035bec0] [c000f334] ret_from_except_full+0x0/0x4c.
<4>--- Exception: 200 at cpm_command+0x4c/0xb0.
<4> LR = pq2fads_setup_arch+0x3c/0x260
<4>[c035bf80] [c03613ec] ppc_md+0x0/0xd8 (unreliable).
<4>[c035bf90] [c0328a9c] pq2fads_setup_arch+0x3c/0x260.
<4>[c035bfb0] [c0324e58] setup_arch+0x150/0x18c.
<4>[c035bfc0] [c0320864] start_kernel+0x84/0x2e0.
<4>[c035bff0] [00003438] 0x3438.
<0>Rebooting in 180 seconds......
I have no idea about this,
u-boot,Flat device tree ,kernel,Ramdisk ,Thatwas wrong??
Best regards.
Jerry
[-- Attachment #2: Type: text/html, Size: 8844 bytes --]
^ permalink raw reply
* Re: [PATCH 1/1] [v3] Add support 2 SATA ports for Maui and change filename from sata_dwc_460ex.c to sata_dwc_4xx.c
From: Sergei Shtylyov @ 2012-04-08 19:35 UTC (permalink / raw)
To: Thang Q. Nguyen
Cc: Phong Vo, devicetree-discuss, linuxppc-dev, Rob Herring,
linux-kernel, linux-ide, Paul Mackerras, Jeff Garzik
In-Reply-To: <1333690265-27857-1-git-send-email-tqnguyen@apm.com>
Hello.
On 06-04-2012 9:31, Thang Q. Nguyen wrote:
> Signed-off-by: Thang Q. Nguyen<tqnguyen@apm.com>
[...]
> diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_4xx.c
> similarity index 73%
> rename from drivers/ata/sata_dwc_460ex.c
> rename to drivers/ata/sata_dwc_4xx.c
> index 69f7cde..07e9b36 100644
> --- a/drivers/ata/sata_dwc_460ex.c
> +++ b/drivers/ata/sata_dwc_4xx.c
[...]
> @@ -268,22 +276,25 @@ enum {
> << 16)
> struct sata_dwc_device {
> struct device *dev; /* generic device struct */
> - struct ata_probe_ent *pe; /* ptr to probe-ent */
> struct ata_host *host;
> u8 *reg_base;
> struct sata_dwc_regs *sata_dwc_regs; /* DW Synopsys SATA specific */
> int irq_dma;
> + u8 *scr_base;
Why not 'void __iomem *scr_base'? You have to cast to it anyway everytime.
And 'u8 *' is just not the right type.
> + int dma_channel; /* DWC SATA DMA channel */
> + int hostID;
> };
хюююъ
> +/* This is used for easier trace back when having DMA channel */
> +static struct sata_dwc_device *dwc_dev_list[DMA_NUM_CHANS];
I don't quite understand: isn't this dual channel device? But you declare
a device per DMA channel...
> +/*
> + * As we have only one DMA controller, this will be set static and global
> + * for easier to access
"to" not needed here.
> @@ -372,15 +381,15 @@ static const char *get_dma_dir_descript(int dma_dir)
> }
> }
>
> -static void sata_dwc_tf_dump(struct ata_taskfile *tf)
> +static void sata_dwc_tf_dump(struct device *dwc_dev, struct ata_taskfile *tf)
> {
> - dev_vdbg(host_pvt.dwc_dev, "taskfile cmd: 0x%02x protocol: %s flags:"
> + dev_vdbg(dwc_dev, "taskfile cmd: 0x%02x protocol: %s flags:"
Space missing after colon, BTW.
> "0x%lx device: %x\n", tf->command,
> get_prot_descript(tf->protocol), tf->flags, tf->device);
[...]
> /*
> * Function: dma_request_channel
BTW, it would be good if you changed the function comments to the
kernel-doc format (in another patch).
> - * arguments: None
> + * arguments: ap
> * returns channel number if available else -1
> * This function assigns the next available DMA channel from the list to the
> * requester
> */
> -static int dma_request_channel(void)
> +static int dma_request_channel(struct ata_port *ap)
> {
> - int i;
> + struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
>
[...]
> + /* Check if the channel is not currently in use */
> + if (!(in_le32(&(sata_dma_regs->dma_chan_en.low)) &\
\ not needed. () with & not needed.
> + DMA_CHANNEL(hsdev->dma_channel)))
> + return hsdev->dma_channel;
> +
> + dev_err(ap->dev, "%s Channel %d is currently in use\n", __func__,
> + hsdev->dma_channel);
> return -1;
> }
>
> /*
> + * Check if the selected DMA channel is currently enabled.
> + */
> +static int sata_dwc_dma_chk_en(int ch)
> +{
> + u32 dma_chan_reg;
Empty line here please.
> + /* Read the DMA channel register */
> + dma_chan_reg = in_le32(&(sata_dma_regs->dma_chan_en.low));
() with & not needed.
> +/*
> + * Handle DMA transfer complete interrupt. This checks and passes the
> + * processing to the appropriate ATA port.
> + */
> +static irqreturn_t dma_dwc_handler(int irq, void *hsdev_instance)
> +{
> + u32 tfr_reg, err_reg;
> + int chan;
> +
> + tfr_reg = in_le32(&(sata_dma_regs->interrupt_status.tfr.low));
> + err_reg = in_le32(&(sata_dma_regs->interrupt_status.error.low));
() with & not needed.
> @@ -471,41 +517,25 @@ static irqreturn_t dma_dwc_interrupt(int irq, void *hsdev_instance)
> spin_lock_irqsave(&host->lock, flags);
> ap = host->ports[port];
> hsdevp = HSDEVP_FROM_AP(ap);
> - tag = ap->link.active_tag;
>
> - tfr_reg = in_le32(&(host_pvt.sata_dma_regs->interrupt_status.tfr\
> + if (ap->link.active_tag != ATA_TAG_POISON)
> + tag = ap->link.active_tag;
> +
> + tfr_reg = in_le32(&(sata_dma_regs->interrupt_status.tfr\
\ not needed. () with & not needed. And the line is too short to break it
anyway.
> .low));
> - err_reg = in_le32(&(host_pvt.sata_dma_regs->interrupt_status.error\
> + err_reg = in_le32(&(sata_dma_regs->interrupt_status.error\
Same coments.
> + out_le32(&(sata_dma_regs->interrupt_clear.tfr.low),
() with & not needed.
> @@ -516,11 +546,16 @@ static irqreturn_t dma_dwc_interrupt(int irq, void *hsdev_instance)
> err_reg);
>
> /* Clear the interrupt. */
> - out_le32(&(host_pvt.sata_dma_regs->interrupt_clear\
> + out_le32(&(sata_dma_regs->interrupt_clear\
\ not needed. () with & not needed. And the line is too short to break it
anyway.
> .error.low),
[...]
> @@ -629,14 +667,22 @@ static int map_sg_to_lli(struct scatterlist *sg, int num_elems,
> * Set DMA addresses and lower half of control register
> * based on direction.
> */
> + if (hsdevp->hsdev->hostID == APM_821XX_SATA) {
> + sms_val = 1+hsdevp->hsdev->dma_channel;
Spaces around + please.
> + dms_val = 0;
> + } else {
> + sms_val = 0;
> + dms_val = 1+hsdevp->hsdev->dma_channel;
Same here.
> @@ -714,70 +766,49 @@ static int map_sg_to_lli(struct scatterlist *sg, int num_elems,
> static void dma_dwc_xfer_start(int dma_ch)
> {
> /* Enable the DMA channel */
> - out_le32(&(host_pvt.sata_dma_regs->dma_chan_en.low),
> - in_le32(&(host_pvt.sata_dma_regs->dma_chan_en.low)) |
> + out_le32(&(sata_dma_regs->dma_chan_en.low),
> + in_le32(&(sata_dma_regs->dma_chan_en.low)) |
() with & not needed.
> DMA_ENABLE_CHAN(dma_ch));
> }
>
> -static int dma_dwc_xfer_setup(struct scatterlist *sg, int num_elems,
> - struct lli *lli, dma_addr_t dma_lli,
> - void __iomem *addr, int dir)
> +
Empty line not needed...
> +static int dma_dwc_xfer_setup(struct ata_port *ap, dma_addr_t dma_lli)
[...]
> - out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].cfg.high),
> + out_le32(&(sata_dma_regs->chan_regs[dma_ch].cfg.high),
() with & not needed.
> + DMA_CFG_HW_HS_SRC(dma_ch) | DMA_CFG_HW_HS_DEST(dma_ch) | \
> DMA_CFG_PROTCTL | DMA_CFG_FCMOD_REQ);
> - out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].cfg.low), 0);
> +
> + out_le32(&(sata_dma_regs->chan_regs[dma_ch].cfg.low),
() with & not needed.
> + DMA_CFG_HW_CH_PRIOR(dma_ch));
>
> /* Program the address of the linked list */
> - out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].llp.low),
> + if (hsdev->hostID == APM_460EX_SATA) {
> + out_le32(&(sata_dma_regs->chan_regs[dma_ch].llp.low),
() with & not needed.
> DMA_LLP_LMS(dma_lli, DMA_LLP_AHBMASTER2));
Please indent this like more to the right.
> + } else {
> + out_le32(&(sata_dma_regs->chan_regs[dma_ch].llp.low),
() with & not needed.
> + DMA_LLP_LMS(dma_lli, DMA_LLP_AHBMASTER1));
> + }
>
> /* Program the CTL register with src enable / dst enable */
> - out_le32(&(host_pvt.sata_dma_regs->chan_regs[dma_ch].ctl.low),
> + out_le32(&(sata_dma_regs->chan_regs[dma_ch].ctl.low),
() with & not needed.
> @@ -789,24 +820,18 @@ static int dma_dwc_init(struct sata_dwc_device *hsdev, int irq)
[...]
> /* Enabe DMA */
Enable.
> - out_le32(&(host_pvt.sata_dma_regs->dma_cfg.low), DMA_EN);
> + out_le32(&(sata_dma_regs->dma_cfg.low), DMA_EN);
() with & not needed.
> @@ -838,23 +863,27 @@ static int sata_dwc_scr_write(struct ata_link *link, unsigned int scr, u32 val)
> return 0;
> }
>
> -static u32 core_scr_read(unsigned int scr)
> +static u32 core_scr_read(struct ata_port *ap, unsigned int scr)
> {
> - return in_le32((void __iomem *)(host_pvt.scr_addr_sstatus) +\
> - (scr * 4));
> + struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
> +
> + return in_le32((void __iomem *)hsdev->scr_base + (scr * 4));
() around * not needed.
> }
>
> -static void core_scr_write(unsigned int scr, u32 val)
> +
> +static void core_scr_write(struct ata_port *ap, unsigned int scr, u32 val)
> {
> - out_le32((void __iomem *)(host_pvt.scr_addr_sstatus) + (scr * 4),
> - val);
> + struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
> +
> + out_le32((void __iomem *)hsdev->scr_base + (scr * 4), val);
Same here.
> @@ -869,7 +898,6 @@ static u32 qcmd_tag_to_mask(u8 tag)
> return 0x00000001<< (tag& 0x1f);
> }
>
> -/* See ahci.c */
Don't think this is a legal change in this patch...
> static void sata_dwc_error_intr(struct ata_port *ap,
> struct sata_dwc_device *hsdev, uint intpr)
> {
> @@ -883,24 +911,23 @@ static void sata_dwc_error_intr(struct ata_port *ap,
>
> ata_ehi_clear_desc(ehi);
>
> - serror = core_scr_read(SCR_ERROR);
> + serror = core_scr_read(ap, SCR_ERROR);
> status = ap->ops->sff_check_status(ap);
>
> - err_reg = in_le32(&(host_pvt.sata_dma_regs->interrupt_status.error.\
> + err_reg = in_le32(&(sata_dma_regs->interrupt_status.error.\
\ not needed. () with & not needed. And the line is too short to be broken.
> low));
> tag = ap->link.active_tag;
>
> dev_err(ap->dev, "%s SCR_ERROR=0x%08x intpr=0x%08x status=0x%08x "
> - "dma_intp=%d pending=%d issued=%d dma_err_status=0x%08x\n",
> - __func__, serror, intpr, status, host_pvt.dma_interrupt_count,
> - hsdevp->dma_pending[tag], hsdevp->cmd_issued[tag], err_reg);
> + " pending=%d dma_err_status=0x%08x\n",
Space not needed before "pending".
> @@ -930,14 +957,14 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
> struct sata_dwc_device *hsdev = HSDEV_FROM_HOST(host);
> struct ata_port *ap;
> struct ata_queued_cmd *qc;
> - unsigned long flags;
> u8 status, tag;
> - int handled, num_processed, port = 0;
> - uint intpr, sactive, sactive2, tag_mask;
> + int handled, port = 0;
> + int num_lli;
> + uint intpr, sactive, tag_mask;
> struct sata_dwc_device_port *hsdevp;
> - host_pvt.sata_dwc_sactive_issued = 0;
> + u32 mask;
>
> - spin_lock_irqsave(&host->lock, flags);
> + spin_lock(&host->lock);
Is this change related?
> + if (qc) {
> + hsdevp->sactive_issued |= mask;
> + /* Prevent to issue more commands */
> + qc->ap->link.active_tag = tag;
> + qc->dev->link->sactive |= (1 << qc->tag);
() not needed around <<.
> + num_lli = map_sg_to_lli(ap, qc->sg, qc->n_elem, \
> + hsdevp->llit[tag], hsdevp->llit_dma[tag], \
> + (void *__iomem)(&hsdev->sata_dwc_regs->dmadr), \
You don't need \ to break the lines in C, unless this is in macro definition.
> @@ -1012,28 +1051,12 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance)
> dev_dbg(ap->dev, "%s non-NCQ cmd interrupt, protocol: %s\n",
> __func__, get_prot_descript(qc->tf.protocol));
> DRVSTILLBUSY:
> + /* Do complete action for the current QC */
> if (ata_is_dma(qc->tf.protocol)) {
[...]
> + sata_dwc_qc_complete(ap, qc, 1);
> + } else if ((ata_is_pio(qc->tf.protocol)) ||
> + (ata_is_nodata(qc->tf.protocol))) {
() not needed around the operands of ||.
> @@ -1049,23 +1072,18 @@ DRVSTILLBUSY:
[...]
> - if ((tag_mask | (host_pvt.sata_dwc_sactive_issued)) != \
> - (host_pvt.sata_dwc_sactive_issued)) {
> + if ((tag_mask | hsdevp->sactive_issued) != \
> + hsdevp->sactive_issued) {
> dev_warn(ap->dev, "Bad tag mask? sactive=0x%08x "
> - "(host_pvt.sata_dwc_sactive_issued)=0x%08x tag_mask"
> - "=0x%08x\n", sactive, host_pvt.sata_dwc_sactive_issued,
> + "sactive_issued=0x%08x tag_mask"
There's no need to break the string literal here anymore.
> + "=0x%08x\n", sactive, hsdevp->sactive_issued,
> tag_mask);
> }
>
> @@ -1073,70 +1091,21 @@ DRVSTILLBUSY:
> status = ap->ops->sff_check_status(ap);
> dev_dbg(ap->dev, "%s ATA status register=0x%x\n", __func__, status);
>
> - tag = 0;
> - num_processed = 0;
> - while (tag_mask) {
> - num_processed++;
> - while (!(tag_mask& 0x00000001)) {
> - tag++;
> - tag_mask<<= 1;
> - }
> -
> - tag_mask&= (~0x00000001);
> - qc = ata_qc_from_tag(ap, tag);
> -
> - /* To be picked up by completion functions */
> - qc->ap->link.active_tag = tag;
> - hsdevp->cmd_issued[tag] = SATA_DWC_CMD_ISSUED_NOT;
> -
> - /* Let libata/scsi layers handle error */
> - if (status & ATA_ERR) {
> - dev_dbg(ap->dev, "%s ATA_ERR (0x%x)\n", __func__,
> - status);
> + for (tag = 0; tag< 32; tag++) {
> + if (tag_mask& qcmd_tag_to_mask(tag)) {
> + qc = ata_qc_from_tag(ap, tag);
> + if (!qc) {
> + dev_info(ap->dev, "error: Tag %d is set but " \
> + "not available\n", tag);
> + continue;
> + }
> sata_dwc_qc_complete(ap, qc, 1);
> - handled = 1;
> - goto DONE;
> }
> -
> - /* Process completed command */
> - dev_dbg(ap->dev, "%s NCQ command, protocol: %s\n", __func__,
> - get_prot_descript(qc->tf.protocol));
> - if (ata_is_dma(qc->tf.protocol)) {
> - host_pvt.dma_interrupt_count++;
> - if (hsdevp->dma_pending[tag] == \
> - SATA_DWC_DMA_PENDING_NONE)
> - dev_warn(ap->dev, "%s: DMA not pending?\n",
> - __func__);
> - if ((host_pvt.dma_interrupt_count % 2) == 0)
> - sata_dwc_dma_xfer_complete(ap, 1);
> - } else {
> - if (unlikely(sata_dwc_qc_complete(ap, qc, 1)))
> - goto STILLBUSY;
> - }
> - continue;
> -
> -STILLBUSY:
> - ap->stats.idle_irq++;
> - dev_warn(ap->dev, "STILL BUSY IRQ ata%d: irq trap\n",
> - ap->print_id);
> - } /* while tag_mask */
> -
> - /*
> - * Check to see if any commands completed while we were processing our
> - * initial set of completed commands (read status clears interrupts,
> - * so we might miss a completed command interrupt if one came in while
> - * we were processing --we read status as part of processing a completed
> - * command).
> - */
> - sactive2 = core_scr_read(SCR_ACTIVE);
> - if (sactive2 != sactive) {
> - dev_dbg(ap->dev, "More completed - sactive=0x%x sactive2"
> - "=0x%x\n", sactive, sactive2);
You're changing the algorithm of handling command here. Is it necessary to
support 2 ports?
> @@ -1167,44 +1136,6 @@ static void sata_dwc_clear_dmacr(struct sata_dwc_device_port *hsdevp, u8 tag)
> }
> }
>
> -static void sata_dwc_dma_xfer_complete(struct ata_port *ap, u32 check_status)
> -{
> - struct ata_queued_cmd *qc;
> - struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
> - struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
> - u8 tag = 0;
> -
> - tag = ap->link.active_tag;
> - qc = ata_qc_from_tag(ap, tag);
> - if (!qc) {
> - dev_err(ap->dev, "failed to get qc");
> - return;
> - }
> -
> -#ifdef DEBUG_NCQ
> - if (tag > 0) {
> - dev_info(ap->dev, "%s tag=%u cmd=0x%02x dma dir=%s proto=%s "
> - "dmacr=0x%08x\n", __func__, qc->tag, qc->tf.command,
> - get_dma_dir_descript(qc->dma_dir),
> - get_prot_descript(qc->tf.protocol),
> - in_le32(&(hsdev->sata_dwc_regs->dmacr)));
> - }
> -#endif
> -
> - if (ata_is_dma(qc->tf.protocol)) {
> - if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_NONE) {
> - dev_err(ap->dev, "%s DMA protocol RX and TX DMA not "
> - "pending dmacr: 0x%08x\n", __func__,
> - in_le32(&(hsdev->sata_dwc_regs->dmacr)));
> - }
> -
> - hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_NONE;
> - sata_dwc_qc_complete(ap, qc, check_status);
> - ap->link.active_tag = ATA_TAG_POISON;
> - } else {
> - sata_dwc_qc_complete(ap, qc, check_status);
> - }
> -}
Is this change related to dual port support?
> @@ -1213,24 +1144,39 @@ static int sata_dwc_qc_complete(struct ata_port *ap, struct ata_queued_cmd *qc,
> u32 mask = 0x0;
> u8 tag = qc->tag;
> struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
> - host_pvt.sata_dwc_sactive_queued = 0;
> + int i;
> +
> dev_dbg(ap->dev, "%s checkstatus? %x\n", __func__, check_status);
>
> - if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_TX)
> - dev_err(ap->dev, "TX DMA PENDING\n");
> - else if (hsdevp->dma_pending[tag] == SATA_DWC_DMA_PENDING_RX)
> - dev_err(ap->dev, "RX DMA PENDING\n");
> + /* Check main status, clearing INTRQ */
> + status = ap->ops->sff_check_status(ap);
> +
> + if (check_status) {
> + /* Make sure SATA port is not in BUSY state */
> + i = 0;
> + while (status & ATA_BUSY) {
> + if (++i > 10)
> + break;
> + status = ap->ops->sff_check_altstatus(ap);
> + };
> +
> + if (unlikely(status & ATA_BUSY))
> + dev_err(ap->dev, "QC complete cmd=0x%02x STATUS BUSY "
> + "(0x%02x) [%d]\n", qc->tf.command, status, i);
> + }
Is this related to dual port support?
> @@ -1437,28 +1377,37 @@ static void sata_dwc_bmdma_start_by_tag(struct ata_queued_cmd *qc, u8 tag)
> struct ata_port *ap = qc->ap;
> struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
> int dir = qc->dma_dir;
> - dma_chan = hsdevp->dma_chan[tag];
>
> - if (hsdevp->cmd_issued[tag] != SATA_DWC_CMD_ISSUED_NOT) {
> + /* Configure DMA before starting data transfer */
> + dma_chan = dma_dwc_xfer_setup(ap, hsdevp->llit_dma[tag]);
> + if (unlikely(dma_chan < 0)) {
> + dev_err(ap->dev, "%s: dma channel unavailable\n", __func__);
> + /* Offending this QC as no channel available for transfer */
> + qc->err_mask |= AC_ERR_TIMEOUT;
Hm, is this good error code?
> + return;
> + }
> +
> + /* Check if DMA should be started */
> + hsdevp->dma_chan[tag] = dma_chan;
> + if (hsdevp->sactive_queued & qcmd_tag_to_mask(tag)) {
> start_dma = 1;
> if (dir == DMA_TO_DEVICE)
> hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_TX;
> else
> hsdevp->dma_pending[tag] = SATA_DWC_DMA_PENDING_RX;
[...]
> @@ -1490,6 +1440,49 @@ static void sata_dwc_bmdma_start(struct ata_queued_cmd *qc)
> sata_dwc_bmdma_start_by_tag(qc, tag);
> }
>
> +static void sata_dwc_bmdma_stop(struct ata_queued_cmd *qc)
> +{
> + struct ata_port *ap = qc->ap;
> + struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
> + int dma_ch, enabled;
> +
> + dma_ch = hsdev->dma_channel;
> + enabled = sata_dwc_dma_chk_en(dma_ch);
> +
> + if (enabled) {
> + dev_dbg(ap->dev,
> + "%s terminate DMA on channel=%d (mask=0x%08x) ...",
> + __func__, dma_ch, DMA_DISABLE_CHAN(dma_ch));
> + /* Disable the selected channel */
> + out_le32(&(sata_dma_regs->dma_chan_en.low),
() with & not needed.
> + DMA_DISABLE_CHAN(dma_ch));
> +
> + /* Wait for the channel is disabled */
> + do {
> + enabled = sata_dwc_dma_chk_en(dma_ch);
> + ndelay(1000);
> + } while (enabled);
> + dev_dbg(ap->dev, "done\n");
> + }
> +}
> +
Wasn't this function necessary before dual port support?
> +static u8 sata_dwc_bmdma_status(struct ata_port *ap)
> +{
> + u32 status = 0;
> + u32 tfr_reg, err_reg;
> + struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
> +
> + /* Check DMA register for status */
> + tfr_reg = in_le32(&(sata_dma_regs->interrupt_status.tfr.low));
> + err_reg = in_le32(&(sata_dma_regs->interrupt_status.error.low));
> +
> + if (unlikely(err_reg & DMA_CHANNEL(hsdev->dma_channel)))
> + status = ATA_DMA_ERR;
> + else if (tfr_reg & DMA_CHANNEL(hsdev->dma_channel))
> + status = ATA_DMA_INTR;
> + return status;
> +}
> +
Is the above really related to dual port support? Wasn't it necessary before?
> @@ -1500,24 +1493,22 @@ static void sata_dwc_qc_prep_by_tag(struct ata_queued_cmd *qc, u8 tag)
> {
> struct scatterlist *sg = qc->sg;
> struct ata_port *ap = qc->ap;
> - int dma_chan;
> + int num_lli;
> struct sata_dwc_device *hsdev = HSDEV_FROM_AP(ap);
> struct sata_dwc_device_port *hsdevp = HSDEVP_FROM_AP(ap);
>
> + if ((qc->dma_dir == DMA_NONE) || (qc->tf.protocol == ATA_PROT_PIO))
() not neecessary around ==.
> + return;
Wasn't this check necessary before dual port support?
> dev_dbg(ap->dev, "%s: port=%d dma dir=%s n_elem=%d\n",
> __func__, ap->port_no, get_dma_dir_descript(qc->dma_dir),
> qc->n_elem);
>
> - dma_chan = dma_dwc_xfer_setup(sg, qc->n_elem, hsdevp->llit[tag],
> - hsdevp->llit_dma[tag],
> - (void *__iomem)(&hsdev->sata_dwc_regs->\
> - dmadr), qc->dma_dir);
> - if (dma_chan < 0) {
> - dev_err(ap->dev, "%s: dma_dwc_xfer_setup returns err %d\n",
> - __func__, dma_chan);
> - return;
> + if (!ata_is_ncq(qc->tf.protocol)) {
> + num_lli = map_sg_to_lli(qc->ap, sg, qc->n_elem,
> + hsdevp->llit[tag], hsdevp->llit_dma[tag],
> + (void *__iomem)(&hsdev->sata_dwc_regs->dmadr),
> + qc->dma_dir);
> }
And what if the protocol is NCQ?
> - hsdevp->dma_chan[tag] = dma_chan;
> }
>
> static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
> @@ -1541,19 +1532,18 @@ static unsigned int sata_dwc_qc_issue(struct ata_queued_cmd *qc)
> sata_dwc_qc_prep_by_tag(qc, tag);
>
> if (ata_is_ncq(qc->tf.protocol)) {
> - sactive = core_scr_read(SCR_ACTIVE);
> + /* Update SActive register for new command */
> + sactive = core_scr_read(qc->ap, SCR_ACTIVE);
> sactive |= (0x00000001<< tag);
BTW, () not needed here. You can also use BIT() macro.
> - core_scr_write(SCR_ACTIVE, sactive);
> -
> - dev_dbg(qc->ap->dev, "%s: tag=%d ap->link.sactive = 0x%08x "
> - "sactive=0x%08x\n", __func__, tag, qc->ap->link.sactive,
> - sactive);
> + core_scr_write(qc->ap, SCR_ACTIVE, sactive);
> + qc->dev->link->sactive |= 0x00000001<< tag;
>
> ap->ops->sff_tf_load(ap,&qc->tf);
> - sata_dwc_exec_command_by_tag(ap,&qc->tf, qc->tag,
> - SATA_DWC_CMD_ISSUED_PEND);
> + sata_dwc_exec_command_by_tag(ap, &qc->tf, qc->tag);
> } else {
> - ata_sff_qc_issue(qc);
> + /* As ata_sff_qc_issue is no longer handle DMA transfer,
> + * change to use ata_bmdma_qc_issue instead */
The preferred style of multi-line comments is this:
/*
* bla
* bla
*/
> + ata_bmdma_qc_issue(qc);
This is a bug fix, so should be in a prior patch.
> }
> return 0;
> }
> @@ -1582,7 +1572,12 @@ static void sata_dwc_qc_prep(struct ata_queued_cmd *qc)
> static void sata_dwc_error_handler(struct ata_port *ap)
> {
> ap->link.flags |= ATA_LFLAG_NO_HRST;
> - ata_sff_error_handler(ap);
> + ata_bmdma_error_handler(ap);
Same about this. I've already noted this on Friday.
> +}
> +
> +u8 sata_dwc_check_altstatus(struct ata_port *ap)
> +{
> + return ioread8(ap->ioaddr.altstatus_addr);
This is the same as the default implementation, why you need to redefine it?
> @@ -1638,13 +1637,38 @@ static int sata_dwc_probe(struct platform_device *ofdev)
> struct ata_host *host;
> struct ata_port_info pi = sata_dwc_port_info[0];
> const struct ata_port_info *ppi[] = {&pi, NULL };
> + const unsigned int *dma_chan;
> +
> + /* Check if device is declared in device tree */
> + if (!of_device_is_available(ofdev->dev.of_node)) {
> + printk(KERN_INFO "%s: Port disabled via device-tree\n",
> + ofdev->dev.of_node->full_name);
> + return 0;
> + }
This check is not related to dual port support I think.
>
> /* Allocate DWC SATA device */
> hsdev = kzalloc(sizeof(*hsdev), GFP_KERNEL);
Consider switching to the managed device interface (devm_kzalloc() and
friends).
> if (hsdev == NULL) {
> dev_err(&ofdev->dev, "kmalloc failed for hsdev\n");
> err = -ENOMEM;
> - goto error;
> + goto error_out_5;
> + }
[...]
> + dma_chan = of_get_property(ofdev->dev.of_node, "dma-channel", NULL);
I think you should use of_property_read_u32() instead.
> @@ -1653,7 +1677,7 @@ static int sata_dwc_probe(struct platform_device *ofdev)
> dev_err(&ofdev->dev, "ioremap failed for SATA register"
> " address\n");
> err = -ENODEV;
> - goto error_kmalloc;
> + goto error_out_4;
> }
> hsdev->reg_base = base;
> dev_dbg(&ofdev->dev, "ioremap done for SATA register address\n");
> @@ -1666,7 +1690,7 @@ static int sata_dwc_probe(struct platform_device *ofdev)
> if (!host) {
> dev_err(&ofdev->dev, "ata_host_alloc_pinfo failed\n");
> err = -ENOMEM;
> - goto error_iomap;
> + goto error_out_4;
Are you sure it's not 'error_out_3' at this point?
> @@ -1688,23 +1712,30 @@ static int sata_dwc_probe(struct platform_device *ofdev)
> if (irq == NO_IRQ) {
You should get rid of NO_IRQ.
> - /* Initialize AHB DMAC */
> - dma_dwc_init(hsdev, irq);
> + /* Init glovbal dev list */
s/glovbal/global/
WBR, Sergei
^ permalink raw reply
* [PATCH v2] KVM: PPC: Use clockevent multiplier and shifter for decrementer
From: Bharat Bhushan @ 2012-04-09 4:33 UTC (permalink / raw)
To: linuxppc-dev, kvm-ppc, kvm; +Cc: Bharat Bhushan
Time for which the hrtimer is started for decrementer emulation is calculated using tb_ticks_per_usec. While hrtimer uses the clockevent for DEC reprogramming (if needed) and which calculate timebase ticks using the multiplier and shifter mechanism implemented within clockevent layer. It was observed that this conversion (timebase->time->timebase) are not correct because the mechanism are not consistent. In our setup it adds 2% jitter.
With this patch clockevent multiplier and shifter mechanism are used when starting hrtimer for decrementer emulation. Now the jitter is < 0.5%.
Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com>
---
v2:
- decrementer_clockevent is made non-static rather than a seprate API to get mult/shift
arch/powerpc/include/asm/time.h | 1 +
arch/powerpc/kernel/time.c | 2 +-
arch/powerpc/kvm/emulate.c | 5 +++--
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h
index 7eb10fb..b3c7959 100644
--- a/arch/powerpc/include/asm/time.h
+++ b/arch/powerpc/include/asm/time.h
@@ -28,6 +28,7 @@
extern unsigned long tb_ticks_per_jiffy;
extern unsigned long tb_ticks_per_usec;
extern unsigned long tb_ticks_per_sec;
+extern struct clock_event_device decrementer_clockevent;
struct rtc_time;
extern void to_tm(int tim, struct rtc_time * tm);
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 567dd7c..e237225 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -105,7 +105,7 @@ static int decrementer_set_next_event(unsigned long evt,
static void decrementer_set_mode(enum clock_event_mode mode,
struct clock_event_device *dev);
-static struct clock_event_device decrementer_clockevent = {
+struct clock_event_device decrementer_clockevent = {
.name = "decrementer",
.rating = 200,
.irq = 0,
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
index afc9154..c8b5206 100644
--- a/arch/powerpc/kvm/emulate.c
+++ b/arch/powerpc/kvm/emulate.c
@@ -23,6 +23,7 @@
#include <linux/types.h>
#include <linux/string.h>
#include <linux/kvm_host.h>
+#include <linux/clockchips.h>
#include <asm/reg.h>
#include <asm/time.h>
@@ -104,8 +105,8 @@ void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
*/
dec_time = vcpu->arch.dec;
- dec_time *= 1000;
- do_div(dec_time, tb_ticks_per_usec);
+ dec_time = dec_time << decrementer_clockevent.shift;
+ do_div(dec_time, decrementer_clockevent.mult);
dec_nsec = do_div(dec_time, NSEC_PER_SEC);
hrtimer_start(&vcpu->arch.dec_timer,
ktime_set(dec_time, dec_nsec), HRTIMER_MODE_REL);
--
1.7.0.4
^ permalink raw reply related
* Re: [PATCH 1/2] [v4] powerpc/44x: Fix PCI MSI support for Maui APM821xx SoC and Bluestone board
From: Mai La @ 2012-04-09 4:23 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Josh Boyer, Matt Porter,
Tirumala R Marri, Grant Likely, Michael Neuling, Kumar Gala,
Anton Blanchard, linuxppc-dev, linux-kernel
In-Reply-To: <1332129548-20379-1-git-send-email-mla@apm.com>
[-- Attachment #1: Type: text/plain, Size: 6558 bytes --]
Do you have any further comment for this patch?
On Mon, Mar 19, 2012 at 10:59 AM, Mai La <mla@apm.com> wrote:
> This patch consists of:
> - Enable PCI MSI as default for Bluestone board
> - Change definition of number of MSI interrupts as it depends on SoC
> - Fix returning ENODEV as finding MSI node
> - Fix MSI physical high and low address
> - Keep MSI data logically
>
> Signed-off-by: Mai La <mla@apm.com>
>
> ---
> v4:
> Per Josh Boyer's comment:
> * Declare msi_irqs as static
> * Handle error if allocation of MSI vitual interrupts fails
> * Return ENODEV if counting MSI interrupts fails
> v3:
> * Use upper_32_bits() / lower_32_bits() consistently as Wolfgang Denk
> recomments
> v2:
> * Change definition of number of MSI interrupt from config to count
> interrupts in device tree
>
> ---
> arch/powerpc/platforms/44x/Kconfig | 2 +
> arch/powerpc/sysdev/ppc4xx_msi.c | 42
> ++++++++++++++++++++++++------------
> 2 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/arch/powerpc/platforms/44x/Kconfig
> b/arch/powerpc/platforms/44x/Kconfig
> index fcf6bf2..9f04ce3 100644
> --- a/arch/powerpc/platforms/44x/Kconfig
> +++ b/arch/powerpc/platforms/44x/Kconfig
> @@ -23,6 +23,8 @@ config BLUESTONE
> default n
> select PPC44x_SIMPLE
> select APM821xx
> + select PCI_MSI
> + select PPC4xx_MSI
> select IBM_EMAC_RGMII
> help
> This option enables support for the APM APM821xx Evaluation board.
> diff --git a/arch/powerpc/sysdev/ppc4xx_msi.c
> b/arch/powerpc/sysdev/ppc4xx_msi.c
> index 1c2d7af..cc17f59 100644
> --- a/arch/powerpc/sysdev/ppc4xx_msi.c
> +++ b/arch/powerpc/sysdev/ppc4xx_msi.c
> @@ -28,10 +28,11 @@
> #include <linux/of_platform.h>
> #include <linux/interrupt.h>
> #include <linux/export.h>
> +#include <linux/kernel.h>
> #include <asm/prom.h>
> #include <asm/hw_irq.h>
> #include <asm/ppc-pci.h>
> -#include <boot/dcr.h>
> +#include <asm/dcr.h>
> #include <asm/dcr-regs.h>
> #include <asm/msi_bitmap.h>
>
> @@ -43,13 +44,14 @@
> #define PEIH_FLUSH0 0x30
> #define PEIH_FLUSH1 0x38
> #define PEIH_CNTRST 0x48
> -#define NR_MSI_IRQS 4
> +
> +static int msi_irqs;
>
> struct ppc4xx_msi {
> u32 msi_addr_lo;
> u32 msi_addr_hi;
> void __iomem *msi_regs;
> - int msi_virqs[NR_MSI_IRQS];
> + int *msi_virqs;
> struct msi_bitmap bitmap;
> struct device_node *msi_dev;
> };
> @@ -61,7 +63,7 @@ static int ppc4xx_msi_init_allocator(struct
> platform_device *dev,
> {
> int err;
>
> - err = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS,
> + err = msi_bitmap_alloc(&msi_data->bitmap, msi_irqs,
> dev->dev.of_node);
> if (err)
> return err;
> @@ -83,6 +85,11 @@ static int ppc4xx_setup_msi_irqs(struct pci_dev *dev,
> int nvec, int type)
> struct msi_desc *entry;
> struct ppc4xx_msi *msi_data = &ppc4xx_msi;
>
> + msi_data->msi_virqs = kmalloc((msi_irqs) * sizeof(int),
> + GFP_KERNEL);
> + if (!msi_data->msi_virqs)
> + return -ENOMEM;
> +
> list_for_each_entry(entry, &dev->msi_list, list) {
> int_no = msi_bitmap_alloc_hwirqs(&msi_data->bitmap, 1);
> if (int_no >= 0)
> @@ -150,12 +157,11 @@ static int ppc4xx_setup_pcieh_hw(struct
> platform_device *dev,
> if (!sdr_addr)
> return -1;
>
> - SDR0_WRITE(sdr_addr, (u64)res.start >> 32); /*HIGH addr */
> - SDR0_WRITE(sdr_addr + 1, res.start & 0xFFFFFFFF); /* Low addr */
> -
> + mtdcri(SDR0, *sdr_addr, upper_32_bits(res.start)); /*HIGH
> addr */
> + mtdcri(SDR0, *sdr_addr + 1, lower_32_bits(res.start)); /* Low
> addr */
>
> msi->msi_dev = of_find_node_by_name(NULL, "ppc4xx-msi");
> - if (msi->msi_dev)
> + if (!msi->msi_dev)
> return -ENODEV;
>
> msi->msi_regs = of_iomap(msi->msi_dev, 0);
> @@ -167,9 +173,12 @@ static int ppc4xx_setup_pcieh_hw(struct
> platform_device *dev,
> (u32) (msi->msi_regs + PEIH_TERMADH), (u32)
> (msi->msi_regs));
>
> msi_virt = dma_alloc_coherent(&dev->dev, 64, &msi_phys, GFP_KERNEL);
> - msi->msi_addr_hi = 0x0;
> - msi->msi_addr_lo = (u32) msi_phys;
> - dev_dbg(&dev->dev, "PCIE-MSI: msi address 0x%x\n",
> msi->msi_addr_lo);
> + if (!msi_virt)
> + return -ENOMEM;
> + msi->msi_addr_hi = (u32)(msi_phys >> 32);
> + msi->msi_addr_lo = (u32)(msi_phys & 0xffffffff);
> + dev_dbg(&dev->dev, "PCIE-MSI: msi address high 0x%x, low 0x%x\n",
> + msi->msi_addr_hi, msi->msi_addr_lo);
>
> /* Progam the Interrupt handler Termination addr registers */
> out_be32(msi->msi_regs + PEIH_TERMADH, msi->msi_addr_hi);
> @@ -185,6 +194,8 @@ static int ppc4xx_setup_pcieh_hw(struct
> platform_device *dev,
> out_be32(msi->msi_regs + PEIH_MSIED, *msi_data);
> out_be32(msi->msi_regs + PEIH_MSIMK, *msi_mask);
>
> + dma_free_coherent(&dev->dev, 64, msi_virt, msi_phys);
> +
> return 0;
> }
>
> @@ -194,7 +205,7 @@ static int ppc4xx_of_msi_remove(struct platform_device
> *dev)
> int i;
> int virq;
>
> - for (i = 0; i < NR_MSI_IRQS; i++) {
> + for (i = 0; i < msi_irqs; i++) {
> virq = msi->msi_virqs[i];
> if (virq != NO_IRQ)
> irq_dispose_mapping(virq);
> @@ -215,8 +226,6 @@ static int __devinit ppc4xx_msi_probe(struct
> platform_device *dev)
> struct resource res;
> int err = 0;
>
> - msi = &ppc4xx_msi;/*keep the msi data for further use*/
> -
> dev_dbg(&dev->dev, "PCIE-MSI: Setting up MSI support...\n");
>
> msi = kzalloc(sizeof(struct ppc4xx_msi), GFP_KERNEL);
> @@ -234,6 +243,10 @@ static int __devinit ppc4xx_msi_probe(struct
> platform_device *dev)
> goto error_out;
> }
>
> + msi_irqs = of_irq_count(dev->dev.of_node);
> + if (!msi_irqs)
> + return -ENODEV;
> +
> if (ppc4xx_setup_pcieh_hw(dev, res, msi))
> goto error_out;
>
> @@ -242,6 +255,7 @@ static int __devinit ppc4xx_msi_probe(struct
> platform_device *dev)
> dev_err(&dev->dev, "Error allocating MSI bitmap\n");
> goto error_out;
> }
> + ppc4xx_msi = *msi;
>
> ppc_md.setup_msi_irqs = ppc4xx_setup_msi_irqs;
> ppc_md.teardown_msi_irqs = ppc4xx_teardown_msi_irqs;
> --
> 1.7.3.4
>
>
[-- Attachment #2: Type: text/html, Size: 7755 bytes --]
^ permalink raw reply
* Re: [PATCH 2/2] powerpc/44x: Add PCI MSI node for APM821xx SoC and Bluestone board in DTS
From: Mai La @ 2012-04-09 4:27 UTC (permalink / raw)
To: Benjamin Herrenschmidt, Paul Mackerras, Josh Boyer, Matt Porter,
Tirumala R Marri, Grant Likely, Michael Neuling, Kumar Gala,
Anton Blanchard, linuxppc-dev, linux-kernel
In-Reply-To: <1330505263-3718-1-git-send-email-mla@apm.com>
[-- Attachment #1: Type: text/plain, Size: 1904 bytes --]
This patch is along with patch [1/2, v4] powerpc/44x: Fix PCI MSI support
for Maui APM821xx SoC and Bluestone board. Do you have any comment for this
patch?
Thank you!
On Wed, Feb 29, 2012 at 3:47 PM, Mai La <mla@apm.com> wrote:
>
> Signed-off-by: Mai La <mla@apm.com>
> ---
> arch/powerpc/boot/dts/bluestone.dts | 24 ++++++++++++++++++++++++
> 1 files changed, 24 insertions(+), 0 deletions(-)
>
> diff --git a/arch/powerpc/boot/dts/bluestone.dts
> b/arch/powerpc/boot/dts/bluestone.dts
> index 2a56a0d..8ea6325 100644
> --- a/arch/powerpc/boot/dts/bluestone.dts
> +++ b/arch/powerpc/boot/dts/bluestone.dts
> @@ -250,5 +250,29 @@
> };
> };
>
> + MSI: ppc4xx-msi@C10000000 {
> + compatible = "amcc,ppc4xx-msi", "ppc4xx-msi";
> + reg = < 0xC 0x10000000 0x100
> + 0xC 0x10000000 0x100>;
> + sdr-base = <0x36C>;
> + msi-data = <0x00004440>;
> + msi-mask = <0x0000ffe0>;
> + interrupts =<0 1 2 3 4 5 6 7>;
> + interrupt-parent = <&MSI>;
> + #interrupt-cells = <1>;
> + #address-cells = <0>;
> + #size-cells = <0>;
> + msi-available-ranges = <0x0 0x100>;
> + interrupt-map = <
> + 0 &UIC3 0x18 1
> + 1 &UIC3 0x19 1
> + 2 &UIC3 0x1A 1
> + 3 &UIC3 0x1B 1
> + 4 &UIC3 0x1C 1
> + 5 &UIC3 0x1D 1
> + 6 &UIC3 0x1E 1
> + 7 &UIC3 0x1F 1
> + >;
> + };
> };
> };
> --
> 1.7.3.4
>
>
[-- Attachment #2: Type: text/html, Size: 2505 bytes --]
^ permalink raw reply
* [PATCH] driver/mtd: IFC NAND: Add support of ONFI NAND flash
From: Prabhakar Kushwaha @ 2012-04-09 5:25 UTC (permalink / raw)
To: linuxppc-dev, linux-mtd; +Cc: scottwood, Prabhakar Kushwaha, dedekind1
- Fix NAND_CMD_READID command for ONFI detect.
- Add NAND_CMD_PARAM command to read the ONFI parameter page.
Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com>
Acked-by: Scott Wood <scottwood@freescale.com>
---
Based upon git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Branch master
drivers/mtd/nand/fsl_ifc_nand.c | 22 ++++++++++++++++------
1 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
index c30ac7b..4e7f31e 100644
--- a/drivers/mtd/nand/fsl_ifc_nand.c
+++ b/drivers/mtd/nand/fsl_ifc_nand.c
@@ -375,21 +375,31 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
return;
- /* READID must read all 8 possible bytes */
case NAND_CMD_READID:
+ case NAND_CMD_PARAM: {
+ int timing = IFC_FIR_OP_RB;
+ if (command == NAND_CMD_PARAM)
+ timing = IFC_FIR_OP_RBCD;
+
out_be32(&ifc->ifc_nand.nand_fir0,
(IFC_FIR_OP_CMD0 << IFC_NAND_FIR0_OP0_SHIFT) |
(IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
- (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT));
+ (timing << IFC_NAND_FIR0_OP2_SHIFT));
out_be32(&ifc->ifc_nand.nand_fcr0,
- NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT);
- /* 8 bytes for manuf, device and exts */
- out_be32(&ifc->ifc_nand.nand_fbcr, 8);
- ifc_nand_ctrl->read_bytes = 8;
+ command << IFC_NAND_FCR0_CMD0_SHIFT);
+ out_be32(&ifc->ifc_nand.row3, column);
+
+ /*
+ * although currently it's 8 bytes for READID, we always read
+ * the maximum 256 bytes(for PARAM)
+ */
+ out_be32(&ifc->ifc_nand.nand_fbcr, 256);
+ ifc_nand_ctrl->read_bytes = 256;
set_addr(mtd, 0, 0, 0);
fsl_ifc_run_command(mtd);
return;
+ }
/* ERASE1 stores the block and page address */
case NAND_CMD_ERASE1:
--
1.7.5.4
^ permalink raw reply related
* [V2 1/5] powerpc: dts: klondike: Add AHB, APB bus; remove OPB bus
From: Tanmay Inamdar @ 2012-04-09 7:20 UTC (permalink / raw)
To: benh, jwboyer, grant.likely, linuxppc-dev, linux-kernel,
devicetree-discuss
Cc: Tanmay Inamdar
Add entries in klondike device tree for AHB and APB bus and remove entry for
non-existent OPB bus inherited from legacy code.
Signed-off-by: Tanmay Inamdar <tinamdar@apm.com>
---
:100644 100644 8c94290... 4ff2852... M arch/powerpc/boot/dts/klondike.dts
arch/powerpc/boot/dts/klondike.dts | 167 ++++++++++++++++++-----------------
1 files changed, 86 insertions(+), 81 deletions(-)
diff --git a/arch/powerpc/boot/dts/klondike.dts b/arch/powerpc/boot/dts/klondike.dts
index 8c94290..4ff2852 100644
--- a/arch/powerpc/boot/dts/klondike.dts
+++ b/arch/powerpc/boot/dts/klondike.dts
@@ -132,96 +132,101 @@
/*RXDE*/ 0x3 0x4>;
};
- POB0: opb {
- compatible = "ibm,opb";
- #address-cells = <1>;
- #size-cells = <1>;
- ranges = <0x20000000 0x20000000 0x30000000
- 0x50000000 0x50000000 0x10000000
- 0x60000000 0x60000000 0x10000000
- 0xFE000000 0xFE000000 0x00010000>;
- dcr-reg = <0x100 0x020>;
- clock-frequency = <300000000>; /* Filled in by U-Boot */
+ RGMII0: emac-rgmii@400a2000 {
+ compatible = "ibm,rgmii";
+ reg = <0x400a2000 0x00000010>;
+ has-mdio;
+ };
- RGMII0: emac-rgmii@400a2000 {
- compatible = "ibm,rgmii";
- reg = <0x400a2000 0x00000010>;
- has-mdio;
- };
+ TAH0: emac-tah@400a3000 {
+ compatible = "ibm,tah";
+ reg = <0x400a3000 0x100>;
+ };
- TAH0: emac-tah@400a3000 {
- compatible = "ibm,tah";
- reg = <0x400a3000 0x100>;
- };
+ TAH1: emac-tah@400a4000 {
+ compatible = "ibm,tah";
+ reg = <0x400a4000 0x100>;
+ };
- TAH1: emac-tah@400a4000 {
- compatible = "ibm,tah";
- reg = <0x400a4000 0x100>;
- };
+ EMAC0: ethernet@400a0000 {
+ compatible = "ibm,emac4", "ibm-emac4sync";
+ interrupt-parent = <&EMAC0>;
+ interrupts = <0x0>;
+ #interrupt-cells = <1>;
+ #address-cells = <0>;
+ #size-cells = <0>;
+ interrupt-map = </*Status*/ 0x0 &UIC0 0x13 0x4>;
+ reg = <0x400a0000 0x00000100>;
+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
+ mal-device = <&MAL0>;
+ mal-tx-channel = <0x0>;
+ mal-rx-channel = <0x0>;
+ cell-index = <0>;
+ max-frame-size = <9000>;
+ rx-fifo-size = <4096>;
+ tx-fifo-size = <2048>;
+ phy-mode = "rgmii";
+ phy-address = <0x2>;
+ turbo = "no";
+ phy-map = <0x00000000>;
+ rgmii-device = <&RGMII0>;
+ rgmii-channel = <0>;
+ tah-device = <&TAH0>;
+ tah-channel = <0>;
+ has-inverted-stacr-oc;
+ has-new-stacr-staopc;
+ };
- EMAC0: ethernet@400a0000 {
- compatible = "ibm,emac4", "ibm-emac4sync";
- interrupt-parent = <&EMAC0>;
- interrupts = <0x0>;
- #interrupt-cells = <1>;
- #address-cells = <0>;
- #size-cells = <0>;
- interrupt-map = </*Status*/ 0x0 &UIC0 0x13 0x4>;
- reg = <0x400a0000 0x00000100>;
- local-mac-address = [000000000000]; /* Filled in by U-Boot */
- mal-device = <&MAL0>;
- mal-tx-channel = <0x0>;
- mal-rx-channel = <0x0>;
- cell-index = <0>;
- max-frame-size = <9000>;
- rx-fifo-size = <4096>;
- tx-fifo-size = <2048>;
- phy-mode = "rgmii";
- phy-address = <0x2>;
- turbo = "no";
- phy-map = <0x00000000>;
- rgmii-device = <&RGMII0>;
- rgmii-channel = <0>;
- tah-device = <&TAH0>;
- tah-channel = <0>;
- has-inverted-stacr-oc;
- has-new-stacr-staopc;
- };
+ EMAC1: ethernet@400a1000 {
+ compatible = "ibm,emac4", "ibm-emac4sync";
+ status = "disabled";
+ interrupt-parent = <&EMAC1>;
+ interrupts = <0x0>;
+ #interrupt-cells = <1>;
+ #address-cells = <0>;
+ #size-cells = <0>;
+ interrupt-map = </*Status*/ 0x0 &UIC0 0x14 0x4>;
+ reg = <0x400a1000 0x00000100>;
+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
+ mal-device = <&MAL0>;
+ mal-tx-channel = <1>;
+ mal-rx-channel = <8>;
+ cell-index = <1>;
+ max-frame-size = <9000>;
+ rx-fifo-size = <4096>;
+ tx-fifo-size = <2048>;
+ phy-mode = "rgmii";
+ phy-address = <0x3>;
+ turbo = "no";
+ phy-map = <0x00000000>;
+ rgmii-device = <&RGMII0>;
+ rgmii-channel = <1>;
+ tah-device = <&TAH1>;
+ tah-channel = <0>;
+ has-inverted-stacr-oc;
+ has-new-stacr-staopc;
+ mdio-device = <&EMAC0>;
+ };
- EMAC1: ethernet@400a1000 {
- compatible = "ibm,emac4", "ibm-emac4sync";
- status = "disabled";
- interrupt-parent = <&EMAC1>;
- interrupts = <0x0>;
- #interrupt-cells = <1>;
- #address-cells = <0>;
- #size-cells = <0>;
- interrupt-map = </*Status*/ 0x0 &UIC0 0x14 0x4>;
- reg = <0x400a1000 0x00000100>;
- local-mac-address = [000000000000]; /* Filled in by U-Boot */
- mal-device = <&MAL0>;
- mal-tx-channel = <1>;
- mal-rx-channel = <8>;
- cell-index = <1>;
- max-frame-size = <9000>;
- rx-fifo-size = <4096>;
- tx-fifo-size = <2048>;
- phy-mode = "rgmii";
- phy-address = <0x3>;
- turbo = "no";
- phy-map = <0x00000000>;
- rgmii-device = <&RGMII0>;
- rgmii-channel = <1>;
- tah-device = <&TAH1>;
- tah-channel = <0>;
- has-inverted-stacr-oc;
- has-new-stacr-staopc;
- mdio-device = <&EMAC0>;
+ AHB: ahb {
+ compatible = "apm,ahb";
+ dcr-reg = <0xc 0x2>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+ clock-frequency = <0>; /* Filled in by U-Boot */
+
+ APB: apb {
+ compatible = "apm,apb";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+ clock-frequency = <0>;
};
};
};
chosen {
- linux,stdout-path = "/plb/opb/serial@50001000";
+ linux,stdout-path = "/plb/ahb/apb/serial@50001000";
};
};
--
1.6.1.rc3
^ permalink raw reply related
* [V2 2/5] powerpc: 40x: Add AHB, APB of_device_ids
From: Tanmay Inamdar @ 2012-04-09 7:20 UTC (permalink / raw)
To: benh, jwboyer, grant.likely, linuxppc-dev, linux-kernel,
devicetree-discuss
Cc: Tanmay Inamdar
In-Reply-To: <1333956052-25319-1-git-send-email-tinamdar@apm.com>
Adding of_device_id's for AHB and APB buses used in klondike (APM8018X) in
platforms/40x/ppc40x_simple.c file
Signed-off-by: Tanmay Inamdar <tinamdar@apm.com>
---
:100644 100644 9761206... 7b518ed... M arch/powerpc/platforms/40x/ppc40x_simple.c
arch/powerpc/platforms/40x/ppc40x_simple.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c
index 9761206..7b518ed 100644
--- a/arch/powerpc/platforms/40x/ppc40x_simple.c
+++ b/arch/powerpc/platforms/40x/ppc40x_simple.c
@@ -29,6 +29,8 @@ static __initdata struct of_device_id ppc40x_of_bus[] = {
{ .compatible = "ibm,plb4", },
{ .compatible = "ibm,opb", },
{ .compatible = "ibm,ebc", },
+ { .compatible = "apm,ahb", },
+ { .compatible = "apm,apb", },
{ .compatible = "simple-bus", },
{},
};
--
1.6.1.rc3
^ permalink raw reply related
* [V2 3/5] powerpc: dts: klondike: Add UART nodes
From: Tanmay Inamdar @ 2012-04-09 7:20 UTC (permalink / raw)
To: benh, jwboyer, grant.likely, linuxppc-dev, linux-kernel,
devicetree-discuss
Cc: Tanmay Inamdar
In-Reply-To: <1333956052-25319-2-git-send-email-tinamdar@apm.com>
Adding UART nodes in Klondike device tree file.
Version 2:
Removed unnecessary 'virtual-reg' property from UART node.
Signed-off-by: Tanmay Inamdar <tinamdar@apm.com>
---
:100644 100644 4ff2852... b1e516e... M arch/powerpc/boot/dts/klondike.dts
arch/powerpc/boot/dts/klondike.dts | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/boot/dts/klondike.dts b/arch/powerpc/boot/dts/klondike.dts
index 4ff2852..b1e516e 100644
--- a/arch/powerpc/boot/dts/klondike.dts
+++ b/arch/powerpc/boot/dts/klondike.dts
@@ -222,6 +222,28 @@
#size-cells = <1>;
ranges;
clock-frequency = <0>;
+
+ UART0: serial@50001000 {
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <0x50001000 0x00000100>;
+ clock-frequency = <0>; /* Filled in by U-Boot */
+ current-speed = <115200>;
+ interrupt-parent = <&UIC0>;
+ interrupts = <0x0 0x4>;
+ reg-shift = <2>;
+ };
+
+ UART1: serial@50002000 {
+ device_type = "serial";
+ compatible = "ns16550";
+ reg = <0x50002000 0x00000100>;
+ clock-frequency = <0>; /* Filled in by U-Boot */
+ current-speed = <115200>;
+ interrupt-parent = <&UIC0>;
+ interrupts = <0x1 0x4>;
+ reg-shift = <2>;
+ };
};
};
};
--
1.6.1.rc3
^ permalink raw reply related
* [V2 4/5] powerpc: config: 40x: Add 16650 UART support in klondike defconfig
From: Tanmay Inamdar @ 2012-04-09 7:20 UTC (permalink / raw)
To: benh, jwboyer, grant.likely, linuxppc-dev, linux-kernel,
devicetree-discuss
Cc: Tanmay Inamdar
In-Reply-To: <1333956052-25319-3-git-send-email-tinamdar@apm.com>
Adding 16650 UART support in klondike_defconfig for APM8018X SOC
Signed-off-by: Tanmay Inamdar <tinamdar@apm.com>
---
:100644 100644 c0d228d... c35c345... M arch/powerpc/configs/40x/klondike_defconfig
arch/powerpc/configs/40x/klondike_defconfig | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/configs/40x/klondike_defconfig b/arch/powerpc/configs/40x/klondike_defconfig
index c0d228d..c35c345 100644
--- a/arch/powerpc/configs/40x/klondike_defconfig
+++ b/arch/powerpc/configs/40x/klondike_defconfig
@@ -30,6 +30,12 @@ CONFIG_SCSI_SAS_ATTRS=y
# CONFIG_UNIX98_PTYS is not set
# CONFIG_LEGACY_PTYS is not set
# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_OF_PLATFORM=y
# CONFIG_HW_RANDOM is not set
# CONFIG_HWMON is not set
# CONFIG_USB_SUPPORT is not set
--
1.6.1.rc3
^ permalink raw reply related
* [V2 5/5] powerpc: kernel: 16650 UART reg-shift support
From: Tanmay Inamdar @ 2012-04-09 7:20 UTC (permalink / raw)
To: benh, jwboyer, grant.likely, linuxppc-dev, linux-kernel,
devicetree-discuss
Cc: Tanmay Inamdar
In-Reply-To: <1333956052-25319-4-git-send-email-tinamdar@apm.com>
In APM8018X SOC, UART register address space has been relocated to 32-bit
data boundaries for APB bus implementation.
Current legacy_serial driver ignores the reg-shift property. This patch
modifies legacy_serial.c and udbg_16550.c to work with above mentioned UARTs.
Signed-off-by: Tanmay Inamdar <tinamdar@apm.com>
---
:100644 100644 8338aef... f5fc106... M arch/powerpc/include/asm/udbg.h
:100644 100644 bedd12e... d523b7d... M arch/powerpc/kernel/legacy_serial.c
:100644 100644 6837f83... e0cb7dc... M arch/powerpc/kernel/udbg_16550.c
arch/powerpc/include/asm/udbg.h | 2 +-
arch/powerpc/kernel/legacy_serial.c | 16 +++++---
arch/powerpc/kernel/udbg_16550.c | 64 ++++++++++++++++++++++------------
3 files changed, 52 insertions(+), 30 deletions(-)
diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h
index 8338aef..f5fc106 100644
--- a/arch/powerpc/include/asm/udbg.h
+++ b/arch/powerpc/include/asm/udbg.h
@@ -29,7 +29,7 @@ extern void udbg_printf(const char *fmt, ...)
extern void udbg_progress(char *s, unsigned short hex);
extern void udbg_init_uart(void __iomem *comport, unsigned int speed,
- unsigned int clock);
+ unsigned int clock, unsigned int regshift);
extern unsigned int udbg_probe_uart_speed(void __iomem *comport,
unsigned int clock);
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c
index bedd12e..d523b7d 100644
--- a/arch/powerpc/kernel/legacy_serial.c
+++ b/arch/powerpc/kernel/legacy_serial.c
@@ -33,6 +33,7 @@ static struct legacy_serial_info {
unsigned int clock;
int irq_check_parent;
phys_addr_t taddr;
+ unsigned int regshift;
} legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS];
static struct __initdata of_device_id legacy_serial_parents[] = {
@@ -42,6 +43,7 @@ static struct __initdata of_device_id legacy_serial_parents[] = {
{.compatible = "ibm,opb",},
{.compatible = "simple-bus",},
{.compatible = "wrs,epld-localbus",},
+ {.compatible = "apm,apb",},
{},
};
@@ -163,11 +165,6 @@ static int __init add_legacy_soc_port(struct device_node *np,
if (of_get_property(np, "clock-frequency", NULL) == NULL)
return -1;
- /* if reg-shift or offset, don't try to use it */
- if ((of_get_property(np, "reg-shift", NULL) != NULL) ||
- (of_get_property(np, "reg-offset", NULL) != NULL))
- return -1;
-
/* if rtas uses this device, don't try to use it as well */
if (of_get_property(np, "used-by-rtas", NULL) != NULL)
return -1;
@@ -319,7 +316,7 @@ static void __init setup_legacy_serial_console(int console)
if (info->speed == 0)
info->speed = udbg_probe_uart_speed(addr, info->clock);
DBG("default console speed = %d\n", info->speed);
- udbg_init_uart(addr, info->speed, info->clock);
+ udbg_init_uart(addr, info->speed, info->clock, info->regshift);
}
/*
@@ -336,6 +333,7 @@ void __init find_legacy_serial_ports(void)
struct device_node *np, *stdout = NULL;
const char *path;
int index;
+ unsigned int regshift;
DBG(" -> find_legacy_serial_port()\n");
@@ -359,6 +357,12 @@ void __init find_legacy_serial_ports(void)
index = add_legacy_soc_port(np, np);
if (index >= 0 && np == stdout)
legacy_serial_console = index;
+ if (of_property_read_u32(np, "reg-shift",
+ ®shift) == 0) {
+ legacy_serial_infos
+ [legacy_serial_console].regshift =
+ regshift;
+ }
}
}
of_node_put(parent);
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c
index 6837f83..e0cb7dc 100644
--- a/arch/powerpc/kernel/udbg_16550.c
+++ b/arch/powerpc/kernel/udbg_16550.c
@@ -47,12 +47,29 @@ struct NS16550 {
#define LCR_DLAB 0x80
+static unsigned int reg_shift;
+#define ns16550_offset(addr) (addr - (unsigned char *)udbg_comport)
+
static struct NS16550 __iomem *udbg_comport;
+static inline u8 serial_read(unsigned char *addr)
+{
+ u32 offset = ns16550_offset(addr) << reg_shift;
+ return readb(udbg_comport + offset);
+}
+
+static inline void serial_write(unsigned char *addr, char val)
+{
+ u32 offset = ns16550_offset(addr) << reg_shift;
+ writeb(val, udbg_comport + offset);
+}
+
static void udbg_550_flush(void)
{
+ u32 timeout = 1000;
if (udbg_comport) {
- while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0)
+ while (((serial_read(&udbg_comport->lsr) & LSR_THRE) == 0)
+ && --timeout)
/* wait for idle */;
}
}
@@ -63,15 +80,15 @@ static void udbg_550_putc(char c)
if (c == '\n')
udbg_550_putc('\r');
udbg_550_flush();
- out_8(&udbg_comport->thr, c);
+ serial_write(&udbg_comport->thr, c);
}
}
static int udbg_550_getc_poll(void)
{
if (udbg_comport) {
- if ((in_8(&udbg_comport->lsr) & LSR_DR) != 0)
- return in_8(&udbg_comport->rbr);
+ if ((serial_read(&udbg_comport->lsr) & LSR_DR) != 0)
+ return serial_read(&udbg_comport->rbr);
else
return -1;
}
@@ -81,15 +98,15 @@ static int udbg_550_getc_poll(void)
static int udbg_550_getc(void)
{
if (udbg_comport) {
- while ((in_8(&udbg_comport->lsr) & LSR_DR) == 0)
+ while ((serial_read(&udbg_comport->lsr) & LSR_DR) == 0)
/* wait for char */;
- return in_8(&udbg_comport->rbr);
+ return serial_read(&udbg_comport->rbr);
}
return -1;
}
void udbg_init_uart(void __iomem *comport, unsigned int speed,
- unsigned int clock)
+ unsigned int clock, unsigned int regshift)
{
unsigned int dll, base_bauds;
@@ -103,22 +120,23 @@ void udbg_init_uart(void __iomem *comport, unsigned int speed,
if (comport) {
udbg_comport = (struct NS16550 __iomem *)comport;
- out_8(&udbg_comport->lcr, 0x00);
- out_8(&udbg_comport->ier, 0xff);
- out_8(&udbg_comport->ier, 0x00);
- out_8(&udbg_comport->lcr, LCR_DLAB);
- out_8(&udbg_comport->dll, dll & 0xff);
- out_8(&udbg_comport->dlm, dll >> 8);
+ serial_write(&udbg_comport->lcr, 0x00);
+ serial_write(&udbg_comport->ier, 0xff);
+ serial_write(&udbg_comport->ier, 0x00);
+ serial_write(&udbg_comport->lcr, LCR_DLAB);
+ serial_write(&udbg_comport->dll, dll & 0xff);
+ serial_write(&udbg_comport->dlm, dll >> 8);
/* 8 data, 1 stop, no parity */
- out_8(&udbg_comport->lcr, 0x03);
+ serial_write(&udbg_comport->lcr, 0x03);
/* RTS/DTR */
- out_8(&udbg_comport->mcr, 0x03);
+ serial_write(&udbg_comport->mcr, 0x03);
/* Clear & enable FIFOs */
- out_8(&udbg_comport->fcr ,0x07);
+ serial_write(&udbg_comport->fcr, 0x07);
udbg_putc = udbg_550_putc;
udbg_flush = udbg_550_flush;
udbg_getc = udbg_550_getc;
udbg_getc_poll = udbg_550_getc_poll;
+ reg_shift = regshift;
}
}
@@ -128,24 +146,24 @@ unsigned int udbg_probe_uart_speed(void __iomem *comport, unsigned int clock)
u8 old_lcr;
struct NS16550 __iomem *port = comport;
- old_lcr = in_8(&port->lcr);
+ old_lcr = serial_read(&port->lcr);
/* select divisor latch registers. */
- out_8(&port->lcr, LCR_DLAB);
+ serial_write(&port->lcr, LCR_DLAB);
/* now, read the divisor */
- dll = in_8(&port->dll);
- dlm = in_8(&port->dlm);
+ dll = serial_read(&port->dll);
+ dlm = serial_read(&port->dlm);
divisor = dlm << 8 | dll;
/* check prescaling */
- if (in_8(&port->mcr) & 0x80)
+ if (serial_read(&port->mcr) & 0x80)
prescaler = 4;
else
prescaler = 1;
/* restore the LCR */
- out_8(&port->lcr, old_lcr);
+ serial_write(&port->lcr, old_lcr);
/* calculate speed */
speed = (clock / prescaler) / (divisor * 16);
@@ -341,7 +359,7 @@ void __init udbg_init_wsp(void)
{
udbg_comport = (struct NS16550 __iomem *)WSP_UART_VIRT;
- udbg_init_uart(udbg_comport, 57600, 50000000);
+ udbg_init_uart(udbg_comport, 57600, 50000000, 0);
udbg_putc = udbg_wsp_putc;
udbg_flush = udbg_wsp_flush;
--
1.6.1.rc3
^ permalink raw reply related
* Re: [PATCH 1/1] Add support 2 SATA ports for Maui and change filename from sata_dwc_460ex.c to sata_dwc_4xx.c
From: Sergei Shtylyov @ 2012-04-09 10:12 UTC (permalink / raw)
To: Thang Q. Nguyen
Cc: devicetree-discuss, linux-kernel, Rob Herring, linux-ide,
Paul Mackerras, Jeff Garzik, linuxppc-dev
In-Reply-To: <1333447938-16461-1-git-send-email-tqnguyen@apm.com>
Hello.
On 03-04-2012 14:12, Thang Q. Nguyen wrote:
> Signed-off-by: Thang Q. Nguyen<tqnguyen@apm.com>
[...]
> diff --git a/arch/powerpc/boot/dts/bluestone.dts b/arch/powerpc/boot/dts/bluestone.dts
> index cfa23bf..803fda6 100644
> --- a/arch/powerpc/boot/dts/bluestone.dts
> +++ b/arch/powerpc/boot/dts/bluestone.dts
> @@ -155,6 +155,27 @@
> /*RXDE*/ 0x5 0x4>;
> };
>
> + /* SATA DWC devices */
> + SATA0: sata@bffd1000 {
> + compatible = "amcc,sata-apm821xx";
> + reg =<4 0xbffd1000 0x800 /* SATA0 */
> + 4 0xbffd0800 0x400>; /* AHBDMA */
> + dma-channel=<0>;
> + interrupt-parent =<&UIC0>;
> + interrupts =<26 4 /* SATA0 */
> + 25 4>; /* AHBDMA */
> + };
> +
> + SATA1: sata@bffd1800 {
> + compatible = "amcc,sata-apm821xx";
> + reg =<4 0xbffd1800 0x800 /* SATA1 */
> + 4 0xbffd0800 0x400>; /* AHBDMA */
> + dma-channel=<1>;
> + interrupt-parent =<&UIC0>;
> + interrupts =<27 4 /* SATA1 */
> + 25 4>; /* AHBDMA */
> + };
> +
So, this is dual SATA controller, not dual port SATA controller?
BTW, it's wrong to have the same AHBDMA resource in two device nodes I think.
MBR, Sergei
^ permalink raw reply
* Re: [PATCH] powerpc: 512x: Fix mpc5121_clk_get()
From: Richard Weinberger @ 2012-04-09 13:06 UTC (permalink / raw)
To: Richard Weinberger; +Cc: paulus, agust, linuxppc-dev, linux-kernel
In-Reply-To: <1332788489-27435-1-git-send-email-richard@nod.at>
[-- Attachment #1: Type: text/plain, Size: 1081 bytes --]
Am 26.03.2012 21:01, schrieb Richard Weinberger:
> If try_module_get() fails, mpc5121_clk_get() might return
> a wrong clock.
>
> Signed-off-by: Richard Weinberger <richard@nod.at>
> ---
> arch/powerpc/platforms/512x/clock.c | 6 ++++--
> 1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/powerpc/platforms/512x/clock.c b/arch/powerpc/platforms/512x/clock.c
> index 1d8700f..9f771e0 100644
> --- a/arch/powerpc/platforms/512x/clock.c
> +++ b/arch/powerpc/platforms/512x/clock.c
> @@ -54,14 +54,16 @@ static DEFINE_MUTEX(clocks_mutex);
> static struct clk *mpc5121_clk_get(struct device *dev, const char *id)
> {
> struct clk *p, *clk = ERR_PTR(-ENOENT);
> - int dev_match = 0;
> - int id_match = 0;
> + int dev_match;
> + int id_match;
>
> if (dev == NULL || id == NULL)
> return clk;
>
> mutex_lock(&clocks_mutex);
> list_for_each_entry(p, &clocks, node) {
> + dev_match = id_match = 0;
> +
> if (dev == p->dev)
> dev_match++;
> if (strcmp(id, p->name) == 0)
*ping*
Thanks,
//richard
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 490 bytes --]
^ permalink raw reply
* Re: [PATCH 00/14] Backport 8xx TLB to 2.4
From: Willy Tarreau @ 2012-04-09 13:08 UTC (permalink / raw)
To: Joakim Tjernlund; +Cc: Scott Wood, linuxppc-dev, Dan Malek
In-Reply-To: <OFE7D02EF5.C8AA7552-ONC125799E.0037BB62-C125799E.0040126D@transmode.se>
Hi Joakim,
On Wed, Feb 08, 2012 at 12:39:50PM +0100, Joakim Tjernlund wrote:
> I figure, after 2.4.37.12, a public git tree on kernel org which still
> receives fixes would be enough.
FYI, I've merged your patches and pushed them along with a few pending
other ones here :
http://git.kernel.org/?p=linux/kernel/git/wtarreau/linux-2.4.git;a=summary
There will only be git updates from now on. Probably that once in a while I'll
tag the tree to make things easier to check.
Thanks for taking care of sending fixes for old kernels !
Cheers,
Willy
^ permalink raw reply
* Re: Problem with framebuffer mmap on platforms with large addressing
From: Dmitry Eremin-Solenikov @ 2012-04-09 16:18 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: linux-fbdev, Florian Tobias Schandinat, Tony Breeds, linuxppc-dev
In-Reply-To: <1332222008.2982.13.camel@pasglop>
On Tue, Mar 20, 2012 at 9:40 AM, Benjamin Herrenschmidt
<benh@kernel.crashing.org> wrote:
>
>> >> That is interesting! Are those patches published or otherwise available
>> >> somewhere? We are also very interested in enabling Canyonlands
>> >> with Radeon KMS!
>> >
>> > You will run into additional problems with 460 due to the fact that it's
>> > not cache coherent for DMA. Tony patches don't address that part of the
>> > problem (they were used on a 476 based platform).
>>
>> Hmm. Could you please spill a little bit more of details? Also are those patches
>> for 476 merged or present somewhere?
>
> Well, DMA on 46x isn't cache coherent. The DRM plays interesting games
> with mapping/unmapping pages for DMA by the chip and I don't think we
> have the right hooks to do the appropriate cache flushing on these guys,
> but Tony might be able to comment, I don't know whether he tried or not.
>
> On the other hand 476 has fully cache coherent DMA so the only problem
> there is the >32-bit physical address space.
>
> As for the patches, you'll have to wait for Tony to respond (I'll poke
> him locally).
Any news on these patches? A dirty and "not for the upstream yet" version
would be sufficient for me for now.
>
> Cheers,
> Ben.
>
--
With best wishes
Dmitry
^ permalink raw reply
* Re: Problem with framebuffer mmap on platforms with large addressing
From: Benjamin Herrenschmidt @ 2012-04-09 21:37 UTC (permalink / raw)
To: Dmitry Eremin-Solenikov
Cc: linux-fbdev, Florian Tobias Schandinat, Tony Breeds, linuxppc-dev
In-Reply-To: <CALT56yOU2FDTNRnr=aLVFTGHiVsGNKVoqLqAWQ7Q+Xzg6_B8qQ@mail.gmail.com>
On Mon, 2012-04-09 at 20:18 +0400, Dmitry Eremin-Solenikov wrote:
> > As for the patches, you'll have to wait for Tony to respond (I'll
> poke
> > him locally).
>
> Any news on these patches? A dirty and "not for the upstream yet"
> version
> would be sufficient for me for now.
I'll poke again..
Cheers,
Ben.
^ 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