1. 22 5月, 2014 1 次提交
    • M
      x86/PCI: Warn if we have to "guess" host bridge node information · 33673101
      Myron Stowe 提交于
      The vast majority of platforms are not supplying ACPI _PXM (proximity)
      information corresponding to host bridge (PNP0A03/PNP0A08) devices
      resulting in sysfs "numa_node" values of -1 (NUMA_NO_NODE):
      
        # for i in /sys/devices/pci0000\:00/*/numa_node; do cat $i; done | uniq
        -1
      
        # find /sys/ -name "numa_node" | while read fname; do cat $fname; \
          done | uniq
        -1
      
      AMD based platforms provide a fall-back for this situation via amd_bus.c.
      These platforms snoop out the information by directly reading specific
      registers from the Northbridge and caching them via alloc_pci_root_info().
      
      Later during boot processing when host bridges are discovered -
      pci_acpi_scan_root() - the kernel looks for their corresponding ACPI _PXM
      method - drivers/acpi/numa.c::acpi_get_node().  If the BIOS supplied a _PXM
      method then that node (proximity) value is associated.  If the BIOS did not
      supply a _PXM method *and* the platform is AMD-based, the fall-back cached
      values obtained directly from the Northbridge are used; otherwise,
      "NUMA_NO_NODE" is associated.
      
      There are a number of issues with this fall-back mechanism the most notable
      being that amd_bus.c extracts a 3-bit number from a CPU register and uses
      it as the node number.  The node numbers used by Linux are logical and
      there's no reason they need to be identical to settings in the CPU
      registers.  So if we have some node information obtained in the normal way
      (from _PXM, SLIT, SRAT, etc.) and some from amd_bus.c, there's no reason to
      believe they will be compatible.
      
      This patch warns when this situation occurs:
      
        pci_root PNP0A08:00: [Firmware Bug]: no _PXM; falling back to node 0 from hardware (may be inconsistent with ACPI node numbers)
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=72051Signed-off-by: NMyron Stowe <myron.stowe@redhat.com>
      Signed-off-by: NSuravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      33673101
  2. 13 2月, 2014 3 次提交
  3. 04 2月, 2014 4 次提交
  4. 15 11月, 2013 1 次提交
    • R
      ACPI / driver core: Store an ACPI device pointer in struct acpi_dev_node · 7b199811
      Rafael J. Wysocki 提交于
      Modify struct acpi_dev_node to contain a pointer to struct acpi_device
      associated with the given device object (that is, its ACPI companion
      device) instead of an ACPI handle corresponding to it.  Introduce two
      new macros for manipulating that pointer in a CONFIG_ACPI-safe way,
      ACPI_COMPANION() and ACPI_COMPANION_SET(), and rework the
      ACPI_HANDLE() macro to take the above changes into account.
      Drop the ACPI_HANDLE_SET() macro entirely and rework its users to
      use ACPI_COMPANION_SET() instead.  For some of them who used to
      pass the result of acpi_get_child() directly to ACPI_HANDLE_SET()
      introduce a helper routine acpi_preset_companion() doing an
      equivalent thing.
      
      The main motivation for doing this is that there are things
      represented by struct acpi_device objects that don't have valid
      ACPI handles (so called fixed ACPI hardware features, such as
      power and sleep buttons) and we would like to create platform
      device objects for them and "glue" them to their ACPI companions
      in the usual way (which currently is impossible due to the
      lack of valid ACPI handles).  However, there are more reasons
      why it may be useful.
      
      First, struct acpi_device pointers allow of much better type checking
      than void pointers which are ACPI handles, so it should be more
      difficult to write buggy code using modified struct acpi_dev_node
      and the new macros.  Second, the change should help to reduce (over
      time) the number of places in which the result of ACPI_HANDLE() is
      passed to acpi_bus_get_device() in order to obtain a pointer to the
      struct acpi_device associated with the given "physical" device,
      because now that pointer is returned by ACPI_COMPANION() directly.
      Finally, the change should make it easier to write generic code that
      will build both for CONFIG_ACPI set and unset without adding explicit
      compiler directives to it.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com> # on Haswell
      Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Reviewed-by: Aaron Lu <aaron.lu@intel.com> # for ATA and SDIO part
      7b199811
  5. 10 10月, 2013 1 次提交
  6. 23 8月, 2013 1 次提交
  7. 29 5月, 2013 1 次提交
  8. 14 1月, 2013 1 次提交
    • R
      ACPI / PCI: Set root bridge ACPI handle in advance · 6c0cc950
      Rafael J. Wysocki 提交于
      The ACPI handles of PCI root bridges need to be known to
      acpi_bind_one(), so that it can create the appropriate
      "firmware_node" and "physical_node" files for them, but currently
      the way it gets to know those handles is not exactly straightforward
      (to put it lightly).
      
      This is how it works, roughly:
      
        1. acpi_bus_scan() finds the handle of a PCI root bridge,
           creates a struct acpi_device object for it and passes that
           object to acpi_pci_root_add().
      
        2. acpi_pci_root_add() creates a struct acpi_pci_root object,
           populates its "device" field with its argument's address
           (device->handle is the ACPI handle found in step 1).
      
        3. The struct acpi_pci_root object created in step 2 is passed
           to pci_acpi_scan_root() and used to get resources that are
           passed to pci_create_root_bus().
      
        4. pci_create_root_bus() creates a struct pci_host_bridge object
           and passes its "dev" member to device_register().
      
        5. platform_notify(), which for systems with ACPI is set to
           acpi_platform_notify(), is called.
      
      So far, so good.  Now it starts to be "interesting".
      
        6. acpi_find_bridge_device() is used to find the ACPI handle of
           the given device (which is the PCI root bridge) and executes
           acpi_pci_find_root_bridge(), among other things, for the
           given device object.
      
        7. acpi_pci_find_root_bridge() uses the name (sic!) of the given
           device object to extract the segment and bus numbers of the PCI
           root bridge and passes them to acpi_get_pci_rootbridge_handle().
      
        8. acpi_get_pci_rootbridge_handle() browses the list of ACPI PCI
           root bridges and finds the one that matches the given segment
           and bus numbers.  Its handle is then used to initialize the
           ACPI handle of the PCI root bridge's device object by
           acpi_bind_one().  However, this is *exactly* the ACPI handle we
           started with in step 1.
      
      Needless to say, this is quite embarassing, but it may be avoided
      thanks to commit f3fd0c8a (ACPI: Allow ACPI handles of devices to be
      initialized in advance), which makes it possible to initialize the
      ACPI handle of a device before passing it to device_register().
      
      Accordingly, add a new __weak routine, pcibios_root_bridge_prepare(),
      defaulting to an empty implementation that can be replaced by the
      interested architecutres (x86 and ia64 at the moment) with functions
      that will set the root bridge's ACPI handle before its dev member is
      passed to device_register().  Make both x86 and ia64 provide such
      implementations of pcibios_root_bridge_prepare() and remove
      acpi_pci_find_root_bridge() and acpi_get_pci_rootbridge_handle() that
      aren't necessary any more.
      
      Included is a fix for breakage on systems with non-ACPI PCI host
      bridges from Bjorn Helgaas.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      6c0cc950
  9. 04 1月, 2013 1 次提交
    • G
      X86: drivers: remove __dev* attributes. · a18e3690
      Greg Kroah-Hartman 提交于
      CONFIG_HOTPLUG is going away as an option.  As a result, the __dev*
      markings need to be removed.
      
      This change removes the use of __devinit, __devexit_p, __devinitconst,
      and __devexit from these drivers.
      
      Based on patches originally written by Bill Pemberton, but redone by me
      in order to handle some of the coding style issues better, by hand.
      
      Cc: Bill Pemberton <wfp5p@virginia.edu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: "H. Peter Anvin" <hpa@zytor.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Daniel Drake <dsd@laptop.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a18e3690
  10. 16 11月, 2012 1 次提交
    • R
      Revert "ACPI / x86: Add quirk for "CheckPoint P-20-00" to not use bridge _CRS_ info" · bacaf7cd
      Rafael J. Wysocki 提交于
      This reverts commit 0a290ac4 on
      the basis of the following comment from Bjorn Helgaas:
      
        Here's my reasoning: this is a CheckPoint product, and it looks
        like an appliance, not really a general-purpose machine.  The issue
        has apparently been there from day one, and the kernel shipped on
        the machine complains noisily about the issue, but apparently
        nobody bothered to investigate it.
      
        This corruption will clearly break other ACPI-related things.  We
        can sort of work around this one (though the workaround does
        prevent us from doing any PCI resource reassignment), but we have
        no idea what the other lurking ACPI issues are (and we have no
        assurance that *only* ACPI things are broken -- maybe the
        memory corruption affects other unknown things).  It may take
        significant debugging effort to identify the next problem.
      
        The only report I've seen (this one) is apparently from a
        CheckPoint employee, so it's not clear that anybody else is trying
        to run upstream Linux on it.  Being a CheckPoint employee, [...]
        is probably in a position to get the BIOS fixed.
      
        You might still be able to convince me, but it seems like the
        benefit to a quirk for this platform is small, and it does cost
        everybody else something in code size and complexity.
      
      References: https://bugzilla.kernel.org/show_bug.cgi?id=47981#c36Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      bacaf7cd
  11. 15 11月, 2012 1 次提交
  12. 08 11月, 2012 2 次提交
    • M
      x86/PCI: Allow x86 platforms to use translation offsets · b4873931
      Mike Yoknis 提交于
      The memory range descriptors in the _CRS control method contain an address
      translation offset for host bridges.  This value is used to translate
      addresses across the bridge.  The support to use _TRA values is present for
      other architectures but not for X86 platforms.
      
      For existing X86 platforms the _TRA value is zero.  Non-zero _TRA values
      are expected on future X86 platforms.  This change will register that value
      with the resource.
      Signed-off-by: NMike Yoknis <mike.yoknis@hp.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      b4873931
    • B
      x86/PCI: Ignore _SEG on HP xw9300 · 1f09b09b
      Bjorn Helgaas 提交于
      The xw9300 BIOS supplies _SEG methods that are incorrect, which results
      in some LSI SCSI devices not being discovered.  This adds a quirk to
      ignore _SEG on this machine and default to zero.
      
      The xw9300 has three host bridges:
      
          ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-3f])
          ACPI: PCI Root Bridge [PCI1] (domain 0001 [bus 40-7f])
          ACPI: PCI Root Bridge [PCI2] (domain 0002 [bus 80-ff])
      
      When the BIOS "ACPI Bus Segmentation" option is enabled (as it is by
      default), the _SEG methods of the PCI1 and PCI2 bridges return 1 and 2,
      respectively.  However, the BIOS implementation appears to be incomplete,
      and we can't enumerate devices in those domains.
      
      But if we assume PCI1 and PCI2 really lead to buses in domain 0,
      everything works fine.  Windows XP and Vista also seem to ignore
      these _SEG methods.
      
      Reference: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543308
      Reference: https://bugzilla.kernel.org/show_bug.cgi?id=15362Reported-and-Tested-by: NSean M. Pappalardo <pegasus@renegadetech.com>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      1f09b09b
  13. 22 9月, 2012 1 次提交
  14. 23 6月, 2012 2 次提交
  15. 14 6月, 2012 2 次提交
  16. 08 5月, 2012 1 次提交
  17. 01 5月, 2012 5 次提交
  18. 02 3月, 2012 1 次提交
  19. 29 2月, 2012 1 次提交
  20. 24 2月, 2012 1 次提交
    • Y
      PCI: fix memleak when ACPI _CRS is not used. · 1cc1c96c
      Yinghai Lu 提交于
      warning:
      unreferenced object 0xffff8801f6914200 (size 512):
        comm "swapper/0", pid 1, jiffies 4294893643 (age 2664.644s)
        hex dump (first 32 bytes):
          00 00 c0 fe 00 00 00 00 ff ff ff ff 00 00 00 00  ................
          60 58 2f f6 03 88 ff ff 00 02 00 00 00 00 00 00  `X/.............
        backtrace:
          [<ffffffff81c2408c>] kmemleak_alloc+0x26/0x43
          [<ffffffff8113764f>] __kmalloc+0x121/0x183
          [<ffffffff81ca8d93>] get_current_resources+0x5a/0xc6
          [<ffffffff81c5bedd>] pci_acpi_scan_root+0x13c/0x21c
          [<ffffffff81c2a745>] acpi_pci_root_add+0x1e1/0x421
          [<ffffffff81408f50>] acpi_device_probe+0x50/0x190
          [<ffffffff8149edc7>] really_probe+0x99/0x126
          [<ffffffff8149ef83>] driver_probe_device+0x3b/0x56
          [<ffffffff8149effd>] __driver_attach+0x5f/0x82
          [<ffffffff8149d860>] bus_for_each_dev+0x5c/0x88
          [<ffffffff8149eb87>] driver_attach+0x1e/0x20
          [<ffffffff8149e7cc>] bus_add_driver+0xca/0x21d
          [<ffffffff8149f47b>] driver_register+0x91/0xfe
          [<ffffffff81409d09>] acpi_bus_register_driver+0x43/0x45
          [<ffffffff8278bdc9>] acpi_pci_root_init+0x20/0x28
          [<ffffffff810001e7>] do_one_initcall+0x57/0x134
      
      The system has _CRS for root buses, but they are not used because the machine
      date is before the cutoff date for _CRS usage.
      
      Try to free those unused resource arrays and names.
      Reviewed-by: NBjorn Helgaas <bhelgaas@google.com>
      Signed-off-by: NYinghai Lu <yinghai@kernel.org>
      Signed-off-by: NJesse Barnes <jbarnes@virtuousgeek.org>
      1cc1c96c
  21. 15 2月, 2012 1 次提交
  22. 07 1月, 2012 5 次提交
  23. 07 10月, 2011 1 次提交
    • P
      x86/PCI: use host bridge _CRS info on ASUS M2V-MX SE · 29cf7a30
      Paul Menzel 提交于
      In summary, this DMI quirk uses the _CRS info by default for the ASUS
      M2V-MX SE by turning on `pci=use_crs` and is similar to the quirk
      added by commit 2491762c ("x86/PCI: use host bridge _CRS info on
      ASRock ALiveSATA2-GLAN") whose commit message should be read for further
      information.
      
      Since commit 3e3da00c ("x86/pci: AMD one chain system to use pci
      read out res") Linux gives the following oops:
      
          parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
          HDA Intel 0000:20:01.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
          HDA Intel 0000:20:01.0: setting latency timer to 64
          BUG: unable to handle kernel paging request at ffffc90011c08000
          IP: [<ffffffffa0578402>] azx_probe+0x3ad/0x86b [snd_hda_intel]
          PGD 13781a067 PUD 13781b067 PMD 1300ba067 PTE 800000fd00000173
          Oops: 0009 [#1] SMP
          last sysfs file: /sys/module/snd_pcm/initstate
          CPU 0
          Modules linked in: snd_hda_intel(+) snd_hda_codec snd_hwdep snd_pcm_oss snd_mixer_oss snd_pcm snd_seq_midi snd_rawmidi snd_seq_midi_event tpm_tis tpm snd_seq tpm_bios psmouse parport_pc snd_timer snd_seq_device parport processor evdev snd i2c_viapro thermal_sys amd64_edac_mod k8temp i2c_core soundcore shpchp pcspkr serio_raw asus_atk0110 pci_hotplug edac_core button snd_page_alloc edac_mce_amd ext3 jbd mbcache sha256_generic cryptd aes_x86_64 aes_generic cbc dm_crypt dm_mod raid1 md_mod usbhid hid sg sd_mod crc_t10dif sr_mod cdrom ata_generic uhci_hcd sata_via pata_via libata ehci_hcd usbcore scsi_mod via_rhine mii nls_base [last unloaded: scsi_wait_scan]
          Pid: 1153, comm: work_for_cpu Not tainted 2.6.37-1-amd64 #1 M2V-MX SE/System Product Name
          RIP: 0010:[<ffffffffa0578402>]  [<ffffffffa0578402>] azx_probe+0x3ad/0x86b [snd_hda_intel]
          RSP: 0018:ffff88013153fe50  EFLAGS: 00010286
          RAX: ffffc90011c08000 RBX: ffff88013029ec00 RCX: 0000000000000006
          RDX: 0000000000000000 RSI: 0000000000000246 RDI: 0000000000000246
          RBP: ffff88013341d000 R08: 0000000000000000 R09: 0000000000000040
          R10: 0000000000000286 R11: 0000000000003731 R12: ffff88013029c400
          R13: 0000000000000000 R14: 0000000000000000 R15: ffff88013341d090
          FS:  0000000000000000(0000) GS:ffff8800bfc00000(0000) knlGS:00000000f7610ab0
          CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
          CR2: ffffc90011c08000 CR3: 0000000132f57000 CR4: 00000000000006f0
          DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
          DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
          Process work_for_cpu (pid: 1153, threadinfo ffff88013153e000, task ffff8801303c86c0)
          Stack:
           0000000000000005 ffffffff8123ad65 00000000000136c0 ffff88013029c400
           ffff8801303c8998 ffff88013341d000 ffff88013341d090 ffff8801322d9dc8
           ffff88013341d208 0000000000000000 0000000000000000 ffffffff811ad232
          Call Trace:
           [<ffffffff8123ad65>] ? __pm_runtime_set_status+0x162/0x186
           [<ffffffff811ad232>] ? local_pci_probe+0x49/0x92
           [<ffffffff8105afc5>] ? do_work_for_cpu+0x0/0x1b
           [<ffffffff8105afc5>] ? do_work_for_cpu+0x0/0x1b
           [<ffffffff8105afd0>] ? do_work_for_cpu+0xb/0x1b
           [<ffffffff8105fd3f>] ? kthread+0x7a/0x82
           [<ffffffff8100a824>] ? kernel_thread_helper+0x4/0x10
           [<ffffffff8105fcc5>] ? kthread+0x0/0x82
           [<ffffffff8100a820>] ? kernel_thread_helper+0x0/0x10
          Code: f4 01 00 00 ef 31 f6 48 89 df e8 29 dd ff ff 85 c0 0f 88 2b 03 00 00 48 89 ef e8 b4 39 c3 e0 8b 7b 40 e8 fc 9d b1 e0 48 8b 43 38 <66> 8b 10 66 89 14 24 8b 43 14 83 e8 03 83 f8 01 77 32 31 d2 be
          RIP  [<ffffffffa0578402>] azx_probe+0x3ad/0x86b [snd_hda_intel]
           RSP <ffff88013153fe50>
          CR2: ffffc90011c08000
          ---[ end trace 8d1f3ebc136437fd ]---
      
      Trusting the ACPI _CRS information (`pci=use_crs`) fixes this problem.
      
          $ dmesg | grep -i crs # with the quirk
          PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
      
      The match has to be against the DMI board entries though since the vendor entries are not populated.
      
          DMI: System manufacturer System Product Name/M2V-MX SE, BIOS 0304    10/30/2007
      
      This quirk should be removed when `pci=use_crs` is enabled for machines
      from 2006 or earlier or some other solution is implemented.
      
      Using coreboot [1] with this board the problem does not exist but this
      quirk also does not affect it either. To be safe though the check is
      tightened to only take effect when the BIOS from American Megatrends is
      used.
      
              15:13 < ruik> but coreboot does not need that
              15:13 < ruik> because i have there only one root bus
              15:13 < ruik> the audio is behind a bridge
      
              $ sudo dmidecode
              BIOS Information
                      Vendor: American Megatrends Inc.
                      Version: 0304
                      Release Date: 10/30/2007
      
      [1] http://www.coreboot.org/
      
      Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=30552
      
      Cc: stable@kernel.org (2.6.34)
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: x86@kernel.org
      Signed-off-by: NPaul Menzel <paulepanter@users.sourceforge.net>
      Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
      Acked-by: NJesse Barnes <jbarnes@virtuousgeek.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      29cf7a30
  24. 10 9月, 2011 1 次提交