Thread (20 messages) 20 messages, 4 authors, 2007-08-01

Re: [PATCH 2/2] powerpc: MPC85xx EDAC device driver

From: Dave Jiang <hidden>
Date: 2007-07-30 16:36:55

Arnd Bergmann wrote:
On Friday 27 July 2007, Dave Jiang wrote:
quoted
+static struct of_device_id mpc85xx_pci_err_of_match[] = {
+       {
+        .type = "pci",
+        .compatible = "fsl,mpc8540-pci",
+        },
+       {},
+};
+
+static struct of_platform_driver mpc85xx_pci_err_driver = {
+       .owner = THIS_MODULE,
+       .name = "mpc85xx_pci_err",
+       .match_table = mpc85xx_pci_err_of_match,
+       .probe = mpc85xx_pci_err_probe,
+       .remove = mpc85xx_pci_err_remove,
+       .driver = {
+                  .name = "mpc85xx_pci_err",
+                  .owner = THIS_MODULE,
+                  },
+};
This is  a little problematic, if we want to make the PCI bus implementation
use the PCI code from arch/powerpc/kernel/of_platform.c in the future.
Right now this is not possible, because that code is still 64-bit only,
but that may change in the future. Since only one driver can bind
to the pci host bridge device, the mpc85xx_pci_err driver would conflict
with the PCI driver itself, which you probably don't intend.

I'd suggest either to integrate EDAC into the 85xx specific PCI code,
or to have an extra device in the device tree for this.
How about I create a platform device just for EDAC and leave the PCI of_device
to the 85xx PCI code? That would be a lot less modification than adding a
device for every PCI hose per DTS file.... Just a thought....
quoted
+       res = of_register_platform_driver(&mpc85xx_mc_err_driver) ? : res;
+
+       res = of_register_platform_driver(&mpc85xx_l2_err_driver) ? : res;
+
+#ifdef CONFIG_PCI
+       res = of_register_platform_driver(&mpc85xx_pci_err_driver) ? : res;
+#endif
+
+       /*
+        * need to clear HID1[RFXE] to disable machine check int
+        * so we can catch it
+        */
+       if (edac_op_state == EDAC_OPSTATE_INT) {
+               orig_hid1 = mfspr(SPRN_HID1);
+
+               mtspr(SPRN_HID1, (orig_hid1 & ~0x20000));
+       }
+
+       return res;
+}
The error handling could use some improvement here. In particular, you should
unregister the buses in the failure path, maybe you need to clean up other
parts as well.
I think I want individual "devices" work even some may fail or be missing. For
example, even if L2 fails to register, I still want to be able to get the
memory controller to report errors. So I really don't want to unregister
everything that initialized properly even though some failures exists. Maybe I
need to clean it up a little bit.

-- 

------------------------------------------------------
Dave Jiang
Software Engineer
MontaVista Software, Inc.
http://www.mvista.com
------------------------------------------------------
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help