Re: ppc_set_hwdebug vs ptrace_set_debugreg

2010-11-29 Thread Andreas Schwab
K.Prasad pra...@linux.vnet.ibm.com writes:

 Although ppc_set_hwdebug() can set DABR through set_dabr() in
 arch/powerpc/kernel/process.c, it is good to have it converted to use
 register_user_hw_breakpoint().

What do you mean with good to have?  It doesn't work without it unless
I disable PERF_EVENTS (which is the only way to disable
HAVE_HW_BREAKPOINT).

Andreas.

-- 
Andreas Schwab, sch...@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
And now for something completely different.
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH v4] ppc44x:PHY fixup for USB on canyonlands board

2010-11-29 Thread Rupjyoti Sarmah
This fix is a reset for USB PHY that requires some amount of time for power to 
be stable on Canyonlands.

Signed-off-by: Rupjyoti Sarmah rsar...@apm.com
---
changes from previous version:
-- changed the dts node names for consistency
-- corrected the indentation pointed by Wolfgang Denk

 arch/powerpc/boot/dts/canyonlands.dts  |   13 +++
 arch/powerpc/platforms/44x/44x.h   |4 +
 arch/powerpc/platforms/44x/Makefile|1 +
 arch/powerpc/platforms/44x/canyonlands.c   |  120 
 arch/powerpc/platforms/44x/ppc44x_simple.c |1 -
 5 files changed, 138 insertions(+), 1 deletions(-)
 create mode 100644 arch/powerpc/platforms/44x/canyonlands.c

diff --git a/arch/powerpc/boot/dts/canyonlands.dts 
b/arch/powerpc/boot/dts/canyonlands.dts
index a303703..3c5d63c 100644
--- a/arch/powerpc/boot/dts/canyonlands.dts
+++ b/arch/powerpc/boot/dts/canyonlands.dts
@@ -224,6 +224,13 @@
};
};
 
+   c...@2,0 {
+   #address-cells = 1;
+   #size-cells = 1;
+   compatible = amcc,ppc460ex-bcsr;
+   reg = 2 0x0 0x9;
+   };
+
n...@3,0 {
compatible = ibm,ndfc;
reg = 0x0003 0x 
0x2000;
@@ -320,6 +327,12 @@
interrupts = 0x3 0x4;
};
 
+   GPIO0: g...@ef600b00 {
+   compatible = ibm,ppc4xx-gpio;
+   reg = 0xef600b00 0x0048;
+   gpio-controller;
+   };
+
ZMII0: emac-z...@ef600d00 {
compatible = ibm,zmii-460ex, ibm,zmii;
reg = 0xef600d00 0x000c;
diff --git a/arch/powerpc/platforms/44x/44x.h b/arch/powerpc/platforms/44x/44x.h
index dbc4d2b..63f703e 100644
--- a/arch/powerpc/platforms/44x/44x.h
+++ b/arch/powerpc/platforms/44x/44x.h
@@ -4,4 +4,8 @@
 extern u8 as1_readb(volatile u8 __iomem  *addr);
 extern void as1_writeb(u8 data, volatile u8 __iomem *addr);
 
+#define GPIO0_OSRH 0xC
+#define GPIO0_TSRH 0x14
+#define GPIO0_ISR1H0x34
+
 #endif /* __POWERPC_PLATFORMS_44X_44X_H */
diff --git a/arch/powerpc/platforms/44x/Makefile 
b/arch/powerpc/platforms/44x/Makefile
index 82ff326..6854e73 100644
--- a/arch/powerpc/platforms/44x/Makefile
+++ b/arch/powerpc/platforms/44x/Makefile
@@ -6,3 +6,4 @@ obj-$(CONFIG_WARP)  += warp.o
 obj-$(CONFIG_XILINX_VIRTEX_5_FXT) += virtex.o
 obj-$(CONFIG_XILINX_ML510) += virtex_ml510.o
 obj-$(CONFIG_ISS4xx)   += iss4xx.o
+obj-$(CONFIG_CANYONLANDS)+= canyonlands.o
diff --git a/arch/powerpc/platforms/44x/canyonlands.c 
b/arch/powerpc/platforms/44x/canyonlands.c
new file mode 100644
index 000..4917c31
--- /dev/null
+++ b/arch/powerpc/platforms/44x/canyonlands.c
@@ -0,0 +1,120 @@
+/*
+ * This contain platform specific code for APM PPC460EX based Canyonlands
+ * board.
+ *
+ * Copyright (c) 2010, Applied Micro Circuits Corporation
+ * Author: Rupjyoti Sarmah rsar...@apm.com
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+#include linux/kernel.h
+#include linux/init.h
+#include asm/pci-bridge.h
+#include asm/ppc4xx.h
+#include asm/udbg.h
+#include asm/uic.h
+#include linux/of_platform.h
+#include linux/delay.h
+#include 44x.h
+
+#define BCSR_USB_EN0x11
+
+static __initdata struct of_device_id ppc44x_of_bus[] = {
+   { .compatible = ibm,plb4, },
+   { .compatible = ibm,opb, },
+   { .compatible = ibm,ebc, },
+   { .compatible = simple-bus, },
+   {},
+};
+
+static int __init ppc44x_device_probe(void)
+{
+   of_platform_bus_probe(NULL, ppc44x_of_bus, NULL);
+
+   return 0;
+}
+machine_device_initcall(canyonlands, ppc44x_device_probe);
+
+/* Using this code only for the Canyonlands board.  */
+
+static int __init ppc44x_probe(void)
+{
+   unsigned long root = of_get_flat_dt_root();
+   if (of_flat_dt_is_compatible(root, amcc,canyonlands)) {
+   

Re: [PATCH][v2] Fixing the garbage collector problem after NAND-flash image record in u-boot

2010-11-29 Thread Artem Bityutskiy
On Tue, 2010-11-23 at 18:38 +0100, sergej.stepa...@ids.de wrote:
 This patch should fix the following problem:
  1. the  jffs2-image update in the u-boot was ok
  2. first restart and first mount of the NAND-flash-partition was also ok
  3. before the restart of controller there are no any activity on NAND-flash 
 except of the jffs2_gcd_mtdX-process ...
  4. BUT after the second restart the NAND-flash-partition could not be really 
 used after the second mount,
 dmesg filled with messages:
 ...
 jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x03ce: 0xc0ff 
 instead
 jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x03d0: 0xc0ff 
 instead
 
 Just for for info:
 the behaviour observed on mpc8313-based board with the large-page NAND.
 The only activity on NAND-flash was the garbage collector process, that looks 
 for CLEANMARKER-nodes
 
 As Scott said it was broken by commit 3ab8f2a2e7011c5e83363b42950757e46ef06824
 
 Signed-off-by: Sergej Stepanov sergej.stepa...@ids.de
 Cc: Rolf Riehle rolf.rie...@ids.de
 Cc: Scott Wood scottw...@freescale.com
 Cc: David Woodhouse dw...@infradead.org

Pusehd to l2-mtd-2.6.git, thanks.

-- 
Best Regards,
Artem Bityutskiy (Битюцкий Артём)

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Re: [PATCH 3/5] fpga: add basic CARMA board support

2010-11-29 Thread Ira W. Snyder
On Mon, Nov 29, 2010 at 11:38:14AM +1100, Benjamin Herrenschmidt wrote:
 On Wed, 2010-09-08 at 09:41 -0700, Ira W. Snyder wrote:
  This adds basic support for the system controller FPGA on the OVRO CARMA
  board. This patch only adds infrastructure that will be used by later
  drivers.
 
 Oh and another comment ...
 
 I'm not sure about drivers/fpga ... in the end, one would expect such a
 directory to contain stuff to manipulate FPGAs in the sense of
 downloading bitfiles, instanciating devices (device-tree manipulation ?)
 etc...
 
 From what I see in your code, the fact that these are FPGAs is almost
 irrelevant, you are providing support for carma devices, and such are
 no different than some other platform device, they just happen to be
 implemented as FPGAs. Or am I missing something ?
 

You are exactly right. They are just regular platform devices. One
devices does happen to be a bitfile downloading driver
(carma-fpga-program), but it does not create any generic infrastructure
for downloading bitfiles.

Regarding your earlier comment about the carma class: no, it isn't
necessary. I found it convenient to have everything related to this
hardware appear in /sys/class/carma/, nothing more. It just wasn't as
easy to remember something like:
/sys/bus/platform/devices/f000.carma-fpga/.

I was thinking about changing the drivers from generic char devices into
misc devices instead. The sysfs interface would move from
/sys/class/carma/carma-fpga to /sys/class/misc/carma-fpga (for example),
but that is easy enough to remember.

Rather than putting the source code in drivers/fpga/carma, what about
drivers/misc/carma instead? I've already done that in my local tree, and
I'm much happier with the result.

Thanks for the comments.

Ira
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH v2] PPC4xx: Adding PCI(E) MSI support

2010-11-29 Thread Josh Boyer
On Mon, Nov 15, 2010 at 12:15:06PM -0800, tma...@apm.com wrote:
From: Tirumala Marri tma...@apm.com

This patch adds MSI support for 440SPe, 460Ex, 460Sx and 405Ex.


My apologies in the delay here.  I was on holiday for a while and never
got back to review this.  A few notes below.

Also, I've added a few patches from Victor for suspend/idle support in
my next branch that cause a minor conflict with this one.  It's not a
big deal to fix, but if you rework the patch for the comments, rebasing
it to my next branch would be appreciated.

diff --git a/arch/powerpc/sysdev/ppc4xx_msi.c 
b/arch/powerpc/sysdev/ppc4xx_msi.c
new file mode 100644
index 000..9ed559f
--- /dev/null
+++ b/arch/powerpc/sysdev/ppc4xx_msi.c
@@ -0,0 +1,311 @@
+/*
+ * Adding PCI-E MSI support for PPC4XX SoCs.
+ *
+ * Copyright (c) 2010, Applied Micro Circuits Corporation
+ * Authors:   Tirumala R Marri tma...@apm.com
+ *Feng Kan f...@apm.com
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include linux/irq.h
+#include linux/bootmem.h
+#include linux/pci.h
+#include linux/msi.h
+#include linux/of_platform.h
+#include linux/interrupt.h
+#include asm/prom.h
+#include asm/hw_irq.h
+#include asm/ppc-pci.h
+#include boot/dcr.h

This still seems weird to include.  Perhaps you should duplicate the
macros you need into asm/dcr-regs.h or something.

+#include asm/dcr-regs.h
+#include asm/msi_bitmap.h
+
+#define PEIH_TERMADH  0x00
+#define PEIH_TERMADL  0x08
+#define PEIH_MSIED0x10
+#define PEIH_MSIMK0x18
+#define PEIH_MSIASS   0x20
+#define PEIH_FLUSH0   0x30
+#define PEIH_FLUSH1   0x38
+#define PEIH_CNTRST   0x48
+#define NR_MSI_IRQS   4
+
+LIST_HEAD(msi_head);
+struct ppc4xx_msi {
+  u32 msi_addr_lo;
+  u32 msi_addr_hi;
+  void __iomem *msi_regs;
+  int msi_virqs[NR_MSI_IRQS];
+  struct msi_bitmap bitmap;
+  struct list_head list;
+};
+
+struct ppc4xx_msi_feature {
+  u32 ppc4xx_pic_ip;
+  u32 msiir_offset;
+};
+
+static int ppc4xx_msi_init_allocator(struct platform_device *dev,
+  struct ppc4xx_msi *msi_data)
+{
+  int err;
+
+  err = msi_bitmap_alloc(msi_data-bitmap, NR_MSI_IRQS,
+dev-dev.of_node);
+  if (err)
+  return err;
+
+  err = msi_bitmap_reserve_dt_hwirqs(msi_data-bitmap);
+  if (err  0) {
+  msi_bitmap_free(msi_data-bitmap);
+  return err;
+  }
+
+  return 0;
+}
+
+static int ppc4xx_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
+{
+  int err = 0;
+  int int_no = -ENOMEM;
+  unsigned int virq;
+  struct msi_msg msg;
+  struct msi_desc *entry;
+  struct device_node *msi_dev = NULL;
+  struct ppc4xx_msi *msi_data = dev-dev.platform_data;
+
+  msi_dev = of_find_node_by_name(NULL, ppc4xx-msi);
+  if (msi_dev) {
+  err = -ENODEV;
+  goto out_free;
+  }
+
+  list_for_each_entry(entry, dev-msi_list, list) {
+  list_for_each_entry(msi_data, msi_head, list) {
+  int_no = msi_bitmap_alloc_hwirqs(msi_data-bitmap, 1);
+  if(int_no = 0)
+  break;
+  }
+  if(int_no  0) {
+
+  err = int_no;
+  pr_debug(%s: fail allocating msi interrupt\n,
+  __func__);
+  }
+  virq = irq_of_parse_and_map(msi_dev, int_no);
+  if (virq == NO_IRQ) {
+  dev_err(dev-dev, %s: fail mapping irq\n, __func__);
+  msi_bitmap_free_hwirqs(msi_data-bitmap, int_no, 1);
+  err = -ENOSPC;
+  goto out_free;
+  }
+  msi_data-msi_virqs[int_no] = virq;
+  set_irq_data(virq, (void *)int_no);
+  dev_dbg(dev-dev, %s: virq = %d \n, __func__, virq);
+
+  /* Setup msi address space */
+  msg.address_hi = msi_data-msi_addr_hi;
+  msg.address_lo = msi_data-msi_addr_lo;
+
+  set_irq_msi(virq, entry);
+  msg.data = int_no;
+  write_msi_msg(virq, msg);
+  }
+  of_node_put(msi_dev);
+  return err;
+
+out_free:
+  of_node_put(msi_dev);
+  return err;

You can 

Re: [PATCH 15/15] ppc/vio: ensure dma_coherent_mask is set

2010-11-29 Thread Nishanth Aravamudan
Hi Ben,

On 29.11.2010 [12:02:57 +1100], Benjamin Herrenschmidt wrote:
 On Wed, 2010-09-15 at 11:05 -0700, Nishanth Aravamudan wrote:
  Without this change drivers, such as ibmvscsi, fail to load with the
  previous change.
  ---
 
 So you broke bisection... fold the patch instead or invert them

Thanks for the review. I resent this series on 10/18 and it had the
patches folded together.

Thanks,
Nish

-- 
Nishanth Aravamudan n...@us.ibm.com
IBM Linux Technology Center
___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 15/15] ppc/vio: ensure dma_coherent_mask is set

2010-11-29 Thread Benjamin Herrenschmidt
On Mon, 2010-11-29 at 11:46 -0800, Nishanth Aravamudan wrote:
  So you broke bisection... fold the patch instead or invert them
 
 Thanks for the review. I resent this series on 10/18 and it had the
 patches folded together. 

Right, I know :-) I just mistakenly had that old one still tagged in
patchwork, my bad.

I've merged some of the new ones already.

Cheers,
Ben.


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH v2] PPC4xx: Adding PCI(E) MSI support

2010-11-29 Thread Michael Ellerman
On Mon, 2010-11-29 at 13:35 -0500, Josh Boyer wrote:
 On Mon, Nov 15, 2010 at 12:15:06PM -0800, tma...@apm.com wrote:
 From: Tirumala Marri tma...@apm.com
 
 This patch adds MSI support for 440SPe, 460Ex, 460Sx and 405Ex.
 
 
 My apologies in the delay here.  I was on holiday for a while and never
 got back to review this.  A few notes below.
 
 Also, I've added a few patches from Victor for suspend/idle support in
 my next branch that cause a minor conflict with this one.  It's not a
 big deal to fix, but if you rework the patch for the comments, rebasing
 it to my next branch would be appreciated.
 
 diff --git a/arch/powerpc/sysdev/ppc4xx_msi.c 
 b/arch/powerpc/sysdev/ppc4xx_msi.c
 new file mode 100644
 index 000..9ed559f
 --- /dev/null
 +++ b/arch/powerpc/sysdev/ppc4xx_msi.c
 @@ -0,0 +1,311 @@
 +/*
 + * Adding PCI-E MSI support for PPC4XX SoCs.
 + *
 + * Copyright (c) 2010, Applied Micro Circuits Corporation
 + * Authors: Tirumala R Marri tma...@apm.com
 + *  Feng Kan f...@apm.com
 + *
 + * 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.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 + * MA 02111-1307 USA
 + */
 +
 +#include linux/irq.h
 +#include linux/bootmem.h
 +#include linux/pci.h
 +#include linux/msi.h
 +#include linux/of_platform.h
 +#include linux/interrupt.h
 +#include asm/prom.h
 +#include asm/hw_irq.h
 +#include asm/ppc-pci.h
 +#include boot/dcr.h
 
 This still seems weird to include.  Perhaps you should duplicate the
 macros you need into asm/dcr-regs.h or something.
 
 +#include asm/dcr-regs.h
 +#include asm/msi_bitmap.h
 +
 +#define PEIH_TERMADH0x00
 +#define PEIH_TERMADL0x08
 +#define PEIH_MSIED  0x10
 +#define PEIH_MSIMK  0x18
 +#define PEIH_MSIASS 0x20
 +#define PEIH_FLUSH0 0x30
 +#define PEIH_FLUSH1 0x38
 +#define PEIH_CNTRST 0x48
 +#define NR_MSI_IRQS 4
 +
 +LIST_HEAD(msi_head);
 +struct ppc4xx_msi {
 +u32 msi_addr_lo;
 +u32 msi_addr_hi;
 +void __iomem *msi_regs;
 +int msi_virqs[NR_MSI_IRQS];
 +struct msi_bitmap bitmap;
 +struct list_head list;
 +};
 +
 +struct ppc4xx_msi_feature {
 +u32 ppc4xx_pic_ip;
 +u32 msiir_offset;
 +};
 +
 +static int ppc4xx_msi_init_allocator(struct platform_device *dev,
 +struct ppc4xx_msi *msi_data)
 +{
 +int err;
 +
 +err = msi_bitmap_alloc(msi_data-bitmap, NR_MSI_IRQS,
 +  dev-dev.of_node);
 +if (err)
 +return err;
 +
 +err = msi_bitmap_reserve_dt_hwirqs(msi_data-bitmap);
 +if (err  0) {
 +msi_bitmap_free(msi_data-bitmap);
 +return err;
 +}
 +
 +return 0;
 +}
 +
 +static int ppc4xx_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 +{
 +int err = 0;
 +int int_no = -ENOMEM;
 +unsigned int virq;
 +struct msi_msg msg;
 +struct msi_desc *entry;
 +struct device_node *msi_dev = NULL;
 +struct ppc4xx_msi *msi_data = dev-dev.platform_data;
 +
 +msi_dev = of_find_node_by_name(NULL, ppc4xx-msi);
 +if (msi_dev) {
 +err = -ENODEV;
 +goto out_free;
 +}
 +
 +list_for_each_entry(entry, dev-msi_list, list) {
 +list_for_each_entry(msi_data, msi_head, list) {
 +int_no = msi_bitmap_alloc_hwirqs(msi_data-bitmap, 1);
 +if(int_no = 0)
 +break;
 +}
 +if(int_no  0) {
 +
 +err = int_no;
 +pr_debug(%s: fail allocating msi interrupt\n,
 +__func__);
 +}
 +virq = irq_of_parse_and_map(msi_dev, int_no);
 +if (virq == NO_IRQ) {
 +dev_err(dev-dev, %s: fail mapping irq\n, __func__);
 +msi_bitmap_free_hwirqs(msi_data-bitmap, int_no, 1);
 +err = -ENOSPC;
 +goto out_free;
 +}
 +msi_data-msi_virqs[int_no] = virq;
 +set_irq_data(virq, (void *)int_no);
 +dev_dbg(dev-dev, %s: virq = %d \n, __func__, virq);
 +
 +/* Setup msi address space */
 +msg.address_hi = msi_data-msi_addr_hi;
 +msg.address_lo = msi_data-msi_addr_lo;
 +
 +set_irq_msi(virq, entry);
 +msg.data = int_no;
 +write_msi_msg(virq, msg);
 +}
 +of_node_put(msi_dev);
 +

[git pull] Please pull powerpc.git merge branch

2010-11-29 Thread Benjamin Herrenschmidt
Hi Linus !

This is a small fix for a misuse of RCU on powerpc, please pull.

Cheers,
Ben.

The following changes since commit
72083646528d4887b920deb71b37e09bc7d227bb:

  Un-inline get_pipe_info() helper function (2010-11-28 16:27:19 -0800)

are available in the git repository at:
  git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git merge

Peter Zijlstra (1):
  powerpc: Use call_rcu_sched() for pagetables

 arch/powerpc/mm/pgtable.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


Re: [PATCH 0/4] More ppc64 nvram code cleanup

2010-11-29 Thread Benjamin Herrenschmidt
On Thu, 2010-11-11 at 20:53 -0800, Jim Keniston wrote:
 This series contains some fixups to Ben Herrenschmidt's Aug. 2 patch
 set, [RFC] Clean up ppc64 nvram code --
 http://lists.ozlabs.org/pipermail/linuxppc-dev/2010-August/084601.html
 
 These patches apply atop Ben's 11-patch series.
 ---
 
 Jim Keniston (4):
   Handle partition names = 12 chars
   Fix NVRAM partition list setup
   Fix nvram_create_partition() arg order
   Fix powerpc nvram init order

I've folded the first two (or a slightly different variant) in my series
and applied the two next on top. I'll post that new version of the
series to the list after a few tests today and will include it in next
in a couple of days, possibly along with your other patches provided
they survive my review :-)

Cheers,
Ben.


___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 01/13] powerpc/nvram: Move things out of asm/nvram.h

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

This moves a bunch of definitions out of asm/nvram.h to the files
that use them or just outright remove completely unused stuff.

We leave the partition signatures definitions, they will be useful

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/include/asm/nvram.h   |   42 +--
 arch/powerpc/kernel/nvram_64.c |   21 +++-
 arch/powerpc/platforms/chrp/time.c |4 +++
 arch/powerpc/platforms/pseries/nvram.c |2 +
 4 files changed, 28 insertions(+), 41 deletions(-)

diff --git a/arch/powerpc/include/asm/nvram.h b/arch/powerpc/include/asm/nvram.h
index 850b72f..459dc09 100644
--- a/arch/powerpc/include/asm/nvram.h
+++ b/arch/powerpc/include/asm/nvram.h
@@ -10,31 +10,7 @@
 #ifndef _ASM_POWERPC_NVRAM_H
 #define _ASM_POWERPC_NVRAM_H
 
-#include linux/errno.h
-
-#define NVRW_CNT 0x20
-#define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
-#define NVRAM_BLOCK_LEN 16
-#define NVRAM_MAX_REQ (2080/NVRAM_BLOCK_LEN)
-#define NVRAM_MIN_REQ (1056/NVRAM_BLOCK_LEN)
-
-#define NVRAM_AS0  0x74
-#define NVRAM_AS1  0x75
-#define NVRAM_DATA 0x77
-
-
-/* RTC Offsets */
-
-#define MOTO_RTC_SECONDS   0x1FF9
-#define MOTO_RTC_MINUTES   0x1FFA
-#define MOTO_RTC_HOURS 0x1FFB
-#define MOTO_RTC_DAY_OF_WEEK   0x1FFC
-#define MOTO_RTC_DAY_OF_MONTH  0x1FFD
-#define MOTO_RTC_MONTH 0x1FFE
-#define MOTO_RTC_YEAR  0x1FFF
-#define MOTO_RTC_CONTROLA   0x1FF8
-#define MOTO_RTC_CONTROLB   0x1FF9
-
+/* Signatures for nvram partitions */
 #define NVRAM_SIG_SP   0x02/* support processor */
 #define NVRAM_SIG_OF   0x50/* open firmware config */
 #define NVRAM_SIG_FW   0x51/* general firmware */
@@ -49,25 +25,11 @@
 #define NVRAM_SIG_OS   0xa0/* OS defined */
 #define NVRAM_SIG_PANIC0xa1/* Apple OSX panic */
 
-/* If change this size, then change the size of NVNAME_LEN */
-struct nvram_header {
-   unsigned char signature;
-   unsigned char checksum;
-   unsigned short length;
-   char name[12];
-};
-
 #ifdef __KERNEL__
 
+#include linux/errno.h
 #include linux/list.h
 
-struct nvram_partition {
-   struct list_head partition;
-   struct nvram_header header;
-   unsigned int index;
-};
-
-
 extern int nvram_write_error_log(char * buff, int length,
 unsigned int err_type, unsigned int 
err_seq);
 extern int nvram_read_error_log(char * buff, int length,
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 9cf197f..a8154f1 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -34,6 +34,25 @@
 
 #undef DEBUG_NVRAM
 
+#define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
+#define NVRAM_BLOCK_LEN 16
+#define NVRAM_MAX_REQ (2080/NVRAM_BLOCK_LEN)
+#define NVRAM_MIN_REQ (1056/NVRAM_BLOCK_LEN)
+
+/* If change this size, then change the size of NVNAME_LEN */
+struct nvram_header {
+   unsigned char signature;
+   unsigned char checksum;
+   unsigned short length;
+   char name[12];
+};
+
+struct nvram_partition {
+   struct list_head partition;
+   struct nvram_header header;
+   unsigned int index;
+};
+
 static struct nvram_partition * nvram_part;
 static long nvram_error_log_index = -1;
 static long nvram_error_log_size = 0;
@@ -432,7 +451,7 @@ static int __init nvram_setup_partition(void)
}

/* try creating a partition with the free space we have */
-   rc = nvram_create_os_partition();
+   rc = nvram_create_partition(ppc64,linux, );
if (!rc) {
return 0;
}
diff --git a/arch/powerpc/platforms/chrp/time.c 
b/arch/powerpc/platforms/chrp/time.c
index 054dfe5..f803f4b 100644
--- a/arch/powerpc/platforms/chrp/time.c
+++ b/arch/powerpc/platforms/chrp/time.c
@@ -29,6 +29,10 @@
 
 extern spinlock_t rtc_lock;
 
+#define NVRAM_AS0  0x74
+#define NVRAM_AS1  0x75
+#define NVRAM_DATA 0x77
+
 static int nvram_as1 = NVRAM_AS1;
 static int nvram_as0 = NVRAM_AS0;
 static int nvram_data = NVRAM_DATA;
diff --git a/arch/powerpc/platforms/pseries/nvram.c 
b/arch/powerpc/platforms/pseries/nvram.c
index bc3c7f2..f4e4c06 100644
--- a/arch/powerpc/platforms/pseries/nvram.c
+++ b/arch/powerpc/platforms/pseries/nvram.c
@@ -27,6 +27,8 @@ static int nvram_fetch, nvram_store;
 static char nvram_buf[NVRW_CNT];   /* assume this is in the first 4GB */
 static DEFINE_SPINLOCK(nvram_lock);
 
+/* Max bytes to read/write in one go */
+#define NVRW_CNT 0x20
 
 static ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index)
 {
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 02/13] powerpc/nvram: More flexible nvram_create_partition()

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

Replace nvram_create_os_partition() with a variant that takes
the partition name, signature and size as arguments.

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |   46 +++
 arch/powerpc/platforms/pseries/nvram.c |6 ++--
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index a8154f1..9e13335 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -307,13 +307,15 @@ static int __init nvram_remove_os_partition(void)
return 0;
 }
 
-/* nvram_create_os_partition
- *
- * Create a OS linux partition to buffer error logs.
- * Will create a partition starting at the first free
- * space found if space has enough room.
+/**
+ * nvram_create_partition - Create a partition in nvram
+ * @name: name of the partition to create
+ * @sig: signature of the partition to create
+ * @req_size: size to allocate preferrably
+ * @min_size: minimum acceptable size (0 means req_size)
  */
-static int __init nvram_create_os_partition(void)
+static int __init nvram_create_partition(const char *name, int sig,
+int req_size, int min_size)
 {
struct nvram_partition *part;
struct nvram_partition *new_part;
@@ -322,20 +324,27 @@ static int __init nvram_create_os_partition(void)
loff_t tmp_index;
long size = 0;
int rc;
-   
+
+   /* If no minimum size specified, make it the same as the
+* requested size
+*/
+   if (min_size == 0)
+   min_size = req_size;
+
/* Find a free partition that will give us the maximum needed size 
   If can't find one that will give us the minimum size needed */
list_for_each_entry(part, nvram_part-partition, partition) {
if (part-header.signature != NVRAM_SIG_FREE)
continue;
 
-   if (part-header.length = NVRAM_MAX_REQ) {
-   size = NVRAM_MAX_REQ;
+   if (part-header.length = req_size) {
+   size = req_size;
free_part = part;
break;
}
-   if (!size  part-header.length = NVRAM_MIN_REQ) {
-   size = NVRAM_MIN_REQ;
+   if (part-header.length  size 
+   part-header.length = min_size) {
+   size = part-header.length;
free_part = part;
}
}
@@ -350,9 +359,9 @@ static int __init nvram_create_os_partition(void)
}
 
new_part-index = free_part-index;
-   new_part-header.signature = NVRAM_SIG_OS;
+   new_part-header.signature = sig;
new_part-header.length = size;
-   strcpy(new_part-header.name, ppc64,linux);
+   strncpy(new_part-header.name, name, 12);
new_part-header.checksum = nvram_checksum(new_part-header);
 
rc = nvram_write_header(new_part);
@@ -451,10 +460,10 @@ static int __init nvram_setup_partition(void)
}

/* try creating a partition with the free space we have */
-   rc = nvram_create_partition(ppc64,linux, );
-   if (!rc) {
+   rc =nvram_create_partition(ppc64,linux, NVRAM_SIG_OS,
+  NVRAM_MAX_REQ, NVRAM_MIN_REQ);
+   if (!rc)
return 0;
-   }

/* need to free up some space */
rc = nvram_remove_os_partition();
@@ -463,9 +472,10 @@ static int __init nvram_setup_partition(void)
}

/* create a partition in this new space */
-   rc = nvram_create_os_partition();
+   rc =nvram_create_partition(ppc64,linux, NVRAM_SIG_OS,
+  NVRAM_MAX_REQ, NVRAM_MIN_REQ);
if (rc) {
-   printk(KERN_ERR nvram_create_os_partition: Could not find a 
+   printk(KERN_ERR nvram_create_partition: Could not find a 
   NVRAM partition large enough\n);
return rc;
}
diff --git a/arch/powerpc/platforms/pseries/nvram.c 
b/arch/powerpc/platforms/pseries/nvram.c
index f4e4c06..2a1ef5c 100644
--- a/arch/powerpc/platforms/pseries/nvram.c
+++ b/arch/powerpc/platforms/pseries/nvram.c
@@ -22,14 +22,14 @@
 #include asm/prom.h
 #include asm/machdep.h
 
+/* Max bytes to read/write in one go */
+#define NVRW_CNT 0x20
+
 static unsigned int nvram_size;
 static int nvram_fetch, nvram_store;
 static char nvram_buf[NVRW_CNT];   /* assume this is in the first 4GB */
 static DEFINE_SPINLOCK(nvram_lock);
 
-/* Max bytes to read/write in one go */
-#define NVRW_CNT 0x20
-
 static ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index)
 {
unsigned int i;
-- 
1.7.1

___

[PATCH 04/13] powerpc/nvram: Ensure that the partition header/block size is right

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

Use BUILD_BUG_ON to ensure the structure representing a partition
header have the right size.

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index a5a5587..f753882 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -565,6 +565,8 @@ static int __init nvram_init(void)
int error;
int rc;

+   BUILD_BUG_ON(NVRAM_BLOCK_LEN != 16);
+
if (ppc_md.nvram_size == NULL || ppc_md.nvram_size() = 0)
return  -ENODEV;
 
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 03/13] powerpc/nvram: nvram_create_partitions() now uses bytes

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

This converts nvram_create_partition() to use a size in bytes
rather than blocks. It does the appropriate alignment internally

The size passed is also the data size (ie. doesn't include the
header anymore).

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |   20 ++--
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 9e13335..a5a5587 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -34,10 +34,10 @@
 
 #undef DEBUG_NVRAM
 
-#define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
-#define NVRAM_BLOCK_LEN 16
-#define NVRAM_MAX_REQ (2080/NVRAM_BLOCK_LEN)
-#define NVRAM_MIN_REQ (1056/NVRAM_BLOCK_LEN)
+#define NVRAM_HEADER_LEN   sizeof(struct nvram_header)
+#define NVRAM_BLOCK_LENNVRAM_HEADER_LEN
+#define NVRAM_MAX_REQ  2079
+#define NVRAM_MIN_REQ  1055
 
 /* If change this size, then change the size of NVNAME_LEN */
 struct nvram_header {
@@ -311,7 +311,7 @@ static int __init nvram_remove_os_partition(void)
  * nvram_create_partition - Create a partition in nvram
  * @name: name of the partition to create
  * @sig: signature of the partition to create
- * @req_size: size to allocate preferrably
+ * @req_size: size of data to allocate in bytes
  * @min_size: minimum acceptable size (0 means req_size)
  */
 static int __init nvram_create_partition(const char *name, int sig,
@@ -325,12 +325,20 @@ static int __init nvram_create_partition(const char 
*name, int sig,
long size = 0;
int rc;
 
+   /* Convert sizes from bytes to blocks */
+   req_size = _ALIGN_UP(req_size, NVRAM_BLOCK_LEN) / NVRAM_BLOCK_LEN;
+   min_size = _ALIGN_UP(min_size, NVRAM_BLOCK_LEN) / NVRAM_BLOCK_LEN;
+
/* If no minimum size specified, make it the same as the
 * requested size
 */
if (min_size == 0)
min_size = req_size;
 
+   /* Now add one block to each for the header */
+   req_size += 1;
+   min_size += 1;
+
/* Find a free partition that will give us the maximum needed size 
   If can't find one that will give us the minimum size needed */
list_for_each_entry(part, nvram_part-partition, partition) {
@@ -450,7 +458,7 @@ static int __init nvram_setup_partition(void)
if (strcmp(part-header.name, ppc64,linux))
continue;
 
-   if (part-header.length = NVRAM_MIN_REQ) {
+   if ((part-header.length - 1) * NVRAM_BLOCK_LEN = 
NVRAM_MIN_REQ) {
/* found our partition */
nvram_error_log_index = part-index + NVRAM_HEADER_LEN;
nvram_error_log_size = ((part-header.length - 1) *
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 05/13] powerpc/nvram: Completely clear a new partition

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

When creating a partition, we clear it entirely rather than
just the first two words since the previous code was rather
specific to the pseries log partition format.

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |   19 ++-
 1 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index f753882..02737e6 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -320,7 +320,7 @@ static int __init nvram_create_partition(const char *name, 
int sig,
struct nvram_partition *part;
struct nvram_partition *new_part;
struct nvram_partition *free_part = NULL;
-   int seq_init[2] = { 0, 0 };
+   static char nv_init_vals[16];
loff_t tmp_index;
long size = 0;
int rc;
@@ -379,14 +379,15 @@ static int __init nvram_create_partition(const char 
*name, int sig,
return rc;
}
 
-   /* make sure and initialize to zero the sequence number and the error
-  type logged */
-   tmp_index = new_part-index + NVRAM_HEADER_LEN;
-   rc = ppc_md.nvram_write((char *)seq_init, sizeof(seq_init), 
tmp_index);
-   if (rc = 0) {
-   printk(KERN_ERR nvram_create_os_partition: nvram_write 
-  failed (%d)\n, rc);
-   return rc;
+   /* Clear the partition */
+   for (tmp_index = new_part-index + NVRAM_HEADER_LEN;
+tmp_index   ((size - 1) * NVRAM_BLOCK_LEN);
+tmp_index += NVRAM_BLOCK_LEN) {
+   rc = ppc_md.nvram_write(nv_init_vals, NVRAM_BLOCK_LEN, 
tmp_index);
+   if (rc = 0) {
+   pr_err(nvram_create_partition: nvram_write failed 
(%d)\n, rc);
+   return rc;
+   }
}

nvram_error_log_index = new_part-index + NVRAM_HEADER_LEN;
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 11/13] powerpc/nvram: Rename ppc64, linux partition to ibm, rtas-log

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

I'm not aware of any userspace tool accessing it by its name anyways,
it's read back by the kernel itself on the next boot to get back
older log entries

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/platforms/pseries/nvram.c |   23 +--
 1 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/nvram.c 
b/arch/powerpc/platforms/pseries/nvram.c
index 55a7141..7e828ba 100644
--- a/arch/powerpc/platforms/pseries/nvram.c
+++ b/arch/powerpc/platforms/pseries/nvram.c
@@ -40,6 +40,8 @@ struct err_log_info {
 #define NVRAM_MAX_REQ  2079
 #define NVRAM_MIN_REQ  1055
 
+#define NVRAM_LOG_PART_NAMEibm,rtas-log
+
 static ssize_t pSeries_nvram_read(char *buf, size_t count, loff_t *index)
 {
unsigned int i;
@@ -262,8 +264,8 @@ int nvram_clear_error_log(void)
  * error logs and cleanup partitions if needed.
  *
  * The general strategy is the following:
- * 1.) If there is ppc64,linux partition large enough then use it.
- * 2.) If there is not a ppc64,linux partition large enough, search
+ * 1.) If there is log partition large enough then use it.
+ * 2.) If there is none large enough, search
  * for a free partition that is large enough.
  * 3.) If there is not a free partition large enough remove 
  * _all_ OS partitions and consolidate the space.
@@ -281,34 +283,35 @@ static int __init pseries_nvram_init_log_partition(void)
nvram_scan_partitions();
 
/* Lookg for ours */
-   p = nvram_find_partition(ppc64,linux, NVRAM_SIG_OS, size);
+   p = nvram_find_partition(NVRAM_LOG_PART_NAME, NVRAM_SIG_OS, size);
 
/* Found one but too small, remove it */
if (p  size  NVRAM_MIN_REQ) {
-   pr_info(nvram: Found too small ppc64,linux partition
+   pr_info(nvram: Found too small NVRAM_LOG_PART_NAME partition
,removing it...);
-   nvram_remove_partition(ppc64,linux, NVRAM_SIG_OS);
+   nvram_remove_partition(NVRAM_LOG_PART_NAME, NVRAM_SIG_OS);
p = 0;
}
 
/* Create one if we didn't find */
if (!p) {
-   p = nvram_create_partition(ppc64,linux, NVRAM_SIG_OS,
+   p = nvram_create_partition(NVRAM_LOG_PART_NAME, NVRAM_SIG_OS,
   NVRAM_MAX_REQ, NVRAM_MIN_REQ);
/* No room for it, try to get rid of any OS partition
 * and try again
 */
if (p == -ENOSPC) {
-   pr_info(nvram: No room to create ppc64,linux
+   pr_info(nvram: No room to create NVRAM_LOG_PART_NAME
 partition, deleting all OS partitions...);
nvram_remove_partition(NULL, NVRAM_SIG_OS);
-   p = nvram_create_partition(ppc64,linux, NVRAM_SIG_OS,
-  NVRAM_MAX_REQ, 
NVRAM_MIN_REQ);
+   p = nvram_create_partition(NVRAM_LOG_PART_NAME,
+  NVRAM_SIG_OS, NVRAM_MAX_REQ,
+  NVRAM_MIN_REQ);
}
}
 
if (p = 0) {
-   pr_err(nvram: Failed to find or create ppc64,linux
+   pr_err(nvram: Failed to find or create NVRAM_LOG_PART_NAME
partition, err %d\n, (int)p);
return 0;
}
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 12/13] powerpc/nvram: Fix NVRAM partition list setup

2010-11-29 Thread benh
From: Jim Keniston jkeni...@us.ibm.com

Simplify creation and use of the NVRAM partition list.

Signed-off-by: Jim Keniston jkeni...@us.ibm.com
Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |   26 --
 1 files changed, 8 insertions(+), 18 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 125d86c..b8a50fa 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -51,7 +51,7 @@ struct nvram_partition {
unsigned int index;
 };
 
-static struct nvram_partition * nvram_part;
+static LIST_HEAD(nvram_partitions);
 
 static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin)
 {
@@ -196,13 +196,11 @@ static struct miscdevice nvram_dev = {
 #ifdef DEBUG_NVRAM
 static void __init nvram_print_partitions(char * label)
 {
-   struct list_head * p;
struct nvram_partition * tmp_part;

printk(KERN_WARNING %s-\n, label);
printk(KERN_WARNING indx\t\tsig\tchks\tlen\tname\n);
-   list_for_each(p, nvram_part-partition) {
-   tmp_part = list_entry(p, struct nvram_partition, partition);
+   list_for_each_entry(tmp_part, nvram_partitions, partition) {
printk(KERN_WARNING %4d\t%02x\t%02x\t%d\t%s\n,
   tmp_part-index, tmp_part-header.signature,
   tmp_part-header.checksum, tmp_part-header.length,
@@ -250,7 +248,7 @@ int __init nvram_remove_partition(const char *name, int sig)
struct nvram_partition *part, *prev, *tmp;
int rc;
 
-   list_for_each_entry(part, nvram_part-partition, partition) {
+   list_for_each_entry(part, nvram_partitions, partition) {
if (part-header.signature != sig)
continue;
if (name  strncmp(name, part-header.name, 12))
@@ -269,7 +267,7 @@ int __init nvram_remove_partition(const char *name, int sig)
 
/* Merge contiguous ones */
prev = NULL;
-   list_for_each_entry_safe(part, tmp, nvram_part-partition, partition) {
+   list_for_each_entry_safe(part, tmp, nvram_partitions, partition) {
if (part-header.signature != NVRAM_SIG_FREE) {
prev = NULL;
continue;
@@ -333,7 +331,7 @@ loff_t __init nvram_create_partition(const char *name, int 
sig,
 
/* Find a free partition that will give us the maximum needed size 
   If can't find one that will give us the minimum size needed */
-   list_for_each_entry(part, nvram_part-partition, partition) {
+   list_for_each_entry(part, nvram_partitions, partition) {
if (part-header.signature != NVRAM_SIG_FREE)
continue;
 
@@ -412,7 +410,7 @@ int nvram_get_partition_size(loff_t data_index)
 {
struct nvram_partition *part;

-   list_for_each_entry(part, nvram_part-partition, partition) {
+   list_for_each_entry(part, nvram_partitions, partition) {
if (part-index + NVRAM_HEADER_LEN == data_index)
return (part-header.length - 1) * NVRAM_BLOCK_LEN;
}
@@ -430,7 +428,7 @@ loff_t nvram_find_partition(const char *name, int sig, int 
*out_size)
 {
struct nvram_partition *p;
 
-   list_for_each_entry(p, nvram_part-partition, partition) {
+   list_for_each_entry(p, nvram_partitions, partition) {
if (p-header.signature == sig 
(!name || !strncmp(p-header.name, name, 12))) {
if (out_size)
@@ -452,14 +450,6 @@ int __init nvram_scan_partitions(void)
int total_size;
int err;
 
-   /* Initialize our anchor for the nvram partition list */
-   nvram_part = kmalloc(sizeof(struct nvram_partition), GFP_KERNEL);
-   if (!nvram_part) {
-   printk(KERN_ERR nvram_init: Failed kmalloc\n);
-   return -ENOMEM;
-   }
-   INIT_LIST_HEAD(nvram_part-partition);
-  
if (ppc_md.nvram_size == NULL || ppc_md.nvram_size() = 0)
return -ENODEV;
total_size = ppc_md.nvram_size();
@@ -507,7 +497,7 @@ int __init nvram_scan_partitions(void)

memcpy(tmp_part-header, phead, NVRAM_HEADER_LEN);
tmp_part-index = cur_index;
-   list_add_tail(tmp_part-partition, nvram_part-partition);
+   list_add_tail(tmp_part-partition, nvram_partitions);

cur_index += phead.length * NVRAM_BLOCK_LEN;
}
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 10/13] powerpc/nvram: Move the log partition stuff to pseries

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

The nvram log partition stuff currently in nvram_64.c is really
pseries specific. It isn't actually used on anything else (despite
the fact that we ran the code to setup the partition on anything
except powermac) and the log format is specific to pseries RTAS
implementation. So move it where it belongs

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/include/asm/nvram.h   |   10 +-
 arch/powerpc/kernel/nvram_64.c |  254 +++-
 arch/powerpc/platforms/pseries/nvram.c |  200 +
 3 files changed, 227 insertions(+), 237 deletions(-)

diff --git a/arch/powerpc/include/asm/nvram.h b/arch/powerpc/include/asm/nvram.h
index 459dc09..92efe67 100644
--- a/arch/powerpc/include/asm/nvram.h
+++ b/arch/powerpc/include/asm/nvram.h
@@ -30,13 +30,14 @@
 #include linux/errno.h
 #include linux/list.h
 
+#ifdef CONFIG_PPC_PSERIES
 extern int nvram_write_error_log(char * buff, int length,
 unsigned int err_type, unsigned int 
err_seq);
 extern int nvram_read_error_log(char * buff, int length,
 unsigned int * err_type, unsigned int 
*err_seq);
 extern int nvram_clear_error_log(void);
-
 extern int pSeries_nvram_init(void);
+#endif /* CONFIG_PPC_PSERIES */
 
 #ifdef CONFIG_MMIO_NVRAM
 extern int mmio_nvram_init(void);
@@ -47,6 +48,13 @@ static inline int mmio_nvram_init(void)
 }
 #endif
 
+extern int __init nvram_scan_partitions(void);
+extern loff_t nvram_create_partition(const char *name, int sig,
+int req_size, int min_size);
+extern int nvram_remove_partition(const char *name, int sig);
+extern int nvram_get_partition_size(loff_t data_index);
+extern loff_t nvram_find_partition(const char *name, int sig, int *out_size);
+
 #endif /* __KERNEL__ */
 
 /* PowerMac specific nvram stuffs */
diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 76f546b..125d86c 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -36,8 +36,6 @@
 
 #define NVRAM_HEADER_LEN   sizeof(struct nvram_header)
 #define NVRAM_BLOCK_LENNVRAM_HEADER_LEN
-#define NVRAM_MAX_REQ  2079
-#define NVRAM_MIN_REQ  1055
 
 /* If change this size, then change the size of NVNAME_LEN */
 struct nvram_header {
@@ -54,13 +52,6 @@ struct nvram_partition {
 };
 
 static struct nvram_partition * nvram_part;
-static long nvram_error_log_index = -1;
-static long nvram_error_log_size = 0;
-
-struct err_log_info {
-   int error_type;
-   unsigned int seq_num;
-};
 
 static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin)
 {
@@ -254,7 +245,7 @@ static unsigned char __init nvram_checksum(struct 
nvram_header *p)
  * @sig: signature of the partition(s) to remove
  */
 
-static int __init nvram_remove_partition(const char *name, int sig)
+int __init nvram_remove_partition(const char *name, int sig)
 {
struct nvram_partition *part, *prev, *tmp;
int rc;
@@ -313,8 +304,8 @@ static int __init nvram_remove_partition(const char *name, 
int sig)
  * you need to query for the actual size yourself after the
  * call using nvram_partition_get_size().
  */
-static loff_t __init nvram_create_partition(const char *name, int sig,
-   int req_size, int min_size)
+loff_t __init nvram_create_partition(const char *name, int sig,
+int req_size, int min_size)
 {
struct nvram_partition *part;
struct nvram_partition *new_part;
@@ -417,7 +408,7 @@ static loff_t __init nvram_create_partition(const char 
*name, int sig,
  *  the partition. The same value that is returned by
  *  nvram_create_partition().
  */
-static int nvram_get_partition_size(loff_t data_index)
+int nvram_get_partition_size(loff_t data_index)
 {
struct nvram_partition *part;

@@ -451,75 +442,7 @@ loff_t nvram_find_partition(const char *name, int sig, int 
*out_size)
return 0;
 }
 
-/* nvram_setup_partition
- *
- * This will setup the partition we need for buffering the
- * error logs and cleanup partitions if needed.
- *
- * The general strategy is the following:
- * 1.) If there is ppc64,linux partition large enough then use it.
- * 2.) If there is not a ppc64,linux partition large enough, search
- * for a free partition that is large enough.
- * 3.) If there is not a free partition large enough remove 
- * _all_ OS partitions and consolidate the space.
- * 4.) Will first try getting a chunk that will satisfy the maximum
- * error log size (NVRAM_MAX_REQ).
- * 5.) If the max chunk cannot be allocated then try finding a chunk
- * that will satisfy the minum needed (NVRAM_MIN_REQ).
- */
-static int __init nvram_setup_partition(void)
-{
-   loff_t p;
-   int size;
-
-   /* For now, we don't do 

[PATCH 13/13] powerpc/nvram: Handle partition names = 12 chars

2010-11-29 Thread benh
From: Jim Keniston jkeni...@us.ibm.com

The name field in the nvram_header can be  12 chars, null-terminated,
or 12 chars without the null.  Handle this safely.

Signed-off-by: Jim Keniston jkeni...@us.ibm.com
Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index b8a50fa..bb12b32 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -42,6 +42,7 @@ struct nvram_header {
unsigned char signature;
unsigned char checksum;
unsigned short length;
+   /* Terminating null required only for names  12 chars. */
char name[12];
 };
 
@@ -201,7 +202,7 @@ static void __init nvram_print_partitions(char * label)
printk(KERN_WARNING %s-\n, label);
printk(KERN_WARNING indx\t\tsig\tchks\tlen\tname\n);
list_for_each_entry(tmp_part, nvram_partitions, partition) {
-   printk(KERN_WARNING %4d\t%02x\t%02x\t%d\t%s\n,
+   printk(KERN_WARNING %4d\t%02x\t%02x\t%d\t%12s\n,
   tmp_part-index, tmp_part-header.signature,
   tmp_part-header.checksum, tmp_part-header.length,
   tmp_part-header.name);
@@ -256,7 +257,7 @@ int __init nvram_remove_partition(const char *name, int sig)
 
/* Make partition a free partition */
part-header.signature = NVRAM_SIG_FREE;
-   sprintf(part-header.name, );
+   strncpy(part-header.name, , 12);
part-header.checksum = nvram_checksum(part-header);
rc = nvram_write_header(part);
if (rc = 0) {
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 08/13] powerpc/nvram: Add nvram_find_partition()

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |   22 ++
 1 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 6dd2700..01e6844 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -429,6 +429,28 @@ static int nvram_get_partition_size(loff_t data_index)
 }
 
 
+/**
+ * nvram_find_partition - Find an nvram partition by signature and name
+ * @name: Name of the partition or NULL for any name
+ * @sig: Signature to test against
+ * @out_size: if non-NULL, returns the size of the data part of the partition
+ */
+loff_t nvram_find_partition(const char *name, int sig, int *out_size)
+{
+   struct nvram_partition *p;
+
+   list_for_each_entry(p, nvram_part-partition, partition) {
+   if (p-header.signature == sig 
+   (!name || !strncmp(p-header.name, name, 12))) {
+   if (out_size)
+   *out_size = (p-header.length - 1) *
+   NVRAM_BLOCK_LEN;
+   return p-index + NVRAM_HEADER_LEN;
+   }
+   }
+   return 0;
+}
+
 /* nvram_setup_partition
  *
  * This will setup the partition we need for buffering the
-- 
1.7.1

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev


[PATCH 06/13] powerpc/nvram: Shuffle code around in nvram_create_partition()

2010-11-29 Thread benh
From: Benjamin Herrenschmidt b...@kernel.crashing.org

This error log stuff is really pseries specific. As a first step we move
the initialization of these variables to the caller of
nvram_create_partition(), which is also slightly reorganized so we
setup the free partition before we clear the new partition, so the
chance of an error during clear leaving us with invalid headers
is lessened.

Signed-off-by: Benjamin Herrenschmidt b...@kernel.crashing.org
---
 arch/powerpc/kernel/nvram_64.c |  108 +++-
 1 files changed, 62 insertions(+), 46 deletions(-)

diff --git a/arch/powerpc/kernel/nvram_64.c b/arch/powerpc/kernel/nvram_64.c
index 02737e6..eabee7c 100644
--- a/arch/powerpc/kernel/nvram_64.c
+++ b/arch/powerpc/kernel/nvram_64.c
@@ -313,9 +313,15 @@ static int __init nvram_remove_os_partition(void)
  * @sig: signature of the partition to create
  * @req_size: size of data to allocate in bytes
  * @min_size: minimum acceptable size (0 means req_size)
+ *
+ * Returns a negative error code or a positive nvram index
+ * of the beginning of the data area of the newly created
+ * partition. If you provided a min_size smaller than req_size
+ * you need to query for the actual size yourself after the
+ * call using nvram_partition_get_size().
  */
-static int __init nvram_create_partition(const char *name, int sig,
-int req_size, int min_size)
+static loff_t __init nvram_create_partition(const char *name, int sig,
+   int req_size, int min_size)
 {
struct nvram_partition *part;
struct nvram_partition *new_part;
@@ -334,6 +340,8 @@ static int __init nvram_create_partition(const char *name, 
int sig,
 */
if (min_size == 0)
min_size = req_size;
+   if (min_size  req_size)
+   return -EINVAL;
 
/* Now add one block to each for the header */
req_size += 1;
@@ -362,7 +370,7 @@ static int __init nvram_create_partition(const char *name, 
int sig,
/* Create our OS partition */
new_part = kmalloc(sizeof(*new_part), GFP_KERNEL);
if (!new_part) {
-   printk(KERN_ERR nvram_create_os_partition: kmalloc failed\n);
+   pr_err(nvram_create_os_partition: kmalloc failed\n);
return -ENOMEM;
}
 
@@ -374,12 +382,29 @@ static int __init nvram_create_partition(const char 
*name, int sig,
 
rc = nvram_write_header(new_part);
if (rc = 0) {
-   printk(KERN_ERR nvram_create_os_partition: nvram_write_header 
-   failed (%d)\n, rc);
+   pr_err(nvram_create_os_partition: nvram_write_header 
+  failed (%d)\n, rc);
return rc;
}
+   list_add_tail(new_part-partition, free_part-partition);
+
+   /* Adjust or remove the partition we stole the space from */
+   if (free_part-header.length  size) {
+   free_part-index += size * NVRAM_BLOCK_LEN;
+   free_part-header.length -= size;
+   free_part-header.checksum = nvram_checksum(free_part-header);
+   rc = nvram_write_header(free_part);
+   if (rc = 0) {
+   pr_err(nvram_create_os_partition: nvram_write_header 
+  failed (%d)\n, rc);
+   return rc;
+   }
+   } else {
+   list_del(free_part-partition);
+   kfree(free_part);
+   } 
 
-   /* Clear the partition */
+   /* Clear the new partition */
for (tmp_index = new_part-index + NVRAM_HEADER_LEN;
 tmp_index   ((size - 1) * NVRAM_BLOCK_LEN);
 tmp_index += NVRAM_BLOCK_LEN) {
@@ -390,31 +415,24 @@ static int __init nvram_create_partition(const char 
*name, int sig,
}
}

-   nvram_error_log_index = new_part-index + NVRAM_HEADER_LEN;
-   nvram_error_log_size = ((part-header.length - 1) *
-   NVRAM_BLOCK_LEN) - sizeof(struct err_log_info);
-   
-   list_add_tail(new_part-partition, free_part-partition);
-
-   if (free_part-header.length = size) {
-   list_del(free_part-partition);
-   kfree(free_part);
-   return 0;
-   } 
+   return new_part-index + NVRAM_HEADER_LEN;
+}
 
-   /* Adjust the partition we stole the space from */
-   free_part-index += size * NVRAM_BLOCK_LEN;
-   free_part-header.length -= size;
-   free_part-header.checksum = nvram_checksum(free_part-header);
+/**
+ * nvram_get_partition_size - Get the data size of an nvram partition
+ * @data_index: This is the offset of the start of the data of
+ *  the partition. The same value that is returned by
+ *  nvram_create_partition().
+ */
+static int nvram_get_partition_size(loff_t data_index)
+{
+   struct nvram_partition *part;

-