From: Mauro Carvalho Chehab Date: Fri, 16 Mar 2012 18:56:20 +0000 (-0300) Subject: Merge tag 'v3.3-rc1' into new_v8 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Fhw_events_v8;p=users%2Fmchehab%2Fedac.git Merge tag 'v3.3-rc1' into new_v8 * tag 'v3.3-rc1': (8899 commits) Linux 3.3-rc1 x86, syscall: Need __ARCH_WANT_SYS_IPC for 32 bits qnx4: don't leak ->BitMap on late failure exits qnx4: reduce the insane nesting in qnx4_checkroot() qnx4: di_fname is an array, for crying out loud... KEYS: Permit key_serial() to be called with a const key pointer keys: fix user_defined key sparse messages ima: fix cred sparse warning uml: fix compile for x86-64 MPILIB: Add a missing ENOMEM check tpm: fix (ACPI S3) suspend regression nvme: fix merge error due to change of 'make_request_fn' fn type xen: using EXPORT_SYMBOL requires including export.h gpio: tps65910: Use correct offset for gpio initialization acpi/apei/einj: Add extensions to EINJ from rev 5.0 of acpi spec intel_idle: Split up and provide per CPU initialization func ACPI processor: Remove unneeded variable passed by acpi_processor_hotadd_init V2 tg3: Fix single-vector MSI-X code openvswitch: Fix multipart datapath dumps. ipv6: fix per device IP snmp counters ... Conflicts: drivers/edac/edac_mc_sysfs.c drivers/edac/i82975x_edac.c include/linux/edac.h Signed-off-by: Mauro Carvalho Chehab --- dda9da5b7aa4d26001f8146bfae712eda5853a68 diff --cc drivers/edac/edac_mc_sysfs.c index 9b1cdd911d6f,d56e63477d5c..5f8f8642bcdd --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c @@@ -824,64 -977,88 +824,100 @@@ void edac_remove_sysfs_mci_device(struc debugf0("%s()\n", __func__); - /* remove all csrow kobjects */ - debugf4("%s() unregister this mci kobj\n", __func__); - for (i = 0; i < mci->nr_csrows; i++) { - if (mci->csrows[i].nr_pages > 0) { - debugf0("%s() unreg csrow-%d\n", __func__, i); - kobject_put(&mci->csrows[i].kobj); - } - } - - /* remove this mci instance's attribtes */ - if (mci->mc_driver_sysfs_attributes) { - debugf4("%s() unregister mci private attributes\n", __func__); - edac_remove_mci_instance_attributes(mci, - mci->mc_driver_sysfs_attributes, - &mci->edac_mci_kobj, 0); + for (i = 0; i < mci->tot_dimms; i++) { + struct dimm_info *dimm = &mci->dimms[i]; + if (dimm->nr_pages == 0) + continue; + debugf0("%s(): removing device %s\n", __func__, + dev_name(&dimm->dev)); + put_device(&dimm->dev); } - /* remove the symlink */ - debugf4("%s() remove_link\n", __func__); - sysfs_remove_link(&mci->edac_mci_kobj, EDAC_DEVICE_SYMLINK); - - /* unregister this instance's kobject */ - debugf4("%s() remove_mci_instance\n", __func__); - kobject_put(&mci->edac_mci_kobj); + debugf0("%s(): removing device %s\n", __func__, + dev_name(&mci->dev)); + put_device(&mci->dev); } - - - /* - * edac_setup_sysfs_mc_kset(void) - * - * Initialize the mc_kset for the 'mc' entry - * This requires creating the top 'mc' directory with a kset - * and its controls/attributes. - * - * To this 'mc' kset, instance 'mci' will be grouped as children. - * - * Return: 0 SUCCESS - * !0 FAILURE error code + * Init/exit code for the module. Basically, creates/removes /sys/class/rc */ -int edac_sysfs_setup_mc_kset(void) + +int __init edac_mc_sysfs_init(void) { ++<<<<<<< HEAD + int rc; + struct sysdev_class *edac_class; + + /* get the /sys/devices/system/edac class reference */ + edac_class = edac_get_sysfs_class(); + if (edac_class == NULL) { + debugf1("%s() no edac_class\n", __func__); + return -EINVAL; + } + + /* + * FIXME: fake a parent device for the EDAC node + * + * Unfortunately, I couldn't find any easy way to do it, as sysdev + * doesn't use struct device. + */ + mci_parent.type = &mci_attr_type; + mci_parent.bus = &mci_bus_type; + device_initialize(&mci_parent); + dev_set_name(&mci_parent, "edac"); + memcpy(&mci_parent.kobj, &edac_class->kset.kobj, + sizeof(mci_parent.kobj)); + + rc = bus_register(&mci_bus_type); + if (rc) { + printk(KERN_ERR "rc_core: unable to register rc class\n"); + return rc; ++======= + int err = -EINVAL; + struct bus_type *edac_subsys; + + debugf1("%s()\n", __func__); + + /* get the /sys/devices/system/edac subsys reference */ + edac_subsys = edac_get_sysfs_subsys(); + if (edac_subsys == NULL) { + debugf1("%s() no edac_subsys error=%d\n", __func__, err); + goto fail_out; + } + + /* Init the MC's kobject */ + mc_kset = kset_create_and_add("mc", NULL, &edac_subsys->dev_root->kobj); + if (!mc_kset) { + err = -ENOMEM; + debugf1("%s() Failed to register '.../edac/mc'\n", __func__); + goto fail_kset; ++>>>>>>> dcd6c92267155e70a94b3927bce681ce74b80d1f } debugf1("%s() Registered '.../edac/mc' kobject\n", __func__); return 0; ++<<<<<<< HEAD ++======= + + fail_kset: + edac_put_sysfs_subsys(); + + fail_out: + return err; ++>>>>>>> dcd6c92267155e70a94b3927bce681ce74b80d1f } -/* - * edac_sysfs_teardown_mc_kset - * - * deconstruct the mc_ket for memory controllers - */ -void edac_sysfs_teardown_mc_kset(void) +void __exit edac_mc_sysfs_exit(void) { ++<<<<<<< HEAD + debugf0("%s() removing mc bus\n", __func__); + edac_put_sysfs_class(); ++======= + kset_unregister(mc_kset); + edac_put_sysfs_subsys(); + } ++>>>>>>> dcd6c92267155e70a94b3927bce681ce74b80d1f + bus_unregister(&mci_bus_type); +} diff --cc drivers/edac/i82975x_edac.c index 22a4102bf702,4184e0171f00..d8a311583665 --- a/drivers/edac/i82975x_edac.c +++ b/drivers/edac/i82975x_edac.c @@@ -296,24 -292,30 +294,40 @@@ static int i82975x_process_error_info(s } page = (unsigned long) info->eap; - if (info->xeap & 1) - page |= 0x100000000ul; - chan = page & 1; page >>= 1; - offst = page & ((1 << PAGE_SHIFT) - 1); - page >>= PAGE_SHIFT; + if (info->xeap & 1) + page |= 0x80000000; + page >>= (PAGE_SHIFT - 1); row = edac_mc_find_csrow_by_page(mci, page); + if (row == -1) { + i82975x_mc_printk(mci, KERN_ERR, "error processing EAP:\n" + "\tXEAP=%u\n" + "\t EAP=0x%08x\n" + "\tPAGE=0x%08x\n", + (info->xeap & 1) ? 1 : 0, info->eap, (unsigned int) page); + return 0; + } + chan = (mci->csrows[row].nr_channels == 1) ? 0 : info->eap & 1; + offst = info->eap + & ((1 << PAGE_SHIFT) - + (1 << mci->csrows[row].grain)); + if (info->errsts & 0x0002) - edac_mc_handle_ue(mci, page, offst , row, "i82975x UE"); + edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci, + page, offst, 0, + row, -1, -1, + "i82975x UE", "", NULL); else ++<<<<<<< HEAD + edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, + page, offst, info->derrsyn, + row, multi_chan ? chan : 0, -1, + "i82975x CE", "", NULL); ++======= + edac_mc_handle_ce(mci, page, offst, info->derrsyn, row, + chan, "i82975x CE"); ++>>>>>>> dcd6c92267155e70a94b3927bce681ce74b80d1f return 1; } @@@ -429,7 -416,12 +443,14 @@@ static void i82975x_init_csrows(struct csrow->first_page = last_cumul_size; csrow->last_page = cumul_size - 1; - csrow->nr_pages = cumul_size - last_cumul_size; last_cumul_size = cumul_size; ++<<<<<<< HEAD ++======= + csrow->grain = 1 << 7; /* 128Byte cache-line resolution */ + csrow->mtype = MEM_DDR2; /* I82975x supports only DDR2 */ + csrow->dtype = i82975x_dram_type(mch_window, index); + csrow->edac_mode = EDAC_SECDED; /* only supported */ ++>>>>>>> dcd6c92267155e70a94b3927bce681ce74b80d1f } } diff --cc drivers/edac/sb_edac.c index 65d6e0be777b,1dc118d83cc6..ff07f340e8e0 --- a/drivers/edac/sb_edac.c +++ b/drivers/edac/sb_edac.c @@@ -1611,11 -1659,10 +1609,10 @@@ static void sbridge_unregister_mci(stru debugf0("MC: " __FILE__ ": %s(): mci = %p, dev = %p\n", __func__, mci, &sbridge_dev->pdev[0]->dev); - atomic_notifier_chain_unregister(&x86_mce_decoder_chain, - &sbridge_mce_dec); + mce_unregister_decode_chain(&sbridge_mce_dec); /* Remove MC sysfs nodes */ - edac_mc_del_mc(mci->dev); + edac_mc_del_mc(mci->pdev); debugf1("%s: free mci struct\n", mci->ctl_name); kfree(mci->ctl_name); diff --cc include/linux/edac.h index 81dbdf548b35,1cd3947987e5..d6ad253890f6 --- a/include/linux/edac.h +++ b/include/linux/edac.h @@@ -13,7 -13,6 +13,10 @@@ #define _LINUX_EDAC_H_ #include ++<<<<<<< HEAD +#include ++======= ++>>>>>>> dcd6c92267155e70a94b3927bce681ce74b80d1f #include #define EDAC_OPSTATE_INVAL -1