Merge branches 'acpi-scan', 'acpi-bus', 'acpi-osl' and 'acpi-pm'
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 12 Jan 2016 00:10:03 +0000 (01:10 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 12 Jan 2016 00:10:03 +0000 (01:10 +0100)
* acpi-scan:
  ACPI: Fix white space in a structure definition
  ACPI / utils: Add acpi_dev_present()
  ACPI / scan: Fix acpi_bus_id_list bookkeeping
  ACPI / scan: set status to 0 if _STA failed

* acpi-bus:
  ACPI / bus: Show _OSC UUID when _OSC fails
  ACPI / bus: Tidy up _OSC error spacing

* acpi-osl:
  ACPI / OSL: Add kerneldoc comments to memory mapping functions

* acpi-pm:
  ACPI / PM: Support D3 COLD device in old BIOS for ZPODD

424 files changed:
Documentation/devicetree/bindings/net/cpsw.txt
Makefile
arch/arc/Makefile
arch/arc/include/asm/cache.h
arch/arc/kernel/unwind.c
arch/arc/mm/highmem.c
arch/arm/boot/dts/imx6q-gw5400-a.dts
arch/arm/boot/dts/imx6qdl-gw51xx.dtsi
arch/arm/boot/dts/imx6qdl-gw52xx.dtsi
arch/arm/boot/dts/imx6qdl-gw53xx.dtsi
arch/arm/boot/dts/imx6qdl-gw54xx.dtsi
arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
arch/arm/boot/dts/omap4-duovero-parlor.dts
arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
arch/arm/boot/dts/sun6i-a31s-primo81.dts
arch/arm/boot/dts/tegra124-nyan.dtsi
arch/arm/boot/dts/versatile-ab.dts
arch/arm/boot/dts/versatile-pb.dts
arch/arm/boot/dts/wm8650.dtsi
arch/arm/configs/multi_v7_defconfig
arch/arm/configs/sunxi_defconfig
arch/arm/kernel/sys_oabi-compat.c
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/gpmc-onenand.c
arch/arm/mach-omap2/timer.c
arch/arm/net/bpf_jit_32.c
arch/m32r/include/asm/Kbuild
arch/m32r/include/asm/io.h
arch/mips/include/asm/uaccess.h
arch/mips/kernel/cps-vec.S
arch/mips/kernel/mips_ksyms.c
arch/mips/lib/memset.S
arch/mips/net/bpf_jit.c
arch/mips/pci/pci-rt2880.c
arch/mips/pmcs-msp71xx/msp_setup.c
arch/mips/sni/reset.c
arch/mips/vdso/Makefile
arch/parisc/kernel/signal.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/net/bpf_jit_comp.c
arch/s390/kernel/dis.c
arch/sparc/include/asm/elf_64.h
arch/sparc/include/uapi/asm/unistd.h
arch/sparc/kernel/head_64.S
arch/sparc/kernel/perf_event.c
arch/sparc/kernel/rtrap_64.S
arch/sparc/kernel/setup_64.c
arch/sparc/kernel/systbls_32.S
arch/sparc/kernel/systbls_64.S
arch/sparc/lib/NG2copy_from_user.S
arch/sparc/lib/NG2copy_to_user.S
arch/sparc/lib/NG2memcpy.S
arch/sparc/lib/NG4copy_from_user.S
arch/sparc/lib/NG4copy_to_user.S
arch/sparc/lib/NG4memcpy.S
arch/sparc/lib/U1copy_from_user.S
arch/sparc/lib/U1copy_to_user.S
arch/sparc/lib/U1memcpy.S
arch/sparc/lib/U3copy_from_user.S
arch/sparc/lib/U3copy_to_user.S
arch/sparc/lib/U3memcpy.S
arch/sparc/net/bpf_jit_comp.c
arch/tile/Kconfig
arch/tile/include/asm/page.h
arch/x86/Kconfig
arch/x86/entry/common.c
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64_compat.S
arch/x86/entry/vdso/vdso32/system_call.S
arch/x86/include/asm/cpufeature.h
arch/x86/include/asm/iosf_mbi.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/paravirt_types.h
arch/x86/include/asm/processor.h
arch/x86/kernel/apic/apic_numachip.c
arch/x86/kernel/cpu/mcheck/mce.c
arch/x86/kernel/rtc.c
arch/x86/kvm/cpuid.h
arch/x86/kvm/i8254.c
arch/x86/kvm/mtrr.c
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c
arch/x86/lguest/boot.c
arch/x86/platform/atom/punit_atom_debug.c
arch/x86/platform/intel-quark/imr.c
arch/x86/um/signal.c
arch/x86/xen/enlighten.c
arch/x86/xen/suspend.c
block/blk-core.c
crypto/algif_skcipher.c
crypto/async_tx/async_memcpy.c
crypto/async_tx/async_pq.c
crypto/async_tx/async_raid6_recov.c
crypto/async_tx/async_xor.c
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/acpi_apd.c
drivers/acpi/acpi_dbg.c [new file with mode: 0644]
drivers/acpi/acpi_lpss.c
drivers/acpi/acpi_video.c
drivers/acpi/acpica/Makefile
drivers/acpi/acpica/acapps.h
drivers/acpi/acpica/acdebug.h
drivers/acpi/acpica/acevents.h
drivers/acpi/acpica/acglobal.h
drivers/acpi/acpica/aclocal.h
drivers/acpi/acpica/acmacros.h
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/acobject.h
drivers/acpi/acpica/acopcode.h
drivers/acpi/acpica/acparser.h
drivers/acpi/acpica/acutils.h
drivers/acpi/acpica/amlcode.h
drivers/acpi/acpica/dbcmds.c
drivers/acpi/acpica/dbdisply.c
drivers/acpi/acpica/dbfileio.c
drivers/acpi/acpica/dbinput.c
drivers/acpi/acpica/dbnames.c
drivers/acpi/acpica/dbstats.c
drivers/acpi/acpica/dbtest.c
drivers/acpi/acpica/dbutils.c
drivers/acpi/acpica/dbxface.c
drivers/acpi/acpica/dsargs.c
drivers/acpi/acpica/dscontrol.c
drivers/acpi/acpica/dsdebug.c
drivers/acpi/acpica/dsfield.c
drivers/acpi/acpica/dsinit.c
drivers/acpi/acpica/dsmethod.c
drivers/acpi/acpica/dsmthdat.c
drivers/acpi/acpica/dsobject.c
drivers/acpi/acpica/dsopcode.c
drivers/acpi/acpica/dsutils.c
drivers/acpi/acpica/dswexec.c
drivers/acpi/acpica/dswload.c
drivers/acpi/acpica/dswload2.c
drivers/acpi/acpica/dswscope.c
drivers/acpi/acpica/evgpe.c
drivers/acpi/acpica/evgpeblk.c
drivers/acpi/acpica/evgpeutil.c
drivers/acpi/acpica/evhandler.c
drivers/acpi/acpica/evmisc.c
drivers/acpi/acpica/evregion.c
drivers/acpi/acpica/evrgnini.c
drivers/acpi/acpica/evxface.c
drivers/acpi/acpica/evxfregn.c
drivers/acpi/acpica/exconfig.c
drivers/acpi/acpica/exconvrt.c
drivers/acpi/acpica/excreate.c
drivers/acpi/acpica/exdebug.c
drivers/acpi/acpica/exdump.c
drivers/acpi/acpica/exfield.c
drivers/acpi/acpica/exfldio.c
drivers/acpi/acpica/exmisc.c
drivers/acpi/acpica/exmutex.c
drivers/acpi/acpica/exnames.c
drivers/acpi/acpica/exoparg1.c
drivers/acpi/acpica/exoparg2.c
drivers/acpi/acpica/exoparg3.c
drivers/acpi/acpica/exoparg6.c
drivers/acpi/acpica/exprep.c
drivers/acpi/acpica/exregion.c
drivers/acpi/acpica/exresnte.c
drivers/acpi/acpica/exresolv.c
drivers/acpi/acpica/exresop.c
drivers/acpi/acpica/exstore.c
drivers/acpi/acpica/exstorob.c
drivers/acpi/acpica/exsystem.c
drivers/acpi/acpica/extrace.c [new file with mode: 0644]
drivers/acpi/acpica/exutils.c
drivers/acpi/acpica/hwesleep.c
drivers/acpi/acpica/hwgpe.c
drivers/acpi/acpica/hwsleep.c
drivers/acpi/acpica/hwxface.c
drivers/acpi/acpica/hwxfsleep.c
drivers/acpi/acpica/nsconvert.c
drivers/acpi/acpica/nsdump.c
drivers/acpi/acpica/nseval.c
drivers/acpi/acpica/nsinit.c
drivers/acpi/acpica/nsload.c
drivers/acpi/acpica/nsnames.c
drivers/acpi/acpica/nsparse.c
drivers/acpi/acpica/nsprepkg.c
drivers/acpi/acpica/nsrepair.c
drivers/acpi/acpica/nsrepair2.c
drivers/acpi/acpica/nssearch.c
drivers/acpi/acpica/nsutils.c
drivers/acpi/acpica/nsxfeval.c
drivers/acpi/acpica/nsxfname.c
drivers/acpi/acpica/nsxfobj.c
drivers/acpi/acpica/psargs.c
drivers/acpi/acpica/psloop.c
drivers/acpi/acpica/psopcode.c
drivers/acpi/acpica/psparse.c
drivers/acpi/acpica/psutils.c
drivers/acpi/acpica/pswalk.c
drivers/acpi/acpica/rsaddr.c
drivers/acpi/acpica/rscalc.c
drivers/acpi/acpica/rscreate.c
drivers/acpi/acpica/rsdump.c
drivers/acpi/acpica/rslist.c
drivers/acpi/acpica/rsmisc.c
drivers/acpi/acpica/rsutils.c
drivers/acpi/acpica/rsxface.c
drivers/acpi/acpica/tbdata.c
drivers/acpi/acpica/tbinstal.c
drivers/acpi/acpica/tbprint.c
drivers/acpi/acpica/tbutils.c
drivers/acpi/acpica/tbxfload.c
drivers/acpi/acpica/utaddress.c
drivers/acpi/acpica/utcopy.c
drivers/acpi/acpica/utdecode.c
drivers/acpi/acpica/utdelete.c
drivers/acpi/acpica/uterror.c
drivers/acpi/acpica/utfileio.c [deleted file]
drivers/acpi/acpica/uthex.c
drivers/acpi/acpica/utids.c
drivers/acpi/acpica/utinit.c
drivers/acpi/acpica/utmath.c
drivers/acpi/acpica/utmisc.c
drivers/acpi/acpica/utmutex.c
drivers/acpi/acpica/utnonansi.c
drivers/acpi/acpica/utobject.c
drivers/acpi/acpica/utosi.c
drivers/acpi/acpica/utownerid.c
drivers/acpi/acpica/utpredef.c
drivers/acpi/acpica/utprint.c
drivers/acpi/acpica/utresrc.c
drivers/acpi/acpica/utstate.c
drivers/acpi/acpica/utstring.c
drivers/acpi/acpica/uttrack.c
drivers/acpi/acpica/utxface.c
drivers/acpi/acpica/utxferror.c
drivers/acpi/acpica/utxfinit.c
drivers/acpi/acpica/utxfmutex.c
drivers/acpi/bus.c
drivers/acpi/device_sysfs.c
drivers/acpi/internal.h
drivers/acpi/osl.c
drivers/acpi/processor_driver.c
drivers/acpi/property.c
drivers/acpi/scan.c
drivers/acpi/sleep.c
drivers/acpi/sleep.h
drivers/acpi/utils.c
drivers/acpi/video_detect.c
drivers/base/core.c
drivers/base/dd.c
drivers/base/platform.c
drivers/base/power/clock_ops.c
drivers/base/property.c
drivers/block/null_blk.c
drivers/bus/sunxi-rsb.c
drivers/connector/connector.c
drivers/cpufreq/scpi-cpufreq.c
drivers/dma/dw/core.c
drivers/dma/dw/platform.c
drivers/dma/mic_x100_dma.c
drivers/dma/xgene-dma.c
drivers/firmware/dmi_scan.c
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_stolen.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/bios/fan.c
drivers/i2c/busses/i2c-designware-baytrail.c
drivers/i2c/busses/i2c-designware-platdrv.c
drivers/infiniband/core/cma.c
drivers/infiniband/hw/mlx4/srq.c
drivers/infiniband/hw/ocrdma/ocrdma.h
drivers/infiniband/hw/ocrdma/ocrdma_hw.c
drivers/infiniband/hw/ocrdma/ocrdma_hw.h
drivers/infiniband/hw/ocrdma/ocrdma_main.c
drivers/infiniband/hw/ocrdma/ocrdma_sli.h
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/iommu/dma-iommu.c
drivers/iommu/ipmmu-vmsa.c
drivers/lightnvm/gennvm.c
drivers/md/md.c
drivers/memory/fsl_ifc.c
drivers/mfd/intel-lpss-acpi.c
drivers/mfd/intel-lpss-pci.c
drivers/mfd/intel-lpss.c
drivers/mfd/intel-lpss.h
drivers/mfd/mfd-core.c
drivers/mtd/mtdcore.c
drivers/mtd/spi-nor/spi-nor.c
drivers/mtd/ubi/debug.c
drivers/mtd/ubi/io.c
drivers/mtd/ubi/wl.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/emulex/benet/be_roce.c
drivers/net/ethernet/emulex/benet/be_roce.h
drivers/net/ethernet/mellanox/mlx4/en_clock.c
drivers/net/ethernet/mellanox/mlx4/en_main.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/natsemi/natsemi.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
drivers/net/ethernet/renesas/sh_eth.c
drivers/net/ethernet/renesas/sh_eth.h
drivers/net/ethernet/ti/cpsw.c
drivers/net/geneve.c
drivers/net/hamradio/6pack.c
drivers/net/hamradio/mkiss.c
drivers/net/usb/cdc_mbim.c
drivers/net/usb/cdc_ncm.c
drivers/net/usb/qmi_wwan.c
drivers/net/usb/r8152.c
drivers/net/veth.c
drivers/net/vmxnet3/vmxnet3_drv.c
drivers/net/vmxnet3/vmxnet3_int.h
drivers/net/vrf.c
drivers/net/wireless/iwlwifi/iwl-7000.c
drivers/net/wireless/iwlwifi/mvm/sta.c
drivers/nvme/host/pci.c
drivers/pci/host/Kconfig
drivers/pci/host/pcie-hisi.c
drivers/platform/x86/dell-wmi.c
drivers/platform/x86/thinkpad_acpi.c
drivers/powercap/intel_rapl.c
drivers/s390/crypto/ap_bus.c
drivers/s390/virtio/virtio_ccw.c
drivers/scsi/sd.c
drivers/thermal/intel_quark_dts_thermal.c
drivers/thermal/intel_soc_dts_iosf.c
drivers/tty/serial/sunhv.c
fs/nfsd/nfs4layouts.c
fs/ocfs2/dlm/dlmmaster.c
fs/ocfs2/locks.c
fs/ocfs2/resize.c
include/acpi/acexcep.h
include/acpi/acpi_bus.h
include/acpi/acpiosxf.h
include/acpi/acpixf.h
include/acpi/actypes.h
include/acpi/platform/aclinux.h
include/acpi/platform/aclinuxex.h
include/acpi/video.h
include/linux/acpi.h
include/linux/blkdev.h
include/linux/device.h
include/linux/filter.h
include/linux/ftrace.h
include/linux/mfd/core.h
include/linux/mtd/spi-nor.h
include/linux/platform_device.h
include/linux/property.h
include/linux/sched.h
include/linux/usb/cdc_ncm.h
include/linux/vmstat.h
include/net/l3mdev.h
include/net/route.h
include/sound/soc.h
kernel/events/core.c
kernel/fork.c
kernel/irq/manage.c
kernel/module.c
kernel/sched/fair.c
kernel/trace/trace_printk.c
lib/rhashtable.c
mm/memcontrol.c
mm/memory_hotplug.c
mm/vmstat.c
net/bridge/br_stp_if.c
net/core/dst.c
net/ipv4/ipip.c
net/ipv4/raw.c
net/ipv4/tcp_input.c
net/ipv4/udp.c
net/ipv4/xfrm4_policy.c
net/ipv6/addrconf.c
net/ipv6/addrlabel.c
net/ipv6/ndisc.c
net/ipv6/xfrm6_policy.c
net/netfilter/nf_tables_netdev.c
net/netfilter/nft_ct.c
net/openvswitch/conntrack.c
net/openvswitch/flow_netlink.c
net/sched/sch_generic.c
net/sctp/sm_statefuns.c
net/sctp/socket.c
net/socket.c
net/unix/af_unix.c
net/xfrm/xfrm_policy.c
scripts/recordmcount.c
security/keys/keyctl.c
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_realtek.c
sound/soc/codecs/arizona.c
sound/soc/codecs/es8328.c
sound/soc/codecs/es8328.h
sound/soc/codecs/rt5645.c
sound/soc/codecs/rt5645.h
sound/soc/codecs/sgtl5000.c
sound/soc/codecs/wm8974.c
sound/soc/davinci/davinci-mcasp.c
sound/soc/fsl/fsl_sai.c
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.h
sound/soc/rockchip/rockchip_spdif.c
sound/soc/rockchip/rockchip_spdif.h
tools/perf/builtin-buildid-list.c
tools/perf/ui/browsers/hists.c
tools/perf/util/build-id.c
tools/perf/util/parse-events.c
tools/power/acpi/Makefile
tools/power/acpi/common/getopt.c
tools/power/acpi/os_specific/service_layers/oslibcfs.c
tools/power/acpi/tools/acpidbg/Makefile [new file with mode: 0644]
tools/power/acpi/tools/acpidbg/acpidbg.c [new file with mode: 0644]
tools/power/acpi/tools/acpidump/apfiles.c
virt/kvm/arm/vgic.c

index 9853f8e..28a4781 100644 (file)
@@ -40,18 +40,18 @@ Optional properties:
 
 Slave Properties:
 Required properties:
-- phy_id               : Specifies slave phy id
 - phy-mode             : See ethernet.txt file in the same directory
 
 Optional properties:
 - dual_emac_res_vlan   : Specifies VID to be used to segregate the ports
 - mac-address          : See ethernet.txt file in the same directory
+- phy_id               : Specifies slave phy id
 - phy-handle           : See ethernet.txt file in the same directory
 
 Slave sub-nodes:
 - fixed-link           : See fixed-link.txt file in the same directory
-                         Either the properties phy_id and phy-mode,
-                         or the sub-node fixed-link can be specified
+                         Either the property phy_id, or the sub-node
+                         fixed-link can be specified
 
 Note: "ti,hwmods" field is used to fetch the base address and irq
 resources from TI, omap hwmod data base during device registration.
index 4e2b18d..70dea02 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 4
 PATCHLEVEL = 4
 SUBLEVEL = 0
-EXTRAVERSION = -rc6
+EXTRAVERSION =
 NAME = Blurry Fish Butt
 
 # *DOCUMENTATION*
index cf0cf34..aeb1902 100644 (file)
@@ -81,7 +81,7 @@ endif
 LIBGCC := $(shell $(CC) $(cflags-y) --print-libgcc-file-name)
 
 # Modules with short calls might break for calls into builtin-kernel
-KBUILD_CFLAGS_MODULE   += -mlong-calls
+KBUILD_CFLAGS_MODULE   += -mlong-calls -mno-millicode
 
 # Finally dump eveything into kernel build system
 KBUILD_CFLAGS  += $(cflags-y)
index abf06e8..210ef3e 100644 (file)
@@ -62,9 +62,7 @@ extern int ioc_exists;
 #define ARC_REG_IC_IVIC                0x10
 #define ARC_REG_IC_CTRL                0x11
 #define ARC_REG_IC_IVIL                0x19
-#if defined(CONFIG_ARC_MMU_V3) || defined(CONFIG_ARC_MMU_V4)
 #define ARC_REG_IC_PTAG                0x1E
-#endif
 #define ARC_REG_IC_PTAG_HI     0x1F
 
 /* Bit val in IC_CTRL */
index cf2828a..5eb7076 100644 (file)
@@ -293,13 +293,13 @@ static void init_unwind_hdr(struct unwind_table *table,
                const u32 *cie = cie_for_fde(fde, table);
                signed ptrType;
 
-               if (cie == &not_fde)    /* only process FDE here */
+               if (cie == &not_fde)
                        continue;
                if (cie == NULL || cie == &bad_cie)
-                       continue;       /* say FDE->CIE.version != 1 */
+                       goto ret_err;
                ptrType = fde_pointer_type(cie);
                if (ptrType < 0)
-                       continue;
+                       goto ret_err;
 
                ptr = (const u8 *)(fde + 2);
                if (!read_pointer(&ptr, (const u8 *)(fde + 1) + *fde,
@@ -315,14 +315,14 @@ static void init_unwind_hdr(struct unwind_table *table,
        }
 
        if (tableSize || !n)
-               return;
+               goto ret_err;
 
        hdrSize = 4 + sizeof(unsigned long) + sizeof(unsigned int)
            + 2 * n * sizeof(unsigned long);
 
        header = alloc(hdrSize);
        if (!header)
-               return;
+               goto ret_err;
 
        header->version = 1;
        header->eh_frame_ptr_enc = DW_EH_PE_abs | DW_EH_PE_native;
@@ -343,10 +343,6 @@ static void init_unwind_hdr(struct unwind_table *table,
 
                if (fde[1] == 0xffffffff)
                        continue;       /* this is a CIE */
-
-               if (*(u8 *)(cie + 2) != 1)
-                       continue;       /* FDE->CIE.version not supported */
-
                ptr = (const u8 *)(fde + 2);
                header->table[n].start = read_pointer(&ptr,
                                                      (const u8 *)(fde + 1) +
@@ -365,6 +361,10 @@ static void init_unwind_hdr(struct unwind_table *table,
        table->hdrsz = hdrSize;
        smp_wmb();
        table->header = (const void *)header;
+       return;
+
+ret_err:
+       panic("Attention !!! Dwarf FDE parsing errors\n");;
 }
 
 #ifdef CONFIG_MODULES
@@ -523,8 +523,7 @@ static const u32 *cie_for_fde(const u32 *fde, const struct unwind_table *table)
 
        if (*cie <= sizeof(*cie) + 4 || *cie >= fde[1] - sizeof(*fde)
            || (*cie & (sizeof(*cie) - 1))
-           || (cie[1] != 0xffffffff)
-           || ( *(u8 *)(cie + 2) != 1))   /* version 1 supported */
+           || (cie[1] != 0xffffffff))
                return NULL;    /* this is not a (valid) CIE */
        return cie;
 }
@@ -605,9 +604,6 @@ static signed fde_pointer_type(const u32 *cie)
        const u8 *ptr = (const u8 *)(cie + 2);
        unsigned version = *ptr;
 
-       if (version != 1)
-               return -1;      /* unsupported */
-
        if (*++ptr) {
                const char *aug;
                const u8 *end = (const u8 *)(cie + 1) + *cie;
@@ -1019,9 +1015,7 @@ int arc_unwind(struct unwind_frame_info *frame)
                ptr = (const u8 *)(cie + 2);
                end = (const u8 *)(cie + 1) + *cie;
                frame->call_frame = 1;
-               if ((state.version = *ptr) != 1)
-                       cie = NULL;     /* unsupported version */
-               else if (*++ptr) {
+               if (*++ptr) {
                        /* check if augmentation size is first (thus present) */
                        if (*ptr == 'z') {
                                while (++ptr < end && *ptr) {
index 065ee6b..92dd92c 100644 (file)
@@ -111,7 +111,7 @@ void __kunmap_atomic(void *kv)
 }
 EXPORT_SYMBOL(__kunmap_atomic);
 
-noinline pte_t *alloc_kmap_pgtable(unsigned long kvaddr)
+static noinline pte_t * __init alloc_kmap_pgtable(unsigned long kvaddr)
 {
        pgd_t *pgd_k;
        pud_t *pud_k;
@@ -127,7 +127,7 @@ noinline pte_t *alloc_kmap_pgtable(unsigned long kvaddr)
        return pte_k;
 }
 
-void kmap_init(void)
+void __init kmap_init(void)
 {
        /* Due to recursive include hell, we can't do this in processor.h */
        BUILD_BUG_ON(PAGE_OFFSET < (VMALLOC_END + FIXMAP_SIZE + PKMAP_SIZE));
index 58adf17..a51834e 100644 (file)
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-reset-gpios = <&gpio1 30 GPIO_ACTIVE_HIGH>;
        status = "okay";
 };
index 7b31fdb..dc0cebf 100644 (file)
@@ -94,7 +94,7 @@
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-reset-gpios = <&gpio1 30 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
index 1b66328..18cd411 100644 (file)
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-reset-gpios = <&gpio1 30 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
index 7c51839..eea90f3 100644 (file)
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-reset-gpios = <&gpio1 30 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
index 929e0b3..6c11a2a 100644 (file)
 &fec {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet>;
-       phy-mode = "rgmii";
+       phy-mode = "rgmii-id";
        phy-reset-gpios = <&gpio1 30 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
index 8263fc1..d354d40 100644 (file)
 &clks {
        assigned-clocks = <&clks IMX6QDL_PLL4_BYPASS_SRC>,
                          <&clks IMX6QDL_PLL4_BYPASS>,
-                         <&clks IMX6QDL_CLK_PLL4_POST_DIV>,
                          <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
-                         <&clks IMX6QDL_CLK_LDB_DI1_SEL>;
+                         <&clks IMX6QDL_CLK_LDB_DI1_SEL>,
+                         <&clks IMX6QDL_CLK_PLL4_POST_DIV>;
        assigned-clock-parents = <&clks IMX6QDL_CLK_LVDS2_IN>,
                                 <&clks IMX6QDL_PLL4_BYPASS_SRC>,
                                 <&clks IMX6QDL_CLK_PLL3_USB_OTG>,
                                 <&clks IMX6QDL_CLK_PLL3_USB_OTG>;
-       assigned-clock-rates = <0>, <0>, <24576000>;
+       assigned-clock-rates = <0>, <0>, <0>, <0>, <24576000>;
 };
 
 &ecspi1 {
index 1a78f01..b75f7b2 100644 (file)
        };
 };
 
+&uart3 {
+       interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH
+                              &omap4_pmx_core OMAP4_UART3_RX>;
+};
index 314f59c..d0c7438 100644 (file)
@@ -25,9 +25,9 @@
                cache-sets = <512>;
                cache-line-size = <32>;
                /* At full speed latency must be >=2 */
-               arm,tag-latency = <2>;
-               arm,data-latency = <2 2>;
-               arm,dirty-latency = <2>;
+               arm,tag-latency = <8>;
+               arm,data-latency = <8 8>;
+               arm,dirty-latency = <8>;
        };
 
        mtu0: mtu@101e2000 {
index 2d4250b..68b479b 100644 (file)
@@ -83,6 +83,7 @@
                reg = <0x5d>;
                interrupt-parent = <&pio>;
                interrupts = <0 3 IRQ_TYPE_LEVEL_HIGH>; /* PA3 */
+               touchscreen-swapped-x-y;
        };
 };
 
index 40c23a0..ec1aa64 100644 (file)
 
        /* CPU DFLL clock */
        clock@0,70110000 {
-               status = "okay";
+               status = "disabled";
                vdd-cpu-supply = <&vdd_cpu>;
                nvidia,i2c-fs-rate = <400000>;
        };
index 01f4019..3279bf1 100644 (file)
                        interrupt-parent = <&vic>;
                        interrupts = <31>; /* Cascaded to vic */
                        clear-mask = <0xffffffff>;
-                       valid-mask = <0xffc203f8>;
+                       /*
+                        * Valid interrupt lines mask according to
+                        * table 4-36 page 4-50 of ARM DUI 0225D
+                        */
+                       valid-mask = <0x0760031b>;
                };
 
                dma@10130000 {
                        };
                        mmc@5000 {
                                compatible = "arm,pl180", "arm,primecell";
-                               reg = < 0x5000 0x1000>;
-                               interrupts-extended = <&vic 22 &sic 2>;
+                               reg = <0x5000 0x1000>;
+                               interrupts-extended = <&vic 22 &sic 1>;
                                clocks = <&xtal24mhz>, <&pclk>;
                                clock-names = "mclk", "apb_pclk";
                        };
index b83137f..33a8eb2 100644 (file)
@@ -5,6 +5,16 @@
        compatible = "arm,versatile-pb";
 
        amba {
+               /* The Versatile PB is using more SIC IRQ lines than the AB */
+               sic: intc@10003000 {
+                       clear-mask = <0xffffffff>;
+                       /*
+                        * Valid interrupt lines mask according to
+                        * figure 3-30 page 3-74 of ARM DUI 0224B
+                        */
+                       valid-mask = <0x7fe003ff>;
+               };
+
                gpio2: gpio@101e6000 {
                        compatible = "arm,pl061", "arm,primecell";
                        reg = <0x101e6000 0x1000>;
                };
 
                fpga {
+                       mmc@5000 {
+                               /*
+                                * Overrides the interrupt assignment from
+                                * the Versatile AB board file.
+                                */
+                               interrupts-extended = <&sic 22 &sic 23>;
+                       };
                        uart@9000 {
                                compatible = "arm,pl011", "arm,primecell";
                                reg = <0x9000 0x1000>;
                        mmc@b000 {
                                compatible = "arm,pl180", "arm,primecell";
                                reg = <0xb000 0x1000>;
-                               interrupts-extended = <&vic 23 &sic 2>;
+                               interrupt-parent = <&sic>;
+                               interrupts = <1>, <2>;
                                clocks = <&xtal24mhz>, <&pclk>;
                                clock-names = "mclk", "apb_pclk";
                        };
index b1c59a7..e12213d 100644 (file)
                        interrupts = <43>;
                };
 
+               sdhc@d800a000 {
+                       compatible = "wm,wm8505-sdhc";
+                       reg = <0xd800a000 0x400>;
+                       interrupts = <20>, <21>;
+                       clocks = <&clksdhc>;
+                       bus-width = <4>;
+                       sdon-inverted;
+               };
+
                fb: fb@d8050800 {
                        compatible = "wm,wm8505-fb";
                        reg = <0xd8050800 0x200>;
index 69a22fd..cd7b198 100644 (file)
@@ -366,6 +366,7 @@ CONFIG_BATTERY_MAX17042=m
 CONFIG_CHARGER_MAX14577=m
 CONFIG_CHARGER_MAX77693=m
 CONFIG_CHARGER_TPS65090=y
+CONFIG_AXP20X_POWER=m
 CONFIG_POWER_RESET_AS3722=y
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_POWER_RESET_GPIO_RESTART=y
index 3c36e16..b503a89 100644 (file)
@@ -84,6 +84,7 @@ CONFIG_SPI_SUN4I=y
 CONFIG_SPI_SUN6I=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_POWER_SUPPLY=y
+CONFIG_AXP20X_POWER=y
 CONFIG_THERMAL=y
 CONFIG_CPU_THERMAL=y
 CONFIG_WATCHDOG=y
index b83f3b7..087acb5 100644 (file)
@@ -193,15 +193,44 @@ struct oabi_flock64 {
        pid_t   l_pid;
 } __attribute__ ((packed,aligned(4)));
 
-asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd,
+static long do_locks(unsigned int fd, unsigned int cmd,
                                 unsigned long arg)
 {
-       struct oabi_flock64 user;
        struct flock64 kernel;
-       mm_segment_t fs = USER_DS; /* initialized to kill a warning */
-       unsigned long local_arg = arg;
-       int ret;
+       struct oabi_flock64 user;
+       mm_segment_t fs;
+       long ret;
+
+       if (copy_from_user(&user, (struct oabi_flock64 __user *)arg,
+                          sizeof(user)))
+               return -EFAULT;
+       kernel.l_type   = user.l_type;
+       kernel.l_whence = user.l_whence;
+       kernel.l_start  = user.l_start;
+       kernel.l_len    = user.l_len;
+       kernel.l_pid    = user.l_pid;
+
+       fs = get_fs();
+       set_fs(KERNEL_DS);
+       ret = sys_fcntl64(fd, cmd, (unsigned long)&kernel);
+       set_fs(fs);
+
+       if (!ret && (cmd == F_GETLK64 || cmd == F_OFD_GETLK)) {
+               user.l_type     = kernel.l_type;
+               user.l_whence   = kernel.l_whence;
+               user.l_start    = kernel.l_start;
+               user.l_len      = kernel.l_len;
+               user.l_pid      = kernel.l_pid;
+               if (copy_to_user((struct oabi_flock64 __user *)arg,
+                                &user, sizeof(user)))
+                       ret = -EFAULT;
+       }
+       return ret;
+}
 
+asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd,
+                                unsigned long arg)
+{
        switch (cmd) {
        case F_OFD_GETLK:
        case F_OFD_SETLK:
@@ -209,39 +238,11 @@ asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd,
        case F_GETLK64:
        case F_SETLK64:
        case F_SETLKW64:
-               if (copy_from_user(&user, (struct oabi_flock64 __user *)arg,
-                                  sizeof(user)))
-                       return -EFAULT;
-               kernel.l_type   = user.l_type;
-               kernel.l_whence = user.l_whence;
-               kernel.l_start  = user.l_start;
-               kernel.l_len    = user.l_len;
-               kernel.l_pid    = user.l_pid;
-               local_arg = (unsigned long)&kernel;
-               fs = get_fs();
-               set_fs(KERNEL_DS);
-       }
-
-       ret = sys_fcntl64(fd, cmd, local_arg);
+               return do_locks(fd, cmd, arg);
 
-       switch (cmd) {
-       case F_GETLK64:
-               if (!ret) {
-                       user.l_type     = kernel.l_type;
-                       user.l_whence   = kernel.l_whence;
-                       user.l_start    = kernel.l_start;
-                       user.l_len      = kernel.l_len;
-                       user.l_pid      = kernel.l_pid;
-                       if (copy_to_user((struct oabi_flock64 __user *)arg,
-                                        &user, sizeof(user)))
-                               ret = -EFAULT;
-               }
-       case F_SETLK64:
-       case F_SETLKW64:
-               set_fs(fs);
+       default:
+               return sys_fcntl64(fd, cmd, arg);
        }
-
-       return ret;
 }
 
 struct oabi_epoll_event {
index 4b4371d..0517f0c 100644 (file)
@@ -65,6 +65,8 @@ config SOC_AM43XX
        select MACH_OMAP_GENERIC
        select MIGHT_HAVE_CACHE_L2X0
        select HAVE_ARM_SCU
+       select GENERIC_CLOCKEVENTS_BROADCAST
+       select HAVE_ARM_TWD
 
 config SOC_DRA7XX
        bool "TI DRA7XX"
index 17a6f75..7b76ce0 100644 (file)
@@ -149,8 +149,8 @@ static int omap2_onenand_get_freq(struct omap_onenand_platform_data *cfg,
                freq = 104;
                break;
        default:
-               freq = 54;
-               break;
+               pr_err("onenand rate not detected, bad GPMC async timings?\n");
+               freq = 0;
        }
 
        return freq;
@@ -271,6 +271,11 @@ static int omap2_onenand_setup_async(void __iomem *onenand_base)
        struct gpmc_timings t;
        int ret;
 
+       /*
+        * Note that we need to keep sync_write set for the call to
+        * omap2_onenand_set_async_mode() to work to detect the onenand
+        * supported clock rate for the sync timings.
+        */
        if (gpmc_onenand_data->of_node) {
                gpmc_read_settings_dt(gpmc_onenand_data->of_node,
                                      &onenand_async);
@@ -281,12 +286,9 @@ static int omap2_onenand_setup_async(void __iomem *onenand_base)
                        else
                                gpmc_onenand_data->flags |= ONENAND_SYNC_READ;
                        onenand_async.sync_read = false;
-                       onenand_async.sync_write = false;
                }
        }
 
-       omap2_onenand_set_async_mode(onenand_base);
-
        omap2_onenand_calc_async_timings(&t);
 
        ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async);
@@ -310,6 +312,8 @@ static int omap2_onenand_setup_sync(void __iomem *onenand_base, int *freq_ptr)
        if (!freq) {
                /* Very first call freq is not known */
                freq = omap2_onenand_get_freq(gpmc_onenand_data, onenand_base);
+               if (!freq)
+                       return -ENODEV;
                set_onenand_cfg(onenand_base);
        }
 
index b18ebbe..f86692d 100644 (file)
@@ -320,6 +320,12 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
        return r;
 }
 
+#if !defined(CONFIG_SMP) && defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST)
+void tick_broadcast(const struct cpumask *mask)
+{
+}
+#endif
+
 static void __init omap2_gp_clockevent_init(int gptimer_id,
                                                const char *fck_source,
                                                const char *property)
index 591f9db..93d0b6d 100644 (file)
@@ -187,19 +187,6 @@ static inline int mem_words_used(struct jit_ctx *ctx)
        return fls(ctx->seen & SEEN_MEM);
 }
 
-static inline bool is_load_to_a(u16 inst)
-{
-       switch (inst) {
-       case BPF_LD | BPF_W | BPF_LEN:
-       case BPF_LD | BPF_W | BPF_ABS:
-       case BPF_LD | BPF_H | BPF_ABS:
-       case BPF_LD | BPF_B | BPF_ABS:
-               return true;
-       default:
-               return false;
-       }
-}
-
 static void jit_fill_hole(void *area, unsigned int size)
 {
        u32 *ptr;
@@ -211,7 +198,6 @@ static void jit_fill_hole(void *area, unsigned int size)
 static void build_prologue(struct jit_ctx *ctx)
 {
        u16 reg_set = saved_regs(ctx);
-       u16 first_inst = ctx->skf->insns[0].code;
        u16 off;
 
 #ifdef CONFIG_FRAME_POINTER
@@ -241,7 +227,7 @@ static void build_prologue(struct jit_ctx *ctx)
                emit(ARM_MOV_I(r_X, 0), ctx);
 
        /* do not leak kernel data to userspace */
-       if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
+       if (bpf_needs_clear_a(&ctx->skf->insns[0]))
                emit(ARM_MOV_I(r_A, 0), ctx);
 
        /* stack space for the BPF_MEM words */
@@ -770,7 +756,8 @@ load_ind:
                case BPF_ALU | BPF_RSH | BPF_K:
                        if (unlikely(k > 31))
                                return -1;
-                       emit(ARM_LSR_I(r_A, r_A, k), ctx);
+                       if (k)
+                               emit(ARM_LSR_I(r_A, r_A, k), ctx);
                        break;
                case BPF_ALU | BPF_RSH | BPF_X:
                        update_on_xread(ctx);
index fd104bd..860e440 100644 (file)
@@ -3,6 +3,7 @@ generic-y += clkdev.h
 generic-y += cputime.h
 generic-y += exec.h
 generic-y += irq_work.h
+generic-y += kvm_para.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
 generic-y += module.h
index 61b8931..4b0f5e0 100644 (file)
@@ -168,13 +168,21 @@ static inline void _writel(unsigned long l, unsigned long addr)
 #define writew_relaxed writew
 #define writel_relaxed writel
 
-#define ioread8 read
+#define ioread8 readb
 #define ioread16 readw
 #define ioread32 readl
 #define iowrite8 writeb
 #define iowrite16 writew
 #define iowrite32 writel
 
+#define ioread8_rep(p, dst, count) insb((unsigned long)(p), (dst), (count))
+#define ioread16_rep(p, dst, count) insw((unsigned long)(p), (dst), (count))
+#define ioread32_rep(p, dst, count) insl((unsigned long)(p), (dst), (count))
+
+#define iowrite8_rep(p, src, count) outsb((unsigned long)(p), (src), (count))
+#define iowrite16_rep(p, src, count) outsw((unsigned long)(p), (src), (count))
+#define iowrite32_rep(p, src, count) outsl((unsigned long)(p), (src), (count))
+
 #define ioread16be(addr)       be16_to_cpu(readw(addr))
 #define ioread32be(addr)       be32_to_cpu(readl(addr))
 #define iowrite16be(v, addr)   writew(cpu_to_be16(v), (addr))
index 5305d69..095ecaf 100644 (file)
@@ -599,7 +599,7 @@ extern void __put_user_unknown(void);
  * On error, the variable @x is set to zero.
  */
 #define __get_user_unaligned(x,ptr) \
-       __get_user__unalignednocheck((x),(ptr),sizeof(*(ptr)))
+       __get_user_unaligned_nocheck((x),(ptr),sizeof(*(ptr)))
 
 /*
  * Yuck.  We need two variants, one for 64bit operation and one
@@ -620,8 +620,8 @@ extern void __get_user_unaligned_unknown(void);
 do {                                                                   \
        switch (size) {                                                 \
        case 1: __get_data_asm(val, "lb", ptr); break;                  \
-       case 2: __get_user_unaligned_asm(val, "ulh", ptr); break;       \
-       case 4: __get_user_unaligned_asm(val, "ulw", ptr); break;       \
+       case 2: __get_data_unaligned_asm(val, "ulh", ptr); break;       \
+       case 4: __get_data_unaligned_asm(val, "ulw", ptr); break;       \
        case 8: __GET_USER_UNALIGNED_DW(val, ptr); break;               \
        default: __get_user_unaligned_unknown(); break;                 \
        }                                                               \
@@ -1122,9 +1122,15 @@ extern size_t __copy_in_user_eva(void *__to, const void *__from, size_t __n);
        __cu_to = (to);                                                 \
        __cu_from = (from);                                             \
        __cu_len = (n);                                                 \
-       might_fault();                                                  \
-       __cu_len = __invoke_copy_from_user(__cu_to, __cu_from,          \
-                                          __cu_len);                   \
+       if (eva_kernel_access()) {                                      \
+               __cu_len = __invoke_copy_from_kernel(__cu_to,           \
+                                                    __cu_from,         \
+                                                    __cu_len);         \
+       } else {                                                        \
+               might_fault();                                          \
+               __cu_len = __invoke_copy_from_user(__cu_to, __cu_from,  \
+                                                  __cu_len);           \
+       }                                                               \
        __cu_len;                                                       \
 })
 
@@ -1229,16 +1235,28 @@ __clear_user(void __user *addr, __kernel_size_t size)
 {
        __kernel_size_t res;
 
-       might_fault();
-       __asm__ __volatile__(
-               "move\t$4, %1\n\t"
-               "move\t$5, $0\n\t"
-               "move\t$6, %2\n\t"
-               __MODULE_JAL(__bzero)
-               "move\t%0, $6"
-               : "=r" (res)
-               : "r" (addr), "r" (size)
-               : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31");
+       if (eva_kernel_access()) {
+               __asm__ __volatile__(
+                       "move\t$4, %1\n\t"
+                       "move\t$5, $0\n\t"
+                       "move\t$6, %2\n\t"
+                       __MODULE_JAL(__bzero_kernel)
+                       "move\t%0, $6"
+                       : "=r" (res)
+                       : "r" (addr), "r" (size)
+                       : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31");
+       } else {
+               might_fault();
+               __asm__ __volatile__(
+                       "move\t$4, %1\n\t"
+                       "move\t$5, $0\n\t"
+                       "move\t$6, %2\n\t"
+                       __MODULE_JAL(__bzero)
+                       "move\t%0, $6"
+                       : "=r" (res)
+                       : "r" (addr), "r" (size)
+                       : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31");
+       }
 
        return res;
 }
@@ -1384,7 +1402,7 @@ static inline long strlen_user(const char __user *s)
                might_fault();
                __asm__ __volatile__(
                        "move\t$4, %1\n\t"
-                       __MODULE_JAL(__strlen_kernel_asm)
+                       __MODULE_JAL(__strlen_user_asm)
                        "move\t%0, $2"
                        : "=r" (res)
                        : "r" (s)
index 8fd5a27..ac81edd 100644 (file)
@@ -257,7 +257,6 @@ LEAF(mips_cps_core_init)
        has_mt  t0, 3f
 
        .set    push
-       .set    mips64r2
        .set    mt
 
        /* Only allow 1 TC per VPE to execute... */
@@ -376,7 +375,6 @@ LEAF(mips_cps_boot_vpes)
         nop
 
        .set    push
-       .set    mips64r2
        .set    mt
 
 1:     /* Enter VPE configuration state */
index 291af0b..e2b6ab7 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/fpu.h>
 #include <asm/msa.h>
 
+extern void *__bzero_kernel(void *__s, size_t __count);
 extern void *__bzero(void *__s, size_t __count);
 extern long __strncpy_from_kernel_nocheck_asm(char *__to,
                                              const char *__from, long __len);
@@ -64,6 +65,7 @@ EXPORT_SYMBOL(__copy_from_user_eva);
 EXPORT_SYMBOL(__copy_in_user_eva);
 EXPORT_SYMBOL(__copy_to_user_eva);
 EXPORT_SYMBOL(__copy_user_inatomic_eva);
+EXPORT_SYMBOL(__bzero_kernel);
 #endif
 EXPORT_SYMBOL(__bzero);
 EXPORT_SYMBOL(__strncpy_from_kernel_nocheck_asm);
index b8e63fd..8f0019a 100644 (file)
@@ -283,6 +283,8 @@ LEAF(memset)
 1:
 #ifndef CONFIG_EVA
 FEXPORT(__bzero)
+#else
+FEXPORT(__bzero_kernel)
 #endif
        __BUILD_BZERO LEGACY_MODE
 
index 77cb273..1a8c960 100644 (file)
@@ -521,19 +521,6 @@ static inline u16 align_sp(unsigned int num)
        return num;
 }
 
-static bool is_load_to_a(u16 inst)
-{
-       switch (inst) {
-       case BPF_LD | BPF_W | BPF_LEN:
-       case BPF_LD | BPF_W | BPF_ABS:
-       case BPF_LD | BPF_H | BPF_ABS:
-       case BPF_LD | BPF_B | BPF_ABS:
-               return true;
-       default:
-               return false;
-       }
-}
-
 static void save_bpf_jit_regs(struct jit_ctx *ctx, unsigned offset)
 {
        int i = 0, real_off = 0;
@@ -614,7 +601,6 @@ static unsigned int get_stack_depth(struct jit_ctx *ctx)
 
 static void build_prologue(struct jit_ctx *ctx)
 {
-       u16 first_inst = ctx->skf->insns[0].code;
        int sp_off;
 
        /* Calculate the total offset for the stack pointer */
@@ -641,7 +627,7 @@ static void build_prologue(struct jit_ctx *ctx)
                emit_jit_reg_move(r_X, r_zero, ctx);
 
        /* Do not leak kernel data to userspace */
-       if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
+       if (bpf_needs_clear_a(&ctx->skf->insns[0]))
                emit_jit_reg_move(r_A, r_zero, ctx);
 }
 
index dbbeccc..a245cad 100644 (file)
@@ -221,7 +221,6 @@ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 static int rt288x_pci_probe(struct platform_device *pdev)
 {
        void __iomem *io_map_base;
-       int i;
 
        rt2880_pci_base = ioremap_nocache(RT2880_PCI_BASE, PAGE_SIZE);
 
index 78b2ef4..9d293b3 100644 (file)
@@ -39,7 +39,6 @@ extern void msp_serial_setup(void);
 void msp7120_reset(void)
 {
        void *start, *end, *iptr;
-       register int i;
 
        /* Diasble all interrupts */
        local_irq_disable();
index db8f88b..6afa343 100644 (file)
@@ -26,7 +26,7 @@ static inline void kb_wait(void)
 /* XXX This ends up at the ARC firmware prompt ...  */
 void sni_machine_restart(char *command)
 {
-       int i, j;
+       int i;
 
        /* This does a normal via the keyboard controller like a PC.
           We can do that easier ...  */
index ef5f348..1456890 100644 (file)
@@ -26,8 +26,8 @@ aflags-vdso := $(ccflags-vdso) \
 # the comments on that file.
 #
 ifndef CONFIG_CPU_MIPSR6
-  ifeq ($(call ld-ifversion, -gt, 22400000, y),)
-    $(warning MIPS VDSO requires binutils > 2.24)
+  ifeq ($(call ld-ifversion, -lt, 22500000, y),y)
+    $(warning MIPS VDSO requires binutils >= 2.25)
     obj-vdso-y := $(filter-out gettimeofday.o, $(obj-vdso-y))
     ccflags-vdso += -DDISABLE_MIPS_VDSO
   endif
index dc1ea79..2264f68 100644 (file)
@@ -435,6 +435,55 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs, int in_syscall)
                regs->gr[28]);
 }
 
+/*
+ * Check how the syscall number gets loaded into %r20 within
+ * the delay branch in userspace and adjust as needed.
+ */
+
+static void check_syscallno_in_delay_branch(struct pt_regs *regs)
+{
+       u32 opcode, source_reg;
+       u32 __user *uaddr;
+       int err;
+
+       /* Usually we don't have to restore %r20 (the system call number)
+        * because it gets loaded in the delay slot of the branch external
+        * instruction via the ldi instruction.
+        * In some cases a register-to-register copy instruction might have
+        * been used instead, in which case we need to copy the syscall
+        * number into the source register before returning to userspace.
+        */
+
+       /* A syscall is just a branch, so all we have to do is fiddle the
+        * return pointer so that the ble instruction gets executed again.
+        */
+       regs->gr[31] -= 8; /* delayed branching */
+
+       /* Get assembler opcode of code in delay branch */
+       uaddr = (unsigned int *) ((regs->gr[31] & ~3) + 4);
+       err = get_user(opcode, uaddr);
+       if (err)
+               return;
+
+       /* Check if delay branch uses "ldi int,%r20" */
+       if ((opcode & 0xffff0000) == 0x34140000)
+               return; /* everything ok, just return */
+
+       /* Check if delay branch uses "nop" */
+       if (opcode == INSN_NOP)
+               return;
+
+       /* Check if delay branch uses "copy %rX,%r20" */
+       if ((opcode & 0xffe0ffff) == 0x08000254) {
+               source_reg = (opcode >> 16) & 31;
+               regs->gr[source_reg] = regs->gr[20];
+               return;
+       }
+
+       pr_warn("syscall restart: %s (pid %d): unexpected opcode 0x%08x\n",
+               current->comm, task_pid_nr(current), opcode);
+}
+
 static inline void
 syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
 {
@@ -457,10 +506,7 @@ syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
                }
                /* fallthrough */
        case -ERESTARTNOINTR:
-               /* A syscall is just a branch, so all
-                * we have to do is fiddle the return pointer.
-                */
-               regs->gr[31] -= 8; /* delayed branching */
+               check_syscallno_in_delay_branch(regs);
                break;
        }
 }
@@ -510,15 +556,9 @@ insert_restart_trampoline(struct pt_regs *regs)
        }
        case -ERESTARTNOHAND:
        case -ERESTARTSYS:
-       case -ERESTARTNOINTR: {
-               /* Hooray for delayed branching.  We don't
-                * have to restore %r20 (the system call
-                * number) because it gets loaded in the delay
-                * slot of the branch external instruction.
-                */
-               regs->gr[31] -= 8;
+       case -ERESTARTNOINTR:
+               check_syscallno_in_delay_branch(regs);
                return;
-       }
        default:
                break;
        }
index 54b45b7..a7352b5 100644 (file)
@@ -224,6 +224,12 @@ static void kvmppc_core_vcpu_put_hv(struct kvm_vcpu *vcpu)
 
 static void kvmppc_set_msr_hv(struct kvm_vcpu *vcpu, u64 msr)
 {
+       /*
+        * Check for illegal transactional state bit combination
+        * and if we find it, force the TS field to a safe state.
+        */
+       if ((msr & MSR_TS_MASK) == MSR_TS_MASK)
+               msr &= ~MSR_TS_MASK;
        vcpu->arch.shregs.msr = msr;
        kvmppc_end_cede(vcpu);
 }
index 0478216..2d66a84 100644 (file)
@@ -78,18 +78,9 @@ static void bpf_jit_build_prologue(struct bpf_prog *fp, u32 *image,
                PPC_LI(r_X, 0);
        }
 
-       switch (filter[0].code) {
-       case BPF_RET | BPF_K:
-       case BPF_LD | BPF_W | BPF_LEN:
-       case BPF_LD | BPF_W | BPF_ABS:
-       case BPF_LD | BPF_H | BPF_ABS:
-       case BPF_LD | BPF_B | BPF_ABS:
-               /* first instruction sets A register (or is RET 'constant') */
-               break;
-       default:
-               /* make sure we dont leak kernel information to user */
+       /* make sure we dont leak kernel information to user */
+       if (bpf_needs_clear_a(&filter[0]))
                PPC_LI(r_A, 0);
-       }
 }
 
 static void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
index 8140d10..6e72961 100644 (file)
@@ -1920,16 +1920,23 @@ static int print_insn(char *buffer, unsigned char *code, unsigned long addr)
                        }
                        if (separator)
                                ptr += sprintf(ptr, "%c", separator);
+                       /*
+                        * Use four '%' characters below because of the
+                        * following two conversions:
+                        *
+                        *  1) sprintf: %%%%r -> %%r
+                        *  2) printk : %%r   -> %r
+                        */
                        if (operand->flags & OPERAND_GPR)
-                               ptr += sprintf(ptr, "%%r%i", value);
+                               ptr += sprintf(ptr, "%%%%r%i", value);
                        else if (operand->flags & OPERAND_FPR)
-                               ptr += sprintf(ptr, "%%f%i", value);
+                               ptr += sprintf(ptr, "%%%%f%i", value);
                        else if (operand->flags & OPERAND_AR)
-                               ptr += sprintf(ptr, "%%a%i", value);
+                               ptr += sprintf(ptr, "%%%%a%i", value);
                        else if (operand->flags & OPERAND_CR)
-                               ptr += sprintf(ptr, "%%c%i", value);
+                               ptr += sprintf(ptr, "%%%%c%i", value);
                        else if (operand->flags & OPERAND_VR)
-                               ptr += sprintf(ptr, "%%v%i", value);
+                               ptr += sprintf(ptr, "%%%%v%i", value);
                        else if (operand->flags & OPERAND_PCREL)
                                ptr += sprintf(ptr, "%lx", (signed int) value
                                                                      + addr);
index 370ca1e..9331083 100644 (file)
@@ -95,6 +95,7 @@
  * really available.  So we simply advertise only "crypto" support.
  */
 #define HWCAP_SPARC_CRYPTO     0x04000000 /* CRYPTO insns available */
+#define HWCAP_SPARC_ADI                0x08000000 /* ADI available */
 
 #define CORE_DUMP_USE_REGSET
 
index efe9479..1c26d44 100644 (file)
 #define __NR_bpf               349
 #define __NR_execveat          350
 #define __NR_membarrier                351
+#define __NR_userfaultfd       352
+#define __NR_bind              353
+#define __NR_listen            354
+#define __NR_setsockopt                355
+#define __NR_mlock2            356
 
-#define NR_syscalls            352
+#define NR_syscalls            357
 
 /* Bitmask values returned from kern_features system call.  */
 #define KERN_FEATURE_MIXED_MODE_STACK  0x00000001
index 3d61fca..f2d30ca 100644 (file)
@@ -946,6 +946,12 @@ ENTRY(__retl_one)
         mov    1, %o0
 ENDPROC(__retl_one)
 
+ENTRY(__retl_one_fp)
+       VISExitHalf
+       retl
+        mov    1, %o0
+ENDPROC(__retl_one_fp)
+
 ENTRY(__ret_one_asi)
        wr      %g0, ASI_AIUS, %asi
        ret
@@ -958,6 +964,13 @@ ENTRY(__retl_one_asi)
         mov    1, %o0
 ENDPROC(__retl_one_asi)
 
+ENTRY(__retl_one_asi_fp)
+       wr      %g0, ASI_AIUS, %asi
+       VISExitHalf
+       retl
+        mov    1, %o0
+ENDPROC(__retl_one_asi_fp)
+
 ENTRY(__retl_o1)
        retl
         mov    %o1, %o0
index 3091267..6596f66 100644 (file)
@@ -1828,11 +1828,18 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry,
 void
 perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
 {
+       u64 saved_fault_address = current_thread_info()->fault_address;
+       u8 saved_fault_code = get_thread_fault_code();
+       mm_segment_t old_fs;
+
        perf_callchain_store(entry, regs->tpc);
 
        if (!current->mm)
                return;
 
+       old_fs = get_fs();
+       set_fs(USER_DS);
+
        flushw_user();
 
        pagefault_disable();
@@ -1843,4 +1850,8 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs)
                perf_callchain_user_64(entry, regs);
 
        pagefault_enable();
+
+       set_fs(old_fs);
+       set_thread_fault_code(saved_fault_code);
+       current_thread_info()->fault_address = saved_fault_address;
 }
index 39f0c66..d08bdaf 100644 (file)
@@ -73,7 +73,13 @@ rtrap_nmi:   ldx                     [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
                andn                    %l1, %l4, %l1
                srl                     %l4, 20, %l4
                ba,pt                   %xcc, rtrap_no_irq_enable
-                wrpr                   %l4, %pil
+               nop
+               /* Do not actually set the %pil here.  We will do that
+                * below after we clear PSTATE_IE in the %pstate register.
+                * If we re-enable interrupts here, we can recurse down
+                * the hardirq stack potentially endlessly, causing a
+                * stack overflow.
+                */
 
                .align                  64
                .globl                  rtrap_irq, rtrap, irqsz_patchme, rtrap_xcall
index f7b2617..f3185e2 100644 (file)
@@ -380,7 +380,8 @@ static const char *hwcaps[] = {
         */
        "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2",
        "ASIBlkInit", "fmaf", "vis3", "hpc", "random", "trans", "fjfmau",
-       "ima", "cspare", "pause", "cbcond",
+       "ima", "cspare", "pause", "cbcond", NULL /*reserved for crypto */,
+       "adp",
 };
 
 static const char *crypto_hwcaps[] = {
@@ -396,7 +397,7 @@ void cpucap_info(struct seq_file *m)
        seq_puts(m, "cpucaps\t\t: ");
        for (i = 0; i < ARRAY_SIZE(hwcaps); i++) {
                unsigned long bit = 1UL << i;
-               if (caps & bit) {
+               if (hwcaps[i] && (caps & bit)) {
                        seq_printf(m, "%s%s",
                                   printed ? "," : "", hwcaps[i]);
                        printed++;
@@ -450,7 +451,7 @@ static void __init report_hwcaps(unsigned long caps)
 
        for (i = 0; i < ARRAY_SIZE(hwcaps); i++) {
                unsigned long bit = 1UL << i;
-               if (caps & bit)
+               if (hwcaps[i] && (caps & bit))
                        report_one_hwcap(&printed, hwcaps[i]);
        }
        if (caps & HWCAP_SPARC_CRYPTO)
@@ -485,7 +486,7 @@ static unsigned long __init mdesc_cpu_hwcap_list(void)
                for (i = 0; i < ARRAY_SIZE(hwcaps); i++) {
                        unsigned long bit = 1UL << i;
 
-                       if (!strcmp(prop, hwcaps[i])) {
+                       if (hwcaps[i] && !strcmp(prop, hwcaps[i])) {
                                caps |= bit;
                                break;
                        }
index cc23b62..e663b6c 100644 (file)
@@ -35,18 +35,18 @@ sys_call_table:
 /*80*/ .long sys_setgroups16, sys_getpgrp, sys_setgroups, sys_setitimer, sys_ftruncate64
 /*85*/ .long sys_swapon, sys_getitimer, sys_setuid, sys_sethostname, sys_setgid
 /*90*/ .long sys_dup2, sys_setfsuid, sys_fcntl, sys_select, sys_setfsgid
-/*95*/ .long sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
+/*95*/ .long sys_fsync, sys_setpriority, sys_socket, sys_connect, sys_accept
 /*100*/        .long sys_getpriority, sys_rt_sigreturn, sys_rt_sigaction, sys_rt_sigprocmask, sys_rt_sigpending
 /*105*/        .long sys_rt_sigtimedwait, sys_rt_sigqueueinfo, sys_rt_sigsuspend, sys_setresuid, sys_getresuid
-/*110*/        .long sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
-/*115*/        .long sys_getgroups, sys_gettimeofday, sys_getrusage, sys_nis_syscall, sys_getcwd
+/*110*/        .long sys_setresgid, sys_getresgid, sys_setregid, sys_recvmsg, sys_sendmsg
+/*115*/        .long sys_getgroups, sys_gettimeofday, sys_getrusage, sys_getsockopt, sys_getcwd
 /*120*/        .long sys_readv, sys_writev, sys_settimeofday, sys_fchown16, sys_fchmod
-/*125*/        .long sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate
-/*130*/        .long sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall
-/*135*/        .long sys_nis_syscall, sys_mkdir, sys_rmdir, sys_utimes, sys_stat64
-/*140*/        .long sys_sendfile64, sys_nis_syscall, sys_futex, sys_gettid, sys_getrlimit
+/*125*/        .long sys_recvfrom, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate
+/*130*/        .long sys_ftruncate, sys_flock, sys_lstat64, sys_sendto, sys_shutdown
+/*135*/        .long sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_stat64
+/*140*/        .long sys_sendfile64, sys_getpeername, sys_futex, sys_gettid, sys_getrlimit
 /*145*/        .long sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
-/*150*/        .long sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
+/*150*/        .long sys_getsockname, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
 /*155*/        .long sys_fcntl64, sys_inotify_rm_watch, sys_statfs, sys_fstatfs, sys_oldumount
 /*160*/        .long sys_sched_setaffinity, sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
 /*165*/        .long sys_quotactl, sys_set_tid_address, sys_mount, sys_ustat, sys_setxattr
@@ -87,4 +87,5 @@ sys_call_table:
 /*335*/        .long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
 /*340*/        .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
 /*345*/        .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
-/*350*/        .long sys_execveat, sys_membarrier
+/*350*/        .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
+/*355*/        .long sys_setsockopt, sys_mlock2
index f229468..1557121 100644 (file)
@@ -37,15 +37,15 @@ sys_call_table32:
 /*80*/ .word sys_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64
        .word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid
 /*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid
-       .word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
+       .word sys_fsync, sys_setpriority, sys_socket, sys_connect, sys_accept
 /*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending
        .word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid
-/*110*/        .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
-       .word sys_getgroups, compat_sys_gettimeofday, compat_sys_getrusage, sys_nis_syscall, sys_getcwd
+/*110*/        .word sys_setresgid, sys_getresgid, sys_setregid, compat_sys_recvmsg, compat_sys_sendmsg
+       .word sys_getgroups, compat_sys_gettimeofday, compat_sys_getrusage, compat_sys_getsockopt, sys_getcwd
 /*120*/        .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod
-       .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
-/*130*/        .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
-       .word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
+       .word sys_recvfrom, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
+/*130*/        .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_sendto, sys_shutdown
+       .word sys_socketpair, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
 /*140*/        .word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
        .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
 /*150*/        .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64
@@ -88,7 +88,8 @@ sys_call_table32:
        .word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev
 /*340*/        .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
        .word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
-/*350*/        .word sys32_execveat, sys_membarrier
+/*350*/        .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
+       .word compat_sys_setsockopt, sys_mlock2
 
 #endif /* CONFIG_COMPAT */
 
@@ -168,4 +169,5 @@ sys_call_table:
        .word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev
 /*340*/        .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
        .word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
-/*350*/        .word sys64_execveat, sys_membarrier
+/*350*/        .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
+       .word sys_setsockopt, sys_mlock2
index 119ccb9..d5242b8 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_LD_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_asi_fp;\
+       .text;                  \
+       .align 4;
+
 #ifndef ASI_AIUS
 #define ASI_AIUS       0x11
 #endif
index 7fe1cce..4e962d9 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_ST_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_asi_fp;\
+       .text;                  \
+       .align 4;
+
 #ifndef ASI_AIUS
 #define ASI_AIUS       0x11
 #endif
index 30eee6e..d5f585d 100644 (file)
 #ifndef EX_LD
 #define EX_LD(x)       x
 #endif
+#ifndef EX_LD_FP
+#define EX_LD_FP(x)    x
+#endif
 
 #ifndef EX_ST
 #define EX_ST(x)       x
 #endif
+#ifndef EX_ST_FP
+#define EX_ST_FP(x)    x
+#endif
 
 #ifndef EX_RETVAL
 #define EX_RETVAL(x)   x
        fsrc2           %x6, %f12; \
        fsrc2           %x7, %f14;
 #define FREG_LOAD_1(base, x0) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0))
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0))
 #define FREG_LOAD_2(base, x0, x1) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
-       EX_LD(LOAD(ldd, base + 0x08, %x1));
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD_FP(LOAD(ldd, base + 0x08, %x1));
 #define FREG_LOAD_3(base, x0, x1, x2) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
-       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
-       EX_LD(LOAD(ldd, base + 0x10, %x2));
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD_FP(LOAD(ldd, base + 0x10, %x2));
 #define FREG_LOAD_4(base, x0, x1, x2, x3) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
-       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
-       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
-       EX_LD(LOAD(ldd, base + 0x18, %x3));
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD_FP(LOAD(ldd, base + 0x18, %x3));
 #define FREG_LOAD_5(base, x0, x1, x2, x3, x4) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
-       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
-       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
-       EX_LD(LOAD(ldd, base + 0x18, %x3)); \
-       EX_LD(LOAD(ldd, base + 0x20, %x4));
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD_FP(LOAD(ldd, base + 0x18, %x3)); \
+       EX_LD_FP(LOAD(ldd, base + 0x20, %x4));
 #define FREG_LOAD_6(base, x0, x1, x2, x3, x4, x5) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
-       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
-       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
-       EX_LD(LOAD(ldd, base + 0x18, %x3)); \
-       EX_LD(LOAD(ldd, base + 0x20, %x4)); \
-       EX_LD(LOAD(ldd, base + 0x28, %x5));
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD_FP(LOAD(ldd, base + 0x18, %x3)); \
+       EX_LD_FP(LOAD(ldd, base + 0x20, %x4)); \
+       EX_LD_FP(LOAD(ldd, base + 0x28, %x5));
 #define FREG_LOAD_7(base, x0, x1, x2, x3, x4, x5, x6) \
-       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
-       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
-       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
-       EX_LD(LOAD(ldd, base + 0x18, %x3)); \
-       EX_LD(LOAD(ldd, base + 0x20, %x4)); \
-       EX_LD(LOAD(ldd, base + 0x28, %x5)); \
-       EX_LD(LOAD(ldd, base + 0x30, %x6));
+       EX_LD_FP(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD_FP(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD_FP(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD_FP(LOAD(ldd, base + 0x18, %x3)); \
+       EX_LD_FP(LOAD(ldd, base + 0x20, %x4)); \
+       EX_LD_FP(LOAD(ldd, base + 0x28, %x5)); \
+       EX_LD_FP(LOAD(ldd, base + 0x30, %x6));
 
        .register       %g2,#scratch
        .register       %g3,#scratch
@@ -275,11 +281,11 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
         nop
        /* fall through for 0 < low bits < 8 */
 110:   sub             %o4, 64, %g2
-       EX_LD(LOAD_BLK(%g2, %f0))
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+       EX_LD_FP(LOAD_BLK(%g2, %f0))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f4, f6, f8, f10, f12, f14, f16)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_8(f16, f18, f20, f22, f24, f26, f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -290,10 +296,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 120:   sub             %o4, 56, %g2
        FREG_LOAD_7(%g2, f0, f2, f4, f6, f8, f10, f12)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f4, f6, f8, f10, f12, f16, f18)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_7(f18, f20, f22, f24, f26, f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -304,10 +310,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 130:   sub             %o4, 48, %g2
        FREG_LOAD_6(%g2, f0, f2, f4, f6, f8, f10)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f4, f6, f8, f10, f16, f18, f20)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_6(f20, f22, f24, f26, f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -318,10 +324,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 140:   sub             %o4, 40, %g2
        FREG_LOAD_5(%g2, f0, f2, f4, f6, f8)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f4, f6, f8, f16, f18, f20, f22)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_5(f22, f24, f26, f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -332,10 +338,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 150:   sub             %o4, 32, %g2
        FREG_LOAD_4(%g2, f0, f2, f4, f6)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f4, f6, f16, f18, f20, f22, f24)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_4(f24, f26, f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -346,10 +352,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 160:   sub             %o4, 24, %g2
        FREG_LOAD_3(%g2, f0, f2, f4)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f4, f16, f18, f20, f22, f24, f26)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_3(f26, f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -360,10 +366,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 170:   sub             %o4, 16, %g2
        FREG_LOAD_2(%g2, f0, f2)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f2, f16, f18, f20, f22, f24, f26, f28)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_2(f28, f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -374,10 +380,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
 180:   sub             %o4, 8, %g2
        FREG_LOAD_1(%g2, f0)
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
-       EX_LD(LOAD_BLK(%o4, %f16))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f16))
        FREG_FROB(f0, f16, f18, f20, f22, f24, f26, f28, f30)
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        FREG_MOVE_1(f30)
        subcc           %g1, 64, %g1
        add             %o4, 64, %o4
@@ -387,10 +393,10 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
         nop
 
 190:
-1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+1:     EX_ST_FP(STORE_INIT(%g0, %o4 + %g3))
        subcc           %g1, 64, %g1
-       EX_LD(LOAD_BLK(%o4, %f0))
-       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       EX_LD_FP(LOAD_BLK(%o4, %f0))
+       EX_ST_FP(STORE_BLK(%f0, %o4 + %g3))
        add             %o4, 64, %o4
        bne,pt          %xcc, 1b
         LOAD(prefetch, %o4 + 64, #one_read)
index fd9f903..2e8ee7a 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_LD_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_asi_fp;\
+       .text;                  \
+       .align 4;
+
 #ifndef ASI_AIUS
 #define ASI_AIUS       0x11
 #endif
index 9744c45..be0bf45 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_ST_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_asi_fp;\
+       .text;                  \
+       .align 4;
+
 #ifndef ASI_AIUS
 #define ASI_AIUS       0x11
 #endif
index 83aeeb1..8e13ee1 100644 (file)
 #ifndef EX_LD
 #define EX_LD(x)       x
 #endif
+#ifndef EX_LD_FP
+#define EX_LD_FP(x)    x
+#endif
 
 #ifndef EX_ST
 #define EX_ST(x)       x
 #endif
+#ifndef EX_ST_FP
+#define EX_ST_FP(x)    x
+#endif
 
 #ifndef EX_RETVAL
 #define EX_RETVAL(x)   x
@@ -210,17 +216,17 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
        sub             %o2, %o4, %o2
        alignaddr       %o1, %g0, %g1
        add             %o1, %o4, %o1
-       EX_LD(LOAD(ldd, %g1 + 0x00, %f0))
-1:     EX_LD(LOAD(ldd, %g1 + 0x08, %f2))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x00, %f0))
+1:     EX_LD_FP(LOAD(ldd, %g1 + 0x08, %f2))
        subcc           %o4, 0x40, %o4
-       EX_LD(LOAD(ldd, %g1 + 0x10, %f4))
-       EX_LD(LOAD(ldd, %g1 + 0x18, %f6))
-       EX_LD(LOAD(ldd, %g1 + 0x20, %f8))
-       EX_LD(LOAD(ldd, %g1 + 0x28, %f10))
-       EX_LD(LOAD(ldd, %g1 + 0x30, %f12))
-       EX_LD(LOAD(ldd, %g1 + 0x38, %f14))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x10, %f4))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x18, %f6))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x20, %f8))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x28, %f10))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x30, %f12))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x38, %f14))
        faligndata      %f0, %f2, %f16
-       EX_LD(LOAD(ldd, %g1 + 0x40, %f0))
+       EX_LD_FP(LOAD(ldd, %g1 + 0x40, %f0))
        faligndata      %f2, %f4, %f18
        add             %g1, 0x40, %g1
        faligndata      %f4, %f6, %f20
@@ -229,14 +235,14 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
        faligndata      %f10, %f12, %f26
        faligndata      %f12, %f14, %f28
        faligndata      %f14, %f0, %f30
-       EX_ST(STORE(std, %f16, %o0 + 0x00))
-       EX_ST(STORE(std, %f18, %o0 + 0x08))
-       EX_ST(STORE(std, %f20, %o0 + 0x10))
-       EX_ST(STORE(std, %f22, %o0 + 0x18))
-       EX_ST(STORE(std, %f24, %o0 + 0x20))
-       EX_ST(STORE(std, %f26, %o0 + 0x28))
-       EX_ST(STORE(std, %f28, %o0 + 0x30))
-       EX_ST(STORE(std, %f30, %o0 + 0x38))
+       EX_ST_FP(STORE(std, %f16, %o0 + 0x00))
+       EX_ST_FP(STORE(std, %f18, %o0 + 0x08))
+       EX_ST_FP(STORE(std, %f20, %o0 + 0x10))
+       EX_ST_FP(STORE(std, %f22, %o0 + 0x18))
+       EX_ST_FP(STORE(std, %f24, %o0 + 0x20))
+       EX_ST_FP(STORE(std, %f26, %o0 + 0x28))
+       EX_ST_FP(STORE(std, %f28, %o0 + 0x30))
+       EX_ST_FP(STORE(std, %f30, %o0 + 0x38))
        add             %o0, 0x40, %o0
        bne,pt          %icc, 1b
         LOAD(prefetch, %g1 + 0x200, #n_reads_strong)
index a6ae2ea..ecc5692 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_LD_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_fp;\
+       .text;                  \
+       .align 4;
+
 #define FUNC_NAME              ___copy_from_user
 #define LOAD(type,addr,dest)   type##a [addr] %asi, dest
 #define LOAD_BLK(addr,dest)    ldda [addr] ASI_BLK_AIUS, dest
index f4b970e..9eea392 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_ST_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_fp;\
+       .text;                  \
+       .align 4;
+
 #define FUNC_NAME              ___copy_to_user
 #define STORE(type,src,addr)   type##a src, [addr] ASI_AIUS
 #define STORE_BLK(src,addr)    stda src, [addr] ASI_BLK_AIUS
index b67142b..3e6209e 100644 (file)
 #ifndef EX_LD
 #define EX_LD(x)       x
 #endif
+#ifndef EX_LD_FP
+#define EX_LD_FP(x)    x
+#endif
 
 #ifndef EX_ST
 #define EX_ST(x)       x
 #endif
+#ifndef EX_ST_FP
+#define EX_ST_FP(x)    x
+#endif
 
 #ifndef EX_RETVAL
 #define EX_RETVAL(x)   x
@@ -73,8 +79,8 @@
        faligndata              %f8, %f9, %f62;
 
 #define MAIN_LOOP_CHUNK(src, dest, fdest, fsrc, len, jmptgt)   \
-       EX_LD(LOAD_BLK(%src, %fdest));                          \
-       EX_ST(STORE_BLK(%fsrc, %dest));                         \
+       EX_LD_FP(LOAD_BLK(%src, %fdest));                               \
+       EX_ST_FP(STORE_BLK(%fsrc, %dest));                              \
        add                     %src, 0x40, %src;               \
        subcc                   %len, 0x40, %len;               \
        be,pn                   %xcc, jmptgt;                   \
 
 #define DO_SYNC                        membar  #Sync;
 #define STORE_SYNC(dest, fsrc)                         \
-       EX_ST(STORE_BLK(%fsrc, %dest));                 \
+       EX_ST_FP(STORE_BLK(%fsrc, %dest));                      \
        add                     %dest, 0x40, %dest;     \
        DO_SYNC
 
 #define STORE_JUMP(dest, fsrc, target)                 \
-       EX_ST(STORE_BLK(%fsrc, %dest));                 \
+       EX_ST_FP(STORE_BLK(%fsrc, %dest));                      \
        add                     %dest, 0x40, %dest;     \
        ba,pt                   %xcc, target;           \
         nop;
        subcc                   %left, 8, %left;\
        bl,pn                   %xcc, 95f;      \
         faligndata             %f0, %f1, %f48; \
-       EX_ST(STORE(std, %f48, %dest));         \
+       EX_ST_FP(STORE(std, %f48, %dest));              \
        add                     %dest, 8, %dest;
 
 #define UNEVEN_VISCHUNK_LAST(dest, f0, f1, left)       \
@@ -160,8 +166,8 @@ FUNC_NAME:          /* %o0=dst, %o1=src, %o2=len */
         and            %g2, 0x38, %g2
 
 1:     subcc           %g1, 0x1, %g1
-       EX_LD(LOAD(ldub, %o1 + 0x00, %o3))
-       EX_ST(STORE(stb, %o3, %o1 + %GLOBAL_SPARE))
+       EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3))
+       EX_ST_FP(STORE(stb, %o3, %o1 + %GLOBAL_SPARE))
        bgu,pt          %XCC, 1b
         add            %o1, 0x1, %o1
 
@@ -172,20 +178,20 @@ FUNC_NAME:                /* %o0=dst, %o1=src, %o2=len */
        be,pt           %icc, 3f
         alignaddr      %o1, %g0, %o1
 
-       EX_LD(LOAD(ldd, %o1, %f4))
-1:     EX_LD(LOAD(ldd, %o1 + 0x8, %f6))
+       EX_LD_FP(LOAD(ldd, %o1, %f4))
+1:     EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6))
        add             %o1, 0x8, %o1
        subcc           %g2, 0x8, %g2
        faligndata      %f4, %f6, %f0
-       EX_ST(STORE(std, %f0, %o0))
+       EX_ST_FP(STORE(std, %f0, %o0))
        be,pn           %icc, 3f
         add            %o0, 0x8, %o0
 
-       EX_LD(LOAD(ldd, %o1 + 0x8, %f4))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f4))
        add             %o1, 0x8, %o1
        subcc           %g2, 0x8, %g2
        faligndata      %f6, %f4, %f0
-       EX_ST(STORE(std, %f0, %o0))
+       EX_ST_FP(STORE(std, %f0, %o0))
        bne,pt          %icc, 1b
         add            %o0, 0x8, %o0
 
@@ -208,13 +214,13 @@ FUNC_NAME:                /* %o0=dst, %o1=src, %o2=len */
        add             %g1, %GLOBAL_SPARE, %g1
        subcc           %o2, %g3, %o2
 
-       EX_LD(LOAD_BLK(%o1, %f0))
+       EX_LD_FP(LOAD_BLK(%o1, %f0))
        add             %o1, 0x40, %o1
        add             %g1, %g3, %g1
-       EX_LD(LOAD_BLK(%o1, %f16))
+       EX_LD_FP(LOAD_BLK(%o1, %f16))
        add             %o1, 0x40, %o1
        sub             %GLOBAL_SPARE, 0x80, %GLOBAL_SPARE
-       EX_LD(LOAD_BLK(%o1, %f32))
+       EX_LD_FP(LOAD_BLK(%o1, %f32))
        add             %o1, 0x40, %o1
 
        /* There are 8 instances of the unrolled loop,
@@ -426,28 +432,28 @@ FUNC_NAME:                /* %o0=dst, %o1=src, %o2=len */
 62:    FINISH_VISCHUNK(o0, f44, f46, g3)
 63:    UNEVEN_VISCHUNK_LAST(o0, f46, f0,  g3)
 
-93:    EX_LD(LOAD(ldd, %o1, %f2))
+93:    EX_LD_FP(LOAD(ldd, %o1, %f2))
        add             %o1, 8, %o1
        subcc           %g3, 8, %g3
        faligndata      %f0, %f2, %f8
-       EX_ST(STORE(std, %f8, %o0))
+       EX_ST_FP(STORE(std, %f8, %o0))
        bl,pn           %xcc, 95f
         add            %o0, 8, %o0
-       EX_LD(LOAD(ldd, %o1, %f0))
+       EX_LD_FP(LOAD(ldd, %o1, %f0))
        add             %o1, 8, %o1
        subcc           %g3, 8, %g3
        faligndata      %f2, %f0, %f8
-       EX_ST(STORE(std, %f8, %o0))
+       EX_ST_FP(STORE(std, %f8, %o0))
        bge,pt          %xcc, 93b
         add            %o0, 8, %o0
 
 95:    brz,pt          %o2, 2f
         mov            %g1, %o1
 
-1:     EX_LD(LOAD(ldub, %o1, %o3))
+1:     EX_LD_FP(LOAD(ldub, %o1, %o3))
        add             %o1, 1, %o1
        subcc           %o2, 1, %o2
-       EX_ST(STORE(stb, %o3, %o0))
+       EX_ST_FP(STORE(stb, %o3, %o0))
        bne,pt          %xcc, 1b
         add            %o0, 1, %o0
 
index b1acd13..88ad73d 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_LD_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_fp;\
+       .text;                  \
+       .align 4;
+
 #define FUNC_NAME              U3copy_from_user
 #define LOAD(type,addr,dest)   type##a [addr] %asi, dest
 #define EX_RETVAL(x)           0
index ef1e493..845139d 100644 (file)
        .text;                  \
        .align 4;
 
+#define EX_ST_FP(x)            \
+98:    x;                      \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, __retl_one_fp;\
+       .text;                  \
+       .align 4;
+
 #define FUNC_NAME              U3copy_to_user
 #define STORE(type,src,addr)   type##a src, [addr] ASI_AIUS
 #define STORE_BLK(src,addr)    stda src, [addr] ASI_BLK_AIUS
index 7cae9cc..491ee69 100644 (file)
 #ifndef EX_LD
 #define EX_LD(x)       x
 #endif
+#ifndef EX_LD_FP
+#define EX_LD_FP(x)    x
+#endif
 
 #ifndef EX_ST
 #define EX_ST(x)       x
 #endif
+#ifndef EX_ST_FP
+#define EX_ST_FP(x)    x
+#endif
 
 #ifndef EX_RETVAL
 #define EX_RETVAL(x)   x
@@ -120,8 +126,8 @@ FUNC_NAME:  /* %o0=dst, %o1=src, %o2=len */
         and            %g2, 0x38, %g2
 
 1:     subcc           %g1, 0x1, %g1
-       EX_LD(LOAD(ldub, %o1 + 0x00, %o3))
-       EX_ST(STORE(stb, %o3, %o1 + GLOBAL_SPARE))
+       EX_LD_FP(LOAD(ldub, %o1 + 0x00, %o3))
+       EX_ST_FP(STORE(stb, %o3, %o1 + GLOBAL_SPARE))
        bgu,pt          %XCC, 1b
         add            %o1, 0x1, %o1
 
@@ -132,20 +138,20 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
        be,pt           %icc, 3f
         alignaddr      %o1, %g0, %o1
 
-       EX_LD(LOAD(ldd, %o1, %f4))
-1:     EX_LD(LOAD(ldd, %o1 + 0x8, %f6))
+       EX_LD_FP(LOAD(ldd, %o1, %f4))
+1:     EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f6))
        add             %o1, 0x8, %o1
        subcc           %g2, 0x8, %g2
        faligndata      %f4, %f6, %f0
-       EX_ST(STORE(std, %f0, %o0))
+       EX_ST_FP(STORE(std, %f0, %o0))
        be,pn           %icc, 3f
         add            %o0, 0x8, %o0
 
-       EX_LD(LOAD(ldd, %o1 + 0x8, %f4))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x8, %f4))
        add             %o1, 0x8, %o1
        subcc           %g2, 0x8, %g2
        faligndata      %f6, %f4, %f2
-       EX_ST(STORE(std, %f2, %o0))
+       EX_ST_FP(STORE(std, %f2, %o0))
        bne,pt          %icc, 1b
         add            %o0, 0x8, %o0
 
@@ -155,25 +161,25 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
        LOAD(prefetch, %o1 + 0x080, #one_read)
        LOAD(prefetch, %o1 + 0x0c0, #one_read)
        LOAD(prefetch, %o1 + 0x100, #one_read)
-       EX_LD(LOAD(ldd, %o1 + 0x000, %f0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x000, %f0))
        LOAD(prefetch, %o1 + 0x140, #one_read)
-       EX_LD(LOAD(ldd, %o1 + 0x008, %f2))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2))
        LOAD(prefetch, %o1 + 0x180, #one_read)
-       EX_LD(LOAD(ldd, %o1 + 0x010, %f4))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4))
        LOAD(prefetch, %o1 + 0x1c0, #one_read)
        faligndata      %f0, %f2, %f16
-       EX_LD(LOAD(ldd, %o1 + 0x018, %f6))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
        faligndata      %f2, %f4, %f18
-       EX_LD(LOAD(ldd, %o1 + 0x020, %f8))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8))
        faligndata      %f4, %f6, %f20
-       EX_LD(LOAD(ldd, %o1 + 0x028, %f10))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10))
        faligndata      %f6, %f8, %f22
 
-       EX_LD(LOAD(ldd, %o1 + 0x030, %f12))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12))
        faligndata      %f8, %f10, %f24
-       EX_LD(LOAD(ldd, %o1 + 0x038, %f14))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14))
        faligndata      %f10, %f12, %f26
-       EX_LD(LOAD(ldd, %o1 + 0x040, %f0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0))
 
        subcc           GLOBAL_SPARE, 0x80, GLOBAL_SPARE
        add             %o1, 0x40, %o1
@@ -184,26 +190,26 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
        .align          64
 1:
-       EX_LD(LOAD(ldd, %o1 + 0x008, %f2))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2))
        faligndata      %f12, %f14, %f28
-       EX_LD(LOAD(ldd, %o1 + 0x010, %f4))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4))
        faligndata      %f14, %f0, %f30
-       EX_ST(STORE_BLK(%f16, %o0))
-       EX_LD(LOAD(ldd, %o1 + 0x018, %f6))
+       EX_ST_FP(STORE_BLK(%f16, %o0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
        faligndata      %f0, %f2, %f16
        add             %o0, 0x40, %o0
 
-       EX_LD(LOAD(ldd, %o1 + 0x020, %f8))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8))
        faligndata      %f2, %f4, %f18
-       EX_LD(LOAD(ldd, %o1 + 0x028, %f10))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10))
        faligndata      %f4, %f6, %f20
-       EX_LD(LOAD(ldd, %o1 + 0x030, %f12))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12))
        subcc           %o3, 0x01, %o3
        faligndata      %f6, %f8, %f22
-       EX_LD(LOAD(ldd, %o1 + 0x038, %f14))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14))
 
        faligndata      %f8, %f10, %f24
-       EX_LD(LOAD(ldd, %o1 + 0x040, %f0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0))
        LOAD(prefetch, %o1 + 0x1c0, #one_read)
        faligndata      %f10, %f12, %f26
        bg,pt           %XCC, 1b
@@ -211,29 +217,29 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
        /* Finally we copy the last full 64-byte block. */
 2:
-       EX_LD(LOAD(ldd, %o1 + 0x008, %f2))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x008, %f2))
        faligndata      %f12, %f14, %f28
-       EX_LD(LOAD(ldd, %o1 + 0x010, %f4))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x010, %f4))
        faligndata      %f14, %f0, %f30
-       EX_ST(STORE_BLK(%f16, %o0))
-       EX_LD(LOAD(ldd, %o1 + 0x018, %f6))
+       EX_ST_FP(STORE_BLK(%f16, %o0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x018, %f6))
        faligndata      %f0, %f2, %f16
-       EX_LD(LOAD(ldd, %o1 + 0x020, %f8))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x020, %f8))
        faligndata      %f2, %f4, %f18
-       EX_LD(LOAD(ldd, %o1 + 0x028, %f10))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x028, %f10))
        faligndata      %f4, %f6, %f20
-       EX_LD(LOAD(ldd, %o1 + 0x030, %f12))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x030, %f12))
        faligndata      %f6, %f8, %f22
-       EX_LD(LOAD(ldd, %o1 + 0x038, %f14))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x038, %f14))
        faligndata      %f8, %f10, %f24
        cmp             %g1, 0
        be,pt           %XCC, 1f
         add            %o0, 0x40, %o0
-       EX_LD(LOAD(ldd, %o1 + 0x040, %f0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x040, %f0))
 1:     faligndata      %f10, %f12, %f26
        faligndata      %f12, %f14, %f28
        faligndata      %f14, %f0, %f30
-       EX_ST(STORE_BLK(%f16, %o0))
+       EX_ST_FP(STORE_BLK(%f16, %o0))
        add             %o0, 0x40, %o0
        add             %o1, 0x40, %o1
        membar          #Sync
@@ -253,20 +259,20 @@ FUNC_NAME:        /* %o0=dst, %o1=src, %o2=len */
 
        sub             %o2, %g2, %o2
        be,a,pt         %XCC, 1f
-        EX_LD(LOAD(ldd, %o1 + 0x00, %f0))
+        EX_LD_FP(LOAD(ldd, %o1 + 0x00, %f0))
 
-1:     EX_LD(LOAD(ldd, %o1 + 0x08, %f2))
+1:     EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f2))
        add             %o1, 0x8, %o1
        subcc           %g2, 0x8, %g2
        faligndata      %f0, %f2, %f8
-       EX_ST(STORE(std, %f8, %o0))
+       EX_ST_FP(STORE(std, %f8, %o0))
        be,pn           %XCC, 2f
         add            %o0, 0x8, %o0
-       EX_LD(LOAD(ldd, %o1 + 0x08, %f0))
+       EX_LD_FP(LOAD(ldd, %o1 + 0x08, %f0))
        add             %o1, 0x8, %o1
        subcc           %g2, 0x8, %g2
        faligndata      %f2, %f0, %f8
-       EX_ST(STORE(std, %f8, %o0))
+       EX_ST_FP(STORE(std, %f8, %o0))
        bne,pn          %XCC, 1b
         add            %o0, 0x8, %o0
 
index 22564f5..3e6e05a 100644 (file)
@@ -420,22 +420,9 @@ void bpf_jit_compile(struct bpf_prog *fp)
                }
                emit_reg_move(O7, r_saved_O7);
 
-               switch (filter[0].code) {
-               case BPF_RET | BPF_K:
-               case BPF_LD | BPF_W | BPF_LEN:
-               case BPF_LD | BPF_W | BPF_ABS:
-               case BPF_LD | BPF_H | BPF_ABS:
-               case BPF_LD | BPF_B | BPF_ABS:
-                       /* The first instruction sets the A register (or is
-                        * a "RET 'constant'")
-                        */
-                       break;
-               default:
-                       /* Make sure we dont leak kernel information to the
-                        * user.
-                        */
+               /* Make sure we dont leak kernel information to the user. */
+               if (bpf_needs_clear_a(&filter[0]))
                        emit_clear(r_A); /* A = 0 */
-               }
 
                for (i = 0; i < flen; i++) {
                        unsigned int K = filter[i].k;
index 106c21b..8ec7a45 100644 (file)
@@ -176,8 +176,6 @@ config NR_CPUS
          smaller kernel memory footprint results from using a smaller
          value on chips with fewer tiles.
 
-if TILEGX
-
 choice
        prompt "Kernel page size"
        default PAGE_SIZE_64KB
@@ -188,8 +186,11 @@ choice
          connections, etc., it may be better to select 16KB, which uses
          memory more efficiently at some cost in TLB performance.
 
-         Note that this option is TILE-Gx specific; currently
-         TILEPro page size is set by rebuilding the hypervisor.
+         Note that for TILEPro, you must also rebuild the hypervisor
+         with a matching page size.
+
+config PAGE_SIZE_4KB
+       bool "4KB" if TILEPRO
 
 config PAGE_SIZE_16KB
        bool "16KB"
@@ -199,8 +200,6 @@ config PAGE_SIZE_64KB
 
 endchoice
 
-endif
-
 source "kernel/Kconfig.hz"
 
 config KEXEC
index a213a8d..8eca6a0 100644 (file)
 #include <arch/chip.h>
 
 /* PAGE_SHIFT and HPAGE_SHIFT determine the page sizes. */
-#if defined(CONFIG_PAGE_SIZE_16KB)
+#if defined(CONFIG_PAGE_SIZE_4KB)  /* tilepro only */
+#define PAGE_SHIFT     12
+#define CTX_PAGE_FLAG  HV_CTX_PG_SM_4K
+#elif defined(CONFIG_PAGE_SIZE_16KB)
 #define PAGE_SHIFT     14
 #define CTX_PAGE_FLAG  HV_CTX_PG_SM_16K
 #elif defined(CONFIG_PAGE_SIZE_64KB)
 #define PAGE_SHIFT     16
 #define CTX_PAGE_FLAG  HV_CTX_PG_SM_64K
 #else
-#define PAGE_SHIFT     HV_LOG2_DEFAULT_PAGE_SIZE_SMALL
-#define CTX_PAGE_FLAG  0
+#error Page size not specified in Kconfig
 #endif
 #define HPAGE_SHIFT    HV_LOG2_DEFAULT_PAGE_SIZE_LARGE
 
index db3622f..790aa3e 100644 (file)
@@ -523,9 +523,10 @@ config X86_INTEL_QUARK
 
 config X86_INTEL_LPSS
        bool "Intel Low Power Subsystem Support"
-       depends on ACPI
+       depends on X86 && ACPI
        select COMMON_CLK
        select PINCTRL
+       select IOSF_MBI
        ---help---
          Select to build support for Intel Low Power Subsystem such as
          found on Intel Lynxpoint PCH. Selecting this option enables
index a89fdbc..0366374 100644 (file)
@@ -421,7 +421,7 @@ __visible long do_fast_syscall_32(struct pt_regs *regs)
        regs->ip = landing_pad;
 
        /*
-        * Fetch ECX from where the vDSO stashed it.
+        * Fetch EBP from where the vDSO stashed it.
         *
         * WARNING: We are in CONTEXT_USER and RCU isn't paying attention!
         */
@@ -432,10 +432,10 @@ __visible long do_fast_syscall_32(struct pt_regs *regs)
                 * Micro-optimization: the pointer we're following is explicitly
                 * 32 bits, so it can't be out of range.
                 */
-               __get_user(*(u32 *)&regs->cx,
+               __get_user(*(u32 *)&regs->bp,
                            (u32 __user __force *)(unsigned long)(u32)regs->sp)
 #else
-               get_user(*(u32 *)&regs->cx,
+               get_user(*(u32 *)&regs->bp,
                         (u32 __user __force *)(unsigned long)(u32)regs->sp)
 #endif
                ) {
index 3eb572e..f3b6d54 100644 (file)
@@ -292,7 +292,7 @@ ENTRY(entry_SYSENTER_32)
        movl    TSS_sysenter_sp0(%esp), %esp
 sysenter_past_esp:
        pushl   $__USER_DS              /* pt_regs->ss */
-       pushl   %ecx                    /* pt_regs->cx */
+       pushl   %ebp                    /* pt_regs->sp (stashed in bp) */
        pushfl                          /* pt_regs->flags (except IF = 0) */
        orl     $X86_EFLAGS_IF, (%esp)  /* Fix IF */
        pushl   $__USER_CS              /* pt_regs->cs */
@@ -308,8 +308,9 @@ sysenter_past_esp:
 
        movl    %esp, %eax
        call    do_fast_syscall_32
-       testl   %eax, %eax
-       jz      .Lsyscall_32_done
+       /* XEN PV guests always use IRET path */
+       ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \
+                   "jmp .Lsyscall_32_done", X86_FEATURE_XENPV
 
 /* Opportunistic SYSEXIT */
        TRACE_IRQS_ON                   /* User mode traces as IRQs on. */
index c320183..6a1ae37 100644 (file)
@@ -63,7 +63,7 @@ ENTRY(entry_SYSENTER_compat)
 
        /* Construct struct pt_regs on stack */
        pushq   $__USER32_DS            /* pt_regs->ss */
-       pushq   %rcx                    /* pt_regs->sp */
+       pushq   %rbp                    /* pt_regs->sp (stashed in bp) */
 
        /*
         * Push flags.  This is nasty.  First, interrupts are currently
@@ -82,14 +82,14 @@ ENTRY(entry_SYSENTER_compat)
        pushq   %rdi                    /* pt_regs->di */
        pushq   %rsi                    /* pt_regs->si */
        pushq   %rdx                    /* pt_regs->dx */
-       pushq   %rcx                    /* pt_regs->cx (will be overwritten) */
+       pushq   %rcx                    /* pt_regs->cx */
        pushq   $-ENOSYS                /* pt_regs->ax */
        pushq   %r8                     /* pt_regs->r8  = 0 */
        pushq   %r8                     /* pt_regs->r9  = 0 */
        pushq   %r8                     /* pt_regs->r10 = 0 */
        pushq   %r8                     /* pt_regs->r11 = 0 */
        pushq   %rbx                    /* pt_regs->rbx */
-       pushq   %rbp                    /* pt_regs->rbp */
+       pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
        pushq   %r8                     /* pt_regs->r12 = 0 */
        pushq   %r8                     /* pt_regs->r13 = 0 */
        pushq   %r8                     /* pt_regs->r14 = 0 */
@@ -121,8 +121,9 @@ sysenter_flags_fixed:
 
        movq    %rsp, %rdi
        call    do_fast_syscall_32
-       testl   %eax, %eax
-       jz      .Lsyscall_32_done
+       /* XEN PV guests always use IRET path */
+       ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \
+                   "jmp .Lsyscall_32_done", X86_FEATURE_XENPV
        jmp     sysret32_from_system_call
 
 sysenter_fix_flags:
@@ -178,7 +179,7 @@ ENTRY(entry_SYSCALL_compat)
        pushq   %rdi                    /* pt_regs->di */
        pushq   %rsi                    /* pt_regs->si */
        pushq   %rdx                    /* pt_regs->dx */
-       pushq   %rcx                    /* pt_regs->cx (will be overwritten) */
+       pushq   %rbp                    /* pt_regs->cx (stashed in bp) */
        pushq   $-ENOSYS                /* pt_regs->ax */
        xorq    %r8,%r8
        pushq   %r8                     /* pt_regs->r8  = 0 */
@@ -186,7 +187,7 @@ ENTRY(entry_SYSCALL_compat)
        pushq   %r8                     /* pt_regs->r10 = 0 */
        pushq   %r8                     /* pt_regs->r11 = 0 */
        pushq   %rbx                    /* pt_regs->rbx */
-       pushq   %rbp                    /* pt_regs->rbp */
+       pushq   %rbp                    /* pt_regs->rbp (will be overwritten) */
        pushq   %r8                     /* pt_regs->r12 = 0 */
        pushq   %r8                     /* pt_regs->r13 = 0 */
        pushq   %r8                     /* pt_regs->r14 = 0 */
@@ -200,8 +201,9 @@ ENTRY(entry_SYSCALL_compat)
 
        movq    %rsp, %rdi
        call    do_fast_syscall_32
-       testl   %eax, %eax
-       jz      .Lsyscall_32_done
+       /* XEN PV guests always use IRET path */
+       ALTERNATIVE "testl %eax, %eax; jz .Lsyscall_32_done", \
+                   "jmp .Lsyscall_32_done", X86_FEATURE_XENPV
 
        /* Opportunistic SYSRET */
 sysret32_from_system_call:
index 93bd845..3a1d929 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Code for the vDSO.  This version uses the old int $0x80 method.
+ * AT_SYSINFO entry point
 */
 
 #include <asm/dwarf2.h>
@@ -21,35 +21,67 @@ __kernel_vsyscall:
        /*
         * Reshuffle regs so that all of any of the entry instructions
         * will preserve enough state.
+        *
+        * A really nice entry sequence would be:
+        *  pushl %edx
+        *  pushl %ecx
+        *  movl  %esp, %ecx
+        *
+        * Unfortunately, naughty Android versions between July and December
+        * 2015 actually hardcode the traditional Linux SYSENTER entry
+        * sequence.  That is severely broken for a number of reasons (ask
+        * anyone with an AMD CPU, for example).  Nonetheless, we try to keep
+        * it working approximately as well as it ever worked.
+        *
+        * This link may eludicate some of the history:
+        *   https://android-review.googlesource.com/#/q/Iac3295376d61ef83e713ac9b528f3b50aa780cd7
+        * personally, I find it hard to understand what's going on there.
+        *
+        * Note to future user developers: DO NOT USE SYSENTER IN YOUR CODE.
+        * Execute an indirect call to the address in the AT_SYSINFO auxv
+        * entry.  That is the ONLY correct way to make a fast 32-bit system
+        * call on Linux.  (Open-coding int $0x80 is also fine, but it's
+        * slow.)
         */
+       pushl   %ecx
+       CFI_ADJUST_CFA_OFFSET   4
+       CFI_REL_OFFSET          ecx, 0
        pushl   %edx
        CFI_ADJUST_CFA_OFFSET   4
        CFI_REL_OFFSET          edx, 0
-       pushl   %ecx
+       pushl   %ebp
        CFI_ADJUST_CFA_OFFSET   4
-       CFI_REL_OFFSET          ecx, 0
-       movl    %esp, %ecx
+       CFI_REL_OFFSET          ebp, 0
+
+       #define SYSENTER_SEQUENCE       "movl %esp, %ebp; sysenter"
+       #define SYSCALL_SEQUENCE        "movl %ecx, %ebp; syscall"
 
 #ifdef CONFIG_X86_64
        /* If SYSENTER (Intel) or SYSCALL32 (AMD) is available, use it. */
-       ALTERNATIVE_2 "", "sysenter", X86_FEATURE_SYSENTER32, \
-                         "syscall",  X86_FEATURE_SYSCALL32
+       ALTERNATIVE_2 "", SYSENTER_SEQUENCE, X86_FEATURE_SYSENTER32, \
+                         SYSCALL_SEQUENCE,  X86_FEATURE_SYSCALL32
 #else
-       ALTERNATIVE "", "sysenter", X86_FEATURE_SEP
+       ALTERNATIVE "", SYSENTER_SEQUENCE, X86_FEATURE_SEP
 #endif
 
        /* Enter using int $0x80 */
-       movl    (%esp), %ecx
        int     $0x80
 GLOBAL(int80_landing_pad)
 
-       /* Restore ECX and EDX in case they were clobbered. */
-       popl    %ecx
-       CFI_RESTORE             ecx
+       /*
+        * Restore EDX and ECX in case they were clobbered.  EBP is not
+        * clobbered (the kernel restores it), but it's cleaner and
+        * probably faster to pop it than to adjust ESP using addl.
+        */
+       popl    %ebp
+       CFI_RESTORE             ebp
        CFI_ADJUST_CFA_OFFSET   -4
        popl    %edx
        CFI_RESTORE             edx
        CFI_ADJUST_CFA_OFFSET   -4
+       popl    %ecx
+       CFI_RESTORE             ecx
+       CFI_ADJUST_CFA_OFFSET   -4
        ret
        CFI_ENDPROC
 
index e4f8010..f7ba9fb 100644 (file)
 #define X86_FEATURE_PAUSEFILTER ( 8*32+13) /* AMD filtered pause intercept */
 #define X86_FEATURE_PFTHRESHOLD ( 8*32+14) /* AMD pause filter threshold */
 #define X86_FEATURE_VMMCALL     ( 8*32+15) /* Prefer vmmcall to vmcall */
+#define X86_FEATURE_XENPV       ( 8*32+16) /* "" Xen paravirtual guest */
 
 
 /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */
index b72ad0f..b41ee16 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * iosf_mbi.h: Intel OnChip System Fabric MailBox access support
+ * Intel OnChip System Fabric MailBox access support
  */
 
 #ifndef IOSF_MBI_SYMS_H
 #define MBI_MASK_LO            0x000000FF
 #define MBI_ENABLE             0xF0
 
+/* IOSF SB read/write opcodes */
+#define MBI_MMIO_READ          0x00
+#define MBI_MMIO_WRITE         0x01
+#define MBI_CFG_READ           0x04
+#define MBI_CFG_WRITE          0x05
+#define MBI_CR_READ            0x06
+#define MBI_CR_WRITE           0x07
+#define MBI_REG_READ           0x10
+#define MBI_REG_WRITE          0x11
+#define MBI_ESRAM_READ         0x12
+#define MBI_ESRAM_WRITE                0x13
+
 /* Baytrail available units */
 #define BT_MBI_UNIT_AUNIT      0x00
 #define BT_MBI_UNIT_SMC                0x01
 #define BT_MBI_UNIT_SATA       0xA3
 #define BT_MBI_UNIT_PCIE       0xA6
 
-/* Baytrail read/write opcodes */
-#define BT_MBI_AUNIT_READ      0x10
-#define BT_MBI_AUNIT_WRITE     0x11
-#define BT_MBI_SMC_READ                0x10
-#define BT_MBI_SMC_WRITE       0x11
-#define BT_MBI_CPU_READ                0x10
-#define BT_MBI_CPU_WRITE       0x11
-#define BT_MBI_BUNIT_READ      0x10
-#define BT_MBI_BUNIT_WRITE     0x11
-#define BT_MBI_PMC_READ                0x06
-#define BT_MBI_PMC_WRITE       0x07
-#define BT_MBI_GFX_READ                0x00
-#define BT_MBI_GFX_WRITE       0x01
-#define BT_MBI_SMIO_READ       0x06
-#define BT_MBI_SMIO_WRITE      0x07
-#define BT_MBI_USB_READ                0x06
-#define BT_MBI_USB_WRITE       0x07
-#define BT_MBI_SATA_READ       0x00
-#define BT_MBI_SATA_WRITE      0x01
-#define BT_MBI_PCIE_READ       0x00
-#define BT_MBI_PCIE_WRITE      0x01
-
 /* Quark available units */
 #define QRK_MBI_UNIT_HBA       0x00
 #define QRK_MBI_UNIT_HB                0x03
 #define QRK_MBI_UNIT_RMU       0x04
 #define QRK_MBI_UNIT_MM                0x05
-#define QRK_MBI_UNIT_MMESRAM   0x05
 #define QRK_MBI_UNIT_SOC       0x31
 
-/* Quark read/write opcodes */
-#define QRK_MBI_HBA_READ       0x10
-#define QRK_MBI_HBA_WRITE      0x11
-#define QRK_MBI_HB_READ                0x10
-#define QRK_MBI_HB_WRITE       0x11
-#define QRK_MBI_RMU_READ       0x10
-#define QRK_MBI_RMU_WRITE      0x11
-#define QRK_MBI_MM_READ                0x10
-#define QRK_MBI_MM_WRITE       0x11
-#define QRK_MBI_MMESRAM_READ   0x12
-#define QRK_MBI_MMESRAM_WRITE  0x13
-#define QRK_MBI_SOC_READ       0x06
-#define QRK_MBI_SOC_WRITE      0x07
-
 #if IS_ENABLED(CONFIG_IOSF_MBI)
 
 bool iosf_mbi_available(void);
index 10d0596..c759b3c 100644 (file)
@@ -19,6 +19,12 @@ static inline int paravirt_enabled(void)
        return pv_info.paravirt_enabled;
 }
 
+static inline int paravirt_has_feature(unsigned int feature)
+{
+       WARN_ON_ONCE(!pv_info.paravirt_enabled);
+       return (pv_info.features & feature);
+}
+
 static inline void load_sp0(struct tss_struct *tss,
                             struct thread_struct *thread)
 {
index 31247b5..3d44191 100644 (file)
@@ -70,9 +70,14 @@ struct pv_info {
 #endif
 
        int paravirt_enabled;
+       unsigned int features;    /* valid only if paravirt_enabled is set */
        const char *name;
 };
 
+#define paravirt_has(x) paravirt_has_feature(PV_SUPPORTED_##x)
+/* Supported features */
+#define PV_SUPPORTED_RTC        (1<<0)
+
 struct pv_init_ops {
        /*
         * Patch may replace one of the defined code sequences with
index 6752225..2d5a50c 100644 (file)
@@ -472,6 +472,7 @@ static inline unsigned long current_top_of_stack(void)
 #else
 #define __cpuid                        native_cpuid
 #define paravirt_enabled()     0
+#define paravirt_has(x)        0
 
 static inline void load_sp0(struct tss_struct *tss,
                            struct thread_struct *thread)
index 38dd5ef..2bd2292 100644 (file)
@@ -193,20 +193,17 @@ static int __init numachip_system_init(void)
        case 1:
                init_extra_mapping_uc(NUMACHIP_LCSR_BASE, NUMACHIP_LCSR_SIZE);
                numachip_apic_icr_write = numachip1_apic_icr_write;
-               x86_init.pci.arch_init = pci_numachip_init;
                break;
        case 2:
                init_extra_mapping_uc(NUMACHIP2_LCSR_BASE, NUMACHIP2_LCSR_SIZE);
                numachip_apic_icr_write = numachip2_apic_icr_write;
-
-               /* Use MCFG config cycles rather than locked CF8 cycles */
-               raw_pci_ops = &pci_mmcfg;
                break;
        default:
                return 0;
        }
 
        x86_cpuinit.fixup_cpu_id = fixup_cpu_id;
+       x86_init.pci.arch_init = pci_numachip_init;
 
        return 0;
 }
index c5b0d56..7e8a736 100644 (file)
@@ -999,6 +999,17 @@ void do_machine_check(struct pt_regs *regs, long error_code)
        int flags = MF_ACTION_REQUIRED;
        int lmce = 0;
 
+       /* If this CPU is offline, just bail out. */
+       if (cpu_is_offline(smp_processor_id())) {
+               u64 mcgstatus;
+
+               mcgstatus = mce_rdmsrl(MSR_IA32_MCG_STATUS);
+               if (mcgstatus & MCG_STATUS_RIPV) {
+                       mce_wrmsrl(MSR_IA32_MCG_STATUS, 0);
+                       return;
+               }
+       }
+
        ist_enter(regs);
 
        this_cpu_inc(mce_exception_count);
index cd96852..4af8d06 100644 (file)
@@ -200,6 +200,9 @@ static __init int add_rtc_cmos(void)
        }
 #endif
 
+       if (paravirt_enabled() && !paravirt_has(RTC))
+               return -ENODEV;
+
        platform_device_register(&rtc_device);
        dev_info(&rtc_device.dev,
                 "registered platform RTC device (no PNP device found)\n");
index 06332cb..3f5c48d 100644 (file)
@@ -38,6 +38,14 @@ static inline bool guest_cpuid_has_xsave(struct kvm_vcpu *vcpu)
        return best && (best->ecx & bit(X86_FEATURE_XSAVE));
 }
 
+static inline bool guest_cpuid_has_mtrr(struct kvm_vcpu *vcpu)
+{
+       struct kvm_cpuid_entry2 *best;
+
+       best = kvm_find_cpuid_entry(vcpu, 1, 0);
+       return best && (best->edx & bit(X86_FEATURE_MTRR));
+}
+
 static inline bool guest_cpuid_has_tsc_adjust(struct kvm_vcpu *vcpu)
 {
        struct kvm_cpuid_entry2 *best;
index 08116ff..b0ea42b 100644 (file)
@@ -420,6 +420,7 @@ void kvm_pit_load_count(struct kvm *kvm, int channel, u32 val, int hpet_legacy_s
        u8 saved_mode;
        if (hpet_legacy_start) {
                /* save existing mode for later reenablement */
+               WARN_ON(channel != 0);
                saved_mode = kvm->arch.vpit->pit_state.channels[0].mode;
                kvm->arch.vpit->pit_state.channels[0].mode = 0xff; /* disable timer */
                pit_load_count(kvm, channel, val);
index 9e8bf13..3f8c732 100644 (file)
@@ -120,14 +120,22 @@ static u8 mtrr_default_type(struct kvm_mtrr *mtrr_state)
        return mtrr_state->deftype & IA32_MTRR_DEF_TYPE_TYPE_MASK;
 }
 
-static u8 mtrr_disabled_type(void)
+static u8 mtrr_disabled_type(struct kvm_vcpu *vcpu)
 {
        /*
         * Intel SDM 11.11.2.2: all MTRRs are disabled when
         * IA32_MTRR_DEF_TYPE.E bit is cleared, and the UC
         * memory type is applied to all of physical memory.
+        *
+        * However, virtual machines can be run with CPUID such that
+        * there are no MTRRs.  In that case, the firmware will never
+        * enable MTRRs and it is obviously undesirable to run the
+        * guest entirely with UC memory and we use WB.
         */
-       return MTRR_TYPE_UNCACHABLE;
+       if (guest_cpuid_has_mtrr(vcpu))
+               return MTRR_TYPE_UNCACHABLE;
+       else
+               return MTRR_TYPE_WRBACK;
 }
 
 /*
@@ -267,7 +275,7 @@ static int fixed_mtrr_addr_to_seg(u64 addr)
 
        for (seg = 0; seg < seg_num; seg++) {
                mtrr_seg = &fixed_seg_table[seg];
-               if (mtrr_seg->start >= addr && addr < mtrr_seg->end)
+               if (mtrr_seg->start <= addr && addr < mtrr_seg->end)
                        return seg;
        }
 
@@ -300,7 +308,6 @@ static void var_mtrr_range(struct kvm_mtrr_range *range, u64 *start, u64 *end)
        *start = range->base & PAGE_MASK;
 
        mask = range->mask & PAGE_MASK;
-       mask |= ~0ULL << boot_cpu_data.x86_phys_bits;
 
        /* This cannot overflow because writing to the reserved bits of
         * variable MTRRs causes a #GP.
@@ -356,10 +363,14 @@ static void set_var_mtrr_msr(struct kvm_vcpu *vcpu, u32 msr, u64 data)
        if (var_mtrr_range_is_valid(cur))
                list_del(&mtrr_state->var_ranges[index].node);
 
+       /* Extend the mask with all 1 bits to the left, since those
+        * bits must implicitly be 0.  The bits are then cleared
+        * when reading them.
+        */
        if (!is_mtrr_mask)
                cur->base = data;
        else
-               cur->mask = data;
+               cur->mask = data | (-1LL << cpuid_maxphyaddr(vcpu));
 
        /* add it to the list if it's enabled. */
        if (var_mtrr_range_is_valid(cur)) {
@@ -426,6 +437,8 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
                        *pdata = vcpu->arch.mtrr_state.var_ranges[index].base;
                else
                        *pdata = vcpu->arch.mtrr_state.var_ranges[index].mask;
+
+               *pdata &= (1ULL << cpuid_maxphyaddr(vcpu)) - 1;
        }
 
        return 0;
@@ -670,7 +683,7 @@ u8 kvm_mtrr_get_guest_memory_type(struct kvm_vcpu *vcpu, gfn_t gfn)
        }
 
        if (iter.mtrr_disabled)
-               return mtrr_disabled_type();
+               return mtrr_disabled_type(vcpu);
 
        /* not contained in any MTRRs. */
        if (type == -1)
index 83a1c64..899c40f 100644 (file)
@@ -3422,6 +3422,8 @@ static int handle_exit(struct kvm_vcpu *vcpu)
        struct kvm_run *kvm_run = vcpu->run;
        u32 exit_code = svm->vmcb->control.exit_code;
 
+       trace_kvm_exit(exit_code, vcpu, KVM_ISA_SVM);
+
        if (!is_cr_intercept(svm, INTERCEPT_CR0_WRITE))
                vcpu->arch.cr0 = svm->vmcb->save.cr0;
        if (npt_enabled)
@@ -3892,8 +3894,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
        vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp;
        vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip;
 
-       trace_kvm_exit(svm->vmcb->control.exit_code, vcpu, KVM_ISA_SVM);
-
        if (unlikely(svm->vmcb->control.exit_code == SVM_EXIT_NMI))
                kvm_before_handle_nmi(&svm->vcpu);
 
index af823a3..44976a5 100644 (file)
@@ -2803,7 +2803,7 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                msr_info->data = vcpu->arch.ia32_xss;
                break;
        case MSR_TSC_AUX:
-               if (!guest_cpuid_has_rdtscp(vcpu))
+               if (!guest_cpuid_has_rdtscp(vcpu) && !msr_info->host_initiated)
                        return 1;
                /* Otherwise falls through */
        default:
@@ -2909,7 +2909,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                        clear_atomic_switch_msr(vmx, MSR_IA32_XSS);
                break;
        case MSR_TSC_AUX:
-               if (!guest_cpuid_has_rdtscp(vcpu))
+               if (!guest_cpuid_has_rdtscp(vcpu) && !msr_info->host_initiated)
                        return 1;
                /* Check reserved bit, higher 32 bits should be zero */
                if ((data >> 32) != 0)
@@ -8042,6 +8042,8 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
        u32 exit_reason = vmx->exit_reason;
        u32 vectoring_info = vmx->idt_vectoring_info;
 
+       trace_kvm_exit(exit_reason, vcpu, KVM_ISA_VMX);
+
        /*
         * Flush logged GPAs PML buffer, this will make dirty_bitmap more
         * updated. Another good is, in kvm_vm_ioctl_get_dirty_log, before
@@ -8668,7 +8670,6 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
        vmx->loaded_vmcs->launched = 1;
 
        vmx->exit_reason = vmcs_read32(VM_EXIT_REASON);
-       trace_kvm_exit(vmx->exit_reason, vcpu, KVM_ISA_VMX);
 
        /*
         * the KVM_REQ_EVENT optimization bit is only on for one entry, and if
index eed3228..97592e1 100644 (file)
@@ -3572,9 +3572,11 @@ static int kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps)
 
 static int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps)
 {
+       int i;
        mutex_lock(&kvm->arch.vpit->pit_state.lock);
        memcpy(&kvm->arch.vpit->pit_state, ps, sizeof(struct kvm_pit_state));
-       kvm_pit_load_count(kvm, 0, ps->channels[0].count, 0);
+       for (i = 0; i < 3; i++)
+               kvm_pit_load_count(kvm, i, ps->channels[i].count, 0);
        mutex_unlock(&kvm->arch.vpit->pit_state.lock);
        return 0;
 }
@@ -3593,6 +3595,7 @@ static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)
 static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)
 {
        int start = 0;
+       int i;
        u32 prev_legacy, cur_legacy;
        mutex_lock(&kvm->arch.vpit->pit_state.lock);
        prev_legacy = kvm->arch.vpit->pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY;
@@ -3602,7 +3605,9 @@ static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)
        memcpy(&kvm->arch.vpit->pit_state.channels, &ps->channels,
               sizeof(kvm->arch.vpit->pit_state.channels));
        kvm->arch.vpit->pit_state.flags = ps->flags;
-       kvm_pit_load_count(kvm, 0, kvm->arch.vpit->pit_state.channels[0].count, start);
+       for (i = 0; i < 3; i++)
+               kvm_pit_load_count(kvm, i, kvm->arch.vpit->pit_state.channels[i].count,
+                                  start && i == 0);
        mutex_unlock(&kvm->arch.vpit->pit_state.lock);
        return 0;
 }
@@ -6515,6 +6520,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
        if (req_immediate_exit)
                smp_send_reschedule(vcpu->cpu);
 
+       trace_kvm_entry(vcpu->vcpu_id);
+       wait_lapic_expire(vcpu);
        __kvm_guest_enter();
 
        if (unlikely(vcpu->arch.switch_db_regs)) {
@@ -6527,8 +6534,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
                vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_RELOAD;
        }
 
-       trace_kvm_entry(vcpu->vcpu_id);
-       wait_lapic_expire(vcpu);
        kvm_x86_ops->run(vcpu);
 
        /*
index a0d09f6..a43b2ea 100644 (file)
@@ -1414,6 +1414,7 @@ __init void lguest_init(void)
        pv_info.kernel_rpl = 1;
        /* Everyone except Xen runs with this set. */
        pv_info.shared_kernel_pmd = 1;
+       pv_info.features = 0;
 
        /*
         * We set up all the lguest overrides for sensitive operations.  These
index 5ca8ead..81c769e 100644 (file)
@@ -25,8 +25,6 @@
 #include <asm/cpu_device_id.h>
 #include <asm/iosf_mbi.h>
 
-/* Side band Interface port */
-#define PUNIT_PORT             0x04
 /* Power gate status reg */
 #define PWRGT_STATUS           0x61
 /* Subsystem config/status Video processor */
@@ -85,9 +83,8 @@ static int punit_dev_state_show(struct seq_file *seq_file, void *unused)
 
        seq_puts(seq_file, "\n\nPUNIT NORTH COMPLEX DEVICES :\n");
        while (punit_devp->name) {
-               status = iosf_mbi_read(PUNIT_PORT, BT_MBI_PMC_READ,
-                                      punit_devp->reg,
-                                      &punit_pwr_status);
+               status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
+                                      punit_devp->reg, &punit_pwr_status);
                if (status) {
                        seq_printf(seq_file, "%9s : Read Failed\n",
                                   punit_devp->name);
index 0ee619f..c1bdafa 100644 (file)
@@ -111,23 +111,19 @@ static int imr_read(struct imr_device *idev, u32 imr_id, struct imr_regs *imr)
        u32 reg = imr_id * IMR_NUM_REGS + idev->reg_base;
        int ret;
 
-       ret = iosf_mbi_read(QRK_MBI_UNIT_MM, QRK_MBI_MM_READ,
-                               reg++, &imr->addr_lo);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_MM, MBI_REG_READ, reg++, &imr->addr_lo);
        if (ret)
                return ret;
 
-       ret = iosf_mbi_read(QRK_MBI_UNIT_MM, QRK_MBI_MM_READ,
-                               reg++, &imr->addr_hi);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_MM, MBI_REG_READ, reg++, &imr->addr_hi);
        if (ret)
                return ret;
 
-       ret = iosf_mbi_read(QRK_MBI_UNIT_MM, QRK_MBI_MM_READ,
-                               reg++, &imr->rmask);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_MM, MBI_REG_READ, reg++, &imr->rmask);
        if (ret)
                return ret;
 
-       return iosf_mbi_read(QRK_MBI_UNIT_MM, QRK_MBI_MM_READ,
-                               reg++, &imr->wmask);
+       return iosf_mbi_read(QRK_MBI_UNIT_MM, MBI_REG_READ, reg++, &imr->wmask);
 }
 
 /**
@@ -151,31 +147,27 @@ static int imr_write(struct imr_device *idev, u32 imr_id,
 
        local_irq_save(flags);
 
-       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, QRK_MBI_MM_WRITE, reg++,
-                               imr->addr_lo);
+       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, MBI_REG_WRITE, reg++, imr->addr_lo);
        if (ret)
                goto failed;
 
-       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, QRK_MBI_MM_WRITE,
-                               reg++, imr->addr_hi);
+       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, MBI_REG_WRITE, reg++, imr->addr_hi);
        if (ret)
                goto failed;
 
-       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, QRK_MBI_MM_WRITE,
-                               reg++, imr->rmask);
+       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, MBI_REG_WRITE, reg++, imr->rmask);
        if (ret)
                goto failed;
 
-       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, QRK_MBI_MM_WRITE,
-                               reg++, imr->wmask);
+       ret = iosf_mbi_write(QRK_MBI_UNIT_MM, MBI_REG_WRITE, reg++, imr->wmask);
        if (ret)
                goto failed;
 
        /* Lock bit must be set separately to addr_lo address bits. */
        if (lock) {
                imr->addr_lo |= IMR_LOCK;
-               ret = iosf_mbi_write(QRK_MBI_UNIT_MM, QRK_MBI_MM_WRITE,
-                                       reg - IMR_NUM_REGS, imr->addr_lo);
+               ret = iosf_mbi_write(QRK_MBI_UNIT_MM, MBI_REG_WRITE,
+                                    reg - IMR_NUM_REGS, imr->addr_lo);
                if (ret)
                        goto failed;
        }
index e5f854c..14fcd01 100644 (file)
@@ -470,7 +470,7 @@ long sys_sigreturn(void)
        struct sigcontext __user *sc = &frame->sc;
        int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long);
 
-       if (copy_from_user(&set.sig[0], (void *)sc->oldmask, sizeof(set.sig[0])) ||
+       if (copy_from_user(&set.sig[0], &sc->oldmask, sizeof(set.sig[0])) ||
            copy_from_user(&set.sig[1], frame->extramask, sig_size))
                goto segfault;
 
index 5774800..b7de78b 100644 (file)
@@ -1192,7 +1192,7 @@ static const struct pv_info xen_info __initconst = {
 #ifdef CONFIG_X86_64
        .extra_user_64bit_cs = FLAT_USER_CS64,
 #endif
-
+       .features = 0,
        .name = "Xen",
 };
 
@@ -1535,6 +1535,8 @@ asmlinkage __visible void __init xen_start_kernel(void)
 
        /* Install Xen paravirt ops */
        pv_info = xen_info;
+       if (xen_initial_domain())
+               pv_info.features |= PV_SUPPORTED_RTC;
        pv_init_ops = xen_init_ops;
        pv_apic_ops = xen_apic_ops;
        if (!xen_pvh_domain()) {
@@ -1886,8 +1888,10 @@ EXPORT_SYMBOL_GPL(xen_hvm_need_lapic);
 
 static void xen_set_cpu_features(struct cpuinfo_x86 *c)
 {
-       if (xen_pv_domain())
+       if (xen_pv_domain()) {
                clear_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS);
+               set_cpu_cap(c, X86_FEATURE_XENPV);
+       }
 }
 
 const struct hypervisor_x86 x86_hyper_xen = {
index 3705eab..df0c405 100644 (file)
@@ -1,6 +1,7 @@
 #include <linux/types.h>
 #include <linux/tick.h>
 
+#include <xen/xen.h>
 #include <xen/interface/xen.h>
 #include <xen/grant_table.h>
 #include <xen/events.h>
index 3636be4..33e2f62 100644 (file)
@@ -206,6 +206,22 @@ void blk_delay_queue(struct request_queue *q, unsigned long msecs)
 }
 EXPORT_SYMBOL(blk_delay_queue);
 
+/**
+ * blk_start_queue_async - asynchronously restart a previously stopped queue
+ * @q:    The &struct request_queue in question
+ *
+ * Description:
+ *   blk_start_queue_async() will clear the stop flag on the queue, and
+ *   ensure that the request_fn for the queue is run from an async
+ *   context.
+ **/
+void blk_start_queue_async(struct request_queue *q)
+{
+       queue_flag_clear(QUEUE_FLAG_STOPPED, q);
+       blk_run_queue_async(q);
+}
+EXPORT_SYMBOL(blk_start_queue_async);
+
 /**
  * blk_start_queue - restart a previously stopped queue
  * @q:    The &struct request_queue in question
@@ -1689,8 +1705,6 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio)
        struct request *req;
        unsigned int request_count = 0;
 
-       blk_queue_split(q, &bio, q->bio_split);
-
        /*
         * low level driver can indicate that it wants pages above a
         * certain limit bounced to low memory (ie for highmem, or even
@@ -1698,6 +1712,8 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio)
         */
        blk_queue_bounce(q, &bio);
 
+       blk_queue_split(q, &bio, q->bio_split);
+
        if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {
                bio->bi_error = -EIO;
                bio_endio(bio);
index ca9efe1..634b4d1 100644 (file)
@@ -47,7 +47,7 @@ struct skcipher_ctx {
        bool merge;
        bool enc;
 
-       struct ablkcipher_request req;
+       struct skcipher_request req;
 };
 
 struct skcipher_async_rsgl {
@@ -64,13 +64,13 @@ struct skcipher_async_req {
 };
 
 #define GET_SREQ(areq, ctx) (struct skcipher_async_req *)((char *)areq + \
-       crypto_ablkcipher_reqsize(crypto_ablkcipher_reqtfm(&ctx->req)))
+       crypto_skcipher_reqsize(crypto_skcipher_reqtfm(&ctx->req)))
 
 #define GET_REQ_SIZE(ctx) \
-       crypto_ablkcipher_reqsize(crypto_ablkcipher_reqtfm(&ctx->req))
+       crypto_skcipher_reqsize(crypto_skcipher_reqtfm(&ctx->req))
 
 #define GET_IV_SIZE(ctx) \
-       crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(&ctx->req))
+       crypto_skcipher_ivsize(crypto_skcipher_reqtfm(&ctx->req))
 
 #define MAX_SGL_ENTS ((4096 - sizeof(struct skcipher_sg_list)) / \
                      sizeof(struct scatterlist) - 1)
@@ -302,8 +302,8 @@ static int skcipher_sendmsg(struct socket *sock, struct msghdr *msg,
        struct sock *sk = sock->sk;
        struct alg_sock *ask = alg_sk(sk);
        struct skcipher_ctx *ctx = ask->private;
-       struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(&ctx->req);
-       unsigned ivsize = crypto_ablkcipher_ivsize(tfm);
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(&ctx->req);
+       unsigned ivsize = crypto_skcipher_ivsize(tfm);
        struct skcipher_sg_list *sgl;
        struct af_alg_control con = {};
        long copied = 0;
@@ -507,7 +507,7 @@ static int skcipher_recvmsg_async(struct socket *sock, struct msghdr *msg,
        struct skcipher_sg_list *sgl;
        struct scatterlist *sg;
        struct skcipher_async_req *sreq;
-       struct ablkcipher_request *req;
+       struct skcipher_request *req;
        struct skcipher_async_rsgl *last_rsgl = NULL;
        unsigned int txbufs = 0, len = 0, tx_nents = skcipher_all_sg_nents(ctx);
        unsigned int reqlen = sizeof(struct skcipher_async_req) +
@@ -531,9 +531,9 @@ static int skcipher_recvmsg_async(struct socket *sock, struct msghdr *msg,
        }
        sg_init_table(sreq->tsg, tx_nents);
        memcpy(sreq->iv, ctx->iv, GET_IV_SIZE(ctx));
-       ablkcipher_request_set_tfm(req, crypto_ablkcipher_reqtfm(&ctx->req));
-       ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
-                                       skcipher_async_cb, sk);
+       skcipher_request_set_tfm(req, crypto_skcipher_reqtfm(&ctx->req));
+       skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
+                                     skcipher_async_cb, sk);
 
        while (iov_iter_count(&msg->msg_iter)) {
                struct skcipher_async_rsgl *rsgl;
@@ -608,10 +608,10 @@ static int skcipher_recvmsg_async(struct socket *sock, struct msghdr *msg,
        if (mark)
                sg_mark_end(sreq->tsg + txbufs - 1);
 
-       ablkcipher_request_set_crypt(req, sreq->tsg, sreq->first_sgl.sgl.sg,
-                                    len, sreq->iv);
-       err = ctx->enc ? crypto_ablkcipher_encrypt(req) :
-                        crypto_ablkcipher_decrypt(req);
+       skcipher_request_set_crypt(req, sreq->tsg, sreq->first_sgl.sgl.sg,
+                                  len, sreq->iv);
+       err = ctx->enc ? crypto_skcipher_encrypt(req) :
+                        crypto_skcipher_decrypt(req);
        if (err == -EINPROGRESS) {
                atomic_inc(&ctx->inflight);
                err = -EIOCBQUEUED;
@@ -632,7 +632,7 @@ static int skcipher_recvmsg_sync(struct socket *sock, struct msghdr *msg,
        struct sock *sk = sock->sk;
        struct alg_sock *ask = alg_sk(sk);
        struct skcipher_ctx *ctx = ask->private;
-       unsigned bs = crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(
+       unsigned bs = crypto_skcipher_blocksize(crypto_skcipher_reqtfm(
                &ctx->req));
        struct skcipher_sg_list *sgl;
        struct scatterlist *sg;
@@ -669,14 +669,13 @@ static int skcipher_recvmsg_sync(struct socket *sock, struct msghdr *msg,
                if (!used)
                        goto free;
 
-               ablkcipher_request_set_crypt(&ctx->req, sg,
-                                            ctx->rsgl.sg, used,
-                                            ctx->iv);
+               skcipher_request_set_crypt(&ctx->req, sg, ctx->rsgl.sg, used,
+                                          ctx->iv);
 
                err = af_alg_wait_for_completion(
                                ctx->enc ?
-                                       crypto_ablkcipher_encrypt(&ctx->req) :
-                                       crypto_ablkcipher_decrypt(&ctx->req),
+                                       crypto_skcipher_encrypt(&ctx->req) :
+                                       crypto_skcipher_decrypt(&ctx->req),
                                &ctx->completion);
 
 free:
@@ -751,17 +750,17 @@ static struct proto_ops algif_skcipher_ops = {
 
 static void *skcipher_bind(const char *name, u32 type, u32 mask)
 {
-       return crypto_alloc_ablkcipher(name, type, mask);
+       return crypto_alloc_skcipher(name, type, mask);
 }
 
 static void skcipher_release(void *private)
 {
-       crypto_free_ablkcipher(private);
+       crypto_free_skcipher(private);
 }
 
 static int skcipher_setkey(void *private, const u8 *key, unsigned int keylen)
 {
-       return crypto_ablkcipher_setkey(private, key, keylen);
+       return crypto_skcipher_setkey(private, key, keylen);
 }
 
 static void skcipher_wait(struct sock *sk)
@@ -778,13 +777,13 @@ static void skcipher_sock_destruct(struct sock *sk)
 {
        struct alg_sock *ask = alg_sk(sk);
        struct skcipher_ctx *ctx = ask->private;
-       struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(&ctx->req);
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(&ctx->req);
 
        if (atomic_read(&ctx->inflight))
                skcipher_wait(sk);
 
        skcipher_free_sgl(sk);
-       sock_kzfree_s(sk, ctx->iv, crypto_ablkcipher_ivsize(tfm));
+       sock_kzfree_s(sk, ctx->iv, crypto_skcipher_ivsize(tfm));
        sock_kfree_s(sk, ctx, ctx->len);
        af_alg_release_parent(sk);
 }
@@ -793,20 +792,20 @@ static int skcipher_accept_parent(void *private, struct sock *sk)
 {
        struct skcipher_ctx *ctx;
        struct alg_sock *ask = alg_sk(sk);
-       unsigned int len = sizeof(*ctx) + crypto_ablkcipher_reqsize(private);
+       unsigned int len = sizeof(*ctx) + crypto_skcipher_reqsize(private);
 
        ctx = sock_kmalloc(sk, len, GFP_KERNEL);
        if (!ctx)
                return -ENOMEM;
 
-       ctx->iv = sock_kmalloc(sk, crypto_ablkcipher_ivsize(private),
+       ctx->iv = sock_kmalloc(sk, crypto_skcipher_ivsize(private),
                               GFP_KERNEL);
        if (!ctx->iv) {
                sock_kfree_s(sk, ctx, len);
                return -ENOMEM;
        }
 
-       memset(ctx->iv, 0, crypto_ablkcipher_ivsize(private));
+       memset(ctx->iv, 0, crypto_skcipher_ivsize(private));
 
        INIT_LIST_HEAD(&ctx->tsgl);
        ctx->len = len;
@@ -819,9 +818,9 @@ static int skcipher_accept_parent(void *private, struct sock *sk)
 
        ask->private = ctx;
 
-       ablkcipher_request_set_tfm(&ctx->req, private);
-       ablkcipher_request_set_callback(&ctx->req, CRYPTO_TFM_REQ_MAY_BACKLOG,
-                                       af_alg_complete, &ctx->completion);
+       skcipher_request_set_tfm(&ctx->req, private);
+       skcipher_request_set_callback(&ctx->req, CRYPTO_TFM_REQ_MAY_BACKLOG,
+                                     af_alg_complete, &ctx->completion);
 
        sk->sk_destruct = skcipher_sock_destruct;
 
index f8c0b8d..88bc8e6 100644 (file)
@@ -53,7 +53,7 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
        struct dmaengine_unmap_data *unmap = NULL;
 
        if (device)
-               unmap = dmaengine_get_unmap_data(device->dev, 2, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(device->dev, 2, GFP_NOWAIT);
 
        if (unmap && is_dma_copy_aligned(device, src_offset, dest_offset, len)) {
                unsigned long dma_prep_flags = 0;
index 5d355e0..c0748bb 100644 (file)
@@ -188,7 +188,7 @@ async_gen_syndrome(struct page **blocks, unsigned int offset, int disks,
        BUG_ON(disks > 255 || !(P(blocks, disks) || Q(blocks, disks)));
 
        if (device)
-               unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOWAIT);
 
        /* XORing P/Q is only implemented in software */
        if (unmap && !(submit->flags & ASYNC_TX_PQ_XOR_DST) &&
@@ -307,7 +307,7 @@ async_syndrome_val(struct page **blocks, unsigned int offset, int disks,
        BUG_ON(disks < 4);
 
        if (device)
-               unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOWAIT);
 
        if (unmap && disks <= dma_maxpq(device, 0) &&
            is_dma_pq_aligned(device, offset, 0, len)) {
index 934a849..8fab627 100644 (file)
@@ -41,7 +41,7 @@ async_sum_product(struct page *dest, struct page **srcs, unsigned char *coef,
        u8 *a, *b, *c;
 
        if (dma)
-               unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOWAIT);
 
        if (unmap) {
                struct device *dev = dma->dev;
@@ -105,7 +105,7 @@ async_mult(struct page *dest, struct page *src, u8 coef, size_t len,
        u8 *d, *s;
 
        if (dma)
-               unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(dma->dev, 3, GFP_NOWAIT);
 
        if (unmap) {
                dma_addr_t dma_dest[2];
index e1bce26..da75777 100644 (file)
@@ -182,7 +182,7 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset,
        BUG_ON(src_cnt <= 1);
 
        if (device)
-               unmap = dmaengine_get_unmap_data(device->dev, src_cnt+1, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(device->dev, src_cnt+1, GFP_NOWAIT);
 
        if (unmap && is_dma_xor_aligned(device, offset, 0, len)) {
                struct dma_async_tx_descriptor *tx;
@@ -278,7 +278,7 @@ async_xor_val(struct page *dest, struct page **src_list, unsigned int offset,
        BUG_ON(src_cnt <= 1);
 
        if (device)
-               unmap = dmaengine_get_unmap_data(device->dev, src_cnt, GFP_NOIO);
+               unmap = dmaengine_get_unmap_data(device->dev, src_cnt, GFP_NOWAIT);
 
        if (unmap && src_cnt <= device->max_xor &&
            is_dma_xor_aligned(device, offset, 0, len)) {
index 5eef4cb..82b96ee 100644 (file)
@@ -58,14 +58,25 @@ config ACPI_CCA_REQUIRED
        bool
 
 config ACPI_DEBUGGER
-       bool "AML debugger interface (EXPERIMENTAL)"
+       bool "AML debugger interface"
        select ACPI_DEBUG
        help
-         Enable in-kernel debugging of AML facilities: statistics, internal
-         object dump, single step control method execution.
+         Enable in-kernel debugging of AML facilities: statistics,
+         internal object dump, single step control method execution.
          This is still under development, currently enabling this only
          results in the compilation of the ACPICA debugger files.
 
+if ACPI_DEBUGGER
+
+config ACPI_DEBUGGER_USER
+       tristate "Userspace debugger accessiblity"
+       depends on DEBUG_FS
+       help
+         Export /sys/kernel/debug/acpi/acpidbg for userspace utilities
+         to access the debugger functionalities.
+
+endif
+
 config ACPI_SLEEP
        bool
        depends on SUSPEND || HIBERNATION
index 675eaf3..c6f236f 100644 (file)
@@ -79,6 +79,7 @@ obj-$(CONFIG_ACPI_EC_DEBUGFS) += ec_sys.o
 obj-$(CONFIG_ACPI_CUSTOM_METHOD)+= custom_method.o
 obj-$(CONFIG_ACPI_BGRT)                += bgrt.o
 obj-$(CONFIG_ACPI_CPPC_LIB)    += cppc_acpi.o
+obj-$(CONFIG_ACPI_DEBUGGER_USER) += acpi_dbg.o
 
 # processor has its own "processor." module_param namespace
 processor-y                    := processor_driver.o
index a450e7a..d507cf6 100644 (file)
@@ -51,7 +51,7 @@ struct apd_private_data {
        const struct apd_device_desc *dev_desc;
 };
 
-#ifdef CONFIG_X86_AMD_PLATFORM_DEVICE
+#if defined(CONFIG_X86_AMD_PLATFORM_DEVICE) || defined(CONFIG_ARM64)
 #define APD_ADDR(desc) ((unsigned long)&desc)
 
 static int acpi_apd_setup(struct apd_private_data *pdata)
@@ -71,6 +71,7 @@ static int acpi_apd_setup(struct apd_private_data *pdata)
        return 0;
 }
 
+#ifdef CONFIG_X86_AMD_PLATFORM_DEVICE
 static struct apd_device_desc cz_i2c_desc = {
        .setup = acpi_apd_setup,
        .fixed_clk_rate = 133000000,
@@ -80,6 +81,14 @@ static struct apd_device_desc cz_uart_desc = {
        .setup = acpi_apd_setup,
        .fixed_clk_rate = 48000000,
 };
+#endif
+
+#ifdef CONFIG_ARM64
+static struct apd_device_desc xgene_i2c_desc = {
+       .setup = acpi_apd_setup,
+       .fixed_clk_rate = 100000000,
+};
+#endif
 
 #else
 
@@ -132,9 +141,14 @@ static int acpi_apd_create_device(struct acpi_device *adev,
 
 static const struct acpi_device_id acpi_apd_device_ids[] = {
        /* Generic apd devices */
+#ifdef CONFIG_X86_AMD_PLATFORM_DEVICE
        { "AMD0010", APD_ADDR(cz_i2c_desc) },
        { "AMD0020", APD_ADDR(cz_uart_desc) },
        { "AMD0030", },
+#endif
+#ifdef CONFIG_ARM64
+       { "APMC0D0F", APD_ADDR(xgene_i2c_desc) },
+#endif
        { }
 };
 
diff --git a/drivers/acpi/acpi_dbg.c b/drivers/acpi/acpi_dbg.c
new file mode 100644 (file)
index 0000000..15e4604
--- /dev/null
@@ -0,0 +1,804 @@
+/*
+ * ACPI AML interfacing support
+ *
+ * Copyright (C) 2015, Intel Corporation
+ * Authors: Lv Zheng <lv.zheng@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/* #define DEBUG */
+#define pr_fmt(fmt) "ACPI : AML: " fmt
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/wait.h>
+#include <linux/poll.h>
+#include <linux/sched.h>
+#include <linux/kthread.h>
+#include <linux/proc_fs.h>
+#include <linux/debugfs.h>
+#include <linux/circ_buf.h>
+#include <linux/acpi.h>
+#include "internal.h"
+
+#define ACPI_AML_BUF_ALIGN     (sizeof (acpi_size))
+#define ACPI_AML_BUF_SIZE      PAGE_SIZE
+
+#define circ_count(circ) \
+       (CIRC_CNT((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+#define circ_count_to_end(circ) \
+       (CIRC_CNT_TO_END((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+#define circ_space(circ) \
+       (CIRC_SPACE((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+#define circ_space_to_end(circ) \
+       (CIRC_SPACE_TO_END((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+
+#define ACPI_AML_OPENED                0x0001
+#define ACPI_AML_CLOSED                0x0002
+#define ACPI_AML_IN_USER       0x0004 /* user space is writing cmd */
+#define ACPI_AML_IN_KERN       0x0008 /* kernel space is reading cmd */
+#define ACPI_AML_OUT_USER      0x0010 /* user space is reading log */
+#define ACPI_AML_OUT_KERN      0x0020 /* kernel space is writing log */
+#define ACPI_AML_USER          (ACPI_AML_IN_USER | ACPI_AML_OUT_USER)
+#define ACPI_AML_KERN          (ACPI_AML_IN_KERN | ACPI_AML_OUT_KERN)
+#define ACPI_AML_BUSY          (ACPI_AML_USER | ACPI_AML_KERN)
+#define ACPI_AML_OPEN          (ACPI_AML_OPENED | ACPI_AML_CLOSED)
+
+struct acpi_aml_io {
+       wait_queue_head_t wait;
+       unsigned long flags;
+       unsigned long users;
+       struct mutex lock;
+       struct task_struct *thread;
+       char out_buf[ACPI_AML_BUF_SIZE] __aligned(ACPI_AML_BUF_ALIGN);
+       struct circ_buf out_crc;
+       char in_buf[ACPI_AML_BUF_SIZE] __aligned(ACPI_AML_BUF_ALIGN);
+       struct circ_buf in_crc;
+       acpi_osd_exec_callback function;
+       void *context;
+       unsigned long usages;
+};
+
+static struct acpi_aml_io acpi_aml_io;
+static bool acpi_aml_initialized;
+static struct file *acpi_aml_active_reader;
+static struct dentry *acpi_aml_dentry;
+
+static inline bool __acpi_aml_running(void)
+{
+       return acpi_aml_io.thread ? true : false;
+}
+
+static inline bool __acpi_aml_access_ok(unsigned long flag)
+{
+       /*
+        * The debugger interface is in opened state (OPENED && !CLOSED),
+        * then it is allowed to access the debugger buffers from either
+        * user space or the kernel space.
+        * In addition, for the kernel space, only the debugger thread
+        * (thread ID matched) is allowed to access.
+        */
+       if (!(acpi_aml_io.flags & ACPI_AML_OPENED) ||
+           (acpi_aml_io.flags & ACPI_AML_CLOSED) ||
+           !__acpi_aml_running())
+               return false;
+       if ((flag & ACPI_AML_KERN) &&
+           current != acpi_aml_io.thread)
+               return false;
+       return true;
+}
+
+static inline bool __acpi_aml_readable(struct circ_buf *circ, unsigned long flag)
+{
+       /*
+        * Another read is not in progress and there is data in buffer
+        * available for read.
+        */
+       if (!(acpi_aml_io.flags & flag) && circ_count(circ))
+               return true;
+       return false;
+}
+
+static inline bool __acpi_aml_writable(struct circ_buf *circ, unsigned long flag)
+{
+       /*
+        * Another write is not in progress and there is buffer space
+        * available for write.
+        */
+       if (!(acpi_aml_io.flags & flag) && circ_space(circ))
+               return true;
+       return false;
+}
+
+static inline bool __acpi_aml_busy(void)
+{
+       if (acpi_aml_io.flags & ACPI_AML_BUSY)
+               return true;
+       return false;
+}
+
+static inline bool __acpi_aml_opened(void)
+{
+       if (acpi_aml_io.flags & ACPI_AML_OPEN)
+               return true;
+       return false;
+}
+
+static inline bool __acpi_aml_used(void)
+{
+       return acpi_aml_io.usages ? true : false;
+}
+
+static inline bool acpi_aml_running(void)
+{
+       bool ret;
+
+       mutex_lock(&acpi_aml_io.lock);
+       ret = __acpi_aml_running();
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static bool acpi_aml_busy(void)
+{
+       bool ret;
+
+       mutex_lock(&acpi_aml_io.lock);
+       ret = __acpi_aml_busy();
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static bool acpi_aml_used(void)
+{
+       bool ret;
+
+       /*
+        * The usage count is prepared to avoid race conditions between the
+        * starts and the stops of the debugger thread.
+        */
+       mutex_lock(&acpi_aml_io.lock);
+       ret = __acpi_aml_used();
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static bool acpi_aml_kern_readable(void)
+{
+       bool ret;
+
+       mutex_lock(&acpi_aml_io.lock);
+       ret = !__acpi_aml_access_ok(ACPI_AML_IN_KERN) ||
+             __acpi_aml_readable(&acpi_aml_io.in_crc, ACPI_AML_IN_KERN);
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static bool acpi_aml_kern_writable(void)
+{
+       bool ret;
+
+       mutex_lock(&acpi_aml_io.lock);
+       ret = !__acpi_aml_access_ok(ACPI_AML_OUT_KERN) ||
+             __acpi_aml_writable(&acpi_aml_io.out_crc, ACPI_AML_OUT_KERN);
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static bool acpi_aml_user_readable(void)
+{
+       bool ret;
+
+       mutex_lock(&acpi_aml_io.lock);
+       ret = !__acpi_aml_access_ok(ACPI_AML_OUT_USER) ||
+             __acpi_aml_readable(&acpi_aml_io.out_crc, ACPI_AML_OUT_USER);
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static bool acpi_aml_user_writable(void)
+{
+       bool ret;
+
+       mutex_lock(&acpi_aml_io.lock);
+       ret = !__acpi_aml_access_ok(ACPI_AML_IN_USER) ||
+             __acpi_aml_writable(&acpi_aml_io.in_crc, ACPI_AML_IN_USER);
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static int acpi_aml_lock_write(struct circ_buf *circ, unsigned long flag)
+{
+       int ret = 0;
+
+       mutex_lock(&acpi_aml_io.lock);
+       if (!__acpi_aml_access_ok(flag)) {
+               ret = -EFAULT;
+               goto out;
+       }
+       if (!__acpi_aml_writable(circ, flag)) {
+               ret = -EAGAIN;
+               goto out;
+       }
+       acpi_aml_io.flags |= flag;
+out:
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static int acpi_aml_lock_read(struct circ_buf *circ, unsigned long flag)
+{
+       int ret = 0;
+
+       mutex_lock(&acpi_aml_io.lock);
+       if (!__acpi_aml_access_ok(flag)) {
+               ret = -EFAULT;
+               goto out;
+       }
+       if (!__acpi_aml_readable(circ, flag)) {
+               ret = -EAGAIN;
+               goto out;
+       }
+       acpi_aml_io.flags |= flag;
+out:
+       mutex_unlock(&acpi_aml_io.lock);
+       return ret;
+}
+
+static void acpi_aml_unlock_fifo(unsigned long flag, bool wakeup)
+{
+       mutex_lock(&acpi_aml_io.lock);
+       acpi_aml_io.flags &= ~flag;
+       if (wakeup)
+               wake_up_interruptible(&acpi_aml_io.wait);
+       mutex_unlock(&acpi_aml_io.lock);
+}
+
+static int acpi_aml_write_kern(const char *buf, int len)
+{
+       int ret;
+       struct circ_buf *crc = &acpi_aml_io.out_crc;
+       int n;
+       char *p;
+
+       ret = acpi_aml_lock_write(crc, ACPI_AML_OUT_KERN);
+       if (IS_ERR_VALUE(ret))
+               return ret;
+       /* sync tail before inserting logs */
+       smp_mb();
+       p = &crc->buf[crc->head];
+       n = min(len, circ_space_to_end(crc));
+       memcpy(p, buf, n);
+       /* sync head after inserting logs */
+       smp_wmb();
+       crc->head = (crc->head + n) & (ACPI_AML_BUF_SIZE - 1);
+       acpi_aml_unlock_fifo(ACPI_AML_OUT_KERN, true);
+       return n;
+}
+
+static int acpi_aml_readb_kern(void)
+{
+       int ret;
+       struct circ_buf *crc = &acpi_aml_io.in_crc;
+       char *p;
+
+       ret = acpi_aml_lock_read(crc, ACPI_AML_IN_KERN);
+       if (IS_ERR_VALUE(ret))
+               return ret;
+       /* sync head before removing cmds */
+       smp_rmb();
+       p = &crc->buf[crc->tail];
+       ret = (int)*p;
+       /* sync tail before inserting cmds */
+       smp_mb();
+       crc->tail = (crc->tail + 1) & (ACPI_AML_BUF_SIZE - 1);
+       acpi_aml_unlock_fifo(ACPI_AML_IN_KERN, true);
+       return ret;
+}
+
+/*
+ * acpi_aml_write_log() - Capture debugger output
+ * @msg: the debugger output
+ *
+ * This function should be used to implement acpi_os_printf() to filter out
+ * the debugger output and store the output into the debugger interface
+ * buffer. Return the size of stored logs or errno.
+ */
+static ssize_t acpi_aml_write_log(const char *msg)
+{
+       int ret = 0;
+       int count = 0, size = 0;
+
+       if (!acpi_aml_initialized)
+               return -ENODEV;
+       if (msg)
+               count = strlen(msg);
+       while (count > 0) {
+again:
+               ret = acpi_aml_write_kern(msg + size, count);
+               if (ret == -EAGAIN) {
+                       ret = wait_event_interruptible(acpi_aml_io.wait,
+                               acpi_aml_kern_writable());
+                       /*
+                        * We need to retry when the condition
+                        * becomes true.
+                        */
+                       if (ret == 0)
+                               goto again;
+                       break;
+               }
+               if (IS_ERR_VALUE(ret))
+                       break;
+               size += ret;
+               count -= ret;
+       }
+       return size > 0 ? size : ret;
+}
+
+/*
+ * acpi_aml_read_cmd() - Capture debugger input
+ * @msg: the debugger input
+ * @size: the size of the debugger input
+ *
+ * This function should be used to implement acpi_os_get_line() to capture
+ * the debugger input commands and store the input commands into the
+ * debugger interface buffer. Return the size of stored commands or errno.
+ */
+static ssize_t acpi_aml_read_cmd(char *msg, size_t count)
+{
+       int ret = 0;
+       int size = 0;
+
+       /*
+        * This is ensured by the running fact of the debugger thread
+        * unless a bug is introduced.
+        */
+       BUG_ON(!acpi_aml_initialized);
+       while (count > 0) {
+again:
+               /*
+                * Check each input byte to find the end of the command.
+                */
+               ret = acpi_aml_readb_kern();
+               if (ret == -EAGAIN) {
+                       ret = wait_event_interruptible(acpi_aml_io.wait,
+                               acpi_aml_kern_readable());
+                       /*
+                        * We need to retry when the condition becomes
+                        * true.
+                        */
+                       if (ret == 0)
+                               goto again;
+               }
+               if (IS_ERR_VALUE(ret))
+                       break;
+               *(msg + size) = (char)ret;
+               size++;
+               count--;
+               if (ret == '\n') {
+                       /*
+                        * acpi_os_get_line() requires a zero terminated command
+                        * string.
+                        */
+                       *(msg + size - 1) = '\0';
+                       break;
+               }
+       }
+       return size > 0 ? size : ret;
+}
+
+static int acpi_aml_thread(void *unsed)
+{
+       acpi_osd_exec_callback function = NULL;
+       void *context;
+
+       mutex_lock(&acpi_aml_io.lock);
+       if (acpi_aml_io.function) {
+               acpi_aml_io.usages++;
+               function = acpi_aml_io.function;
+               context = acpi_aml_io.context;
+       }
+       mutex_unlock(&acpi_aml_io.lock);
+
+       if (function)
+               function(context);
+
+       mutex_lock(&acpi_aml_io.lock);
+       acpi_aml_io.usages--;
+       if (!__acpi_aml_used()) {
+               acpi_aml_io.thread = NULL;
+               wake_up(&acpi_aml_io.wait);
+       }
+       mutex_unlock(&acpi_aml_io.lock);
+
+       return 0;
+}
+
+/*
+ * acpi_aml_create_thread() - Create AML debugger thread
+ * @function: the debugger thread callback
+ * @context: the context to be passed to the debugger thread
+ *
+ * This function should be used to implement acpi_os_execute() which is
+ * used by the ACPICA debugger to create the debugger thread.
+ */
+static int acpi_aml_create_thread(acpi_osd_exec_callback function, void *context)
+{
+       struct task_struct *t;
+
+       mutex_lock(&acpi_aml_io.lock);
+       acpi_aml_io.function = function;
+       acpi_aml_io.context = context;
+       mutex_unlock(&acpi_aml_io.lock);
+
+       t = kthread_create(acpi_aml_thread, NULL, "aml");
+       if (IS_ERR(t)) {
+               pr_err("Failed to create AML debugger thread.\n");
+               return PTR_ERR(t);
+       }
+
+       mutex_lock(&acpi_aml_io.lock);
+       acpi_aml_io.thread = t;
+       acpi_set_debugger_thread_id((acpi_thread_id)(unsigned long)t);
+       wake_up_process(t);
+       mutex_unlock(&acpi_aml_io.lock);
+       return 0;
+}
+
+static int acpi_aml_wait_command_ready(bool single_step,
+                                      char *buffer, size_t length)
+{
+       acpi_status status;
+
+       if (single_step)
+               acpi_os_printf("\n%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
+       else
+               acpi_os_printf("\n%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
+
+       status = acpi_os_get_line(buffer, length, NULL);
+       if (ACPI_FAILURE(status))
+               return -EINVAL;
+       return 0;
+}
+
+static int acpi_aml_notify_command_complete(void)
+{
+       return 0;
+}
+
+static int acpi_aml_open(struct inode *inode, struct file *file)
+{
+       int ret = 0;
+       acpi_status status;
+
+       mutex_lock(&acpi_aml_io.lock);
+       /*
+        * The debugger interface is being closed, no new user is allowed
+        * during this period.
+        */
+       if (acpi_aml_io.flags & ACPI_AML_CLOSED) {
+               ret = -EBUSY;
+               goto err_lock;
+       }
+       if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
+               /*
+                * Only one reader is allowed to initiate the debugger
+                * thread.
+                */
+               if (acpi_aml_active_reader) {
+                       ret = -EBUSY;
+                       goto err_lock;
+               } else {
+                       pr_debug("Opening debugger reader.\n");
+                       acpi_aml_active_reader = file;
+               }
+       } else {
+               /*
+                * No writer is allowed unless the debugger thread is
+                * ready.
+                */
+               if (!(acpi_aml_io.flags & ACPI_AML_OPENED)) {
+                       ret = -ENODEV;
+                       goto err_lock;
+               }
+       }
+       if (acpi_aml_active_reader == file) {
+               pr_debug("Opening debugger interface.\n");
+               mutex_unlock(&acpi_aml_io.lock);
+
+               pr_debug("Initializing debugger thread.\n");
+               status = acpi_initialize_debugger();
+               if (ACPI_FAILURE(status)) {
+                       pr_err("Failed to initialize debugger.\n");
+                       ret = -EINVAL;
+                       goto err_exit;
+               }
+               pr_debug("Debugger thread initialized.\n");
+
+               mutex_lock(&acpi_aml_io.lock);
+               acpi_aml_io.flags |= ACPI_AML_OPENED;
+               acpi_aml_io.out_crc.head = acpi_aml_io.out_crc.tail = 0;
+               acpi_aml_io.in_crc.head = acpi_aml_io.in_crc.tail = 0;
+               pr_debug("Debugger interface opened.\n");
+       }
+       acpi_aml_io.users++;
+err_lock:
+       if (IS_ERR_VALUE(ret)) {
+               if (acpi_aml_active_reader == file)
+                       acpi_aml_active_reader = NULL;
+       }
+       mutex_unlock(&acpi_aml_io.lock);
+err_exit:
+       return ret;
+}
+
+static int acpi_aml_release(struct inode *inode, struct file *file)
+{
+       mutex_lock(&acpi_aml_io.lock);
+       acpi_aml_io.users--;
+       if (file == acpi_aml_active_reader) {
+               pr_debug("Closing debugger reader.\n");
+               acpi_aml_active_reader = NULL;
+
+               pr_debug("Closing debugger interface.\n");
+               acpi_aml_io.flags |= ACPI_AML_CLOSED;
+
+               /*
+                * Wake up all user space/kernel space blocked
+                * readers/writers.
+                */
+               wake_up_interruptible(&acpi_aml_io.wait);
+               mutex_unlock(&acpi_aml_io.lock);
+               /*
+                * Wait all user space/kernel space readers/writers to
+                * stop so that ACPICA command loop of the debugger thread
+                * should fail all its command line reads after this point.
+                */
+               wait_event(acpi_aml_io.wait, !acpi_aml_busy());
+
+               /*
+                * Then we try to terminate the debugger thread if it is
+                * not terminated.
+                */
+               pr_debug("Terminating debugger thread.\n");
+               acpi_terminate_debugger();
+               wait_event(acpi_aml_io.wait, !acpi_aml_used());
+               pr_debug("Debugger thread terminated.\n");
+
+               mutex_lock(&acpi_aml_io.lock);
+               acpi_aml_io.flags &= ~ACPI_AML_OPENED;
+       }
+       if (acpi_aml_io.users == 0) {
+               pr_debug("Debugger interface closed.\n");
+               acpi_aml_io.flags &= ~ACPI_AML_CLOSED;
+       }
+       mutex_unlock(&acpi_aml_io.lock);
+       return 0;
+}
+
+static int acpi_aml_read_user(char __user *buf, int len)
+{
+       int ret;
+       struct circ_buf *crc = &acpi_aml_io.out_crc;
+       int n;
+       char *p;
+
+       ret = acpi_aml_lock_read(crc, ACPI_AML_OUT_USER);
+       if (IS_ERR_VALUE(ret))
+               return ret;
+       /* sync head before removing logs */
+       smp_rmb();
+       p = &crc->buf[crc->tail];
+       n = min(len, circ_count_to_end(crc));
+       if (copy_to_user(buf, p, n)) {
+               ret = -EFAULT;
+               goto out;
+       }
+       /* sync tail after removing logs */
+       smp_mb();
+       crc->tail = (crc->tail + n) & (ACPI_AML_BUF_SIZE - 1);
+       ret = n;
+out:
+       acpi_aml_unlock_fifo(ACPI_AML_OUT_USER, !IS_ERR_VALUE(ret));
+       return ret;
+}
+
+static ssize_t acpi_aml_read(struct file *file, char __user *buf,
+                            size_t count, loff_t *ppos)
+{
+       int ret = 0;
+       int size = 0;
+
+       if (!count)
+               return 0;
+       if (!access_ok(VERIFY_WRITE, buf, count))
+               return -EFAULT;
+
+       while (count > 0) {
+again:
+               ret = acpi_aml_read_user(buf + size, count);
+               if (ret == -EAGAIN) {
+                       if (file->f_flags & O_NONBLOCK)
+                               break;
+                       else {
+                               ret = wait_event_interruptible(acpi_aml_io.wait,
+                                       acpi_aml_user_readable());
+                               /*
+                                * We need to retry when the condition
+                                * becomes true.
+                                */
+                               if (ret == 0)
+                                       goto again;
+                       }
+               }
+               if (IS_ERR_VALUE(ret)) {
+                       if (!acpi_aml_running())
+                               ret = 0;
+                       break;
+               }
+               if (ret) {
+                       size += ret;
+                       count -= ret;
+                       *ppos += ret;
+                       break;
+               }
+       }
+       return size > 0 ? size : ret;
+}
+
+static int acpi_aml_write_user(const char __user *buf, int len)
+{
+       int ret;
+       struct circ_buf *crc = &acpi_aml_io.in_crc;
+       int n;
+       char *p;
+
+       ret = acpi_aml_lock_write(crc, ACPI_AML_IN_USER);
+       if (IS_ERR_VALUE(ret))
+               return ret;
+       /* sync tail before inserting cmds */
+       smp_mb();
+       p = &crc->buf[crc->head];
+       n = min(len, circ_space_to_end(crc));
+       if (copy_from_user(p, buf, n)) {
+               ret = -EFAULT;
+               goto out;
+       }
+       /* sync head after inserting cmds */
+       smp_wmb();
+       crc->head = (crc->head + n) & (ACPI_AML_BUF_SIZE - 1);
+       ret = n;
+out:
+       acpi_aml_unlock_fifo(ACPI_AML_IN_USER, !IS_ERR_VALUE(ret));
+       return n;
+}
+
+static ssize_t acpi_aml_write(struct file *file, const char __user *buf,
+                             size_t count, loff_t *ppos)
+{
+       int ret = 0;
+       int size = 0;
+
+       if (!count)
+               return 0;
+       if (!access_ok(VERIFY_READ, buf, count))
+               return -EFAULT;
+
+       while (count > 0) {
+again:
+               ret = acpi_aml_write_user(buf + size, count);
+               if (ret == -EAGAIN) {
+                       if (file->f_flags & O_NONBLOCK)
+                               break;
+                       else {
+                               ret = wait_event_interruptible(acpi_aml_io.wait,
+                                       acpi_aml_user_writable());
+                               /*
+                                * We need to retry when the condition
+                                * becomes true.
+                                */
+                               if (ret == 0)
+                                       goto again;
+                       }
+               }
+               if (IS_ERR_VALUE(ret)) {
+                       if (!acpi_aml_running())
+                               ret = 0;
+                       break;
+               }
+               if (ret) {
+                       size += ret;
+                       count -= ret;
+                       *ppos += ret;
+               }
+       }
+       return size > 0 ? size : ret;
+}
+
+static unsigned int acpi_aml_poll(struct file *file, poll_table *wait)
+{
+       int masks = 0;
+
+       poll_wait(file, &acpi_aml_io.wait, wait);
+       if (acpi_aml_user_readable())
+               masks |= POLLIN | POLLRDNORM;
+       if (acpi_aml_user_writable())
+               masks |= POLLOUT | POLLWRNORM;
+
+       return masks;
+}
+
+static const struct file_operations acpi_aml_operations = {
+       .read           = acpi_aml_read,
+       .write          = acpi_aml_write,
+       .poll           = acpi_aml_poll,
+       .open           = acpi_aml_open,
+       .release        = acpi_aml_release,
+       .llseek         = generic_file_llseek,
+};
+
+static const struct acpi_debugger_ops acpi_aml_debugger = {
+       .create_thread           = acpi_aml_create_thread,
+       .read_cmd                = acpi_aml_read_cmd,
+       .write_log               = acpi_aml_write_log,
+       .wait_command_ready      = acpi_aml_wait_command_ready,
+       .notify_command_complete = acpi_aml_notify_command_complete,
+};
+
+int __init acpi_aml_init(void)
+{
+       int ret = 0;
+
+       if (!acpi_debugfs_dir) {
+               ret = -ENOENT;
+               goto err_exit;
+       }
+
+       /* Initialize AML IO interface */
+       mutex_init(&acpi_aml_io.lock);
+       init_waitqueue_head(&acpi_aml_io.wait);
+       acpi_aml_io.out_crc.buf = acpi_aml_io.out_buf;
+       acpi_aml_io.in_crc.buf = acpi_aml_io.in_buf;
+       acpi_aml_dentry = debugfs_create_file("acpidbg",
+                                             S_IFREG | S_IRUGO | S_IWUSR,
+                                             acpi_debugfs_dir, NULL,
+                                             &acpi_aml_operations);
+       if (acpi_aml_dentry == NULL) {
+               ret = -ENODEV;
+               goto err_exit;
+       }
+       ret = acpi_register_debugger(THIS_MODULE, &acpi_aml_debugger);
+       if (ret)
+               goto err_fs;
+       acpi_aml_initialized = true;
+
+err_fs:
+       if (ret) {
+               debugfs_remove(acpi_aml_dentry);
+               acpi_aml_dentry = NULL;
+       }
+err_exit:
+       return ret;
+}
+
+void __exit acpi_aml_exit(void)
+{
+       if (acpi_aml_initialized) {
+               acpi_unregister_debugger(&acpi_aml_debugger);
+               if (acpi_aml_dentry) {
+                       debugfs_remove(acpi_aml_dentry);
+                       acpi_aml_dentry = NULL;
+               }
+               acpi_aml_initialized = false;
+       }
+}
+
+module_init(acpi_aml_init);
+module_exit(acpi_aml_exit);
+
+MODULE_AUTHOR("Lv Zheng");
+MODULE_DESCRIPTION("ACPI debugger userspace IO driver");
+MODULE_LICENSE("GPL");
index f9e0d09..047281a 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/clk-provider.h>
 #include <linux/err.h>
 #include <linux/io.h>
+#include <linux/mutex.h>
 #include <linux/platform_device.h>
 #include <linux/platform_data/clk-lpss.h>
 #include <linux/pm_runtime.h>
@@ -26,6 +27,10 @@ ACPI_MODULE_NAME("acpi_lpss");
 
 #ifdef CONFIG_X86_INTEL_LPSS
 
+#include <asm/cpu_device_id.h>
+#include <asm/iosf_mbi.h>
+#include <asm/pmc_atom.h>
+
 #define LPSS_ADDR(desc) ((unsigned long)&desc)
 
 #define LPSS_CLK_SIZE  0x04
@@ -71,7 +76,7 @@ struct lpss_device_desc {
        void (*setup)(struct lpss_private_data *pdata);
 };
 
-static struct lpss_device_desc lpss_dma_desc = {
+static const struct lpss_device_desc lpss_dma_desc = {
        .flags = LPSS_CLK,
 };
 
@@ -84,6 +89,23 @@ struct lpss_private_data {
        u32 prv_reg_ctx[LPSS_PRV_REG_COUNT];
 };
 
+/* LPSS run time quirks */
+static unsigned int lpss_quirks;
+
+/*
+ * LPSS_QUIRK_ALWAYS_POWER_ON: override power state for LPSS DMA device.
+ *
+ * The LPSS DMA controller has neither _PS0 nor _PS3 method. Moreover
+ * it can be powered off automatically whenever the last LPSS device goes down.
+ * In case of no power any access to the DMA controller will hang the system.
+ * The behaviour is reproduced on some HP laptops based on Intel BayTrail as
+ * well as on ASuS T100TA transformer.
+ *
+ * This quirk overrides power state of entire LPSS island to keep DMA powered
+ * on whenever we have at least one other device in use.
+ */
+#define LPSS_QUIRK_ALWAYS_POWER_ON     BIT(0)
+
 /* UART Component Parameter Register */
 #define LPSS_UART_CPR                  0xF4
 #define LPSS_UART_CPR_AFCE             BIT(4)
@@ -196,13 +218,21 @@ static const struct lpss_device_desc bsw_i2c_dev_desc = {
        .setup = byt_i2c_setup,
 };
 
-static struct lpss_device_desc bsw_spi_dev_desc = {
+static const struct lpss_device_desc bsw_spi_dev_desc = {
        .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX
                        | LPSS_NO_D3_DELAY,
        .prv_offset = 0x400,
        .setup = lpss_deassert_reset,
 };
 
+#define ICPU(model)    { X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, }
+
+static const struct x86_cpu_id lpss_cpu_ids[] = {
+       ICPU(0x37),     /* Valleyview, Bay Trail */
+       ICPU(0x4c),     /* Braswell, Cherry Trail */
+       {}
+};
+
 #else
 
 #define LPSS_ADDR(desc) (0UL)
@@ -574,6 +604,17 @@ static void acpi_lpss_restore_ctx(struct device *dev,
 {
        unsigned int i;
 
+       for (i = 0; i < LPSS_PRV_REG_COUNT; i++) {
+               unsigned long offset = i * sizeof(u32);
+
+               __lpss_reg_write(pdata->prv_reg_ctx[i], pdata, offset);
+               dev_dbg(dev, "restoring 0x%08x to LPSS reg at offset 0x%02lx\n",
+                       pdata->prv_reg_ctx[i], offset);
+       }
+}
+
+static void acpi_lpss_d3_to_d0_delay(struct lpss_private_data *pdata)
+{
        /*
         * The following delay is needed or the subsequent write operations may
         * fail. The LPSS devices are actually PCI devices and the PCI spec
@@ -586,14 +627,34 @@ static void acpi_lpss_restore_ctx(struct device *dev,
                delay = 0;
 
        msleep(delay);
+}
 
-       for (i = 0; i < LPSS_PRV_REG_COUNT; i++) {
-               unsigned long offset = i * sizeof(u32);
+static int acpi_lpss_activate(struct device *dev)
+{
+       struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
+       int ret;
 
-               __lpss_reg_write(pdata->prv_reg_ctx[i], pdata, offset);
-               dev_dbg(dev, "restoring 0x%08x to LPSS reg at offset 0x%02lx\n",
-                       pdata->prv_reg_ctx[i], offset);
-       }
+       ret = acpi_dev_runtime_resume(dev);
+       if (ret)
+               return ret;
+
+       acpi_lpss_d3_to_d0_delay(pdata);
+
+       /*
+        * This is called only on ->probe() stage where a device is either in
+        * known state defined by BIOS or most likely powered off. Due to this
+        * we have to deassert reset line to be sure that ->probe() will
+        * recognize the device.
+        */
+       if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
+               lpss_deassert_reset(pdata);
+
+       return 0;
+}
+
+static void acpi_lpss_dismiss(struct device *dev)
+{
+       acpi_dev_runtime_suspend(dev);
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -621,6 +682,8 @@ static int acpi_lpss_resume_early(struct device *dev)
        if (ret)
                return ret;
 
+       acpi_lpss_d3_to_d0_delay(pdata);
+
        if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
                acpi_lpss_restore_ctx(dev, pdata);
 
@@ -628,6 +691,89 @@ static int acpi_lpss_resume_early(struct device *dev)
 }
 #endif /* CONFIG_PM_SLEEP */
 
+/* IOSF SB for LPSS island */
+#define LPSS_IOSF_UNIT_LPIOEP          0xA0
+#define LPSS_IOSF_UNIT_LPIO1           0xAB
+#define LPSS_IOSF_UNIT_LPIO2           0xAC
+
+#define LPSS_IOSF_PMCSR                        0x84
+#define LPSS_PMCSR_D0                  0
+#define LPSS_PMCSR_D3hot               3
+#define LPSS_PMCSR_Dx_MASK             GENMASK(1, 0)
+
+#define LPSS_IOSF_GPIODEF0             0x154
+#define LPSS_GPIODEF0_DMA1_D3          BIT(2)
+#define LPSS_GPIODEF0_DMA2_D3          BIT(3)
+#define LPSS_GPIODEF0_DMA_D3_MASK      GENMASK(3, 2)
+
+static DEFINE_MUTEX(lpss_iosf_mutex);
+
+static void lpss_iosf_enter_d3_state(void)
+{
+       u32 value1 = 0;
+       u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK;
+       u32 value2 = LPSS_PMCSR_D3hot;
+       u32 mask2 = LPSS_PMCSR_Dx_MASK;
+       /*
+        * PMC provides an information about actual status of the LPSS devices.
+        * Here we read the values related to LPSS power island, i.e. LPSS
+        * devices, excluding both LPSS DMA controllers, along with SCC domain.
+        */
+       u32 func_dis, d3_sts_0, pmc_status, pmc_mask = 0xfe000ffe;
+       int ret;
+
+       ret = pmc_atom_read(PMC_FUNC_DIS, &func_dis);
+       if (ret)
+               return;
+
+       mutex_lock(&lpss_iosf_mutex);
+
+       ret = pmc_atom_read(PMC_D3_STS_0, &d3_sts_0);
+       if (ret)
+               goto exit;
+
+       /*
+        * Get the status of entire LPSS power island per device basis.
+        * Shutdown both LPSS DMA controllers if and only if all other devices
+        * are already in D3hot.
+        */
+       pmc_status = (~(d3_sts_0 | func_dis)) & pmc_mask;
+       if (pmc_status)
+               goto exit;
+
+       iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO1, MBI_CFG_WRITE,
+                       LPSS_IOSF_PMCSR, value2, mask2);
+
+       iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO2, MBI_CFG_WRITE,
+                       LPSS_IOSF_PMCSR, value2, mask2);
+
+       iosf_mbi_modify(LPSS_IOSF_UNIT_LPIOEP, MBI_CR_WRITE,
+                       LPSS_IOSF_GPIODEF0, value1, mask1);
+exit:
+       mutex_unlock(&lpss_iosf_mutex);
+}
+
+static void lpss_iosf_exit_d3_state(void)
+{
+       u32 value1 = LPSS_GPIODEF0_DMA1_D3 | LPSS_GPIODEF0_DMA2_D3;
+       u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK;
+       u32 value2 = LPSS_PMCSR_D0;
+       u32 mask2 = LPSS_PMCSR_Dx_MASK;
+
+       mutex_lock(&lpss_iosf_mutex);
+
+       iosf_mbi_modify(LPSS_IOSF_UNIT_LPIOEP, MBI_CR_WRITE,
+                       LPSS_IOSF_GPIODEF0, value1, mask1);
+
+       iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO2, MBI_CFG_WRITE,
+                       LPSS_IOSF_PMCSR, value2, mask2);
+
+       iosf_mbi_modify(LPSS_IOSF_UNIT_LPIO1, MBI_CFG_WRITE,
+                       LPSS_IOSF_PMCSR, value2, mask2);
+
+       mutex_unlock(&lpss_iosf_mutex);
+}
+
 static int acpi_lpss_runtime_suspend(struct device *dev)
 {
        struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
@@ -640,7 +786,17 @@ static int acpi_lpss_runtime_suspend(struct device *dev)
        if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
                acpi_lpss_save_ctx(dev, pdata);
 
-       return acpi_dev_runtime_suspend(dev);
+       ret = acpi_dev_runtime_suspend(dev);
+
+       /*
+        * This call must be last in the sequence, otherwise PMC will return
+        * wrong status for devices being about to be powered off. See
+        * lpss_iosf_enter_d3_state() for further information.
+        */
+       if (lpss_quirks & LPSS_QUIRK_ALWAYS_POWER_ON && iosf_mbi_available())
+               lpss_iosf_enter_d3_state();
+
+       return ret;
 }
 
 static int acpi_lpss_runtime_resume(struct device *dev)
@@ -648,10 +804,19 @@ static int acpi_lpss_runtime_resume(struct device *dev)
        struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev));
        int ret;
 
+       /*
+        * This call is kept first to be in symmetry with
+        * acpi_lpss_runtime_suspend() one.
+        */
+       if (lpss_quirks & LPSS_QUIRK_ALWAYS_POWER_ON && iosf_mbi_available())
+               lpss_iosf_exit_d3_state();
+
        ret = acpi_dev_runtime_resume(dev);
        if (ret)
                return ret;
 
+       acpi_lpss_d3_to_d0_delay(pdata);
+
        if (pdata->dev_desc->flags & LPSS_SAVE_CTX)
                acpi_lpss_restore_ctx(dev, pdata);
 
@@ -660,6 +825,10 @@ static int acpi_lpss_runtime_resume(struct device *dev)
 #endif /* CONFIG_PM */
 
 static struct dev_pm_domain acpi_lpss_pm_domain = {
+#ifdef CONFIG_PM
+       .activate = acpi_lpss_activate,
+       .dismiss = acpi_lpss_dismiss,
+#endif
        .ops = {
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM_SLEEP
@@ -705,8 +874,14 @@ static int acpi_lpss_platform_notify(struct notifier_block *nb,
        }
 
        switch (action) {
-       case BUS_NOTIFY_ADD_DEVICE:
+       case BUS_NOTIFY_BIND_DRIVER:
                pdev->dev.pm_domain = &acpi_lpss_pm_domain;
+               break;
+       case BUS_NOTIFY_DRIVER_NOT_BOUND:
+       case BUS_NOTIFY_UNBOUND_DRIVER:
+               pdev->dev.pm_domain = NULL;
+               break;
+       case BUS_NOTIFY_ADD_DEVICE:
                if (pdata->dev_desc->flags & LPSS_LTR)
                        return sysfs_create_group(&pdev->dev.kobj,
                                                  &lpss_attr_group);
@@ -714,7 +889,6 @@ static int acpi_lpss_platform_notify(struct notifier_block *nb,
        case BUS_NOTIFY_DEL_DEVICE:
                if (pdata->dev_desc->flags & LPSS_LTR)
                        sysfs_remove_group(&pdev->dev.kobj, &lpss_attr_group);
-               pdev->dev.pm_domain = NULL;
                break;
        default:
                break;
@@ -754,10 +928,19 @@ static struct acpi_scan_handler lpss_handler = {
 
 void __init acpi_lpss_init(void)
 {
-       if (!lpt_clk_init()) {
-               bus_register_notifier(&platform_bus_type, &acpi_lpss_nb);
-               acpi_scan_add_handler(&lpss_handler);
-       }
+       const struct x86_cpu_id *id;
+       int ret;
+
+       ret = lpt_clk_init();
+       if (ret)
+               return;
+
+       id = x86_match_cpu(lpss_cpu_ids);
+       if (id)
+               lpss_quirks |= LPSS_QUIRK_ALWAYS_POWER_ON;
+
+       bus_register_notifier(&platform_bus_type, &acpi_lpss_nb);
+       acpi_scan_add_handler(&lpss_handler);
 }
 
 #else
index 3405f7a..06a006f 100644 (file)
@@ -77,14 +77,21 @@ module_param(allow_duplicates, bool, 0644);
 static int disable_backlight_sysfs_if = -1;
 module_param(disable_backlight_sysfs_if, int, 0444);
 
+#define REPORT_OUTPUT_KEY_EVENTS               0x01
+#define REPORT_BRIGHTNESS_KEY_EVENTS           0x02
+static int report_key_events = -1;
+module_param(report_key_events, int, 0644);
+MODULE_PARM_DESC(report_key_events,
+       "0: none, 1: output changes, 2: brightness changes, 3: all");
+
 static bool device_id_scheme = false;
 module_param(device_id_scheme, bool, 0444);
 
 static bool only_lcd = false;
 module_param(only_lcd, bool, 0444);
 
-static int register_count;
-static DEFINE_MUTEX(register_count_mutex);
+static DECLARE_COMPLETION(register_done);
+static DEFINE_MUTEX(register_done_mutex);
 static struct mutex video_list_lock;
 static struct list_head video_bus_head;
 static int acpi_video_bus_add(struct acpi_device *device);
@@ -412,6 +419,13 @@ static int video_enable_only_lcd(const struct dmi_system_id *d)
        return 0;
 }
 
+static int video_set_report_key_events(const struct dmi_system_id *id)
+{
+       if (report_key_events == -1)
+               report_key_events = (uintptr_t)id->driver_data;
+       return 0;
+}
+
 static struct dmi_system_id video_dmi_table[] = {
        /*
         * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
@@ -500,6 +514,24 @@ static struct dmi_system_id video_dmi_table[] = {
                DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile M9410"),
                },
        },
+       /*
+        * Some machines report wrong key events on the acpi-bus, suppress
+        * key event reporting on these.  Note this is only intended to work
+        * around events which are plain wrong. In some cases we get double
+        * events, in this case acpi-video is considered the canonical source
+        * and the events from the other source should be filtered. E.g.
+        * by calling acpi_video_handles_brightness_key_presses() from the
+        * vendor acpi/wmi driver or by using /lib/udev/hwdb.d/60-keyboard.hwdb
+        */
+       {
+        .callback = video_set_report_key_events,
+        .driver_data = (void *)((uintptr_t)REPORT_OUTPUT_KEY_EVENTS),
+        .ident = "Dell Vostro V131",
+        .matches = {
+               DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+               DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
+               },
+       },
        {}
 };
 
@@ -1480,7 +1512,7 @@ static void acpi_video_bus_notify(struct acpi_device *device, u32 event)
                /* Something vetoed the keypress. */
                keycode = 0;
 
-       if (keycode) {
+       if (keycode && (report_key_events & REPORT_OUTPUT_KEY_EVENTS)) {
                input_report_key(input, keycode, 1);
                input_sync(input);
                input_report_key(input, keycode, 0);
@@ -1544,7 +1576,7 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
 
        acpi_notifier_call_chain(device, event, 0);
 
-       if (keycode) {
+       if (keycode && (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS)) {
                input_report_key(input, keycode, 1);
                input_sync(input);
                input_report_key(input, keycode, 0);
@@ -2017,8 +2049,8 @@ int acpi_video_register(void)
 {
        int ret = 0;
 
-       mutex_lock(&register_count_mutex);
-       if (register_count) {
+       mutex_lock(&register_done_mutex);
+       if (completion_done(&register_done)) {
                /*
                 * if the function of acpi_video_register is already called,
                 * don't register the acpi_vide_bus again and return no error.
@@ -2039,22 +2071,22 @@ int acpi_video_register(void)
         * When the acpi_video_bus is loaded successfully, increase
         * the counter reference.
         */
-       register_count = 1;
+       complete(&register_done);
 
 leave:
-       mutex_unlock(&register_count_mutex);
+       mutex_unlock(&register_done_mutex);
        return ret;
 }
 EXPORT_SYMBOL(acpi_video_register);
 
 void acpi_video_unregister(void)
 {
-       mutex_lock(&register_count_mutex);
-       if (register_count) {
+       mutex_lock(&register_done_mutex);
+       if (completion_done(&register_done)) {
                acpi_bus_unregister_driver(&acpi_video_bus);
-               register_count = 0;
+               reinit_completion(&register_done);
        }
-       mutex_unlock(&register_count_mutex);
+       mutex_unlock(&register_done_mutex);
 }
 EXPORT_SYMBOL(acpi_video_unregister);
 
@@ -2062,15 +2094,29 @@ void acpi_video_unregister_backlight(void)
 {
        struct acpi_video_bus *video;
 
-       mutex_lock(&register_count_mutex);
-       if (register_count) {
+       mutex_lock(&register_done_mutex);
+       if (completion_done(&register_done)) {
                mutex_lock(&video_list_lock);
                list_for_each_entry(video, &video_bus_head, entry)
                        acpi_video_bus_unregister_backlight(video);
                mutex_unlock(&video_list_lock);
        }
-       mutex_unlock(&register_count_mutex);
+       mutex_unlock(&register_done_mutex);
+}
+
+bool acpi_video_handles_brightness_key_presses(void)
+{
+       bool have_video_busses;
+
+       wait_for_completion(&register_done);
+       mutex_lock(&video_list_lock);
+       have_video_busses = !list_empty(&video_bus_head);
+       mutex_unlock(&video_list_lock);
+
+       return have_video_busses &&
+              (report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS);
 }
+EXPORT_SYMBOL(acpi_video_handles_brightness_key_presses);
 
 /*
  * This is kind of nasty. Hardware using Intel chipsets may require
index 885936f..f682374 100644 (file)
@@ -50,6 +50,7 @@ acpi-y +=             \
        exdump.o        \
        exfield.o       \
        exfldio.o       \
+       exmisc.o        \
        exmutex.o       \
        exnames.o       \
        exoparg1.o      \
@@ -57,7 +58,6 @@ acpi-y +=             \
        exoparg3.o      \
        exoparg6.o      \
        exprep.o        \
-       exmisc.o        \
        exregion.o      \
        exresnte.o      \
        exresolv.o      \
@@ -66,6 +66,7 @@ acpi-y +=             \
        exstoren.o      \
        exstorob.o      \
        exsystem.o      \
+       extrace.o       \
        exutils.o
 
 acpi-y +=              \
@@ -196,7 +197,6 @@ acpi-$(ACPI_FUTURE_USAGE) +=        \
        dbfileio.o              \
        dbtest.o                \
        utcache.o               \
-       utfileio.o              \
        utprint.o               \
        uttrack.o               \
        utuuid.o
index e4cc48f..8b4ff40 100644 (file)
@@ -44,6 +44,8 @@
 #ifndef _ACAPPS
 #define _ACAPPS
 
+#include <stdio.h>
+
 /* Common info for tool signons */
 
 #define ACPICA_NAME                 "Intel ACPI Component Architecture"
        acpi_os_printf (description);
 
 #define ACPI_OPTION(name, description) \
-       acpi_os_printf (" %-18s%s\n", name, description);
+       acpi_os_printf (" %-20s%s\n", name, description);
+
+/* Check for unexpected exceptions */
+
+#define ACPI_CHECK_STATUS(name, status, expected) \
+       if (status != expected) \
+       { \
+               acpi_os_printf ("Unexpected %s from %s (%s-%d)\n", \
+                       acpi_format_exception (status), #name, _acpi_module_name, __LINE__); \
+       }
+
+/* Check for unexpected non-AE_OK errors */
+
+#define ACPI_CHECK_OK(name, status)   ACPI_CHECK_STATUS (name, status, AE_OK);
 
 #define FILE_SUFFIX_DISASSEMBLY     "dsl"
 #define FILE_SUFFIX_BINARY_TABLE    ".dat"     /* Needs the dot */
 
+/* acfileio */
+
+acpi_status
+ac_get_all_tables_from_file(char *filename,
+                           u8 get_only_aml_tables,
+                           struct acpi_new_table_desc **return_list_head);
+
+u8 ac_is_file_binary(FILE * file);
+
+acpi_status ac_validate_table_header(FILE * file, long table_offset);
+
+/* Values for get_only_aml_tables */
+
+#define ACPI_GET_ONLY_AML_TABLES    TRUE
+#define ACPI_GET_ALL_TABLES         FALSE
+
 /*
  * getopt
  */
@@ -107,30 +138,6 @@ extern char *acpi_gbl_optarg;
  */
 u32 cm_get_file_size(ACPI_FILE file);
 
-#ifndef ACPI_DUMP_APP
-/*
- * adisasm
- */
-acpi_status
-ad_aml_disassemble(u8 out_to_file,
-                  char *filename, char *prefix, char **out_filename);
-
-void ad_print_statistics(void);
-
-acpi_status ad_find_dsdt(u8 **dsdt_ptr, u32 *dsdt_length);
-
-void ad_dump_tables(void);
-
-acpi_status ad_get_local_tables(void);
-
-acpi_status
-ad_parse_table(struct acpi_table_header *table,
-              acpi_owner_id * owner_id, u8 load_table, u8 external);
-
-acpi_status ad_display_tables(char *filename, struct acpi_table_header *table);
-
-acpi_status ad_display_statistics(void);
-
 /*
  * adwalk
  */
@@ -168,6 +175,5 @@ char *ad_generate_filename(char *prefix, char *table_id);
 void
 ad_write_table(struct acpi_table_header *table,
               u32 length, char *table_name, char *oem_table_id);
-#endif
 
 #endif                         /* _ACAPPS */
index c928ba4..ecb05f1 100644 (file)
@@ -80,9 +80,15 @@ struct acpi_db_execute_walk {
 /*
  * dbxface - external debugger interfaces
  */
-acpi_status
-acpi_db_single_step(struct acpi_walk_state *walk_state,
-                   union acpi_parse_object *op, u32 op_type);
+ACPI_DBR_DEPENDENT_RETURN_OK(acpi_status
+                            acpi_db_single_step(struct acpi_walk_state
+                                                *walk_state,
+                                                union acpi_parse_object *op,
+                                                u32 op_type))
+ ACPI_DBR_DEPENDENT_RETURN_VOID(void
+                               acpi_db_signal_break_point(struct
+                                                          acpi_walk_state
+                                                          *walk_state))
 
 /*
  * dbcmds - debug commands and output routines
@@ -182,11 +188,15 @@ void acpi_db_display_method_info(union acpi_parse_object *op);
 
 void acpi_db_decode_and_display_object(char *target, char *output_type);
 
-void
-acpi_db_display_result_object(union acpi_operand_object *obj_desc,
-                             struct acpi_walk_state *walk_state);
+ACPI_DBR_DEPENDENT_RETURN_VOID(void
+                              acpi_db_display_result_object(union
+                                                            acpi_operand_object
+                                                            *obj_desc,
+                                                            struct
+                                                            acpi_walk_state
+                                                            *walk_state))
 
-acpi_status acpi_db_display_all_methods(char *display_count_arg);
+ acpi_status acpi_db_display_all_methods(char *display_count_arg);
 
 void acpi_db_display_arguments(void);
 
@@ -198,9 +208,13 @@ void acpi_db_display_calling_tree(void);
 
 void acpi_db_display_object_type(char *object_arg);
 
-void
-acpi_db_display_argument_object(union acpi_operand_object *obj_desc,
-                               struct acpi_walk_state *walk_state);
+ACPI_DBR_DEPENDENT_RETURN_VOID(void
+                              acpi_db_display_argument_object(union
+                                                              acpi_operand_object
+                                                              *obj_desc,
+                                                              struct
+                                                              acpi_walk_state
+                                                              *walk_state))
 
 /*
  * dbexec - debugger control method execution
@@ -231,10 +245,7 @@ void acpi_db_open_debug_file(char *name);
 
 acpi_status acpi_db_load_acpi_table(char *filename);
 
-acpi_status
-acpi_db_get_table_from_file(char *filename,
-                           struct acpi_table_header **table,
-                           u8 must_be_aml_table);
+acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head);
 
 /*
  * dbhistry - debugger HISTORY command
@@ -257,7 +268,7 @@ acpi_db_command_dispatch(char *input_buffer,
 
 void ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context);
 
-acpi_status acpi_db_user_commands(char prompt, union acpi_parse_object *op);
+acpi_status acpi_db_user_commands(void);
 
 char *acpi_db_get_next_token(char *string,
                             char **next, acpi_object_type * return_type);
index 228704b..d18f184 100644 (file)
@@ -161,6 +161,11 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
 /*
  * evhandler - Address space handling
  */
+union acpi_operand_object *acpi_ev_find_region_handler(acpi_adr_space_type
+                                                      space_id,
+                                                      union acpi_operand_object
+                                                      *handler_obj);
+
 u8
 acpi_ev_has_default_handler(struct acpi_namespace_node *node,
                            acpi_adr_space_type space_id);
@@ -193,9 +198,11 @@ void
 acpi_ev_detach_region(union acpi_operand_object *region_obj,
                      u8 acpi_ns_is_locked);
 
-acpi_status
+void acpi_ev_associate_reg_method(union acpi_operand_object *region_obj);
+
+void
 acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
-                           acpi_adr_space_type space_id);
+                           acpi_adr_space_type space_id, u32 function);
 
 acpi_status
 acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function);
index faa9760..73462ca 100644 (file)
@@ -145,6 +145,7 @@ ACPI_GLOBAL(acpi_cache_t *, acpi_gbl_operand_cache);
 
 ACPI_INIT_GLOBAL(u32, acpi_gbl_startup_flags, 0);
 ACPI_INIT_GLOBAL(u8, acpi_gbl_shutdown, TRUE);
+ACPI_INIT_GLOBAL(u8, acpi_gbl_early_initialization, TRUE);
 
 /* Global handlers */
 
@@ -164,7 +165,7 @@ ACPI_GLOBAL(u8, acpi_gbl_next_owner_id_offset);
 
 /* Initialization sequencing */
 
-ACPI_GLOBAL(u8, acpi_gbl_reg_methods_executed);
+ACPI_INIT_GLOBAL(u8, acpi_gbl_reg_methods_enabled, FALSE);
 
 /* Misc */
 
@@ -326,7 +327,6 @@ ACPI_GLOBAL(struct acpi_external_file *, acpi_gbl_external_file_list);
 #ifdef ACPI_DEBUGGER
 
 ACPI_INIT_GLOBAL(u8, acpi_gbl_abort_method, FALSE);
-ACPI_INIT_GLOBAL(u8, acpi_gbl_method_executing, FALSE);
 ACPI_INIT_GLOBAL(acpi_thread_id, acpi_gbl_db_thread_id, ACPI_INVALID_THREAD_ID);
 
 ACPI_GLOBAL(u8, acpi_gbl_db_opt_no_ini_methods);
@@ -345,7 +345,6 @@ ACPI_GLOBAL(acpi_object_type, acpi_gbl_db_arg_types[ACPI_DEBUGGER_MAX_ARGS]);
 
 /* These buffers should all be the same size */
 
-ACPI_GLOBAL(char, acpi_gbl_db_line_buf[ACPI_DB_LINE_BUFFER_SIZE]);
 ACPI_GLOBAL(char, acpi_gbl_db_parsed_buf[ACPI_DB_LINE_BUFFER_SIZE]);
 ACPI_GLOBAL(char, acpi_gbl_db_scope_buf[ACPI_DB_LINE_BUFFER_SIZE]);
 ACPI_GLOBAL(char, acpi_gbl_db_debug_filename[ACPI_DB_LINE_BUFFER_SIZE]);
@@ -360,9 +359,6 @@ ACPI_GLOBAL(u16, acpi_gbl_node_type_count_misc);
 ACPI_GLOBAL(u32, acpi_gbl_num_nodes);
 ACPI_GLOBAL(u32, acpi_gbl_num_objects);
 
-ACPI_GLOBAL(acpi_mutex, acpi_gbl_db_command_ready);
-ACPI_GLOBAL(acpi_mutex, acpi_gbl_db_command_complete);
-
 #endif                         /* ACPI_DEBUGGER */
 
 /*****************************************************************************
index e1dd784..24928ec 100644 (file)
@@ -219,6 +219,13 @@ struct acpi_table_list {
 #define ACPI_ROOT_ORIGIN_ALLOCATED      (1)
 #define ACPI_ROOT_ALLOW_RESIZE          (2)
 
+/* List to manage incoming ACPI tables */
+
+struct acpi_new_table_desc {
+       struct acpi_table_header *table;
+       struct acpi_new_table_desc *next;
+};
+
 /* Predefined table indexes */
 
 #define ACPI_INVALID_TABLE_INDEX        (0xFFFFFFFF)
@@ -388,7 +395,8 @@ union acpi_predefined_info {
 
 /* Return object auto-repair info */
 
-typedef acpi_status(*acpi_object_converter) (union acpi_operand_object
+typedef acpi_status(*acpi_object_converter) (struct acpi_namespace_node * scope,
+                                            union acpi_operand_object
                                             *original_object,
                                             union acpi_operand_object
                                             **converted_object);
@@ -420,6 +428,7 @@ struct acpi_simple_repair_info {
 
 struct acpi_reg_walk_info {
        acpi_adr_space_type space_id;
+       u32 function;
        u32 reg_run_count;
 };
 
@@ -861,6 +870,7 @@ struct acpi_parse_state {
 #define ACPI_PARSEOP_CLOSING_PAREN      0x10
 #define ACPI_PARSEOP_COMPOUND           0x20
 #define ACPI_PARSEOP_ASSIGNMENT         0x40
+#define ACPI_PARSEOP_ELSEIF             0x80
 
 /*****************************************************************************
  *
index e85366c..bad5bca 100644 (file)
 #define ACPI_HW_OPTIONAL_FUNCTION(addr)     NULL
 #endif
 
-/*
- * Some code only gets executed when the debugger is built in.
- * Note that this is entirely independent of whether the
- * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not.
- */
-#ifdef ACPI_DEBUGGER
-#define ACPI_DEBUGGER_EXEC(a)           a
-#else
-#define ACPI_DEBUGGER_EXEC(a)
-#endif
-
 /*
  * Macros used for ACPICA utilities only
  */
index 5d261c9..d082e62 100644 (file)
@@ -77,6 +77,7 @@
 /* Object is not a package element */
 
 #define ACPI_NOT_PACKAGE_ELEMENT    ACPI_UINT32_MAX
+#define ACPI_ALL_PACKAGE_ELEMENTS   (ACPI_UINT32_MAX-1)
 
 /* Always emit warning message, not dependent on node flags */
 
@@ -183,13 +184,20 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
                          union acpi_operand_object **return_object);
 
 acpi_status
-acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
+acpi_ns_convert_to_unicode(struct acpi_namespace_node *scope,
+                          union acpi_operand_object *original_object,
                           union acpi_operand_object **return_object);
 
 acpi_status
-acpi_ns_convert_to_resource(union acpi_operand_object *original_object,
+acpi_ns_convert_to_resource(struct acpi_namespace_node *scope,
+                           union acpi_operand_object *original_object,
                            union acpi_operand_object **return_object);
 
+acpi_status
+acpi_ns_convert_to_reference(struct acpi_namespace_node *scope,
+                            union acpi_operand_object *original_object,
+                            union acpi_operand_object **return_object);
+
 /*
  * nsdump - Namespace dump/print utilities
  */
index 0bd02c4..2b154cf 100644 (file)
 #define AOPOBJ_AML_CONSTANT         0x01       /* Integer is an AML constant */
 #define AOPOBJ_STATIC_POINTER       0x02       /* Data is part of an ACPI table, don't delete */
 #define AOPOBJ_DATA_VALID           0x04       /* Object is initialized and data is valid */
-#define AOPOBJ_OBJECT_INITIALIZED   0x08       /* Region is initialized, _REG was run */
-#define AOPOBJ_SETUP_COMPLETE       0x10       /* Region setup is complete */
-#define AOPOBJ_INVALID              0x20       /* Host OS won't allow a Region address */
+#define AOPOBJ_OBJECT_INITIALIZED   0x08       /* Region is initialized */
+#define AOPOBJ_REG_CONNECTED        0x10       /* _REG was run */
+#define AOPOBJ_SETUP_COMPLETE       0x20       /* Region setup is complete */
+#define AOPOBJ_INVALID              0x40       /* Host OS won't allow a Region address */
 
 /******************************************************************************
  *
index f9acf92..324512d 100644 (file)
@@ -92,7 +92,7 @@
 #define ARGP_BYTELIST_OP                ARGP_LIST1 (ARGP_NAMESTRING)
 #define ARGP_CONCAT_OP                  ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
 #define ARGP_CONCAT_RES_OP              ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_COND_REF_OF_OP             ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_SUPERNAME)
+#define ARGP_COND_REF_OF_OP             ARGP_LIST2 (ARGP_NAME_OR_REF,ARGP_TARGET)
 #define ARGP_CONNECTFIELD_OP            ARGP_LIST1 (ARGP_NAMESTRING)
 #define ARGP_CONTINUE_OP                ARG_NONE
 #define ARGP_COPY_OP                    ARGP_LIST2 (ARGP_TERMARG,    ARGP_SIMPLENAME)
 #define ARGP_NAMEPATH_OP                ARGP_LIST1 (ARGP_NAMESTRING)
 #define ARGP_NOOP_OP                    ARG_NONE
 #define ARGP_NOTIFY_OP                  ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_TERMARG)
+#define ARGP_OBJECT_TYPE_OP             ARGP_LIST1 (ARGP_NAME_OR_REF)
 #define ARGP_ONE_OP                     ARG_NONE
 #define ARGP_ONES_OP                    ARG_NONE
 #define ARGP_PACKAGE_OP                 ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_BYTEDATA,      ARGP_DATAOBJLIST)
 #define ARGP_POWER_RES_OP               ARGP_LIST5 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,  ARGP_WORDDATA,  ARGP_OBJLIST)
 #define ARGP_PROCESSOR_OP               ARGP_LIST6 (ARGP_PKGLENGTH,  ARGP_NAME,          ARGP_BYTEDATA,  ARGP_DWORDDATA, ARGP_BYTEDATA,  ARGP_OBJLIST)
 #define ARGP_QWORD_OP                   ARGP_LIST1 (ARGP_QWORDDATA)
-#define ARGP_REF_OF_OP                  ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_REF_OF_OP                  ARGP_LIST1 (ARGP_NAME_OR_REF)
 #define ARGP_REGION_OP                  ARGP_LIST4 (ARGP_NAME,       ARGP_BYTEDATA,      ARGP_TERMARG,   ARGP_TERMARG)
 #define ARGP_RELEASE_OP                 ARGP_LIST1 (ARGP_SUPERNAME)
 #define ARGP_RESERVEDFIELD_OP           ARGP_LIST1 (ARGP_NAMESTRING)
 #define ARGP_TO_HEX_STR_OP              ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
 #define ARGP_TO_INTEGER_OP              ARGP_LIST2 (ARGP_TERMARG,    ARGP_TARGET)
 #define ARGP_TO_STRING_OP               ARGP_LIST3 (ARGP_TERMARG,    ARGP_TERMARG,       ARGP_TARGET)
-#define ARGP_TYPE_OP                    ARGP_LIST1 (ARGP_SUPERNAME)
 #define ARGP_UNLOAD_OP                  ARGP_LIST1 (ARGP_SUPERNAME)
 #define ARGP_VAR_PACKAGE_OP             ARGP_LIST3 (ARGP_PKGLENGTH,  ARGP_TERMARG,       ARGP_DATAOBJLIST)
 #define ARGP_WAIT_OP                    ARGP_LIST2 (ARGP_SUPERNAME,  ARGP_TERMARG)
 #define ARGI_BUFFER_OP                  ARGI_LIST1 (ARGI_INTEGER)
 #define ARGI_BYTE_OP                    ARGI_INVALID_OPCODE
 #define ARGI_BYTELIST_OP                ARGI_INVALID_OPCODE
-#define ARGI_CONCAT_OP                  ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA,   ARGI_TARGETREF)
+#define ARGI_CONCAT_OP                  ARGI_LIST3 (ARGI_ANYTYPE,    ARGI_ANYTYPE,       ARGI_TARGETREF)
 #define ARGI_CONCAT_RES_OP              ARGI_LIST3 (ARGI_BUFFER,     ARGI_BUFFER,        ARGI_TARGETREF)
 #define ARGI_COND_REF_OF_OP             ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF)
 #define ARGI_CONNECTFIELD_OP            ARGI_INVALID_OPCODE
 #define ARGI_NAMEPATH_OP                ARGI_INVALID_OPCODE
 #define ARGI_NOOP_OP                    ARG_NONE
 #define ARGI_NOTIFY_OP                  ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER)
+#define ARGI_OBJECT_TYPE_OP             ARGI_LIST1 (ARGI_ANYTYPE)
 #define ARGI_ONE_OP                     ARG_NONE
 #define ARGI_ONES_OP                    ARG_NONE
 #define ARGI_PACKAGE_OP                 ARGI_LIST1 (ARGI_INTEGER)
 #define ARGI_TO_HEX_STR_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
 #define ARGI_TO_INTEGER_OP              ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
 #define ARGI_TO_STRING_OP               ARGI_LIST3 (ARGI_BUFFER,     ARGI_INTEGER,       ARGI_FIXED_TARGET)
-#define ARGI_TYPE_OP                    ARGI_LIST1 (ARGI_ANYTYPE)
 #define ARGI_UNLOAD_OP                  ARGI_LIST1 (ARGI_DDBHANDLE)
 #define ARGI_VAR_PACKAGE_OP             ARGI_LIST1 (ARGI_INTEGER)
 #define ARGI_WAIT_OP                    ARGI_LIST2 (ARGI_EVENT,      ARGI_INTEGER)
index 8fc8c7c..96d510a 100644 (file)
@@ -92,7 +92,13 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
 acpi_status
 acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
                          struct acpi_parse_state *parser_state,
-                         union acpi_parse_object *arg, u8 method_call);
+                         union acpi_parse_object *arg,
+                         u8 possible_method_call);
+
+/* Values for u8 above */
+
+#define ACPI_NOT_METHOD_CALL            FALSE
+#define ACPI_POSSIBLE_METHOD_CALL       TRUE
 
 acpi_status
 acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
index 8b8fef6..9e84c05 100644 (file)
@@ -184,24 +184,24 @@ acpi_status acpi_ut_init_globals(void);
 
 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
 
-char *acpi_ut_get_mutex_name(u32 mutex_id);
+const char *acpi_ut_get_mutex_name(u32 mutex_id);
 
 const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type);
 #endif
 
-char *acpi_ut_get_type_name(acpi_object_type type);
+const char *acpi_ut_get_type_name(acpi_object_type type);
 
-char *acpi_ut_get_node_name(void *object);
+const char *acpi_ut_get_node_name(void *object);
 
-char *acpi_ut_get_descriptor_name(void *object);
+const char *acpi_ut_get_descriptor_name(void *object);
 
 const char *acpi_ut_get_reference_name(union acpi_operand_object *object);
 
-char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc);
+const char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc);
 
-char *acpi_ut_get_region_name(u8 space_id);
+const char *acpi_ut_get_region_name(u8 space_id);
 
-char *acpi_ut_get_event_name(u32 event_id);
+const char *acpi_ut_get_event_name(u32 event_id);
 
 char acpi_ut_hex_to_ascii_char(u64 integer, u32 position);
 
@@ -352,14 +352,6 @@ acpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
                              const char **method_names,
                              u8 method_count, u8 *out_values);
 
-/*
- * utfileio - file operations
- */
-#ifdef ACPI_APPLICATION
-acpi_status
-acpi_ut_read_table_from_file(char *filename, struct acpi_table_header **table);
-#endif
-
 /*
  * utids - device ID support
  */
@@ -371,10 +363,6 @@ acpi_status
 acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
                    struct acpi_pnp_device_id ** return_id);
 
-acpi_status
-acpi_ut_execute_SUB(struct acpi_namespace_node *device_node,
-                   struct acpi_pnp_device_id **return_id);
-
 acpi_status
 acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
                    struct acpi_pnp_device_id_list ** return_cid_list);
index 883f20c..ab9f3f1 100644 (file)
 #define AML_CREATE_WORD_FIELD_OP    (u16) 0x8b
 #define AML_CREATE_BYTE_FIELD_OP    (u16) 0x8c
 #define AML_CREATE_BIT_FIELD_OP     (u16) 0x8d
-#define AML_TYPE_OP                 (u16) 0x8e
+#define AML_OBJECT_TYPE_OP          (u16) 0x8e
 #define AML_CREATE_QWORD_FIELD_OP   (u16) 0x8f /* ACPI 2.0 */
 #define AML_LAND_OP                 (u16) 0x90
 #define AML_LOR_OP                  (u16) 0x91
 #define ARGP_TERMLIST               0x0F
 #define ARGP_WORDDATA               0x10
 #define ARGP_QWORDDATA              0x11
-#define ARGP_SIMPLENAME             0x12
+#define ARGP_SIMPLENAME             0x12       /* name_string | local_term | arg_term */
+#define ARGP_NAME_OR_REF            0x13       /* For object_type only */
 
 /*
  * Resolved argument types for the AML Interpreter
index 30414b3..328c35b 100644 (file)
@@ -798,7 +798,7 @@ acpi_db_device_resources(acpi_handle obj_handle,
        acpi_status status;
 
        node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle);
-       parent_path = acpi_ns_get_external_pathname(node);
+       parent_path = acpi_ns_get_normalized_pathname(node, TRUE);
        if (!parent_path) {
                return (AE_NO_MEMORY);
        }
@@ -1131,13 +1131,8 @@ void acpi_db_trace(char *enable_arg, char *method_arg, char *once_arg)
        u32 debug_layer = 0;
        u32 flags = 0;
 
-       if (enable_arg) {
-               acpi_ut_strupr(enable_arg);
-       }
-
-       if (once_arg) {
-               acpi_ut_strupr(once_arg);
-       }
+       acpi_ut_strupr(enable_arg);
+       acpi_ut_strupr(once_arg);
 
        if (method_arg) {
                if (acpi_db_trace_method_name) {
index 672977e..1965b48 100644 (file)
@@ -48,6 +48,7 @@
 #include "acnamesp.h"
 #include "acparser.h"
 #include "acinterp.h"
+#include "acevents.h"
 #include "acdebug.h"
 
 #define _COMPONENT          ACPI_CA_DEBUGGER
@@ -588,7 +589,7 @@ void acpi_db_display_calling_tree(void)
  *
  * FUNCTION:    acpi_db_display_object_type
  *
- * PARAMETERS:  name            - User entered NS node handle or name
+ * PARAMETERS:  object_arg      - User entered NS node handle
  *
  * RETURN:      None
  *
@@ -596,44 +597,34 @@ void acpi_db_display_calling_tree(void)
  *
  ******************************************************************************/
 
-void acpi_db_display_object_type(char *name)
+void acpi_db_display_object_type(char *object_arg)
 {
-       struct acpi_namespace_node *node;
+       acpi_handle handle;
        struct acpi_device_info *info;
        acpi_status status;
        u32 i;
 
-       node = acpi_db_convert_to_node(name);
-       if (!node) {
-               return;
-       }
+       handle = ACPI_TO_POINTER(strtoul(object_arg, NULL, 16));
 
-       status = acpi_get_object_info(ACPI_CAST_PTR(acpi_handle, node), &info);
+       status = acpi_get_object_info(handle, &info);
        if (ACPI_FAILURE(status)) {
                acpi_os_printf("Could not get object info, %s\n",
                               acpi_format_exception(status));
                return;
        }
 
-       if (info->valid & ACPI_VALID_ADR) {
-               acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
-                              ACPI_FORMAT_UINT64(info->address),
-                              info->current_status, info->flags);
-       }
-       if (info->valid & ACPI_VALID_SXDS) {
-               acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
-                              info->highest_dstates[0],
-                              info->highest_dstates[1],
-                              info->highest_dstates[2],
-                              info->highest_dstates[3]);
-       }
-       if (info->valid & ACPI_VALID_SXWS) {
-               acpi_os_printf
-                   ("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
-                    info->lowest_dstates[0], info->lowest_dstates[1],
-                    info->lowest_dstates[2], info->lowest_dstates[3],
-                    info->lowest_dstates[4]);
-       }
+       acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
+                      ACPI_FORMAT_UINT64(info->address),
+                      info->current_status, info->flags);
+
+       acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
+                      info->highest_dstates[0], info->highest_dstates[1],
+                      info->highest_dstates[2], info->highest_dstates[3]);
+
+       acpi_os_printf("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
+                      info->lowest_dstates[0], info->lowest_dstates[1],
+                      info->lowest_dstates[2], info->lowest_dstates[3],
+                      info->lowest_dstates[4]);
 
        if (info->valid & ACPI_VALID_HID) {
                acpi_os_printf("HID: %s\n", info->hardware_id.string);
@@ -643,10 +634,6 @@ void acpi_db_display_object_type(char *name)
                acpi_os_printf("UID: %s\n", info->unique_id.string);
        }
 
-       if (info->valid & ACPI_VALID_SUB) {
-               acpi_os_printf("SUB: %s\n", info->subsystem_id.string);
-       }
-
        if (info->valid & ACPI_VALID_CID) {
                for (i = 0; i < info->compatible_id_list.count; i++) {
                        acpi_os_printf("CID %u: %s\n", i,
@@ -679,6 +666,12 @@ acpi_db_display_result_object(union acpi_operand_object *obj_desc,
                              struct acpi_walk_state *walk_state)
 {
 
+#ifndef ACPI_APPLICATION
+       if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
+               return;
+       }
+#endif
+
        /* Only display if single stepping */
 
        if (!acpi_gbl_cm_single_step) {
@@ -708,6 +701,12 @@ acpi_db_display_argument_object(union acpi_operand_object *obj_desc,
                                struct acpi_walk_state *walk_state)
 {
 
+#ifndef ACPI_APPLICATION
+       if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
+               return;
+       }
+#endif
+
        if (!acpi_gbl_cm_single_step) {
                return;
        }
@@ -951,28 +950,25 @@ void acpi_db_display_handlers(void)
        if (obj_desc) {
                for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_space_id_list); i++) {
                        space_id = acpi_gbl_space_id_list[i];
-                       handler_obj = obj_desc->device.handler;
 
                        acpi_os_printf(ACPI_PREDEFINED_PREFIX,
                                       acpi_ut_get_region_name((u8)space_id),
                                       space_id);
 
-                       while (handler_obj) {
-                               if (acpi_gbl_space_id_list[i] ==
-                                   handler_obj->address_space.space_id) {
-                                       acpi_os_printf
-                                           (ACPI_HANDLER_PRESENT_STRING,
-                                            (handler_obj->address_space.
-                                             handler_flags &
-                                             ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
-                                            ? "Default" : "User",
-                                            handler_obj->address_space.
-                                            handler);
-
-                                       goto found_handler;
-                               }
+                       handler_obj =
+                           acpi_ev_find_region_handler(space_id,
+                                                       obj_desc->common_notify.
+                                                       handler);
+                       if (handler_obj) {
+                               acpi_os_printf(ACPI_HANDLER_PRESENT_STRING,
+                                              (handler_obj->address_space.
+                                               handler_flags &
+                                               ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
+                                              ? "Default" : "User",
+                                              handler_obj->address_space.
+                                              handler);
 
-                               handler_obj = handler_obj->address_space.next;
+                               goto found_handler;
                        }
 
                        /* There is no handler for this space_id */
@@ -984,7 +980,7 @@ found_handler:              ;
 
                /* Find all handlers for user-defined space_IDs */
 
-               handler_obj = obj_desc->device.handler;
+               handler_obj = obj_desc->common_notify.handler;
                while (handler_obj) {
                        if (handler_obj->address_space.space_id >=
                            ACPI_USER_REGION_BEGIN) {
@@ -1079,14 +1075,14 @@ acpi_db_display_non_root_handlers(acpi_handle obj_handle,
                return (AE_OK);
        }
 
-       pathname = acpi_ns_get_external_pathname(node);
+       pathname = acpi_ns_get_normalized_pathname(node, TRUE);
        if (!pathname) {
                return (AE_OK);
        }
 
        /* Display all handlers associated with this device */
 
-       handler_obj = obj_desc->device.handler;
+       handler_obj = obj_desc->common_notify.handler;
        while (handler_obj) {
                acpi_os_printf(ACPI_PREDEFINED_PREFIX,
                               acpi_ut_get_region_name((u8)handler_obj->
index d0e6b20..31f54d7 100644 (file)
 #include "accommon.h"
 #include "acdebug.h"
 #include "actables.h"
+#include <stdio.h>
+#ifdef ACPI_APPLICATION
+#include "acapps.h"
+#endif
 
 #define _COMPONENT          ACPI_CA_DEBUGGER
 ACPI_MODULE_NAME("dbfileio")
@@ -110,122 +114,31 @@ void acpi_db_open_debug_file(char *name)
 }
 #endif
 
-#ifdef ACPI_APPLICATION
-#include "acapps.h"
-
-/*******************************************************************************
- *
- * FUNCTION:    ae_local_load_table
- *
- * PARAMETERS:  table           - pointer to a buffer containing the entire
- *                                table to be loaded
- *
- * RETURN:      Status
- *
- * DESCRIPTION: This function is called to load a table from the caller's
- *              buffer. The buffer must contain an entire ACPI Table including
- *              a valid header. The header fields will be verified, and if it
- *              is determined that the table is invalid, the call will fail.
- *
- ******************************************************************************/
-
-static acpi_status ae_local_load_table(struct acpi_table_header *table)
-{
-       acpi_status status = AE_OK;
-
-       ACPI_FUNCTION_TRACE(ae_local_load_table);
-
-#if 0
-/*    struct acpi_table_desc          table_info; */
-
-       if (!table) {
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
-       }
-
-       table_info.pointer = table;
-       status = acpi_tb_recognize_table(&table_info, ACPI_TABLE_ALL);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /* Install the new table into the local data structures */
-
-       status = acpi_tb_init_table_descriptor(&table_info);
-       if (ACPI_FAILURE(status)) {
-               if (status == AE_ALREADY_EXISTS) {
-
-                       /* Table already exists, no error */
-
-                       status = AE_OK;
-               }
-
-               /* Free table allocated by acpi_tb_get_table */
-
-               acpi_tb_delete_single_table(&table_info);
-               return_ACPI_STATUS(status);
-       }
-#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
-
-       status =
-           acpi_ns_load_table(table_info.installed_desc, acpi_gbl_root_node);
-       if (ACPI_FAILURE(status)) {
-
-               /* Uninstall table and free the buffer */
-
-               acpi_tb_delete_tables_by_type(ACPI_TABLE_ID_DSDT);
-               return_ACPI_STATUS(status);
-       }
-#endif
-#endif
-
-       return_ACPI_STATUS(status);
-}
-#endif
-
 /*******************************************************************************
  *
- * FUNCTION:    acpi_db_get_table_from_file
+ * FUNCTION:    acpi_db_load_tables
  *
- * PARAMETERS:  filename        - File where table is located
- *              return_table    - Where a pointer to the table is returned
+ * PARAMETERS:  list_head       - List of ACPI tables to load
  *
  * RETURN:      Status
  *
- * DESCRIPTION: Load an ACPI table from a file
+ * DESCRIPTION: Load ACPI tables from a previously constructed table list.
  *
  ******************************************************************************/
 
-acpi_status
-acpi_db_get_table_from_file(char *filename,
-                           struct acpi_table_header **return_table,
-                           u8 must_be_aml_file)
+acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
 {
-#ifdef ACPI_APPLICATION
        acpi_status status;
+       struct acpi_new_table_desc *table_list_head;
        struct acpi_table_header *table;
-       u8 is_aml_table = TRUE;
-
-       status = acpi_ut_read_table_from_file(filename, &table);
-       if (ACPI_FAILURE(status)) {
-               return (status);
-       }
-
-       if (must_be_aml_file) {
-               is_aml_table = acpi_ut_is_aml_table(table);
-               if (!is_aml_table) {
-                       ACPI_EXCEPTION((AE_INFO, AE_OK,
-                                       "Input for -e is not an AML table: "
-                                       "\"%4.4s\" (must be DSDT/SSDT)",
-                                       table->signature));
-                       return (AE_TYPE);
-               }
-       }
 
-       if (is_aml_table) {
+       /* Load all ACPI tables in the list */
 
-               /* Attempt to recognize and install the table */
+       table_list_head = list_head;
+       while (table_list_head) {
+               table = table_list_head->table;
 
-               status = ae_local_load_table(table);
+               status = acpi_load_table(table);
                if (ACPI_FAILURE(status)) {
                        if (status == AE_ALREADY_EXISTS) {
                                acpi_os_printf
@@ -239,18 +152,12 @@ acpi_db_get_table_from_file(char *filename,
                        return (status);
                }
 
-               acpi_tb_print_table_header(0, table);
-
                fprintf(stderr,
                        "Acpi table [%4.4s] successfully installed and loaded\n",
                        table->signature);
-       }
 
-       acpi_gbl_acpi_hardware_present = FALSE;
-       if (return_table) {
-               *return_table = table;
+               table_list_head = table_list_head->next;
        }
 
-#endif                         /* ACPI_APPLICATION */
        return (AE_OK);
 }
index 0480254..6203001 100644 (file)
 #include "accommon.h"
 #include "acdebug.h"
 
+#ifdef ACPI_APPLICATION
+#include "acapps.h"
+#endif
+
 #define _COMPONENT          ACPI_CA_DEBUGGER
 ACPI_MODULE_NAME("dbinput")
 
@@ -53,8 +57,6 @@ static u32 acpi_db_get_line(char *input_buffer);
 
 static u32 acpi_db_match_command(char *user_command);
 
-static void acpi_db_single_thread(void);
-
 static void acpi_db_display_command_info(char *command, u8 display_all);
 
 static void acpi_db_display_help(char *command);
@@ -623,9 +625,7 @@ static u32 acpi_db_get_line(char *input_buffer)
 
        /* Uppercase the actual command */
 
-       if (acpi_gbl_db_args[0]) {
-               acpi_ut_strupr(acpi_gbl_db_args[0]);
-       }
+       acpi_ut_strupr(acpi_gbl_db_args[0]);
 
        count = i;
        if (count) {
@@ -1050,11 +1050,17 @@ acpi_db_command_dispatch(char *input_buffer,
                acpi_db_close_debug_file();
                break;
 
-       case CMD_LOAD:
+       case CMD_LOAD:{
+                       struct acpi_new_table_desc *list_head = NULL;
 
-               status =
-                   acpi_db_get_table_from_file(acpi_gbl_db_args[1], NULL,
-                                               FALSE);
+                       status =
+                           ac_get_all_tables_from_file(acpi_gbl_db_args[1],
+                                                       ACPI_GET_ALL_TABLES,
+                                                       &list_head);
+                       if (ACPI_SUCCESS(status)) {
+                               acpi_db_load_tables(list_head);
+                       }
+               }
                break;
 
        case CMD_OPEN:
@@ -1149,55 +1155,16 @@ acpi_db_command_dispatch(char *input_buffer,
 
 void ACPI_SYSTEM_XFACE acpi_db_execute_thread(void *context)
 {
-       acpi_status status = AE_OK;
-       acpi_status Mstatus;
-
-       while (status != AE_CTRL_TERMINATE && !acpi_gbl_db_terminate_loop) {
-               acpi_gbl_method_executing = FALSE;
-               acpi_gbl_step_to_next_call = FALSE;
-
-               Mstatus = acpi_os_acquire_mutex(acpi_gbl_db_command_ready,
-                                               ACPI_WAIT_FOREVER);
-               if (ACPI_FAILURE(Mstatus)) {
-                       return;
-               }
-
-               status =
-                   acpi_db_command_dispatch(acpi_gbl_db_line_buf, NULL, NULL);
 
-               acpi_os_release_mutex(acpi_gbl_db_command_complete);
-       }
+       (void)acpi_db_user_commands();
        acpi_gbl_db_threads_terminated = TRUE;
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_db_single_thread
- *
- * PARAMETERS:  None
- *
- * RETURN:      None
- *
- * DESCRIPTION: Debugger execute thread. Waits for a command line, then
- *              simply dispatches it.
- *
- ******************************************************************************/
-
-static void acpi_db_single_thread(void)
-{
-
-       acpi_gbl_method_executing = FALSE;
-       acpi_gbl_step_to_next_call = FALSE;
-
-       (void)acpi_db_command_dispatch(acpi_gbl_db_line_buf, NULL, NULL);
-}
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_db_user_commands
  *
- * PARAMETERS:  prompt              - User prompt (depends on mode)
- *              op                  - Current executing parse op
+ * PARAMETERS:  None
  *
  * RETURN:      None
  *
@@ -1206,7 +1173,7 @@ static void acpi_db_single_thread(void)
  *
  ******************************************************************************/
 
-acpi_status acpi_db_user_commands(char prompt, union acpi_parse_object *op)
+acpi_status acpi_db_user_commands(void)
 {
        acpi_status status = AE_OK;
 
@@ -1216,52 +1183,31 @@ acpi_status acpi_db_user_commands(char prompt, union acpi_parse_object *op)
 
        while (!acpi_gbl_db_terminate_loop) {
 
-               /* Force output to console until a command is entered */
-
-               acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
-
-               /* Different prompt if method is executing */
-
-               if (!acpi_gbl_method_executing) {
-                       acpi_os_printf("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
-               } else {
-                       acpi_os_printf("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
-               }
+               /* Wait the readiness of the command */
 
-               /* Get the user input line */
-
-               status = acpi_os_get_line(acpi_gbl_db_line_buf,
-                                         ACPI_DB_LINE_BUFFER_SIZE, NULL);
+               status = acpi_os_wait_command_ready();
                if (ACPI_FAILURE(status)) {
-                       ACPI_EXCEPTION((AE_INFO, status,
-                                       "While parsing command line"));
-                       return (status);
+                       break;
                }
 
-               /* Check for single or multithreaded debug */
+               /* Just call to the command line interpreter */
 
-               if (acpi_gbl_debugger_configuration & DEBUGGER_MULTI_THREADED) {
-                       /*
-                        * Signal the debug thread that we have a command to execute,
-                        * and wait for the command to complete.
-                        */
-                       acpi_os_release_mutex(acpi_gbl_db_command_ready);
-                       if (ACPI_FAILURE(status)) {
-                               return (status);
-                       }
+               acpi_gbl_method_executing = FALSE;
+               acpi_gbl_step_to_next_call = FALSE;
 
-                       status =
-                           acpi_os_acquire_mutex(acpi_gbl_db_command_complete,
-                                                 ACPI_WAIT_FOREVER);
-                       if (ACPI_FAILURE(status)) {
-                               return (status);
-                       }
-               } else {
-                       /* Just call to the command line interpreter */
+               (void)acpi_db_command_dispatch(acpi_gbl_db_line_buf, NULL,
+                                              NULL);
+
+               /* Notify the completion of the command */
 
-                       acpi_db_single_thread();
+               status = acpi_os_notify_command_complete();
+               if (ACPI_FAILURE(status)) {
+                       break;
                }
        }
 
+       if (ACPI_FAILURE(status) && status != AE_CTRL_TERMINATE) {
+               ACPI_EXCEPTION((AE_INFO, status, "While parsing command line"));
+       }
        return (status);
 }
index 04ff1eb..4f68dfc 100644 (file)
@@ -438,7 +438,7 @@ acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
                return (AE_OK);
        }
 
-       pathname = acpi_ns_get_external_pathname(node);
+       pathname = acpi_ns_get_normalized_pathname(node, TRUE);
        if (!pathname) {
                return (AE_OK);
        }
index 4ba0a20..de255d9 100644 (file)
@@ -382,6 +382,7 @@ acpi_status acpi_db_display_statistics(char *type_arg)
                                       acpi_gbl_node_type_count[i],
                                       acpi_gbl_obj_type_count[i]);
                }
+
                acpi_os_printf("%16.16s % 10ld% 10ld\n", "Misc/Unknown",
                               acpi_gbl_node_type_count_misc,
                               acpi_gbl_obj_type_count_misc);
index 10ea8bf..68b4e8d 100644 (file)
@@ -953,7 +953,7 @@ acpi_db_evaluate_one_predefined_name(acpi_handle obj_handle,
                return (AE_OK);
        }
 
-       pathname = acpi_ns_get_external_pathname(node);
+       pathname = acpi_ns_get_normalized_pathname(node, TRUE);
        if (!pathname) {
                return (AE_OK);
        }
index 86790e0..8c85d85 100644 (file)
@@ -173,6 +173,7 @@ void acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level)
                        if (obj_desc->buffer.length > 16) {
                                acpi_os_printf("\n");
                        }
+
                        acpi_ut_debug_dump_buffer(ACPI_CAST_PTR
                                                  (u8,
                                                   obj_desc->buffer.pointer),
index 342298a..d7ff58e 100644 (file)
@@ -85,46 +85,21 @@ acpi_db_start_command(struct acpi_walk_state *walk_state,
 
        acpi_gbl_method_executing = TRUE;
        status = AE_CTRL_TRUE;
-       while (status == AE_CTRL_TRUE) {
-               if (acpi_gbl_debugger_configuration == DEBUGGER_MULTI_THREADED) {
-
-                       /* Handshake with the front-end that gets user command lines */
-
-                       acpi_os_release_mutex(acpi_gbl_db_command_complete);
-
-                       status =
-                           acpi_os_acquire_mutex(acpi_gbl_db_command_ready,
-                                                 ACPI_WAIT_FOREVER);
-                       if (ACPI_FAILURE(status)) {
-                               return (status);
-                       }
-               } else {
-                       /* Single threaded, we must get a command line ourselves */
-
-                       /* Force output to console until a command is entered */
 
-                       acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
+       while (status == AE_CTRL_TRUE) {
 
-                       /* Different prompt if method is executing */
+               /* Notify the completion of the command */
 
-                       if (!acpi_gbl_method_executing) {
-                               acpi_os_printf("%1c ",
-                                              ACPI_DEBUGGER_COMMAND_PROMPT);
-                       } else {
-                               acpi_os_printf("%1c ",
-                                              ACPI_DEBUGGER_EXECUTE_PROMPT);
-                       }
+               status = acpi_os_notify_command_complete();
+               if (ACPI_FAILURE(status)) {
+                       goto error_exit;
+               }
 
-                       /* Get the user input line */
+               /* Wait the readiness of the command */
 
-                       status = acpi_os_get_line(acpi_gbl_db_line_buf,
-                                                 ACPI_DB_LINE_BUFFER_SIZE,
-                                                 NULL);
-                       if (ACPI_FAILURE(status)) {
-                               ACPI_EXCEPTION((AE_INFO, status,
-                                               "While parsing command line"));
-                               return (status);
-                       }
+               status = acpi_os_wait_command_ready();
+               if (ACPI_FAILURE(status)) {
+                       goto error_exit;
                }
 
                status =
@@ -134,9 +109,44 @@ acpi_db_start_command(struct acpi_walk_state *walk_state,
 
        /* acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); */
 
+error_exit:
+       if (ACPI_FAILURE(status) && status != AE_CTRL_TERMINATE) {
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "While parsing/handling command line"));
+       }
        return (status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_db_signal_break_point
+ *
+ * PARAMETERS:  walk_state      - Current walk
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Called for AML_BREAK_POINT_OP
+ *
+ ******************************************************************************/
+
+void acpi_db_signal_break_point(struct acpi_walk_state *walk_state)
+{
+
+#ifndef ACPI_APPLICATION
+       if (acpi_gbl_db_thread_id != acpi_os_get_thread_id()) {
+               return;
+       }
+#endif
+
+       /*
+        * Set the single-step flag. This will cause the debugger (if present)
+        * to break to the console within the AML debugger at the start of the
+        * next AML instruction.
+        */
+       acpi_gbl_cm_single_step = TRUE;
+       acpi_os_printf("**break** Executed AML BreakPoint opcode\n");
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_db_single_step
@@ -420,15 +430,7 @@ acpi_status acpi_initialize_debugger(void)
 
                /* These were created with one unit, grab it */
 
-               status = acpi_os_acquire_mutex(acpi_gbl_db_command_complete,
-                                              ACPI_WAIT_FOREVER);
-               if (ACPI_FAILURE(status)) {
-                       acpi_os_printf("Could not get debugger mutex\n");
-                       return_ACPI_STATUS(status);
-               }
-
-               status = acpi_os_acquire_mutex(acpi_gbl_db_command_ready,
-                                              ACPI_WAIT_FOREVER);
+               status = acpi_os_initialize_command_signals();
                if (ACPI_FAILURE(status)) {
                        acpi_os_printf("Could not get debugger mutex\n");
                        return_ACPI_STATUS(status);
@@ -473,13 +475,14 @@ void acpi_terminate_debugger(void)
        acpi_gbl_db_terminate_loop = TRUE;
 
        if (acpi_gbl_debugger_configuration & DEBUGGER_MULTI_THREADED) {
-               acpi_os_release_mutex(acpi_gbl_db_command_ready);
 
                /* Wait the AML Debugger threads */
 
                while (!acpi_gbl_db_threads_terminated) {
                        acpi_os_sleep(100);
                }
+
+               acpi_os_terminate_command_signals();
        }
 
        if (acpi_gbl_db_buffer) {
index e2ab59e..76cfced 100644 (file)
@@ -194,8 +194,8 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
        extra_desc = acpi_ns_get_secondary_object(obj_desc);
        node = obj_desc->buffer_field.node;
 
-       ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_BUFFER_FIELD,
-                                                     node, NULL));
+       ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
+                       (ACPI_TYPE_BUFFER_FIELD, node, NULL));
 
        ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
                          acpi_ut_get_node_name(node)));
@@ -385,7 +385,8 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
        ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
                        (ACPI_TYPE_REGION, node, NULL));
 
-       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n",
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                         "[%4.4s] OpRegion Arg Init at AML %p\n",
                          acpi_ut_get_node_name(node),
                          extra_desc->extra.aml_start));
 
index 435fc16..06a6f7f 100644 (file)
@@ -47,6 +47,7 @@
 #include "amlcode.h"
 #include "acdispat.h"
 #include "acinterp.h"
+#include "acdebug.h"
 
 #define _COMPONENT          ACPI_DISPATCHER
 ACPI_MODULE_NAME("dscontrol")
@@ -348,14 +349,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
 
        case AML_BREAK_POINT_OP:
 
-               /*
-                * Set the single-step flag. This will cause the debugger (if present)
-                * to break to the console within the AML debugger at the start of the
-                * next AML instruction.
-                */
-               ACPI_DEBUGGER_EXEC(acpi_gbl_cm_single_step = TRUE);
-               ACPI_DEBUGGER_EXEC(acpi_os_printf
-                                  ("**break** Executed AML BreakPoint opcode\n"));
+               acpi_db_signal_break_point(walk_state);
 
                /* Call to the OSL in case OS wants a piece of the action */
 
index 309556e..1eb82bd 100644 (file)
@@ -161,6 +161,7 @@ acpi_ds_dump_method_stack(acpi_status status,
        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
                          "\n**** Exception %s during execution of method ",
                          acpi_format_exception(status)));
+
        acpi_ds_print_node_pathname(walk_state->method_node, NULL);
 
        /* Display stack of executing methods */
@@ -203,8 +204,8 @@ acpi_ds_dump_method_stack(acpi_status status,
                } else {
                        /*
                         * This method has called another method
-                        * NOTE: the method call parse subtree is already deleted at this
-                        * point, so we cannot disassemble the method invocation.
+                        * NOTE: the method call parse subtree is already deleted at
+                        * this point, so we cannot disassemble the method invocation.
                         */
                        ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH,
                                              "Call to method "));
index 20de148..6bca0ec 100644 (file)
@@ -106,6 +106,7 @@ acpi_ds_create_external_region(acpi_status lookup_status,
         * insert the name into the namespace.
         */
        acpi_dm_add_op_to_external_list(op, path, ACPI_TYPE_REGION, 0, 0);
+
        status = acpi_ns_lookup(walk_state->scope_info, path, ACPI_TYPE_REGION,
                                ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT,
                                walk_state, node);
@@ -202,11 +203,10 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
 
                /* Enter the name_string into the namespace */
 
-               status =
-                   acpi_ns_lookup(walk_state->scope_info,
-                                  arg->common.value.string, ACPI_TYPE_ANY,
-                                  ACPI_IMODE_LOAD_PASS1, flags, walk_state,
-                                  &node);
+               status = acpi_ns_lookup(walk_state->scope_info,
+                                       arg->common.value.string, ACPI_TYPE_ANY,
+                                       ACPI_IMODE_LOAD_PASS1, flags,
+                                       walk_state, &node);
                if (ACPI_FAILURE(status)) {
                        ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
                        return_ACPI_STATUS(status);
@@ -244,8 +244,8 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
        }
 
        /*
-        * Remember location in AML stream of the field unit opcode and operands --
-        * since the buffer and index operands must be evaluated.
+        * Remember location in AML stream of the field unit opcode and operands
+        * -- since the buffer and index operands must be evaluated.
         */
        second_desc = obj_desc->common.next_object;
        second_desc->extra.aml_start = op->named.data;
@@ -310,8 +310,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
                switch (arg->common.aml_opcode) {
                case AML_INT_RESERVEDFIELD_OP:
 
-                       position = (u64) info->field_bit_position
-                           + (u64) arg->common.value.size;
+                       position = (u64)info->field_bit_position +
+                           (u64)arg->common.value.size;
 
                        if (position > ACPI_UINT32_MAX) {
                                ACPI_ERROR((AE_INFO,
@@ -344,13 +344,13 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
 
                        /* access_attribute (attrib_quick, attrib_byte, etc.) */
 
-                       info->attribute =
-                           (u8)((arg->common.value.integer >> 8) & 0xFF);
+                       info->attribute = (u8)
+                           ((arg->common.value.integer >> 8) & 0xFF);
 
                        /* access_length (for serial/buffer protocols) */
 
-                       info->access_length =
-                           (u8)((arg->common.value.integer >> 16) & 0xFF);
+                       info->access_length = (u8)
+                           ((arg->common.value.integer >> 16) & 0xFF);
                        break;
 
                case AML_INT_CONNECTION_OP:
@@ -425,8 +425,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
 
                        /* Keep track of bit position for the next field */
 
-                       position = (u64) info->field_bit_position
-                           + (u64) arg->common.value.size;
+                       position = (u64)info->field_bit_position +
+                           (u64)arg->common.value.size;
 
                        if (position > ACPI_UINT32_MAX) {
                                ACPI_ERROR((AE_INFO,
@@ -716,11 +716,12 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
 
        /*
         * Use Info.data_register_node to store bank_field Op
-        * It's safe because data_register_node will never be used when create bank field
-        * We store aml_start and aml_length in the bank_field Op for late evaluation
-        * Used in acpi_ex_prep_field_value(Info)
+        * It's safe because data_register_node will never be used when create
+        * bank field \we store aml_start and aml_length in the bank_field Op for
+        * late evaluation. Used in acpi_ex_prep_field_value(Info)
         *
-        * TBD: Or, should we add a field in struct acpi_create_field_info, like "void *ParentOp"?
+        * TBD: Or, should we add a field in struct acpi_create_field_info, like
+        * "void *ParentOp"?
         */
        info.data_register_node = (struct acpi_namespace_node *)op;
 
index 920f1b1..c1d8af8 100644 (file)
@@ -247,7 +247,7 @@ acpi_ds_initialize_objects(u32 table_index,
        /* Summary of objects initialized */
 
        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
-                             "Table [%4.4s:%8.8s] (id %.2X) - %4u Objects with %3u Devices, "
+                             "Table [%4.4s: %-8.8s] (id %.2X) - %4u Objects with %3u Devices, "
                              "%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n",
                              table->signature, table->oem_table_id, owner_id,
                              info.object_count, info.device_count,
index bc32f31..6585e8e 100644 (file)
@@ -118,10 +118,9 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
 
-       status =
-           acpi_ds_init_aml_walk(walk_state, op, node,
-                                 obj_desc->method.aml_start,
-                                 obj_desc->method.aml_length, NULL, 0);
+       status = acpi_ds_init_aml_walk(walk_state, op, node,
+                                      obj_desc->method.aml_start,
+                                      obj_desc->method.aml_length, NULL, 0);
        if (ACPI_FAILURE(status)) {
                acpi_ds_delete_walk_state(walk_state);
                acpi_ps_free_op(op);
@@ -375,7 +374,8 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
                    && (walk_state->thread->current_sync_level >
                        obj_desc->method.mutex->mutex.sync_level)) {
                        ACPI_ERROR((AE_INFO,
-                                   "Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%u)",
+                                   "Cannot acquire Mutex for method [%4.4s]"
+                                   ", current SyncLevel is too large (%u)",
                                    acpi_ut_get_node_name(method_node),
                                    walk_state->thread->current_sync_level));
 
@@ -411,8 +411,19 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
 
                                obj_desc->method.mutex->mutex.thread_id =
                                    walk_state->thread->thread_id;
-                               walk_state->thread->current_sync_level =
-                                   obj_desc->method.sync_level;
+
+                               /*
+                                * Update the current sync_level only if this is not an auto-
+                                * serialized method. In the auto case, we have to ignore
+                                * the sync level for the method mutex (created for the
+                                * auto-serialization) because we have no idea of what the
+                                * sync level should be. Therefore, just ignore it.
+                                */
+                               if (!(obj_desc->method.info_flags &
+                                     ACPI_METHOD_IGNORE_SYNC_LEVEL)) {
+                                       walk_state->thread->current_sync_level =
+                                           obj_desc->method.sync_level;
+                               }
                        } else {
                                obj_desc->method.mutex->mutex.
                                    original_sync_level =
@@ -501,16 +512,18 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
 
        /* Init for new method, possibly wait on method mutex */
 
-       status = acpi_ds_begin_method_execution(method_node, obj_desc,
-                                               this_walk_state);
+       status =
+           acpi_ds_begin_method_execution(method_node, obj_desc,
+                                          this_walk_state);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
 
        /* Begin method parse/execution. Create a new walk state */
 
-       next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id,
-                                                   NULL, obj_desc, thread);
+       next_walk_state =
+           acpi_ds_create_walk_state(obj_desc->method.owner_id, NULL, obj_desc,
+                                     thread);
        if (!next_walk_state) {
                status = AE_NO_MEMORY;
                goto cleanup;
@@ -797,7 +810,8 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
                    info_flags & ACPI_METHOD_SERIALIZED_PENDING) {
                        if (walk_state) {
                                ACPI_INFO((AE_INFO,
-                                          "Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error",
+                                          "Marking method %4.4s as Serialized "
+                                          "because of AE_ALREADY_EXISTS error",
                                           walk_state->method_node->name.
                                           ascii));
                        }
@@ -815,6 +829,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
                         */
                        method_desc->method.info_flags &=
                            ~ACPI_METHOD_SERIALIZED_PENDING;
+
                        method_desc->method.info_flags |=
                            (ACPI_METHOD_SERIALIZED |
                             ACPI_METHOD_IGNORE_SYNC_LEVEL);
index 2e4c42b..03c44f2 100644 (file)
@@ -99,6 +99,7 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
        for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
                ACPI_MOVE_32_TO_32(&walk_state->arguments[i].name,
                                   NAMEOF_ARG_NTE);
+
                walk_state->arguments[i].name.integer |= (i << 24);
                walk_state->arguments[i].descriptor_type = ACPI_DESC_TYPE_NAMED;
                walk_state->arguments[i].type = ACPI_TYPE_ANY;
@@ -201,7 +202,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
 
        if (!params) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
-                                 "No param list passed to method\n"));
+                                 "No parameter list passed to method\n"));
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -214,9 +215,9 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
                 * Store the argument in the method/walk descriptor.
                 * Do not copy the arg in order to implement call by reference
                 */
-               status = acpi_ds_method_data_set_value(ACPI_REFCLASS_ARG, index,
-                                                      params[index],
-                                                      walk_state);
+               status =
+                   acpi_ds_method_data_set_value(ACPI_REFCLASS_ARG, index,
+                                                 params[index], walk_state);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
@@ -610,11 +611,11 @@ acpi_ds_store_object_to_local(u8 type,
                         * do the indirect store
                         */
                        if ((ACPI_GET_DESCRIPTOR_TYPE(current_obj_desc) ==
-                            ACPI_DESC_TYPE_OPERAND)
-                           && (current_obj_desc->common.type ==
-                               ACPI_TYPE_LOCAL_REFERENCE)
-                           && (current_obj_desc->reference.class ==
-                               ACPI_REFCLASS_REFOF)) {
+                            ACPI_DESC_TYPE_OPERAND) &&
+                           (current_obj_desc->common.type ==
+                            ACPI_TYPE_LOCAL_REFERENCE) &&
+                           (current_obj_desc->reference.class ==
+                            ACPI_REFCLASS_REFOF)) {
                                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
                                                  "Arg (%p) is an ObjRef(Node), storing in node %p\n",
                                                  new_obj_desc,
@@ -638,6 +639,7 @@ acpi_ds_store_object_to_local(u8 type,
                                if (new_obj_desc != obj_desc) {
                                        acpi_ut_remove_reference(new_obj_desc);
                                }
+
                                return_ACPI_STATUS(status);
                        }
                }
index 2beb7fd..302c91f 100644 (file)
@@ -463,10 +463,10 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
                                                  arg->common.node);
                        }
                } else {
-                       status = acpi_ds_build_internal_object(walk_state, arg,
-                                                              &obj_desc->
-                                                              package.
-                                                              elements[i]);
+                       status =
+                           acpi_ds_build_internal_object(walk_state, arg,
+                                                         &obj_desc->package.
+                                                         elements[i]);
                }
 
                if (*obj_desc_ptr) {
@@ -525,7 +525,8 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
                }
 
                ACPI_INFO((AE_INFO,
-                          "Actual Package length (%u) is larger than NumElements field (%u), truncated",
+                          "Actual Package length (%u) is larger than "
+                          "NumElements field (%u), truncated",
                           i, element_count));
        } else if (i < element_count) {
                /*
@@ -533,7 +534,8 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
                 * Note: this is not an error, the package is padded out with NULLs.
                 */
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                 "Package List length (%u) smaller than NumElements count (%u), padded with null elements\n",
+                                 "Package List length (%u) smaller than NumElements "
+                                 "count (%u), padded with null elements\n",
                                  i, element_count));
        }
 
@@ -584,8 +586,9 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state,
 
        /* Build an internal object for the argument(s) */
 
-       status = acpi_ds_build_internal_object(walk_state, op->common.value.arg,
-                                              &obj_desc);
+       status =
+           acpi_ds_build_internal_object(walk_state, op->common.value.arg,
+                                         &obj_desc);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
index 81d7b98..1edd66f 100644 (file)
@@ -243,8 +243,9 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
         * For field_flags, use LOCK_RULE = 0 (NO_LOCK),
         * UPDATE_RULE = 0 (UPDATE_PRESERVE)
         */
-       status = acpi_ex_prep_common_field_object(obj_desc, field_flags, 0,
-                                                 bit_offset, bit_count);
+       status =
+           acpi_ex_prep_common_field_object(obj_desc, field_flags, 0,
+                                            bit_offset, bit_count);
        if (ACPI_FAILURE(status)) {
                goto cleanup;
        }
@@ -330,8 +331,9 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
 
        /* Resolve the operands */
 
-       status = acpi_ex_resolve_operands(op->common.aml_opcode,
-                                         ACPI_WALK_OPERANDS, walk_state);
+       status =
+           acpi_ex_resolve_operands(op->common.aml_opcode, ACPI_WALK_OPERANDS,
+                                    walk_state);
        if (ACPI_FAILURE(status)) {
                ACPI_ERROR((AE_INFO, "(%s) bad operand(s), status 0x%X",
                            acpi_ps_get_opcode_name(op->common.aml_opcode),
@@ -414,8 +416,9 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
 
        /* Resolve the length and address operands to numbers */
 
-       status = acpi_ex_resolve_operands(op->common.aml_opcode,
-                                         ACPI_WALK_OPERANDS, walk_state);
+       status =
+           acpi_ex_resolve_operands(op->common.aml_opcode, ACPI_WALK_OPERANDS,
+                                    walk_state);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -452,7 +455,6 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
        /* Now the address and length are valid for this opregion */
 
        obj_desc->region.flags |= AOPOBJ_DATA_VALID;
-
        return_ACPI_STATUS(status);
 }
 
@@ -510,8 +512,9 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
         * Resolve the Signature string, oem_id string,
         * and oem_table_id string operands
         */
-       status = acpi_ex_resolve_operands(op->common.aml_opcode,
-                                         ACPI_WALK_OPERANDS, walk_state);
+       status =
+           acpi_ex_resolve_operands(op->common.aml_opcode, ACPI_WALK_OPERANDS,
+                                    walk_state);
        if (ACPI_FAILURE(status)) {
                goto cleanup;
        }
index ebc577b..fa8e292 100644 (file)
@@ -245,9 +245,9 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
                         * we will use the return value
                         */
                        if ((walk_state->control_state->common.state ==
-                            ACPI_CONTROL_PREDICATE_EXECUTING)
-                           && (walk_state->control_state->control.
-                               predicate_op == op)) {
+                            ACPI_CONTROL_PREDICATE_EXECUTING) &&
+                           (walk_state->control_state->control.predicate_op ==
+                            op)) {
                                goto result_used;
                        }
                        break;
@@ -481,10 +481,9 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
 
                /* Get the entire name string from the AML stream */
 
-               status =
-                   acpi_ex_get_name_string(ACPI_TYPE_ANY,
-                                           arg->common.value.buffer,
-                                           &name_string, &name_length);
+               status = acpi_ex_get_name_string(ACPI_TYPE_ANY,
+                                                arg->common.value.buffer,
+                                                &name_string, &name_length);
 
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
@@ -503,9 +502,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                 */
                if ((walk_state->deferred_node) &&
                    (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD)
-                   && (arg_index ==
-                       (u32) ((walk_state->opcode ==
-                               AML_CREATE_FIELD_OP) ? 3 : 2))) {
+                   && (arg_index == (u32)
+                       ((walk_state->opcode == AML_CREATE_FIELD_OP) ? 3 : 2))) {
                        obj_desc =
                            ACPI_CAST_PTR(union acpi_operand_object,
                                          walk_state->deferred_node);
@@ -522,9 +520,10 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                        op_info =
                            acpi_ps_get_opcode_info(parent_op->common.
                                                    aml_opcode);
-                       if ((op_info->flags & AML_NSNODE)
-                           && (parent_op->common.aml_opcode !=
-                               AML_INT_METHODCALL_OP)
+
+                       if ((op_info->flags & AML_NSNODE) &&
+                           (parent_op->common.aml_opcode !=
+                            AML_INT_METHODCALL_OP)
                            && (parent_op->common.aml_opcode != AML_REGION_OP)
                            && (parent_op->common.aml_opcode !=
                                AML_INT_NAMEPATH_OP)) {
@@ -605,8 +604,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
-               ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
-                                  (obj_desc, walk_state));
+
+               acpi_db_display_argument_object(obj_desc, walk_state);
        } else {
                /* Check for null name case */
 
@@ -633,15 +632,16 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                        return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
                }
 
-               if ((op_info->flags & AML_HAS_RETVAL)
-                   || (arg->common.flags & ACPI_PARSEOP_IN_STACK)) {
+               if ((op_info->flags & AML_HAS_RETVAL) ||
+                   (arg->common.flags & ACPI_PARSEOP_IN_STACK)) {
                        ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
                                          "Argument previously created, already stacked\n"));
 
-                       ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
-                                          (walk_state->
-                                           operands[walk_state->num_operands -
-                                                    1], walk_state));
+                       acpi_db_display_argument_object(walk_state->
+                                                       operands[walk_state->
+                                                                num_operands -
+                                                                1],
+                                                       walk_state);
 
                        /*
                         * Use value that was already previously returned
@@ -685,8 +685,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
                        return_ACPI_STATUS(status);
                }
 
-               ACPI_DEBUGGER_EXEC(acpi_db_display_argument_object
-                                  (obj_desc, walk_state));
+               acpi_db_display_argument_object(obj_desc, walk_state);
        }
 
        return_ACPI_STATUS(AE_OK);
index df54d46..ed2f1d3 100644 (file)
@@ -172,14 +172,14 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
 
 cleanup:
 
-       ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n",
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                         "Completed a predicate eval=%X Op=%p\n",
                          walk_state->control_state->common.value,
                          walk_state->op));
 
        /* Break to debugger to display result */
 
-       ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
-                          (local_obj_desc, walk_state));
+       acpi_db_display_result_object(local_obj_desc, walk_state);
 
        /*
         * Delete the predicate result object (we know that
@@ -264,8 +264,8 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
            (walk_state->control_state->common.state ==
             ACPI_CONTROL_CONDITIONAL_EXECUTING)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
-                                 "Exec predicate Op=%p State=%p\n", op,
-                                 walk_state));
+                                 "Exec predicate Op=%p State=%p\n",
+                                 op, walk_state));
 
                walk_state->control_state->common.state =
                    ACPI_CONTROL_PREDICATE_EXECUTING;
@@ -386,11 +386,10 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
 
        /* Call debugger for single step support (DEBUG build only) */
 
-       ACPI_DEBUGGER_EXEC(status =
-                          acpi_db_single_step(walk_state, op, op_class));
-       ACPI_DEBUGGER_EXEC(if (ACPI_FAILURE(status)) {
-                          return_ACPI_STATUS(status);}
-       ) ;
+       status = acpi_db_single_step(walk_state, op, op_class);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
 
        /* Decode the Opcode Class */
 
@@ -502,9 +501,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                                                  "Method Reference in a Package, Op=%p\n",
                                                  op));
 
-                               op->common.node =
-                                   (struct acpi_namespace_node *)op->asl.value.
-                                   arg->asl.node;
+                               op->common.node = (struct acpi_namespace_node *)
+                                   op->asl.value.arg->asl.node;
                                acpi_ut_add_reference(op->asl.value.arg->asl.
                                                      node->object);
                                return_ACPI_STATUS(AE_OK);
@@ -586,8 +584,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                                 * Put the Node on the object stack (Contains the ACPI Name
                                 * of this object)
                                 */
-                               walk_state->operands[0] =
-                                   (void *)op->common.parent->common.node;
+                               walk_state->operands[0] = (void *)
+                                   op->common.parent->common.node;
                                walk_state->num_operands = 1;
 
                                status = acpi_ds_create_node(walk_state,
@@ -692,7 +690,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
                default:
 
                        ACPI_ERROR((AE_INFO,
-                                   "Unimplemented opcode, class=0x%X type=0x%X Opcode=0x%X Op=%p",
+                                   "Unimplemented opcode, class=0x%X "
+                                   "type=0x%X Opcode=0x%X Op=%p",
                                    op_class, op_type, op->common.aml_opcode,
                                    op));
 
@@ -728,8 +727,8 @@ cleanup:
 
                /* Break to debugger to display result */
 
-               ACPI_DEBUGGER_EXEC(acpi_db_display_result_object
-                                  (walk_state->result_obj, walk_state));
+               acpi_db_display_result_object(walk_state->result_obj,
+                                             walk_state);
 
                /*
                 * Delete the result op if and only if:
index 097188a..b325474 100644 (file)
@@ -476,13 +476,9 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
                        status =
                            acpi_ex_create_region(op->named.data,
                                                  op->named.length,
-                                                 (acpi_adr_space_type) ((op->
-                                                                         common.
-                                                                         value.
-                                                                         arg)->
-                                                                        common.
-                                                                        value.
-                                                                        integer),
+                                                 (acpi_adr_space_type)
+                                                 ((op->common.value.arg)->
+                                                  common.value.integer),
                                                  walk_state);
                        if (ACPI_FAILURE(status)) {
                                return_ACPI_STATUS(status);
index e2c08cd..8a32153 100644 (file)
@@ -598,11 +598,10 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
                                 * Executing a method: initialize the region and unlock
                                 * the interpreter
                                 */
-                               status =
-                                   acpi_ex_create_region(op->named.data,
-                                                         op->named.length,
-                                                         region_space,
-                                                         walk_state);
+                               status = acpi_ex_create_region(op->named.data,
+                                                              op->named.length,
+                                                              region_space,
+                                                              walk_state);
                                if (ACPI_FAILURE(status)) {
                                        return_ACPI_STATUS(status);
                                }
@@ -664,6 +663,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
                                                                  length,
                                                                  walk_state);
                                }
+
                                walk_state->operands[0] = NULL;
                                walk_state->num_operands = 0;
 
index 43b3ea4..2d7a044 100644 (file)
@@ -77,6 +77,7 @@ void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state)
                                  "Popped object type (%s)\n",
                                  acpi_ut_get_type_name(scope_info->common.
                                                        value)));
+
                acpi_ut_delete_generic_state(scope_info);
        }
 }
index ccf7932..112e821 100644 (file)
@@ -92,8 +92,8 @@ acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info)
                ACPI_SET_BIT(gpe_register_info->enable_for_run,
                             (u8)register_bit);
        }
-       gpe_register_info->enable_mask = gpe_register_info->enable_for_run;
 
+       gpe_register_info->enable_mask = gpe_register_info->enable_for_run;
        return_ACPI_STATUS(AE_OK);
 }
 
index e0f24c5..c00a9f2 100644 (file)
@@ -167,6 +167,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
                if (gpe_block->next) {
                        gpe_block->next->previous = gpe_block->previous;
                }
+
                acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
        }
 
index 3a958f3..fd5ab90 100644 (file)
@@ -346,6 +346,7 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
                                        ACPI_FREE(notify);
                                        notify = next;
                                }
+
                                gpe_event_info->dispatch.notify_list = NULL;
                                gpe_event_info->flags &=
                                    ~ACPI_GPE_DISPATCH_MASK;
index 74e8595..709419c 100644 (file)
@@ -159,7 +159,7 @@ acpi_ev_has_default_handler(struct acpi_namespace_node *node,
 
        obj_desc = acpi_ns_get_attached_object(node);
        if (obj_desc) {
-               handler_obj = obj_desc->device.handler;
+               handler_obj = obj_desc->common_notify.handler;
 
                /* Walk the linked list of handlers for this object */
 
@@ -247,35 +247,31 @@ acpi_ev_install_handler(acpi_handle obj_handle,
 
                /* Check if this Device already has a handler for this address space */
 
-               next_handler_obj = obj_desc->device.handler;
-               while (next_handler_obj) {
+               next_handler_obj =
+                   acpi_ev_find_region_handler(handler_obj->address_space.
+                                               space_id,
+                                               obj_desc->common_notify.
+                                               handler);
+               if (next_handler_obj) {
 
                        /* Found a handler, is it for the same address space? */
 
-                       if (next_handler_obj->address_space.space_id ==
-                           handler_obj->address_space.space_id) {
-                               ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
-                                                 "Found handler for region [%s] in device %p(%p) "
-                                                 "handler %p\n",
-                                                 acpi_ut_get_region_name
-                                                 (handler_obj->address_space.
-                                                  space_id), obj_desc,
-                                                 next_handler_obj,
-                                                 handler_obj));
-
-                               /*
-                                * Since the object we found it on was a device, then it
-                                * means that someone has already installed a handler for
-                                * the branch of the namespace from this device on. Just
-                                * bail out telling the walk routine to not traverse this
-                                * branch. This preserves the scoping rule for handlers.
-                                */
-                               return (AE_CTRL_DEPTH);
-                       }
-
-                       /* Walk the linked list of handlers attached to this device */
-
-                       next_handler_obj = next_handler_obj->address_space.next;
+                       ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
+                                         "Found handler for region [%s] in device %p(%p) handler %p\n",
+                                         acpi_ut_get_region_name(handler_obj->
+                                                                 address_space.
+                                                                 space_id),
+                                         obj_desc, next_handler_obj,
+                                         handler_obj));
+
+                       /*
+                        * Since the object we found it on was a device, then it means
+                        * that someone has already installed a handler for the branch
+                        * of the namespace from this device on. Just bail out telling
+                        * the walk routine to not traverse this branch. This preserves
+                        * the scoping rule for handlers.
+                        */
+                       return (AE_CTRL_DEPTH);
                }
 
                /*
@@ -307,6 +303,44 @@ acpi_ev_install_handler(acpi_handle obj_handle,
        return (status);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ev_find_region_handler
+ *
+ * PARAMETERS:  space_id        - The address space ID
+ *              handler_obj     - Head of the handler object list
+ *
+ * RETURN:      Matching handler object. NULL if space ID not matched
+ *
+ * DESCRIPTION: Search a handler object list for a match on the address
+ *              space ID.
+ *
+ ******************************************************************************/
+
+union acpi_operand_object *acpi_ev_find_region_handler(acpi_adr_space_type
+                                                      space_id,
+                                                      union acpi_operand_object
+                                                      *handler_obj)
+{
+
+       /* Walk the handler list for this device */
+
+       while (handler_obj) {
+
+               /* Same space_id indicates a handler is installed */
+
+               if (handler_obj->address_space.space_id == space_id) {
+                       return (handler_obj);
+               }
+
+               /* Next handler object */
+
+               handler_obj = handler_obj->address_space.next;
+       }
+
+       return (NULL);
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ev_install_space_handler
@@ -332,15 +366,15 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
 {
        union acpi_operand_object *obj_desc;
        union acpi_operand_object *handler_obj;
-       acpi_status status;
+       acpi_status status = AE_OK;
        acpi_object_type type;
        u8 flags = 0;
 
        ACPI_FUNCTION_TRACE(ev_install_space_handler);
 
        /*
-        * This registration is valid for only the types below and the root. This
-        * is where the default handlers get placed.
+        * This registration is valid for only the types below and the root.
+        * The root node is where the default handlers get installed.
         */
        if ((node->type != ACPI_TYPE_DEVICE) &&
            (node->type != ACPI_TYPE_PROCESSOR) &&
@@ -407,38 +441,30 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
        obj_desc = acpi_ns_get_attached_object(node);
        if (obj_desc) {
                /*
-                * The attached device object already exists. Make sure the handler
-                * is not already installed.
+                * The attached device object already exists. Now make sure
+                * the handler is not already installed.
                 */
-               handler_obj = obj_desc->device.handler;
-
-               /* Walk the handler list for this device */
-
-               while (handler_obj) {
-
-                       /* Same space_id indicates a handler already installed */
+               handler_obj = acpi_ev_find_region_handler(space_id,
+                                                         obj_desc->
+                                                         common_notify.
+                                                         handler);
 
-                       if (handler_obj->address_space.space_id == space_id) {
-                               if (handler_obj->address_space.handler ==
-                                   handler) {
-                                       /*
-                                        * It is (relatively) OK to attempt to install the SAME
-                                        * handler twice. This can easily happen with the
-                                        * PCI_Config space.
-                                        */
-                                       status = AE_SAME_HANDLER;
-                                       goto unlock_and_exit;
-                               } else {
-                                       /* A handler is already installed */
-
-                                       status = AE_ALREADY_EXISTS;
-                               }
+               if (handler_obj) {
+                       if (handler_obj->address_space.handler == handler) {
+                               /*
+                                * It is (relatively) OK to attempt to install the SAME
+                                * handler twice. This can easily happen with the
+                                * PCI_Config space.
+                                */
+                               status = AE_SAME_HANDLER;
                                goto unlock_and_exit;
-                       }
+                       } else {
+                               /* A handler is already installed */
 
-                       /* Walk the linked list of handlers */
+                               status = AE_ALREADY_EXISTS;
+                       }
 
-                       handler_obj = handler_obj->address_space.next;
+                       goto unlock_and_exit;
                }
        } else {
                ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
@@ -477,7 +503,8 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
-                         "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
+                         "Installing address handler for region %s(%X) "
+                         "on Device %4.4s %p(%p)\n",
                          acpi_ut_get_region_name(space_id), space_id,
                          acpi_ut_get_node_name(node), node, obj_desc));
 
@@ -506,28 +533,26 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
 
        /* Install at head of Device.address_space list */
 
-       handler_obj->address_space.next = obj_desc->device.handler;
+       handler_obj->address_space.next = obj_desc->common_notify.handler;
 
        /*
         * The Device object is the first reference on the handler_obj.
         * Each region that uses the handler adds a reference.
         */
-       obj_desc->device.handler = handler_obj;
+       obj_desc->common_notify.handler = handler_obj;
 
        /*
-        * Walk the namespace finding all of the regions this
-        * handler will manage.
+        * Walk the namespace finding all of the regions this handler will
+        * manage.
         *
-        * Start at the device and search the branch toward
-        * the leaf nodes until either the leaf is encountered or
-        * a device is detected that has an address handler of the
-        * same type.
+        * Start at the device and search the branch toward the leaf nodes
+        * until either the leaf is encountered or a device is detected that
+        * has an address handler of the same type.
         *
-        * In either case, back up and search down the remainder
-        * of the branch
+        * In either case, back up and search down the remainder of the branch
         */
-       status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
-                                       ACPI_NS_WALK_UNLOCK,
+       status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node,
+                                       ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
                                        acpi_ev_install_handler, NULL,
                                        handler_obj, NULL);
 
index f7c9dfe..8866f50 100644 (file)
@@ -68,6 +68,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context);
 
 u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node)
 {
+
        switch (node->type) {
        case ACPI_TYPE_DEVICE:
        case ACPI_TYPE_PROCESSOR:
@@ -170,8 +171,8 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
                          acpi_ut_get_notify_name(notify_value, ACPI_TYPE_ANY),
                          node));
 
-       status = acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_ev_notify_dispatch,
-                                info);
+       status = acpi_os_execute(OSL_NOTIFY_HANDLER,
+                                acpi_ev_notify_dispatch, info);
        if (ACPI_FAILURE(status)) {
                acpi_ut_delete_generic_state(info);
        }
index 5ee79a1..a43178f 100644 (file)
@@ -97,15 +97,12 @@ acpi_status acpi_ev_initialize_op_regions(void)
                if (acpi_ev_has_default_handler(acpi_gbl_root_node,
                                                acpi_gbl_default_address_spaces
                                                [i])) {
-                       status =
-                           acpi_ev_execute_reg_methods(acpi_gbl_root_node,
-                                                       acpi_gbl_default_address_spaces
-                                                       [i]);
+                       acpi_ev_execute_reg_methods(acpi_gbl_root_node,
+                                                   acpi_gbl_default_address_spaces
+                                                   [i], ACPI_REG_CONNECT);
                }
        }
 
-       acpi_gbl_reg_methods_executed = TRUE;
-
        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
        return_ACPI_STATUS(status);
 }
@@ -127,6 +124,12 @@ acpi_status acpi_ev_initialize_op_regions(void)
  * DESCRIPTION: Dispatch an address space or operation region access to
  *              a previously installed handler.
  *
+ * NOTE: During early initialization, we always install the default region
+ * handlers for Memory, I/O and PCI_Config. This ensures that these operation
+ * region address spaces are always available as per the ACPI specification.
+ * This is especially needed in order to support the execution of
+ * module-level AML code during loading of the ACPI tables.
+ *
  ******************************************************************************/
 
 acpi_status
@@ -498,6 +501,12 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
 
        ACPI_FUNCTION_TRACE(ev_attach_region);
 
+       /* Install the region's handler */
+
+       if (region_obj->region.handler) {
+               return_ACPI_STATUS(AE_ALREADY_EXISTS);
+       }
+
        ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
                          "Adding Region [%4.4s] %p to address handler %p [%s]\n",
                          acpi_ut_get_node_name(region_obj->region.node),
@@ -509,17 +518,56 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
 
        region_obj->region.next = handler_obj->address_space.region_list;
        handler_obj->address_space.region_list = region_obj;
+       region_obj->region.handler = handler_obj;
+       acpi_ut_add_reference(handler_obj);
 
-       /* Install the region's handler */
+       return_ACPI_STATUS(AE_OK);
+}
 
-       if (region_obj->region.handler) {
-               return_ACPI_STATUS(AE_ALREADY_EXISTS);
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ev_associate_reg_method
+ *
+ * PARAMETERS:  region_obj          - Region object
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Find and associate _REG method to a region
+ *
+ ******************************************************************************/
+
+void acpi_ev_associate_reg_method(union acpi_operand_object *region_obj)
+{
+       acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;
+       struct acpi_namespace_node *method_node;
+       struct acpi_namespace_node *node;
+       union acpi_operand_object *region_obj2;
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE(ev_associate_reg_method);
+
+       region_obj2 = acpi_ns_get_secondary_object(region_obj);
+       if (!region_obj2) {
+               return_VOID;
        }
 
-       region_obj->region.handler = handler_obj;
-       acpi_ut_add_reference(handler_obj);
+       node = region_obj->region.node->parent;
 
-       return_ACPI_STATUS(AE_OK);
+       /* Find any "_REG" method associated with this region definition */
+
+       status =
+           acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
+                                    &method_node);
+       if (ACPI_SUCCESS(status)) {
+               /*
+                * The _REG method is optional and there can be only one per region
+                * definition. This will be executed when the handler is attached
+                * or removed
+                */
+               region_obj2->extra.method_REG = method_node;
+       }
+
+       return_VOID;
 }
 
 /*******************************************************************************
@@ -550,7 +598,18 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
                return_ACPI_STATUS(AE_NOT_EXIST);
        }
 
-       if (region_obj2->extra.method_REG == NULL) {
+       if (region_obj2->extra.method_REG == NULL ||
+           region_obj->region.handler == NULL ||
+           !acpi_gbl_reg_methods_enabled) {
+               return_ACPI_STATUS(AE_OK);
+       }
+
+       /* _REG(DISCONNECT) should be paired with _REG(CONNECT) */
+
+       if ((function == ACPI_REG_CONNECT &&
+            region_obj->common.flags & AOPOBJ_REG_CONNECTED) ||
+           (function == ACPI_REG_DISCONNECT &&
+            !(region_obj->common.flags & AOPOBJ_REG_CONNECTED))) {
                return_ACPI_STATUS(AE_OK);
        }
 
@@ -599,6 +658,16 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
        status = acpi_ns_evaluate(info);
        acpi_ut_remove_reference(args[1]);
 
+       if (ACPI_FAILURE(status)) {
+               goto cleanup2;
+       }
+
+       if (function == ACPI_REG_CONNECT) {
+               region_obj->common.flags |= AOPOBJ_REG_CONNECTED;
+       } else {
+               region_obj->common.flags &= ~AOPOBJ_REG_CONNECTED;
+       }
+
 cleanup2:
        acpi_ut_remove_reference(args[0]);
 
@@ -613,24 +682,25 @@ cleanup1:
  *
  * PARAMETERS:  node            - Namespace node for the device
  *              space_id        - The address space ID
+ *              function        - Passed to _REG: On (1) or Off (0)
  *
- * RETURN:      Status
+ * RETURN:      None
  *
  * DESCRIPTION: Run all _REG methods for the input Space ID;
  *              Note: assumes namespace is locked, or system init time.
  *
  ******************************************************************************/
 
-acpi_status
+void
 acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
-                           acpi_adr_space_type space_id)
+                           acpi_adr_space_type space_id, u32 function)
 {
-       acpi_status status;
        struct acpi_reg_walk_info info;
 
        ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
 
        info.space_id = space_id;
+       info.function = function;
        info.reg_run_count = 0;
 
        ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
@@ -643,9 +713,9 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
         * regions and _REG methods. (i.e. handlers must be installed for all
         * regions of this Space ID before we can run any _REG methods)
         */
-       status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
-                                       ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
-                                       NULL, &info, NULL);
+       (void)acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
+                                    ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, NULL,
+                                    &info, NULL);
 
        /* Special case for EC: handle "orphan" _REG methods with no region */
 
@@ -658,7 +728,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
                              info.reg_run_count,
                              acpi_ut_get_region_name(info.space_id)));
 
-       return_ACPI_STATUS(status);
+       return_VOID;
 }
 
 /*******************************************************************************
@@ -717,7 +787,7 @@ acpi_ev_reg_run(acpi_handle obj_handle,
        }
 
        info->reg_run_count++;
-       status = acpi_ev_execute_reg_method(obj_desc, ACPI_REG_CONNECT);
+       status = acpi_ev_execute_reg_method(obj_desc, info->function);
        return (status);
 }
 
index da32339..bb2e529 100644 (file)
@@ -507,9 +507,6 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
        acpi_adr_space_type space_id;
        struct acpi_namespace_node *node;
        acpi_status status;
-       struct acpi_namespace_node *method_node;
-       acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;
-       union acpi_operand_object *region_obj2;
 
        ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked);
 
@@ -521,38 +518,15 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
                return_ACPI_STATUS(AE_OK);
        }
 
-       region_obj2 = acpi_ns_get_secondary_object(region_obj);
-       if (!region_obj2) {
-               return_ACPI_STATUS(AE_NOT_EXIST);
-       }
+       acpi_ev_associate_reg_method(region_obj);
+       region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
 
        node = region_obj->region.node->parent;
        space_id = region_obj->region.space_id;
 
-       /* Setup defaults */
-
-       region_obj->region.handler = NULL;
-       region_obj2->extra.method_REG = NULL;
-       region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE);
-       region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
-
-       /* Find any "_REG" method associated with this region definition */
-
-       status =
-           acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
-                                    &method_node);
-       if (ACPI_SUCCESS(status)) {
-               /*
-                * The _REG method is optional and there can be only one per region
-                * definition. This will be executed when the handler is attached
-                * or removed
-                */
-               region_obj2->extra.method_REG = method_node;
-       }
-
        /*
         * The following loop depends upon the root Node having no parent
-        * ie: acpi_gbl_root_node->parent_entry being set to NULL
+        * ie: acpi_gbl_root_node->Parent being set to NULL
         */
        while (node) {
 
@@ -566,18 +540,10 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
 
                        switch (node->type) {
                        case ACPI_TYPE_DEVICE:
-
-                               handler_obj = obj_desc->device.handler;
-                               break;
-
                        case ACPI_TYPE_PROCESSOR:
-
-                               handler_obj = obj_desc->processor.handler;
-                               break;
-
                        case ACPI_TYPE_THERMAL:
 
-                               handler_obj = obj_desc->thermal_zone.handler;
+                               handler_obj = obj_desc->common_notify.handler;
                                break;
 
                        case ACPI_TYPE_METHOD:
@@ -602,60 +568,49 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
                                break;
                        }
 
-                       while (handler_obj) {
-
-                               /* Is this handler of the correct type? */
+                       handler_obj =
+                           acpi_ev_find_region_handler(space_id, handler_obj);
+                       if (handler_obj) {
 
-                               if (handler_obj->address_space.space_id ==
-                                   space_id) {
+                               /* Found correct handler */
 
-                                       /* Found correct handler */
+                               ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
+                                                 "Found handler %p for region %p in obj %p\n",
+                                                 handler_obj, region_obj,
+                                                 obj_desc));
 
-                                       ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
-                                                         "Found handler %p for region %p in obj %p\n",
-                                                         handler_obj,
+                               status =
+                                   acpi_ev_attach_region(handler_obj,
                                                          region_obj,
-                                                         obj_desc));
+                                                         acpi_ns_locked);
 
+                               /*
+                                * Tell all users that this region is usable by
+                                * running the _REG method
+                                */
+                               if (acpi_ns_locked) {
                                        status =
-                                           acpi_ev_attach_region(handler_obj,
-                                                                 region_obj,
-                                                                 acpi_ns_locked);
-
-                                       /*
-                                        * Tell all users that this region is usable by
-                                        * running the _REG method
-                                        */
-                                       if (acpi_ns_locked) {
-                                               status =
-                                                   acpi_ut_release_mutex
-                                                   (ACPI_MTX_NAMESPACE);
-                                               if (ACPI_FAILURE(status)) {
-                                                       return_ACPI_STATUS
-                                                           (status);
-                                               }
+                                           acpi_ut_release_mutex
+                                           (ACPI_MTX_NAMESPACE);
+                                       if (ACPI_FAILURE(status)) {
+                                               return_ACPI_STATUS(status);
                                        }
+                               }
 
+                               status =
+                                   acpi_ev_execute_reg_method(region_obj,
+                                                              ACPI_REG_CONNECT);
+
+                               if (acpi_ns_locked) {
                                        status =
-                                           acpi_ev_execute_reg_method
-                                           (region_obj, ACPI_REG_CONNECT);
-
-                                       if (acpi_ns_locked) {
-                                               status =
-                                                   acpi_ut_acquire_mutex
-                                                   (ACPI_MTX_NAMESPACE);
-                                               if (ACPI_FAILURE(status)) {
-                                                       return_ACPI_STATUS
-                                                           (status);
-                                               }
+                                           acpi_ut_acquire_mutex
+                                           (ACPI_MTX_NAMESPACE);
+                                       if (ACPI_FAILURE(status)) {
+                                               return_ACPI_STATUS(status);
                                        }
-
-                                       return_ACPI_STATUS(AE_OK);
                                }
 
-                               /* Try next handler in the list */
-
-                               handler_obj = handler_obj->address_space.next;
+                               return_ACPI_STATUS(AE_OK);
                        }
                }
 
index 07d22bf..012b9de 100644 (file)
@@ -879,9 +879,8 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
 
        ACPI_FUNCTION_TRACE(acpi_install_gpe_handler);
 
-       status =
-           acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, FALSE,
-                                       address, context);
+       status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type,
+                                            FALSE, address, context);
 
        return_ACPI_STATUS(status);
 }
@@ -914,8 +913,8 @@ acpi_install_gpe_raw_handler(acpi_handle gpe_device,
 
        ACPI_FUNCTION_TRACE(acpi_install_gpe_raw_handler);
 
-       status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, TRUE,
-                                            address, context);
+       status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type,
+                                            TRUE, address, context);
 
        return_ACPI_STATUS(status);
 }
index f21afba..35f9e60 100644 (file)
@@ -112,41 +112,9 @@ acpi_install_address_space_handler(acpi_handle device,
                goto unlock_and_exit;
        }
 
-       /*
-        * For the default space_IDs, (the IDs for which there are default region handlers
-        * installed) Only execute the _REG methods if the global initialization _REG
-        * methods have already been run (via acpi_initialize_objects). In other words,
-        * we will defer the execution of the _REG methods for these space_IDs until
-        * execution of acpi_initialize_objects. This is done because we need the handlers
-        * for the default spaces (mem/io/pci/table) to be installed before we can run
-        * any control methods (or _REG methods). There is known BIOS code that depends
-        * on this.
-        *
-        * For all other space_IDs, we can safely execute the _REG methods immediately.
-        * This means that for IDs like embedded_controller, this function should be called
-        * only after acpi_enable_subsystem has been called.
-        */
-       switch (space_id) {
-       case ACPI_ADR_SPACE_SYSTEM_MEMORY:
-       case ACPI_ADR_SPACE_SYSTEM_IO:
-       case ACPI_ADR_SPACE_PCI_CONFIG:
-       case ACPI_ADR_SPACE_DATA_TABLE:
-
-               if (!acpi_gbl_reg_methods_executed) {
-
-                       /* We will defer execution of the _REG methods for this space */
-                       goto unlock_and_exit;
-               }
-               break;
-
-       default:
-
-               break;
-       }
-
        /* Run all _REG methods for this address space */
 
-       status = acpi_ev_execute_reg_methods(node, space_id);
+       acpi_ev_execute_reg_methods(node, space_id, ACPI_REG_CONNECT);
 
 unlock_and_exit:
        (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
@@ -215,8 +183,8 @@ acpi_remove_address_space_handler(acpi_handle device,
 
        /* Find the address handler the user requested */
 
-       handler_obj = obj_desc->device.handler;
-       last_obj_ptr = &obj_desc->device.handler;
+       handler_obj = obj_desc->common_notify.handler;
+       last_obj_ptr = &obj_desc->common_notify.handler;
        while (handler_obj) {
 
                /* We have a handler, see if user requested this one */
index b540913..adcb9c7 100644 (file)
@@ -358,8 +358,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
                }
 
                /*
-                * If the Region Address and Length have not been previously evaluated,
-                * evaluate them now and save the results.
+                * If the Region Address and Length have not been previously
+                * evaluated, evaluate them now and save the results.
                 */
                if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) {
                        status = acpi_ds_get_region_arguments(obj_desc);
@@ -454,8 +454,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
                }
 
                /*
-                * Copy the table from the buffer because the buffer could be modified
-                * or even deleted in the future
+                * Copy the table from the buffer because the buffer could be
+                * modified or even deleted in the future
                 */
                table = ACPI_ALLOCATE(length);
                if (!table) {
index 1e4c5b6..73c2e82 100644 (file)
@@ -227,8 +227,8 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
                /* Copy the integer to the buffer, LSB first */
 
                new_buf = return_desc->buffer.pointer;
-               memcpy(new_buf,
-                      &obj_desc->integer.value, acpi_gbl_integer_byte_width);
+               memcpy(new_buf, &obj_desc->integer.value,
+                      acpi_gbl_integer_byte_width);
                break;
 
        case ACPI_TYPE_STRING:
@@ -354,9 +354,8 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 data_width)
 
                        /* Get one hex digit, most significant digits first */
 
-                       string[k] =
-                           (u8) acpi_ut_hex_to_ascii_char(integer,
-                                                          ACPI_MUL_4(j));
+                       string[k] = (u8)
+                           acpi_ut_hex_to_ascii_char(integer, ACPI_MUL_4(j));
                        k++;
                }
                break;
index ccb7219..46be5a2 100644 (file)
@@ -189,9 +189,9 @@ acpi_status acpi_ex_create_event(struct acpi_walk_state *walk_state)
 
        /* Attach object to the Node */
 
-       status =
-           acpi_ns_attach_object((struct acpi_namespace_node *)walk_state->
-                                 operands[0], obj_desc, ACPI_TYPE_EVENT);
+       status = acpi_ns_attach_object((struct acpi_namespace_node *)
+                                      walk_state->operands[0], obj_desc,
+                                      ACPI_TYPE_EVENT);
 
 cleanup:
        /*
@@ -326,9 +326,10 @@ acpi_ex_create_region(u8 * aml_start,
         * Remember location in AML stream of address & length
         * operands since they need to be evaluated at run time.
         */
-       region_obj2 = obj_desc->common.next_object;
+       region_obj2 = acpi_ns_get_secondary_object(obj_desc);
        region_obj2->extra.aml_start = aml_start;
        region_obj2->extra.aml_length = aml_length;
+       region_obj2->extra.method_REG = NULL;
        if (walk_state->scope_info) {
                region_obj2->extra.scope_node =
                    walk_state->scope_info->scope.node;
@@ -342,6 +343,10 @@ acpi_ex_create_region(u8 * aml_start,
        obj_desc->region.address = 0;
        obj_desc->region.length = 0;
        obj_desc->region.node = node;
+       obj_desc->region.handler = NULL;
+       obj_desc->common.flags &=
+           ~(AOPOBJ_SETUP_COMPLETE | AOPOBJ_REG_CONNECTED |
+             AOPOBJ_OBJECT_INITIALIZED);
 
        /* Install the new region object in the parent Node */
 
@@ -492,10 +497,9 @@ acpi_ex_create_method(u8 * aml_start,
         * Disassemble the method flags. Split off the arg_count, Serialized
         * flag, and sync_level for efficiency.
         */
-       method_flags = (u8) operand[1]->integer.value;
-
-       obj_desc->method.param_count =
-           (u8) (method_flags & AML_METHOD_ARG_COUNT);
+       method_flags = (u8)operand[1]->integer.value;
+       obj_desc->method.param_count = (u8)
+           (method_flags & AML_METHOD_ARG_COUNT);
 
        /*
         * Get the sync_level. If method is serialized, a mutex will be
index de92458..b223090 100644 (file)
 
 #include <acpi/acpi.h>
 #include "accommon.h"
-#include "acnamesp.h"
 #include "acinterp.h"
-#include "acparser.h"
 
 #define _COMPONENT          ACPI_EXECUTER
 ACPI_MODULE_NAME("exdebug")
 
-static union acpi_operand_object *acpi_gbl_trace_method_object = NULL;
-
-/* Local prototypes */
-
-#ifdef ACPI_DEBUG_OUTPUT
-static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
-#endif
-
 #ifndef ACPI_NO_ERROR_MESSAGES
 /*******************************************************************************
  *
@@ -80,7 +70,6 @@ static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
  * enabled if necessary.
  *
  ******************************************************************************/
-
 void
 acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
                        u32 level, u32 index)
@@ -99,20 +88,40 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
                return_VOID;
        }
 
-       /*
-        * We will emit the current timer value (in microseconds) with each
-        * debug output. Only need the lower 26 bits. This allows for 67
-        * million microseconds or 67 seconds before rollover.
-        */
-       timer = ((u32)acpi_os_get_timer() / 10);        /* (100 nanoseconds to microseconds) */
-       timer &= 0x03FFFFFF;
+       /* Null string or newline -- don't emit the line header */
+
+       if (source_desc &&
+           (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
+           (source_desc->common.type == ACPI_TYPE_STRING)) {
+               if ((source_desc->string.length == 0) ||
+                   ((source_desc->string.length == 1) &&
+                    (*source_desc->string.pointer == '\n'))) {
+                       acpi_os_printf("\n");
+                       return_VOID;
+               }
+       }
 
        /*
         * Print line header as long as we are not in the middle of an
         * object display
         */
        if (!((level > 0) && index == 0)) {
-               acpi_os_printf("[ACPI Debug %.8u] %*s", timer, level, " ");
+               if (acpi_gbl_display_debug_timer) {
+                       /*
+                        * We will emit the current timer value (in microseconds) with each
+                        * debug output. Only need the lower 26 bits. This allows for 67
+                        * million microseconds or 67 seconds before rollover.
+                        *
+                        * Convert 100 nanosecond units to microseconds
+                        */
+                       timer = ((u32)acpi_os_get_timer() / 10);
+                       timer &= 0x03FFFFFF;
+
+                       acpi_os_printf("[ACPI Debug T=0x%8.8X] %*s", timer,
+                                      level, " ");
+               } else {
+                       acpi_os_printf("[ACPI Debug] %*s", level, " ");
+               }
        }
 
        /* Display the index for package output only */
@@ -127,8 +136,15 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
        }
 
        if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) {
-               acpi_os_printf("%s ",
-                              acpi_ut_get_object_type_name(source_desc));
+
+               /* No object type prefix needed for integers and strings */
+
+               if ((source_desc->common.type != ACPI_TYPE_INTEGER) &&
+                   (source_desc->common.type != ACPI_TYPE_STRING)) {
+                       acpi_os_printf("%s ",
+                                      acpi_ut_get_object_type_name
+                                      (source_desc));
+               }
 
                if (!acpi_ut_valid_internal_object(source_desc)) {
                        acpi_os_printf("%p, Invalid Internal Object!\n",
@@ -137,7 +153,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
                }
        } else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) ==
                   ACPI_DESC_TYPE_NAMED) {
-               acpi_os_printf("%s: %p\n",
+               acpi_os_printf("%s (Node %p)\n",
                               acpi_ut_get_type_name(((struct
                                                       acpi_namespace_node *)
                                                      source_desc)->type),
@@ -175,14 +191,12 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
 
        case ACPI_TYPE_STRING:
 
-               acpi_os_printf("[0x%.2X] \"%s\"\n",
-                              source_desc->string.length,
-                              source_desc->string.pointer);
+               acpi_os_printf("\"%s\"\n", source_desc->string.pointer);
                break;
 
        case ACPI_TYPE_PACKAGE:
 
-               acpi_os_printf("[Contains 0x%.2X Elements]\n",
+               acpi_os_printf("(Contains 0x%.2X Elements):\n",
                               source_desc->package.count);
 
                /* Output the entire contents of the package */
@@ -261,11 +275,14 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
                        if (ACPI_GET_DESCRIPTOR_TYPE
                            (source_desc->reference.object) ==
                            ACPI_DESC_TYPE_NAMED) {
-                               acpi_ex_do_debug_object(((struct
-                                                         acpi_namespace_node *)
+
+                               /* Reference object is a namespace node */
+
+                               acpi_ex_do_debug_object(ACPI_CAST_PTR
+                                                       (union
+                                                        acpi_operand_object,
                                                         source_desc->reference.
-                                                        object)->object,
-                                                       level + 4, 0);
+                                                        object), level + 4, 0);
                        } else {
                                object_desc = source_desc->reference.object;
                                value = source_desc->reference.value;
@@ -293,9 +310,14 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
                                case ACPI_TYPE_PACKAGE:
 
                                        acpi_os_printf("Package[%u] = ", value);
-                                       acpi_ex_do_debug_object(*source_desc->
-                                                               reference.where,
-                                                               level + 4, 0);
+                                       if (!(*source_desc->reference.where)) {
+                                               acpi_os_printf
+                                                   ("[Uninitialized Package Element]\n");
+                                       } else {
+                                               acpi_ex_do_debug_object
+                                                   (*source_desc->reference.
+                                                    where, level + 4, 0);
+                                       }
                                        break;
 
                                default:
@@ -311,7 +333,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
 
        default:
 
-               acpi_os_printf("%p\n", source_desc);
+               acpi_os_printf("(Descriptor %p)\n", source_desc);
                break;
        }
 
@@ -319,316 +341,3 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
        return_VOID;
 }
 #endif
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_interpreter_trace_enabled
- *
- * PARAMETERS:  name                - Whether method name should be matched,
- *                                    this should be checked before starting
- *                                    the tracer
- *
- * RETURN:      TRUE if interpreter trace is enabled.
- *
- * DESCRIPTION: Check whether interpreter trace is enabled
- *
- ******************************************************************************/
-
-static u8 acpi_ex_interpreter_trace_enabled(char *name)
-{
-
-       /* Check if tracing is enabled */
-
-       if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED)) {
-               return (FALSE);
-       }
-
-       /*
-        * Check if tracing is filtered:
-        *
-        * 1. If the tracer is started, acpi_gbl_trace_method_object should have
-        *    been filled by the trace starter
-        * 2. If the tracer is not started, acpi_gbl_trace_method_name should be
-        *    matched if it is specified
-        * 3. If the tracer is oneshot style, acpi_gbl_trace_method_name should
-        *    not be cleared by the trace stopper during the first match
-        */
-       if (acpi_gbl_trace_method_object) {
-               return (TRUE);
-       }
-       if (name &&
-           (acpi_gbl_trace_method_name &&
-            strcmp(acpi_gbl_trace_method_name, name))) {
-               return (FALSE);
-       }
-       if ((acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) &&
-           !acpi_gbl_trace_method_name) {
-               return (FALSE);
-       }
-
-       return (TRUE);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_get_trace_event_name
- *
- * PARAMETERS:  type            - Trace event type
- *
- * RETURN:      Trace event name.
- *
- * DESCRIPTION: Used to obtain the full trace event name.
- *
- ******************************************************************************/
-
-#ifdef ACPI_DEBUG_OUTPUT
-
-static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type)
-{
-       switch (type) {
-       case ACPI_TRACE_AML_METHOD:
-
-               return "Method";
-
-       case ACPI_TRACE_AML_OPCODE:
-
-               return "Opcode";
-
-       case ACPI_TRACE_AML_REGION:
-
-               return "Region";
-
-       default:
-
-               return "";
-       }
-}
-
-#endif
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_trace_point
- *
- * PARAMETERS:  type                - Trace event type
- *              begin               - TRUE if before execution
- *              aml                 - Executed AML address
- *              pathname            - Object path
- *
- * RETURN:      None
- *
- * DESCRIPTION: Internal interpreter execution trace.
- *
- ******************************************************************************/
-
-void
-acpi_ex_trace_point(acpi_trace_event_type type,
-                   u8 begin, u8 *aml, char *pathname)
-{
-
-       ACPI_FUNCTION_NAME(ex_trace_point);
-
-       if (pathname) {
-               ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
-                                 "%s %s [0x%p:%s] execution.\n",
-                                 acpi_ex_get_trace_event_name(type),
-                                 begin ? "Begin" : "End", aml, pathname));
-       } else {
-               ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
-                                 "%s %s [0x%p] execution.\n",
-                                 acpi_ex_get_trace_event_name(type),
-                                 begin ? "Begin" : "End", aml));
-       }
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_start_trace_method
- *
- * PARAMETERS:  method_node         - Node of the method
- *              obj_desc            - The method object
- *              walk_state          - current state, NULL if not yet executing
- *                                    a method.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Start control method execution trace
- *
- ******************************************************************************/
-
-void
-acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
-                          union acpi_operand_object *obj_desc,
-                          struct acpi_walk_state *walk_state)
-{
-       acpi_status status;
-       char *pathname = NULL;
-       u8 enabled = FALSE;
-
-       ACPI_FUNCTION_NAME(ex_start_trace_method);
-
-       if (method_node) {
-               pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
-       }
-
-       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
-       if (ACPI_FAILURE(status)) {
-               goto exit;
-       }
-
-       enabled = acpi_ex_interpreter_trace_enabled(pathname);
-       if (enabled && !acpi_gbl_trace_method_object) {
-               acpi_gbl_trace_method_object = obj_desc;
-               acpi_gbl_original_dbg_level = acpi_dbg_level;
-               acpi_gbl_original_dbg_layer = acpi_dbg_layer;
-               acpi_dbg_level = ACPI_TRACE_LEVEL_ALL;
-               acpi_dbg_layer = ACPI_TRACE_LAYER_ALL;
-
-               if (acpi_gbl_trace_dbg_level) {
-                       acpi_dbg_level = acpi_gbl_trace_dbg_level;
-               }
-               if (acpi_gbl_trace_dbg_layer) {
-                       acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
-               }
-       }
-       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
-
-exit:
-       if (enabled) {
-               ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, TRUE,
-                                obj_desc ? obj_desc->method.aml_start : NULL,
-                                pathname);
-       }
-       if (pathname) {
-               ACPI_FREE(pathname);
-       }
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_stop_trace_method
- *
- * PARAMETERS:  method_node         - Node of the method
- *              obj_desc            - The method object
- *              walk_state          - current state, NULL if not yet executing
- *                                    a method.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Stop control method execution trace
- *
- ******************************************************************************/
-
-void
-acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
-                         union acpi_operand_object *obj_desc,
-                         struct acpi_walk_state *walk_state)
-{
-       acpi_status status;
-       char *pathname = NULL;
-       u8 enabled;
-
-       ACPI_FUNCTION_NAME(ex_stop_trace_method);
-
-       if (method_node) {
-               pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
-       }
-
-       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
-       if (ACPI_FAILURE(status)) {
-               goto exit_path;
-       }
-
-       enabled = acpi_ex_interpreter_trace_enabled(NULL);
-
-       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
-
-       if (enabled) {
-               ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, FALSE,
-                                obj_desc ? obj_desc->method.aml_start : NULL,
-                                pathname);
-       }
-
-       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
-       if (ACPI_FAILURE(status)) {
-               goto exit_path;
-       }
-
-       /* Check whether the tracer should be stopped */
-
-       if (acpi_gbl_trace_method_object == obj_desc) {
-
-               /* Disable further tracing if type is one-shot */
-
-               if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) {
-                       acpi_gbl_trace_method_name = NULL;
-               }
-
-               acpi_dbg_level = acpi_gbl_original_dbg_level;
-               acpi_dbg_layer = acpi_gbl_original_dbg_layer;
-               acpi_gbl_trace_method_object = NULL;
-       }
-
-       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
-
-exit_path:
-       if (pathname) {
-               ACPI_FREE(pathname);
-       }
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_start_trace_opcode
- *
- * PARAMETERS:  op                  - The parser opcode object
- *              walk_state          - current state, NULL if not yet executing
- *                                    a method.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Start opcode execution trace
- *
- ******************************************************************************/
-
-void
-acpi_ex_start_trace_opcode(union acpi_parse_object *op,
-                          struct acpi_walk_state *walk_state)
-{
-
-       ACPI_FUNCTION_NAME(ex_start_trace_opcode);
-
-       if (acpi_ex_interpreter_trace_enabled(NULL) &&
-           (acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
-               ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, TRUE,
-                                op->common.aml, op->common.aml_op_name);
-       }
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ex_stop_trace_opcode
- *
- * PARAMETERS:  op                  - The parser opcode object
- *              walk_state          - current state, NULL if not yet executing
- *                                    a method.
- *
- * RETURN:      None
- *
- * DESCRIPTION: Stop opcode execution trace
- *
- ******************************************************************************/
-
-void
-acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
-                         struct acpi_walk_state *walk_state)
-{
-
-       ACPI_FUNCTION_NAME(ex_stop_trace_opcode);
-
-       if (acpi_ex_interpreter_trace_enabled(NULL) &&
-           (acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
-               ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, FALSE,
-                                op->common.aml, op->common.aml_op_name);
-       }
-}
index d836f88..ff976c4 100644 (file)
@@ -508,7 +508,8 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
                        if (next) {
                                acpi_os_printf("(%s %2.2X)",
                                               acpi_ut_get_object_type_name
-                                              (next), next->common.type);
+                                              (next),
+                                              next->address_space.space_id);
 
                                while (next->address_space.next) {
                                        if ((next->common.type ==
@@ -520,7 +521,8 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
                                        acpi_os_printf("->%p(%s %2.2X)", next,
                                                       acpi_ut_get_object_type_name
                                                       (next),
-                                                      next->common.type);
+                                                      next->address_space.
+                                                      space_id);
 
                                        if ((next == start) || (next == data)) {
                                                acpi_os_printf
index 61fd9c7..ad7080b 100644 (file)
@@ -167,10 +167,11 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
                    || obj_desc->field.region_obj->region.space_id ==
                    ACPI_ADR_SPACE_IPMI)) {
                /*
-                * This is an SMBus, GSBus or IPMI read. We must create a buffer to hold
-                * the data and then directly access the region handler.
+                * This is an SMBus, GSBus or IPMI read. We must create a buffer to
+                * hold the data and then directly access the region handler.
                 *
-                * Note: SMBus and GSBus protocol value is passed in upper 16-bits of Function
+                * Note: SMBus and GSBus protocol value is passed in upper 16-bits
+                * of Function
                 */
                if (obj_desc->field.region_obj->region.space_id ==
                    ACPI_ADR_SPACE_SMBUS) {
@@ -180,17 +181,17 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
                } else if (obj_desc->field.region_obj->region.space_id ==
                           ACPI_ADR_SPACE_GSBUS) {
                        accessor_type = obj_desc->field.attribute;
-                       length = acpi_ex_get_serial_access_length(accessor_type,
-                                                                 obj_desc->
-                                                                 field.
-                                                                 access_length);
+                       length =
+                           acpi_ex_get_serial_access_length(accessor_type,
+                                                            obj_desc->field.
+                                                            access_length);
 
                        /*
                         * Add additional 2 bytes for the generic_serial_bus data buffer:
                         *
-                        *     Status;      (Byte 0 of the data buffer)
-                        *     Length;      (Byte 1 of the data buffer)
-                        *     Data[x-1];   (Bytes 2-x of the arbitrary length data buffer)
+                        *     Status;    (Byte 0 of the data buffer)
+                        *     Length;    (Byte 1 of the data buffer)
+                        *     Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
                         */
                        length += 2;
                        function = ACPI_READ | (accessor_type << 16);
@@ -216,6 +217,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
                                                             buffer_desc->
                                                             buffer.pointer),
                                               function);
+
                acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
                goto exit;
        }
@@ -232,6 +234,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
         */
        length =
            (acpi_size) ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->field.bit_length);
+
        if (length > acpi_gbl_integer_byte_width) {
 
                /* Field is too large for an Integer, create a Buffer instead */
@@ -273,8 +276,10 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
 
                /* Perform the write */
 
-               status = acpi_ex_access_region(obj_desc, 0,
-                                              (u64 *)buffer, ACPI_READ);
+               status =
+                   acpi_ex_access_region(obj_desc, 0, (u64 *)buffer,
+                                         ACPI_READ);
+
                acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
                if (ACPI_FAILURE(status)) {
                        acpi_ut_remove_reference(buffer_desc);
@@ -366,19 +371,22 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
                    || obj_desc->field.region_obj->region.space_id ==
                    ACPI_ADR_SPACE_IPMI)) {
                /*
-                * This is an SMBus, GSBus or IPMI write. We will bypass the entire field
-                * mechanism and handoff the buffer directly to the handler. For
-                * these address spaces, the buffer is bi-directional; on a write,
-                * return data is returned in the same buffer.
+                * This is an SMBus, GSBus or IPMI write. We will bypass the entire
+                * field mechanism and handoff the buffer directly to the handler.
+                * For these address spaces, the buffer is bi-directional; on a
+                * write, return data is returned in the same buffer.
                 *
                 * Source must be a buffer of sufficient size:
-                * ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or ACPI_IPMI_BUFFER_SIZE.
+                * ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or
+                * ACPI_IPMI_BUFFER_SIZE.
                 *
-                * Note: SMBus and GSBus protocol type is passed in upper 16-bits of Function
+                * Note: SMBus and GSBus protocol type is passed in upper 16-bits
+                * of Function
                 */
                if (source_desc->common.type != ACPI_TYPE_BUFFER) {
                        ACPI_ERROR((AE_INFO,
-                                   "SMBus/IPMI/GenericSerialBus write requires Buffer, found type %s",
+                                   "SMBus/IPMI/GenericSerialBus write requires "
+                                   "Buffer, found type %s",
                                    acpi_ut_get_object_type_name(source_desc)));
 
                        return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
@@ -392,17 +400,17 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
                } else if (obj_desc->field.region_obj->region.space_id ==
                           ACPI_ADR_SPACE_GSBUS) {
                        accessor_type = obj_desc->field.attribute;
-                       length = acpi_ex_get_serial_access_length(accessor_type,
-                                                                 obj_desc->
-                                                                 field.
-                                                                 access_length);
+                       length =
+                           acpi_ex_get_serial_access_length(accessor_type,
+                                                            obj_desc->field.
+                                                            access_length);
 
                        /*
                         * Add additional 2 bytes for the generic_serial_bus data buffer:
                         *
-                        *     Status;      (Byte 0 of the data buffer)
-                        *     Length;      (Byte 1 of the data buffer)
-                        *     Data[x-1];   (Bytes 2-x of the arbitrary length data buffer)
+                        *     Status;    (Byte 0 of the data buffer)
+                        *     Length;    (Byte 1 of the data buffer)
+                        *     Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
                         */
                        length += 2;
                        function = ACPI_WRITE | (accessor_type << 16);
@@ -414,7 +422,8 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
 
                if (source_desc->buffer.length < length) {
                        ACPI_ERROR((AE_INFO,
-                                   "SMBus/IPMI/GenericSerialBus write requires Buffer of length %u, found length %u",
+                                   "SMBus/IPMI/GenericSerialBus write requires "
+                                   "Buffer of length %u, found length %u",
                                    length, source_desc->buffer.length));
 
                        return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
@@ -438,8 +447,8 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
                 * Perform the write (returns status and perhaps data in the
                 * same buffer)
                 */
-               status = acpi_ex_access_region(obj_desc, 0,
-                                              (u64 *) buffer, function);
+               status =
+                   acpi_ex_access_region(obj_desc, 0, (u64 *)buffer, function);
                acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
 
                *result_desc = buffer_desc;
@@ -460,7 +469,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
                }
 
                ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
-                                 "GPIO FieldWrite [FROM]: (%s:%X), Val %.8X  [TO]:  Pin %u Bits %u\n",
+                                 "GPIO FieldWrite [FROM]: (%s:%X), Val %.8X  [TO]: Pin %u Bits %u\n",
                                  acpi_ut_get_type_name(source_desc->common.
                                                        type),
                                  source_desc->common.type,
@@ -476,8 +485,9 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
 
                /* Perform the write */
 
-               status = acpi_ex_access_region(obj_desc, 0,
-                                              (u64 *)buffer, ACPI_WRITE);
+               status =
+                   acpi_ex_access_region(obj_desc, 0, (u64 *)buffer,
+                                         ACPI_WRITE);
                acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
                return_ACPI_STATUS(status);
        }
index 70b7bbb..0337191 100644 (file)
@@ -180,7 +180,8 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
                         * byte, and a field with Dword access specified.
                         */
                        ACPI_ERROR((AE_INFO,
-                                   "Field [%4.4s] access width (%u bytes) too large for region [%4.4s] (length %u)",
+                                   "Field [%4.4s] access width (%u bytes) "
+                                   "too large for region [%4.4s] (length %u)",
                                    acpi_ut_get_node_name(obj_desc->
                                                          common_field.node),
                                    obj_desc->common_field.access_byte_width,
@@ -194,7 +195,8 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
                 * exceeds region length, indicate an error
                 */
                ACPI_ERROR((AE_INFO,
-                           "Field [%4.4s] Base+Offset+Width %u+%u+%u is beyond end of region [%4.4s] (length %u)",
+                           "Field [%4.4s] Base+Offset+Width %u+%u+%u "
+                           "is beyond end of region [%4.4s] (length %u)",
                            acpi_ut_get_node_name(obj_desc->common_field.node),
                            obj_desc->common_field.base_byte_offset,
                            field_datum_byte_offset,
@@ -638,15 +640,15 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc,
 
                        ACPI_ERROR((AE_INFO,
                                    "Unknown UpdateRule value: 0x%X",
-                                   (obj_desc->common_field.
-                                    field_flags &
+                                   (obj_desc->common_field.field_flags &
                                     AML_FIELD_UPDATE_RULE_MASK)));
                        return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
                }
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
-                         "Mask %8.8X%8.8X, DatumOffset %X, Width %X, Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n",
+                         "Mask %8.8X%8.8X, DatumOffset %X, Width %X, "
+                         "Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n",
                          ACPI_FORMAT_UINT64(mask),
                          field_datum_byte_offset,
                          obj_desc->common_field.access_byte_width,
@@ -655,8 +657,9 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc,
 
        /* Write the merged value */
 
-       status = acpi_ex_field_datum_io(obj_desc, field_datum_byte_offset,
-                                       &merged_value, ACPI_WRITE);
+       status =
+           acpi_ex_field_datum_io(obj_desc, field_datum_byte_offset,
+                                  &merged_value, ACPI_WRITE);
 
        return_ACPI_STATUS(status);
 }
@@ -764,8 +767,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
                /* Get next input datum from the field */
 
                field_offset += obj_desc->common_field.access_byte_width;
-               status = acpi_ex_field_datum_io(obj_desc, field_offset,
-                                               &raw_datum, ACPI_READ);
+               status =
+                   acpi_ex_field_datum_io(obj_desc, field_offset, &raw_datum,
+                                          ACPI_READ);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
@@ -858,6 +862,7 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
        new_buffer = NULL;
        required_length =
            ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length);
+
        /*
         * We must have a buffer that is at least as long as the field
         * we are writing to. This is because individual fields are
@@ -932,9 +937,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
                /* Write merged datum to the target field */
 
                merged_datum &= mask;
-               status = acpi_ex_write_with_update_rule(obj_desc, mask,
-                                                       merged_datum,
-                                                       field_offset);
+               status =
+                   acpi_ex_write_with_update_rule(obj_desc, mask, merged_datum,
+                                                  field_offset);
                if (ACPI_FAILURE(status)) {
                        goto exit;
                }
@@ -990,9 +995,9 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
        /* Write the last datum to the field */
 
        merged_datum &= mask;
-       status = acpi_ex_write_with_update_rule(obj_desc,
-                                               mask, merged_datum,
-                                               field_offset);
+       status =
+           acpi_ex_write_with_update_rule(obj_desc, mask, merged_datum,
+                                          field_offset);
 
 exit:
        /* Free temporary buffer if we used one */
index d02afec..f598b39 100644 (file)
@@ -98,9 +98,9 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
 
                default:
 
-                       ACPI_ERROR((AE_INFO, "Unknown Reference Class 0x%2.2X",
+                       ACPI_ERROR((AE_INFO, "Invalid Reference Class 0x%2.2X",
                                    obj_desc->reference.class));
-                       return_ACPI_STATUS(AE_AML_INTERNAL);
+                       return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
                }
                break;
 
@@ -247,6 +247,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
        union acpi_operand_object *local_operand1 = operand1;
        union acpi_operand_object *return_desc;
        char *new_buf;
+       const char *type_string;
        acpi_status status;
 
        ACPI_FUNCTION_TRACE(ex_do_concatenate);
@@ -266,9 +267,41 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
                break;
 
        case ACPI_TYPE_STRING:
+               /*
+                * Per the ACPI spec, Concatenate only supports int/str/buf.
+                * However, we support all objects here as an extension.
+                * This improves the usefulness of the Printf() macro.
+                * 12/2015.
+                */
+               switch (operand1->common.type) {
+               case ACPI_TYPE_INTEGER:
+               case ACPI_TYPE_STRING:
+               case ACPI_TYPE_BUFFER:
+
+                       status =
+                           acpi_ex_convert_to_string(operand1, &local_operand1,
+                                                     ACPI_IMPLICIT_CONVERT_HEX);
+                       break;
+
+               default:
+                       /*
+                        * Just emit a string containing the object type.
+                        */
+                       type_string =
+                           acpi_ut_get_type_name(operand1->common.type);
+
+                       local_operand1 = acpi_ut_create_string_object(((acpi_size) strlen(type_string) + 9));   /* 9 For "[Object]" */
+                       if (!local_operand1) {
+                               status = AE_NO_MEMORY;
+                               goto cleanup;
+                       }
 
-               status = acpi_ex_convert_to_string(operand1, &local_operand1,
-                                                  ACPI_IMPLICIT_CONVERT_HEX);
+                       strcpy(local_operand1->string.pointer, "[");
+                       strcat(local_operand1->string.pointer, type_string);
+                       strcat(local_operand1->string.pointer, " Object]");
+                       status = AE_OK;
+                       break;
+               }
                break;
 
        case ACPI_TYPE_BUFFER:
@@ -347,8 +380,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
                /* Concatenate the strings */
 
                strcpy(new_buf, operand0->string.pointer);
-               strcpy(new_buf + operand0->string.length,
-                      local_operand1->string.pointer);
+               strcat(new_buf, local_operand1->string.pointer);
                break;
 
        case ACPI_TYPE_BUFFER:
@@ -591,8 +623,9 @@ acpi_ex_do_logical_op(u16 opcode,
 
        case ACPI_TYPE_STRING:
 
-               status = acpi_ex_convert_to_string(operand1, &local_operand1,
-                                                  ACPI_IMPLICIT_CONVERT_HEX);
+               status =
+                   acpi_ex_convert_to_string(operand1, &local_operand1,
+                                             ACPI_IMPLICIT_CONVERT_HEX);
                break;
 
        case ACPI_TYPE_BUFFER:
index 472030f..843c60a 100644 (file)
@@ -185,8 +185,9 @@ acpi_ex_acquire_mutex_object(u16 timeout,
        if (obj_desc == acpi_gbl_global_lock_mutex) {
                status = acpi_ev_acquire_global_lock(timeout);
        } else {
-               status = acpi_ex_system_wait_mutex(obj_desc->mutex.os_mutex,
-                                                  timeout);
+               status =
+                   acpi_ex_system_wait_mutex(obj_desc->mutex.os_mutex,
+                                             timeout);
        }
 
        if (ACPI_FAILURE(status)) {
@@ -243,20 +244,30 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
        }
 
        /*
-        * Current sync level must be less than or equal to the sync level of the
-        * mutex. This mechanism provides some deadlock prevention
+        * Current sync level must be less than or equal to the sync level
+        * of the mutex. This mechanism provides some deadlock prevention.
         */
        if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) {
                ACPI_ERROR((AE_INFO,
-                           "Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%u)",
+                           "Cannot acquire Mutex [%4.4s], "
+                           "current SyncLevel is too large (%u)",
                            acpi_ut_get_node_name(obj_desc->mutex.node),
                            walk_state->thread->current_sync_level));
                return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
        }
 
-       status = acpi_ex_acquire_mutex_object((u16) time_desc->integer.value,
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                         "Acquiring: Mutex SyncLevel %u, Thread SyncLevel %u, "
+                         "Depth %u TID %p\n",
+                         obj_desc->mutex.sync_level,
+                         walk_state->thread->current_sync_level,
+                         obj_desc->mutex.acquisition_depth,
+                         walk_state->thread));
+
+       status = acpi_ex_acquire_mutex_object((u16)time_desc->integer.value,
                                              obj_desc,
                                              walk_state->thread->thread_id);
+
        if (ACPI_SUCCESS(status) && obj_desc->mutex.acquisition_depth == 1) {
 
                /* Save Thread object, original/current sync levels */
@@ -272,6 +283,12 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
                acpi_ex_link_mutex(obj_desc, walk_state->thread);
        }
 
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                         "Acquired: Mutex SyncLevel %u, Thread SyncLevel %u, Depth %u\n",
+                         obj_desc->mutex.sync_level,
+                         walk_state->thread->current_sync_level,
+                         obj_desc->mutex.acquisition_depth));
+
        return_ACPI_STATUS(status);
 }
 
@@ -356,9 +373,9 @@ acpi_status
 acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
                      struct acpi_walk_state *walk_state)
 {
-       acpi_status status = AE_OK;
        u8 previous_sync_level;
        struct acpi_thread_state *owner_thread;
+       acpi_status status = AE_OK;
 
        ACPI_FUNCTION_TRACE(ex_release_mutex);
 
@@ -409,7 +426,8 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
         */
        if (obj_desc->mutex.sync_level != owner_thread->current_sync_level) {
                ACPI_ERROR((AE_INFO,
-                           "Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %u current %u",
+                           "Cannot release Mutex [%4.4s], SyncLevel mismatch: "
+                           "mutex %u current %u",
                            acpi_ut_get_node_name(obj_desc->mutex.node),
                            obj_desc->mutex.sync_level,
                            walk_state->thread->current_sync_level));
@@ -424,6 +442,15 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
        previous_sync_level =
            owner_thread->acquired_mutex_list->mutex.original_sync_level;
 
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                         "Releasing: Object SyncLevel %u, Thread SyncLevel %u, "
+                         "Prev SyncLevel %u, Depth %u TID %p\n",
+                         obj_desc->mutex.sync_level,
+                         walk_state->thread->current_sync_level,
+                         previous_sync_level,
+                         obj_desc->mutex.acquisition_depth,
+                         walk_state->thread));
+
        status = acpi_ex_release_mutex_object(obj_desc);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
@@ -436,6 +463,14 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
                owner_thread->current_sync_level = previous_sync_level;
        }
 
+       ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+                         "Released: Object SyncLevel %u, Thread SyncLevel, %u, "
+                         "Prev SyncLevel %u, Depth %u\n",
+                         obj_desc->mutex.sync_level,
+                         walk_state->thread->current_sync_level,
+                         previous_sync_level,
+                         obj_desc->mutex.acquisition_depth));
+
        return_ACPI_STATUS(status);
 }
 
@@ -462,21 +497,17 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
        union acpi_operand_object *next = thread->acquired_mutex_list;
        union acpi_operand_object *obj_desc;
 
-       ACPI_FUNCTION_NAME(ex_release_all_mutexes);
+       ACPI_FUNCTION_TRACE(ex_release_all_mutexes);
 
        /* Traverse the list of owned mutexes, releasing each one */
 
        while (next) {
                obj_desc = next;
-               next = obj_desc->mutex.next;
-
-               obj_desc->mutex.prev = NULL;
-               obj_desc->mutex.next = NULL;
-               obj_desc->mutex.acquisition_depth = 0;
-
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
-                                 "Force-releasing held mutex: %p\n",
-                                 obj_desc));
+                                 "Mutex [%4.4s] force-release, SyncLevel %u Depth %u\n",
+                                 obj_desc->mutex.node->name.ascii,
+                                 obj_desc->mutex.sync_level,
+                                 obj_desc->mutex.acquisition_depth));
 
                /* Release the mutex, special case for Global Lock */
 
@@ -489,14 +520,21 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
                        acpi_os_release_mutex(obj_desc->mutex.os_mutex);
                }
 
-               /* Mark mutex unowned */
-
-               obj_desc->mutex.owner_thread = NULL;
-               obj_desc->mutex.thread_id = 0;
-
                /* Update Thread sync_level (Last mutex is the important one) */
 
                thread->current_sync_level =
                    obj_desc->mutex.original_sync_level;
+
+               /* Mark mutex unowned */
+
+               next = obj_desc->mutex.next;
+
+               obj_desc->mutex.prev = NULL;
+               obj_desc->mutex.next = NULL;
+               obj_desc->mutex.acquisition_depth = 0;
+               obj_desc->mutex.owner_thread = NULL;
+               obj_desc->mutex.thread_id = 0;
        }
+
+       return_VOID;
 }
index 20e8781..b2e911a 100644 (file)
@@ -164,8 +164,8 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
        ACPI_FUNCTION_TRACE(ex_name_segment);
 
        /*
-        * If first character is a digit, then we know that we aren't looking at a
-        * valid name segment
+        * If first character is a digit, then we know that we aren't looking
+        * at a valid name segment
         */
        char_buf[0] = *aml_address;
 
index 7793068..efe7ac3 100644 (file)
@@ -484,22 +484,26 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
 
        case AML_TO_DECSTRING_OP:       /* to_decimal_string (Data, Result) */
 
-               status = acpi_ex_convert_to_string(operand[0], &return_desc,
-                                                  ACPI_EXPLICIT_CONVERT_DECIMAL);
+               status =
+                   acpi_ex_convert_to_string(operand[0], &return_desc,
+                                             ACPI_EXPLICIT_CONVERT_DECIMAL);
                if (return_desc == operand[0]) {
 
                        /* No conversion performed, add ref to handle return value */
+
                        acpi_ut_add_reference(return_desc);
                }
                break;
 
        case AML_TO_HEXSTRING_OP:       /* to_hex_string (Data, Result) */
 
-               status = acpi_ex_convert_to_string(operand[0], &return_desc,
-                                                  ACPI_EXPLICIT_CONVERT_HEX);
+               status =
+                   acpi_ex_convert_to_string(operand[0], &return_desc,
+                                             ACPI_EXPLICIT_CONVERT_HEX);
                if (return_desc == operand[0]) {
 
                        /* No conversion performed, add ref to handle return value */
+
                        acpi_ut_add_reference(return_desc);
                }
                break;
@@ -510,17 +514,20 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
                if (return_desc == operand[0]) {
 
                        /* No conversion performed, add ref to handle return value */
+
                        acpi_ut_add_reference(return_desc);
                }
                break;
 
        case AML_TO_INTEGER_OP: /* to_integer (Data, Result) */
 
-               status = acpi_ex_convert_to_integer(operand[0], &return_desc,
-                                                   ACPI_ANY_BASE);
+               status =
+                   acpi_ex_convert_to_integer(operand[0], &return_desc,
+                                              ACPI_ANY_BASE);
                if (return_desc == operand[0]) {
 
                        /* No conversion performed, add ref to handle return value */
+
                        acpi_ut_add_reference(return_desc);
                }
                break;
@@ -679,7 +686,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                status = acpi_ex_store(return_desc, operand[0], walk_state);
                break;
 
-       case AML_TYPE_OP:       /* object_type (source_object) */
+       case AML_OBJECT_TYPE_OP:        /* object_type (source_object) */
                /*
                 * Note: The operand is not resolved at this point because we want to
                 * get the associated object, not its value. For example, we don't
@@ -713,9 +720,9 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
 
                /* Get the base object */
 
-               status = acpi_ex_resolve_multiple(walk_state,
-                                                 operand[0], &type,
-                                                 &temp_desc);
+               status =
+                   acpi_ex_resolve_multiple(walk_state, operand[0], &type,
+                                            &temp_desc);
                if (ACPI_FAILURE(status)) {
                        goto cleanup;
                }
@@ -759,8 +766,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                default:
 
                        ACPI_ERROR((AE_INFO,
-                                   "Operand must be Buffer/Integer/String/Package - found type %s",
+                                   "Operand must be Buffer/Integer/String/Package"
+                                   " - found type %s",
                                    acpi_ut_get_type_name(type)));
+
                        status = AE_AML_OPERAND_TYPE;
                        goto cleanup;
                }
@@ -981,6 +990,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
                                                    "Unknown Index TargetType 0x%X in reference object %p",
                                                    operand[0]->reference.
                                                    target_type, operand[0]));
+
                                        status = AE_AML_OPERAND_TYPE;
                                        goto cleanup;
                                }
@@ -1050,6 +1060,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
 
                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
                            walk_state->opcode));
+
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index b8944eb..6dad2ca 100644 (file)
@@ -199,6 +199,7 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state)
 
                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
                            walk_state->opcode));
+
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -299,8 +300,9 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
 
        case AML_CONCAT_OP:     /* Concatenate (Data1, Data2, Result) */
 
-               status = acpi_ex_do_concatenate(operand[0], operand[1],
-                                               &return_desc, walk_state);
+               status =
+                   acpi_ex_do_concatenate(operand[0], operand[1], &return_desc,
+                                          walk_state);
                break;
 
        case AML_TO_STRING_OP:  /* to_string (Buffer, Length, Result) (ACPI 2.0) */
@@ -345,8 +347,9 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
 
                /* concatenate_res_template (Buffer, Buffer, Result) (ACPI 2.0) */
 
-               status = acpi_ex_concat_template(operand[0], operand[1],
-                                                &return_desc, walk_state);
+               status =
+                   acpi_ex_concat_template(operand[0], operand[1],
+                                           &return_desc, walk_state);
                break;
 
        case AML_INDEX_OP:      /* Index (Source Index Result) */
@@ -553,6 +556,7 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state)
 
                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
                            walk_state->opcode));
+
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index fa100b3..27fb017 100644 (file)
@@ -95,10 +95,11 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state)
        case AML_FATAL_OP:      /* Fatal (fatal_type fatal_code fatal_arg) */
 
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                 "FatalOp: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
-                                 (u32) operand[0]->integer.value,
-                                 (u32) operand[1]->integer.value,
-                                 (u32) operand[2]->integer.value));
+                                 "FatalOp: Type %X Code %X Arg %X "
+                                 "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
+                                 (u32)operand[0]->integer.value,
+                                 (u32)operand[1]->integer.value,
+                                 (u32)operand[2]->integer.value));
 
                fatal = ACPI_ALLOCATE(sizeof(struct acpi_signal_fatal_info));
                if (fatal) {
@@ -131,6 +132,7 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state)
 
                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
                            walk_state->opcode));
+
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -193,7 +195,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
                /* Truncate request if larger than the actual String/Buffer */
 
                else if ((index + length) > operand[0]->string.length) {
-                       length = (acpi_size) operand[0]->string.length -
+                       length =
+                           (acpi_size) operand[0]->string.length -
                            (acpi_size) index;
                }
 
@@ -237,8 +240,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
 
                        /* We have a buffer, copy the portion requested */
 
-                       memcpy(buffer, operand[0]->string.pointer + index,
-                              length);
+                       memcpy(buffer,
+                              operand[0]->string.pointer + index, length);
                }
 
                /* Set the length of the new String/Buffer */
@@ -255,6 +258,7 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
 
                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
                            walk_state->opcode));
+
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
@@ -270,12 +274,11 @@ cleanup:
        if (ACPI_FAILURE(status) || walk_state->result_obj) {
                acpi_ut_remove_reference(return_desc);
                walk_state->result_obj = NULL;
-       }
+       } else {
+               /* Set the return object and exit */
 
-       /* Set the return object and exit */
-
-       else {
                walk_state->result_obj = return_desc;
        }
+
        return_ACPI_STATUS(status);
 }
index c930edd..7efc9f4 100644 (file)
@@ -310,6 +310,7 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
 
                ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
                            walk_state->opcode));
+
                status = AE_AML_BAD_OPCODE;
                goto cleanup;
        }
index 4c2836d..1f111cc 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities
+ * Module Name: exprep - ACPI AML field prep utilities
  *
  *****************************************************************************/
 
@@ -103,8 +103,10 @@ acpi_ex_generate_access(u32 field_bit_offset,
        /* Round Field start offset and length to "minimal" byte boundaries */
 
        field_byte_offset = ACPI_DIV_8(ACPI_ROUND_DOWN(field_bit_offset, 8));
-       field_byte_end_offset = ACPI_DIV_8(ACPI_ROUND_UP(field_bit_length +
-                                                        field_bit_offset, 8));
+
+       field_byte_end_offset =
+           ACPI_DIV_8(ACPI_ROUND_UP(field_bit_length + field_bit_offset, 8));
+
        field_byte_length = field_byte_end_offset - field_byte_offset;
 
        ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
@@ -159,7 +161,8 @@ acpi_ex_generate_access(u32 field_bit_offset,
 
                        if (accesses <= 1) {
                                ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
-                                                 "Entire field can be accessed with one operation of size %u\n",
+                                                 "Entire field can be accessed "
+                                                 "with one operation of size %u\n",
                                                  access_byte_width));
                                return_VALUE(access_byte_width);
                        }
@@ -202,6 +205,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
         */
        ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
                          "Cannot access field in one operation, using width 8\n"));
+
        return_VALUE(8);
 }
 #endif                         /* ACPI_UNDER_DEVELOPMENT */
@@ -281,6 +285,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
                /* Invalid field access type */
 
                ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access));
+
                return_UINT32(0);
        }
 
@@ -354,8 +359,8 @@ acpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc,
         * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is
         * the same (equivalent) as the byte_alignment.
         */
-       access_bit_width = acpi_ex_decode_field_access(obj_desc, field_flags,
-                                                      &byte_alignment);
+       access_bit_width =
+           acpi_ex_decode_field_access(obj_desc, field_flags, &byte_alignment);
        if (!access_bit_width) {
                return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
        }
@@ -595,7 +600,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
                                          access_byte_width);
 
                ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
-                                 "IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",
+                                 "IndexField: BitOff %X, Off %X, Value %X, "
+                                 "Gran %X, Index %p, Data %p\n",
                                  obj_desc->index_field.start_field_bit_offset,
                                  obj_desc->index_field.base_byte_offset,
                                  obj_desc->index_field.value,
@@ -615,8 +621,9 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
         * Store the constructed descriptor (obj_desc) into the parent Node,
         * preserving the current type of that named_obj.
         */
-       status = acpi_ns_attach_object(info->field_node, obj_desc,
-                                      acpi_ns_get_type(info->field_node));
+       status =
+           acpi_ns_attach_object(info->field_node, obj_desc,
+                                 acpi_ns_get_type(info->field_node));
 
        ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
                          "Set NamedObj %p [%4.4s], ObjDesc %p\n",
index b4a5e44..1851a30 100644 (file)
@@ -392,7 +392,8 @@ acpi_ex_pci_config_space_handler(u32 function,
        pci_register = (u16) (u32) address;
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                         "Pci-Config %u (%u) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n",
+                         "Pci-Config %u (%u) Seg(%04x) Bus(%04x) "
+                         "Dev(%04x) Func(%04x) Reg(%04x)\n",
                          function, bit_width, pci_id->segment, pci_id->bus,
                          pci_id->device, pci_id->function, pci_register));
 
@@ -400,14 +401,16 @@ acpi_ex_pci_config_space_handler(u32 function,
        case ACPI_READ:
 
                *value = 0;
-               status = acpi_os_read_pci_configuration(pci_id, pci_register,
-                                                       value, bit_width);
+               status =
+                   acpi_os_read_pci_configuration(pci_id, pci_register, value,
+                                                  bit_width);
                break;
 
        case ACPI_WRITE:
 
-               status = acpi_os_write_pci_configuration(pci_id, pci_register,
-                                                        *value, bit_width);
+               status =
+                   acpi_os_write_pci_configuration(pci_id, pci_register,
+                                                   *value, bit_width);
                break;
 
        default:
index 1b372ef..6793dcc 100644 (file)
@@ -112,7 +112,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
 
        /*
         * Several object types require no further processing:
-        * 1) Device/Thermal objects don't have a "real" subobject, return the Node
+        * 1) Device/Thermal objects don't have a "real" subobject, return Node
         * 2) Method locals and arguments have a pseudo-Node
         * 3) 10/2007: Added method type to assist with Package construction.
         */
index a1afe1a..7f9260b 100644 (file)
@@ -217,7 +217,8 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
                                         * the package, can't dereference it
                                         */
                                        ACPI_ERROR((AE_INFO,
-                                                   "Attempt to dereference an Index to NULL package element Idx=%p",
+                                                   "Attempt to dereference an Index to "
+                                                   "NULL package element Idx=%p",
                                                    stack_desc));
                                        status = AE_AML_UNINITIALIZED_ELEMENT;
                                }
@@ -361,10 +362,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
 
                if (type == ACPI_TYPE_LOCAL_ALIAS) {
                        type = ((struct acpi_namespace_node *)obj_desc)->type;
-                       obj_desc =
-                           acpi_ns_get_attached_object((struct
-                                                        acpi_namespace_node *)
-                                                       obj_desc);
+                       obj_desc = acpi_ns_get_attached_object((struct
+                                                               acpi_namespace_node
+                                                               *)obj_desc);
                }
 
                if (!obj_desc) {
index 424442d..861453e 100644 (file)
@@ -90,8 +90,8 @@ acpi_ex_check_object_type(acpi_object_type type_needed,
                 * specification, a store to a constant is a noop.)
                 */
                if ((this_type == ACPI_TYPE_INTEGER) &&
-                   (((union acpi_operand_object *)object)->common.
-                    flags & AOPOBJ_AML_CONSTANT)) {
+                   (((union acpi_operand_object *)object)->common.flags &
+                    AOPOBJ_AML_CONSTANT)) {
                        return (AE_OK);
                }
        }
@@ -196,10 +196,10 @@ acpi_ex_resolve_operands(u16 opcode,
                         * thus, the attached object is always the aliased namespace node
                         */
                        if (object_type == ACPI_TYPE_LOCAL_ALIAS) {
-                               obj_desc =
-                                   acpi_ns_get_attached_object((struct
-                                                                acpi_namespace_node
-                                                                *)obj_desc);
+                               obj_desc = acpi_ns_get_attached_object((struct
+                                                                       acpi_namespace_node
+                                                                       *)
+                                                                      obj_desc);
                                *stack_ptr = obj_desc;
                                object_type =
                                    ((struct acpi_namespace_node *)obj_desc)->
@@ -285,8 +285,8 @@ acpi_ex_resolve_operands(u16 opcode,
                case ARGI_REF_OR_STRING:        /* Can be a String or Reference */
 
                        if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
-                            ACPI_DESC_TYPE_OPERAND)
-                           && (obj_desc->common.type == ACPI_TYPE_STRING)) {
+                            ACPI_DESC_TYPE_OPERAND) &&
+                           (obj_desc->common.type == ACPI_TYPE_STRING)) {
                                /*
                                 * String found - the string references a named object and
                                 * must be resolved to a node
@@ -465,8 +465,9 @@ acpi_ex_resolve_operands(u16 opcode,
                         * But we can implicitly convert from a BUFFER or INTEGER
                         * aka - "Implicit Source Operand Conversion"
                         */
-                       status = acpi_ex_convert_to_string(obj_desc, stack_ptr,
-                                                          ACPI_IMPLICIT_CONVERT_HEX);
+                       status =
+                           acpi_ex_convert_to_string(obj_desc, stack_ptr,
+                                                     ACPI_IMPLICIT_CONVERT_HEX);
                        if (ACPI_FAILURE(status)) {
                                if (status == AE_TYPE) {
                                        ACPI_ERROR((AE_INFO,
@@ -597,8 +598,10 @@ acpi_ex_resolve_operands(u16 opcode,
 
                case ARGI_REGION_OR_BUFFER:     /* Used by Load() only */
 
-                       /* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */
-
+                       /*
+                        * Need an operand of type REGION or a BUFFER
+                        * (which could be a resolved region field)
+                        */
                        switch (obj_desc->common.type) {
                        case ACPI_TYPE_BUFFER:
                        case ACPI_TYPE_REGION:
@@ -640,9 +643,9 @@ acpi_ex_resolve_operands(u16 opcode,
 
                                if (acpi_gbl_enable_interpreter_slack) {
                                        /*
-                                        * Enable original behavior of Store(), allowing any and all
-                                        * objects as the source operand. The ACPI spec does not
-                                        * allow this, however.
+                                        * Enable original behavior of Store(), allowing any
+                                        * and all objects as the source operand. The ACPI
+                                        * spec does not allow this, however.
                                         */
                                        break;
                                }
@@ -655,7 +658,8 @@ acpi_ex_resolve_operands(u16 opcode,
                                }
 
                                ACPI_ERROR((AE_INFO,
-                                           "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",
+                                           "Needed Integer/Buffer/String/Package/Ref/Ddb]"
+                                           ", found [%s] %p",
                                            acpi_ut_get_object_type_name
                                            (obj_desc), obj_desc));
 
@@ -678,9 +682,10 @@ acpi_ex_resolve_operands(u16 opcode,
                 * Make sure that the original object was resolved to the
                 * required object type (Simple cases only).
                 */
-               status = acpi_ex_check_object_type(type_needed,
-                                                  (*stack_ptr)->common.type,
-                                                  *stack_ptr);
+               status =
+                   acpi_ex_check_object_type(type_needed,
+                                             (*stack_ptr)->common.type,
+                                             *stack_ptr);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
index c076e91..d3afbcb 100644 (file)
@@ -467,7 +467,8 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
                case ACPI_TYPE_THERMAL:
 
                        ACPI_ERROR((AE_INFO,
-                                   "Target must be [Buffer/Integer/String/Reference], found [%s] (%4.4s)",
+                                   "Target must be [Buffer/Integer/String/Reference]"
+                                   ", found [%s] (%4.4s)",
                                    acpi_ut_get_type_name(node->type),
                                    node->name.ascii));
 
@@ -504,8 +505,9 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
                         * an implicit conversion, as per the ACPI specification.
                         * A direct store is performed instead.
                         */
-                       status = acpi_ex_store_direct_to_node(source_desc, node,
-                                                             walk_state);
+                       status =
+                           acpi_ex_store_direct_to_node(source_desc, node,
+                                                        walk_state);
                        break;
                }
 
@@ -528,8 +530,9 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
                         * store has been performed such that the node/object type
                         * has been changed.
                         */
-                       status = acpi_ns_attach_object(node, new_desc,
-                                                      new_desc->common.type);
+                       status =
+                           acpi_ns_attach_object(node, new_desc,
+                                                 new_desc->common.type);
 
                        ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
                                          "Store type [%s] into [%s] via Convert/Attach\n",
@@ -563,8 +566,8 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
                 * operator. (Note, for this default case, all normal
                 * Store/Target operations exited above with an error).
                 */
-               status = acpi_ex_store_direct_to_node(source_desc, node,
-                                                     walk_state);
+               status =
+                   acpi_ex_store_direct_to_node(source_desc, node, walk_state);
                break;
        }
 
index e1d4f4d..ad3bc92 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Module Name: exstorob - AML Interpreter object store support, store to object
+ * Module Name: exstorob - AML object store support, store to object
  *
  *****************************************************************************/
 
@@ -203,8 +203,9 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
                        ACPI_FREE(target_desc->string.pointer);
                }
 
-               target_desc->string.pointer = ACPI_ALLOCATE_ZEROED((acpi_size)
-                                                                  length + 1);
+               target_desc->string.pointer =
+                   ACPI_ALLOCATE_ZEROED((acpi_size) length + 1);
+
                if (!target_desc->string.pointer) {
                        return_ACPI_STATUS(AE_NO_MEMORY);
                }
index 0545065..7c91c1f 100644 (file)
@@ -78,7 +78,6 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout)
                /* We must wait, so unlock the interpreter */
 
                acpi_ex_exit_interpreter();
-
                status = acpi_os_wait_semaphore(semaphore, 1, timeout);
 
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -124,7 +123,6 @@ acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout)
                /* We must wait, so unlock the interpreter */
 
                acpi_ex_exit_interpreter();
-
                status = acpi_os_acquire_mutex(mutex, timeout);
 
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -169,8 +167,8 @@ acpi_status acpi_ex_system_do_stall(u32 how_long)
                 * (ACPI specifies 100 usec as max, but this gives some slack in
                 * order to support existing BIOSs)
                 */
-               ACPI_ERROR((AE_INFO, "Time parameter is too large (%u)",
-                           how_long));
+               ACPI_ERROR((AE_INFO,
+                           "Time parameter is too large (%u)", how_long));
                status = AE_AML_OPERAND_VALUE;
        } else {
                acpi_os_stall(how_long);
diff --git a/drivers/acpi/acpica/extrace.c b/drivers/acpi/acpica/extrace.c
new file mode 100644 (file)
index 0000000..e4a185e
--- /dev/null
@@ -0,0 +1,377 @@
+/******************************************************************************
+ *
+ * Module Name: extrace - Support for interpreter execution tracing
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2015, Intel Corp.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include <acpi/acpi.h>
+#include "accommon.h"
+#include "acnamesp.h"
+#include "acinterp.h"
+
+#define _COMPONENT          ACPI_EXECUTER
+ACPI_MODULE_NAME("extrace")
+
+static union acpi_operand_object *acpi_gbl_trace_method_object = NULL;
+
+/* Local prototypes */
+
+#ifdef ACPI_DEBUG_OUTPUT
+static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
+#endif
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_interpreter_trace_enabled
+ *
+ * PARAMETERS:  name                - Whether method name should be matched,
+ *                                    this should be checked before starting
+ *                                    the tracer
+ *
+ * RETURN:      TRUE if interpreter trace is enabled.
+ *
+ * DESCRIPTION: Check whether interpreter trace is enabled
+ *
+ ******************************************************************************/
+
+static u8 acpi_ex_interpreter_trace_enabled(char *name)
+{
+
+       /* Check if tracing is enabled */
+
+       if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED)) {
+               return (FALSE);
+       }
+
+       /*
+        * Check if tracing is filtered:
+        *
+        * 1. If the tracer is started, acpi_gbl_trace_method_object should have
+        *    been filled by the trace starter
+        * 2. If the tracer is not started, acpi_gbl_trace_method_name should be
+        *    matched if it is specified
+        * 3. If the tracer is oneshot style, acpi_gbl_trace_method_name should
+        *    not be cleared by the trace stopper during the first match
+        */
+       if (acpi_gbl_trace_method_object) {
+               return (TRUE);
+       }
+
+       if (name &&
+           (acpi_gbl_trace_method_name &&
+            strcmp(acpi_gbl_trace_method_name, name))) {
+               return (FALSE);
+       }
+
+       if ((acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) &&
+           !acpi_gbl_trace_method_name) {
+               return (FALSE);
+       }
+
+       return (TRUE);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_get_trace_event_name
+ *
+ * PARAMETERS:  type            - Trace event type
+ *
+ * RETURN:      Trace event name.
+ *
+ * DESCRIPTION: Used to obtain the full trace event name.
+ *
+ ******************************************************************************/
+
+#ifdef ACPI_DEBUG_OUTPUT
+
+static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type)
+{
+
+       switch (type) {
+       case ACPI_TRACE_AML_METHOD:
+
+               return "Method";
+
+       case ACPI_TRACE_AML_OPCODE:
+
+               return "Opcode";
+
+       case ACPI_TRACE_AML_REGION:
+
+               return "Region";
+
+       default:
+
+               return "";
+       }
+}
+
+#endif
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_trace_point
+ *
+ * PARAMETERS:  type                - Trace event type
+ *              begin               - TRUE if before execution
+ *              aml                 - Executed AML address
+ *              pathname            - Object path
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Internal interpreter execution trace.
+ *
+ ******************************************************************************/
+
+void
+acpi_ex_trace_point(acpi_trace_event_type type,
+                   u8 begin, u8 *aml, char *pathname)
+{
+
+       ACPI_FUNCTION_NAME(ex_trace_point);
+
+       if (pathname) {
+               ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
+                                 "%s %s [0x%p:%s] execution.\n",
+                                 acpi_ex_get_trace_event_name(type),
+                                 begin ? "Begin" : "End", aml, pathname));
+       } else {
+               ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
+                                 "%s %s [0x%p] execution.\n",
+                                 acpi_ex_get_trace_event_name(type),
+                                 begin ? "Begin" : "End", aml));
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_start_trace_method
+ *
+ * PARAMETERS:  method_node         - Node of the method
+ *              obj_desc            - The method object
+ *              walk_state          - current state, NULL if not yet executing
+ *                                    a method.
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Start control method execution trace
+ *
+ ******************************************************************************/
+
+void
+acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
+                          union acpi_operand_object *obj_desc,
+                          struct acpi_walk_state *walk_state)
+{
+       acpi_status status;
+       char *pathname = NULL;
+       u8 enabled = FALSE;
+
+       ACPI_FUNCTION_NAME(ex_start_trace_method);
+
+       if (method_node) {
+               pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
+       }
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               goto exit;
+       }
+
+       enabled = acpi_ex_interpreter_trace_enabled(pathname);
+       if (enabled && !acpi_gbl_trace_method_object) {
+               acpi_gbl_trace_method_object = obj_desc;
+               acpi_gbl_original_dbg_level = acpi_dbg_level;
+               acpi_gbl_original_dbg_layer = acpi_dbg_layer;
+               acpi_dbg_level = ACPI_TRACE_LEVEL_ALL;
+               acpi_dbg_layer = ACPI_TRACE_LAYER_ALL;
+
+               if (acpi_gbl_trace_dbg_level) {
+                       acpi_dbg_level = acpi_gbl_trace_dbg_level;
+               }
+
+               if (acpi_gbl_trace_dbg_layer) {
+                       acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
+               }
+       }
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+
+exit:
+       if (enabled) {
+               ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, TRUE,
+                                obj_desc ? obj_desc->method.aml_start : NULL,
+                                pathname);
+       }
+
+       if (pathname) {
+               ACPI_FREE(pathname);
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_stop_trace_method
+ *
+ * PARAMETERS:  method_node         - Node of the method
+ *              obj_desc            - The method object
+ *              walk_state          - current state, NULL if not yet executing
+ *                                    a method.
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Stop control method execution trace
+ *
+ ******************************************************************************/
+
+void
+acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
+                         union acpi_operand_object *obj_desc,
+                         struct acpi_walk_state *walk_state)
+{
+       acpi_status status;
+       char *pathname = NULL;
+       u8 enabled;
+
+       ACPI_FUNCTION_NAME(ex_stop_trace_method);
+
+       if (method_node) {
+               pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
+       }
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               goto exit_path;
+       }
+
+       enabled = acpi_ex_interpreter_trace_enabled(NULL);
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+
+       if (enabled) {
+               ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, FALSE,
+                                obj_desc ? obj_desc->method.aml_start : NULL,
+                                pathname);
+       }
+
+       status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
+       if (ACPI_FAILURE(status)) {
+               goto exit_path;
+       }
+
+       /* Check whether the tracer should be stopped */
+
+       if (acpi_gbl_trace_method_object == obj_desc) {
+
+               /* Disable further tracing if type is one-shot */
+
+               if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) {
+                       acpi_gbl_trace_method_name = NULL;
+               }
+
+               acpi_dbg_level = acpi_gbl_original_dbg_level;
+               acpi_dbg_layer = acpi_gbl_original_dbg_layer;
+               acpi_gbl_trace_method_object = NULL;
+       }
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
+
+exit_path:
+       if (pathname) {
+               ACPI_FREE(pathname);
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_start_trace_opcode
+ *
+ * PARAMETERS:  op                  - The parser opcode object
+ *              walk_state          - current state, NULL if not yet executing
+ *                                    a method.
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Start opcode execution trace
+ *
+ ******************************************************************************/
+
+void
+acpi_ex_start_trace_opcode(union acpi_parse_object *op,
+                          struct acpi_walk_state *walk_state)
+{
+
+       ACPI_FUNCTION_NAME(ex_start_trace_opcode);
+
+       if (acpi_ex_interpreter_trace_enabled(NULL) &&
+           (acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
+               ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, TRUE,
+                                op->common.aml, op->common.aml_op_name);
+       }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ex_stop_trace_opcode
+ *
+ * PARAMETERS:  op                  - The parser opcode object
+ *              walk_state          - current state, NULL if not yet executing
+ *                                    a method.
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Stop opcode execution trace
+ *
+ ******************************************************************************/
+
+void
+acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
+                         struct acpi_walk_state *walk_state)
+{
+
+       ACPI_FUNCTION_NAME(ex_stop_trace_opcode);
+
+       if (acpi_ex_interpreter_trace_enabled(NULL) &&
+           (acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
+               ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, FALSE,
+                                op->common.aml, op->common.aml_op_name);
+       }
+}
index 30c3f46..8ae7634 100644 (file)
@@ -167,8 +167,8 @@ u8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc)
        if ((acpi_gbl_integer_byte_width == 4) &&
            (obj_desc->integer.value > (u64)ACPI_UINT32_MAX)) {
                /*
-                * We are executing in a 32-bit ACPI table.
-                * Truncate the value to 32 bits by zeroing out the upper 32-bit field
+                * We are executing in a 32-bit ACPI table. Truncate
+                * the value to 32 bits by zeroing out the upper 32-bit field
                 */
                obj_desc->integer.value &= (u64)ACPI_UINT32_MAX;
                return (TRUE);
@@ -323,7 +323,8 @@ void acpi_ex_eisa_id_to_string(char *out_string, u64 compressed_id)
 
        if (compressed_id > ACPI_UINT32_MAX) {
                ACPI_WARNING((AE_INFO,
-                             "Expected EISAID is larger than 32 bits: 0x%8.8X%8.8X, truncating",
+                             "Expected EISAID is larger than 32 bits: "
+                             "0x%8.8X%8.8X, truncating",
                              ACPI_FORMAT_UINT64(compressed_id)));
        }
 
index e5599f6..d0319a2 100644 (file)
@@ -117,8 +117,8 @@ acpi_status acpi_hw_extended_sleep(u8 sleep_state)
 
        /* Clear wake status (WAK_STS) */
 
-       status =
-           acpi_write((u64)ACPI_X_WAKE_STATUS, &acpi_gbl_FADT.sleep_status);
+       status = acpi_write((u64)ACPI_X_WAKE_STATUS,
+                           &acpi_gbl_FADT.sleep_status);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
index 73cfa59..8272f96 100644 (file)
@@ -187,9 +187,8 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
         */
        register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
 
-       status = acpi_hw_write(register_bit,
-                              &gpe_register_info->status_address);
-
+       status =
+           acpi_hw_write(register_bit, &gpe_register_info->status_address);
        return (status);
 }
 
@@ -297,6 +296,7 @@ acpi_hw_gpe_enable_write(u8 enable_mask,
        acpi_status status;
 
        gpe_register_info->enable_mask = enable_mask;
+
        status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address);
        return (status);
 }
index 7d21cae..ac5b7f7 100644 (file)
@@ -80,8 +80,8 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)
 
        /* Clear wake status */
 
-       status =
-           acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS);
+       status = acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS,
+                                        ACPI_CLEAR_STATUS);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
index 5f97468..b2e50d8 100644 (file)
@@ -504,11 +504,20 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
         * Evaluate the \_Sx namespace object containing the register values
         * for this state
         */
-       info->relative_pathname =
-           ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]);
+       info->relative_pathname = ACPI_CAST_PTR(char,
+                                               acpi_gbl_sleep_state_names
+                                               [sleep_state]);
+
        status = acpi_ns_evaluate(info);
        if (ACPI_FAILURE(status)) {
-               goto cleanup;
+               if (status == AE_NOT_FOUND) {
+
+                       /* The _Sx states are optional, ignore NOT_FOUND */
+
+                       goto final_cleanup;
+               }
+
+               goto warning_cleanup;
        }
 
        /* Must have a return object */
@@ -517,7 +526,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
                ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]",
                            info->relative_pathname));
                status = AE_AML_NO_RETURN_VALUE;
-               goto cleanup;
+               goto warning_cleanup;
        }
 
        /* Return object must be of type Package */
@@ -526,7 +535,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
                ACPI_ERROR((AE_INFO,
                            "Sleep State return object is not a Package"));
                status = AE_AML_OPERAND_TYPE;
-               goto cleanup1;
+               goto return_value_cleanup;
        }
 
        /*
@@ -570,16 +579,17 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
                break;
        }
 
-cleanup1:
+return_value_cleanup:
        acpi_ut_remove_reference(info->return_object);
 
-cleanup:
+warning_cleanup:
        if (ACPI_FAILURE(status)) {
                ACPI_EXCEPTION((AE_INFO, status,
                                "While evaluating Sleep State [%s]",
                                info->relative_pathname));
        }
 
+final_cleanup:
        ACPI_FREE(info);
        return_ACPI_STATUS(status);
 }
index d62a616..1ce4efa 100644 (file)
@@ -52,9 +52,9 @@ ACPI_MODULE_NAME("hwxfsleep")
 /* Local prototypes */
 #if (!ACPI_REDUCED_HARDWARE)
 static acpi_status
-acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
-                                   acpi_physical_address physical_address,
-                                   acpi_physical_address physical_address64);
+acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
+                                  acpi_physical_address physical_address,
+                                  acpi_physical_address physical_address64);
 #endif
 
 static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id);
@@ -79,22 +79,20 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
 
 /*
  * These functions are removed for the ACPI_REDUCED_HARDWARE case:
- *      acpi_set_firmware_waking_vectors
  *      acpi_set_firmware_waking_vector
- *      acpi_set_firmware_waking_vector64
  *      acpi_enter_sleep_state_s4bios
  */
 
 #if (!ACPI_REDUCED_HARDWARE)
 /*******************************************************************************
  *
- * FUNCTION:    acpi_hw_set_firmware_waking_vectors
+ * FUNCTION:    acpi_hw_set_firmware_waking_vector
  *
  * PARAMETERS:  facs                - Pointer to FACS table
  *              physical_address    - 32-bit physical address of ACPI real mode
- *                                    entry point.
+ *                                    entry point
  *              physical_address64  - 64-bit physical address of ACPI protected
- *                                    mode entry point.
+ *                                    mode entry point
  *
  * RETURN:      Status
  *
@@ -103,11 +101,11 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
  ******************************************************************************/
 
 static acpi_status
-acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
-                                   acpi_physical_address physical_address,
-                                   acpi_physical_address physical_address64)
+acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
+                                  acpi_physical_address physical_address,
+                                  acpi_physical_address physical_address64)
 {
-       ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vectors);
+       ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vector);
 
 
        /*
@@ -140,12 +138,12 @@ acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_set_firmware_waking_vectors
+ * FUNCTION:    acpi_set_firmware_waking_vector
  *
  * PARAMETERS:  physical_address    - 32-bit physical address of ACPI real mode
- *                                    entry point.
+ *                                    entry point
  *              physical_address64  - 64-bit physical address of ACPI protected
- *                                    mode entry point.
+ *                                    mode entry point
  *
  * RETURN:      Status
  *
@@ -154,79 +152,23 @@ acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
  ******************************************************************************/
 
 acpi_status
-acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
-                                acpi_physical_address physical_address64)
+acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
+                               acpi_physical_address physical_address64)
 {
 
-       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors);
+       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
 
        if (acpi_gbl_FACS) {
-               (void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_FACS,
-                                                         physical_address,
-                                                         physical_address64);
+               (void)acpi_hw_set_firmware_waking_vector(acpi_gbl_FACS,
+                                                        physical_address,
+                                                        physical_address64);
        }
 
        return_ACPI_STATUS(AE_OK);
 }
 
-ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vectors)
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_set_firmware_waking_vector
- *
- * PARAMETERS:  physical_address    - 32-bit physical address of ACPI real mode
- *                                    entry point.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Sets the 32-bit firmware_waking_vector field of the FACS
- *
- ******************************************************************************/
-acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
-{
-       acpi_status status;
-
-       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
-
-       status = acpi_set_firmware_waking_vectors((acpi_physical_address)
-                                                 physical_address, 0);
-
-       return_ACPI_STATUS(status);
-}
-
 ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
 
-#if ACPI_MACHINE_WIDTH == 64
-/*******************************************************************************
- *
- * FUNCTION:    acpi_set_firmware_waking_vector64
- *
- * PARAMETERS:  physical_address    - 64-bit physical address of ACPI protected
- *                                    mode entry point.
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Sets the 64-bit X_firmware_waking_vector field of the FACS, if
- *              it exists in the table. This function is intended for use with
- *              64-bit host operating systems.
- *
- ******************************************************************************/
-acpi_status acpi_set_firmware_waking_vector64(u64 physical_address)
-{
-       acpi_status status;
-
-       ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
-
-       status = acpi_set_firmware_waking_vectors(0,
-                                                 (acpi_physical_address)
-                                                 physical_address);
-
-       return_ACPI_STATUS(status);
-}
-
-ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)
-#endif
 /*******************************************************************************
  *
  * FUNCTION:    acpi_enter_sleep_state_s4bios
@@ -286,6 +228,7 @@ acpi_status acpi_enter_sleep_state_s4bios(void)
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
+
        } while (!in_value);
 
        return_ACPI_STATUS(AE_OK);
index da55a1c..f21568b 100644 (file)
@@ -96,9 +96,9 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
                /* Extract each buffer byte to create the integer */
 
                for (i = 0; i < original_object->buffer.length; i++) {
-                       value |=
-                           ((u64)original_object->buffer.
-                            pointer[i] << (i * 8));
+                       value |= ((u64)
+                                 original_object->buffer.pointer[i] << (i *
+                                                                        8));
                }
                break;
 
@@ -153,10 +153,9 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object,
                                return (AE_NO_MEMORY);
                        }
                } else {
-                       status =
-                           acpi_ex_convert_to_string(original_object,
-                                                     &new_object,
-                                                     ACPI_IMPLICIT_CONVERT_HEX);
+                       status = acpi_ex_convert_to_string(original_object,
+                                                          &new_object,
+                                                          ACPI_IMPLICIT_CONVERT_HEX);
                        if (ACPI_FAILURE(status)) {
                                return (status);
                        }
@@ -244,9 +243,8 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
 
                /* String-to-Buffer conversion. Simple data copy */
 
-               new_object =
-                   acpi_ut_create_buffer_object(original_object->string.
-                                                length);
+               new_object = acpi_ut_create_buffer_object
+                   (original_object->string.length);
                if (!new_object) {
                        return (AE_NO_MEMORY);
                }
@@ -308,7 +306,8 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
  *
  * FUNCTION:    acpi_ns_convert_to_unicode
  *
- * PARAMETERS:  original_object     - ASCII String Object to be converted
+ * PARAMETERS:  scope               - Namespace node for the method/object
+ *              original_object     - ASCII String Object to be converted
  *              return_object       - Where the new converted object is returned
  *
  * RETURN:      Status. AE_OK if conversion was successful.
@@ -318,7 +317,8 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
  ******************************************************************************/
 
 acpi_status
-acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
+acpi_ns_convert_to_unicode(struct acpi_namespace_node * scope,
+                          union acpi_operand_object *original_object,
                           union acpi_operand_object **return_object)
 {
        union acpi_operand_object *new_object;
@@ -372,7 +372,8 @@ acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
  *
  * FUNCTION:    acpi_ns_convert_to_resource
  *
- * PARAMETERS:  original_object     - Object to be converted
+ * PARAMETERS:  scope               - Namespace node for the method/object
+ *              original_object     - Object to be converted
  *              return_object       - Where the new converted object is returned
  *
  * RETURN:      Status. AE_OK if conversion was successful
@@ -383,7 +384,8 @@ acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
  ******************************************************************************/
 
 acpi_status
-acpi_ns_convert_to_resource(union acpi_operand_object *original_object,
+acpi_ns_convert_to_resource(struct acpi_namespace_node * scope,
+                           union acpi_operand_object *original_object,
                            union acpi_operand_object **return_object)
 {
        union acpi_operand_object *new_object;
@@ -444,3 +446,78 @@ acpi_ns_convert_to_resource(union acpi_operand_object *original_object,
        *return_object = new_object;
        return (AE_OK);
 }
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ns_convert_to_reference
+ *
+ * PARAMETERS:  scope               - Namespace node for the method/object
+ *              original_object     - Object to be converted
+ *              return_object       - Where the new converted object is returned
+ *
+ * RETURN:      Status. AE_OK if conversion was successful
+ *
+ * DESCRIPTION: Attempt to convert a Integer object to a object_reference.
+ *              Buffer.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ns_convert_to_reference(struct acpi_namespace_node * scope,
+                            union acpi_operand_object *original_object,
+                            union acpi_operand_object **return_object)
+{
+       union acpi_operand_object *new_object = NULL;
+       acpi_status status;
+       struct acpi_namespace_node *node;
+       union acpi_generic_state scope_info;
+       char *name;
+
+       ACPI_FUNCTION_NAME(ns_convert_to_reference);
+
+       /* Convert path into internal presentation */
+
+       status =
+           acpi_ns_internalize_name(original_object->string.pointer, &name);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
+
+       /* Find the namespace node */
+
+       scope_info.scope.node =
+           ACPI_CAST_PTR(struct acpi_namespace_node, scope);
+       status =
+           acpi_ns_lookup(&scope_info, name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+                          ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+                          NULL, &node);
+       if (ACPI_FAILURE(status)) {
+
+               /* Check if we are resolving a named reference within a package */
+
+               ACPI_ERROR_NAMESPACE(original_object->string.pointer, status);
+               goto error_exit;
+       }
+
+       /* Create and init a new internal ACPI object */
+
+       new_object = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_REFERENCE);
+       if (!new_object) {
+               status = AE_NO_MEMORY;
+               goto error_exit;
+       }
+       new_object->reference.node = node;
+       new_object->reference.object = node->object;
+       new_object->reference.class = ACPI_REFCLASS_NAME;
+
+       /*
+        * Increase reference of the object if needed (the object is likely a
+        * null for device nodes).
+        */
+       acpi_ut_add_reference(node->object);
+
+error_exit:
+       ACPI_FREE(name);
+       *return_object = new_object;
+       return (AE_OK);
+}
index 37aa5c4..bc5ff35 100644 (file)
@@ -539,11 +539,13 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
                                acpi_os_printf
                                    ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n",
                                     obj_type);
+
                                bytes_to_dump = 32;
                        } else {
                                acpi_os_printf
                                    ("(Pointer to ACPI Object type %.2X [%s])\n",
                                     obj_type, acpi_ut_get_type_name(obj_type));
+
                                bytes_to_dump =
                                    sizeof(union acpi_operand_object);
                        }
@@ -573,6 +575,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
                         */
                        bytes_to_dump = obj_desc->string.length;
                        obj_desc = (void *)obj_desc->string.pointer;
+
                        acpi_os_printf("(Buffer/String pointer %p length %X)\n",
                                       obj_desc, bytes_to_dump);
                        ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump);
@@ -717,7 +720,7 @@ acpi_ns_dump_one_object_path(acpi_handle obj_handle,
                return (AE_OK);
        }
 
-       pathname = acpi_ns_get_external_pathname(node);
+       pathname = acpi_ns_get_normalized_pathname(node, TRUE);
 
        path_indent = 1;
        if (level <= max_level) {
index 7eba578..15e0b2e 100644 (file)
@@ -135,7 +135,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
 
        /* Get the full pathname to the object, for use in warning messages */
 
-       info->full_pathname = acpi_ns_get_external_pathname(info->node);
+       info->full_pathname = acpi_ns_get_normalized_pathname(info->node, TRUE);
        if (!info->full_pathname) {
                return_ACPI_STATUS(AE_NO_MEMORY);
        }
index b744a53..ac59929 100644 (file)
@@ -582,7 +582,8 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
 
                /* Ignore error and move on to next device */
 
-               char *scope_name = acpi_ns_get_external_pathname(info->node);
+               char *scope_name =
+                   acpi_ns_get_normalized_pathname(device_node, TRUE);
 
                ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution",
                                scope_name));
index 14ab836..14c953e 100644 (file)
@@ -149,6 +149,23 @@ unlock:
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                          "**** Completed Table Object Initialization\n"));
 
+       /*
+        * Execute any module-level code that was detected during the table load
+        * phase. Although illegal since ACPI 2.0, there are many machines that
+        * contain this type of code. Each block of detected executable AML code
+        * outside of any control method is wrapped with a temporary control
+        * method object and placed on a global list. The methods on this list
+        * are executed below.
+        *
+        * This case executes the module-level code for each table immediately
+        * after the table has been loaded. This provides compatibility with
+        * other ACPI implementations. Optionally, the execution can be deferred
+        * until later, see acpi_initialize_objects.
+        */
+       if (!acpi_gbl_group_module_level_code) {
+               acpi_ns_exec_module_code_list();
+       }
+
        return_ACPI_STATUS(status);
 }
 
@@ -321,7 +338,6 @@ acpi_status acpi_ns_unload_namespace(acpi_handle handle)
        /* This function does the real work */
 
        status = acpi_ns_delete_subtree(handle);
-
        return_ACPI_STATUS(status);
 }
 #endif
index 8934b4e..521031f 100644 (file)
@@ -70,7 +70,6 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
        ACPI_FUNCTION_TRACE_PTR(ns_get_external_pathname, node);
 
        name_buffer = acpi_ns_get_normalized_pathname(node, FALSE);
-
        return_PTR(name_buffer);
 }
 
@@ -93,7 +92,6 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
        ACPI_FUNCTION_ENTRY();
 
        size = acpi_ns_build_normalized_path(node, NULL, 0, FALSE);
-
        return (size);
 }
 
@@ -217,6 +215,7 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
                        ACPI_PATH_PUT8(full_path, path_size,
                                       AML_DUAL_NAME_PREFIX, length);
                }
+
                ACPI_MOVE_32_TO_32(name, &next_node->name);
                do_no_trailing = no_trailing;
                for (i = 0; i < 4; i++) {
@@ -228,8 +227,10 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
                                ACPI_PATH_PUT8(full_path, path_size, c, length);
                        }
                }
+
                next_node = next_node->parent;
        }
+
        ACPI_PATH_PUT8(full_path, path_size, AML_ROOT_PREFIX, length);
 
        /* Reverse the path string */
@@ -237,6 +238,7 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
        if (length <= path_size) {
                left = full_path;
                right = full_path + length - 1;
+
                while (left < right) {
                        c = *left;
                        *left++ = *right;
index 3736d43..43b45a8 100644 (file)
@@ -141,8 +141,8 @@ acpi_ns_one_complete_parse(u32 pass_number,
 
        /* Parse the AML */
 
-       ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "*PARSE* pass %u parse\n",
-                         pass_number));
+       ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
+                         "*PARSE* pass %u parse\n", pass_number));
        status = acpi_ps_parse_aml(walk_state);
 
 cleanup:
@@ -181,6 +181,7 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node)
         * performs another complete parse of the AML.
         */
        ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 1\n"));
+
        status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1,
                                            table_index, start_node);
        if (ACPI_FAILURE(status)) {
index 9bb2519..c05a83b 100644 (file)
@@ -233,8 +233,9 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
 
                /* First element is the (Integer) revision */
 
-               status = acpi_ns_check_object_type(info, elements,
-                                                  ACPI_RTYPE_INTEGER, 0);
+               status =
+                   acpi_ns_check_object_type(info, elements,
+                                             ACPI_RTYPE_INTEGER, 0);
                if (ACPI_FAILURE(status)) {
                        return (status);
                }
@@ -252,8 +253,9 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
 
                /* First element is the (Integer) count of subpackages to follow */
 
-               status = acpi_ns_check_object_type(info, elements,
-                                                  ACPI_RTYPE_INTEGER, 0);
+               status =
+                   acpi_ns_check_object_type(info, elements,
+                                             ACPI_RTYPE_INTEGER, 0);
                if (ACPI_FAILURE(status)) {
                        return (status);
                }
index 77d8103..6418863 100644 (file)
@@ -116,6 +116,11 @@ static const struct acpi_simple_repair_info acpi_object_repair_info[] = {
         ACPI_NOT_PACKAGE_ELEMENT,
         acpi_ns_convert_to_resource},
 
+       /* Object reference conversions */
+
+       {"_DEP", ACPI_RTYPE_STRING, ACPI_ALL_PACKAGE_ELEMENTS,
+        acpi_ns_convert_to_reference},
+
        /* Unicode conversions */
 
        {"_MLS", ACPI_RTYPE_STRING, 1,
@@ -172,8 +177,8 @@ acpi_ns_simple_repair(struct acpi_evaluate_info *info,
                                              "Missing expected return value"));
                }
 
-               status =
-                   predefined->object_converter(return_object, &new_object);
+               status = predefined->object_converter(info->node, return_object,
+                                                     &new_object);
                if (ACPI_FAILURE(status)) {
 
                        /* A fatal error occurred during a conversion */
@@ -360,12 +365,15 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
                        /* Check if we can actually repair this name/type combination */
 
                        if ((return_btype & this_name->unexpected_btypes) &&
-                           (package_index == this_name->package_index)) {
+                           (this_name->package_index ==
+                            ACPI_ALL_PACKAGE_ELEMENTS
+                            || package_index == this_name->package_index)) {
                                return (this_name);
                        }
 
                        return (NULL);
                }
+
                this_name++;
        }
 
@@ -521,6 +529,7 @@ acpi_ns_remove_null_elements(struct acpi_evaluate_info *info,
                        *dest = *source;
                        dest++;
                }
+
                source++;
        }
 
@@ -572,8 +581,8 @@ acpi_ns_wrap_with_package(struct acpi_evaluate_info *info,
        ACPI_FUNCTION_NAME(ns_wrap_with_package);
 
        /*
-        * Create the new outer package and populate it. The new package will
-        * have a single element, the lone sub-object.
+        * Create the new outer package and populate it. The new
+        * package will have a single element, the lone sub-object.
         */
        pkg_obj_desc = acpi_ut_create_package_object(1);
        if (!pkg_obj_desc) {
index 0515a70..f6dd2a8 100644 (file)
@@ -225,6 +225,7 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
                if (ACPI_COMPARE_NAME(node->name.ascii, this_name->name)) {
                        return (this_name);
                }
+
                this_name++;
        }
 
@@ -301,7 +302,8 @@ acpi_ns_repair_FDE(struct acpi_evaluate_info *info,
                /* We can only repair if we have exactly 5 BYTEs */
 
                if (return_object->buffer.length != ACPI_FDE_BYTE_BUFFER_SIZE) {
-                       ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
+                       ACPI_WARN_PREDEFINED((AE_INFO,
+                                             info->full_pathname,
                                              info->node_flags,
                                              "Incorrect return buffer length %u, expected %u",
                                              return_object->buffer.length,
@@ -321,8 +323,8 @@ acpi_ns_repair_FDE(struct acpi_evaluate_info *info,
                /* Expand each byte to a DWORD */
 
                byte_buffer = return_object->buffer.pointer;
-               dword_buffer =
-                   ACPI_CAST_PTR(u32, buffer_object->buffer.pointer);
+               dword_buffer = ACPI_CAST_PTR(u32,
+                                            buffer_object->buffer.pointer);
 
                for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) {
                        *dword_buffer = (u32) *byte_buffer;
@@ -461,7 +463,8 @@ acpi_ns_repair_CST(struct acpi_evaluate_info *info,
                removing = FALSE;
 
                if ((*outer_elements)->package.count == 0) {
-                       ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
+                       ACPI_WARN_PREDEFINED((AE_INFO,
+                                             info->full_pathname,
                                              info->node_flags,
                                              "SubPackage[%u] - removing entry due to zero count",
                                              i));
@@ -471,7 +474,8 @@ acpi_ns_repair_CST(struct acpi_evaluate_info *info,
 
                obj_desc = (*outer_elements)->package.elements[1];      /* Index1 = Type */
                if ((u32)obj_desc->integer.value == 0) {
-                       ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
+                       ACPI_WARN_PREDEFINED((AE_INFO,
+                                             info->full_pathname,
                                              info->node_flags,
                                              "SubPackage[%u] - removing entry due to invalid Type(0)",
                                              i));
@@ -538,8 +542,8 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
        }
 
        if (return_object->string.length == 0) {
-               ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
-                                     info->node_flags,
+               ACPI_WARN_PREDEFINED((AE_INFO,
+                                     info->full_pathname, info->node_flags,
                                      "Invalid zero-length _HID or _CID string"));
 
                /* Return AE_OK anyway, let driver handle it */
@@ -710,8 +714,9 @@ acpi_ns_repair_PSS(struct acpi_evaluate_info *info,
                elements = (*outer_elements)->package.elements;
                obj_desc = elements[1]; /* Index1 = power_dissipation */
 
-               if ((u32) obj_desc->integer.value > previous_value) {
-                       ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
+               if ((u32)obj_desc->integer.value > previous_value) {
+                       ACPI_WARN_PREDEFINED((AE_INFO,
+                                             info->full_pathname,
                                              info->node_flags,
                                              "SubPackage[%u,%u] - suspicious power dissipation values",
                                              i - 1, i));
@@ -969,6 +974,7 @@ acpi_ns_remove_element(union acpi_operand_object *obj_desc, u32 index)
                        *dest = *source;
                        dest++;
                }
+
                source++;
        }
 
index d739040..9cc3564 100644 (file)
@@ -105,7 +105,7 @@ acpi_ns_search_one_scope(u32 target_name,
        if (ACPI_LV_NAMES & acpi_dbg_level) {
                char *scope_name;
 
-               scope_name = acpi_ns_get_external_pathname(parent_node);
+               scope_name = acpi_ns_get_normalized_pathname(parent_node, TRUE);
                if (scope_name) {
                        ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
                                          "Searching %s (%p) For [%4.4s] (%s)\n",
index de325ae..32f1d95 100644 (file)
@@ -173,9 +173,10 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
        info->fully_qualified = FALSE;
 
        /*
-        * For the internal name, the required length is 4 bytes per segment, plus
-        * 1 each for root_prefix, multi_name_prefix_op, segment count, trailing null
-        * (which is not really needed, but no there's harm in putting it there)
+        * For the internal name, the required length is 4 bytes per segment,
+        * plus 1 each for root_prefix, multi_name_prefix_op, segment count,
+        * trailing null (which is not really needed, but no there's harm in
+        * putting it there)
         *
         * strlen() + 1 covers the first name_seg, which has no path separator
         */
@@ -699,6 +700,7 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
                if (!prefix_node) {
                        *return_node = acpi_gbl_root_node;
                }
+
                return_ACPI_STATUS(AE_OK);
        }
 
index 6ee1e52..429f0d2 100644 (file)
@@ -750,8 +750,8 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
 
        /* We have a valid device, invoke the user function */
 
-       status = info->user_function(obj_handle, nesting_level, info->context,
-                                    return_value);
+       status = info->user_function(obj_handle, nesting_level,
+                                    info->context, return_value);
        return (status);
 }
 
index 4b4d2f4..669e0f1 100644 (file)
@@ -159,7 +159,7 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer)
 {
        acpi_status status;
        struct acpi_namespace_node *node;
-       char *node_name;
+       const char *node_name;
 
        /* Parameter validation */
 
@@ -238,7 +238,6 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
                                    struct acpi_pnp_device_id *source,
                                    char *string_area)
 {
-
        /* Create the destination PNP_DEVICE_ID */
 
        dest->string = string_area;
@@ -263,11 +262,18 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
  *              namespace node and possibly by running several standard
  *              control methods (Such as in the case of a device.)
  *
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _SUB,
- * _CLS, _STA, _ADR, _sx_w, and _sx_d methods.
+ * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
+ * _CLS, _ADR, _sx_w, and _sx_d methods.
  *
  * Note: Allocates the return buffer, must be freed by the caller.
  *
+ * Note: This interface is intended to be used during the initial device
+ * discovery namespace traversal. Therefore, no complex methods can be
+ * executed, especially those that access operation regions. Therefore, do
+ * not add any additional methods that could cause problems in this area.
+ * this was the fate of the _SUB method which was found to cause such
+ * problems and was removed (11/2015).
+ *
  ******************************************************************************/
 
 acpi_status
@@ -279,7 +285,6 @@ acpi_get_object_info(acpi_handle handle,
        struct acpi_pnp_device_id_list *cid_list = NULL;
        struct acpi_pnp_device_id *hid = NULL;
        struct acpi_pnp_device_id *uid = NULL;
-       struct acpi_pnp_device_id *sub = NULL;
        struct acpi_pnp_device_id *cls = NULL;
        char *next_id_string;
        acpi_object_type type;
@@ -325,7 +330,7 @@ acpi_get_object_info(acpi_handle handle,
        if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
                /*
                 * Get extra info for ACPI Device/Processor objects only:
-                * Run the Device _HID, _UID, _SUB, _CID, and _CLS methods.
+                * Run the Device _HID, _UID, _CLS, and _CID methods.
                 *
                 * Note: none of these methods are required, so they may or may
                 * not be present for this device. The Info->Valid bitfield is used
@@ -348,14 +353,6 @@ acpi_get_object_info(acpi_handle handle,
                        valid |= ACPI_VALID_UID;
                }
 
-               /* Execute the Device._SUB method */
-
-               status = acpi_ut_execute_SUB(node, &sub);
-               if (ACPI_SUCCESS(status)) {
-                       info_size += sub->length;
-                       valid |= ACPI_VALID_SUB;
-               }
-
                /* Execute the Device._CID method */
 
                status = acpi_ut_execute_CID(node, &cid_list);
@@ -456,9 +453,8 @@ acpi_get_object_info(acpi_handle handle,
        }
 
        /*
-        * Copy the HID, UID, SUB, and CIDs to the return buffer.
-        * The variable-length strings are copied to the reserved area
-        * at the end of the buffer.
+        * Copy the HID, UID, and CIDs to the return buffer. The variable-length
+        * strings are copied to the reserved area at the end of the buffer.
         *
         * For HID and CID, check if the ID is a PCI Root Bridge.
         */
@@ -476,11 +472,6 @@ acpi_get_object_info(acpi_handle handle,
                                                        uid, next_id_string);
        }
 
-       if (sub) {
-               next_id_string = acpi_ns_copy_device_id(&info->subsystem_id,
-                                                       sub, next_id_string);
-       }
-
        if (cid_list) {
                info->compatible_id_list.count = cid_list->count;
                info->compatible_id_list.list_size = cid_list->list_size;
@@ -522,9 +513,6 @@ cleanup:
        if (uid) {
                ACPI_FREE(uid);
        }
-       if (sub) {
-               ACPI_FREE(sub);
-       }
        if (cid_list) {
                ACPI_FREE(cid_list);
        }
@@ -591,6 +579,7 @@ acpi_status acpi_install_method(u8 *buffer)
        parser_state.aml += acpi_ps_get_opcode_size(opcode);
        parser_state.pkg_end = acpi_ps_get_next_package_end(&parser_state);
        path = acpi_ps_get_next_namestring(&parser_state);
+
        method_flags = *parser_state.aml++;
        aml_start = parser_state.aml;
        aml_length = ACPI_PTR_DIFF(parser_state.pkg_end, aml_start);
index 7933835..6e1389b 100644 (file)
@@ -74,10 +74,8 @@ acpi_status acpi_get_type(acpi_handle handle, acpi_object_type * ret_type)
                return (AE_BAD_PARAMETER);
        }
 
-       /*
-        * Special case for the predefined Root Node
-        * (return type ANY)
-        */
+       /* Special case for the predefined Root Node (return type ANY) */
+
        if (handle == ACPI_ROOT_OBJECT) {
                *ret_type = ACPI_TYPE_ANY;
                return (AE_OK);
index 29d8b7b..f3bcfa2 100644 (file)
@@ -269,7 +269,8 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
         */
        if (ACPI_SUCCESS(status) &&
            possible_method_call && (node->type == ACPI_TYPE_METHOD)) {
-               if (walk_state->opcode == AML_UNLOAD_OP) {
+               if (GET_CURRENT_ARG_TYPE(walk_state->arg_types) ==
+                   ARGP_SUPERNAME) {
                        /*
                         * acpi_ps_get_next_namestring has increased the AML pointer,
                         * so we need to restore the saved AML pointer for method call.
@@ -696,7 +697,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
  *
  * PARAMETERS:  walk_state          - Current state
  *              parser_state        - Current parser state object
- *              arg_type            - The argument type (AML_*_ARG)
+ *              arg_type            - The parser argument type (ARGP_*)
  *              return_arg          - Where the next arg is returned
  *
  * RETURN:      Status, and an op object containing the next argument.
@@ -733,6 +734,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
                if (!arg) {
                        return_ACPI_STATUS(AE_NO_MEMORY);
                }
+
                acpi_ps_get_next_simple_arg(parser_state, arg_type, arg);
                break;
 
@@ -798,6 +800,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
        case ARGP_TARGET:
        case ARGP_SUPERNAME:
        case ARGP_SIMPLENAME:
+       case ARGP_NAME_OR_REF:
 
                subop = acpi_ps_peek_opcode(parser_state);
                if (subop == 0 ||
@@ -814,17 +817,17 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
                                return_ACPI_STATUS(AE_NO_MEMORY);
                        }
 
-                       /* To support super_name arg of Unload */
+                       /* super_name allows argument to be a method call */
 
-                       if (walk_state->opcode == AML_UNLOAD_OP) {
+                       if (arg_type == ARGP_SUPERNAME) {
                                status =
                                    acpi_ps_get_next_namepath(walk_state,
                                                              parser_state, arg,
-                                                             1);
+                                                             ACPI_POSSIBLE_METHOD_CALL);
 
                                /*
-                                * If the super_name arg of Unload is a method call,
-                                * we have restored the AML pointer, just free this Arg
+                                * If the super_name argument is a method call, we have
+                                * already restored the AML pointer, just free this Arg
                                 */
                                if (arg->common.aml_opcode ==
                                    AML_INT_METHODCALL_OP) {
@@ -835,7 +838,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
                                status =
                                    acpi_ps_get_next_namepath(walk_state,
                                                              parser_state, arg,
-                                                             0);
+                                                             ACPI_NOT_METHOD_CALL);
                        }
                } else {
                        /* Single complex argument, nothing returned */
index 03ac8c9..a57f473 100644 (file)
@@ -109,10 +109,10 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
 
        case AML_INT_NAMEPATH_OP:       /* AML_NAMESTRING_ARG */
 
-               status =
-                   acpi_ps_get_next_namepath(walk_state,
-                                             &(walk_state->parser_state), op,
-                                             1);
+               status = acpi_ps_get_next_namepath(walk_state,
+                                                  &(walk_state->parser_state),
+                                                  op,
+                                                  ACPI_POSSIBLE_METHOD_CALL);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
@@ -124,8 +124,8 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
                /*
                 * Op is not a constant or string, append each argument to the Op
                 */
-               while (GET_CURRENT_ARG_TYPE(walk_state->arg_types)
-                      && !walk_state->arg_count) {
+               while (GET_CURRENT_ARG_TYPE(walk_state->arg_types) &&
+                      !walk_state->arg_count) {
                        walk_state->aml = walk_state->parser_state.aml;
 
                        status =
index ed90fdd..40909dd 100644 (file)
@@ -185,458 +185,458 @@ const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES] = {
 /* Index           Name                 Parser Args               Interpreter Args                ObjectType                    Class                      Type                  Flags */
 
 /* 00 */ ACPI_OP("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, ACPI_TYPE_INTEGER,
-                AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT),
+                        AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT),
 /* 01 */ ACPI_OP("One", ARGP_ONE_OP, ARGI_ONE_OP, ACPI_TYPE_INTEGER,
-                AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT),
+                        AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT),
 /* 02 */ ACPI_OP("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP,
-                ACPI_TYPE_LOCAL_ALIAS, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_SIMPLE,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        ACPI_TYPE_LOCAL_ALIAS, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_SIMPLE,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 03 */ ACPI_OP("Name", ARGP_NAME_OP, ARGI_NAME_OP, ACPI_TYPE_ANY,
-                AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 04 */ ACPI_OP("ByteConst", ARGP_BYTE_OP, ARGI_BYTE_OP,
-                ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, AML_CONSTANT),
+                        ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, AML_CONSTANT),
 /* 05 */ ACPI_OP("WordConst", ARGP_WORD_OP, ARGI_WORD_OP,
-                ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, AML_CONSTANT),
+                        ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, AML_CONSTANT),
 /* 06 */ ACPI_OP("DwordConst", ARGP_DWORD_OP, ARGI_DWORD_OP,
-                ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, AML_CONSTANT),
+                        ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, AML_CONSTANT),
 /* 07 */ ACPI_OP("String", ARGP_STRING_OP, ARGI_STRING_OP,
-                ACPI_TYPE_STRING, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, AML_CONSTANT),
+                        ACPI_TYPE_STRING, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, AML_CONSTANT),
 /* 08 */ ACPI_OP("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP,
-                ACPI_TYPE_LOCAL_SCOPE, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_NO_OBJ,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        ACPI_TYPE_LOCAL_SCOPE, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_NO_OBJ,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 09 */ ACPI_OP("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP,
-                ACPI_TYPE_BUFFER, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_OBJECT,
-                AML_HAS_ARGS | AML_DEFER | AML_CONSTANT),
+                        ACPI_TYPE_BUFFER, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_OBJECT,
+                        AML_HAS_ARGS | AML_DEFER | AML_CONSTANT),
 /* 0A */ ACPI_OP("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP,
-                ACPI_TYPE_PACKAGE, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_OBJECT,
-                AML_HAS_ARGS | AML_DEFER | AML_CONSTANT),
+                        ACPI_TYPE_PACKAGE, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_OBJECT,
+                        AML_HAS_ARGS | AML_DEFER | AML_CONSTANT),
 /* 0B */ ACPI_OP("Method", ARGP_METHOD_OP, ARGI_METHOD_OP,
-                ACPI_TYPE_METHOD, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_COMPLEX,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED | AML_DEFER),
+                        ACPI_TYPE_METHOD, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_COMPLEX,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED | AML_DEFER),
 /* 0C */ ACPI_OP("Local0", ARGP_LOCAL0, ARGI_LOCAL0,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 0D */ ACPI_OP("Local1", ARGP_LOCAL1, ARGI_LOCAL1,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 0E */ ACPI_OP("Local2", ARGP_LOCAL2, ARGI_LOCAL2,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 0F */ ACPI_OP("Local3", ARGP_LOCAL3, ARGI_LOCAL3,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 10 */ ACPI_OP("Local4", ARGP_LOCAL4, ARGI_LOCAL4,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 11 */ ACPI_OP("Local5", ARGP_LOCAL5, ARGI_LOCAL5,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 12 */ ACPI_OP("Local6", ARGP_LOCAL6, ARGI_LOCAL6,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 13 */ ACPI_OP("Local7", ARGP_LOCAL7, ARGI_LOCAL7,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LOCAL_VARIABLE, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LOCAL_VARIABLE, 0),
 /* 14 */ ACPI_OP("Arg0", ARGP_ARG0, ARGI_ARG0,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 15 */ ACPI_OP("Arg1", ARGP_ARG1, ARGI_ARG1,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 16 */ ACPI_OP("Arg2", ARGP_ARG2, ARGI_ARG2,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 17 */ ACPI_OP("Arg3", ARGP_ARG3, ARGI_ARG3,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 18 */ ACPI_OP("Arg4", ARGP_ARG4, ARGI_ARG4,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 19 */ ACPI_OP("Arg5", ARGP_ARG5, ARGI_ARG5,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 1A */ ACPI_OP("Arg6", ARGP_ARG6, ARGI_ARG6,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_METHOD_ARGUMENT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_METHOD_ARGUMENT, 0),
 /* 1B */ ACPI_OP("Store", ARGP_STORE_OP, ARGI_STORE_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R),
 /* 1C */ ACPI_OP("RefOf", ARGP_REF_OF_OP, ARGI_REF_OF_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R,
-                AML_FLAGS_EXEC_1A_0T_1R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R,
+                        AML_FLAGS_EXEC_1A_0T_1R),
 /* 1D */ ACPI_OP("Add", ARGP_ADD_OP, ARGI_ADD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 1E */ ACPI_OP("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
 /* 1F */ ACPI_OP("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 20 */ ACPI_OP("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_1R,
-                AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_1R,
+                        AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
 /* 21 */ ACPI_OP("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_1R,
-                AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_1R,
+                        AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
 /* 22 */ ACPI_OP("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 23 */ ACPI_OP("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_2T_1R,
-                AML_FLAGS_EXEC_2A_2T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_2T_1R,
+                        AML_FLAGS_EXEC_2A_2T_1R | AML_CONSTANT),
 /* 24 */ ACPI_OP("ShiftLeft", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 25 */ ACPI_OP("ShiftRight", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 26 */ ACPI_OP("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 27 */ ACPI_OP("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 28 */ ACPI_OP("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 29 */ ACPI_OP("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 2A */ ACPI_OP("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_MATH | AML_CONSTANT),
 /* 2B */ ACPI_OP("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 2C */ ACPI_OP("FindSetLeftBit", ARGP_FIND_SET_LEFT_BIT_OP,
-                ARGI_FIND_SET_LEFT_BIT_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ARGI_FIND_SET_LEFT_BIT_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 2D */ ACPI_OP("FindSetRightBit", ARGP_FIND_SET_RIGHT_BIT_OP,
-                ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 2E */ ACPI_OP("DerefOf", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R),
 /* 2F */ ACPI_OP("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R),
 /* 30 */ ACPI_OP("SizeOf", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_1R,
-                AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_1R,
+                        AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
 /* 31 */ ACPI_OP("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R),
 /* 32 */ ACPI_OP("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R,
-                AML_FLAGS_EXEC_6A_0T_1R | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R,
+                        AML_FLAGS_EXEC_6A_0T_1R | AML_CONSTANT),
 /* 33 */ ACPI_OP("CreateDWordField", ARGP_CREATE_DWORD_FIELD_OP,
-                ARGI_CREATE_DWORD_FIELD_OP,
-                ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_FIELD,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
-                AML_DEFER | AML_CREATE),
+                        ARGI_CREATE_DWORD_FIELD_OP,
+                        ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
+                        AML_DEFER | AML_CREATE),
 /* 34 */ ACPI_OP("CreateWordField", ARGP_CREATE_WORD_FIELD_OP,
-                ARGI_CREATE_WORD_FIELD_OP,
-                ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_FIELD,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
-                AML_DEFER | AML_CREATE),
+                        ARGI_CREATE_WORD_FIELD_OP,
+                        ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
+                        AML_DEFER | AML_CREATE),
 /* 35 */ ACPI_OP("CreateByteField", ARGP_CREATE_BYTE_FIELD_OP,
-                ARGI_CREATE_BYTE_FIELD_OP,
-                ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_FIELD,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
-                AML_DEFER | AML_CREATE),
+                        ARGI_CREATE_BYTE_FIELD_OP,
+                        ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
+                        AML_DEFER | AML_CREATE),
 /* 36 */ ACPI_OP("CreateBitField", ARGP_CREATE_BIT_FIELD_OP,
-                ARGI_CREATE_BIT_FIELD_OP,
-                ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_FIELD,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
-                AML_DEFER | AML_CREATE),
-/* 37 */ ACPI_OP("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_1R,
-                AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
+                        ARGI_CREATE_BIT_FIELD_OP,
+                        ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
+                        AML_DEFER | AML_CREATE),
+/* 37 */ ACPI_OP("ObjectType", ARGP_OBJECT_TYPE_OP, ARGI_OBJECT_TYPE_OP,
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_1R,
+                        AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),
 /* 38 */ ACPI_OP("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
                         AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC |
                         AML_CONSTANT),
 /* 39 */ ACPI_OP("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
-                        AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC |
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
+                        AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL_NUMERIC |
                         AML_CONSTANT),
 /* 3A */ ACPI_OP("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R,
-                AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R,
+                        AML_FLAGS_EXEC_1A_0T_1R | AML_CONSTANT),
 /* 3B */ ACPI_OP("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_0T_1R,
-                AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_0T_1R,
+                        AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
 /* 3C */ ACPI_OP("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_0T_1R,
-                AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_0T_1R,
+                        AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
 /* 3D */ ACPI_OP("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
-                AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
+                        AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL | AML_CONSTANT),
 /* 3E */ ACPI_OP("If", ARGP_IF_OP, ARGI_IF_OP, ACPI_TYPE_ANY,
-                AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS),
+                        AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS),
 /* 3F */ ACPI_OP("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, ACPI_TYPE_ANY,
-                AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS),
+                        AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS),
 /* 40 */ ACPI_OP("While", ARGP_WHILE_OP, ARGI_WHILE_OP, ACPI_TYPE_ANY,
-                AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS),
+                        AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS),
 /* 41 */ ACPI_OP("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, ACPI_TYPE_ANY,
-                AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
+                        AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
 /* 42 */ ACPI_OP("Return", ARGP_RETURN_OP, ARGI_RETURN_OP,
-                ACPI_TYPE_ANY, AML_CLASS_CONTROL,
-                AML_TYPE_CONTROL, AML_HAS_ARGS),
+                        ACPI_TYPE_ANY, AML_CLASS_CONTROL,
+                        AML_TYPE_CONTROL, AML_HAS_ARGS),
 /* 43 */ ACPI_OP("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, ACPI_TYPE_ANY,
-                AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
+                        AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
 /* 44 */ ACPI_OP("BreakPoint", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP,
-                ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
+                        ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
 /* 45 */ ACPI_OP("Ones", ARGP_ONES_OP, ARGI_ONES_OP, ACPI_TYPE_INTEGER,
-                AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT),
+                        AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, AML_CONSTANT),
 
 /* Prefixed opcodes (Two-byte opcodes with a prefix op) */
 
 /* 46 */ ACPI_OP("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, ACPI_TYPE_MUTEX,
-                AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 47 */ ACPI_OP("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, ACPI_TYPE_EVENT,
-                AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE,
-                AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
+                        AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE,
+                        AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
 /* 48 */ ACPI_OP("CondRefOf", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R),
 /* 49 */ ACPI_OP("CreateField", ARGP_CREATE_FIELD_OP,
-                ARGI_CREATE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD,
-                AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
-                AML_DEFER | AML_FIELD | AML_CREATE),
+                        ARGI_CREATE_FIELD_OP, ACPI_TYPE_BUFFER_FIELD,
+                        AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
+                        AML_DEFER | AML_FIELD | AML_CREATE),
 /* 4A */ ACPI_OP("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R,
-                AML_FLAGS_EXEC_1A_1T_0R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R,
+                        AML_FLAGS_EXEC_1A_1T_0R),
 /* 4B */ ACPI_OP("Stall", ARGP_STALL_OP, ARGI_STALL_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R,
-                AML_FLAGS_EXEC_1A_0T_0R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R,
+                        AML_FLAGS_EXEC_1A_0T_0R),
 /* 4C */ ACPI_OP("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R,
-                AML_FLAGS_EXEC_1A_0T_0R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R,
+                        AML_FLAGS_EXEC_1A_0T_0R),
 /* 4D */ ACPI_OP("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R),
 /* 4E */ ACPI_OP("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R),
 /* 4F */ ACPI_OP("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
-                AML_FLAGS_EXEC_2A_0T_1R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R,
+                        AML_FLAGS_EXEC_2A_0T_1R),
 /* 50 */ ACPI_OP("Reset", ARGP_RESET_OP, ARGI_RESET_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R,
-                AML_FLAGS_EXEC_1A_0T_0R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R,
+                        AML_FLAGS_EXEC_1A_0T_0R),
 /* 51 */ ACPI_OP("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R),
 /* 52 */ ACPI_OP("FromBCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 53 */ ACPI_OP("ToBCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 54 */ ACPI_OP("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R),
 /* 55 */ ACPI_OP("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP,
-                ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
-                AML_TYPE_CONSTANT, 0),
+                        ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
+                        AML_TYPE_CONSTANT, 0),
 /* 56 */ ACPI_OP("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_CONSTANT, 0),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_CONSTANT, 0),
 /* 57 */ ACPI_OP("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R,
-                AML_FLAGS_EXEC_3A_0T_0R),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R,
+                        AML_FLAGS_EXEC_3A_0T_0R),
 /* 58 */ ACPI_OP("OperationRegion", ARGP_REGION_OP, ARGI_REGION_OP,
-                ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_COMPLEX,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED | AML_DEFER),
+                        ACPI_TYPE_REGION, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_COMPLEX,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED | AML_DEFER),
 /* 59 */ ACPI_OP("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD,
+                        AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD,
                         AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
                         AML_FIELD),
 /* 5A */ ACPI_OP("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP,
-                ACPI_TYPE_DEVICE, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_NO_OBJ,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        ACPI_TYPE_DEVICE, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_NO_OBJ,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 5B */ ACPI_OP("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP,
-                ACPI_TYPE_PROCESSOR, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_SIMPLE,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        ACPI_TYPE_PROCESSOR, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_SIMPLE,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 5C */ ACPI_OP("PowerResource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP,
-                ACPI_TYPE_POWER, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_SIMPLE,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        ACPI_TYPE_POWER, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_SIMPLE,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 5D */ ACPI_OP("ThermalZone", ARGP_THERMAL_ZONE_OP,
-                ARGI_THERMAL_ZONE_OP, ACPI_TYPE_THERMAL,
-                AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED),
+                        ARGI_THERMAL_ZONE_OP, ACPI_TYPE_THERMAL,
+                        AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED),
 /* 5E */ ACPI_OP("IndexField", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP,
-                ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_FIELD,
-                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
                         AML_FIELD),
 /* 5F */ ACPI_OP("BankField", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP,
-                        ACPI_TYPE_LOCAL_BANK_FIELD,
+                        ACPI_TYPE_LOCAL_BANK_FIELD,
                         AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD,
-                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
                         AML_FIELD | AML_DEFER),
 
 /* Internal opcodes that map to invalid AML opcodes */
 
 /* 60 */ ACPI_OP("LNotEqual", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP,
-                ACPI_TYPE_ANY, AML_CLASS_INTERNAL,
-                AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_INTERNAL,
+                        AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT),
 /* 61 */ ACPI_OP("LLessEqual", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP,
-                ACPI_TYPE_ANY, AML_CLASS_INTERNAL,
-                AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_INTERNAL,
+                        AML_TYPE_BOGUS, AML_HAS_ARGS | AML_CONSTANT),
 /* 62 */ ACPI_OP("LGreaterEqual", ARGP_LGREATEREQUAL_OP,
-                ARGI_LGREATEREQUAL_OP, ACPI_TYPE_ANY,
-                AML_CLASS_INTERNAL, AML_TYPE_BOGUS,
-                AML_HAS_ARGS | AML_CONSTANT),
+                        ARGI_LGREATEREQUAL_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_INTERNAL, AML_TYPE_BOGUS,
+                        AML_HAS_ARGS | AML_CONSTANT),
 /* 63 */ ACPI_OP("-NamePath-", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP,
-                ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE),
+                        ACPI_TYPE_LOCAL_REFERENCE, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE),
 /* 64 */ ACPI_OP("-MethodCall-", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP,
-                ACPI_TYPE_METHOD, AML_CLASS_METHOD_CALL,
-                AML_TYPE_METHOD_CALL,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE),
+                        ACPI_TYPE_METHOD, AML_CLASS_METHOD_CALL,
+                        AML_TYPE_METHOD_CALL,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE),
 /* 65 */ ACPI_OP("-ByteList-", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP,
-                ACPI_TYPE_ANY, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, 0),
+                        ACPI_TYPE_ANY, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, 0),
 /* 66 */ ACPI_OP("-ReservedField-", ARGP_RESERVEDFIELD_OP,
-                ARGI_RESERVEDFIELD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
+                        ARGI_RESERVEDFIELD_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
 /* 67 */ ACPI_OP("-NamedField-", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP,
-                ACPI_TYPE_ANY, AML_CLASS_INTERNAL,
-                AML_TYPE_BOGUS,
-                AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
+                        ACPI_TYPE_ANY, AML_CLASS_INTERNAL,
+                        AML_TYPE_BOGUS,
+                        AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED),
 /* 68 */ ACPI_OP("-AccessField-", ARGP_ACCESSFIELD_OP,
-                ARGI_ACCESSFIELD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
+                        ARGI_ACCESSFIELD_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
 /* 69 */ ACPI_OP("-StaticString", ARGP_STATICSTRING_OP,
-                ARGI_STATICSTRING_OP, ACPI_TYPE_ANY,
-                AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
+                        ARGI_STATICSTRING_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
 /* 6A */ ACPI_OP("-Return Value-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY,
-                AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN,
-                AML_HAS_ARGS | AML_HAS_RETVAL),
+                        AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN,
+                        AML_HAS_ARGS | AML_HAS_RETVAL),
 /* 6B */ ACPI_OP("-UNKNOWN_OP-", ARG_NONE, ARG_NONE, ACPI_TYPE_INVALID,
-                AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS),
+                        AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS),
 /* 6C */ ACPI_OP("-ASCII_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY,
-                AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS),
+                        AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS),
 /* 6D */ ACPI_OP("-PREFIX_ONLY-", ARG_NONE, ARG_NONE, ACPI_TYPE_ANY,
-                AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS),
+                        AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS),
 
 /* ACPI 2.0 opcodes */
 
 /* 6E */ ACPI_OP("QwordConst", ARGP_QWORD_OP, ARGI_QWORD_OP,
-                ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
-                AML_TYPE_LITERAL, AML_CONSTANT),
+                        ACPI_TYPE_INTEGER, AML_CLASS_ARGUMENT,
+                        AML_TYPE_LITERAL, AML_CONSTANT),
        /* 6F */ ACPI_OP("Package", /* Var */ ARGP_VAR_PACKAGE_OP,
                         ARGI_VAR_PACKAGE_OP, ACPI_TYPE_PACKAGE,
                         AML_CLASS_CREATE, AML_TYPE_CREATE_OBJECT,
                         AML_HAS_ARGS | AML_DEFER),
 /* 70 */ ACPI_OP("ConcatenateResTemplate", ARGP_CONCAT_RES_OP,
-                ARGI_CONCAT_RES_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
+                        ARGI_CONCAT_RES_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
 /* 71 */ ACPI_OP("Mod", ARGP_MOD_OP, ARGI_MOD_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
 /* 72 */ ACPI_OP("CreateQWordField", ARGP_CREATE_QWORD_FIELD_OP,
-                ARGI_CREATE_QWORD_FIELD_OP,
-                ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
-                AML_TYPE_CREATE_FIELD,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
-                AML_DEFER | AML_CREATE),
+                        ARGI_CREATE_QWORD_FIELD_OP,
+                        ACPI_TYPE_BUFFER_FIELD, AML_CLASS_CREATE,
+                        AML_TYPE_CREATE_FIELD,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
+                        AML_DEFER | AML_CREATE),
 /* 73 */ ACPI_OP("ToBuffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 74 */ ACPI_OP("ToDecimalString", ARGP_TO_DEC_STR_OP,
-                ARGI_TO_DEC_STR_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ARGI_TO_DEC_STR_OP, ACPI_TYPE_ANY,
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 75 */ ACPI_OP("ToHexString", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 76 */ ACPI_OP("ToInteger", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_1T_1R,
-                AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_1T_1R,
+                        AML_FLAGS_EXEC_1A_1T_1R | AML_CONSTANT),
 /* 77 */ ACPI_OP("ToString", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_2A_1T_1R,
-                AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_2A_1T_1R,
+                        AML_FLAGS_EXEC_2A_1T_1R | AML_CONSTANT),
 /* 78 */ ACPI_OP("CopyObject", ARGP_COPY_OP, ARGI_COPY_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R),
 /* 79 */ ACPI_OP("Mid", ARGP_MID_OP, ARGI_MID_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R,
-                AML_FLAGS_EXEC_3A_1T_1R | AML_CONSTANT),
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R,
+                        AML_FLAGS_EXEC_3A_1T_1R | AML_CONSTANT),
 /* 7A */ ACPI_OP("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
+                        ACPI_TYPE_ANY, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0),
 /* 7B */ ACPI_OP("LoadTable", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
-                AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R),
+                        ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
+                        AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R),
 /* 7C */ ACPI_OP("DataTableRegion", ARGP_DATA_REGION_OP,
-                ARGI_DATA_REGION_OP, ACPI_TYPE_REGION,
-                AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX,
-                AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
-                AML_NSNODE | AML_NAMED | AML_DEFER),
+                        ARGI_DATA_REGION_OP, ACPI_TYPE_REGION,
+                        AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        AML_NSNODE | AML_NAMED | AML_DEFER),
 /* 7D */ ACPI_OP("[EvalSubTree]", ARGP_SCOPE_OP, ARGI_SCOPE_OP,
-                ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT,
-                AML_TYPE_NAMED_NO_OBJ,
-                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
+                        ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT,
+                        AML_TYPE_NAMED_NO_OBJ,
+                        AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
                         AML_NSNODE),
 
 /* ACPI 3.0 opcodes */
 
 /* 7E */ ACPI_OP("Timer", ARGP_TIMER_OP, ARGI_TIMER_OP, ACPI_TYPE_ANY,
-                AML_CLASS_EXECUTE, AML_TYPE_EXEC_0A_0T_1R,
+                        AML_CLASS_EXECUTE, AML_TYPE_EXEC_0A_0T_1R,
                         AML_FLAGS_EXEC_0A_0T_1R),
 
 /* ACPI 5.0 opcodes */
index 98001d7..b729d9b 100644 (file)
@@ -526,8 +526,8 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                        }
 
                        /*
-                        * If the transfer to the new method method call worked, a new walk
-                        * state was created -- get it
+                        * If the transfer to the new method method call worked
+                        *, a new walk state was created -- get it
                         */
                        walk_state = acpi_ds_get_current_walk_state(thread);
                        continue;
@@ -544,8 +544,8 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
                        /* Check for possible multi-thread reentrancy problem */
 
                        if ((status == AE_ALREADY_EXISTS) &&
-                           (!(walk_state->method_desc->method.
-                              info_flags & ACPI_METHOD_SERIALIZED))) {
+                           (!(walk_state->method_desc->method.info_flags &
+                              ACPI_METHOD_SERIALIZED))) {
                                /*
                                 * Method is not serialized and tried to create an object
                                 * twice. The probable cause is that the method cannot
index 71d2877..6cb02a2 100644 (file)
@@ -175,8 +175,8 @@ void acpi_ps_free_op(union acpi_parse_object *op)
        ACPI_FUNCTION_NAME(ps_free_op);
 
        if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
-               ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n",
-                                 op));
+               ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+                                 "Free retval op: %p\n", op));
        }
 
        if (op->common.flags & ACPI_PARSEOP_GENERIC) {
index ba5f691..f620d43 100644 (file)
@@ -99,6 +99,7 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
                if (op == subtree_root) {
                        return_VOID;
                }
+
                if (next) {
                        op = next;
                } else {
index 66d406e..bdb7e73 100644 (file)
@@ -312,8 +312,8 @@ acpi_rs_get_address_common(struct acpi_resource *resource,
 
        /* Validate the Resource Type */
 
-       if ((aml->address.resource_type > 2)
-           && (aml->address.resource_type < 0xC0)) {
+       if ((aml->address.resource_type > 2) &&
+           (aml->address.resource_type < 0xC0)) {
                return (FALSE);
        }
 
index cb739a6..88fce58 100644 (file)
@@ -143,16 +143,17 @@ acpi_rs_stream_option_length(u32 resource_length,
        ACPI_FUNCTION_ENTRY();
 
        /*
-        * The resource_source_index and resource_source are optional elements of some
-        * Large-type resource descriptors.
+        * The resource_source_index and resource_source are optional elements of
+        * some Large-type resource descriptors.
         */
 
        /*
-        * If the length of the actual resource descriptor is greater than the ACPI
-        * spec-defined minimum length, it means that a resource_source_index exists
-        * and is followed by a (required) null terminated string. The string length
-        * (including the null terminator) is the resource length minus the minimum
-        * length, minus one byte for the resource_source_index itself.
+        * If the length of the actual resource descriptor is greater than the
+        * ACPI spec-defined minimum length, it means that a resource_source_index
+        * exists and is followed by a (required) null terminated string. The
+        * string length (including the null terminator) is the resource length
+        * minus the minimum length, minus one byte for the resource_source_index
+        * itself.
         */
        if (resource_length > minimum_aml_resource_length) {
 
@@ -277,11 +278,11 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
                         * 16-Bit Address Resource:
                         * Add the size of the optional resource_source info
                         */
-                       total_size = (acpi_rs_length)
-                           (total_size +
-                            acpi_rs_struct_option_length(&resource->data.
-                                                         address16.
-                                                         resource_source));
+                       total_size = (acpi_rs_length) (total_size +
+                                                      acpi_rs_struct_option_length
+                                                      (&resource->data.
+                                                       address16.
+                                                       resource_source));
                        break;
 
                case ACPI_RESOURCE_TYPE_ADDRESS32:
@@ -289,11 +290,11 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
                         * 32-Bit Address Resource:
                         * Add the size of the optional resource_source info
                         */
-                       total_size = (acpi_rs_length)
-                           (total_size +
-                            acpi_rs_struct_option_length(&resource->data.
-                                                         address32.
-                                                         resource_source));
+                       total_size = (acpi_rs_length) (total_size +
+                                                      acpi_rs_struct_option_length
+                                                      (&resource->data.
+                                                       address32.
+                                                       resource_source));
                        break;
 
                case ACPI_RESOURCE_TYPE_ADDRESS64:
@@ -301,11 +302,11 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
                         * 64-Bit Address Resource:
                         * Add the size of the optional resource_source info
                         */
-                       total_size = (acpi_rs_length)
-                           (total_size +
-                            acpi_rs_struct_option_length(&resource->data.
-                                                         address64.
-                                                         resource_source));
+                       total_size = (acpi_rs_length) (total_size +
+                                                      acpi_rs_struct_option_length
+                                                      (&resource->data.
+                                                       address64.
+                                                       resource_source));
                        break;
 
                case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
@@ -314,26 +315,28 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
                         * Add the size of each additional optional interrupt beyond the
                         * required 1 (4 bytes for each u32 interrupt number)
                         */
-                       total_size = (acpi_rs_length)
-                           (total_size +
-                            ((resource->data.extended_irq.interrupt_count -
-                              1) * 4) +
-                            /* Add the size of the optional resource_source info */
-                            acpi_rs_struct_option_length(&resource->data.
-                                                         extended_irq.
-                                                         resource_source));
+                       total_size = (acpi_rs_length) (total_size +
+                                                      ((resource->data.
+                                                        extended_irq.
+                                                        interrupt_count -
+                                                        1) * 4) +
+                                                      /* Add the size of the optional resource_source info */
+                                                      acpi_rs_struct_option_length
+                                                      (&resource->data.
+                                                       extended_irq.
+                                                       resource_source));
                        break;
 
                case ACPI_RESOURCE_TYPE_GPIO:
 
-                       total_size =
-                           (acpi_rs_length) (total_size +
-                                             (resource->data.gpio.
-                                              pin_table_length * 2) +
-                                             resource->data.gpio.
-                                             resource_source.string_length +
-                                             resource->data.gpio.
-                                             vendor_length);
+                       total_size = (acpi_rs_length) (total_size +
+                                                      (resource->data.gpio.
+                                                       pin_table_length * 2) +
+                                                      resource->data.gpio.
+                                                      resource_source.
+                                                      string_length +
+                                                      resource->data.gpio.
+                                                      vendor_length);
 
                        break;
 
@@ -566,8 +569,8 @@ acpi_rs_get_list_length(u8 * aml_buffer,
                            acpi_gbl_resource_struct_sizes[resource_index] +
                            extra_struct_bytes;
                }
-               buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
 
+               buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
                *size_needed += buffer_size;
 
                ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,
index a534442..603e544 100644 (file)
@@ -81,8 +81,9 @@ acpi_buffer_to_resource(u8 *aml_buffer,
 
        /* Get the required length for the converted resource */
 
-       status = acpi_rs_get_list_length(aml_buffer, aml_buffer_length,
-                                        &list_size_needed);
+       status =
+           acpi_rs_get_list_length(aml_buffer, aml_buffer_length,
+                                   &list_size_needed);
        if (status == AE_AML_NO_RESOURCE_END_TAG) {
                status = AE_OK;
        }
@@ -232,8 +233,9 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
 
        /* Get the required buffer length */
 
-       status = acpi_rs_get_pci_routing_table_length(package_object,
-                                                     &buffer_size_needed);
+       status =
+           acpi_rs_get_pci_routing_table_length(package_object,
+                                                &buffer_size_needed);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -270,9 +272,9 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer);
 
                /*
-                * Fill in the Length field with the information we have at this point.
-                * The minus four is to subtract the size of the u8 Source[4] member
-                * because it is added below.
+                * Fill in the Length field with the information we have at this
+                * point. The minus four is to subtract the size of the u8
+                * Source[4] member because it is added below.
                 */
                user_prt->length = (sizeof(struct acpi_pci_routing_table) - 4);
 
@@ -345,11 +347,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
                                           (u8 *) output_buffer->pointer);
                                path_buffer.pointer = user_prt->source;
 
-                               status =
-                                   acpi_ns_handle_to_pathname((acpi_handle)
-                                                              node,
-                                                              &path_buffer,
-                                                              FALSE);
+                               status = acpi_ns_handle_to_pathname((acpi_handle) node, &path_buffer, FALSE);
 
                                /* +1 to include null terminator */
 
@@ -371,8 +369,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
 
                        case ACPI_TYPE_INTEGER:
                                /*
-                                * If this is a number, then the Source Name is NULL, since the
-                                * entire buffer was zeroed out, we can leave this alone.
+                                * If this is a number, then the Source Name is NULL, since
+                                * the entire buffer was zeroed out, we can leave this alone.
                                 *
                                 * Add to the Length field the length of the u32 NULL
                                 */
@@ -451,9 +449,9 @@ acpi_rs_create_aml_resources(struct acpi_buffer *resource_list,
 
        /* Get the buffer size needed for the AML byte stream */
 
-       status = acpi_rs_get_aml_length(resource_list->pointer,
-                                       resource_list->length,
-                                       &aml_size_needed);
+       status =
+           acpi_rs_get_aml_length(resource_list->pointer,
+                                  resource_list->length, &aml_size_needed);
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
                          (u32)aml_size_needed, acpi_format_exception(status)));
index 2a09288..05cc560 100644 (file)
@@ -483,6 +483,7 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
 
 static void acpi_rs_out_string(char *title, char *value)
 {
+
        acpi_os_printf("%27s : %s", title, value);
        if (!*value) {
                acpi_os_printf("[NULL NAMESTRING]");
@@ -497,21 +498,25 @@ static void acpi_rs_out_integer8(char *title, u8 value)
 
 static void acpi_rs_out_integer16(char *title, u16 value)
 {
+
        acpi_os_printf("%27s : %4.4X\n", title, value);
 }
 
 static void acpi_rs_out_integer32(char *title, u32 value)
 {
+
        acpi_os_printf("%27s : %8.8X\n", title, value);
 }
 
 static void acpi_rs_out_integer64(char *title, u64 value)
 {
+
        acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
 }
 
 static void acpi_rs_out_title(char *title)
 {
+
        acpi_os_printf("%27s : ", title);
 }
 
@@ -544,6 +549,7 @@ static void acpi_rs_dump_short_byte_list(u8 length, u8 * data)
        for (i = 0; i < length; i++) {
                acpi_os_printf("%X ", data[i]);
        }
+
        acpi_os_printf("\n");
 }
 
index 50d5be2..286ccb4 100644 (file)
@@ -89,6 +89,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml,
        /* Get the appropriate conversion info table */
 
        aml_resource = ACPI_CAST_PTR(union aml_resource, aml);
+
        if (acpi_ut_get_resource_type(aml) == ACPI_RESOURCE_NAME_SERIAL_BUS) {
                if (aml_resource->common_serial_bus.type >
                    AML_RESOURCE_MAX_SERIALBUSTYPE) {
@@ -225,10 +226,10 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
 
                /* Perform final sanity check on the new AML resource descriptor */
 
-               status = acpi_ut_validate_resource(NULL,
-                                                  ACPI_CAST_PTR(union
-                                                                aml_resource,
-                                                                aml), NULL);
+               status =
+                   acpi_ut_validate_resource(NULL,
+                                             ACPI_CAST_PTR(union aml_resource,
+                                                           aml), NULL);
                if (ACPI_FAILURE(status)) {
                        return_ACPI_STATUS(status);
                }
index ac37852..b112c7b 100644 (file)
@@ -189,8 +189,8 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
                        item_count = ACPI_GET8(source);
                        ACPI_SET8(destination, item_count);
 
-                       resource->length = resource->length +
-                           (info->value * item_count);
+                       resource->length =
+                           resource->length + (info->value * item_count);
                        break;
 
                case ACPI_RSC_COUNT_GPIO_RES:
@@ -445,8 +445,8 @@ exit:
 
                /* Round the resource struct length up to the next boundary (32 or 64) */
 
-               resource->length =
-                   (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(resource->length);
+               resource->length = (u32)
+                   ACPI_ROUND_UP_TO_NATIVE_WORD(resource->length);
        }
        return_ACPI_STATUS(AE_OK);
 }
@@ -550,9 +550,8 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
                        item_count = ACPI_GET8(source);
                        ACPI_SET8(destination, item_count);
 
-                       aml_length =
-                           (u16) (aml_length +
-                                  (info->value * (item_count - 1)));
+                       aml_length = (u16)
+                           (aml_length + (info->value * (item_count - 1)));
                        break;
 
                case ACPI_RSC_COUNT16:
@@ -723,11 +722,10 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
                        /*
                         * 16-bit encoded bitmask (IRQ macro)
                         */
-                       temp16 = acpi_rs_encode_bitmask(source,
-                                                       *ACPI_ADD_PTR(u8,
-                                                                     resource,
-                                                                     info->
-                                                                     value));
+                       temp16 =
+                           acpi_rs_encode_bitmask(source,
+                                                  *ACPI_ADD_PTR(u8, resource,
+                                                                info->value));
                        ACPI_MOVE_16_TO_16(destination, &temp16);
                        break;
 
index 9486992..33e558c 100644 (file)
@@ -221,14 +221,13 @@ acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
                ACPI_MOVE_16_TO_16(&aml->large_header.resource_length,
                                   &resource_length);
        } else {
-               /* Small descriptor -- bits 2:0 of byte 0 contain the length */
-
+               /*
+                * Small descriptor -- bits 2:0 of byte 0 contain the length
+                * Clear any existing length, preserving descriptor type bits
+                */
                aml->small_header.descriptor_type = (u8)
-
-                   /* Clear any existing length, preserving descriptor type bits */
-                   ((aml->small_header.
-                     descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
-
+                   ((aml->small_header.descriptor_type &
+                     ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
                     | resource_length);
        }
 }
@@ -333,8 +332,8 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length,
        aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
 
        /*
-        * resource_source is present if the length of the descriptor is longer than
-        * the minimum length.
+        * resource_source is present if the length of the descriptor is longer
+        * than the minimum length.
         *
         * Note: Some resource descriptors will have an additional null, so
         * we add 1 to the minimum length.
@@ -366,6 +365,7 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length,
                total_length =
                    (u32)strlen(ACPI_CAST_PTR(char, &aml_resource_source[1])) +
                    1;
+
                total_length = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(total_length);
 
                memset(resource_source->string_ptr, 0, total_length);
@@ -438,8 +438,8 @@ acpi_rs_set_resource_source(union aml_resource * aml,
                 * Add the length of the string (+ 1 for null terminator) to the
                 * final descriptor length
                 */
-               descriptor_length +=
-                   ((acpi_rsdesc_size) resource_source->string_length + 1);
+               descriptor_length += ((acpi_rsdesc_size)
+                                     resource_source->string_length + 1);
        }
 
        /* Return the new total length of the AML descriptor */
@@ -478,8 +478,9 @@ acpi_rs_get_prt_method_data(struct acpi_namespace_node * node,
 
        /* Execute the method, no parameters */
 
-       status = acpi_ut_evaluate_object(node, METHOD_NAME__PRT,
-                                        ACPI_BTYPE_PACKAGE, &obj_desc);
+       status =
+           acpi_ut_evaluate_object(node, METHOD_NAME__PRT, ACPI_BTYPE_PACKAGE,
+                                   &obj_desc);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -527,8 +528,9 @@ acpi_rs_get_crs_method_data(struct acpi_namespace_node *node,
 
        /* Execute the method, no parameters */
 
-       status = acpi_ut_evaluate_object(node, METHOD_NAME__CRS,
-                                        ACPI_BTYPE_BUFFER, &obj_desc);
+       status =
+           acpi_ut_evaluate_object(node, METHOD_NAME__CRS, ACPI_BTYPE_BUFFER,
+                                   &obj_desc);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -577,8 +579,9 @@ acpi_rs_get_prs_method_data(struct acpi_namespace_node *node,
 
        /* Execute the method, no parameters */
 
-       status = acpi_ut_evaluate_object(node, METHOD_NAME__PRS,
-                                        ACPI_BTYPE_BUFFER, &obj_desc);
+       status =
+           acpi_ut_evaluate_object(node, METHOD_NAME__PRS, ACPI_BTYPE_BUFFER,
+                                   &obj_desc);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -627,8 +630,9 @@ acpi_rs_get_aei_method_data(struct acpi_namespace_node *node,
 
        /* Execute the method, no parameters */
 
-       status = acpi_ut_evaluate_object(node, METHOD_NAME__AEI,
-                                        ACPI_BTYPE_BUFFER, &obj_desc);
+       status =
+           acpi_ut_evaluate_object(node, METHOD_NAME__AEI, ACPI_BTYPE_BUFFER,
+                                   &obj_desc);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
index 1e8cd57..308bfd6 100644 (file)
@@ -53,7 +53,7 @@ ACPI_MODULE_NAME("rsxface")
 
 /* Local macros for 16,32-bit to 64-bit conversion */
 #define ACPI_COPY_FIELD(out, in, field)  ((out)->field = (in)->field)
-#define ACPI_COPY_ADDRESS(out, in)                      \
+#define ACPI_COPY_ADDRESS(out, in)                       \
        ACPI_COPY_FIELD(out, in, resource_type);             \
        ACPI_COPY_FIELD(out, in, producer_consumer);         \
        ACPI_COPY_FIELD(out, in, decode);                    \
index 5c9d5ab..4a81527 100644 (file)
@@ -407,6 +407,7 @@ acpi_tb_verify_temp_table(struct acpi_table_desc * table_desc, char *signature)
                                        table_desc->signature.ascii : "????",
                                        ACPI_FORMAT_UINT64(table_desc->
                                                           address)));
+
                        goto invalidate_and_exit;
                }
        }
index 6319b42..bd87801 100644 (file)
@@ -337,8 +337,8 @@ acpi_tb_install_standard_table(acpi_physical_address address,
                         * need to be unregistered when they are unloaded, and slots in the
                         * root table list should be reused when empty.
                         */
-                       if (acpi_gbl_root_table_list.tables[i].
-                           flags & ACPI_TABLE_IS_LOADED) {
+                       if (acpi_gbl_root_table_list.tables[i].flags &
+                           ACPI_TABLE_IS_LOADED) {
 
                                /* Table is still loaded, this is an error */
 
index 709d511..d0d1259 100644 (file)
@@ -76,6 +76,7 @@ static void acpi_tb_fix_string(char *string, acpi_size length)
                if (!isprint((int)*string)) {
                        *string = '?';
                }
+
                string++;
                length--;
        }
index d8ddef3..7c1b5f8 100644 (file)
@@ -121,6 +121,7 @@ void acpi_tb_check_dsdt_header(void)
                ACPI_BIOS_ERROR((AE_INFO,
                                 "The DSDT has been corrupted or replaced - "
                                 "old, new headers below"));
+
                acpi_tb_print_table_header(0, &acpi_gbl_original_dsdt_header);
                acpi_tb_print_table_header(0, acpi_gbl_DSDT);
 
@@ -379,7 +380,6 @@ next_table:
        }
 
        acpi_os_unmap_memory(table, length);
-
        return_ACPI_STATUS(AE_OK);
 }
 
@@ -389,7 +389,7 @@ next_table:
  *
  * PARAMETERS:  signature           - Sig string to be validated
  *
- * RETURN:      TRUE if signature is correct length and has valid characters
+ * RETURN:      TRUE if signature is has 4 valid ACPI characters
  *
  * DESCRIPTION: Validate an ACPI table signature.
  *
@@ -399,12 +399,6 @@ u8 acpi_is_valid_signature(char *signature)
 {
        u32 i;
 
-       /* Validate the signature length */
-
-       if (strlen(signature) != ACPI_NAME_SIZE) {
-               return (FALSE);
-       }
-
        /* Validate each character in the signature */
 
        for (i = 0; i < ACPI_NAME_SIZE; i++) {
index 55ee14c..ca2f136 100644 (file)
@@ -191,6 +191,7 @@ acpi_status acpi_tb_load_namespace(void)
                                        "(%4.4s:%8.8s) while loading table",
                                        table->signature.ascii,
                                        table->pointer->oem_table_id));
+
                        tables_failed++;
 
                        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
@@ -206,7 +207,7 @@ acpi_status acpi_tb_load_namespace(void)
 
        if (!tables_failed) {
                ACPI_INFO((AE_INFO,
-                          "%u ACPI AML tables successfully acquired and loaded",
+                          "%u ACPI AML tables successfully acquired and loaded\n",
                           tables_loaded));
        } else {
                ACPI_ERROR((AE_INFO,
index 911ea8e..38a29e2 100644 (file)
@@ -239,8 +239,9 @@ acpi_ut_check_address_range(acpi_adr_space_type space_id,
                        overlap_count++;
                        if (warn) {     /* Optional warning message */
                                pathname =
-                                   acpi_ns_get_external_pathname(range_info->
-                                                                 region_node);
+                                   acpi_ns_get_normalized_pathname(range_info->
+                                                                   region_node,
+                                                                   TRUE);
 
                                ACPI_WARNING((AE_INFO,
                                              "%s range 0x%8.8X%8.8X-0x%8.8X%8.8X conflicts with OpRegion 0x%8.8X%8.8X-0x%8.8X%8.8X (%s)",
index 257221d..ade8acf 100644 (file)
@@ -257,9 +257,9 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type,
        ACPI_FUNCTION_ENTRY();
 
        this_index = state->pkg.index;
-       target_object = (union acpi_object *)
-           &((union acpi_object *)(state->pkg.dest_object))->package.
-           elements[this_index];
+       target_object = (union acpi_object *)&((union acpi_object *)
+                                              (state->pkg.dest_object))->
+           package.elements[this_index];
 
        switch (object_type) {
        case ACPI_COPY_TYPE_SIMPLE:
@@ -348,15 +348,15 @@ acpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object,
         * Free space begins right after the first package
         */
        info.length = ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
-       info.free_space =
-           buffer + ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
+       info.free_space = buffer +
+           ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
        info.object_space = 0;
        info.num_packages = 1;
 
        external_object->type = internal_object->common.type;
        external_object->package.count = internal_object->package.count;
-       external_object->package.elements = ACPI_CAST_PTR(union acpi_object,
-                                                         info.free_space);
+       external_object->package.elements =
+           ACPI_CAST_PTR(union acpi_object, info.free_space);
 
        /*
         * Leave room for an array of ACPI_OBJECTS in the buffer
@@ -593,8 +593,8 @@ acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object,
        package_elements = package_object->package.elements;
 
        /*
-        * Recursive implementation. Probably ok, since nested external packages
-        * as parameters should be very rare.
+        * Recursive implementation. Probably ok, since nested external
+        * packages as parameters should be very rare.
         */
        for (i = 0; i < external_object->package.count; i++) {
                status =
@@ -649,9 +649,8 @@ acpi_ut_copy_eobject_to_iobject(union acpi_object *external_object,
                /*
                 * Build a simple object (no nested objects)
                 */
-               status =
-                   acpi_ut_copy_esimple_to_isimple(external_object,
-                                                   internal_object);
+               status = acpi_ut_copy_esimple_to_isimple(external_object,
+                                                        internal_object);
        }
 
        return_ACPI_STATUS(status);
index ecaaaff..3533135 100644 (file)
@@ -114,7 +114,7 @@ const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS] = {
        "PCC"                   /* 0x0A */
 };
 
-char *acpi_ut_get_region_name(u8 space_id)
+const char *acpi_ut_get_region_name(u8 space_id)
 {
 
        if (space_id >= ACPI_USER_REGION_BEGIN) {
@@ -127,7 +127,7 @@ char *acpi_ut_get_region_name(u8 space_id)
                return ("InvalidSpaceId");
        }
 
-       return (ACPI_CAST_PTR(char, acpi_gbl_region_types[space_id]));
+       return (acpi_gbl_region_types[space_id]);
 }
 
 /*******************************************************************************
@@ -152,14 +152,14 @@ static const char *acpi_gbl_event_types[ACPI_NUM_FIXED_EVENTS] = {
        "RealTimeClock",
 };
 
-char *acpi_ut_get_event_name(u32 event_id)
+const char *acpi_ut_get_event_name(u32 event_id)
 {
 
        if (event_id > ACPI_EVENT_MAX) {
                return ("InvalidEventID");
        }
 
-       return (ACPI_CAST_PTR(char, acpi_gbl_event_types[event_id]));
+       return (acpi_gbl_event_types[event_id]);
 }
 
 /*******************************************************************************
@@ -180,7 +180,8 @@ char *acpi_ut_get_event_name(u32 event_id)
  *
  * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
  * when stored in a table it really means that we have thus far seen no
- * evidence to indicate what type is actually going to be stored for this entry.
+ * evidence to indicate what type is actually going to be stored for this
+ & entry.
  */
 static const char acpi_gbl_bad_type[] = "UNDEFINED";
 
@@ -220,17 +221,17 @@ static const char *acpi_gbl_ns_type_names[] = {
        /* 30 */ "Invalid"
 };
 
-char *acpi_ut_get_type_name(acpi_object_type type)
+const char *acpi_ut_get_type_name(acpi_object_type type)
 {
 
        if (type > ACPI_TYPE_INVALID) {
-               return (ACPI_CAST_PTR(char, acpi_gbl_bad_type));
+               return (acpi_gbl_bad_type);
        }
 
-       return (ACPI_CAST_PTR(char, acpi_gbl_ns_type_names[type]));
+       return (acpi_gbl_ns_type_names[type]);
 }
 
-char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
+const char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
 {
        ACPI_FUNCTION_TRACE(ut_get_object_type_name);
 
@@ -267,7 +268,7 @@ char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc)
  *
  ******************************************************************************/
 
-char *acpi_ut_get_node_name(void *object)
+const char *acpi_ut_get_node_name(void *object)
 {
        struct acpi_namespace_node *node = (struct acpi_namespace_node *)object;
 
@@ -333,7 +334,7 @@ static const char *acpi_gbl_desc_type_names[] = {
        /* 15 */ "Node"
 };
 
-char *acpi_ut_get_descriptor_name(void *object)
+const char *acpi_ut_get_descriptor_name(void *object)
 {
 
        if (!object) {
@@ -344,10 +345,7 @@ char *acpi_ut_get_descriptor_name(void *object)
                return ("Not a Descriptor");
        }
 
-       return (ACPI_CAST_PTR(char,
-                             acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE
-                                                      (object)]));
-
+       return (acpi_gbl_desc_type_names[ACPI_GET_DESCRIPTOR_TYPE(object)]);
 }
 
 /*******************************************************************************
@@ -415,7 +413,7 @@ const char *acpi_ut_get_reference_name(union acpi_operand_object *object)
 
 /* Names for internal mutex objects, used for debug output */
 
-static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = {
+static const char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = {
        "ACPI_MTX_Interpreter",
        "ACPI_MTX_Namespace",
        "ACPI_MTX_Tables",
@@ -424,7 +422,7 @@ static char *acpi_gbl_mutex_names[ACPI_NUM_MUTEX] = {
        "ACPI_MTX_Memory",
 };
 
-char *acpi_ut_get_mutex_name(u32 mutex_id)
+const char *acpi_ut_get_mutex_name(u32 mutex_id)
 {
 
        if (mutex_id > ACPI_MAX_MUTEX) {
index 1638312..1afd742 100644 (file)
@@ -209,6 +209,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                        acpi_ut_delete_object_desc(object->method.mutex);
                        object->method.mutex = NULL;
                }
+
                if (object->method.node) {
                        object->method.node = NULL;
                }
@@ -515,8 +516,8 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
                }
 
                /*
-                * All sub-objects must have their reference count incremented also.
-                * Different object types have different subobjects.
+                * All sub-objects must have their reference count incremented
+                * also. Different object types have different subobjects.
                 */
                switch (object->common.type) {
                case ACPI_TYPE_DEVICE:
index 9ef80f2..f93bb90 100644 (file)
@@ -217,8 +217,9 @@ acpi_ut_namespace_error(const char *module_name,
        } else {
                /* Convert path to external format */
 
-               status = acpi_ns_externalize_name(ACPI_UINT32_MAX,
-                                                 internal_name, NULL, &name);
+               status =
+                   acpi_ns_externalize_name(ACPI_UINT32_MAX, internal_name,
+                                            NULL, &name);
 
                /* Print target name */
 
@@ -271,9 +272,8 @@ acpi_ut_method_error(const char *module_name,
        acpi_os_printf(ACPI_MSG_ERROR);
 
        if (path) {
-               status =
-                   acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
-                                    &node);
+               status = acpi_ns_get_node(prefix_node, path,
+                                         ACPI_NS_NO_UPSEARCH, &node);
                if (ACPI_FAILURE(status)) {
                        acpi_os_printf("[Could not get node by pathname]");
                }
diff --git a/drivers/acpi/acpica/utfileio.c b/drivers/acpi/acpica/utfileio.c
deleted file mode 100644 (file)
index d435b7b..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-/*******************************************************************************
- *
- * Module Name: utfileio - simple file I/O routines
- *
- ******************************************************************************/
-
-/*
- * Copyright (C) 2000 - 2015, Intel Corp.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions, and the following disclaimer,
- *    without modification.
- * 2. Redistributions in binary form must reproduce at minimum a disclaimer
- *    substantially similar to the "NO WARRANTY" disclaimer below
- *    ("Disclaimer") and any redistribution must be conditioned upon
- *    including a substantially similar Disclaimer requirement for further
- *    binary redistribution.
- * 3. Neither the names of the above-listed copyright holders nor the names
- *    of any contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * Alternatively, this software may be distributed under the terms of the
- * GNU General Public License ("GPL") version 2 as published by the Free
- * Software Foundation.
- *
- * NO WARRANTY
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGES.
- */
-
-#include <acpi/acpi.h>
-#include "accommon.h"
-#include "actables.h"
-#include "acapps.h"
-#include "errno.h"
-
-#ifdef ACPI_ASL_COMPILER
-#include "aslcompiler.h"
-#endif
-
-#define _COMPONENT          ACPI_CA_DEBUGGER
-ACPI_MODULE_NAME("utfileio")
-
-#ifdef ACPI_APPLICATION
-/* Local prototypes */
-static acpi_status
-acpi_ut_check_text_mode_corruption(u8 *table,
-                                  u32 table_length, u32 file_length);
-
-static acpi_status
-acpi_ut_read_table(FILE * fp,
-                  struct acpi_table_header **table, u32 *table_length);
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_check_text_mode_corruption
- *
- * PARAMETERS:  table           - Table buffer
- *              table_length    - Length of table from the table header
- *              file_length     - Length of the file that contains the table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Check table for text mode file corruption where all linefeed
- *              characters (LF) have been replaced by carriage return linefeed
- *              pairs (CR/LF).
- *
- ******************************************************************************/
-
-static acpi_status
-acpi_ut_check_text_mode_corruption(u8 *table, u32 table_length, u32 file_length)
-{
-       u32 i;
-       u32 pairs = 0;
-
-       if (table_length != file_length) {
-               ACPI_WARNING((AE_INFO,
-                             "File length (0x%X) is not the same as the table length (0x%X)",
-                             file_length, table_length));
-       }
-
-       /* Scan entire table to determine if each LF has been prefixed with a CR */
-
-       for (i = 1; i < file_length; i++) {
-               if (table[i] == 0x0A) {
-                       if (table[i - 1] != 0x0D) {
-
-                               /* The LF does not have a preceding CR, table not corrupted */
-
-                               return (AE_OK);
-                       } else {
-                               /* Found a CR/LF pair */
-
-                               pairs++;
-                       }
-                       i++;
-               }
-       }
-
-       if (!pairs) {
-               return (AE_OK);
-       }
-
-       /*
-        * Entire table scanned, each CR is part of a CR/LF pair --
-        * meaning that the table was treated as a text file somewhere.
-        *
-        * NOTE: We can't "fix" the table, because any existing CR/LF pairs in the
-        * original table are left untouched by the text conversion process --
-        * meaning that we cannot simply replace CR/LF pairs with LFs.
-        */
-       acpi_os_printf("Table has been corrupted by text mode conversion\n");
-       acpi_os_printf("All LFs (%u) were changed to CR/LF pairs\n", pairs);
-       acpi_os_printf("Table cannot be repaired!\n");
-       return (AE_BAD_VALUE);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_read_table
- *
- * PARAMETERS:  fp              - File that contains table
- *              table           - Return value, buffer with table
- *              table_length    - Return value, length of table
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Load the DSDT from the file pointer
- *
- ******************************************************************************/
-
-static acpi_status
-acpi_ut_read_table(FILE * fp,
-                  struct acpi_table_header **table, u32 *table_length)
-{
-       struct acpi_table_header table_header;
-       u32 actual;
-       acpi_status status;
-       u32 file_size;
-       u8 standard_header = TRUE;
-       s32 count;
-
-       /* Get the file size */
-
-       file_size = cm_get_file_size(fp);
-       if (file_size == ACPI_UINT32_MAX) {
-               return (AE_ERROR);
-       }
-
-       if (file_size < 4) {
-               return (AE_BAD_HEADER);
-       }
-
-       /* Read the signature */
-
-       fseek(fp, 0, SEEK_SET);
-
-       count = fread(&table_header, 1, sizeof(struct acpi_table_header), fp);
-       if (count != sizeof(struct acpi_table_header)) {
-               acpi_os_printf("Could not read the table header\n");
-               return (AE_BAD_HEADER);
-       }
-
-       /* The RSDP table does not have standard ACPI header */
-
-       if (ACPI_VALIDATE_RSDP_SIG(table_header.signature)) {
-               *table_length = file_size;
-               standard_header = FALSE;
-       } else {
-
-#if 0
-               /* Validate the table header/length */
-
-               status = acpi_tb_validate_table_header(&table_header);
-               if (ACPI_FAILURE(status)) {
-                       acpi_os_printf("Table header is invalid!\n");
-                       return (status);
-               }
-#endif
-
-               /* File size must be at least as long as the Header-specified length */
-
-               if (table_header.length > file_size) {
-                       acpi_os_printf
-                           ("TableHeader length [0x%X] greater than the input file size [0x%X]\n",
-                            table_header.length, file_size);
-
-#ifdef ACPI_ASL_COMPILER
-                       acpi_os_printf("File is corrupt or is ASCII text -- "
-                                      "it must be a binary file\n");
-#endif
-                       return (AE_BAD_HEADER);
-               }
-#ifdef ACPI_OBSOLETE_CODE
-               /* We only support a limited number of table types */
-
-               if (!ACPI_COMPARE_NAME
-                   ((char *)table_header.signature, ACPI_SIG_DSDT)
-                   && !ACPI_COMPARE_NAME((char *)table_header.signature,
-                                         ACPI_SIG_PSDT)
-                   && !ACPI_COMPARE_NAME((char *)table_header.signature,
-                                         ACPI_SIG_SSDT)) {
-                       acpi_os_printf
-                           ("Table signature [%4.4s] is invalid or not supported\n",
-                            (char *)table_header.signature);
-                       ACPI_DUMP_BUFFER(&table_header,
-                                        sizeof(struct acpi_table_header));
-                       return (AE_ERROR);
-               }
-#endif
-
-               *table_length = table_header.length;
-       }
-
-       /* Allocate a buffer for the table */
-
-       *table = acpi_os_allocate((size_t) file_size);
-       if (!*table) {
-               acpi_os_printf
-                   ("Could not allocate memory for ACPI table %4.4s (size=0x%X)\n",
-                    table_header.signature, *table_length);
-               return (AE_NO_MEMORY);
-       }
-
-       /* Get the rest of the table */
-
-       fseek(fp, 0, SEEK_SET);
-       actual = fread(*table, 1, (size_t) file_size, fp);
-       if (actual == file_size) {
-               if (standard_header) {
-
-                       /* Now validate the checksum */
-
-                       status = acpi_tb_verify_checksum((void *)*table,
-                                                        ACPI_CAST_PTR(struct
-                                                                      acpi_table_header,
-                                                                      *table)->
-                                                        length);
-
-                       if (status == AE_BAD_CHECKSUM) {
-                               status =
-                                   acpi_ut_check_text_mode_corruption((u8 *)
-                                                                      *table,
-                                                                      file_size,
-                                                                      (*table)->
-                                                                      length);
-                               return (status);
-                       }
-               }
-               return (AE_OK);
-       }
-
-       if (actual > 0) {
-               acpi_os_printf("Warning - reading table, asked for %X got %X\n",
-                              file_size, actual);
-               return (AE_OK);
-       }
-
-       acpi_os_printf("Error - could not read the table file\n");
-       acpi_os_free(*table);
-       *table = NULL;
-       *table_length = 0;
-       return (AE_ERROR);
-}
-
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_read_table_from_file
- *
- * PARAMETERS:  filename         - File where table is located
- *              table            - Where a pointer to the table is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Get an ACPI table from a file
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_read_table_from_file(char *filename, struct acpi_table_header ** table)
-{
-       FILE *file;
-       u32 file_size;
-       u32 table_length;
-       acpi_status status = AE_ERROR;
-
-       /* Open the file, get current size */
-
-       file = fopen(filename, "rb");
-       if (!file) {
-               perror("Could not open input file");
-
-               if (errno == ENOENT) {
-                       return (AE_NOT_EXIST);
-               }
-
-               return (status);
-       }
-
-       file_size = cm_get_file_size(file);
-       if (file_size == ACPI_UINT32_MAX) {
-               goto exit;
-       }
-
-       /* Get the entire file */
-
-       fprintf(stderr,
-               "Reading ACPI table from file %12s - Length %.8u (0x%06X)\n",
-               filename, file_size, file_size);
-
-       status = acpi_ut_read_table(file, table, &table_length);
-       if (ACPI_FAILURE(status)) {
-               acpi_os_printf("Could not get table from the file\n");
-       }
-
-exit:
-       fclose(file);
-       return (status);
-}
-
-#endif
index fda8b3d..8ad086e 100644 (file)
@@ -48,7 +48,7 @@
 ACPI_MODULE_NAME("uthex")
 
 /* Hex to ASCII conversion table */
-static char acpi_gbl_hex_to_ascii[] = {
+static const char acpi_gbl_hex_to_ascii[] = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
            'E', 'F'
 };
index 7956df1..05ee76e 100644 (file)
@@ -125,73 +125,6 @@ cleanup:
        return_ACPI_STATUS(status);
 }
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_execute_SUB
- *
- * PARAMETERS:  device_node         - Node for the device
- *              return_id           - Where the _SUB is returned
- *
- * RETURN:      Status
- *
- * DESCRIPTION: Executes the _SUB control method that returns the subsystem
- *              ID of the device. The _SUB value is always a string containing
- *              either a valid PNP or ACPI ID.
- *
- *              NOTE: Internal function, no parameter validation
- *
- ******************************************************************************/
-
-acpi_status
-acpi_ut_execute_SUB(struct acpi_namespace_node *device_node,
-                   struct acpi_pnp_device_id **return_id)
-{
-       union acpi_operand_object *obj_desc;
-       struct acpi_pnp_device_id *sub;
-       u32 length;
-       acpi_status status;
-
-       ACPI_FUNCTION_TRACE(ut_execute_SUB);
-
-       status = acpi_ut_evaluate_object(device_node, METHOD_NAME__SUB,
-                                        ACPI_BTYPE_STRING, &obj_desc);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       /* Get the size of the String to be returned, includes null terminator */
-
-       length = obj_desc->string.length + 1;
-
-       /* Allocate a buffer for the SUB */
-
-       sub =
-           ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_pnp_device_id) +
-                                (acpi_size) length);
-       if (!sub) {
-               status = AE_NO_MEMORY;
-               goto cleanup;
-       }
-
-       /* Area for the string starts after PNP_DEVICE_ID struct */
-
-       sub->string =
-           ACPI_ADD_PTR(char, sub, sizeof(struct acpi_pnp_device_id));
-
-       /* Simply copy existing string */
-
-       strcpy(sub->string, obj_desc->string.pointer);
-       sub->length = length;
-       *return_id = sub;
-
-cleanup:
-
-       /* On exit, we must delete the return object */
-
-       acpi_ut_remove_reference(obj_desc);
-       return_ACPI_STATUS(status);
-}
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_execute_UID
index ccd0745..fd82a12 100644 (file)
@@ -206,7 +206,6 @@ acpi_status acpi_ut_init_globals(void)
        acpi_gbl_next_owner_id_offset = 0;
        acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
        acpi_gbl_osi_mutex = NULL;
-       acpi_gbl_reg_methods_executed = FALSE;
        acpi_gbl_max_loop_iterations = 0xFFFF;
 
        /* Hardware oriented */
index f9ff100..58b5d42 100644 (file)
@@ -111,6 +111,7 @@ acpi_ut_short_divide(u64 dividend,
         */
        ACPI_DIV_64_BY_32(0, dividend_ovl.part.hi, divisor,
                          quotient.part.hi, remainder32);
+
        ACPI_DIV_64_BY_32(remainder32, dividend_ovl.part.lo, divisor,
                          quotient.part.lo, remainder32);
 
@@ -179,6 +180,7 @@ acpi_ut_divide(u64 in_dividend,
                 */
                ACPI_DIV_64_BY_32(0, dividend.part.hi, divisor.part.lo,
                                  quotient.part.hi, partial1);
+
                ACPI_DIV_64_BY_32(partial1, dividend.part.lo, divisor.part.lo,
                                  quotient.part.lo, remainder.part.lo);
        }
@@ -206,12 +208,12 @@ acpi_ut_divide(u64 in_dividend,
 
                ACPI_DIV_64_BY_32(normalized_dividend.part.hi,
                                  normalized_dividend.part.lo,
-                                 normalized_divisor.part.lo,
-                                 quotient.part.lo, partial1);
+                                 normalized_divisor.part.lo, quotient.part.lo,
+                                 partial1);
 
                /*
-                * The quotient is always 32 bits, and simply requires adjustment.
-                * The 64-bit remainder must be generated.
+                * The quotient is always 32 bits, and simply requires
+                * adjustment. The 64-bit remainder must be generated.
                 */
                partial1 = quotient.part.lo * divisor.part.hi;
                partial2.full = (u64) quotient.part.lo * divisor.part.lo;
index bd4443b..eab1cfe 100644 (file)
@@ -264,8 +264,8 @@ acpi_ut_walk_package_tree(union acpi_operand_object *source_object,
                 */
                if ((!this_source_obj) ||
                    (ACPI_GET_DESCRIPTOR_TYPE(this_source_obj) !=
-                    ACPI_DESC_TYPE_OPERAND)
-                   || (this_source_obj->common.type != ACPI_TYPE_PACKAGE)) {
+                    ACPI_DESC_TYPE_OPERAND) ||
+                   (this_source_obj->common.type != ACPI_TYPE_PACKAGE)) {
                        status =
                            walk_callback(ACPI_COPY_TYPE_SIMPLE,
                                          this_source_obj, state, context);
@@ -318,9 +318,10 @@ acpi_ut_walk_package_tree(union acpi_operand_object *source_object,
                         * The callback above returned a new target package object.
                         */
                        acpi_ut_push_generic_state(&state_list, state);
-                       state = acpi_ut_create_pkg_state(this_source_obj,
-                                                        state->pkg.
-                                                        this_target_obj, 0);
+                       state =
+                           acpi_ut_create_pkg_state(this_source_obj,
+                                                    state->pkg.this_target_obj,
+                                                    0);
                        if (!state) {
 
                                /* Free any stacked Update State objects */
index ce406e3..038ff84 100644 (file)
@@ -111,17 +111,6 @@ acpi_status acpi_ut_mutex_initialize(void)
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
-#ifdef ACPI_DEBUGGER
-
-       /* Debugger Support */
-
-       status = acpi_os_create_mutex(&acpi_gbl_db_command_ready);
-       if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
-       }
-
-       status = acpi_os_create_mutex(&acpi_gbl_db_command_complete);
-#endif
 
        return_ACPI_STATUS(status);
 }
@@ -162,12 +151,6 @@ void acpi_ut_mutex_terminate(void)
        /* Delete the reader/writer lock */
 
        acpi_ut_delete_rw_lock(&acpi_gbl_namespace_rw_lock);
-
-#ifdef ACPI_DEBUGGER
-       acpi_os_delete_mutex(acpi_gbl_db_command_ready);
-       acpi_os_delete_mutex(acpi_gbl_db_command_complete);
-#endif
-
        return_VOID;
 }
 
@@ -290,8 +273,9 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id)
                          (u32)this_thread_id,
                          acpi_ut_get_mutex_name(mutex_id)));
 
-       status = acpi_os_acquire_mutex(acpi_gbl_mutex_info[mutex_id].mutex,
-                                      ACPI_WAIT_FOREVER);
+       status =
+           acpi_os_acquire_mutex(acpi_gbl_mutex_info[mutex_id].mutex,
+                                 ACPI_WAIT_FOREVER);
        if (ACPI_SUCCESS(status)) {
                ACPI_DEBUG_PRINT((ACPI_DB_MUTEX,
                                  "Thread %u acquired Mutex [%s]\n",
index 1d5f6b1..9c3cadc 100644 (file)
@@ -282,8 +282,8 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
 
                /* Divide the digit into the correct position */
 
-               (void)acpi_ut_short_divide((dividend - (u64)this_digit),
-                                          base, &quotient, NULL);
+               (void)acpi_ut_short_divide((dividend - (u64)this_digit), base,
+                                          &quotient, NULL);
 
                if (return_value > quotient) {
                        if (to_integer_op) {
index 7d83efe..787eccf 100644 (file)
@@ -112,9 +112,9 @@ union acpi_operand_object *acpi_ut_create_internal_object_dbg(const char
 
                /* These types require a secondary object */
 
-               second_object = acpi_ut_allocate_object_desc_dbg(module_name,
-                                                                line_number,
-                                                                component_id);
+               second_object =
+                   acpi_ut_allocate_object_desc_dbg(module_name, line_number,
+                                                    component_id);
                if (!second_object) {
                        acpi_ut_delete_object_desc(object);
                        return_PTR(NULL);
@@ -253,7 +253,8 @@ union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size)
                buffer = ACPI_ALLOCATE_ZEROED(buffer_size);
                if (!buffer) {
                        ACPI_ERROR((AE_INFO, "Could not allocate size %u",
-                                   (u32) buffer_size));
+                                   (u32)buffer_size));
+
                        acpi_ut_remove_reference(buffer_desc);
                        return_PTR(NULL);
                }
@@ -305,7 +306,8 @@ union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size)
        string = ACPI_ALLOCATE_ZEROED(string_size + 1);
        if (!string) {
                ACPI_ERROR((AE_INFO, "Could not allocate size %u",
-                           (u32) string_size));
+                           (u32)string_size));
+
                acpi_ut_remove_reference(string_desc);
                return_PTR(NULL);
        }
@@ -649,8 +651,9 @@ acpi_ut_get_package_object_size(union acpi_operand_object *internal_object,
        info.object_space = 0;
        info.num_packages = 1;
 
-       status = acpi_ut_walk_package_tree(internal_object, NULL,
-                                          acpi_ut_get_element_length, &info);
+       status =
+           acpi_ut_walk_package_tree(internal_object, NULL,
+                                     acpi_ut_get_element_length, &info);
        if (ACPI_FAILURE(status)) {
                return_ACPI_STATUS(status);
        }
@@ -660,7 +663,8 @@ acpi_ut_get_package_object_size(union acpi_operand_object *internal_object,
         * just add the length of the package objects themselves.
         * Round up to the next machine word.
         */
-       info.length += ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)) *
+       info.length +=
+           ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)) *
            (acpi_size) info.num_packages;
 
        /* Return the total package length */
@@ -692,8 +696,8 @@ acpi_ut_get_object_size(union acpi_operand_object *internal_object,
        ACPI_FUNCTION_ENTRY();
 
        if ((ACPI_GET_DESCRIPTOR_TYPE(internal_object) ==
-            ACPI_DESC_TYPE_OPERAND)
-           && (internal_object->common.type == ACPI_TYPE_PACKAGE)) {
+            ACPI_DESC_TYPE_OPERAND) &&
+           (internal_object->common.type == ACPI_TYPE_PACKAGE)) {
                status =
                    acpi_ut_get_package_object_size(internal_object,
                                                    obj_length);
index 8f3d203..0809d73 100644 (file)
@@ -269,9 +269,10 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name)
        previous_interface = next_interface = acpi_gbl_supported_interfaces;
        while (next_interface) {
                if (!strcmp(interface_name, next_interface->name)) {
-
-                       /* Found: name is in either the static list or was added at runtime */
-
+                       /*
+                        * Found: name is in either the static list
+                        * or was added at runtime
+                        */
                        if (next_interface->flags & ACPI_OSI_DYNAMIC) {
 
                                /* Interface was added dynamically, remove and free it */
@@ -288,8 +289,8 @@ acpi_status acpi_ut_remove_interface(acpi_string interface_name)
                                ACPI_FREE(next_interface);
                        } else {
                                /*
-                                * Interface is in static list. If marked invalid, then it
-                                * does not actually exist. Else, mark it invalid.
+                                * Interface is in static list. If marked invalid, then
+                                * it does not actually exist. Else, mark it invalid.
                                 */
                                if (next_interface->flags & ACPI_OSI_INVALID) {
                                        return (AE_NOT_EXIST);
index 2959217..ebb811c 100644 (file)
@@ -73,8 +73,8 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
        /* Guard against multiple allocations of ID to the same location */
 
        if (*owner_id) {
-               ACPI_ERROR((AE_INFO, "Owner ID [0x%2.2X] already exists",
-                           *owner_id));
+               ACPI_ERROR((AE_INFO,
+                           "Owner ID [0x%2.2X] already exists", *owner_id));
                return_ACPI_STATUS(AE_ALREADY_EXISTS);
        }
 
@@ -87,8 +87,8 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
 
        /*
         * Find a free owner ID, cycle through all possible IDs on repeated
-        * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
-        * to be scanned twice.
+        * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index
+        * may have to be scanned twice.
         */
        for (i = 0, j = acpi_gbl_last_owner_id_index;
             i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
@@ -141,8 +141,8 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
         * they are released when a table is unloaded or a method completes
         * execution.
         *
-        * If this error happens, there may be very deep nesting of invoked control
-        * methods, or there may be a bug where the IDs are not released.
+        * If this error happens, there may be very deep nesting of invoked
+        * control methods, or there may be a bug where the IDs are not released.
         */
        status = AE_OWNER_ID_LIMIT;
        ACPI_ERROR((AE_INFO,
index 97898ed..9f8e415 100644 (file)
@@ -225,8 +225,10 @@ const union acpi_predefined_info *acpi_ut_match_resource_name(char *name)
 {
        const union acpi_predefined_info *this_name;
 
-       /* Quick check for a predefined name, first character must be underscore */
-
+       /*
+        * Quick check for a predefined name, first character must
+        * be underscore
+        */
        if (name[0] != '_') {
                return (NULL);
        }
index b26297c..01f04da 100644 (file)
@@ -314,8 +314,9 @@ static char *acpi_ut_format_number(char *string,
        if (need_prefix) {
                string = acpi_ut_bound_string_output(string, end, '0');
                if (base == 16) {
-                       string = acpi_ut_bound_string_output(string, end,
-                                                            upper ? 'X' : 'x');
+                       string =
+                           acpi_ut_bound_string_output(string, end,
+                                                       upper ? 'X' : 'x');
                }
        }
        if (!(type & ACPI_FORMAT_LEFT)) {
@@ -400,6 +401,7 @@ acpi_ut_vsnprintf(char *string,
                        } else {
                                break;
                        }
+
                } while (1);
 
                /* Process width */
@@ -429,6 +431,7 @@ acpi_ut_vsnprintf(char *string,
                                ++format;
                                precision = va_arg(args, int);
                        }
+
                        if (precision < 0) {
                                precision = 0;
                        }
@@ -488,10 +491,12 @@ acpi_ut_vsnprintf(char *string,
                                                                        ' ');
                                }
                        }
+
                        for (i = 0; i < length; ++i) {
                                pos = acpi_ut_bound_string_output(pos, end, *s);
                                ++s;
                        }
+
                        while (length < width--) {
                                pos =
                                    acpi_ut_bound_string_output(pos, end, ' ');
@@ -529,9 +534,9 @@ acpi_ut_vsnprintf(char *string,
                        }
 
                        p = va_arg(args, void *);
-                       pos = acpi_ut_format_number(pos, end,
-                                                   ACPI_TO_INTEGER(p), 16,
-                                                   width, precision, type);
+                       pos =
+                           acpi_ut_format_number(pos, end, ACPI_TO_INTEGER(p),
+                                                 16, width, precision, type);
                        continue;
 
                default:
index b3505db..d50b41c 100644 (file)
@@ -441,8 +441,8 @@ acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
                    acpi_ut_validate_resource(walk_state, aml, &resource_index);
                if (ACPI_FAILURE(status)) {
                        /*
-                        * Exit on failure. Cannot continue because the descriptor length
-                        * may be bogus also.
+                        * Exit on failure. Cannot continue because the descriptor
+                        * length may be bogus also.
                         */
                        return_ACPI_STATUS(status);
                }
@@ -568,8 +568,8 @@ acpi_ut_validate_resource(struct acpi_walk_state *walk_state,
        }
 
        /*
-        * Check validity of the resource type, via acpi_gbl_resource_types. Zero
-        * indicates an invalid resource.
+        * Check validity of the resource type, via acpi_gbl_resource_types.
+        * Zero indicates an invalid resource.
         */
        if (!acpi_gbl_resource_types[resource_index]) {
                goto invalid_resource;
index f201171..0050e00 100644 (file)
@@ -246,6 +246,7 @@ union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object,
        state->pkg.dest_object = external_object;
        state->pkg.index = index;
        state->pkg.num_packages = 1;
+
        return (state);
 }
 
@@ -279,6 +280,7 @@ union acpi_generic_state *acpi_ut_create_control_state(void)
 
        state->common.descriptor_type = ACPI_DESC_TYPE_STATE_CONTROL;
        state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING;
+
        return (state);
 }
 
@@ -304,5 +306,6 @@ void acpi_ut_delete_generic_state(union acpi_generic_state *state)
        if (state) {
                (void)acpi_os_release_object(acpi_gbl_state_cache, state);
        }
+
        return;
 }
index 4ddd105..958b2f7 100644 (file)
@@ -135,6 +135,7 @@ void acpi_ut_print_string(char *string, u16 max_length)
                        break;
                }
        }
+
        acpi_os_printf("\"");
 
        if (i == max_length && string[i]) {
@@ -239,6 +240,14 @@ void acpi_ut_repair_name(char *name)
 
        ACPI_FUNCTION_NAME(ut_repair_name);
 
+       /*
+        * Special case for the root node. This can happen if we get an
+        * error during the execution of module-level code.
+        */
+       if (ACPI_COMPARE_NAME(name, "\\___")) {
+               return;
+       }
+
        ACPI_MOVE_NAME(&original_name, name);
 
        /* Check each character in the name */
index 9a7dc81..ea698e9 100644 (file)
@@ -150,9 +150,9 @@ void *acpi_ut_allocate_and_track(acpi_size size,
                return (NULL);
        }
 
-       status = acpi_ut_track_allocation(allocation, size,
-                                         ACPI_MEM_MALLOC, component, module,
-                                         line);
+       status =
+           acpi_ut_track_allocation(allocation, size, ACPI_MEM_MALLOC,
+                                    component, module, line);
        if (ACPI_FAILURE(status)) {
                acpi_os_free(allocation);
                return (NULL);
@@ -161,6 +161,7 @@ void *acpi_ut_allocate_and_track(acpi_size size,
        acpi_gbl_global_list->total_allocated++;
        acpi_gbl_global_list->total_size += (u32)size;
        acpi_gbl_global_list->current_total_size += (u32)size;
+
        if (acpi_gbl_global_list->current_total_size >
            acpi_gbl_global_list->max_occupied) {
                acpi_gbl_global_list->max_occupied =
@@ -223,6 +224,7 @@ void *acpi_ut_allocate_zeroed_and_track(acpi_size size,
        acpi_gbl_global_list->total_allocated++;
        acpi_gbl_global_list->total_size += (u32)size;
        acpi_gbl_global_list->current_total_size += (u32)size;
+
        if (acpi_gbl_global_list->current_total_size >
            acpi_gbl_global_list->max_occupied) {
                acpi_gbl_global_list->max_occupied =
@@ -269,8 +271,8 @@ acpi_ut_free_and_track(void *allocation,
        acpi_gbl_global_list->total_freed++;
        acpi_gbl_global_list->current_total_size -= debug_block->size;
 
-       status = acpi_ut_remove_allocation(debug_block,
-                                          component, module, line);
+       status =
+           acpi_ut_remove_allocation(debug_block, component, module, line);
        if (ACPI_FAILURE(status)) {
                ACPI_EXCEPTION((AE_INFO, status, "Could not free memory"));
        }
@@ -525,35 +527,35 @@ void acpi_ut_dump_allocation_info(void)
 
 /*
        ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
-                         ("%30s: %4d (%3d Kb)\n", "Current allocations",
-                         mem_list->current_count,
-                         ROUND_UP_TO_1K (mem_list->current_size)));
+               ("%30s: %4d (%3d Kb)\n", "Current allocations",
+               mem_list->current_count,
+               ROUND_UP_TO_1K (mem_list->current_size)));
 
        ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
-                         ("%30s: %4d (%3d Kb)\n", "Max concurrent allocations",
-                         mem_list->max_concurrent_count,
-                         ROUND_UP_TO_1K (mem_list->max_concurrent_size)));
+               ("%30s: %4d (%3d Kb)\n", "Max concurrent allocations",
+               mem_list->max_concurrent_count,
+               ROUND_UP_TO_1K (mem_list->max_concurrent_size)));
 
        ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
-                         ("%30s: %4d (%3d Kb)\n", "Total (all) internal objects",
-                         running_object_count,
-                         ROUND_UP_TO_1K (running_object_size)));
+               ("%30s: %4d (%3d Kb)\n", "Total (all) internal objects",
+               running_object_count,
+               ROUND_UP_TO_1K (running_object_size)));
 
        ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
-                         ("%30s: %4d (%3d Kb)\n", "Total (all) allocations",
-                         running_alloc_count,
-                         ROUND_UP_TO_1K (running_alloc_size)));
+               ("%30s: %4d (%3d Kb)\n", "Total (all) allocations",
+               running_alloc_count,
+               ROUND_UP_TO_1K (running_alloc_size)));
 
        ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
-                         ("%30s: %4d (%3d Kb)\n", "Current Nodes",
-                         acpi_gbl_current_node_count,
-                         ROUND_UP_TO_1K (acpi_gbl_current_node_size)));
+               ("%30s: %4d (%3d Kb)\n", "Current Nodes",
+               acpi_gbl_current_node_count,
+               ROUND_UP_TO_1K (acpi_gbl_current_node_size)));
 
        ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
-                         ("%30s: %4d (%3d Kb)\n", "Max Nodes",
-                         acpi_gbl_max_concurrent_node_count,
-                         ROUND_UP_TO_1K ((acpi_gbl_max_concurrent_node_count *
-                                        sizeof (struct acpi_namespace_node)))));
+               ("%30s: %4d (%3d Kb)\n", "Max Nodes",
+               acpi_gbl_max_concurrent_node_count,
+               ROUND_UP_TO_1K ((acpi_gbl_max_concurrent_node_count *
+                       sizeof (struct acpi_namespace_node)))));
 */
        return_VOID;
 }
index f9c8f9c..9f3f0a1 100644 (file)
@@ -154,7 +154,6 @@ acpi_status acpi_get_system_info(struct acpi_buffer * out_buffer)
         * Populate the return buffer
         */
        info_ptr = (struct acpi_system_info *)out_buffer->pointer;
-
        info_ptr->acpi_ca_version = ACPI_CA_VERSION;
 
        /* System flags (ACPI capabilities) */
@@ -216,7 +215,6 @@ acpi_status acpi_get_statistics(struct acpi_statistics *stats)
        /* Other counters */
 
        stats->method_count = acpi_method_count;
-
        return_ACPI_STATUS(AE_OK);
 }
 
index 98d5787..f6cbaf4 100644 (file)
@@ -117,6 +117,7 @@ acpi_exception(const char *module_name,
                acpi_os_printf(ACPI_MSG_EXCEPTION "%s, ",
                               acpi_format_exception(status));
        }
+
        va_start(arg_list, format);
        acpi_os_vprintf(format, arg_list);
        ACPI_MSG_SUFFIX;
index a7137ec..e38facd 100644 (file)
@@ -147,6 +147,28 @@ acpi_status __init acpi_enable_subsystem(u32 flags)
 
        ACPI_FUNCTION_TRACE(acpi_enable_subsystem);
 
+       /*
+        * The early initialization phase is complete. The namespace is loaded,
+        * and we can now support address spaces other than Memory, I/O, and
+        * PCI_Config.
+        */
+       acpi_gbl_early_initialization = FALSE;
+
+       /*
+        * Install the default operation region handlers. These are the
+        * handlers that are defined by the ACPI specification to be
+        * "always accessible" -- namely, system_memory, system_IO, and
+        * PCI_Config. This also means that no _REG methods need to be
+        * run for these address spaces. We need to have these handlers
+        * installed before any AML code can be executed, especially any
+        * module-level code (11/2015).
+        */
+       status = acpi_ev_install_region_handlers();
+       if (ACPI_FAILURE(status)) {
+               ACPI_EXCEPTION((AE_INFO, status,
+                               "During Region initialization"));
+               return_ACPI_STATUS(status);
+       }
 #if (!ACPI_REDUCED_HARDWARE)
 
        /* Enable ACPI mode */
@@ -175,23 +197,7 @@ acpi_status __init acpi_enable_subsystem(u32 flags)
                        return_ACPI_STATUS(status);
                }
        }
-#endif                         /* !ACPI_REDUCED_HARDWARE */
-
-       /*
-        * Install the default op_region handlers. These are installed unless
-        * other handlers have already been installed via the
-        * install_address_space_handler interface.
-        */
-       if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
-               ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
-                                 "[Init] Installing default address space handlers\n"));
 
-               status = acpi_ev_install_region_handlers();
-               if (ACPI_FAILURE(status)) {
-                       return_ACPI_STATUS(status);
-               }
-       }
-#if (!ACPI_REDUCED_HARDWARE)
        /*
         * Initialize ACPI Event handling (Fixed and General Purpose)
         *
@@ -261,6 +267,7 @@ acpi_status __init acpi_initialize_objects(u32 flags)
         * initialized, even if they contain executable AML (see the call to
         * acpi_ns_initialize_objects below).
         */
+       acpi_gbl_reg_methods_enabled = TRUE;
        if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
                ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
                                  "[Init] Executing _REG OpRegion methods\n"));
@@ -285,8 +292,14 @@ acpi_status __init acpi_initialize_objects(u32 flags)
         * outside of any control method is wrapped with a temporary control
         * method object and placed on a global list. The methods on this list
         * are executed below.
+        *
+        * This case executes the module-level code for all tables only after
+        * all of the tables have been loaded. It is a legacy option and is
+        * not compatible with other ACPI implementations. See acpi_ns_load_table.
         */
-       acpi_ns_exec_module_code_list();
+       if (acpi_gbl_group_module_level_code) {
+               acpi_ns_exec_module_code_list();
+       }
 
        /*
         * Initialize the objects that remain uninitialized. This runs the
index f2606af..95d6123 100644 (file)
@@ -89,9 +89,9 @@ acpi_ut_get_mutex_object(acpi_handle handle,
 
        mutex_node = handle;
        if (pathname != NULL) {
-               status = acpi_get_handle(handle, pathname,
-                                        ACPI_CAST_PTR(acpi_handle,
-                                                      &mutex_node));
+               status =
+                   acpi_get_handle(handle, pathname,
+                                   ACPI_CAST_PTR(acpi_handle, &mutex_node));
                if (ACPI_FAILURE(status)) {
                        return (status);
                }
index fcfdf6c..891c42d 100644 (file)
@@ -1095,6 +1095,7 @@ static int __init acpi_init(void)
        acpi_debugfs_init();
        acpi_sleep_proc_init();
        acpi_wakeup_device_init();
+       acpi_debugger_init();
        return 0;
 }
 
index 707cf62..b9afb47 100644 (file)
@@ -104,7 +104,7 @@ static void acpi_expose_nondev_subnodes(struct kobject *kobj,
 
                init_completion(&dn->kobj_done);
                ret = kobject_init_and_add(&dn->kobj, &acpi_data_node_ktype,
-                                          kobj, dn->name);
+                                          kobj, "%s", dn->name);
                if (ret)
                        acpi_handle_err(dn->handle, "Failed to expose (%d)\n", ret);
                else
index 11d87bf..1e6833a 100644 (file)
@@ -86,6 +86,14 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
 #define ACPI_STA_DEFAULT (ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | \
                          ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING)
 
+extern struct list_head acpi_bus_id_list;
+
+struct acpi_device_bus_id {
+       char bus_id[15];
+       unsigned int instance_no;
+       struct list_head node;
+};
+
 int acpi_device_add(struct acpi_device *device,
                    void (*release)(struct device *));
 void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
index 32d684a..67da6fb 100644 (file)
@@ -220,6 +220,7 @@ void acpi_os_printf(const char *fmt, ...)
        acpi_os_vprintf(fmt, args);
        va_end(args);
 }
+EXPORT_SYMBOL(acpi_os_printf);
 
 void acpi_os_vprintf(const char *fmt, va_list args)
 {
@@ -234,7 +235,8 @@ void acpi_os_vprintf(const char *fmt, va_list args)
                printk(KERN_CONT "%s", buffer);
        }
 #else
-       printk(KERN_CONT "%s", buffer);
+       if (acpi_debugger_write_log(buffer) < 0)
+               printk(KERN_CONT "%s", buffer);
 #endif
 }
 
@@ -364,6 +366,19 @@ static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr)
                iounmap(vaddr);
 }
 
+/**
+ * acpi_os_map_iomem - Get a virtual address for a given physical address range.
+ * @phys: Start of the physical address range to map.
+ * @size: Size of the physical address range to map.
+ *
+ * Look up the given physical address range in the list of existing ACPI memory
+ * mappings.  If found, get a reference to it and return a pointer to it (its
+ * virtual address).  If not found, map it, add it to that list and return a
+ * pointer to it.
+ *
+ * During early init (when acpi_gbl_permanent_mmap has not been set yet) this
+ * routine simply calls __acpi_map_table() to get the job done.
+ */
 void __iomem *__init_refok
 acpi_os_map_iomem(acpi_physical_address phys, acpi_size size)
 {
@@ -439,6 +454,20 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map)
        }
 }
 
+/**
+ * acpi_os_unmap_iomem - Drop a memory mapping reference.
+ * @virt: Start of the address range to drop a reference to.
+ * @size: Size of the address range to drop a reference to.
+ *
+ * Look up the given virtual address range in the list of existing ACPI memory
+ * mappings, drop a reference to it and unmap it if there are no more active
+ * references to it.
+ *
+ * During early init (when acpi_gbl_permanent_mmap has not been set yet) this
+ * routine simply calls __acpi_unmap_table() to get the job done.  Since
+ * __acpi_unmap_table() is an __init function, the __ref annotation is needed
+ * here.
+ */
 void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
 {
        struct acpi_ioremap *map;
@@ -1101,6 +1130,200 @@ static void acpi_os_execute_deferred(struct work_struct *work)
        kfree(dpc);
 }
 
+#ifdef CONFIG_ACPI_DEBUGGER
+static struct acpi_debugger acpi_debugger;
+static bool acpi_debugger_initialized;
+
+int acpi_register_debugger(struct module *owner,
+                          const struct acpi_debugger_ops *ops)
+{
+       int ret = 0;
+
+       mutex_lock(&acpi_debugger.lock);
+       if (acpi_debugger.ops) {
+               ret = -EBUSY;
+               goto err_lock;
+       }
+
+       acpi_debugger.owner = owner;
+       acpi_debugger.ops = ops;
+
+err_lock:
+       mutex_unlock(&acpi_debugger.lock);
+       return ret;
+}
+EXPORT_SYMBOL(acpi_register_debugger);
+
+void acpi_unregister_debugger(const struct acpi_debugger_ops *ops)
+{
+       mutex_lock(&acpi_debugger.lock);
+       if (ops == acpi_debugger.ops) {
+               acpi_debugger.ops = NULL;
+               acpi_debugger.owner = NULL;
+       }
+       mutex_unlock(&acpi_debugger.lock);
+}
+EXPORT_SYMBOL(acpi_unregister_debugger);
+
+int acpi_debugger_create_thread(acpi_osd_exec_callback function, void *context)
+{
+       int ret;
+       int (*func)(acpi_osd_exec_callback, void *);
+       struct module *owner;
+
+       if (!acpi_debugger_initialized)
+               return -ENODEV;
+       mutex_lock(&acpi_debugger.lock);
+       if (!acpi_debugger.ops) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       if (!try_module_get(acpi_debugger.owner)) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       func = acpi_debugger.ops->create_thread;
+       owner = acpi_debugger.owner;
+       mutex_unlock(&acpi_debugger.lock);
+
+       ret = func(function, context);
+
+       mutex_lock(&acpi_debugger.lock);
+       module_put(owner);
+err_lock:
+       mutex_unlock(&acpi_debugger.lock);
+       return ret;
+}
+
+ssize_t acpi_debugger_write_log(const char *msg)
+{
+       ssize_t ret;
+       ssize_t (*func)(const char *);
+       struct module *owner;
+
+       if (!acpi_debugger_initialized)
+               return -ENODEV;
+       mutex_lock(&acpi_debugger.lock);
+       if (!acpi_debugger.ops) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       if (!try_module_get(acpi_debugger.owner)) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       func = acpi_debugger.ops->write_log;
+       owner = acpi_debugger.owner;
+       mutex_unlock(&acpi_debugger.lock);
+
+       ret = func(msg);
+
+       mutex_lock(&acpi_debugger.lock);
+       module_put(owner);
+err_lock:
+       mutex_unlock(&acpi_debugger.lock);
+       return ret;
+}
+
+ssize_t acpi_debugger_read_cmd(char *buffer, size_t buffer_length)
+{
+       ssize_t ret;
+       ssize_t (*func)(char *, size_t);
+       struct module *owner;
+
+       if (!acpi_debugger_initialized)
+               return -ENODEV;
+       mutex_lock(&acpi_debugger.lock);
+       if (!acpi_debugger.ops) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       if (!try_module_get(acpi_debugger.owner)) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       func = acpi_debugger.ops->read_cmd;
+       owner = acpi_debugger.owner;
+       mutex_unlock(&acpi_debugger.lock);
+
+       ret = func(buffer, buffer_length);
+
+       mutex_lock(&acpi_debugger.lock);
+       module_put(owner);
+err_lock:
+       mutex_unlock(&acpi_debugger.lock);
+       return ret;
+}
+
+int acpi_debugger_wait_command_ready(void)
+{
+       int ret;
+       int (*func)(bool, char *, size_t);
+       struct module *owner;
+
+       if (!acpi_debugger_initialized)
+               return -ENODEV;
+       mutex_lock(&acpi_debugger.lock);
+       if (!acpi_debugger.ops) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       if (!try_module_get(acpi_debugger.owner)) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       func = acpi_debugger.ops->wait_command_ready;
+       owner = acpi_debugger.owner;
+       mutex_unlock(&acpi_debugger.lock);
+
+       ret = func(acpi_gbl_method_executing,
+                  acpi_gbl_db_line_buf, ACPI_DB_LINE_BUFFER_SIZE);
+
+       mutex_lock(&acpi_debugger.lock);
+       module_put(owner);
+err_lock:
+       mutex_unlock(&acpi_debugger.lock);
+       return ret;
+}
+
+int acpi_debugger_notify_command_complete(void)
+{
+       int ret;
+       int (*func)(void);
+       struct module *owner;
+
+       if (!acpi_debugger_initialized)
+               return -ENODEV;
+       mutex_lock(&acpi_debugger.lock);
+       if (!acpi_debugger.ops) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       if (!try_module_get(acpi_debugger.owner)) {
+               ret = -ENODEV;
+               goto err_lock;
+       }
+       func = acpi_debugger.ops->notify_command_complete;
+       owner = acpi_debugger.owner;
+       mutex_unlock(&acpi_debugger.lock);
+
+       ret = func();
+
+       mutex_lock(&acpi_debugger.lock);
+       module_put(owner);
+err_lock:
+       mutex_unlock(&acpi_debugger.lock);
+       return ret;
+}
+
+int __init acpi_debugger_init(void)
+{
+       mutex_init(&acpi_debugger.lock);
+       acpi_debugger_initialized = true;
+       return 0;
+}
+#endif
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_os_execute
@@ -1127,6 +1350,15 @@ acpi_status acpi_os_execute(acpi_execute_type type,
                          "Scheduling function [%p(%p)] for deferred execution.\n",
                          function, context));
 
+       if (type == OSL_DEBUGGER_MAIN_THREAD) {
+               ret = acpi_debugger_create_thread(function, context);
+               if (ret) {
+                       pr_err("Call to kthread_create() failed.\n");
+                       status = AE_ERROR;
+               }
+               goto out_thread;
+       }
+
        /*
         * Allocate/initialize DPC structure.  Note that this memory will be
         * freed by the callee.  The kernel handles the work_struct list  in a
@@ -1151,11 +1383,17 @@ acpi_status acpi_os_execute(acpi_execute_type type,
        if (type == OSL_NOTIFY_HANDLER) {
                queue = kacpi_notify_wq;
                INIT_WORK(&dpc->work, acpi_os_execute_deferred);
-       } else {
+       } else if (type == OSL_GPE_HANDLER) {
                queue = kacpid_wq;
                INIT_WORK(&dpc->work, acpi_os_execute_deferred);
+       } else {
+               pr_err("Unsupported os_execute type %d.\n", type);
+               status = AE_ERROR;
        }
 
+       if (ACPI_FAILURE(status))
+               goto err_workqueue;
+
        /*
         * On some machines, a software-initiated SMI causes corruption unless
         * the SMI runs on CPU 0.  An SMI can be initiated by any AML, but
@@ -1164,13 +1402,15 @@ acpi_status acpi_os_execute(acpi_execute_type type,
         * queueing on CPU 0.
         */
        ret = queue_work_on(0, queue, &dpc->work);
-
        if (!ret) {
                printk(KERN_ERR PREFIX
                          "Call to queue_work() failed.\n");
                status = AE_ERROR;
-               kfree(dpc);
        }
+err_workqueue:
+       if (ACPI_FAILURE(status))
+               kfree(dpc);
+out_thread:
        return status;
 }
 EXPORT_SYMBOL(acpi_os_execute);
@@ -1358,10 +1598,39 @@ acpi_status acpi_os_get_line(char *buffer, u32 buffer_length, u32 *bytes_read)
                chars = strlen(buffer) - 1;
                buffer[chars] = '\0';
        }
+#else
+       int ret;
+
+       ret = acpi_debugger_read_cmd(buffer, buffer_length);
+       if (ret < 0)
+               return AE_ERROR;
+       if (bytes_read)
+               *bytes_read = ret;
 #endif
 
        return AE_OK;
 }
+EXPORT_SYMBOL(acpi_os_get_line);
+
+acpi_status acpi_os_wait_command_ready(void)
+{
+       int ret;
+
+       ret = acpi_debugger_wait_command_ready();
+       if (ret < 0)
+               return AE_ERROR;
+       return AE_OK;
+}
+
+acpi_status acpi_os_notify_command_complete(void)
+{
+       int ret;
+
+       ret = acpi_debugger_notify_command_complete();
+       if (ret < 0)
+               return AE_ERROR;
+       return AE_OK;
+}
 
 acpi_status acpi_os_signal(u32 function, void *info)
 {
index f4e02ae..11154a3 100644 (file)
@@ -200,7 +200,8 @@ static int acpi_pss_perf_init(struct acpi_processor *pr,
                goto err_remove_sysfs_thermal;
        }
 
-       sysfs_remove_link(&pr->cdev->device.kobj, "device");
+       return 0;
+
  err_remove_sysfs_thermal:
        sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
  err_thermal_unregister:
index 88f4306..2aee416 100644 (file)
@@ -346,7 +346,7 @@ void acpi_free_properties(struct acpi_device *adev)
  *
  * Return: %0 if property with @name has been found (success),
  *         %-EINVAL if the arguments are invalid,
- *         %-ENODATA if the property doesn't exist,
+ *         %-EINVAL if the property doesn't exist,
  *         %-EPROTO if the property value type doesn't match @type.
  */
 static int acpi_data_get_property(struct acpi_device_data *data,
@@ -360,7 +360,7 @@ static int acpi_data_get_property(struct acpi_device_data *data,
                return -EINVAL;
 
        if (!data->pointer || !data->properties)
-               return -ENODATA;
+               return -EINVAL;
 
        properties = data->properties;
        for (i = 0; i < properties->package.count; i++) {
@@ -375,13 +375,13 @@ static int acpi_data_get_property(struct acpi_device_data *data,
                if (!strcmp(name, propname->string.pointer)) {
                        if (type != ACPI_TYPE_ANY && propvalue->type != type)
                                return -EPROTO;
-                       else if (obj)
+                       if (obj)
                                *obj = propvalue;
 
                        return 0;
                }
        }
-       return -ENODATA;
+       return -EINVAL;
 }
 
 /**
@@ -439,7 +439,7 @@ int acpi_node_prop_get(struct fwnode_handle *fwnode, const char *propname,
  *
  * Return: %0 if array property (package) with @name has been found (success),
  *         %-EINVAL if the arguments are invalid,
- *         %-ENODATA if the property doesn't exist,
+ *         %-EINVAL if the property doesn't exist,
  *         %-EPROTO if the property is not a package or the type of its elements
  *           doesn't match @type.
  */
index 78d5f02..407a376 100644 (file)
@@ -39,7 +39,7 @@ static const char *dummy_hid = "device";
 
 static LIST_HEAD(acpi_dep_list);
 static DEFINE_MUTEX(acpi_dep_list_lock);
-static LIST_HEAD(acpi_bus_id_list);
+LIST_HEAD(acpi_bus_id_list);
 static DEFINE_MUTEX(acpi_scan_lock);
 static LIST_HEAD(acpi_scan_handlers_list);
 DEFINE_MUTEX(acpi_device_lock);
@@ -52,12 +52,6 @@ struct acpi_dep_data {
        acpi_handle slave;
 };
 
-struct acpi_device_bus_id{
-       char bus_id[15];
-       unsigned int instance_no;
-       struct list_head node;
-};
-
 void acpi_scan_lock_acquire(void)
 {
        mutex_lock(&acpi_scan_lock);
@@ -471,10 +465,24 @@ static void acpi_device_release(struct device *dev)
 
 static void acpi_device_del(struct acpi_device *device)
 {
+       struct acpi_device_bus_id *acpi_device_bus_id;
+
        mutex_lock(&acpi_device_lock);
        if (device->parent)
                list_del(&device->node);
 
+       list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
+               if (!strcmp(acpi_device_bus_id->bus_id,
+                           acpi_device_hid(device))) {
+                       if (acpi_device_bus_id->instance_no > 0)
+                               acpi_device_bus_id->instance_no--;
+                       else {
+                               list_del(&acpi_device_bus_id->node);
+                               kfree(acpi_device_bus_id);
+                       }
+                       break;
+               }
+
        list_del(&device->wakeup_list);
        mutex_unlock(&acpi_device_lock);
 
@@ -1461,7 +1469,7 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type,
                *type = ACPI_BUS_TYPE_DEVICE;
                status = acpi_bus_get_status_handle(handle, sta);
                if (ACPI_FAILURE(status))
-                       return -ENODEV;
+                       *sta = 0;
                break;
        case ACPI_TYPE_PROCESSOR:
                *type = ACPI_BUS_TYPE_PROCESSOR;
index 0d94621..9cb9752 100644 (file)
@@ -61,7 +61,7 @@ static int acpi_sleep_prepare(u32 acpi_state)
        if (acpi_state == ACPI_STATE_S3) {
                if (!acpi_wakeup_address)
                        return -EFAULT;
-               acpi_set_firmware_waking_vector(acpi_wakeup_address);
+               acpi_set_waking_vector(acpi_wakeup_address);
 
        }
        ACPI_FLUSH_CPU_CACHE();
@@ -410,7 +410,7 @@ static void acpi_pm_finish(void)
        acpi_leave_sleep_state(acpi_state);
 
        /* reset firmware waking vector */
-       acpi_set_firmware_waking_vector((acpi_physical_address) 0);
+       acpi_set_waking_vector(0);
 
        acpi_target_sleep_state = ACPI_STATE_S0;
 
index c797ffa..a9cc34e 100644 (file)
@@ -6,3 +6,9 @@ extern struct list_head acpi_wakeup_device_list;
 extern struct mutex acpi_device_lock;
 
 extern void acpi_resume_power_resources(void);
+
+static inline acpi_status acpi_set_waking_vector(u32 wakeup_address)
+{
+       return acpi_set_firmware_waking_vector(
+                               (acpi_physical_address)wakeup_address, 0);
+}
index 475c907..f2f9873 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/dynamic_debug.h>
 
 #include "internal.h"
+#include "sleep.h"
 
 #define _COMPONENT             ACPI_BUS_COMPONENT
 ACPI_MODULE_NAME("utils");
@@ -709,6 +710,36 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
 }
 EXPORT_SYMBOL(acpi_check_dsm);
 
+/**
+ * acpi_dev_present - Detect presence of a given ACPI device in the system.
+ * @hid: Hardware ID of the device.
+ *
+ * Return %true if the device was present at the moment of invocation.
+ * Note that if the device is pluggable, it may since have disappeared.
+ *
+ * For this function to work, acpi_bus_scan() must have been executed
+ * which happens in the subsys_initcall() subsection. Hence, do not
+ * call from a subsys_initcall() or earlier (use acpi_get_devices()
+ * instead). Calling from module_init() is fine (which is synonymous
+ * with device_initcall()).
+ */
+bool acpi_dev_present(const char *hid)
+{
+       struct acpi_device_bus_id *acpi_device_bus_id;
+       bool found = false;
+
+       mutex_lock(&acpi_device_lock);
+       list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
+               if (!strcmp(acpi_device_bus_id->bus_id, hid)) {
+                       found = true;
+                       break;
+               }
+       mutex_unlock(&acpi_device_lock);
+
+       return found;
+}
+EXPORT_SYMBOL(acpi_dev_present);
+
 /*
  * acpi_backlight= handling, this is done here rather then in video_detect.c
  * because __setup cannot be used in modules.
index daaf1c4..90e2d54 100644 (file)
@@ -250,6 +250,15 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
                DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
                },
        },
+       {
+        /* https://bugzilla.kernel.org/show_bug.cgi?id=108971 */
+        .callback = video_detect_force_video,
+        .ident = "SAMSUNG 530U4E/540U4E",
+        .matches = {
+               DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+               DMI_MATCH(DMI_PRODUCT_NAME, "530U4E/540U4E"),
+               },
+       },
 
        /* Non win8 machines which need native backlight nevertheless */
        {
@@ -279,6 +288,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
                DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
                },
        },
+       {
+        .callback = video_detect_force_native,
+        .ident = "Dell Vostro V131",
+        .matches = {
+               DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+               DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
+               },
+       },
        { },
 };
 
index b7d56c5..0a8bdad 100644 (file)
@@ -2261,7 +2261,10 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
                if (fwnode_is_primary(fn))
                        fn = fn->secondary;
 
-               fwnode->secondary = fn;
+               if (fn) {
+                       WARN_ON(fwnode->secondary);
+                       fwnode->secondary = fn;
+               }
                dev->fwnode = fwnode;
        } else {
                dev->fwnode = fwnode_is_primary(dev->fwnode) ?
index a641cf3..0369704 100644 (file)
@@ -268,6 +268,9 @@ int device_bind_driver(struct device *dev)
        ret = driver_sysfs_add(dev);
        if (!ret)
                driver_bound(dev);
+       else if (dev->bus)
+               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
+                                            BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
        return ret;
 }
 EXPORT_SYMBOL_GPL(device_bind_driver);
@@ -290,7 +293,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
        /* If using pinctrl, bind pins now before probing */
        ret = pinctrl_bind_pins(dev);
        if (ret)
-               goto probe_failed;
+               goto pinctrl_bind_failed;
 
        if (driver_sysfs_add(dev)) {
                printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
@@ -334,6 +337,10 @@ static int really_probe(struct device *dev, struct device_driver *drv)
        goto done;
 
 probe_failed:
+       if (dev->bus)
+               blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
+                                            BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
+pinctrl_bind_failed:
        devres_release_all(dev);
        driver_sysfs_remove(dev);
        dev->driver = NULL;
@@ -701,7 +708,6 @@ static void __device_release_driver(struct device *dev)
                        blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
                                                     BUS_NOTIFY_UNBOUND_DRIVER,
                                                     dev);
-
        }
 }
 
index 1dd6d3b..d77ed0c 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/acpi.h>
 #include <linux/clk/clk-conf.h>
 #include <linux/limits.h>
+#include <linux/property.h>
 
 #include "base.h"
 #include "power/power.h"
@@ -298,6 +299,22 @@ int platform_device_add_data(struct platform_device *pdev, const void *data,
 }
 EXPORT_SYMBOL_GPL(platform_device_add_data);
 
+/**
+ * platform_device_add_properties - add built-in properties to a platform device
+ * @pdev: platform device to add properties to
+ * @pset: properties to add
+ *
+ * The function will take deep copy of the properties in @pset and attach
+ * the copy to the platform device. The memory associated with properties
+ * will be freed when the platform device is released.
+ */
+int platform_device_add_properties(struct platform_device *pdev,
+                                  const struct property_set *pset)
+{
+       return device_add_property_set(&pdev->dev, pset);
+}
+EXPORT_SYMBOL_GPL(platform_device_add_properties);
+
 /**
  * platform_device_add - add a platform device to device hierarchy
  * @pdev: platform device we're adding
@@ -409,6 +426,8 @@ void platform_device_del(struct platform_device *pdev)
                        if (r->parent)
                                release_resource(r);
                }
+
+               device_remove_property_set(&pdev->dev);
        }
 }
 EXPORT_SYMBOL_GPL(platform_device_del);
@@ -487,6 +506,12 @@ struct platform_device *platform_device_register_full(
        if (ret)
                goto err;
 
+       if (pdevinfo->pset) {
+               ret = platform_device_add_properties(pdev, pdevinfo->pset);
+               if (ret)
+                       goto err;
+       }
+
        ret = platform_device_add(pdev);
        if (ret) {
 err:
index 60ee559..c39b861 100644 (file)
@@ -473,6 +473,7 @@ static int pm_clk_notify(struct notifier_block *nb,
                        enable_clock(dev, NULL);
                }
                break;
+       case BUS_NOTIFY_DRIVER_NOT_BOUND:
        case BUS_NOTIFY_UNBOUND_DRIVER:
                if (clknb->con_ids[0]) {
                        for (con_id = clknb->con_ids; *con_id; con_id++)
index 1325ff2..c359351 100644 (file)
 #include <linux/etherdevice.h>
 #include <linux/phy.h>
 
-/**
- * device_add_property_set - Add a collection of properties to a device object.
- * @dev: Device to add properties to.
- * @pset: Collection of properties to add.
- *
- * Associate a collection of device properties represented by @pset with @dev
- * as its secondary firmware node.
- */
-void device_add_property_set(struct device *dev, struct property_set *pset)
-{
-       if (!pset)
-               return;
-
-       pset->fwnode.type = FWNODE_PDATA;
-       set_secondary_fwnode(dev, &pset->fwnode);
-}
-EXPORT_SYMBOL_GPL(device_add_property_set);
-
-static inline bool is_pset(struct fwnode_handle *fwnode)
+static inline bool is_pset_node(struct fwnode_handle *fwnode)
 {
        return fwnode && fwnode->type == FWNODE_PDATA;
 }
 
-static inline struct property_set *to_pset(struct fwnode_handle *fwnode)
+static inline struct property_set *to_pset_node(struct fwnode_handle *fwnode)
 {
-       return is_pset(fwnode) ?
+       return is_pset_node(fwnode) ?
                container_of(fwnode, struct property_set, fwnode) : NULL;
 }
 
@@ -63,45 +45,135 @@ static struct property_entry *pset_prop_get(struct property_set *pset,
        return NULL;
 }
 
-static int pset_prop_read_array(struct property_set *pset, const char *name,
-                               enum dev_prop_type type, void *val, size_t nval)
+static void *pset_prop_find(struct property_set *pset, const char *propname,
+                           size_t length)
 {
        struct property_entry *prop;
-       unsigned int item_size;
+       void *pointer;
 
-       prop = pset_prop_get(pset, name);
+       prop = pset_prop_get(pset, propname);
        if (!prop)
-               return -ENODATA;
+               return ERR_PTR(-EINVAL);
+       if (prop->is_array)
+               pointer = prop->pointer.raw_data;
+       else
+               pointer = &prop->value.raw_data;
+       if (!pointer)
+               return ERR_PTR(-ENODATA);
+       if (length > prop->length)
+               return ERR_PTR(-EOVERFLOW);
+       return pointer;
+}
+
+static int pset_prop_read_u8_array(struct property_set *pset,
+                                  const char *propname,
+                                  u8 *values, size_t nval)
+{
+       void *pointer;
+       size_t length = nval * sizeof(*values);
+
+       pointer = pset_prop_find(pset, propname, length);
+       if (IS_ERR(pointer))
+               return PTR_ERR(pointer);
+
+       memcpy(values, pointer, length);
+       return 0;
+}
+
+static int pset_prop_read_u16_array(struct property_set *pset,
+                                   const char *propname,
+                                   u16 *values, size_t nval)
+{
+       void *pointer;
+       size_t length = nval * sizeof(*values);
+
+       pointer = pset_prop_find(pset, propname, length);
+       if (IS_ERR(pointer))
+               return PTR_ERR(pointer);
+
+       memcpy(values, pointer, length);
+       return 0;
+}
+
+static int pset_prop_read_u32_array(struct property_set *pset,
+                                   const char *propname,
+                                   u32 *values, size_t nval)
+{
+       void *pointer;
+       size_t length = nval * sizeof(*values);
+
+       pointer = pset_prop_find(pset, propname, length);
+       if (IS_ERR(pointer))
+               return PTR_ERR(pointer);
+
+       memcpy(values, pointer, length);
+       return 0;
+}
+
+static int pset_prop_read_u64_array(struct property_set *pset,
+                                   const char *propname,
+                                   u64 *values, size_t nval)
+{
+       void *pointer;
+       size_t length = nval * sizeof(*values);
+
+       pointer = pset_prop_find(pset, propname, length);
+       if (IS_ERR(pointer))
+               return PTR_ERR(pointer);
+
+       memcpy(values, pointer, length);
+       return 0;
+}
+
+static int pset_prop_count_elems_of_size(struct property_set *pset,
+                                        const char *propname, size_t length)
+{
+       struct property_entry *prop;
+
+       prop = pset_prop_get(pset, propname);
+       if (!prop)
+               return -EINVAL;
+
+       return prop->length / length;
+}
+
+static int pset_prop_read_string_array(struct property_set *pset,
+                                      const char *propname,
+                                      const char **strings, size_t nval)
+{
+       void *pointer;
+       size_t length = nval * sizeof(*strings);
+
+       pointer = pset_prop_find(pset, propname, length);
+       if (IS_ERR(pointer))
+               return PTR_ERR(pointer);
+
+       memcpy(strings, pointer, length);
+       return 0;
+}
+
+static int pset_prop_read_string(struct property_set *pset,
+                                const char *propname, const char **strings)
+{
+       struct property_entry *prop;
+       const char **pointer;
 
-       if (prop->type != type)
-               return -EPROTO;
-
-       if (!val)
-               return prop->nval;
-
-       if (prop->nval < nval)
-               return -EOVERFLOW;
-
-       switch (type) {
-       case DEV_PROP_U8:
-               item_size = sizeof(u8);
-               break;
-       case DEV_PROP_U16:
-               item_size = sizeof(u16);
-               break;
-       case DEV_PROP_U32:
-               item_size = sizeof(u32);
-               break;
-       case DEV_PROP_U64:
-               item_size = sizeof(u64);
-               break;
-       case DEV_PROP_STRING:
-               item_size = sizeof(const char *);
-               break;
-       default:
+       prop = pset_prop_get(pset, propname);
+       if (!prop)
                return -EINVAL;
+       if (!prop->is_string)
+               return -EILSEQ;
+       if (prop->is_array) {
+               pointer = prop->pointer.str;
+               if (!pointer)
+                       return -ENODATA;
+       } else {
+               pointer = &prop->value.str;
+               if (*pointer && strnlen(*pointer, prop->length) >= prop->length)
+                       return -EILSEQ;
        }
-       memcpy(val, prop->value.raw_data, nval * item_size);
+
+       *strings = *pointer;
        return 0;
 }
 
@@ -124,6 +196,18 @@ bool device_property_present(struct device *dev, const char *propname)
 }
 EXPORT_SYMBOL_GPL(device_property_present);
 
+static bool __fwnode_property_present(struct fwnode_handle *fwnode,
+                                     const char *propname)
+{
+       if (is_of_node(fwnode))
+               return of_property_read_bool(to_of_node(fwnode), propname);
+       else if (is_acpi_node(fwnode))
+               return !acpi_node_prop_get(fwnode, propname, NULL);
+       else if (is_pset_node(fwnode))
+               return !!pset_prop_get(to_pset_node(fwnode), propname);
+       return false;
+}
+
 /**
  * fwnode_property_present - check if a property of a firmware node is present
  * @fwnode: Firmware node whose property to check
@@ -131,12 +215,12 @@ EXPORT_SYMBOL_GPL(device_property_present);
  */
 bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname)
 {
-       if (is_of_node(fwnode))
-               return of_property_read_bool(to_of_node(fwnode), propname);
-       else if (is_acpi_node(fwnode))
-               return !acpi_node_prop_get(fwnode, propname, NULL);
+       bool ret;
 
-       return !!pset_prop_get(to_pset(fwnode), propname);
+       ret = __fwnode_property_present(fwnode, propname);
+       if (ret == false && fwnode && fwnode->secondary)
+               ret = __fwnode_property_present(fwnode->secondary, propname);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(fwnode_property_present);
 
@@ -309,25 +393,40 @@ int device_property_match_string(struct device *dev, const char *propname,
 }
 EXPORT_SYMBOL_GPL(device_property_match_string);
 
-#define OF_DEV_PROP_READ_ARRAY(node, propname, type, val, nval) \
-       (val) ? of_property_read_##type##_array((node), (propname), (val), (nval)) \
+#define OF_DEV_PROP_READ_ARRAY(node, propname, type, val, nval)                                \
+       (val) ? of_property_read_##type##_array((node), (propname), (val), (nval))      \
              : of_property_count_elems_of_size((node), (propname), sizeof(type))
 
-#define FWNODE_PROP_READ_ARRAY(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_) \
-({ \
-       int _ret_; \
-       if (is_of_node(_fwnode_)) \
-               _ret_ = OF_DEV_PROP_READ_ARRAY(to_of_node(_fwnode_), _propname_, \
-                                              _type_, _val_, _nval_); \
-       else if (is_acpi_node(_fwnode_)) \
-               _ret_ = acpi_node_prop_read(_fwnode_, _propname_, _proptype_, \
-                                           _val_, _nval_); \
-       else if (is_pset(_fwnode_)) \
-               _ret_ = pset_prop_read_array(to_pset(_fwnode_), _propname_, \
-                                            _proptype_, _val_, _nval_); \
-       else \
-               _ret_ = -ENXIO; \
-       _ret_; \
+#define PSET_PROP_READ_ARRAY(node, propname, type, val, nval)                          \
+       (val) ? pset_prop_read_##type##_array((node), (propname), (val), (nval))        \
+             : pset_prop_count_elems_of_size((node), (propname), sizeof(type))
+
+#define FWNODE_PROP_READ(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_)      \
+({                                                                                     \
+       int _ret_;                                                                      \
+       if (is_of_node(_fwnode_))                                                       \
+               _ret_ = OF_DEV_PROP_READ_ARRAY(to_of_node(_fwnode_), _propname_,        \
+                                              _type_, _val_, _nval_);                  \
+       else if (is_acpi_node(_fwnode_))                                                \
+               _ret_ = acpi_node_prop_read(_fwnode_, _propname_, _proptype_,           \
+                                           _val_, _nval_);                             \
+       else if (is_pset_node(_fwnode_))                                                \
+               _ret_ = PSET_PROP_READ_ARRAY(to_pset_node(_fwnode_), _propname_,        \
+                                            _type_, _val_, _nval_);                    \
+       else                                                                            \
+               _ret_ = -ENXIO;                                                         \
+       _ret_;                                                                          \
+})
+
+#define FWNODE_PROP_READ_ARRAY(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_)        \
+({                                                                                     \
+       int _ret_;                                                                      \
+       _ret_ = FWNODE_PROP_READ(_fwnode_, _propname_, _type_, _proptype_,              \
+                                _val_, _nval_);                                        \
+       if (_ret_ == -EINVAL && _fwnode_ && _fwnode_->secondary)                        \
+               _ret_ = FWNODE_PROP_READ(_fwnode_->secondary, _propname_, _type_,       \
+                               _proptype_, _val_, _nval_);                             \
+       _ret_;                                                                          \
 })
 
 /**
@@ -434,6 +533,41 @@ int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
 }
 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array);
 
+static int __fwnode_property_read_string_array(struct fwnode_handle *fwnode,
+                                              const char *propname,
+                                              const char **val, size_t nval)
+{
+       if (is_of_node(fwnode))
+               return val ?
+                       of_property_read_string_array(to_of_node(fwnode),
+                                                     propname, val, nval) :
+                       of_property_count_strings(to_of_node(fwnode), propname);
+       else if (is_acpi_node(fwnode))
+               return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
+                                          val, nval);
+       else if (is_pset_node(fwnode))
+               return val ?
+                       pset_prop_read_string_array(to_pset_node(fwnode),
+                                                   propname, val, nval) :
+                       pset_prop_count_elems_of_size(to_pset_node(fwnode),
+                                                     propname,
+                                                     sizeof(const char *));
+       return -ENXIO;
+}
+
+static int __fwnode_property_read_string(struct fwnode_handle *fwnode,
+                                        const char *propname, const char **val)
+{
+       if (is_of_node(fwnode))
+               return of_property_read_string(to_of_node(fwnode), propname, val);
+       else if (is_acpi_node(fwnode))
+               return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
+                                          val, 1);
+       else if (is_pset_node(fwnode))
+               return pset_prop_read_string(to_pset_node(fwnode), propname, val);
+       return -ENXIO;
+}
+
 /**
  * fwnode_property_read_string_array - return string array property of a node
  * @fwnode: Firmware node to get the property of
@@ -456,18 +590,13 @@ int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
                                      const char *propname, const char **val,
                                      size_t nval)
 {
-       if (is_of_node(fwnode))
-               return val ?
-                       of_property_read_string_array(to_of_node(fwnode),
-                                                     propname, val, nval) :
-                       of_property_count_strings(to_of_node(fwnode), propname);
-       else if (is_acpi_node(fwnode))
-               return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
-                                          val, nval);
-       else if (is_pset(fwnode))
-               return pset_prop_read_array(to_pset(fwnode), propname,
-                                           DEV_PROP_STRING, val, nval);
-       return -ENXIO;
+       int ret;
+
+       ret = __fwnode_property_read_string_array(fwnode, propname, val, nval);
+       if (ret == -EINVAL && fwnode && fwnode->secondary)
+               ret = __fwnode_property_read_string_array(fwnode->secondary,
+                                                         propname, val, nval);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
 
@@ -489,14 +618,13 @@ EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
 int fwnode_property_read_string(struct fwnode_handle *fwnode,
                                const char *propname, const char **val)
 {
-       if (is_of_node(fwnode))
-               return of_property_read_string(to_of_node(fwnode), propname, val);
-       else if (is_acpi_node(fwnode))
-               return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
-                                          val, 1);
+       int ret;
 
-       return pset_prop_read_array(to_pset(fwnode), propname,
-                                   DEV_PROP_STRING, val, 1);
+       ret = __fwnode_property_read_string(fwnode, propname, val);
+       if (ret == -EINVAL && fwnode && fwnode->secondary)
+               ret = __fwnode_property_read_string(fwnode->secondary,
+                                                   propname, val);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(fwnode_property_read_string);
 
@@ -525,6 +653,9 @@ int fwnode_property_match_string(struct fwnode_handle *fwnode,
        if (nval < 0)
                return nval;
 
+       if (nval == 0)
+               return -ENODATA;
+
        values = kcalloc(nval, sizeof(*values), GFP_KERNEL);
        if (!values)
                return -ENOMEM;
@@ -546,6 +677,182 @@ out:
 }
 EXPORT_SYMBOL_GPL(fwnode_property_match_string);
 
+/**
+ * pset_free_set - releases memory allocated for copied property set
+ * @pset: Property set to release
+ *
+ * Function takes previously copied property set and releases all the
+ * memory allocated to it.
+ */
+static void pset_free_set(struct property_set *pset)
+{
+       const struct property_entry *prop;
+       size_t i, nval;
+
+       if (!pset)
+               return;
+
+       for (prop = pset->properties; prop->name; prop++) {
+               if (prop->is_array) {
+                       if (prop->is_string && prop->pointer.str) {
+                               nval = prop->length / sizeof(const char *);
+                               for (i = 0; i < nval; i++)
+                                       kfree(prop->pointer.str[i]);
+                       }
+                       kfree(prop->pointer.raw_data);
+               } else if (prop->is_string) {
+                       kfree(prop->value.str);
+               }
+               kfree(prop->name);
+       }
+
+       kfree(pset->properties);
+       kfree(pset);
+}
+
+static int pset_copy_entry(struct property_entry *dst,
+                          const struct property_entry *src)
+{
+       const char **d, **s;
+       size_t i, nval;
+
+       dst->name = kstrdup(src->name, GFP_KERNEL);
+       if (!dst->name)
+               return -ENOMEM;
+
+       if (src->is_array) {
+               if (!src->length)
+                       return -ENODATA;
+
+               if (src->is_string) {
+                       nval = src->length / sizeof(const char *);
+                       dst->pointer.str = kcalloc(nval, sizeof(const char *),
+                                                  GFP_KERNEL);
+                       if (!dst->pointer.str)
+                               return -ENOMEM;
+
+                       d = dst->pointer.str;
+                       s = src->pointer.str;
+                       for (i = 0; i < nval; i++) {
+                               d[i] = kstrdup(s[i], GFP_KERNEL);
+                               if (!d[i] && s[i])
+                                       return -ENOMEM;
+                       }
+               } else {
+                       dst->pointer.raw_data = kmemdup(src->pointer.raw_data,
+                                                       src->length, GFP_KERNEL);
+                       if (!dst->pointer.raw_data)
+                               return -ENOMEM;
+               }
+       } else if (src->is_string) {
+               dst->value.str = kstrdup(src->value.str, GFP_KERNEL);
+               if (!dst->value.str && src->value.str)
+                       return -ENOMEM;
+       } else {
+               dst->value.raw_data = src->value.raw_data;
+       }
+
+       dst->length = src->length;
+       dst->is_array = src->is_array;
+       dst->is_string = src->is_string;
+
+       return 0;
+}
+
+/**
+ * pset_copy_set - copies property set
+ * @pset: Property set to copy
+ *
+ * This function takes a deep copy of the given property set and returns
+ * pointer to the copy. Call device_free_property_set() to free resources
+ * allocated in this function.
+ *
+ * Return: Pointer to the new property set or error pointer.
+ */
+static struct property_set *pset_copy_set(const struct property_set *pset)
+{
+       const struct property_entry *entry;
+       struct property_set *p;
+       size_t i, n = 0;
+
+       p = kzalloc(sizeof(*p), GFP_KERNEL);
+       if (!p)
+               return ERR_PTR(-ENOMEM);
+
+       while (pset->properties[n].name)
+               n++;
+
+       p->properties = kcalloc(n + 1, sizeof(*entry), GFP_KERNEL);
+       if (!p->properties) {
+               kfree(p);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       for (i = 0; i < n; i++) {
+               int ret = pset_copy_entry(&p->properties[i],
+                                         &pset->properties[i]);
+               if (ret) {
+                       pset_free_set(p);
+                       return ERR_PTR(ret);
+               }
+       }
+
+       return p;
+}
+
+/**
+ * device_remove_property_set - Remove properties from a device object.
+ * @dev: Device whose properties to remove.
+ *
+ * The function removes properties previously associated to the device
+ * secondary firmware node with device_add_property_set(). Memory allocated
+ * to the properties will also be released.
+ */
+void device_remove_property_set(struct device *dev)
+{
+       struct fwnode_handle *fwnode;
+
+       fwnode = dev_fwnode(dev);
+       if (!fwnode)
+               return;
+       /*
+        * Pick either primary or secondary node depending which one holds
+        * the pset. If there is no real firmware node (ACPI/DT) primary
+        * will hold the pset.
+        */
+       if (!is_pset_node(fwnode))
+               fwnode = fwnode->secondary;
+       if (!IS_ERR(fwnode) && is_pset_node(fwnode))
+               pset_free_set(to_pset_node(fwnode));
+       set_secondary_fwnode(dev, NULL);
+}
+EXPORT_SYMBOL_GPL(device_remove_property_set);
+
+/**
+ * device_add_property_set - Add a collection of properties to a device object.
+ * @dev: Device to add properties to.
+ * @pset: Collection of properties to add.
+ *
+ * Associate a collection of device properties represented by @pset with @dev
+ * as its secondary firmware node. The function takes a copy of @pset.
+ */
+int device_add_property_set(struct device *dev, const struct property_set *pset)
+{
+       struct property_set *p;
+
+       if (!pset)
+               return -EINVAL;
+
+       p = pset_copy_set(pset);
+       if (IS_ERR(p))
+               return PTR_ERR(p);
+
+       p->fwnode.type = FWNODE_PDATA;
+       set_secondary_fwnode(dev, &p->fwnode);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(device_add_property_set);
+
 /**
  * device_get_next_child_node - Return the next child node handle for a device
  * @dev: Device to find the next child node for.
index 8162475..09e3c0d 100644 (file)
@@ -219,6 +219,9 @@ static void end_cmd(struct nullb_cmd *cmd)
 {
        struct request_queue *q = NULL;
 
+       if (cmd->rq)
+               q = cmd->rq->q;
+
        switch (queue_mode)  {
        case NULL_Q_MQ:
                blk_mq_end_request(cmd->rq, 0);
@@ -229,23 +232,19 @@ static void end_cmd(struct nullb_cmd *cmd)
                break;
        case NULL_Q_BIO:
                bio_endio(cmd->bio);
-               goto free_cmd;
+               break;
        }
 
-       if (cmd->rq)
-               q = cmd->rq->q;
+       free_cmd(cmd);
 
        /* Restart queue if needed, as we are freeing a tag */
-       if (q && !q->mq_ops && blk_queue_stopped(q)) {
+       if (queue_mode == NULL_Q_RQ && blk_queue_stopped(q)) {
                unsigned long flags;
 
                spin_lock_irqsave(q->queue_lock, flags);
-               if (blk_queue_stopped(q))
-                       blk_start_queue(q);
+               blk_start_queue_async(q);
                spin_unlock_irqrestore(q->queue_lock, flags);
        }
-free_cmd:
-       free_cmd(cmd);
 }
 
 static enum hrtimer_restart null_cmd_timer_expired(struct hrtimer *timer)
index 846bc29..25996e2 100644 (file)
@@ -342,13 +342,13 @@ static int sunxi_rsb_read(struct sunxi_rsb *rsb, u8 rtaddr, u8 addr,
 
        ret = _sunxi_rsb_run_xfer(rsb);
        if (ret)
-               goto out;
+               goto unlock;
 
        *buf = readl(rsb->regs + RSB_DATA);
 
+unlock:
        mutex_unlock(&rsb->lock);
 
-out:
        return ret;
 }
 
@@ -527,9 +527,9 @@ static int sunxi_rsb_init_device_mode(struct sunxi_rsb *rsb)
  */
 
 static const struct sunxi_rsb_addr_map sunxi_rsb_addr_maps[] = {
-       { 0x3e3, 0x2d }, /* Primary PMIC: AXP223, AXP809, AXP81X, ... */
+       { 0x3a3, 0x2d }, /* Primary PMIC: AXP223, AXP809, AXP81X, ... */
        { 0x745, 0x3a }, /* Secondary PMIC: AXP806, ... */
-       { 0xe89, 0x45 }, /* Peripheral IC: AC100, ... */
+       { 0xe89, 0x4e }, /* Peripheral IC: AC100, ... */
 };
 
 static u8 sunxi_rsb_get_rtaddr(u16 hwaddr)
index d7373ca..25693b0 100644 (file)
@@ -179,26 +179,21 @@ static int cn_call_callback(struct sk_buff *skb)
  *
  * It checks skb, netlink header and msg sizes, and calls callback helper.
  */
-static void cn_rx_skb(struct sk_buff *__skb)
+static void cn_rx_skb(struct sk_buff *skb)
 {
        struct nlmsghdr *nlh;
-       struct sk_buff *skb;
        int len, err;
 
-       skb = skb_get(__skb);
-
        if (skb->len >= NLMSG_HDRLEN) {
                nlh = nlmsg_hdr(skb);
                len = nlmsg_len(nlh);
 
                if (len < (int)sizeof(struct cn_msg) ||
                    skb->len < nlh->nlmsg_len ||
-                   len > CONNECTOR_MAX_MSG_SIZE) {
-                       kfree_skb(skb);
+                   len > CONNECTOR_MAX_MSG_SIZE)
                        return;
-               }
 
-               err = cn_call_callback(skb);
+               err = cn_call_callback(skb_get(skb));
                if (err < 0)
                        kfree_skb(skb);
        }
index 2c3b16f..de5e89b 100644 (file)
@@ -31,7 +31,7 @@ static struct scpi_ops *scpi_ops;
 
 static struct scpi_dvfs_info *scpi_get_dvfs_info(struct device *cpu_dev)
 {
-       u8 domain = topology_physical_package_id(cpu_dev->id);
+       int domain = topology_physical_package_id(cpu_dev->id);
 
        if (domain < 0)
                return ERR_PTR(-EINVAL);
index 7067b6d..8b20930 100644 (file)
@@ -622,12 +622,17 @@ static void dw_dma_tasklet(unsigned long data)
 static irqreturn_t dw_dma_interrupt(int irq, void *dev_id)
 {
        struct dw_dma *dw = dev_id;
-       u32 status = dma_readl(dw, STATUS_INT);
+       u32 status;
 
+       /* Check if we have any interrupt from the DMAC which is not in use */
+       if (!dw->in_use)
+               return IRQ_NONE;
+
+       status = dma_readl(dw, STATUS_INT);
        dev_vdbg(dw->dma.dev, "%s: status=0x%x\n", __func__, status);
 
        /* Check if we have any interrupt from the DMAC */
-       if (!status || !dw->in_use)
+       if (!status)
                return IRQ_NONE;
 
        /*
index 68a4815..127093a 100644 (file)
@@ -155,7 +155,6 @@ static int dw_probe(struct platform_device *pdev)
        struct dw_dma_chip *chip;
        struct device *dev = &pdev->dev;
        struct resource *mem;
-       const struct acpi_device_id *id;
        struct dw_dma_platform_data *pdata;
        int err;
 
@@ -179,11 +178,6 @@ static int dw_probe(struct platform_device *pdev)
        pdata = dev_get_platdata(dev);
        if (!pdata)
                pdata = dw_dma_parse_dt(pdev);
-       if (!pdata && has_acpi_companion(dev)) {
-               id = acpi_match_device(dev->driver->acpi_match_table, dev);
-               if (id)
-                       pdata = (struct dw_dma_platform_data *)id->driver_data;
-       }
 
        chip->dev = dev;
 
@@ -239,7 +233,19 @@ static void dw_shutdown(struct platform_device *pdev)
 {
        struct dw_dma_chip *chip = platform_get_drvdata(pdev);
 
+       /*
+        * We have to call dw_dma_disable() to stop any ongoing transfer. On
+        * some platforms we can't do that since DMA device is powered off.
+        * Moreover we have no possibility to check if the platform is affected
+        * or not. That's why we call pm_runtime_get_sync() / pm_runtime_put()
+        * unconditionally. On the other hand we can't use
+        * pm_runtime_suspended() because runtime PM framework is not fully
+        * used by the driver.
+        */
+       pm_runtime_get_sync(chip->dev);
        dw_dma_disable(chip);
+       pm_runtime_put_sync_suspend(chip->dev);
+
        clk_disable_unprepare(chip->clk);
 }
 
@@ -252,17 +258,8 @@ MODULE_DEVICE_TABLE(of, dw_dma_of_id_table);
 #endif
 
 #ifdef CONFIG_ACPI
-static struct dw_dma_platform_data dw_dma_acpi_pdata = {
-       .nr_channels = 8,
-       .is_private = true,
-       .chan_allocation_order = CHAN_ALLOCATION_ASCENDING,
-       .chan_priority = CHAN_PRIORITY_ASCENDING,
-       .block_size = 4095,
-       .nr_masters = 2,
-};
-
 static const struct acpi_device_id dw_dma_acpi_id_table[] = {
-       { "INTL9C60", (kernel_ulong_t)&dw_dma_acpi_pdata },
+       { "INTL9C60", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(acpi, dw_dma_acpi_id_table);
index cddfa8d..068e920 100644 (file)
@@ -317,7 +317,6 @@ mic_dma_prep_memcpy_lock(struct dma_chan *ch, dma_addr_t dma_dest,
        struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch);
        struct device *dev = mic_dma_ch_to_device(mic_ch);
        int result;
-       struct dma_async_tx_descriptor *tx = NULL;
 
        if (!len && !flags)
                return NULL;
@@ -325,13 +324,10 @@ mic_dma_prep_memcpy_lock(struct dma_chan *ch, dma_addr_t dma_dest,
        spin_lock(&mic_ch->prep_lock);
        result = mic_dma_do_dma(mic_ch, flags, dma_src, dma_dest, len);
        if (result >= 0)
-               tx = allocate_tx(mic_ch);
-
-       if (!tx)
-               dev_err(dev, "Error enqueueing dma, error=%d\n", result);
-
+               return allocate_tx(mic_ch);
+       dev_err(dev, "Error enqueueing dma, error=%d\n", result);
        spin_unlock(&mic_ch->prep_lock);
-       return tx;
+       return NULL;
 }
 
 static struct dma_async_tx_descriptor *
@@ -339,14 +335,13 @@ mic_dma_prep_interrupt_lock(struct dma_chan *ch, unsigned long flags)
 {
        struct mic_dma_chan *mic_ch = to_mic_dma_chan(ch);
        int ret;
-       struct dma_async_tx_descriptor *tx = NULL;
 
        spin_lock(&mic_ch->prep_lock);
        ret = mic_dma_do_dma(mic_ch, flags, 0, 0, 0);
        if (!ret)
-               tx = allocate_tx(mic_ch);
+               return allocate_tx(mic_ch);
        spin_unlock(&mic_ch->prep_lock);
-       return tx;
+       return NULL;
 }
 
 /* Return the status of the transaction */
index 9dfa2b0..9cb93c5 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/dmapool.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
 
@@ -1610,6 +1611,7 @@ static int xgene_dma_request_irqs(struct xgene_dma *pdma)
        /* Register DMA channel rx irq */
        for (i = 0; i < XGENE_DMA_MAX_CHANNEL; i++) {
                chan = &pdma->chan[i];
+               irq_set_status_flags(chan->rx_irq, IRQ_DISABLE_UNLAZY);
                ret = devm_request_irq(chan->dev, chan->rx_irq,
                                       xgene_dma_chan_ring_isr,
                                       0, chan->name, chan);
@@ -1620,6 +1622,7 @@ static int xgene_dma_request_irqs(struct xgene_dma *pdma)
 
                        for (j = 0; j < i; j++) {
                                chan = &pdma->chan[i];
+                               irq_clear_status_flags(chan->rx_irq, IRQ_DISABLE_UNLAZY);
                                devm_free_irq(chan->dev, chan->rx_irq, chan);
                        }
 
@@ -1640,6 +1643,7 @@ static void xgene_dma_free_irqs(struct xgene_dma *pdma)
 
        for (i = 0; i < XGENE_DMA_MAX_CHANNEL; i++) {
                chan = &pdma->chan[i];
+               irq_clear_status_flags(chan->rx_irq, IRQ_DISABLE_UNLAZY);
                devm_free_irq(chan->dev, chan->rx_irq, chan);
        }
 }
index ac1ce4a..0e08e66 100644 (file)
@@ -521,6 +521,7 @@ static int __init dmi_present(const u8 *buf)
                        dmi_ver = smbios_ver;
                else
                        dmi_ver = (buf[14] & 0xF0) << 4 | (buf[14] & 0x0F);
+               dmi_ver <<= 8;
                dmi_num = get_unaligned_le16(buf + 12);
                dmi_len = get_unaligned_le16(buf + 6);
                dmi_base = get_unaligned_le32(buf + 8);
@@ -528,15 +529,14 @@ static int __init dmi_present(const u8 *buf)
                if (dmi_walk_early(dmi_decode) == 0) {
                        if (smbios_ver) {
                                pr_info("SMBIOS %d.%d present.\n",
-                                      dmi_ver >> 8, dmi_ver & 0xFF);
+                                       dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
                        } else {
                                smbios_entry_point_size = 15;
                                memcpy(smbios_entry_point, buf,
                                       smbios_entry_point_size);
                                pr_info("Legacy DMI %d.%d present.\n",
-                                      dmi_ver >> 8, dmi_ver & 0xFF);
+                                       dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
                        }
-                       dmi_ver <<= 8;
                        dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
                        printk(KERN_DEBUG "DMI: %s\n", dmi_ids_string);
                        return 0;
index 5a5f04d..048cfe0 100644 (file)
@@ -1264,7 +1264,8 @@ struct amdgpu_cs_parser {
        struct ww_acquire_ctx   ticket;
 
        /* user fence */
-       struct amdgpu_user_fence uf;
+       struct amdgpu_user_fence        uf;
+       struct amdgpu_bo_list_entry     uf_entry;
 };
 
 struct amdgpu_job {
index 4f352ec..25a3e24 100644 (file)
@@ -127,6 +127,37 @@ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
        return 0;
 }
 
+static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
+                                     struct drm_amdgpu_cs_chunk_fence *fence_data)
+{
+       struct drm_gem_object *gobj;
+       uint32_t handle;
+
+       handle = fence_data->handle;
+       gobj = drm_gem_object_lookup(p->adev->ddev, p->filp,
+                                    fence_data->handle);
+       if (gobj == NULL)
+               return -EINVAL;
+
+       p->uf.bo = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
+       p->uf.offset = fence_data->offset;
+
+       if (amdgpu_ttm_tt_has_userptr(p->uf.bo->tbo.ttm)) {
+               drm_gem_object_unreference_unlocked(gobj);
+               return -EINVAL;
+       }
+
+       p->uf_entry.robj = amdgpu_bo_ref(p->uf.bo);
+       p->uf_entry.prefered_domains = AMDGPU_GEM_DOMAIN_GTT;
+       p->uf_entry.allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
+       p->uf_entry.priority = 0;
+       p->uf_entry.tv.bo = &p->uf_entry.robj->tbo;
+       p->uf_entry.tv.shared = true;
+
+       drm_gem_object_unreference_unlocked(gobj);
+       return 0;
+}
+
 int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
 {
        union drm_amdgpu_cs *cs = data;
@@ -207,28 +238,15 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
 
                case AMDGPU_CHUNK_ID_FENCE:
                        size = sizeof(struct drm_amdgpu_cs_chunk_fence);
-                       if (p->chunks[i].length_dw * sizeof(uint32_t) >= size) {
-                               uint32_t handle;
-                               struct drm_gem_object *gobj;
-                               struct drm_amdgpu_cs_chunk_fence *fence_data;
-
-                               fence_data = (void *)p->chunks[i].kdata;
-                               handle = fence_data->handle;
-                               gobj = drm_gem_object_lookup(p->adev->ddev,
-                                                            p->filp, handle);
-                               if (gobj == NULL) {
-                                       ret = -EINVAL;
-                                       goto free_partial_kdata;
-                               }
-
-                               p->uf.bo = gem_to_amdgpu_bo(gobj);
-                               amdgpu_bo_ref(p->uf.bo);
-                               drm_gem_object_unreference_unlocked(gobj);
-                               p->uf.offset = fence_data->offset;
-                       } else {
+                       if (p->chunks[i].length_dw * sizeof(uint32_t) < size) {
                                ret = -EINVAL;
                                goto free_partial_kdata;
                        }
+
+                       ret = amdgpu_cs_user_fence_chunk(p, (void *)p->chunks[i].kdata);
+                       if (ret)
+                               goto free_partial_kdata;
+
                        break;
 
                case AMDGPU_CHUNK_ID_DEPENDENCIES:
@@ -391,6 +409,9 @@ static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p)
        p->vm_bos = amdgpu_vm_get_bos(p->adev, &fpriv->vm,
                                      &p->validated);
 
+       if (p->uf.bo)
+               list_add(&p->uf_entry.tv.head, &p->validated);
+
        if (need_mmap_lock)
                down_read(&current->mm->mmap_sem);
 
@@ -488,8 +509,8 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo
                for (i = 0; i < parser->num_ibs; i++)
                        amdgpu_ib_free(parser->adev, &parser->ibs[i]);
        kfree(parser->ibs);
-       if (parser->uf.bo)
-               amdgpu_bo_unref(&parser->uf.bo);
+       amdgpu_bo_unref(&parser->uf.bo);
+       amdgpu_bo_unref(&parser->uf_entry.robj);
 }
 
 static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p,
index b3ba27f..e693571 100644 (file)
@@ -55,6 +55,9 @@ static int exynos_crtc_atomic_check(struct drm_crtc *crtc,
 {
        struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
 
+       if (!state->enable)
+               return 0;
+
        if (exynos_crtc->ops->atomic_check)
                return exynos_crtc->ops->atomic_check(exynos_crtc, state);
 
index a01e515..f4af19a 100644 (file)
@@ -2193,8 +2193,17 @@ struct drm_i915_gem_request {
        struct drm_i915_private *i915;
        struct intel_engine_cs *ring;
 
-       /** GEM sequence number associated with this request. */
-       uint32_t seqno;
+        /** GEM sequence number associated with the previous request,
+         * when the HWS breadcrumb is equal to this the GPU is processing
+         * this request.
+         */
+       u32 previous_seqno;
+
+        /** GEM sequence number associated with this request,
+         * when the HWS breadcrumb is equal or greater than this the GPU
+         * has finished processing this request.
+         */
+       u32 seqno;
 
        /** Position in the ringbuffer of the start of the request */
        u32 head;
@@ -2839,6 +2848,7 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
 
 int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
                  u32 flags);
+void __i915_vma_set_map_and_fenceable(struct i915_vma *vma);
 int __must_check i915_vma_unbind(struct i915_vma *vma);
 /*
  * BEWARE: Do not use the function below unless you can _absolutely_
@@ -2910,15 +2920,17 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2)
        return (int32_t)(seq1 - seq2) >= 0;
 }
 
+static inline bool i915_gem_request_started(struct drm_i915_gem_request *req,
+                                          bool lazy_coherency)
+{
+       u32 seqno = req->ring->get_seqno(req->ring, lazy_coherency);
+       return i915_seqno_passed(seqno, req->previous_seqno);
+}
+
 static inline bool i915_gem_request_completed(struct drm_i915_gem_request *req,
                                              bool lazy_coherency)
 {
-       u32 seqno;
-
-       BUG_ON(req == NULL);
-
-       seqno = req->ring->get_seqno(req->ring, lazy_coherency);
-
+       u32 seqno = req->ring->get_seqno(req->ring, lazy_coherency);
        return i915_seqno_passed(seqno, req->seqno);
 }
 
index 32e6aad..f56af0a 100644 (file)
@@ -1146,23 +1146,74 @@ static bool missed_irq(struct drm_i915_private *dev_priv,
        return test_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings);
 }
 
-static int __i915_spin_request(struct drm_i915_gem_request *req)
+static unsigned long local_clock_us(unsigned *cpu)
+{
+       unsigned long t;
+
+       /* Cheaply and approximately convert from nanoseconds to microseconds.
+        * The result and subsequent calculations are also defined in the same
+        * approximate microseconds units. The principal source of timing
+        * error here is from the simple truncation.
+        *
+        * Note that local_clock() is only defined wrt to the current CPU;
+        * the comparisons are no longer valid if we switch CPUs. Instead of
+        * blocking preemption for the entire busywait, we can detect the CPU
+        * switch and use that as indicator of system load and a reason to
+        * stop busywaiting, see busywait_stop().
+        */
+       *cpu = get_cpu();
+       t = local_clock() >> 10;
+       put_cpu();
+
+       return t;
+}
+
+static bool busywait_stop(unsigned long timeout, unsigned cpu)
+{
+       unsigned this_cpu;
+
+       if (time_after(local_clock_us(&this_cpu), timeout))
+               return true;
+
+       return this_cpu != cpu;
+}
+
+static int __i915_spin_request(struct drm_i915_gem_request *req, int state)
 {
        unsigned long timeout;
+       unsigned cpu;
+
+       /* When waiting for high frequency requests, e.g. during synchronous
+        * rendering split between the CPU and GPU, the finite amount of time
+        * required to set up the irq and wait upon it limits the response
+        * rate. By busywaiting on the request completion for a short while we
+        * can service the high frequency waits as quick as possible. However,
+        * if it is a slow request, we want to sleep as quickly as possible.
+        * The tradeoff between waiting and sleeping is roughly the time it
+        * takes to sleep on a request, on the order of a microsecond.
+        */
 
-       if (i915_gem_request_get_ring(req)->irq_refcount)
+       if (req->ring->irq_refcount)
                return -EBUSY;
 
-       timeout = jiffies + 1;
+       /* Only spin if we know the GPU is processing this request */
+       if (!i915_gem_request_started(req, true))
+               return -EAGAIN;
+
+       timeout = local_clock_us(&cpu) + 5;
        while (!need_resched()) {
                if (i915_gem_request_completed(req, true))
                        return 0;
 
-               if (time_after_eq(jiffies, timeout))
+               if (signal_pending_state(state, current))
+                       break;
+
+               if (busywait_stop(timeout, cpu))
                        break;
 
                cpu_relax_lowlatency();
        }
+
        if (i915_gem_request_completed(req, false))
                return 0;
 
@@ -1197,6 +1248,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
        struct drm_i915_private *dev_priv = dev->dev_private;
        const bool irq_test_in_progress =
                ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring);
+       int state = interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
        DEFINE_WAIT(wait);
        unsigned long timeout_expire;
        s64 before, now;
@@ -1229,7 +1281,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
        before = ktime_get_raw_ns();
 
        /* Optimistic spin for the next jiffie before touching IRQs */
-       ret = __i915_spin_request(req);
+       ret = __i915_spin_request(req, state);
        if (ret == 0)
                goto out;
 
@@ -1241,8 +1293,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
        for (;;) {
                struct timer_list timer;
 
-               prepare_to_wait(&ring->irq_queue, &wait,
-                               interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
+               prepare_to_wait(&ring->irq_queue, &wait, state);
 
                /* We need to check whether any gpu reset happened in between
                 * the caller grabbing the seqno and now ... */
@@ -1260,7 +1311,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
                        break;
                }
 
-               if (interruptible && signal_pending(current)) {
+               if (signal_pending_state(state, current)) {
                        ret = -ERESTARTSYS;
                        break;
                }
@@ -2554,6 +2605,7 @@ void __i915_add_request(struct drm_i915_gem_request *request,
        request->batch_obj = obj;
 
        request->emitted_jiffies = jiffies;
+       request->previous_seqno = ring->last_submitted_seqno;
        ring->last_submitted_seqno = request->seqno;
        list_add_tail(&request->list, &ring->request_list);
 
@@ -4080,6 +4132,29 @@ i915_vma_misplaced(struct i915_vma *vma, uint32_t alignment, uint64_t flags)
        return false;
 }
 
+void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
+{
+       struct drm_i915_gem_object *obj = vma->obj;
+       bool mappable, fenceable;
+       u32 fence_size, fence_alignment;
+
+       fence_size = i915_gem_get_gtt_size(obj->base.dev,
+                                          obj->base.size,
+                                          obj->tiling_mode);
+       fence_alignment = i915_gem_get_gtt_alignment(obj->base.dev,
+                                                    obj->base.size,
+                                                    obj->tiling_mode,
+                                                    true);
+
+       fenceable = (vma->node.size == fence_size &&
+                    (vma->node.start & (fence_alignment - 1)) == 0);
+
+       mappable = (vma->node.start + fence_size <=
+                   to_i915(obj->base.dev)->gtt.mappable_end);
+
+       obj->map_and_fenceable = mappable && fenceable;
+}
+
 static int
 i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
                       struct i915_address_space *vm,
@@ -4147,25 +4222,7 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
 
        if (ggtt_view && ggtt_view->type == I915_GGTT_VIEW_NORMAL &&
            (bound ^ vma->bound) & GLOBAL_BIND) {
-               bool mappable, fenceable;
-               u32 fence_size, fence_alignment;
-
-               fence_size = i915_gem_get_gtt_size(obj->base.dev,
-                                                  obj->base.size,
-                                                  obj->tiling_mode);
-               fence_alignment = i915_gem_get_gtt_alignment(obj->base.dev,
-                                                            obj->base.size,
-                                                            obj->tiling_mode,
-                                                            true);
-
-               fenceable = (vma->node.size == fence_size &&
-                            (vma->node.start & (fence_alignment - 1)) == 0);
-
-               mappable = (vma->node.start + fence_size <=
-                           dev_priv->gtt.mappable_end);
-
-               obj->map_and_fenceable = mappable && fenceable;
-
+               __i915_vma_set_map_and_fenceable(vma);
                WARN_ON(flags & PIN_MAPPABLE && !obj->map_and_fenceable);
        }
 
index 43f35d1..86c7500 100644 (file)
@@ -2676,6 +2676,7 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
                        return ret;
                }
                vma->bound |= GLOBAL_BIND;
+               __i915_vma_set_map_and_fenceable(vma);
                list_add_tail(&vma->mm_list, &ggtt_vm->inactive_list);
        }
 
index cdacf3f..87e919a 100644 (file)
@@ -687,6 +687,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
                }
 
                vma->bound |= GLOBAL_BIND;
+               __i915_vma_set_map_and_fenceable(vma);
                list_add_tail(&vma->mm_list, &ggtt->inactive_list);
        }
 
index 62211ab..32cf973 100644 (file)
@@ -116,6 +116,7 @@ static void skylake_pfit_enable(struct intel_crtc *crtc);
 static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force);
 static void ironlake_pfit_enable(struct intel_crtc *crtc);
 static void intel_modeset_setup_hw_state(struct drm_device *dev);
+static void intel_pre_disable_primary(struct drm_crtc *crtc);
 
 typedef struct {
        int     min, max;
@@ -2607,6 +2608,8 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
        struct drm_i915_gem_object *obj;
        struct drm_plane *primary = intel_crtc->base.primary;
        struct drm_plane_state *plane_state = primary->state;
+       struct drm_crtc_state *crtc_state = intel_crtc->base.state;
+       struct intel_plane *intel_plane = to_intel_plane(primary);
        struct drm_framebuffer *fb;
 
        if (!plane_config->fb)
@@ -2643,6 +2646,18 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
                }
        }
 
+       /*
+        * We've failed to reconstruct the BIOS FB.  Current display state
+        * indicates that the primary plane is visible, but has a NULL FB,
+        * which will lead to problems later if we don't fix it up.  The
+        * simplest solution is to just disable the primary plane now and
+        * pretend the BIOS never had it enabled.
+        */
+       to_intel_plane_state(plane_state)->visible = false;
+       crtc_state->plane_mask &= ~(1 << drm_plane_index(primary));
+       intel_pre_disable_primary(&intel_crtc->base);
+       intel_plane->disable_plane(primary, &intel_crtc->base);
+
        return;
 
 valid_fb:
@@ -9910,14 +9925,14 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
        return true;
 }
 
-static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
+static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
 {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        uint32_t cntl = 0, size = 0;
 
-       if (base) {
+       if (on) {
                unsigned int width = intel_crtc->base.cursor->state->crtc_w;
                unsigned int height = intel_crtc->base.cursor->state->crtc_h;
                unsigned int stride = roundup_pow_of_two(width) * 4;
@@ -9972,16 +9987,15 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base)
        }
 }
 
-static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base)
+static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
 {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_crtc->pipe;
-       uint32_t cntl;
+       uint32_t cntl = 0;
 
-       cntl = 0;
-       if (base) {
+       if (on) {
                cntl = MCURSOR_GAMMA_ENABLE;
                switch (intel_crtc->base.cursor->state->crtc_w) {
                        case 64:
@@ -10032,18 +10046,17 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
        int y = cursor_state->crtc_y;
        u32 base = 0, pos = 0;
 
-       if (on)
-               base = intel_crtc->cursor_addr;
+       base = intel_crtc->cursor_addr;
 
        if (x >= intel_crtc->config->pipe_src_w)
-               base = 0;
+               on = false;
 
        if (y >= intel_crtc->config->pipe_src_h)
-               base = 0;
+               on = false;
 
        if (x < 0) {
                if (x + cursor_state->crtc_w <= 0)
-                       base = 0;
+                       on = false;
 
                pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
                x = -x;
@@ -10052,16 +10065,13 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
 
        if (y < 0) {
                if (y + cursor_state->crtc_h <= 0)
-                       base = 0;
+                       on = false;
 
                pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
                y = -y;
        }
        pos |= y << CURSOR_Y_SHIFT;
 
-       if (base == 0 && intel_crtc->cursor_base == 0)
-               return;
-
        I915_WRITE(CURPOS(pipe), pos);
 
        /* ILK+ do this automagically */
@@ -10072,9 +10082,9 @@ static void intel_crtc_update_cursor(struct drm_crtc *crtc,
        }
 
        if (IS_845G(dev) || IS_I865G(dev))
-               i845_update_cursor(crtc, base);
+               i845_update_cursor(crtc, base, on);
        else
-               i9xx_update_cursor(crtc, base);
+               i9xx_update_cursor(crtc, base, on);
 }
 
 static bool cursor_size_ok(struct drm_device *dev,
@@ -12113,18 +12123,22 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
 static bool check_digital_port_conflicts(struct drm_atomic_state *state)
 {
        struct drm_device *dev = state->dev;
-       struct intel_encoder *encoder;
        struct drm_connector *connector;
-       struct drm_connector_state *connector_state;
        unsigned int used_ports = 0;
-       int i;
 
        /*
         * Walk the connector list instead of the encoder
         * list to detect the problem on ddi platforms
         * where there's just one encoder per digital port.
         */
-       for_each_connector_in_state(state, connector, connector_state, i) {
+       drm_for_each_connector(connector, dev) {
+               struct drm_connector_state *connector_state;
+               struct intel_encoder *encoder;
+
+               connector_state = drm_atomic_get_existing_connector_state(state, connector);
+               if (!connector_state)
+                       connector_state = connector->state;
+
                if (!connector_state->best_encoder)
                        continue;
 
@@ -13718,6 +13732,7 @@ intel_check_cursor_plane(struct drm_plane *plane,
        struct drm_crtc *crtc = crtc_state->base.crtc;
        struct drm_framebuffer *fb = state->base.fb;
        struct drm_i915_gem_object *obj = intel_fb_obj(fb);
+       enum pipe pipe = to_intel_plane(plane)->pipe;
        unsigned stride;
        int ret;
 
@@ -13751,6 +13766,22 @@ intel_check_cursor_plane(struct drm_plane *plane,
                return -EINVAL;
        }
 
+       /*
+        * There's something wrong with the cursor on CHV pipe C.
+        * If it straddles the left edge of the screen then
+        * moving it away from the edge or disabling it often
+        * results in a pipe underrun, and often that can lead to
+        * dead pipe (constant underrun reported, and it scans
+        * out just a solid color). To recover from that, the
+        * display power well must be turned off and on again.
+        * Refuse the put the cursor into that compromised position.
+        */
+       if (IS_CHERRYVIEW(plane->dev) && pipe == PIPE_C &&
+           state->visible && state->base.crtc_x < 0) {
+               DRM_DEBUG_KMS("CHV cursor C not allowed to straddle the left screen edge\n");
+               return -EINVAL;
+       }
+
        return 0;
 }
 
@@ -13774,9 +13805,6 @@ intel_commit_cursor_plane(struct drm_plane *plane,
        crtc = crtc ? crtc : plane->crtc;
        intel_crtc = to_intel_crtc(crtc);
 
-       if (intel_crtc->cursor_bo == obj)
-               goto update;
-
        if (!obj)
                addr = 0;
        else if (!INTEL_INFO(dev)->cursor_needs_physical)
@@ -13785,9 +13813,7 @@ intel_commit_cursor_plane(struct drm_plane *plane,
                addr = obj->phys_handle->busaddr;
 
        intel_crtc->cursor_addr = addr;
-       intel_crtc->cursor_bo = obj;
 
-update:
        if (crtc->state->active)
                intel_crtc_update_cursor(crtc, state->visible);
 }
index f2a1142..0d00f07 100644 (file)
@@ -550,7 +550,6 @@ struct intel_crtc {
        int adjusted_x;
        int adjusted_y;
 
-       struct drm_i915_gem_object *cursor_bo;
        uint32_t cursor_addr;
        uint32_t cursor_cntl;
        uint32_t cursor_size;
index 81cdd9f..e6c035b 100644 (file)
@@ -1374,17 +1374,18 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
        struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
        bool live_status = false;
-       unsigned int retry = 3;
+       unsigned int try;
 
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
                      connector->base.id, connector->name);
 
        intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
 
-       while (!live_status && --retry) {
+       for (try = 0; !live_status && try < 9; try++) {
+               if (try)
+                       msleep(10);
                live_status = intel_digital_port_connected(dev_priv,
                                hdmi_to_dig_port(intel_hdmi));
-               mdelay(10);
        }
 
        if (!live_status)
index ffa902e..05a8954 100644 (file)
@@ -156,6 +156,7 @@ nv40_gr_chan_new(struct nvkm_gr *base, struct nvkm_fifo_chan *fifoch,
                return -ENOMEM;
        nvkm_object_ctor(&nv40_gr_chan, oclass, &chan->object);
        chan->gr = gr;
+       chan->fifo = fifoch;
        *pobject = &chan->object;
 
        spin_lock_irqsave(&chan->gr->base.engine.lock, flags);
index 43006db..80fed7e 100644 (file)
@@ -83,6 +83,7 @@ nvbios_fan_parse(struct nvkm_bios *bios, struct nvbios_therm_fan *fan)
                        fan->type = NVBIOS_THERM_FAN_UNK;
                }
 
+               fan->fan_mode = NVBIOS_THERM_FAN_LINEAR;
                fan->min_duty = nvbios_rd08(bios, data + 0x02);
                fan->max_duty = nvbios_rd08(bios, data + 0x03);
 
index 7d7ae97..e38c2bb 100644 (file)
@@ -34,8 +34,7 @@ static int get_sem(struct device *dev, u32 *sem)
        u32 data;
        int ret;
 
-       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ, PUNIT_SEMAPHORE,
-                               &data);
+       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, PUNIT_SEMAPHORE, &data);
        if (ret) {
                dev_err(dev, "iosf failed to read punit semaphore\n");
                return ret;
@@ -50,21 +49,19 @@ static void reset_semaphore(struct device *dev)
 {
        u32 data;
 
-       if (iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
-                               PUNIT_SEMAPHORE, &data)) {
+       if (iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, PUNIT_SEMAPHORE, &data)) {
                dev_err(dev, "iosf failed to reset punit semaphore during read\n");
                return;
        }
 
        data &= ~PUNIT_SEMAPHORE_BIT;
-       if (iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
-                               PUNIT_SEMAPHORE, data))
+       if (iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE, PUNIT_SEMAPHORE, data))
                dev_err(dev, "iosf failed to reset punit semaphore during write\n");
 }
 
 static int baytrail_i2c_acquire(struct dw_i2c_dev *dev)
 {
-       u32 sem;
+       u32 sem = PUNIT_SEMAPHORE_ACQUIRE;
        int ret;
        unsigned long start, end;
 
@@ -77,8 +74,7 @@ static int baytrail_i2c_acquire(struct dw_i2c_dev *dev)
                return 0;
 
        /* host driver writes to side band semaphore register */
-       ret = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
-                               PUNIT_SEMAPHORE, PUNIT_SEMAPHORE_ACQUIRE);
+       ret = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE, PUNIT_SEMAPHORE, sem);
        if (ret) {
                dev_err(dev->dev, "iosf punit semaphore request failed\n");
                return ret;
@@ -102,8 +98,7 @@ static int baytrail_i2c_acquire(struct dw_i2c_dev *dev)
        dev_err(dev->dev, "punit semaphore timed out, resetting\n");
        reset_semaphore(dev->dev);
 
-       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
-                               PUNIT_SEMAPHORE, &sem);
+       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ, PUNIT_SEMAPHORE, &sem);
        if (ret)
                dev_err(dev->dev, "iosf failed to read punit semaphore\n");
        else
index 6b00061..bf72ae7 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 #include <linux/io.h>
 #include <linux/slab.h>
 #include <linux/acpi.h>
@@ -122,6 +123,7 @@ static const struct acpi_device_id dw_i2c_acpi_match[] = {
        { "80860F41", 0 },
        { "808622C1", 0 },
        { "AMD0010", ACCESS_INTR_MASK },
+       { "APMC0D0F", 0 },
        { }
 };
 MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
@@ -134,10 +136,10 @@ static inline int dw_i2c_acpi_configure(struct platform_device *pdev)
 
 static int dw_i2c_plat_probe(struct platform_device *pdev)
 {
+       struct dw_i2c_platform_data *pdata = dev_get_platdata(&pdev->dev);
        struct dw_i2c_dev *dev;
        struct i2c_adapter *adap;
        struct resource *mem;
-       struct dw_i2c_platform_data *pdata;
        int irq, r;
        u32 clk_freq, ht = 0;
 
@@ -161,33 +163,28 @@ static int dw_i2c_plat_probe(struct platform_device *pdev)
        /* fast mode by default because of legacy reasons */
        clk_freq = 400000;
 
-       if (has_acpi_companion(&pdev->dev)) {
-               dw_i2c_acpi_configure(pdev);
-       } else if (pdev->dev.of_node) {
-               of_property_read_u32(pdev->dev.of_node,
-                                       "i2c-sda-hold-time-ns", &ht);
-
-               of_property_read_u32(pdev->dev.of_node,
-                                    "i2c-sda-falling-time-ns",
-                                    &dev->sda_falling_time);
-               of_property_read_u32(pdev->dev.of_node,
-                                    "i2c-scl-falling-time-ns",
-                                    &dev->scl_falling_time);
-
-               of_property_read_u32(pdev->dev.of_node, "clock-frequency",
-                                    &clk_freq);
-
-               /* Only standard mode at 100kHz and fast mode at 400kHz
-                * are supported.
-                */
-               if (clk_freq != 100000 && clk_freq != 400000) {
-                       dev_err(&pdev->dev, "Only 100kHz and 400kHz supported");
-                       return -EINVAL;
-               }
+       if (pdata) {
+               clk_freq = pdata->i2c_scl_freq;
        } else {
-               pdata = dev_get_platdata(&pdev->dev);
-               if (pdata)
-                       clk_freq = pdata->i2c_scl_freq;
+               device_property_read_u32(&pdev->dev, "i2c-sda-hold-time-ns",
+                                        &ht);
+               device_property_read_u32(&pdev->dev, "i2c-sda-falling-time-ns",
+                                        &dev->sda_falling_time);
+               device_property_read_u32(&pdev->dev, "i2c-scl-falling-time-ns",
+                                        &dev->scl_falling_time);
+               device_property_read_u32(&pdev->dev, "clock-frequency",
+                                        &clk_freq);
+       }
+
+       if (has_acpi_companion(&pdev->dev))
+               dw_i2c_acpi_configure(pdev);
+
+       /*
+        * Only standard mode at 100kHz and fast mode at 400kHz are supported.
+        */
+       if (clk_freq != 100000 && clk_freq != 400000) {
+               dev_err(&pdev->dev, "Only 100kHz and 400kHz supported");
+               return -EINVAL;
        }
 
        r = i2c_dw_eval_lock_support(dev);
index d2d5d00..2d762a2 100644 (file)
@@ -1265,15 +1265,17 @@ static bool cma_protocol_roce(const struct rdma_cm_id *id)
        return cma_protocol_roce_dev_port(device, port_num);
 }
 
-static bool cma_match_net_dev(const struct rdma_id_private *id_priv,
-                             const struct net_device *net_dev)
+static bool cma_match_net_dev(const struct rdma_cm_id *id,
+                             const struct net_device *net_dev,
+                             u8 port_num)
 {
-       const struct rdma_addr *addr = &id_priv->id.route.addr;
+       const struct rdma_addr *addr = &id->route.addr;
 
        if (!net_dev)
                /* This request is an AF_IB request or a RoCE request */
-               return addr->src_addr.ss_family == AF_IB ||
-                      cma_protocol_roce(&id_priv->id);
+               return (!id->port_num || id->port_num == port_num) &&
+                      (addr->src_addr.ss_family == AF_IB ||
+                       cma_protocol_roce_dev_port(id->device, port_num));
 
        return !addr->dev_addr.bound_dev_if ||
               (net_eq(dev_net(net_dev), addr->dev_addr.net) &&
@@ -1295,13 +1297,13 @@ static struct rdma_id_private *cma_find_listener(
        hlist_for_each_entry(id_priv, &bind_list->owners, node) {
                if (cma_match_private_data(id_priv, ib_event->private_data)) {
                        if (id_priv->id.device == cm_id->device &&
-                           cma_match_net_dev(id_priv, net_dev))
+                           cma_match_net_dev(&id_priv->id, net_dev, req->port))
                                return id_priv;
                        list_for_each_entry(id_priv_dev,
                                            &id_priv->listen_list,
                                            listen_list) {
                                if (id_priv_dev->id.device == cm_id->device &&
-                                   cma_match_net_dev(id_priv_dev, net_dev))
+                                   cma_match_net_dev(&id_priv_dev->id, net_dev, req->port))
                                        return id_priv_dev;
                        }
                }
index 8d133c4..c394376 100644 (file)
@@ -286,7 +286,7 @@ int mlx4_ib_destroy_srq(struct ib_srq *srq)
                mlx4_ib_db_unmap_user(to_mucontext(srq->uobject->context), &msrq->db);
                ib_umem_release(msrq->umem);
        } else {
-               kfree(msrq->wrid);
+               kvfree(msrq->wrid);
                mlx4_buf_free(dev->dev, msrq->msrq.max << msrq->msrq.wqe_shift,
                              &msrq->buf);
                mlx4_db_free(dev->dev, &msrq->db);
index ae80590..040bb8b 100644 (file)
@@ -232,6 +232,10 @@ struct phy_info {
        u16 interface_type;
 };
 
+enum ocrdma_flags {
+       OCRDMA_FLAGS_LINK_STATUS_INIT = 0x01
+};
+
 struct ocrdma_dev {
        struct ib_device ibdev;
        struct ocrdma_dev_attr attr;
@@ -287,6 +291,7 @@ struct ocrdma_dev {
        atomic_t update_sl;
        u16 pvid;
        u32 asic_id;
+       u32 flags;
 
        ulong last_stats_time;
        struct mutex stats_lock; /* provide synch for debugfs operations */
@@ -591,4 +596,9 @@ static inline u8 ocrdma_is_enabled_and_synced(u32 state)
                (state & OCRDMA_STATE_FLAG_SYNC);
 }
 
+static inline u8 ocrdma_get_ae_link_state(u32 ae_state)
+{
+       return ((ae_state & OCRDMA_AE_LSC_LS_MASK) >> OCRDMA_AE_LSC_LS_SHIFT);
+}
+
 #endif
index 30f67be..283ca84 100644 (file)
@@ -579,6 +579,8 @@ static int ocrdma_mbx_create_mq(struct ocrdma_dev *dev,
 
        cmd->async_event_bitmap = BIT(OCRDMA_ASYNC_GRP5_EVE_CODE);
        cmd->async_event_bitmap |= BIT(OCRDMA_ASYNC_RDMA_EVE_CODE);
+       /* Request link events on this  MQ. */
+       cmd->async_event_bitmap |= BIT(OCRDMA_ASYNC_LINK_EVE_CODE);
 
        cmd->async_cqid_ringsize = cq->id;
        cmd->async_cqid_ringsize |= (ocrdma_encoded_q_len(mq->len) <<
@@ -819,20 +821,42 @@ static void ocrdma_process_grp5_aync(struct ocrdma_dev *dev,
        }
 }
 
+static void ocrdma_process_link_state(struct ocrdma_dev *dev,
+                                     struct ocrdma_ae_mcqe *cqe)
+{
+       struct ocrdma_ae_lnkst_mcqe *evt;
+       u8 lstate;
+
+       evt = (struct ocrdma_ae_lnkst_mcqe *)cqe;
+       lstate = ocrdma_get_ae_link_state(evt->speed_state_ptn);
+
+       if (!(lstate & OCRDMA_AE_LSC_LLINK_MASK))
+               return;
+
+       if (dev->flags & OCRDMA_FLAGS_LINK_STATUS_INIT)
+               ocrdma_update_link_state(dev, (lstate & OCRDMA_LINK_ST_MASK));
+}
+
 static void ocrdma_process_acqe(struct ocrdma_dev *dev, void *ae_cqe)
 {
        /* async CQE processing */
        struct ocrdma_ae_mcqe *cqe = ae_cqe;
        u32 evt_code = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_CODE_MASK) >>
                        OCRDMA_AE_MCQE_EVENT_CODE_SHIFT;
-
-       if (evt_code == OCRDMA_ASYNC_RDMA_EVE_CODE)
+       switch (evt_code) {
+       case OCRDMA_ASYNC_LINK_EVE_CODE:
+               ocrdma_process_link_state(dev, cqe);
+               break;
+       case OCRDMA_ASYNC_RDMA_EVE_CODE:
                ocrdma_dispatch_ibevent(dev, cqe);
-       else if (evt_code == OCRDMA_ASYNC_GRP5_EVE_CODE)
+               break;
+       case OCRDMA_ASYNC_GRP5_EVE_CODE:
                ocrdma_process_grp5_aync(dev, cqe);
-       else
+               break;
+       default:
                pr_err("%s(%d) invalid evt code=0x%x\n", __func__,
                       dev->id, evt_code);
+       }
 }
 
 static void ocrdma_process_mcqe(struct ocrdma_dev *dev, struct ocrdma_mcqe *cqe)
@@ -1363,7 +1387,8 @@ mbx_err:
        return status;
 }
 
-int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed)
+int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed,
+                             u8 *lnk_state)
 {
        int status = -ENOMEM;
        struct ocrdma_get_link_speed_rsp *rsp;
@@ -1384,8 +1409,11 @@ int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed)
                goto mbx_err;
 
        rsp = (struct ocrdma_get_link_speed_rsp *)cmd;
-       *lnk_speed = (rsp->pflt_pps_ld_pnum & OCRDMA_PHY_PS_MASK)
-                       >> OCRDMA_PHY_PS_SHIFT;
+       if (lnk_speed)
+               *lnk_speed = (rsp->pflt_pps_ld_pnum & OCRDMA_PHY_PS_MASK)
+                             >> OCRDMA_PHY_PS_SHIFT;
+       if (lnk_state)
+               *lnk_state = (rsp->res_lnk_st & OCRDMA_LINK_ST_MASK);
 
 mbx_err:
        kfree(cmd);
@@ -2515,9 +2543,10 @@ static int ocrdma_set_av_params(struct ocrdma_qp *qp,
        ocrdma_cpu_to_le32(&cmd->params.sgid[0], sizeof(cmd->params.sgid));
        cmd->params.vlan_dmac_b4_to_b5 = mac_addr[4] | (mac_addr[5] << 8);
 
-       if (vlan_id < 0x1000) {
-               if (dev->pfc_state) {
-                       vlan_id = 0;
+       if (vlan_id == 0xFFFF)
+               vlan_id = 0;
+       if (vlan_id || dev->pfc_state) {
+               if (!vlan_id) {
                        pr_err("ocrdma%d:Using VLAN with PFC is recommended\n",
                               dev->id);
                        pr_err("ocrdma%d:Using VLAN 0 for this connection\n",
index 7ed885c..ebc1f44 100644 (file)
@@ -106,7 +106,8 @@ void ocrdma_ring_cq_db(struct ocrdma_dev *, u16 cq_id, bool armed,
                       bool solicited, u16 cqe_popped);
 
 /* verbs specific mailbox commands */
-int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed);
+int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed,
+                             u8 *lnk_st);
 int ocrdma_query_config(struct ocrdma_dev *,
                        struct ocrdma_mbx_query_config *config);
 
@@ -153,5 +154,6 @@ char *port_speed_string(struct ocrdma_dev *dev);
 void ocrdma_init_service_level(struct ocrdma_dev *);
 void ocrdma_alloc_pd_pool(struct ocrdma_dev *dev);
 void ocrdma_free_pd_range(struct ocrdma_dev *dev);
+void ocrdma_update_link_state(struct ocrdma_dev *dev, u8 lstate);
 
 #endif                         /* __OCRDMA_HW_H__ */
index 62b7009..3afb40b 100644 (file)
@@ -290,6 +290,7 @@ static void ocrdma_remove_sysfiles(struct ocrdma_dev *dev)
 static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
 {
        int status = 0, i;
+       u8 lstate = 0;
        struct ocrdma_dev *dev;
 
        dev = (struct ocrdma_dev *)ib_alloc_device(sizeof(struct ocrdma_dev));
@@ -319,6 +320,11 @@ static struct ocrdma_dev *ocrdma_add(struct be_dev_info *dev_info)
        if (status)
                goto alloc_err;
 
+       /* Query Link state and update */
+       status = ocrdma_mbx_get_link_speed(dev, NULL, &lstate);
+       if (!status)
+               ocrdma_update_link_state(dev, lstate);
+
        for (i = 0; i < ARRAY_SIZE(ocrdma_attributes); i++)
                if (device_create_file(&dev->ibdev.dev, ocrdma_attributes[i]))
                        goto sysfs_err;
@@ -373,7 +379,7 @@ static void ocrdma_remove(struct ocrdma_dev *dev)
        ocrdma_remove_free(dev);
 }
 
-static int ocrdma_open(struct ocrdma_dev *dev)
+static int ocrdma_dispatch_port_active(struct ocrdma_dev *dev)
 {
        struct ib_event port_event;
 
@@ -384,32 +390,9 @@ static int ocrdma_open(struct ocrdma_dev *dev)
        return 0;
 }
 
-static int ocrdma_close(struct ocrdma_dev *dev)
+static int ocrdma_dispatch_port_error(struct ocrdma_dev *dev)
 {
-       int i;
-       struct ocrdma_qp *qp, **cur_qp;
        struct ib_event err_event;
-       struct ib_qp_attr attrs;
-       int attr_mask = IB_QP_STATE;
-
-       attrs.qp_state = IB_QPS_ERR;
-       mutex_lock(&dev->dev_lock);
-       if (dev->qp_tbl) {
-               cur_qp = dev->qp_tbl;
-               for (i = 0; i < OCRDMA_MAX_QP; i++) {
-                       qp = cur_qp[i];
-                       if (qp && qp->ibqp.qp_type != IB_QPT_GSI) {
-                               /* change the QP state to ERROR */
-                               _ocrdma_modify_qp(&qp->ibqp, &attrs, attr_mask);
-
-                               err_event.event = IB_EVENT_QP_FATAL;
-                               err_event.element.qp = &qp->ibqp;
-                               err_event.device = &dev->ibdev;
-                               ib_dispatch_event(&err_event);
-                       }
-               }
-       }
-       mutex_unlock(&dev->dev_lock);
 
        err_event.event = IB_EVENT_PORT_ERR;
        err_event.element.port_num = 1;
@@ -420,7 +403,7 @@ static int ocrdma_close(struct ocrdma_dev *dev)
 
 static void ocrdma_shutdown(struct ocrdma_dev *dev)
 {
-       ocrdma_close(dev);
+       ocrdma_dispatch_port_error(dev);
        ocrdma_remove(dev);
 }
 
@@ -431,18 +414,28 @@ static void ocrdma_shutdown(struct ocrdma_dev *dev)
 static void ocrdma_event_handler(struct ocrdma_dev *dev, u32 event)
 {
        switch (event) {
-       case BE_DEV_UP:
-               ocrdma_open(dev);
-               break;
-       case BE_DEV_DOWN:
-               ocrdma_close(dev);
-               break;
        case BE_DEV_SHUTDOWN:
                ocrdma_shutdown(dev);
                break;
+       default:
+               break;
        }
 }
 
+void ocrdma_update_link_state(struct ocrdma_dev *dev, u8 lstate)
+{
+       if (!(dev->flags & OCRDMA_FLAGS_LINK_STATUS_INIT)) {
+               dev->flags |= OCRDMA_FLAGS_LINK_STATUS_INIT;
+               if (!lstate)
+                       return;
+       }
+
+       if (!lstate)
+               ocrdma_dispatch_port_error(dev);
+       else
+               ocrdma_dispatch_port_active(dev);
+}
+
 static struct ocrdma_driver ocrdma_drv = {
        .name                   = "ocrdma_driver",
        .add                    = ocrdma_add,
index 6a38268..99dd6fd 100644 (file)
@@ -465,8 +465,11 @@ struct ocrdma_ae_qp_mcqe {
        u32 valid_ae_event;
 };
 
-#define OCRDMA_ASYNC_RDMA_EVE_CODE 0x14
-#define OCRDMA_ASYNC_GRP5_EVE_CODE 0x5
+enum ocrdma_async_event_code {
+       OCRDMA_ASYNC_LINK_EVE_CODE      = 0x01,
+       OCRDMA_ASYNC_GRP5_EVE_CODE      = 0x05,
+       OCRDMA_ASYNC_RDMA_EVE_CODE      = 0x14
+};
 
 enum ocrdma_async_grp5_events {
        OCRDMA_ASYNC_EVENT_QOS_VALUE    = 0x01,
@@ -489,6 +492,44 @@ enum OCRDMA_ASYNC_EVENT_TYPE {
        OCRDMA_MAX_ASYNC_ERRORS
 };
 
+struct ocrdma_ae_lnkst_mcqe {
+       u32 speed_state_ptn;
+       u32 qos_reason_falut;
+       u32 evt_tag;
+       u32 valid_ae_event;
+};
+
+enum {
+       OCRDMA_AE_LSC_PORT_NUM_MASK     = 0x3F,
+       OCRDMA_AE_LSC_PT_SHIFT          = 0x06,
+       OCRDMA_AE_LSC_PT_MASK           = (0x03 <<
+                       OCRDMA_AE_LSC_PT_SHIFT),
+       OCRDMA_AE_LSC_LS_SHIFT          = 0x08,
+       OCRDMA_AE_LSC_LS_MASK           = (0xFF <<
+                       OCRDMA_AE_LSC_LS_SHIFT),
+       OCRDMA_AE_LSC_LD_SHIFT          = 0x10,
+       OCRDMA_AE_LSC_LD_MASK           = (0xFF <<
+                       OCRDMA_AE_LSC_LD_SHIFT),
+       OCRDMA_AE_LSC_PPS_SHIFT         = 0x18,
+       OCRDMA_AE_LSC_PPS_MASK          = (0xFF <<
+                       OCRDMA_AE_LSC_PPS_SHIFT),
+       OCRDMA_AE_LSC_PPF_MASK          = 0xFF,
+       OCRDMA_AE_LSC_ER_SHIFT          = 0x08,
+       OCRDMA_AE_LSC_ER_MASK           = (0xFF <<
+                       OCRDMA_AE_LSC_ER_SHIFT),
+       OCRDMA_AE_LSC_QOS_SHIFT         = 0x10,
+       OCRDMA_AE_LSC_QOS_MASK          = (0xFFFF <<
+                       OCRDMA_AE_LSC_QOS_SHIFT)
+};
+
+enum {
+       OCRDMA_AE_LSC_PLINK_DOWN        = 0x00,
+       OCRDMA_AE_LSC_PLINK_UP          = 0x01,
+       OCRDMA_AE_LSC_LLINK_DOWN        = 0x02,
+       OCRDMA_AE_LSC_LLINK_MASK        = 0x02,
+       OCRDMA_AE_LSC_LLINK_UP          = 0x03
+};
+
 /* mailbox command request and responses */
 enum {
        OCRDMA_MBX_QUERY_CFG_CQ_OVERFLOW_SHIFT          = 2,
@@ -676,7 +717,7 @@ enum {
        OCRDMA_PHY_PFLT_SHIFT   = 0x18,
        OCRDMA_QOS_LNKSP_MASK   = 0xFFFF0000,
        OCRDMA_QOS_LNKSP_SHIFT  = 0x10,
-       OCRDMA_LLST_MASK        = 0xFF,
+       OCRDMA_LINK_ST_MASK     = 0x01,
        OCRDMA_PLFC_MASK        = 0x00000400,
        OCRDMA_PLFC_SHIFT       = 0x8,
        OCRDMA_PLRFC_MASK       = 0x00000200,
@@ -691,7 +732,7 @@ struct ocrdma_get_link_speed_rsp {
 
        u32 pflt_pps_ld_pnum;
        u32 qos_lsp;
-       u32 res_lls;
+       u32 res_lnk_st;
 };
 
 enum {
index 583001b..76e96f9 100644 (file)
@@ -171,7 +171,7 @@ static inline void get_link_speed_and_width(struct ocrdma_dev *dev,
        int status;
        u8 speed;
 
-       status = ocrdma_mbx_get_link_speed(dev, &speed);
+       status = ocrdma_mbx_get_link_speed(dev, &speed, NULL);
        if (status)
                speed = OCRDMA_PHYS_LINK_SPEED_ZERO;
 
index 3a20db4..72d6182 100644 (file)
 
 #include <linux/device.h>
 #include <linux/dma-iommu.h>
+#include <linux/gfp.h>
 #include <linux/huge_mm.h>
 #include <linux/iommu.h>
 #include <linux/iova.h>
 #include <linux/mm.h>
+#include <linux/scatterlist.h>
+#include <linux/vmalloc.h>
 
 int iommu_dma_init(void)
 {
@@ -191,6 +194,7 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, gfp_t gfp)
 {
        struct page **pages;
        unsigned int i = 0, array_size = count * sizeof(*pages);
+       unsigned int order = MAX_ORDER;
 
        if (array_size <= PAGE_SIZE)
                pages = kzalloc(array_size, GFP_KERNEL);
@@ -204,14 +208,15 @@ static struct page **__iommu_dma_alloc_pages(unsigned int count, gfp_t gfp)
 
        while (count) {
                struct page *page = NULL;
-               int j, order = __fls(count);
+               int j;
 
                /*
                 * Higher-order allocations are a convenience rather
                 * than a necessity, hence using __GFP_NORETRY until
                 * falling back to single-page allocations.
                 */
-               for (order = min(order, MAX_ORDER); order > 0; order--) {
+               for (order = min_t(unsigned int, order, __fls(count));
+                    order > 0; order--) {
                        page = alloc_pages(gfp | __GFP_NORETRY, order);
                        if (!page)
                                continue;
@@ -453,7 +458,7 @@ int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg,
                size_t s_offset = iova_offset(iovad, s->offset);
                size_t s_length = s->length;
 
-               sg_dma_address(s) = s->offset;
+               sg_dma_address(s) = s_offset;
                sg_dma_len(s) = s_length;
                s->offset -= s_offset;
                s_length = iova_align(iovad, s_length + s_offset);
index 8cf605f..dfb868e 100644 (file)
@@ -295,7 +295,7 @@ static struct iommu_gather_ops ipmmu_gather_ops = {
 
 static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain)
 {
-       phys_addr_t ttbr;
+       u64 ttbr;
 
        /*
         * Allocate the page table operations.
index f434e89..a54b339 100644 (file)
@@ -75,7 +75,7 @@ static int gennvm_block_bb(struct ppa_addr ppa, int nr_blocks, u8 *blks,
        struct nvm_block *blk;
        int i;
 
-       lun = &gn->luns[(dev->nr_luns * ppa.g.ch) + ppa.g.lun];
+       lun = &gn->luns[(dev->luns_per_chnl * ppa.g.ch) + ppa.g.lun];
 
        for (i = 0; i < nr_blocks; i++) {
                if (blks[i] == 0)
index dbedc58..61aacab 100644 (file)
@@ -4326,8 +4326,7 @@ action_store(struct mddev *mddev, const char *page, size_t len)
                        }
                        mddev_unlock(mddev);
                }
-       } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) ||
-                  test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
+       } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
                return -EBUSY;
        else if (cmd_match(page, "resync"))
                clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
@@ -4340,8 +4339,12 @@ action_store(struct mddev *mddev, const char *page, size_t len)
                        return -EINVAL;
                err = mddev_lock(mddev);
                if (!err) {
-                       clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
-                       err = mddev->pers->start_reshape(mddev);
+                       if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
+                               err =  -EBUSY;
+                       else {
+                               clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
+                               err = mddev->pers->start_reshape(mddev);
+                       }
                        mddev_unlock(mddev);
                }
                if (err)
index e87459f..acd1460 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/compiler.h>
+#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
 #include <linux/slab.h>
index b6fd904..06f00d6 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/pm.h>
 #include <linux/pm_runtime.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 
 #include "intel-lpss.h"
 
@@ -25,6 +26,20 @@ static const struct intel_lpss_platform_info spt_info = {
        .clk_rate = 120000000,
 };
 
+static struct property_entry spt_i2c_properties[] = {
+       PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 230),
+       { },
+};
+
+static struct property_set spt_i2c_pset = {
+       .properties = spt_i2c_properties,
+};
+
+static const struct intel_lpss_platform_info spt_i2c_info = {
+       .clk_rate = 120000000,
+       .pset = &spt_i2c_pset,
+};
+
 static const struct intel_lpss_platform_info bxt_info = {
        .clk_rate = 100000000,
 };
@@ -35,8 +50,8 @@ static const struct intel_lpss_platform_info bxt_i2c_info = {
 
 static const struct acpi_device_id intel_lpss_acpi_ids[] = {
        /* SPT */
-       { "INT3446", (kernel_ulong_t)&spt_info },
-       { "INT3447", (kernel_ulong_t)&spt_info },
+       { "INT3446", (kernel_ulong_t)&spt_i2c_info },
+       { "INT3447", (kernel_ulong_t)&spt_i2c_info },
        /* BXT */
        { "80860AAC", (kernel_ulong_t)&bxt_i2c_info },
        { "80860ABC", (kernel_ulong_t)&bxt_info },
index 5bfdfcc..a7136c7 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/pci.h>
 #include <linux/pm.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 
 #include "intel-lpss.h"
 
@@ -65,9 +66,35 @@ static const struct intel_lpss_platform_info spt_info = {
        .clk_rate = 120000000,
 };
 
+static struct property_entry spt_i2c_properties[] = {
+       PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 230),
+       { },
+};
+
+static struct property_set spt_i2c_pset = {
+       .properties = spt_i2c_properties,
+};
+
+static const struct intel_lpss_platform_info spt_i2c_info = {
+       .clk_rate = 120000000,
+       .pset = &spt_i2c_pset,
+};
+
+static struct property_entry uart_properties[] = {
+       PROPERTY_ENTRY_U32("reg-io-width", 4),
+       PROPERTY_ENTRY_U32("reg-shift", 2),
+       PROPERTY_ENTRY_BOOL("snps,uart-16550-compatible"),
+       { },
+};
+
+static struct property_set uart_pset = {
+       .properties = uart_properties,
+};
+
 static const struct intel_lpss_platform_info spt_uart_info = {
        .clk_rate = 120000000,
        .clk_con_id = "baudclk",
+       .pset = &uart_pset,
 };
 
 static const struct intel_lpss_platform_info bxt_info = {
@@ -77,6 +104,7 @@ static const struct intel_lpss_platform_info bxt_info = {
 static const struct intel_lpss_platform_info bxt_uart_info = {
        .clk_rate = 100000000,
        .clk_con_id = "baudclk",
+       .pset = &uart_pset,
 };
 
 static const struct intel_lpss_platform_info bxt_i2c_info = {
@@ -121,20 +149,20 @@ static const struct pci_device_id intel_lpss_pci_ids[] = {
        { PCI_VDEVICE(INTEL, 0x9d28), (kernel_ulong_t)&spt_uart_info },
        { PCI_VDEVICE(INTEL, 0x9d29), (kernel_ulong_t)&spt_info },
        { PCI_VDEVICE(INTEL, 0x9d2a), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0x9d60), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0x9d61), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0x9d62), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0x9d63), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0x9d64), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0x9d65), (kernel_ulong_t)&spt_info },
+       { PCI_VDEVICE(INTEL, 0x9d60), (kernel_ulong_t)&spt_i2c_info },
+       { PCI_VDEVICE(INTEL, 0x9d61), (kernel_ulong_t)&spt_i2c_info },
+       { PCI_VDEVICE(INTEL, 0x9d62), (kernel_ulong_t)&spt_i2c_info },
+       { PCI_VDEVICE(INTEL, 0x9d63), (kernel_ulong_t)&spt_i2c_info },
+       { PCI_VDEVICE(INTEL, 0x9d64), (kernel_ulong_t)&spt_i2c_info },
+       { PCI_VDEVICE(INTEL, 0x9d65), (kernel_ulong_t)&spt_i2c_info },
        { PCI_VDEVICE(INTEL, 0x9d66), (kernel_ulong_t)&spt_uart_info },
        /* SPT-H */
        { PCI_VDEVICE(INTEL, 0xa127), (kernel_ulong_t)&spt_uart_info },
        { PCI_VDEVICE(INTEL, 0xa128), (kernel_ulong_t)&spt_uart_info },
        { PCI_VDEVICE(INTEL, 0xa129), (kernel_ulong_t)&spt_info },
        { PCI_VDEVICE(INTEL, 0xa12a), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0xa160), (kernel_ulong_t)&spt_info },
-       { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_info },
+       { PCI_VDEVICE(INTEL, 0xa160), (kernel_ulong_t)&spt_i2c_info },
+       { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info },
        { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info },
        { }
 };
index 6255513..1743788 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/mfd/core.h>
 #include <linux/pm_qos.h>
 #include <linux/pm_runtime.h>
+#include <linux/property.h>
 #include <linux/seq_file.h>
 #include <linux/io-64-nonatomic-lo-hi.h>
 
@@ -72,7 +73,7 @@ struct intel_lpss {
        enum intel_lpss_dev_type type;
        struct clk *clk;
        struct clk_lookup *clock;
-       const struct mfd_cell *cell;
+       struct mfd_cell *cell;
        struct device *dev;
        void __iomem *priv;
        int devid;
@@ -217,6 +218,7 @@ static void intel_lpss_ltr_hide(struct intel_lpss *lpss)
 
 static int intel_lpss_assign_devs(struct intel_lpss *lpss)
 {
+       const struct mfd_cell *cell;
        unsigned int type;
 
        type = lpss->caps & LPSS_PRIV_CAPS_TYPE_MASK;
@@ -224,18 +226,22 @@ static int intel_lpss_assign_devs(struct intel_lpss *lpss)
 
        switch (type) {
        case LPSS_DEV_I2C:
-               lpss->cell = &intel_lpss_i2c_cell;
+               cell = &intel_lpss_i2c_cell;
                break;
        case LPSS_DEV_UART:
-               lpss->cell = &intel_lpss_uart_cell;
+               cell = &intel_lpss_uart_cell;
                break;
        case LPSS_DEV_SPI:
-               lpss->cell = &intel_lpss_spi_cell;
+               cell = &intel_lpss_spi_cell;
                break;
        default:
                return -ENODEV;
        }
 
+       lpss->cell = devm_kmemdup(lpss->dev, cell, sizeof(*cell), GFP_KERNEL);
+       if (!lpss->cell)
+               return -ENOMEM;
+
        lpss->type = type;
 
        return 0;
@@ -401,6 +407,8 @@ int intel_lpss_probe(struct device *dev,
        if (ret)
                return ret;
 
+       lpss->cell->pset = info->pset;
+
        intel_lpss_init_dev(lpss);
 
        lpss->devid = ida_simple_get(&intel_lpss_devid_ida, 0, 0, GFP_KERNEL);
index 2c7f8d7..0dcea9e 100644 (file)
 
 struct device;
 struct resource;
+struct property_set;
 
 struct intel_lpss_platform_info {
        struct resource *mem;
        int irq;
        unsigned long clk_rate;
        const char *clk_con_id;
+       struct property_set *pset;
 };
 
 int intel_lpss_probe(struct device *dev,
index 60b60dc..88bd1b1 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/acpi.h>
+#include <linux/property.h>
 #include <linux/mfd/core.h>
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
@@ -192,6 +193,12 @@ static int mfd_add_device(struct device *parent, int id,
                        goto fail_alias;
        }
 
+       if (cell->pset) {
+               ret = platform_device_add_properties(pdev, cell->pset);
+               if (ret)
+                       goto fail_alias;
+       }
+
        ret = mfd_platform_add_cell(pdev, cell, usage_count);
        if (ret)
                goto fail_alias;
index 95c13b2..ffa2884 100644 (file)
@@ -426,15 +426,6 @@ int add_mtd_device(struct mtd_info *mtd)
        mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1;
        mtd->writesize_mask = (1 << mtd->writesize_shift) - 1;
 
-       if (mtd->dev.parent) {
-               if (!mtd->owner && mtd->dev.parent->driver)
-                       mtd->owner = mtd->dev.parent->driver->owner;
-               if (!mtd->name)
-                       mtd->name = dev_name(mtd->dev.parent);
-       } else {
-               pr_debug("mtd device won't show a device symlink in sysfs\n");
-       }
-
        /* Some chips always power up locked. Unlock them now */
        if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) {
                error = mtd_unlock(mtd, 0, mtd->size);
@@ -549,6 +540,21 @@ static int mtd_add_device_partitions(struct mtd_info *mtd,
        return 0;
 }
 
+/*
+ * Set a few defaults based on the parent devices, if not provided by the
+ * driver
+ */
+static void mtd_set_dev_defaults(struct mtd_info *mtd)
+{
+       if (mtd->dev.parent) {
+               if (!mtd->owner && mtd->dev.parent->driver)
+                       mtd->owner = mtd->dev.parent->driver->owner;
+               if (!mtd->name)
+                       mtd->name = dev_name(mtd->dev.parent);
+       } else {
+               pr_debug("mtd device won't show a device symlink in sysfs\n");
+       }
+}
 
 /**
  * mtd_device_parse_register - parse partitions and register an MTD device.
@@ -587,6 +593,8 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
        int ret;
        struct mtd_partition *real_parts = NULL;
 
+       mtd_set_dev_defaults(mtd);
+
        ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data);
        if (ret <= 0 && nr_parts && parts) {
                real_parts = kmemdup(parts, sizeof(*parts) * nr_parts,
index 4988390..32477c4 100644 (file)
@@ -516,8 +516,8 @@ static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
        status_old = read_sr(nor);
 
        /* Cannot unlock; would unlock larger region than requested */
-       if (stm_is_locked_sr(nor, status_old, ofs - mtd->erasesize,
-                            mtd->erasesize))
+       if (stm_is_locked_sr(nor, ofs - mtd->erasesize, mtd->erasesize,
+                            status_old))
                return -EINVAL;
 
        /*
@@ -1200,8 +1200,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
 
        if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
            JEDEC_MFR(info) == SNOR_MFR_INTEL ||
-           JEDEC_MFR(info) == SNOR_MFR_SST ||
-           JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
+           JEDEC_MFR(info) == SNOR_MFR_SST) {
                write_enable(nor);
                write_sr(nor, 0);
        }
@@ -1217,8 +1216,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
        mtd->_read = spi_nor_read;
 
        /* NOR protection support for STmicro/Micron chips and similar */
-       if (JEDEC_MFR(info) == SNOR_MFR_MICRON ||
-           JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
+       if (JEDEC_MFR(info) == SNOR_MFR_MICRON) {
                nor->flash_lock = stm_lock;
                nor->flash_unlock = stm_unlock;
                nor->flash_is_locked = stm_is_locked;
index b077e43..c4cb15a 100644 (file)
@@ -236,7 +236,7 @@ int ubi_debugfs_init(void)
 
        dfs_rootdir = debugfs_create_dir("ubi", NULL);
        if (IS_ERR_OR_NULL(dfs_rootdir)) {
-               int err = dfs_rootdir ? -ENODEV : PTR_ERR(dfs_rootdir);
+               int err = dfs_rootdir ? PTR_ERR(dfs_rootdir) : -ENODEV;
 
                pr_err("UBI error: cannot create \"ubi\" debugfs directory, error %d\n",
                       err);
index 1fc23e4..10cf3b5 100644 (file)
@@ -1299,7 +1299,7 @@ static int self_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum)
        if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
                goto exit;
 
-       crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_EC_HDR_SIZE_CRC);
+       crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
        hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);
        if (hdr_crc != crc) {
                ubi_err(ubi, "bad VID header CRC at PEB %d, calculated %#08x, read %#08x",
index eb4489f..5606563 100644 (file)
@@ -603,6 +603,7 @@ static int schedule_erase(struct ubi_device *ubi, struct ubi_wl_entry *e,
        return 0;
 }
 
+static int __erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk);
 /**
  * do_sync_erase - run the erase worker synchronously.
  * @ubi: UBI device description object
@@ -615,20 +616,16 @@ static int schedule_erase(struct ubi_device *ubi, struct ubi_wl_entry *e,
 static int do_sync_erase(struct ubi_device *ubi, struct ubi_wl_entry *e,
                         int vol_id, int lnum, int torture)
 {
-       struct ubi_work *wl_wrk;
+       struct ubi_work wl_wrk;
 
        dbg_wl("sync erase of PEB %i", e->pnum);
 
-       wl_wrk = kmalloc(sizeof(struct ubi_work), GFP_NOFS);
-       if (!wl_wrk)
-               return -ENOMEM;
-
-       wl_wrk->e = e;
-       wl_wrk->vol_id = vol_id;
-       wl_wrk->lnum = lnum;
-       wl_wrk->torture = torture;
+       wl_wrk.e = e;
+       wl_wrk.vol_id = vol_id;
+       wl_wrk.lnum = lnum;
+       wl_wrk.torture = torture;
 
-       return erase_worker(ubi, wl_wrk, 0);
+       return __erase_worker(ubi, &wl_wrk);
 }
 
 /**
@@ -1014,7 +1011,7 @@ out_unlock:
 }
 
 /**
- * erase_worker - physical eraseblock erase worker function.
+ * __erase_worker - physical eraseblock erase worker function.
  * @ubi: UBI device description object
  * @wl_wrk: the work object
  * @shutdown: non-zero if the worker has to free memory and exit
@@ -1025,8 +1022,7 @@ out_unlock:
  * needed. Returns zero in case of success and a negative error code in case of
  * failure.
  */
-static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
-                       int shutdown)
+static int __erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk)
 {
        struct ubi_wl_entry *e = wl_wrk->e;
        int pnum = e->pnum;
@@ -1034,21 +1030,11 @@ static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
        int lnum = wl_wrk->lnum;
        int err, available_consumed = 0;
 
-       if (shutdown) {
-               dbg_wl("cancel erasure of PEB %d EC %d", pnum, e->ec);
-               kfree(wl_wrk);
-               wl_entry_destroy(ubi, e);
-               return 0;
-       }
-
        dbg_wl("erase PEB %d EC %d LEB %d:%d",
               pnum, e->ec, wl_wrk->vol_id, wl_wrk->lnum);
 
        err = sync_erase(ubi, e, wl_wrk->torture);
        if (!err) {
-               /* Fine, we've erased it successfully */
-               kfree(wl_wrk);
-
                spin_lock(&ubi->wl_lock);
                wl_tree_add(e, &ubi->free);
                ubi->free_count++;
@@ -1066,7 +1052,6 @@ static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
        }
 
        ubi_err(ubi, "failed to erase PEB %d, error %d", pnum, err);
-       kfree(wl_wrk);
 
        if (err == -EINTR || err == -ENOMEM || err == -EAGAIN ||
            err == -EBUSY) {
@@ -1075,6 +1060,7 @@ static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
                /* Re-schedule the LEB for erasure */
                err1 = schedule_erase(ubi, e, vol_id, lnum, 0);
                if (err1) {
+                       wl_entry_destroy(ubi, e);
                        err = err1;
                        goto out_ro;
                }
@@ -1150,6 +1136,25 @@ out_ro:
        return err;
 }
 
+static int erase_worker(struct ubi_device *ubi, struct ubi_work *wl_wrk,
+                         int shutdown)
+{
+       int ret;
+
+       if (shutdown) {
+               struct ubi_wl_entry *e = wl_wrk->e;
+
+               dbg_wl("cancel erasure of PEB %d EC %d", e->pnum, e->ec);
+               kfree(wl_wrk);
+               wl_entry_destroy(ubi, e);
+               return 0;
+       }
+
+       ret = __erase_worker(ubi, wl_wrk);
+       kfree(wl_wrk);
+       return ret;
+}
+
 /**
  * ubi_wl_put_peb - return a PEB to the wear-leveling sub-system.
  * @ubi: UBI device description object
index f8d7a2f..c82ab87 100644 (file)
@@ -3430,25 +3430,29 @@ static u32 bnx2x_xmit_type(struct bnx2x *bp, struct sk_buff *skb)
        return rc;
 }
 
-#if (MAX_SKB_FRAGS >= MAX_FETCH_BD - 3)
+/* VXLAN: 4 = 1 (for linear data BD) + 3 (2 for PBD and last BD) */
+#define BNX2X_NUM_VXLAN_TSO_WIN_SUB_BDS         4
+
+/* Regular: 3 = 1 (for linear data BD) + 2 (for PBD and last BD) */
+#define BNX2X_NUM_TSO_WIN_SUB_BDS               3
+
+#if (MAX_SKB_FRAGS >= MAX_FETCH_BD - BDS_PER_TX_PKT)
 /* check if packet requires linearization (packet is too fragmented)
    no need to check fragmentation if page size > 8K (there will be no
    violation to FW restrictions) */
 static int bnx2x_pkt_req_lin(struct bnx2x *bp, struct sk_buff *skb,
                             u32 xmit_type)
 {
-       int to_copy = 0;
-       int hlen = 0;
-       int first_bd_sz = 0;
+       int first_bd_sz = 0, num_tso_win_sub = BNX2X_NUM_TSO_WIN_SUB_BDS;
+       int to_copy = 0, hlen = 0;
 
-       /* 3 = 1 (for linear data BD) + 2 (for PBD and last BD) */
-       if (skb_shinfo(skb)->nr_frags >= (MAX_FETCH_BD - 3)) {
+       if (xmit_type & XMIT_GSO_ENC)
+               num_tso_win_sub = BNX2X_NUM_VXLAN_TSO_WIN_SUB_BDS;
 
+       if (skb_shinfo(skb)->nr_frags >= (MAX_FETCH_BD - num_tso_win_sub)) {
                if (xmit_type & XMIT_GSO) {
                        unsigned short lso_mss = skb_shinfo(skb)->gso_size;
-                       /* Check if LSO packet needs to be copied:
-                          3 = 1 (for headers BD) + 2 (for PBD and last BD) */
-                       int wnd_size = MAX_FETCH_BD - 3;
+                       int wnd_size = MAX_FETCH_BD - num_tso_win_sub;
                        /* Number of windows to check */
                        int num_wnds = skb_shinfo(skb)->nr_frags - wnd_size;
                        int wnd_idx = 0;
index c308429..11dd91e 100644 (file)
@@ -295,6 +295,10 @@ struct clip_tbl *t4_init_clip_tbl(unsigned int clipt_start,
                INIT_LIST_HEAD(&ctbl->hash_list[i]);
 
        cl_list = t4_alloc_mem(clipt_size*sizeof(struct clip_entry));
+       if (!cl_list) {
+               t4_free_mem(ctbl);
+               return NULL;
+       }
        ctbl->cl_list = (void *)cl_list;
 
        for (i = 0; i < clipt_size; i++) {
index d463563..6ee78c2 100644 (file)
@@ -848,8 +848,6 @@ void be_roce_dev_remove(struct be_adapter *);
 /*
  * internal function to open-close roce device during ifup-ifdown.
  */
-void be_roce_dev_open(struct be_adapter *);
-void be_roce_dev_close(struct be_adapter *);
 void be_roce_dev_shutdown(struct be_adapter *);
 
 #endif                         /* BE_H */
index b6ad029..8a1d9ff 100644 (file)
@@ -3299,8 +3299,10 @@ static int be_msix_register(struct be_adapter *adapter)
 
        return 0;
 err_msix:
-       for (i--, eqo = &adapter->eq_obj[i]; i >= 0; i--, eqo--)
+       for (i--; i >= 0; i--) {
+               eqo = &adapter->eq_obj[i];
                free_irq(be_msix_vec_get(adapter, eqo), eqo);
+       }
        dev_warn(&adapter->pdev->dev, "MSIX Request IRQ failed - err %d\n",
                 status);
        be_msix_disable(adapter);
@@ -3432,8 +3434,6 @@ static int be_close(struct net_device *netdev)
 
        be_disable_if_filters(adapter);
 
-       be_roce_dev_close(adapter);
-
        if (adapter->flags & BE_FLAGS_NAPI_ENABLED) {
                for_all_evt_queues(adapter, eqo, i) {
                        napi_disable(&eqo->napi);
@@ -3601,8 +3601,6 @@ static int be_open(struct net_device *netdev)
                be_link_status_update(adapter, link_status);
 
        netif_tx_start_all_queues(netdev);
-       be_roce_dev_open(adapter);
-
 #ifdef CONFIG_BE2NET_VXLAN
        if (skyhawk_chip(adapter))
                vxlan_get_rx_port(netdev);
index 6036820..4089156 100644 (file)
@@ -116,40 +116,6 @@ void be_roce_dev_remove(struct be_adapter *adapter)
        }
 }
 
-static void _be_roce_dev_open(struct be_adapter *adapter)
-{
-       if (ocrdma_drv && adapter->ocrdma_dev &&
-           ocrdma_drv->state_change_handler)
-               ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
-                                                BE_DEV_UP);
-}
-
-void be_roce_dev_open(struct be_adapter *adapter)
-{
-       if (be_roce_supported(adapter)) {
-               mutex_lock(&be_adapter_list_lock);
-               _be_roce_dev_open(adapter);
-               mutex_unlock(&be_adapter_list_lock);
-       }
-}
-
-static void _be_roce_dev_close(struct be_adapter *adapter)
-{
-       if (ocrdma_drv && adapter->ocrdma_dev &&
-           ocrdma_drv->state_change_handler)
-               ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
-                                                BE_DEV_DOWN);
-}
-
-void be_roce_dev_close(struct be_adapter *adapter)
-{
-       if (be_roce_supported(adapter)) {
-               mutex_lock(&be_adapter_list_lock);
-               _be_roce_dev_close(adapter);
-               mutex_unlock(&be_adapter_list_lock);
-       }
-}
-
 void be_roce_dev_shutdown(struct be_adapter *adapter)
 {
        if (be_roce_supported(adapter)) {
@@ -177,8 +143,6 @@ int be_roce_register_driver(struct ocrdma_driver *drv)
 
                _be_roce_dev_add(dev);
                netdev = dev->netdev;
-               if (netif_running(netdev) && netif_oper_up(netdev))
-                       _be_roce_dev_open(dev);
        }
        mutex_unlock(&be_adapter_list_lock);
        return 0;
index cde6ef9..fde6097 100644 (file)
@@ -60,9 +60,7 @@ struct ocrdma_driver {
        void (*state_change_handler) (struct ocrdma_dev *, u32 new_state);
 };
 
-enum {
-       BE_DEV_UP       = 0,
-       BE_DEV_DOWN     = 1,
+enum be_roce_event {
        BE_DEV_SHUTDOWN = 2
 };
 
index 8a083d7..038f9ce 100644 (file)
@@ -242,6 +242,13 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
        unsigned long flags;
        u64 ns, zero = 0;
 
+       /* mlx4_en_init_timestamp is called for each netdev.
+        * mdev->ptp_clock is common for all ports, skip initialization if
+        * was done for other port.
+        */
+       if (mdev->ptp_clock)
+               return;
+
        rwlock_init(&mdev->clock_lock);
 
        memset(&mdev->cycles, 0, sizeof(mdev->cycles));
index 005f910..e0ec280 100644 (file)
@@ -232,9 +232,6 @@ static void mlx4_en_remove(struct mlx4_dev *dev, void *endev_ptr)
                if (mdev->pndev[i])
                        mlx4_en_destroy_netdev(mdev->pndev[i]);
 
-       if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
-               mlx4_en_remove_timestamp(mdev);
-
        flush_workqueue(mdev->workqueue);
        destroy_workqueue(mdev->workqueue);
        (void) mlx4_mr_free(dev, &mdev->mr);
@@ -320,10 +317,6 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
        mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH)
                mdev->port_cnt++;
 
-       /* Initialize time stamp mechanism */
-       if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
-               mlx4_en_init_timestamp(mdev);
-
        /* Set default number of RX rings*/
        mlx4_en_set_num_rx_rings(mdev);
 
index 886e1bc..7869f97 100644 (file)
@@ -2072,6 +2072,9 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
        /* flush any pending task for this netdev */
        flush_workqueue(mdev->workqueue);
 
+       if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
+               mlx4_en_remove_timestamp(mdev);
+
        /* Detach the netdev so tasks would not attempt to access it */
        mutex_lock(&mdev->state_lock);
        mdev->pndev[priv->port] = NULL;
@@ -3058,9 +3061,12 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
        }
        queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
 
+       /* Initialize time stamp mechanism */
        if (mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_TS)
-               queue_delayed_work(mdev->workqueue, &priv->service_task,
-                                  SERVICE_TASK_DELAY);
+               mlx4_en_init_timestamp(mdev);
+
+       queue_delayed_work(mdev->workqueue, &priv->service_task,
+                          SERVICE_TASK_DELAY);
 
        mlx4_en_set_stats_bitmap(mdev->dev, &priv->stats_bitmap,
                                 mdev->profile.prof[priv->port].rx_ppp,
index b83f7c0..122c2ee 100644 (file)
@@ -1937,6 +1937,12 @@ static void refill_rx(struct net_device *dev)
                                break; /* Better luck next round. */
                        np->rx_dma[entry] = pci_map_single(np->pci_dev,
                                skb->data, buflen, PCI_DMA_FROMDEVICE);
+                       if (pci_dma_mapping_error(np->pci_dev,
+                                                 np->rx_dma[entry])) {
+                               dev_kfree_skb_any(skb);
+                               np->rx_skbuff[entry] = NULL;
+                               break; /* Better luck next round. */
+                       }
                        np->rx_ring[entry].addr = cpu_to_le32(np->rx_dma[entry]);
                }
                np->rx_ring[entry].cmd_status = cpu_to_le32(np->rx_buf_sz);
@@ -2093,6 +2099,12 @@ static netdev_tx_t start_tx(struct sk_buff *skb, struct net_device *dev)
        np->tx_skbuff[entry] = skb;
        np->tx_dma[entry] = pci_map_single(np->pci_dev,
                                skb->data,skb->len, PCI_DMA_TODEVICE);
+       if (pci_dma_mapping_error(np->pci_dev, np->tx_dma[entry])) {
+               np->tx_skbuff[entry] = NULL;
+               dev_kfree_skb_irq(skb);
+               dev->stats.tx_dropped++;
+               return NETDEV_TX_OK;
+       }
 
        np->tx_ring[entry].addr = cpu_to_le32(np->tx_dma[entry]);
 
index b1a452f..3490675 100644 (file)
@@ -252,7 +252,7 @@ int qlcnic_83xx_check_vnic_state(struct qlcnic_adapter *adapter)
                state = QLCRDX(ahw, QLC_83XX_VNIC_STATE);
        }
 
-       if (!idc->vnic_wait_limit) {
+       if (state != QLCNIC_DEV_NPAR_OPER) {
                dev_err(&adapter->pdev->dev,
                        "vNIC mode not operational, state check timed out.\n");
                return -EIO;
index a5f422f..daf0515 100644 (file)
@@ -772,8 +772,10 @@ int qlcnic_82xx_config_intrpt(struct qlcnic_adapter *adapter, u8 op_type)
        int i, err = 0;
 
        for (i = 0; i < ahw->num_msix; i++) {
-               qlcnic_alloc_mbx_args(&cmd, adapter,
-                                     QLCNIC_CMD_MQ_TX_CONFIG_INTR);
+               err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                           QLCNIC_CMD_MQ_TX_CONFIG_INTR);
+               if (err)
+                       return err;
                type = op_type ? QLCNIC_INTRPT_ADD : QLCNIC_INTRPT_DEL;
                val = type | (ahw->intr_tbl[i].type << 4);
                if (ahw->intr_tbl[i].type == QLCNIC_INTRPT_MSIX)
index a0eaf50..6a8fc0f 100644 (file)
@@ -1167,6 +1167,7 @@ static void sh_eth_ring_format(struct net_device *ndev)
        int tx_ringsize = sizeof(*txdesc) * mdp->num_tx_ring;
        int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN + 32 - 1;
        dma_addr_t dma_addr;
+       u32 buf_len;
 
        mdp->cur_rx = 0;
        mdp->cur_tx = 0;
@@ -1187,9 +1188,9 @@ static void sh_eth_ring_format(struct net_device *ndev)
                /* RX descriptor */
                rxdesc = &mdp->rx_ring[i];
                /* The size of the buffer is a multiple of 32 bytes. */
-               rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 32);
-               dma_addr = dma_map_single(&ndev->dev, skb->data,
-                                         rxdesc->buffer_length,
+               buf_len = ALIGN(mdp->rx_buf_sz, 32);
+               rxdesc->len = cpu_to_edmac(mdp, buf_len << 16);
+               dma_addr = dma_map_single(&ndev->dev, skb->data, buf_len,
                                          DMA_FROM_DEVICE);
                if (dma_mapping_error(&ndev->dev, dma_addr)) {
                        kfree_skb(skb);
@@ -1220,7 +1221,7 @@ static void sh_eth_ring_format(struct net_device *ndev)
                mdp->tx_skbuff[i] = NULL;
                txdesc = &mdp->tx_ring[i];
                txdesc->status = cpu_to_edmac(mdp, TD_TFP);
-               txdesc->buffer_length = 0;
+               txdesc->len = cpu_to_edmac(mdp, 0);
                if (i == 0) {
                        /* Tx descriptor address set */
                        sh_eth_write(ndev, mdp->tx_desc_dma, TDLAR);
@@ -1429,7 +1430,8 @@ static int sh_eth_txfree(struct net_device *ndev)
                if (mdp->tx_skbuff[entry]) {
                        dma_unmap_single(&ndev->dev,
                                         edmac_to_cpu(mdp, txdesc->addr),
-                                        txdesc->buffer_length, DMA_TO_DEVICE);
+                                        edmac_to_cpu(mdp, txdesc->len) >> 16,
+                                        DMA_TO_DEVICE);
                        dev_kfree_skb_irq(mdp->tx_skbuff[entry]);
                        mdp->tx_skbuff[entry] = NULL;
                        free_num++;
@@ -1439,7 +1441,7 @@ static int sh_eth_txfree(struct net_device *ndev)
                        txdesc->status |= cpu_to_edmac(mdp, TD_TDLE);
 
                ndev->stats.tx_packets++;
-               ndev->stats.tx_bytes += txdesc->buffer_length;
+               ndev->stats.tx_bytes += edmac_to_cpu(mdp, txdesc->len) >> 16;
        }
        return free_num;
 }
@@ -1458,6 +1460,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
        u32 desc_status;
        int skbuff_size = mdp->rx_buf_sz + SH_ETH_RX_ALIGN + 32 - 1;
        dma_addr_t dma_addr;
+       u32 buf_len;
 
        boguscnt = min(boguscnt, *quota);
        limit = boguscnt;
@@ -1466,7 +1469,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
                /* RACT bit must be checked before all the following reads */
                dma_rmb();
                desc_status = edmac_to_cpu(mdp, rxdesc->status);
-               pkt_len = rxdesc->frame_length;
+               pkt_len = edmac_to_cpu(mdp, rxdesc->len) & RD_RFL;
 
                if (--boguscnt < 0)
                        break;
@@ -1532,7 +1535,8 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
                entry = mdp->dirty_rx % mdp->num_rx_ring;
                rxdesc = &mdp->rx_ring[entry];
                /* The size of the buffer is 32 byte boundary. */
-               rxdesc->buffer_length = ALIGN(mdp->rx_buf_sz, 32);
+               buf_len = ALIGN(mdp->rx_buf_sz, 32);
+               rxdesc->len = cpu_to_edmac(mdp, buf_len << 16);
 
                if (mdp->rx_skbuff[entry] == NULL) {
                        skb = netdev_alloc_skb(ndev, skbuff_size);
@@ -1540,8 +1544,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
                                break;  /* Better luck next round. */
                        sh_eth_set_receive_align(skb);
                        dma_addr = dma_map_single(&ndev->dev, skb->data,
-                                                 rxdesc->buffer_length,
-                                                 DMA_FROM_DEVICE);
+                                                 buf_len, DMA_FROM_DEVICE);
                        if (dma_mapping_error(&ndev->dev, dma_addr)) {
                                kfree_skb(skb);
                                break;
@@ -2407,7 +2410,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
                return NETDEV_TX_OK;
        }
        txdesc->addr = cpu_to_edmac(mdp, dma_addr);
-       txdesc->buffer_length = skb->len;
+       txdesc->len  = cpu_to_edmac(mdp, skb->len << 16);
 
        dma_wmb(); /* TACT bit must be set after all the above writes */
        if (entry >= mdp->num_tx_ring - 1)
index 26ad1cf..72fcfc9 100644 (file)
@@ -283,7 +283,7 @@ enum DMAC_IM_BIT {
        DMAC_M_RINT1 = 0x00000001,
 };
 
-/* Receive descriptor bit */
+/* Receive descriptor 0 bits */
 enum RD_STS_BIT {
        RD_RACT = 0x80000000, RD_RDLE = 0x40000000,
        RD_RFP1 = 0x20000000, RD_RFP0 = 0x10000000,
@@ -298,6 +298,12 @@ enum RD_STS_BIT {
 #define RDFEND RD_RFP0
 #define RD_RFP (RD_RFP1|RD_RFP0)
 
+/* Receive descriptor 1 bits */
+enum RD_LEN_BIT {
+       RD_RFL  = 0x0000ffff,   /* receive frame  length */
+       RD_RBL  = 0xffff0000,   /* receive buffer length */
+};
+
 /* FCFTR */
 enum FCFTR_BIT {
        FCFTR_RFF2 = 0x00040000, FCFTR_RFF1 = 0x00020000,
@@ -307,7 +313,7 @@ enum FCFTR_BIT {
 #define DEFAULT_FIFO_F_D_RFF   (FCFTR_RFF2 | FCFTR_RFF1 | FCFTR_RFF0)
 #define DEFAULT_FIFO_F_D_RFD   (FCFTR_RFD2 | FCFTR_RFD1 | FCFTR_RFD0)
 
-/* Transmit descriptor bit */
+/* Transmit descriptor 0 bits */
 enum TD_STS_BIT {
        TD_TACT = 0x80000000, TD_TDLE = 0x40000000,
        TD_TFP1 = 0x20000000, TD_TFP0 = 0x10000000,
@@ -317,6 +323,11 @@ enum TD_STS_BIT {
 #define TDFEND TD_TFP0
 #define TD_TFP (TD_TFP1|TD_TFP0)
 
+/* Transmit descriptor 1 bits */
+enum TD_LEN_BIT {
+       TD_TBL  = 0xffff0000,   /* transmit buffer length */
+};
+
 /* RMCR */
 enum RMCR_BIT {
        RMCR_RNC = 0x00000001,
@@ -425,15 +436,9 @@ enum TSU_FWSLC_BIT {
  */
 struct sh_eth_txdesc {
        u32 status;             /* TD0 */
-#if defined(__LITTLE_ENDIAN)
-       u16 pad0;               /* TD1 */
-       u16 buffer_length;      /* TD1 */
-#else
-       u16 buffer_length;      /* TD1 */
-       u16 pad0;               /* TD1 */
-#endif
+       u32 len;                /* TD1 */
        u32 addr;               /* TD2 */
-       u32 pad1;               /* padding data */
+       u32 pad0;               /* padding data */
 } __aligned(2) __packed;
 
 /* The sh ether Rx buffer descriptors.
@@ -441,13 +446,7 @@ struct sh_eth_txdesc {
  */
 struct sh_eth_rxdesc {
        u32 status;             /* RD0 */
-#if defined(__LITTLE_ENDIAN)
-       u16 frame_length;       /* RD1 */
-       u16 buffer_length;      /* RD1 */
-#else
-       u16 buffer_length;      /* RD1 */
-       u16 frame_length;       /* RD1 */
-#endif
+       u32 len;                /* RD1 */
        u32 addr;               /* RD2 */
        u32 pad0;               /* padding data */
 } __aligned(2) __packed;
index 48b92c9..fc95806 100644 (file)
@@ -2026,45 +2026,54 @@ static int cpsw_probe_dt(struct cpsw_priv *priv,
        for_each_child_of_node(node, slave_node) {
                struct cpsw_slave_data *slave_data = data->slave_data + i;
                const void *mac_addr = NULL;
-               u32 phyid;
                int lenp;
                const __be32 *parp;
-               struct device_node *mdio_node;
-               struct platform_device *mdio;
 
                /* This is no slave child node, continue */
                if (strcmp(slave_node->name, "slave"))
                        continue;
 
                priv->phy_node = of_parse_phandle(slave_node, "phy-handle", 0);
+               parp = of_get_property(slave_node, "phy_id", &lenp);
                if (of_phy_is_fixed_link(slave_node)) {
-                       struct phy_device *pd;
+                       struct device_node *phy_node;
+                       struct phy_device *phy_dev;
 
+                       /* In the case of a fixed PHY, the DT node associated
+                        * to the PHY is the Ethernet MAC DT node.
+                        */
                        ret = of_phy_register_fixed_link(slave_node);
                        if (ret)
                                return ret;
-                       pd = of_phy_find_device(slave_node);
-                       if (!pd)
+                       phy_node = of_node_get(slave_node);
+                       phy_dev = of_phy_find_device(phy_node);
+                       if (!phy_dev)
                                return -ENODEV;
                        snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
-                                PHY_ID_FMT, pd->bus->id, pd->phy_id);
-                       goto no_phy_slave;
-               }
-               parp = of_get_property(slave_node, "phy_id", &lenp);
-               if ((parp == NULL) || (lenp != (sizeof(void *) * 2))) {
-                       dev_err(&pdev->dev, "Missing slave[%d] phy_id property\n", i);
+                                PHY_ID_FMT, phy_dev->bus->id, phy_dev->addr);
+               } else if (parp) {
+                       u32 phyid;
+                       struct device_node *mdio_node;
+                       struct platform_device *mdio;
+
+                       if (lenp != (sizeof(__be32) * 2)) {
+                               dev_err(&pdev->dev, "Invalid slave[%d] phy_id property\n", i);
+                               goto no_phy_slave;
+                       }
+                       mdio_node = of_find_node_by_phandle(be32_to_cpup(parp));
+                       phyid = be32_to_cpup(parp+1);
+                       mdio = of_find_device_by_node(mdio_node);
+                       of_node_put(mdio_node);
+                       if (!mdio) {
+                               dev_err(&pdev->dev, "Missing mdio platform device\n");
+                               return -EINVAL;
+                       }
+                       snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
+                                PHY_ID_FMT, mdio->name, phyid);
+               } else {
+                       dev_err(&pdev->dev, "No slave[%d] phy_id or fixed-link property\n", i);
                        goto no_phy_slave;
                }
-               mdio_node = of_find_node_by_phandle(be32_to_cpup(parp));
-               phyid = be32_to_cpup(parp+1);
-               mdio = of_find_device_by_node(mdio_node);
-               of_node_put(mdio_node);
-               if (!mdio) {
-                       dev_err(&pdev->dev, "Missing mdio platform device\n");
-                       return -EINVAL;
-               }
-               snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
-                        PHY_ID_FMT, mdio->name, phyid);
                slave_data->phy_if = of_get_phy_mode(slave_node);
                if (slave_data->phy_if < 0) {
                        dev_err(&pdev->dev, "Missing or malformed slave[%d] phy-mode property\n",
@@ -2418,7 +2427,7 @@ static int cpsw_probe(struct platform_device *pdev)
        ndev->irq = platform_get_irq(pdev, 1);
        if (ndev->irq < 0) {
                dev_err(priv->dev, "error getting irq resource\n");
-               ret = -ENOENT;
+               ret = ndev->irq;
                goto clean_ale_ret;
        }
 
@@ -2439,8 +2448,10 @@ static int cpsw_probe(struct platform_device *pdev)
 
        /* RX IRQ */
        irq = platform_get_irq(pdev, 1);
-       if (irq < 0)
+       if (irq < 0) {
+               ret = irq;
                goto clean_ale_ret;
+       }
 
        priv->irqs_table[0] = irq;
        ret = devm_request_irq(&pdev->dev, irq, cpsw_rx_interrupt,
@@ -2452,8 +2463,10 @@ static int cpsw_probe(struct platform_device *pdev)
 
        /* TX IRQ */
        irq = platform_get_irq(pdev, 2);
-       if (irq < 0)
+       if (irq < 0) {
+               ret = irq;
                goto clean_ale_ret;
+       }
 
        priv->irqs_table[1] = irq;
        ret = devm_request_irq(&pdev->dev, irq, cpsw_tx_interrupt,
index c2b79f5..58efdec 100644 (file)
@@ -1155,7 +1155,7 @@ static int geneve_configure(struct net *net, struct net_device *dev,
        struct geneve_net *gn = net_generic(net, geneve_net_id);
        struct geneve_dev *t, *geneve = netdev_priv(dev);
        bool tun_collect_md, tun_on_same_port;
-       int err;
+       int err, encap_len;
 
        if (!remote)
                return -EINVAL;
@@ -1187,6 +1187,14 @@ static int geneve_configure(struct net *net, struct net_device *dev,
        if (t)
                return -EBUSY;
 
+       /* make enough headroom for basic scenario */
+       encap_len = GENEVE_BASE_HLEN + ETH_HLEN;
+       if (remote->sa.sa_family == AF_INET)
+               encap_len += sizeof(struct iphdr);
+       else
+               encap_len += sizeof(struct ipv6hdr);
+       dev->needed_headroom = encap_len + ETH_HLEN;
+
        if (metadata) {
                if (tun_on_same_port)
                        return -EPERM;
index 7c4a415..5a1e985 100644 (file)
@@ -683,14 +683,20 @@ static void sixpack_close(struct tty_struct *tty)
        if (!atomic_dec_and_test(&sp->refcnt))
                down(&sp->dead_sem);
 
-       unregister_netdev(sp->dev);
+       /* We must stop the queue to avoid potentially scribbling
+        * on the free buffers. The sp->dead_sem is not sufficient
+        * to protect us from sp->xbuff access.
+        */
+       netif_stop_queue(sp->dev);
 
-       del_timer(&sp->tx_t);
-       del_timer(&sp->resync_t);
+       del_timer_sync(&sp->tx_t);
+       del_timer_sync(&sp->resync_t);
 
        /* Free all 6pack frame buffers. */
        kfree(sp->rbuff);
        kfree(sp->xbuff);
+
+       unregister_netdev(sp->dev);
 }
 
 /* Perform I/O control on an active 6pack channel. */
index 216bfd3..85828f1 100644 (file)
@@ -797,14 +797,19 @@ static void mkiss_close(struct tty_struct *tty)
         */
        if (!atomic_dec_and_test(&ax->refcnt))
                down(&ax->dead_sem);
-
-       unregister_netdev(ax->dev);
+       /*
+        * Halt the transmit queue so that a new transmit cannot scribble
+        * on our buffers
+        */
+       netif_stop_queue(ax->dev);
 
        /* Free all AX25 frame buffers. */
        kfree(ax->rbuff);
        kfree(ax->xbuff);
 
        ax->tty = NULL;
+
+       unregister_netdev(ax->dev);
 }
 
 /* Perform I/O control on an active ax25 channel. */
index 8973abd..bdd83d9 100644 (file)
@@ -100,7 +100,7 @@ static const struct net_device_ops cdc_mbim_netdev_ops = {
        .ndo_stop             = usbnet_stop,
        .ndo_start_xmit       = usbnet_start_xmit,
        .ndo_tx_timeout       = usbnet_tx_timeout,
-       .ndo_change_mtu       = usbnet_change_mtu,
+       .ndo_change_mtu       = cdc_ncm_change_mtu,
        .ndo_set_mac_address  = eth_mac_addr,
        .ndo_validate_addr    = eth_validate_addr,
        .ndo_vlan_rx_add_vid  = cdc_mbim_rx_add_vid,
index 1e9843a..e8a1144 100644 (file)
@@ -41,6 +41,7 @@
 #include <linux/module.h>
 #include <linux/netdevice.h>
 #include <linux/ctype.h>
+#include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/workqueue.h>
 #include <linux/mii.h>
@@ -689,6 +690,33 @@ static void cdc_ncm_free(struct cdc_ncm_ctx *ctx)
        kfree(ctx);
 }
 
+/* we need to override the usbnet change_mtu ndo for two reasons:
+ *  - respect the negotiated maximum datagram size
+ *  - avoid unwanted changes to rx and tx buffers
+ */
+int cdc_ncm_change_mtu(struct net_device *net, int new_mtu)
+{
+       struct usbnet *dev = netdev_priv(net);
+       struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];
+       int maxmtu = ctx->max_datagram_size - cdc_ncm_eth_hlen(dev);
+
+       if (new_mtu <= 0 || new_mtu > maxmtu)
+               return -EINVAL;
+       net->mtu = new_mtu;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(cdc_ncm_change_mtu);
+
+static const struct net_device_ops cdc_ncm_netdev_ops = {
+       .ndo_open            = usbnet_open,
+       .ndo_stop            = usbnet_stop,
+       .ndo_start_xmit      = usbnet_start_xmit,
+       .ndo_tx_timeout      = usbnet_tx_timeout,
+       .ndo_change_mtu      = cdc_ncm_change_mtu,
+       .ndo_set_mac_address = eth_mac_addr,
+       .ndo_validate_addr   = eth_validate_addr,
+};
+
 int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting, int drvflags)
 {
        struct cdc_ncm_ctx *ctx;
@@ -823,6 +851,9 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
        /* add our sysfs attrs */
        dev->net->sysfs_groups[0] = &cdc_ncm_sysfs_attr_group;
 
+       /* must handle MTU changes */
+       dev->net->netdev_ops = &cdc_ncm_netdev_ops;
+
        return 0;
 
 error2:
@@ -1558,6 +1589,24 @@ static const struct usb_device_id cdc_devs[] = {
          .driver_info = (unsigned long) &wwan_info,
        },
 
+       /* DW5812 LTE Verizon Mobile Broadband Card
+        * Unlike DW5550 this device requires FLAG_NOARP
+        */
+       { USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x81bb,
+               USB_CLASS_COMM,
+               USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
+         .driver_info = (unsigned long)&wwan_noarp_info,
+       },
+
+       /* DW5813 LTE AT&T Mobile Broadband Card
+        * Unlike DW5550 this device requires FLAG_NOARP
+        */
+       { USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x81bc,
+               USB_CLASS_COMM,
+               USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
+         .driver_info = (unsigned long)&wwan_noarp_info,
+       },
+
        /* Dell branded MBM devices like DW5550 */
        { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
                | USB_DEVICE_ID_MATCH_VENDOR,
index 9a5be8b..5fccc5a 100644 (file)
@@ -742,6 +742,7 @@ static const struct usb_device_id products[] = {
        {QMI_FIXED_INTF(0x413c, 0x81a9, 8)},    /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */
        {QMI_FIXED_INTF(0x413c, 0x81b1, 8)},    /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */
        {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)},    /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */
+       {QMI_FIXED_INTF(0x22de, 0x9061, 3)},    /* WeTelecom WPD-600N */
 
        /* 4. Gobi 1000 devices */
        {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},    /* Acer Gobi Modem Device */
index 2e32c41..2fb637a 100644 (file)
@@ -3525,6 +3525,14 @@ static int rtl8152_resume(struct usb_interface *intf)
        return 0;
 }
 
+static int rtl8152_reset_resume(struct usb_interface *intf)
+{
+       struct r8152 *tp = usb_get_intfdata(intf);
+
+       clear_bit(SELECTIVE_SUSPEND, &tp->flags);
+       return rtl8152_resume(intf);
+}
+
 static void rtl8152_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 {
        struct r8152 *tp = netdev_priv(dev);
@@ -4276,7 +4284,7 @@ static struct usb_driver rtl8152_driver = {
        .disconnect =   rtl8152_disconnect,
        .suspend =      rtl8152_suspend,
        .resume =       rtl8152_resume,
-       .reset_resume = rtl8152_resume,
+       .reset_resume = rtl8152_reset_resume,
        .pre_reset =    rtl8152_pre_reset,
        .post_reset =   rtl8152_post_reset,
        .supports_autosuspend = 1,
index 0ef4a5a..ba21d07 100644 (file)
@@ -117,12 +117,6 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
                kfree_skb(skb);
                goto drop;
        }
-       /* don't change ip_summed == CHECKSUM_PARTIAL, as that
-        * will cause bad checksum on forwarded packets
-        */
-       if (skb->ip_summed == CHECKSUM_NONE &&
-           rcv->features & NETIF_F_RXCSUM)
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        if (likely(dev_forward_skb(rcv, skb) == NET_RX_SUCCESS)) {
                struct pcpu_vstats *stats = this_cpu_ptr(dev->vstats);
index 4179037..0cbf520 100644 (file)
@@ -1380,10 +1380,10 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
                                        skip_page_frags = true;
                                        goto rcd_done;
                                }
-                               new_dma_addr = dma_map_page(&adapter->pdev->dev
-                                                       , rbi->page,
-                                                       0, PAGE_SIZE,
-                                                       PCI_DMA_FROMDEVICE);
+                               new_dma_addr = dma_map_page(&adapter->pdev->dev,
+                                                           new_page,
+                                                           0, PAGE_SIZE,
+                                                           PCI_DMA_FROMDEVICE);
                                if (dma_mapping_error(&adapter->pdev->dev,
                                                      new_dma_addr)) {
                                        put_page(new_page);
index 4c58c83..bdb8a6c 100644 (file)
 /*
  * Version numbers
  */
-#define VMXNET3_DRIVER_VERSION_STRING   "1.4.4.0-k"
+#define VMXNET3_DRIVER_VERSION_STRING   "1.4.5.0-k"
 
 /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */
-#define VMXNET3_DRIVER_VERSION_NUM      0x01040400
+#define VMXNET3_DRIVER_VERSION_NUM      0x01040500
 
 #if defined(CONFIG_PCI_MSI)
        /* RSS only makes sense if MSI-X is supported. */
index 4f97484..0a242b2 100644 (file)
@@ -800,7 +800,7 @@ static struct rtable *vrf_get_rtable(const struct net_device *dev,
 }
 
 /* called under rcu_read_lock */
-static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
+static int vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
 {
        struct fib_result res = { .tclassid = 0 };
        struct net *net = dev_net(dev);
@@ -808,9 +808,10 @@ static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
        u8 flags = fl4->flowi4_flags;
        u8 scope = fl4->flowi4_scope;
        u8 tos = RT_FL_TOS(fl4);
+       int rc;
 
        if (unlikely(!fl4->daddr))
-               return;
+               return 0;
 
        fl4->flowi4_flags |= FLOWI_FLAG_SKIP_NH_OIF;
        fl4->flowi4_iif = LOOPBACK_IFINDEX;
@@ -818,7 +819,8 @@ static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
        fl4->flowi4_scope = ((tos & RTO_ONLINK) ?
                             RT_SCOPE_LINK : RT_SCOPE_UNIVERSE);
 
-       if (!fib_lookup(net, fl4, &res, 0)) {
+       rc = fib_lookup(net, fl4, &res, 0);
+       if (!rc) {
                if (res.type == RTN_LOCAL)
                        fl4->saddr = res.fi->fib_prefsrc ? : fl4->daddr;
                else
@@ -828,6 +830,8 @@ static void vrf_get_saddr(struct net_device *dev, struct flowi4 *fl4)
        fl4->flowi4_flags = flags;
        fl4->flowi4_tos = orig_tos;
        fl4->flowi4_scope = scope;
+
+       return rc;
 }
 
 #if IS_ENABLED(CONFIG_IPV6)
index bf88ec3..d9a4aee 100644 (file)
 #include "iwl-agn-hw.h"
 
 /* Highest firmware API version supported */
-#define IWL7260_UCODE_API_MAX  19
+#define IWL7260_UCODE_API_MAX  17
+#define IWL7265_UCODE_API_MAX  19
+#define IWL7265D_UCODE_API_MAX 19
 
 /* Oldest version we won't warn about */
 #define IWL7260_UCODE_API_OK   13
+#define IWL7265_UCODE_API_OK   13
+#define IWL7265D_UCODE_API_OK  13
 
 /* Lowest firmware API version supported */
 #define IWL7260_UCODE_API_MIN  13
+#define IWL7265_UCODE_API_MIN  13
+#define IWL7265D_UCODE_API_MIN 13
 
 /* NVM versions */
 #define IWL7260_NVM_VERSION            0x0a1d
@@ -149,10 +155,7 @@ static const struct iwl_ht_params iwl7000_ht_params = {
        .ht40_bands = BIT(IEEE80211_BAND_2GHZ) | BIT(IEEE80211_BAND_5GHZ),
 };
 
-#define IWL_DEVICE_7000                                                \
-       .ucode_api_max = IWL7260_UCODE_API_MAX,                 \
-       .ucode_api_ok = IWL7260_UCODE_API_OK,                   \
-       .ucode_api_min = IWL7260_UCODE_API_MIN,                 \
+#define IWL_DEVICE_7000_COMMON                                 \
        .device_family = IWL_DEVICE_FAMILY_7000,                \
        .max_inst_size = IWL60_RTC_INST_SIZE,                   \
        .max_data_size = IWL60_RTC_DATA_SIZE,                   \
@@ -163,6 +166,24 @@ static const struct iwl_ht_params iwl7000_ht_params = {
        .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K,    \
        .dccm_offset = IWL7000_DCCM_OFFSET
 
+#define IWL_DEVICE_7000                                                \
+       IWL_DEVICE_7000_COMMON,                                 \
+       .ucode_api_max = IWL7260_UCODE_API_MAX,                 \
+       .ucode_api_ok = IWL7260_UCODE_API_OK,                   \
+       .ucode_api_min = IWL7260_UCODE_API_MIN
+
+#define IWL_DEVICE_7005                                                \
+       IWL_DEVICE_7000_COMMON,                                 \
+       .ucode_api_max = IWL7265_UCODE_API_MAX,                 \
+       .ucode_api_ok = IWL7265_UCODE_API_OK,                   \
+       .ucode_api_min = IWL7265_UCODE_API_MIN
+
+#define IWL_DEVICE_7005D                                       \
+       IWL_DEVICE_7000_COMMON,                                 \
+       .ucode_api_max = IWL7265D_UCODE_API_MAX,                \
+       .ucode_api_ok = IWL7265D_UCODE_API_OK,                  \
+       .ucode_api_min = IWL7265D_UCODE_API_MIN
+
 const struct iwl_cfg iwl7260_2ac_cfg = {
        .name = "Intel(R) Dual Band Wireless AC 7260",
        .fw_name_pre = IWL7260_FW_PRE,
@@ -266,7 +287,7 @@ static const struct iwl_ht_params iwl7265_ht_params = {
 const struct iwl_cfg iwl3165_2ac_cfg = {
        .name = "Intel(R) Dual Band Wireless AC 3165",
        .fw_name_pre = IWL7265D_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005D,
        .ht_params = &iwl7000_ht_params,
        .nvm_ver = IWL3165_NVM_VERSION,
        .nvm_calib_ver = IWL3165_TX_POWER_VERSION,
@@ -277,7 +298,7 @@ const struct iwl_cfg iwl3165_2ac_cfg = {
 const struct iwl_cfg iwl7265_2ac_cfg = {
        .name = "Intel(R) Dual Band Wireless AC 7265",
        .fw_name_pre = IWL7265_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005,
        .ht_params = &iwl7265_ht_params,
        .nvm_ver = IWL7265_NVM_VERSION,
        .nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -288,7 +309,7 @@ const struct iwl_cfg iwl7265_2ac_cfg = {
 const struct iwl_cfg iwl7265_2n_cfg = {
        .name = "Intel(R) Dual Band Wireless N 7265",
        .fw_name_pre = IWL7265_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005,
        .ht_params = &iwl7265_ht_params,
        .nvm_ver = IWL7265_NVM_VERSION,
        .nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -299,7 +320,7 @@ const struct iwl_cfg iwl7265_2n_cfg = {
 const struct iwl_cfg iwl7265_n_cfg = {
        .name = "Intel(R) Wireless N 7265",
        .fw_name_pre = IWL7265_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005,
        .ht_params = &iwl7265_ht_params,
        .nvm_ver = IWL7265_NVM_VERSION,
        .nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -310,7 +331,7 @@ const struct iwl_cfg iwl7265_n_cfg = {
 const struct iwl_cfg iwl7265d_2ac_cfg = {
        .name = "Intel(R) Dual Band Wireless AC 7265",
        .fw_name_pre = IWL7265D_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005D,
        .ht_params = &iwl7265_ht_params,
        .nvm_ver = IWL7265D_NVM_VERSION,
        .nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -321,7 +342,7 @@ const struct iwl_cfg iwl7265d_2ac_cfg = {
 const struct iwl_cfg iwl7265d_2n_cfg = {
        .name = "Intel(R) Dual Band Wireless N 7265",
        .fw_name_pre = IWL7265D_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005D,
        .ht_params = &iwl7265_ht_params,
        .nvm_ver = IWL7265D_NVM_VERSION,
        .nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -332,7 +353,7 @@ const struct iwl_cfg iwl7265d_2n_cfg = {
 const struct iwl_cfg iwl7265d_n_cfg = {
        .name = "Intel(R) Wireless N 7265",
        .fw_name_pre = IWL7265D_FW_PRE,
-       IWL_DEVICE_7000,
+       IWL_DEVICE_7005D,
        .ht_params = &iwl7265_ht_params,
        .nvm_ver = IWL7265D_NVM_VERSION,
        .nvm_calib_ver = IWL7265_TX_POWER_VERSION,
@@ -342,5 +363,5 @@ const struct iwl_cfg iwl7265d_n_cfg = {
 
 MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
 MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
-MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
-MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
+MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7265_UCODE_API_OK));
+MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7265D_UCODE_API_OK));
index 354acbd..2b976b1 100644 (file)
@@ -1222,8 +1222,8 @@ static u8 iwl_mvm_get_key_sta_id(struct iwl_mvm *mvm,
            mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
                u8 sta_id = mvmvif->ap_sta_id;
 
-               sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
-                                               lockdep_is_held(&mvm->mutex));
+               sta = rcu_dereference_check(mvm->fw_id_to_mac_id[sta_id],
+                                           lockdep_is_held(&mvm->mutex));
                /*
                 * It is possible that the 'sta' parameter is NULL,
                 * for example when a GTK is removed - the sta_id will then
@@ -1590,14 +1590,15 @@ void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
                             u16 *phase1key)
 {
        struct iwl_mvm_sta *mvm_sta;
-       u8 sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
+       u8 sta_id;
        bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE);
 
-       if (WARN_ON_ONCE(sta_id == IWL_MVM_STATION_COUNT))
-               return;
-
        rcu_read_lock();
 
+       sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
+       if (WARN_ON_ONCE(sta_id == IWL_MVM_STATION_COUNT))
+               goto unlock;
+
        if (!sta) {
                sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
                if (WARN_ON(IS_ERR_OR_NULL(sta))) {
@@ -1609,6 +1610,8 @@ void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
        mvm_sta = iwl_mvm_sta_from_mac80211(sta);
        iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf, mcast,
                             iv32, phase1key, CMD_ASYNC, keyconf->hw_key_idx);
+
+ unlock:
        rcu_read_unlock();
 }
 
index 9e294ff..0c67b57 100644 (file)
@@ -2540,8 +2540,17 @@ static void nvme_ns_remove(struct nvme_ns *ns)
 {
        bool kill = nvme_io_incapable(ns->dev) && !blk_queue_dying(ns->queue);
 
-       if (kill)
+       if (kill) {
                blk_set_queue_dying(ns->queue);
+
+               /*
+                * The controller was shutdown first if we got here through
+                * device removal. The shutdown may requeue outstanding
+                * requests. These need to be aborted immediately so
+                * del_gendisk doesn't block indefinitely for their completion.
+                */
+               blk_mq_abort_requeue_list(ns->queue);
+       }
        if (ns->disk->flags & GENHD_FL_UP)
                del_gendisk(ns->disk);
        if (kill || !blk_queue_dying(ns->queue)) {
@@ -2977,6 +2986,15 @@ static void nvme_dev_remove(struct nvme_dev *dev)
 {
        struct nvme_ns *ns, *next;
 
+       if (nvme_io_incapable(dev)) {
+               /*
+                * If the device is not capable of IO (surprise hot-removal,
+                * for example), we need to quiesce prior to deleting the
+                * namespaces. This will end outstanding requests and prevent
+                * attempts to sync dirty data.
+                */
+               nvme_dev_shutdown(dev);
+       }
        list_for_each_entry_safe(ns, next, &dev->namespaces, list)
                nvme_ns_remove(ns);
 }
index f131ba9..c0ad9aa 100644 (file)
@@ -5,6 +5,7 @@ config PCI_DRA7XX
        bool "TI DRA7xx PCIe controller"
        select PCIE_DW
        depends on OF && HAS_IOMEM && TI_PIPE3
+       depends on BROKEN
        help
         Enables support for the PCIe controller in the DRA7xx SoC.  There
         are two instances of PCIe controller in DRA7xx.  This controller can
index 163671a..77f7c66 100644 (file)
@@ -61,7 +61,9 @@ static int hisi_pcie_cfg_read(struct pcie_port *pp, int where, int size,
                *val = *(u8 __force *) walker;
        else if (size == 2)
                *val = *(u16 __force *) walker;
-       else if (size != 4)
+       else if (size == 4)
+               *val = reg_val;
+       else
                return PCIBIOS_BAD_REGISTER_NUMBER;
 
        return PCIBIOS_SUCCESSFUL;
index f2d77fe..cb8a9c2 100644 (file)
@@ -43,8 +43,6 @@ MODULE_LICENSE("GPL");
 
 #define DELL_EVENT_GUID "9DBB5994-A997-11DA-B012-B622A1EF5492"
 
-static int acpi_video;
-
 MODULE_ALIAS("wmi:"DELL_EVENT_GUID);
 
 /*
@@ -159,7 +157,8 @@ static void dell_wmi_process_key(int reported_key)
 
        /* Don't report brightness notifications that will also come via ACPI */
        if ((key->keycode == KEY_BRIGHTNESSUP ||
-            key->keycode == KEY_BRIGHTNESSDOWN) && acpi_video)
+            key->keycode == KEY_BRIGHTNESSDOWN) &&
+           acpi_video_handles_brightness_key_presses())
                return;
 
        sparse_keymap_report_entry(dell_wmi_input_dev, key, 1, true);
@@ -398,7 +397,6 @@ static int __init dell_wmi_init(void)
        }
 
        dmi_walk(find_hk_type, NULL);
-       acpi_video = acpi_video_get_backlight_type() != acpi_backlight_vendor;
 
        err = dell_wmi_input_setup();
        if (err)
index 0bed473..f453d5d 100644 (file)
@@ -3488,7 +3488,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
        /* Do not issue duplicate brightness change events to
         * userspace. tpacpi_detect_brightness_capabilities() must have
         * been called before this point  */
-       if (acpi_video_get_backlight_type() != acpi_backlight_vendor) {
+       if (acpi_video_handles_brightness_key_presses()) {
                pr_info("This ThinkPad has standard ACPI backlight "
                        "brightness control, supported by the ACPI "
                        "video driver\n");
index 48747c2..4099159 100644 (file)
@@ -988,16 +988,16 @@ static void set_floor_freq_atom(struct rapl_domain *rd, bool enable)
        }
 
        if (!power_ctrl_orig_val)
-               iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_PMC_READ,
-                       rapl_defaults->floor_freq_reg_addr,
-                               &power_ctrl_orig_val);
+               iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_CR_READ,
+                             rapl_defaults->floor_freq_reg_addr,
+                             &power_ctrl_orig_val);
        mdata = power_ctrl_orig_val;
        if (enable) {
                mdata &= ~(0x7f << 8);
                mdata |= 1 << 8;
        }
-       iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_PMC_WRITE,
-               rapl_defaults->floor_freq_reg_addr, mdata);
+       iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_CR_WRITE,
+                      rapl_defaults->floor_freq_reg_addr, mdata);
 }
 
 static u64 rapl_compute_time_window_core(struct rapl_package *rp, u64 value,
index 61f7685..24ec282 100644 (file)
@@ -599,8 +599,10 @@ static enum ap_wait ap_sm_read(struct ap_device *ap_dev)
        status = ap_sm_recv(ap_dev);
        switch (status.response_code) {
        case AP_RESPONSE_NORMAL:
-               if (ap_dev->queue_count > 0)
+               if (ap_dev->queue_count > 0) {
+                       ap_dev->state = AP_STATE_WORKING;
                        return AP_WAIT_AGAIN;
+               }
                ap_dev->state = AP_STATE_IDLE;
                return AP_WAIT_NONE;
        case AP_RESPONSE_NO_PENDING_REPLY:
index b2a1a81..1b83159 100644 (file)
@@ -984,6 +984,36 @@ static struct virtqueue *virtio_ccw_vq_by_ind(struct virtio_ccw_device *vcdev,
        return vq;
 }
 
+static void virtio_ccw_check_activity(struct virtio_ccw_device *vcdev,
+                                     __u32 activity)
+{
+       if (vcdev->curr_io & activity) {
+               switch (activity) {
+               case VIRTIO_CCW_DOING_READ_FEAT:
+               case VIRTIO_CCW_DOING_WRITE_FEAT:
+               case VIRTIO_CCW_DOING_READ_CONFIG:
+               case VIRTIO_CCW_DOING_WRITE_CONFIG:
+               case VIRTIO_CCW_DOING_WRITE_STATUS:
+               case VIRTIO_CCW_DOING_SET_VQ:
+               case VIRTIO_CCW_DOING_SET_IND:
+               case VIRTIO_CCW_DOING_SET_CONF_IND:
+               case VIRTIO_CCW_DOING_RESET:
+               case VIRTIO_CCW_DOING_READ_VQ_CONF:
+               case VIRTIO_CCW_DOING_SET_IND_ADAPTER:
+               case VIRTIO_CCW_DOING_SET_VIRTIO_REV:
+                       vcdev->curr_io &= ~activity;
+                       wake_up(&vcdev->wait_q);
+                       break;
+               default:
+                       /* don't know what to do... */
+                       dev_warn(&vcdev->cdev->dev,
+                                "Suspicious activity '%08x'\n", activity);
+                       WARN_ON(1);
+                       break;
+               }
+       }
+}
+
 static void virtio_ccw_int_handler(struct ccw_device *cdev,
                                   unsigned long intparm,
                                   struct irb *irb)
@@ -995,6 +1025,12 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev,
 
        if (!vcdev)
                return;
+       if (IS_ERR(irb)) {
+               vcdev->err = PTR_ERR(irb);
+               virtio_ccw_check_activity(vcdev, activity);
+               /* Don't poke around indicators, something's wrong. */
+               return;
+       }
        /* Check if it's a notification from the host. */
        if ((intparm == 0) &&
            (scsw_stctl(&irb->scsw) ==
@@ -1010,31 +1046,7 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev,
                        /* Map everything else to -EIO. */
                        vcdev->err = -EIO;
        }
-       if (vcdev->curr_io & activity) {
-               switch (activity) {
-               case VIRTIO_CCW_DOING_READ_FEAT:
-               case VIRTIO_CCW_DOING_WRITE_FEAT:
-               case VIRTIO_CCW_DOING_READ_CONFIG:
-               case VIRTIO_CCW_DOING_WRITE_CONFIG:
-               case VIRTIO_CCW_DOING_WRITE_STATUS:
-               case VIRTIO_CCW_DOING_SET_VQ:
-               case VIRTIO_CCW_DOING_SET_IND:
-               case VIRTIO_CCW_DOING_SET_CONF_IND:
-               case VIRTIO_CCW_DOING_RESET:
-               case VIRTIO_CCW_DOING_READ_VQ_CONF:
-               case VIRTIO_CCW_DOING_SET_IND_ADAPTER:
-               case VIRTIO_CCW_DOING_SET_VIRTIO_REV:
-                       vcdev->curr_io &= ~activity;
-                       wake_up(&vcdev->wait_q);
-                       break;
-               default:
-                       /* don't know what to do... */
-                       dev_warn(&cdev->dev, "Suspicious activity '%08x'\n",
-                                activity);
-                       WARN_ON(1);
-                       break;
-               }
-       }
+       virtio_ccw_check_activity(vcdev, activity);
        for_each_set_bit(i, &vcdev->indicators,
                         sizeof(vcdev->indicators) * BITS_PER_BYTE) {
                /* The bit clear must happen before the vring kick. */
index 3d22fc3..4e08d1c 100644 (file)
@@ -2885,10 +2885,13 @@ static int sd_revalidate_disk(struct gendisk *disk)
 
        /*
         * Use the device's preferred I/O size for reads and writes
-        * unless the reported value is unreasonably large (or garbage).
+        * unless the reported value is unreasonably small, large, or
+        * garbage.
         */
-       if (sdkp->opt_xfer_blocks && sdkp->opt_xfer_blocks <= dev_max &&
-           sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS)
+       if (sdkp->opt_xfer_blocks &&
+           sdkp->opt_xfer_blocks <= dev_max &&
+           sdkp->opt_xfer_blocks <= SD_DEF_XFER_BLOCKS &&
+           sdkp->opt_xfer_blocks * sdp->sector_size >= PAGE_CACHE_SIZE)
                rw_max = q->limits.io_opt =
                        logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
        else
index 5ed90e6..5d33b35 100644 (file)
@@ -125,8 +125,8 @@ static int soc_dts_enable(struct thermal_zone_device *tzd)
        struct soc_sensor_entry *aux_entry = tzd->devdata;
        int ret;
 
-       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                                       QRK_DTS_REG_OFFSET_ENABLE, &out);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                           QRK_DTS_REG_OFFSET_ENABLE, &out);
        if (ret)
                return ret;
 
@@ -137,8 +137,8 @@ static int soc_dts_enable(struct thermal_zone_device *tzd)
 
        if (!aux_entry->locked) {
                out |= QRK_DTS_ENABLE_BIT;
-               ret = iosf_mbi_write(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_WRITE,
-                                       QRK_DTS_REG_OFFSET_ENABLE, out);
+               ret = iosf_mbi_write(QRK_MBI_UNIT_RMU, MBI_REG_WRITE,
+                                    QRK_DTS_REG_OFFSET_ENABLE, out);
                if (ret)
                        return ret;
 
@@ -158,8 +158,8 @@ static int soc_dts_disable(struct thermal_zone_device *tzd)
        struct soc_sensor_entry *aux_entry = tzd->devdata;
        int ret;
 
-       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                                       QRK_DTS_REG_OFFSET_ENABLE, &out);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                           QRK_DTS_REG_OFFSET_ENABLE, &out);
        if (ret)
                return ret;
 
@@ -170,8 +170,8 @@ static int soc_dts_disable(struct thermal_zone_device *tzd)
 
        if (!aux_entry->locked) {
                out &= ~QRK_DTS_ENABLE_BIT;
-               ret = iosf_mbi_write(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_WRITE,
-                                       QRK_DTS_REG_OFFSET_ENABLE, out);
+               ret = iosf_mbi_write(QRK_MBI_UNIT_RMU, MBI_REG_WRITE,
+                                    QRK_DTS_REG_OFFSET_ENABLE, out);
 
                if (ret)
                        return ret;
@@ -192,8 +192,8 @@ static int _get_trip_temp(int trip, int *temp)
        u32 out;
 
        mutex_lock(&dts_update_mutex);
-       status = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                               QRK_DTS_REG_OFFSET_PTPS, &out);
+       status = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                              QRK_DTS_REG_OFFSET_PTPS, &out);
        mutex_unlock(&dts_update_mutex);
 
        if (status)
@@ -236,8 +236,8 @@ static int update_trip_temp(struct soc_sensor_entry *aux_entry,
                goto failed;
        }
 
-       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                               QRK_DTS_REG_OFFSET_PTPS, &store_ptps);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                           QRK_DTS_REG_OFFSET_PTPS, &store_ptps);
        if (ret)
                goto failed;
 
@@ -262,8 +262,8 @@ static int update_trip_temp(struct soc_sensor_entry *aux_entry,
        out |= (temp_out & QRK_DTS_MASK_TP_THRES) <<
                (trip * QRK_DTS_SHIFT_TP);
 
-       ret = iosf_mbi_write(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_WRITE,
-                               QRK_DTS_REG_OFFSET_PTPS, out);
+       ret = iosf_mbi_write(QRK_MBI_UNIT_RMU, MBI_REG_WRITE,
+                            QRK_DTS_REG_OFFSET_PTPS, out);
 
 failed:
        mutex_unlock(&dts_update_mutex);
@@ -294,8 +294,8 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd,
        int ret;
 
        mutex_lock(&dts_update_mutex);
-       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                                       QRK_DTS_REG_OFFSET_TEMP, &out);
+       ret = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                           QRK_DTS_REG_OFFSET_TEMP, &out);
        mutex_unlock(&dts_update_mutex);
 
        if (ret)
@@ -350,13 +350,13 @@ static void free_soc_dts(struct soc_sensor_entry *aux_entry)
        if (aux_entry) {
                if (!aux_entry->locked) {
                        mutex_lock(&dts_update_mutex);
-                       iosf_mbi_write(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_WRITE,
-                                       QRK_DTS_REG_OFFSET_ENABLE,
-                                       aux_entry->store_dts_enable);
+                       iosf_mbi_write(QRK_MBI_UNIT_RMU, MBI_REG_WRITE,
+                                      QRK_DTS_REG_OFFSET_ENABLE,
+                                      aux_entry->store_dts_enable);
 
-                       iosf_mbi_write(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_WRITE,
-                                       QRK_DTS_REG_OFFSET_PTPS,
-                                       aux_entry->store_ptps);
+                       iosf_mbi_write(QRK_MBI_UNIT_RMU, MBI_REG_WRITE,
+                                      QRK_DTS_REG_OFFSET_PTPS,
+                                      aux_entry->store_ptps);
                        mutex_unlock(&dts_update_mutex);
                }
                thermal_zone_device_unregister(aux_entry->tzone);
@@ -378,9 +378,8 @@ static struct soc_sensor_entry *alloc_soc_dts(void)
        }
 
        /* Check if DTS register is locked */
-       err = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                                       QRK_DTS_REG_OFFSET_LOCK,
-                                       &out);
+       err = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                           QRK_DTS_REG_OFFSET_LOCK, &out);
        if (err)
                goto err_ret;
 
@@ -395,16 +394,16 @@ static struct soc_sensor_entry *alloc_soc_dts(void)
        /* Store DTS default state if DTS registers are not locked */
        if (!aux_entry->locked) {
                /* Store DTS default enable for restore on exit */
-               err = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                                       QRK_DTS_REG_OFFSET_ENABLE,
-                                       &aux_entry->store_dts_enable);
+               err = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                                   QRK_DTS_REG_OFFSET_ENABLE,
+                                   &aux_entry->store_dts_enable);
                if (err)
                        goto err_ret;
 
                /* Store DTS default PTPS register for restore on exit */
-               err = iosf_mbi_read(QRK_MBI_UNIT_RMU, QRK_MBI_RMU_READ,
-                                       QRK_DTS_REG_OFFSET_PTPS,
-                                       &aux_entry->store_ptps);
+               err = iosf_mbi_read(QRK_MBI_UNIT_RMU, MBI_REG_READ,
+                                   QRK_DTS_REG_OFFSET_PTPS,
+                                   &aux_entry->store_ptps);
                if (err)
                        goto err_ret;
        }
index 5841d1d..f72e1db 100644 (file)
@@ -90,7 +90,7 @@ static int sys_get_trip_temp(struct thermal_zone_device *tzd, int trip,
        dts = tzd->devdata;
        sensors = dts->sensors;
        mutex_lock(&sensors->dts_update_lock);
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_OFFSET_PTPS, &out);
        mutex_unlock(&sensors->dts_update_lock);
        if (status)
@@ -124,27 +124,27 @@ static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,
 
        temp_out = (sensors->tj_max - temp) / 1000;
 
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_OFFSET_PTPS, &store_ptps);
        if (status)
                return status;
 
        out = (store_ptps & ~(0xFF << (thres_index * 8)));
        out |= (temp_out & 0xFF) << (thres_index * 8);
-       status = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       status = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                                SOC_DTS_OFFSET_PTPS, out);
        if (status)
                return status;
 
        pr_debug("update_trip_temp PTPS = %x\n", out);
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_OFFSET_PTMC, &out);
        if (status)
                goto err_restore_ptps;
 
        store_ptmc = out;
 
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_TE_AUX0 + thres_index,
                               &te_out);
        if (status)
@@ -167,12 +167,12 @@ static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,
                        out &= ~SOC_DTS_AUX0_ENABLE_BIT;
                te_out &= ~int_enable_bit;
        }
-       status = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       status = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                                SOC_DTS_OFFSET_PTMC, out);
        if (status)
                goto err_restore_te_out;
 
-       status = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       status = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                                SOC_DTS_TE_AUX0 + thres_index,
                                te_out);
        if (status)
@@ -182,13 +182,13 @@ static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,
 
        return 0;
 err_restore_te_out:
-       iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                       SOC_DTS_OFFSET_PTMC, store_te_out);
 err_restore_ptmc:
-       iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                       SOC_DTS_OFFSET_PTMC, store_ptmc);
 err_restore_ptps:
-       iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                       SOC_DTS_OFFSET_PTPS, store_ptps);
        /* Nothing we can do if restore fails */
 
@@ -235,7 +235,7 @@ static int sys_get_curr_temp(struct thermal_zone_device *tzd,
 
        dts = tzd->devdata;
        sensors = dts->sensors;
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_OFFSET_TEMP, &out);
        if (status)
                return status;
@@ -259,14 +259,14 @@ static int soc_dts_enable(int id)
        u32 out;
        int ret;
 
-       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                            SOC_DTS_OFFSET_ENABLE, &out);
        if (ret)
                return ret;
 
        if (!(out & BIT(id))) {
                out |= BIT(id);
-               ret = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+               ret = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                                     SOC_DTS_OFFSET_ENABLE, out);
                if (ret)
                        return ret;
@@ -278,7 +278,7 @@ static int soc_dts_enable(int id)
 static void remove_dts_thermal_zone(struct intel_soc_dts_sensor_entry *dts)
 {
        if (dts) {
-               iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+               iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                               SOC_DTS_OFFSET_ENABLE, dts->store_status);
                thermal_zone_device_unregister(dts->tzone);
        }
@@ -296,9 +296,8 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
        int i;
 
        /* Store status to restor on exit */
-       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
-                           SOC_DTS_OFFSET_ENABLE,
-                           &dts->store_status);
+       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
+                           SOC_DTS_OFFSET_ENABLE, &dts->store_status);
        if (ret)
                goto err_ret;
 
@@ -311,7 +310,7 @@ static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
        }
 
        /* Check if the writable trip we provide is not used by BIOS */
-       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                            SOC_DTS_OFFSET_PTPS, &store_ptps);
        if (ret)
                trip_mask = 0;
@@ -374,19 +373,19 @@ void intel_soc_dts_iosf_interrupt_handler(struct intel_soc_dts_sensors *sensors)
 
        spin_lock_irqsave(&sensors->intr_notify_lock, flags);
 
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_OFFSET_PTMC, &ptmc_out);
        ptmc_out |= SOC_DTS_PTMC_APIC_DEASSERT_BIT;
-       status = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+       status = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                                SOC_DTS_OFFSET_PTMC, ptmc_out);
 
-       status = iosf_mbi_read(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_READ,
+       status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
                               SOC_DTS_OFFSET_PTTSS, &sticky_out);
        pr_debug("status %d PTTSS %x\n", status, sticky_out);
        if (sticky_out & SOC_DTS_TRIP_MASK) {
                int i;
                /* reset sticky bit */
-               status = iosf_mbi_write(BT_MBI_UNIT_PMC, BT_MBI_BUNIT_WRITE,
+               status = iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
                                        SOC_DTS_OFFSET_PTTSS, sticky_out);
                spin_unlock_irqrestore(&sensors->intr_notify_lock, flags);
 
index 0640318..ca0d380 100644 (file)
@@ -148,8 +148,10 @@ static int receive_chars_read(struct uart_port *port)
                        uart_handle_dcd_change(port, 1);
                }
 
-               for (i = 0; i < bytes_read; i++)
-                       uart_handle_sysrq_char(port, con_read_page[i]);
+               if (port->sysrq != 0 &&  *con_read_page) {
+                       for (i = 0; i < bytes_read; i++)
+                               uart_handle_sysrq_char(port, con_read_page[i]);
+               }
 
                if (port->state == NULL)
                        continue;
@@ -168,17 +170,17 @@ struct sunhv_ops {
        int (*receive_chars)(struct uart_port *port);
 };
 
-static struct sunhv_ops bychar_ops = {
+static const struct sunhv_ops bychar_ops = {
        .transmit_chars = transmit_chars_putchar,
        .receive_chars = receive_chars_getchar,
 };
 
-static struct sunhv_ops bywrite_ops = {
+static const struct sunhv_ops bywrite_ops = {
        .transmit_chars = transmit_chars_write,
        .receive_chars = receive_chars_read,
 };
 
-static struct sunhv_ops *sunhv_ops = &bychar_ops;
+static const struct sunhv_ops *sunhv_ops = &bychar_ops;
 
 static struct tty_port *receive_chars(struct uart_port *port)
 {
index 9ffef06..c9d6c71 100644 (file)
@@ -616,6 +616,7 @@ nfsd4_cb_layout_prepare(struct nfsd4_callback *cb)
 
        mutex_lock(&ls->ls_mutex);
        nfs4_inc_and_copy_stateid(&ls->ls_recall_sid, &ls->ls_stid);
+       mutex_unlock(&ls->ls_mutex);
 }
 
 static int
@@ -659,7 +660,6 @@ nfsd4_cb_layout_release(struct nfsd4_callback *cb)
 
        trace_layout_recall_release(&ls->ls_stid.sc_stateid);
 
-       mutex_unlock(&ls->ls_mutex);
        nfsd4_return_all_layouts(ls, &reaplist);
        nfsd4_free_layouts(&reaplist);
        nfs4_put_stid(&ls->ls_stid);
index ce38b4c..84f2f80 100644 (file)
@@ -2843,6 +2843,8 @@ again:
        res->state &= ~DLM_LOCK_RES_BLOCK_DIRTY;
        if (!ret)
                BUG_ON(!(res->state & DLM_LOCK_RES_MIGRATING));
+       else
+               res->migration_pending = 0;
        spin_unlock(&res->spinlock);
 
        /*
index 652ece4..d56f007 100644 (file)
@@ -67,7 +67,10 @@ static int ocfs2_do_flock(struct file *file, struct inode *inode,
                 */
 
                locks_lock_file_wait(file,
-                                    &(struct file_lock){.fl_type = F_UNLCK});
+                               &(struct file_lock) {
+                                       .fl_type = F_UNLCK,
+                                       .fl_flags = FL_FLOCK
+                               });
 
                ocfs2_file_unlock(file);
        }
index d5da6f6..79b8021 100644 (file)
 static u16 ocfs2_calc_new_backup_super(struct inode *inode,
                                       struct ocfs2_group_desc *gd,
                                       u16 cl_cpg,
+                                      u16 old_bg_clusters,
                                       int set)
 {
        int i;
        u16 backups = 0;
-       u32 cluster;
+       u32 cluster, lgd_cluster;
        u64 blkno, gd_blkno, lgd_blkno = le64_to_cpu(gd->bg_blkno);
 
        for (i = 0; i < OCFS2_MAX_BACKUP_SUPERBLOCKS; i++) {
@@ -71,6 +72,12 @@ static u16 ocfs2_calc_new_backup_super(struct inode *inode,
                else if (gd_blkno > lgd_blkno)
                        break;
 
+               /* check if already done backup super */
+               lgd_cluster = ocfs2_blocks_to_clusters(inode->i_sb, lgd_blkno);
+               lgd_cluster += old_bg_clusters;
+               if (lgd_cluster >= cluster)
+                       continue;
+
                if (set)
                        ocfs2_set_bit(cluster % cl_cpg,
                                      (unsigned long *)gd->bg_bitmap);
@@ -99,6 +106,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,
        u16 chain, num_bits, backups = 0;
        u16 cl_bpc = le16_to_cpu(cl->cl_bpc);
        u16 cl_cpg = le16_to_cpu(cl->cl_cpg);
+       u16 old_bg_clusters;
 
        trace_ocfs2_update_last_group_and_inode(new_clusters,
                                                first_new_cluster);
@@ -112,6 +120,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,
 
        group = (struct ocfs2_group_desc *)group_bh->b_data;
 
+       old_bg_clusters = le16_to_cpu(group->bg_bits) / cl_bpc;
        /* update the group first. */
        num_bits = new_clusters * cl_bpc;
        le16_add_cpu(&group->bg_bits, num_bits);
@@ -125,7 +134,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,
                                     OCFS2_FEATURE_COMPAT_BACKUP_SB)) {
                backups = ocfs2_calc_new_backup_super(bm_inode,
                                                     group,
-                                                    cl_cpg, 1);
+                                                    cl_cpg, old_bg_clusters, 1);
                le16_add_cpu(&group->bg_free_bits_count, -1 * backups);
        }
 
@@ -163,7 +172,7 @@ out_rollback:
        if (ret < 0) {
                ocfs2_calc_new_backup_super(bm_inode,
                                            group,
-                                           cl_cpg, 0);
+                                           cl_cpg, old_bg_clusters, 0);
                le16_add_cpu(&group->bg_free_bits_count, backups);
                le16_add_cpu(&group->bg_bits, -1 * num_bits);
                le16_add_cpu(&group->bg_free_bits_count, -1 * num_bits);
index 204f581..cd84b12 100644 (file)
@@ -126,8 +126,9 @@ struct acpi_exception_info {
 #define AE_OWNER_ID_LIMIT               EXCEP_ENV (0x001B)
 #define AE_NOT_CONFIGURED               EXCEP_ENV (0x001C)
 #define AE_ACCESS                       EXCEP_ENV (0x001D)
+#define AE_IO_ERROR                     EXCEP_ENV (0x001E)
 
-#define AE_CODE_ENV_MAX                 0x001D
+#define AE_CODE_ENV_MAX                 0x001E
 
 /*
  * Programmer exceptions
@@ -263,7 +264,8 @@ static const struct acpi_exception_info acpi_gbl_exception_names_env[] = {
                  "There are no more Owner IDs available for ACPI tables or control methods"),
        EXCEP_TXT("AE_NOT_CONFIGURED",
                  "The interface is not part of the current subsystem configuration"),
-       EXCEP_TXT("AE_ACCESS", "Permission denied for the requested operation")
+       EXCEP_TXT("AE_ACCESS", "Permission denied for the requested operation"),
+       EXCEP_TXT("AE_IO_ERROR", "An I/O error occurred")
 };
 
 static const struct acpi_exception_info acpi_gbl_exception_names_pgm[] = {
index ad0a5ff..14362a8 100644 (file)
@@ -87,6 +87,8 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const u8 *uuid, int rev, int func,
          .package.elements = (eles)                    \
        }
 
+bool acpi_dev_present(const char *hid);
+
 #ifdef CONFIG_ACPI
 
 #include <linux/proc_fs.h>
@@ -631,7 +633,9 @@ static inline bool acpi_device_can_wakeup(struct acpi_device *adev)
 
 static inline bool acpi_device_can_poweroff(struct acpi_device *adev)
 {
-       return adev->power.states[ACPI_STATE_D3_COLD].flags.valid;
+       return adev->power.states[ACPI_STATE_D3_COLD].flags.valid ||
+               ((acpi_gbl_FADT.header.revision < 6) &&
+               adev->power.states[ACPI_STATE_D3_HOT].flags.explicit_set);
 }
 
 #else  /* CONFIG_ACPI */
index fbc2baf..0d824a2 100644 (file)
@@ -349,12 +349,28 @@ void acpi_os_redirect_output(void *destination);
 #endif
 
 /*
- * Debug input
+ * Debug IO
  */
 #ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_get_line
 acpi_status acpi_os_get_line(char *buffer, u32 buffer_length, u32 *bytes_read);
 #endif
 
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_initialize_command_signals
+acpi_status acpi_os_initialize_command_signals(void);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_terminate_command_signals
+void acpi_os_terminate_command_signals(void);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_wait_command_ready
+acpi_status acpi_os_wait_command_ready(void);
+#endif
+
+#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_notify_command_complete
+acpi_status acpi_os_notify_command_complete(void);
+#endif
+
 /*
  * Obtain ACPI table(s)
  */
index 3aaaa86..012b2ee 100644 (file)
@@ -46,7 +46,7 @@
 
 /* Current ACPICA subsystem version in YYYYMMDD format */
 
-#define ACPI_CA_VERSION                 0x20150930
+#define ACPI_CA_VERSION                 0x20151218
 
 #include <acpi/acconfig.h>
 #include <acpi/actypes.h>
@@ -189,6 +189,11 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_copy_dsdt_locally, FALSE);
  */
 ACPI_INIT_GLOBAL(u8, acpi_gbl_do_not_use_xsdt, FALSE);
 
+/*
+ * Optionally support group module level code.
+ */
+ACPI_INIT_GLOBAL(u8, acpi_gbl_group_module_level_code, TRUE);
+
 /*
  * Optionally use 32-bit FADT addresses if and when there is a conflict
  * (address mismatch) between the 32-bit and 64-bit versions of the
@@ -263,6 +268,19 @@ ACPI_INIT_GLOBAL(u32, acpi_gbl_trace_dbg_layer, ACPI_TRACE_LAYER_DEFAULT);
 ACPI_INIT_GLOBAL(u32, acpi_dbg_level, ACPI_DEBUG_DEFAULT);
 ACPI_INIT_GLOBAL(u32, acpi_dbg_layer, 0);
 
+/* Optionally enable timer output with Debug Object output */
+
+ACPI_INIT_GLOBAL(u8, acpi_gbl_display_debug_timer, FALSE);
+
+/*
+ * Debugger command handshake globals. Host OSes need to access these
+ * variables to implement their own command handshake mechanism.
+ */
+#ifdef ACPI_DEBUGGER
+ACPI_INIT_GLOBAL(u8, acpi_gbl_method_executing, FALSE);
+ACPI_GLOBAL(char, acpi_gbl_db_line_buf[ACPI_DB_LINE_BUFFER_SIZE]);
+#endif
+
 /*
  * Other miscellaneous globals
  */
@@ -366,6 +384,29 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running);
 
 #endif                         /* ACPI_APPLICATION */
 
+/*
+ * Debugger prototypes
+ *
+ * All interfaces used by debugger will be configured
+ * out of the ACPICA build unless the ACPI_DEBUGGER
+ * flag is defined.
+ */
+#ifdef ACPI_DEBUGGER
+#define ACPI_DBR_DEPENDENT_RETURN_OK(prototype) \
+       ACPI_EXTERNAL_RETURN_OK(prototype)
+
+#define ACPI_DBR_DEPENDENT_RETURN_VOID(prototype) \
+       ACPI_EXTERNAL_RETURN_VOID(prototype)
+
+#else
+#define ACPI_DBR_DEPENDENT_RETURN_OK(prototype) \
+       static ACPI_INLINE prototype {return(AE_OK);}
+
+#define ACPI_DBR_DEPENDENT_RETURN_VOID(prototype) \
+       static ACPI_INLINE prototype {return;}
+
+#endif                         /* ACPI_DEBUGGER */
+
 /*****************************************************************************
  *
  * ACPICA public interface prototypes
@@ -822,17 +863,9 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
 ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_leave_sleep_state(u8 sleep_state))
 
 ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
-                               acpi_set_firmware_waking_vectors
+                               acpi_set_firmware_waking_vector
                                (acpi_physical_address physical_address,
                                 acpi_physical_address physical_address64))
-ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
-                                acpi_set_firmware_waking_vector(u32
-                                                                physical_address))
-#if ACPI_MACHINE_WIDTH == 64
-ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
-                               acpi_set_firmware_waking_vector64(u64
-                                                                 physical_address))
-#endif
 /*
  * ACPI Timer interfaces
  */
@@ -929,6 +962,8 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
                                               void **data,
                                               void (*callback)(void *)))
 
+void acpi_run_debugger(char *batch_buffer);
+
 void acpi_set_debugger_thread_id(acpi_thread_id thread_id);
 
 #endif                         /* __ACXFACE_H__ */
index f914958..9633f60 100644 (file)
@@ -1148,7 +1148,7 @@ u32 (*acpi_interface_handler) (acpi_string interface_name, u32 supported);
 
 #define ACPI_PCICLS_STRING_SIZE         7      /* Includes null terminator */
 
-/* Structures used for device/processor HID, UID, CID, and SUB */
+/* Structures used for device/processor HID, UID, CID */
 
 struct acpi_pnp_device_id {
        u32 length;             /* Length of string + null */
@@ -1178,7 +1178,6 @@ struct acpi_device_info {
        u64 address;    /* _ADR value */
        struct acpi_pnp_device_id hardware_id;  /* _HID value */
        struct acpi_pnp_device_id unique_id;    /* _UID value */
-       struct acpi_pnp_device_id subsystem_id; /* _SUB value */
        struct acpi_pnp_device_id class_code;   /* _CLS value */
        struct acpi_pnp_device_id_list compatible_id_list;      /* _CID list <must be last> */
 };
@@ -1193,13 +1192,12 @@ struct acpi_device_info {
 #define ACPI_VALID_ADR                  0x0002
 #define ACPI_VALID_HID                  0x0004
 #define ACPI_VALID_UID                  0x0008
-#define ACPI_VALID_SUB                  0x0010
 #define ACPI_VALID_CID                  0x0020
 #define ACPI_VALID_CLS                  0x0040
 #define ACPI_VALID_SXDS                 0x0100
 #define ACPI_VALID_SXWS                 0x0200
 
-/* Flags for _STA return value (current_status above) */
+/* Flags for _STA method */
 
 #define ACPI_STA_DEVICE_PRESENT         0x01
 #define ACPI_STA_DEVICE_ENABLED         0x02
index 323e5da..e21857d 100644 (file)
  */
 #define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_readable
 #define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_writable
+#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_initialize_command_signals
+#define ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_terminate_command_signals
 
 /*
  * OSL interfaces used by utilities
index fd6d70f..f903fe6 100644 (file)
@@ -129,6 +129,16 @@ static inline u8 acpi_os_readable(void *pointer, acpi_size length)
        return TRUE;
 }
 
+static inline acpi_status acpi_os_initialize_command_signals(void)
+{
+       return AE_OK;
+}
+
+static inline void acpi_os_terminate_command_signals(void)
+{
+       return;
+}
+
 /*
  * OSL interfaces added by Linux
  */
index c62392d..f11d342 100644 (file)
@@ -2,6 +2,7 @@
 #define __ACPI_VIDEO_H
 
 #include <linux/errno.h> /* for ENODEV */
+#include <linux/types.h> /* for bool */
 
 struct acpi_device;
 
@@ -31,6 +32,7 @@ extern int acpi_video_get_edid(struct acpi_device *device, int type,
                               int device_id, void **edid);
 extern enum acpi_backlight_type acpi_video_get_backlight_type(void);
 extern void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type);
+extern bool acpi_video_handles_brightness_key_presses(void);
 #else
 static inline int acpi_video_register(void) { return 0; }
 static inline void acpi_video_unregister(void) { return; }
@@ -46,6 +48,10 @@ static inline enum acpi_backlight_type acpi_video_get_backlight_type(void)
 static inline void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type)
 {
 }
+static inline bool acpi_video_handles_brightness_key_presses(void)
+{
+       return false;
+}
 #endif
 
 #endif
index 1991aea..a03a054 100644 (file)
@@ -37,6 +37,8 @@
 #include <linux/list.h>
 #include <linux/mod_devicetable.h>
 #include <linux/dynamic_debug.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
 
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
@@ -119,6 +121,75 @@ typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);
 typedef int (*acpi_tbl_entry_handler)(struct acpi_subtable_header *header,
                                      const unsigned long end);
 
+/* Debugger support */
+
+struct acpi_debugger_ops {
+       int (*create_thread)(acpi_osd_exec_callback function, void *context);
+       ssize_t (*write_log)(const char *msg);
+       ssize_t (*read_cmd)(char *buffer, size_t length);
+       int (*wait_command_ready)(bool single_step, char *buffer, size_t length);
+       int (*notify_command_complete)(void);
+};
+
+struct acpi_debugger {
+       const struct acpi_debugger_ops *ops;
+       struct module *owner;
+       struct mutex lock;
+};
+
+#ifdef CONFIG_ACPI_DEBUGGER
+int __init acpi_debugger_init(void);
+int acpi_register_debugger(struct module *owner,
+                          const struct acpi_debugger_ops *ops);
+void acpi_unregister_debugger(const struct acpi_debugger_ops *ops);
+int acpi_debugger_create_thread(acpi_osd_exec_callback function, void *context);
+ssize_t acpi_debugger_write_log(const char *msg);
+ssize_t acpi_debugger_read_cmd(char *buffer, size_t buffer_length);
+int acpi_debugger_wait_command_ready(void);
+int acpi_debugger_notify_command_complete(void);
+#else
+static inline int acpi_debugger_init(void)
+{
+       return -ENODEV;
+}
+
+static inline int acpi_register_debugger(struct module *owner,
+                                        const struct acpi_debugger_ops *ops)
+{
+       return -ENODEV;
+}
+
+static inline void acpi_unregister_debugger(const struct acpi_debugger_ops *ops)
+{
+}
+
+static inline int acpi_debugger_create_thread(acpi_osd_exec_callback function,
+                                             void *context)
+{
+       return -ENODEV;
+}
+
+static inline int acpi_debugger_write_log(const char *msg)
+{
+       return -ENODEV;
+}
+
+static inline int acpi_debugger_read_cmd(char *buffer, u32 buffer_length)
+{
+       return -ENODEV;
+}
+
+static inline int acpi_debugger_wait_command_ready(void)
+{
+       return -ENODEV;
+}
+
+static inline int acpi_debugger_notify_command_complete(void)
+{
+       return -ENODEV;
+}
+#endif
+
 #ifdef CONFIG_ACPI_INITRD_TABLE_OVERRIDE
 void acpi_initrd_override(void *data, size_t size);
 #else
index 0169ba2..c70e358 100644 (file)
@@ -797,6 +797,7 @@ extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,
 extern int blk_queue_enter(struct request_queue *q, gfp_t gfp);
 extern void blk_queue_exit(struct request_queue *q);
 extern void blk_start_queue(struct request_queue *q);
+extern void blk_start_queue_async(struct request_queue *q);
 extern void blk_stop_queue(struct request_queue *q);
 extern void blk_sync_queue(struct request_queue *q);
 extern void __blk_stop_queue(struct request_queue *q);
index b8f411b..f627ba2 100644 (file)
@@ -191,6 +191,7 @@ extern int bus_unregister_notifier(struct bus_type *bus,
                                                      unbound */
 #define BUS_NOTIFY_UNBOUND_DRIVER      0x00000007 /* driver is unbound
                                                      from the device */
+#define BUS_NOTIFY_DRIVER_NOT_BOUND    0x00000008 /* driver fails to be bound */
 
 extern struct kset *bus_get_kset(struct bus_type *bus);
 extern struct klist *bus_get_device_klist(struct bus_type *bus);
index 4165e9a..5972ffe 100644 (file)
@@ -493,6 +493,25 @@ static inline void bpf_jit_free(struct bpf_prog *fp)
 
 #define BPF_ANC                BIT(15)
 
+static inline bool bpf_needs_clear_a(const struct sock_filter *first)
+{
+       switch (first->code) {
+       case BPF_RET | BPF_K:
+       case BPF_LD | BPF_W | BPF_LEN:
+               return false;
+
+       case BPF_LD | BPF_W | BPF_ABS:
+       case BPF_LD | BPF_H | BPF_ABS:
+       case BPF_LD | BPF_B | BPF_ABS:
+               if (first->k == SKF_AD_OFF + SKF_AD_ALU_XOR_X)
+                       return true;
+               return false;
+
+       default:
+               return true;
+       }
+}
+
 static inline u16 bpf_anc_helper(const struct sock_filter *ftest)
 {
        BUG_ON(ftest->code & BPF_ANC);
index eae6548..60048c5 100644 (file)
@@ -586,6 +586,7 @@ extern int ftrace_arch_read_dyn_info(char *buf, int size);
 
 extern int skip_trace(unsigned long ip);
 extern void ftrace_module_init(struct module *mod);
+extern void ftrace_release_mod(struct module *mod);
 
 extern void ftrace_disable_daemon(void);
 extern void ftrace_enable_daemon(void);
index 27dac3f..bc6f7e0 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/platform_device.h>
 
 struct irq_domain;
+struct property_set;
 
 /* Matches ACPI PNP id, either _HID or _CID, or ACPI _ADR */
 struct mfd_cell_acpi_match {
@@ -44,6 +45,10 @@ struct mfd_cell {
        /* platform data passed to the sub devices drivers */
        void                    *platform_data;
        size_t                  pdata_size;
+
+       /* device properties passed to the sub devices drivers */
+       const struct property_set *pset;
+
        /*
         * Device Tree compatible string
         * See: Documentation/devicetree/usage-model.txt Chapter 2.2 for details
index c8723b6..bc742da 100644 (file)
@@ -25,7 +25,7 @@
 #define SNOR_MFR_MACRONIX      CFI_MFR_MACRONIX
 #define SNOR_MFR_SPANSION      CFI_MFR_AMD
 #define SNOR_MFR_SST           CFI_MFR_SST
-#define SNOR_MFR_WINBOND       0xef
+#define SNOR_MFR_WINBOND       0xef /* Also used by some Spansion */
 
 /*
  * Note on opcode nomenclature: some opcodes have a format like
index dc777be..dba40b1 100644 (file)
@@ -18,6 +18,7 @@
 #define PLATFORM_DEVID_AUTO    (-2)
 
 struct mfd_cell;
+struct property_set;
 
 struct platform_device {
        const char      *name;
@@ -70,6 +71,8 @@ struct platform_device_info {
                const void *data;
                size_t size_data;
                u64 dma_mask;
+
+               const struct property_set *pset;
 };
 extern struct platform_device *platform_device_register_full(
                const struct platform_device_info *pdevinfo);
@@ -167,6 +170,8 @@ extern int platform_device_add_resources(struct platform_device *pdev,
                                         unsigned int num);
 extern int platform_device_add_data(struct platform_device *pdev,
                                    const void *data, size_t size);
+extern int platform_device_add_properties(struct platform_device *pdev,
+                                         const struct property_set *pset);
 extern int platform_device_add(struct platform_device *pdev);
 extern void platform_device_del(struct platform_device *pdev);
 extern void platform_device_put(struct platform_device *pdev);
index 0a3705a..b51fcd3 100644 (file)
@@ -73,8 +73,8 @@ int fwnode_property_match_string(struct fwnode_handle *fwnode,
 struct fwnode_handle *device_get_next_child_node(struct device *dev,
                                                 struct fwnode_handle *child);
 
-#define device_for_each_child_node(dev, child) \
-       for (child = device_get_next_child_node(dev, NULL); child; \
+#define device_for_each_child_node(dev, child)                         \
+       for (child = device_get_next_child_node(dev, NULL); child;      \
             child = device_get_next_child_node(dev, child))
 
 void fwnode_handle_put(struct fwnode_handle *fwnode);
@@ -144,24 +144,100 @@ static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
 /**
  * struct property_entry - "Built-in" device property representation.
  * @name: Name of the property.
- * @type: Type of the property.
- * @nval: Number of items of type @type making up the value.
- * @value: Value of the property (an array of @nval items of type @type).
+ * @length: Length of data making up the value.
+ * @is_array: True when the property is an array.
+ * @is_string: True when property is a string.
+ * @pointer: Pointer to the property (an array of items of the given type).
+ * @value: Value of the property (when it is a single item of the given type).
  */
 struct property_entry {
        const char *name;
-       enum dev_prop_type type;
-       size_t nval;
+       size_t length;
+       bool is_array;
+       bool is_string;
        union {
-               void *raw_data;
-               u8 *u8_data;
-               u16 *u16_data;
-               u32 *u32_data;
-               u64 *u64_data;
-               const char **str;
-       } value;
+               union {
+                       void *raw_data;
+                       u8 *u8_data;
+                       u16 *u16_data;
+                       u32 *u32_data;
+                       u64 *u64_data;
+                       const char **str;
+               } pointer;
+               union {
+                       unsigned long long raw_data;
+                       u8 u8_data;
+                       u16 u16_data;
+                       u32 u32_data;
+                       u64 u64_data;
+                       const char *str;
+               } value;
+       };
 };
 
+/*
+ * Note: the below four initializers for the anonymous union are carefully
+ * crafted to avoid gcc-4.4.4's problems with initialization of anon unions
+ * and structs.
+ */
+
+#define PROPERTY_ENTRY_INTEGER_ARRAY(_name_, _type_, _val_)    \
+{                                                              \
+       .name = _name_,                                         \
+       .length = ARRAY_SIZE(_val_) * sizeof(_type_),           \
+       .is_array = true,                                       \
+       .is_string = false,                                     \
+       { .pointer = { _type_##_data = _val_ } },               \
+}
+
+#define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)                 \
+       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u8, _val_)
+#define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_)                        \
+       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u16, _val_)
+#define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_)                        \
+       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u32, _val_)
+#define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_)                        \
+       PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u64, _val_)
+
+#define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_)             \
+{                                                              \
+       .name = _name_,                                         \
+       .length = ARRAY_SIZE(_val_) * sizeof(const char *),     \
+       .is_array = true,                                       \
+       .is_string = true,                                      \
+       { .pointer = { .str = _val_ } },                        \
+}
+
+#define PROPERTY_ENTRY_INTEGER(_name_, _type_, _val_)  \
+{                                                      \
+       .name = _name_,                                 \
+       .length = sizeof(_type_),                       \
+       .is_string = false,                             \
+       { .value = { ._type_##_data = _val_ } },        \
+}
+
+#define PROPERTY_ENTRY_U8(_name_, _val_)               \
+       PROPERTY_ENTRY_INTEGER(_name_, u8, _val_)
+#define PROPERTY_ENTRY_U16(_name_, _val_)              \
+       PROPERTY_ENTRY_INTEGER(_name_, u16, _val_)
+#define PROPERTY_ENTRY_U32(_name_, _val_)              \
+       PROPERTY_ENTRY_INTEGER(_name_, u32, _val_)
+#define PROPERTY_ENTRY_U64(_name_, _val_)              \
+       PROPERTY_ENTRY_INTEGER(_name_, u64, _val_)
+
+#define PROPERTY_ENTRY_STRING(_name_, _val_)           \
+{                                                      \
+       .name = _name_,                                 \
+       .length = sizeof(_val_),                        \
+       .is_string = true,                              \
+       { .value = { .str = _val_ } },                  \
+}
+
+#define PROPERTY_ENTRY_BOOL(_name_)            \
+{                                              \
+       .name = _name_,                         \
+}
+
 /**
  * struct property_set - Collection of "built-in" device properties.
  * @fwnode: Handle to be pointed to by the fwnode field of struct device.
@@ -172,7 +248,8 @@ struct property_set {
        struct property_entry *properties;
 };
 
-void device_add_property_set(struct device *dev, struct property_set *pset);
+int device_add_property_set(struct device *dev, const struct property_set *pset);
+void device_remove_property_set(struct device *dev);
 
 bool device_dma_supported(struct device *dev);
 
index edad7a4..fa39434 100644 (file)
@@ -1455,14 +1455,15 @@ struct task_struct {
        /* Used for emulating ABI behavior of previous Linux versions */
        unsigned int personality;
 
-       unsigned in_execve:1;   /* Tell the LSMs that the process is doing an
-                                * execve */
-       unsigned in_iowait:1;
-
-       /* Revert to default priority/policy when forking */
+       /* scheduler bits, serialized by scheduler locks */
        unsigned sched_reset_on_fork:1;
        unsigned sched_contributes_to_load:1;
        unsigned sched_migrated:1;
+       unsigned :0; /* force alignment to the next boundary */
+
+       /* unserialized, strictly 'current' */
+       unsigned in_execve:1; /* bit to tell LSMs we're in execve */
+       unsigned in_iowait:1;
 #ifdef CONFIG_MEMCG
        unsigned memcg_may_oom:1;
 #endif
@@ -2002,7 +2003,8 @@ static inline int pid_alive(const struct task_struct *p)
 }
 
 /**
- * is_global_init - check if a task structure is init
+ * is_global_init - check if a task structure is init. Since init
+ * is free to have sub-threads we need to check tgid.
  * @tsk: Task structure to be checked.
  *
  * Check if a task structure is the first user space task the kernel created.
@@ -2011,7 +2013,7 @@ static inline int pid_alive(const struct task_struct *p)
  */
 static inline int is_global_init(struct task_struct *tsk)
 {
-       return tsk->pid == 1;
+       return task_tgid_nr(tsk) == 1;
 }
 
 extern struct pid *cad_pid;
index 1f6526c..3a375d0 100644 (file)
@@ -138,6 +138,7 @@ struct cdc_ncm_ctx {
 };
 
 u8 cdc_ncm_select_altsetting(struct usb_interface *intf);
+int cdc_ncm_change_mtu(struct net_device *net, int new_mtu);
 int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting, int drvflags);
 void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf);
 struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign);
index 5dbc8b0..3e5d907 100644 (file)
@@ -176,11 +176,11 @@ extern void zone_statistics(struct zone *, struct zone *, gfp_t gfp);
 #define sub_zone_page_state(__z, __i, __d) mod_zone_page_state(__z, __i, -(__d))
 
 #ifdef CONFIG_SMP
-void __mod_zone_page_state(struct zone *, enum zone_stat_item item, int);
+void __mod_zone_page_state(struct zone *, enum zone_stat_item item, long);
 void __inc_zone_page_state(struct page *, enum zone_stat_item);
 void __dec_zone_page_state(struct page *, enum zone_stat_item);
 
-void mod_zone_page_state(struct zone *, enum zone_stat_item, int);
+void mod_zone_page_state(struct zone *, enum zone_stat_item, long);
 void inc_zone_page_state(struct page *, enum zone_stat_item);
 void dec_zone_page_state(struct page *, enum zone_stat_item);
 
@@ -205,7 +205,7 @@ void set_pgdat_percpu_threshold(pg_data_t *pgdat,
  * The functions directly modify the zone and global counters.
  */
 static inline void __mod_zone_page_state(struct zone *zone,
-                       enum zone_stat_item item, int delta)
+                       enum zone_stat_item item, long delta)
 {
        zone_page_state_add(delta, zone, item);
 }
index 774d85b..5689a0c 100644 (file)
@@ -29,7 +29,7 @@ struct l3mdev_ops {
        /* IPv4 ops */
        struct rtable * (*l3mdev_get_rtable)(const struct net_device *dev,
                                             const struct flowi4 *fl4);
-       void            (*l3mdev_get_saddr)(struct net_device *dev,
+       int             (*l3mdev_get_saddr)(struct net_device *dev,
                                            struct flowi4 *fl4);
 
        /* IPv6 ops */
@@ -112,10 +112,11 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
        return rc;
 }
 
-static inline void l3mdev_get_saddr(struct net *net, int ifindex,
-                                   struct flowi4 *fl4)
+static inline int l3mdev_get_saddr(struct net *net, int ifindex,
+                                  struct flowi4 *fl4)
 {
        struct net_device *dev;
+       int rc = 0;
 
        if (ifindex) {
 
@@ -124,11 +125,13 @@ static inline void l3mdev_get_saddr(struct net *net, int ifindex,
                dev = dev_get_by_index_rcu(net, ifindex);
                if (dev && netif_is_l3_master(dev) &&
                    dev->l3mdev_ops->l3mdev_get_saddr) {
-                       dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4);
+                       rc = dev->l3mdev_ops->l3mdev_get_saddr(dev, fl4);
                }
 
                rcu_read_unlock();
        }
+
+       return rc;
 }
 
 static inline struct dst_entry *l3mdev_get_rt6_dst(const struct net_device *dev,
@@ -200,9 +203,10 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex)
        return false;
 }
 
-static inline void l3mdev_get_saddr(struct net *net, int ifindex,
-                                   struct flowi4 *fl4)
+static inline int l3mdev_get_saddr(struct net *net, int ifindex,
+                                  struct flowi4 *fl4)
 {
+       return 0;
 }
 
 static inline
index ee81307..a3b9ef7 100644 (file)
@@ -283,7 +283,12 @@ static inline struct rtable *ip_route_connect(struct flowi4 *fl4,
                              sport, dport, sk);
 
        if (!src && oif) {
-               l3mdev_get_saddr(net, oif, fl4);
+               int rc;
+
+               rc = l3mdev_get_saddr(net, oif, fl4);
+               if (rc < 0)
+                       return ERR_PTR(rc);
+
                src = fl4->saddr;
        }
        if (!dst || !src) {
index a8b4b9c..fb955e6 100644 (file)
@@ -1655,7 +1655,7 @@ extern const struct dev_pm_ops snd_soc_pm_ops;
 /* Helper functions */
 static inline void snd_soc_dapm_mutex_lock(struct snd_soc_dapm_context *dapm)
 {
-       mutex_lock(&dapm->card->dapm_mutex);
+       mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
 }
 
 static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
index ef2d6ea..cfc227c 100644 (file)
@@ -3154,15 +3154,16 @@ static int event_enable_on_exec(struct perf_event *event,
  * Enable all of a task's events that have been marked enable-on-exec.
  * This expects task == current.
  */
-static void perf_event_enable_on_exec(struct perf_event_context *ctx)
+static void perf_event_enable_on_exec(int ctxn)
 {
-       struct perf_event_context *clone_ctx = NULL;
+       struct perf_event_context *ctx, *clone_ctx = NULL;
        struct perf_event *event;
        unsigned long flags;
        int enabled = 0;
        int ret;
 
        local_irq_save(flags);
+       ctx = current->perf_event_ctxp[ctxn];
        if (!ctx || !ctx->nr_events)
                goto out;
 
@@ -3205,17 +3206,11 @@ out:
 
 void perf_event_exec(void)
 {
-       struct perf_event_context *ctx;
        int ctxn;
 
        rcu_read_lock();
-       for_each_task_context_nr(ctxn) {
-               ctx = current->perf_event_ctxp[ctxn];
-               if (!ctx)
-                       continue;
-
-               perf_event_enable_on_exec(ctx);
-       }
+       for_each_task_context_nr(ctxn)
+               perf_event_enable_on_exec(ctxn);
        rcu_read_unlock();
 }
 
@@ -6493,9 +6488,6 @@ struct swevent_htable {
 
        /* Recursion avoidance in each contexts */
        int                             recursion[PERF_NR_CONTEXTS];
-
-       /* Keeps track of cpu being initialized/exited */
-       bool                            online;
 };
 
 static DEFINE_PER_CPU(struct swevent_htable, swevent_htable);
@@ -6753,14 +6745,8 @@ static int perf_swevent_add(struct perf_event *event, int flags)
        hwc->state = !(flags & PERF_EF_START);
 
        head = find_swevent_head(swhash, event);
-       if (!head) {
-               /*
-                * We can race with cpu hotplug code. Do not
-                * WARN if the cpu just got unplugged.
-                */
-               WARN_ON_ONCE(swhash->online);
+       if (WARN_ON_ONCE(!head))
                return -EINVAL;
-       }
 
        hlist_add_head_rcu(&event->hlist_entry, head);
        perf_event_update_userpage(event);
@@ -6828,7 +6814,6 @@ static int swevent_hlist_get_cpu(struct perf_event *event, int cpu)
        int err = 0;
 
        mutex_lock(&swhash->hlist_mutex);
-
        if (!swevent_hlist_deref(swhash) && cpu_online(cpu)) {
                struct swevent_hlist *hlist;
 
@@ -9291,7 +9276,6 @@ static void perf_event_init_cpu(int cpu)
        struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu);
 
        mutex_lock(&swhash->hlist_mutex);
-       swhash->online = true;
        if (swhash->hlist_refcount > 0) {
                struct swevent_hlist *hlist;
 
@@ -9333,14 +9317,7 @@ static void perf_event_exit_cpu_context(int cpu)
 
 static void perf_event_exit_cpu(int cpu)
 {
-       struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu);
-
        perf_event_exit_cpu_context(cpu);
-
-       mutex_lock(&swhash->hlist_mutex);
-       swhash->online = false;
-       swevent_hlist_release(swhash);
-       mutex_unlock(&swhash->hlist_mutex);
 }
 #else
 static inline void perf_event_exit_cpu(int cpu) { }
index fce002e..1155eac 100644 (file)
@@ -380,6 +380,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
 #endif
        tsk->splice_pipe = NULL;
        tsk->task_frag.page = NULL;
+       tsk->wake_q.next = NULL;
 
        account_kernel_stack(ti, 1);
 
index 0eebaee..6ead200 100644 (file)
@@ -1434,6 +1434,7 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
        if (!desc)
                return NULL;
 
+       chip_bus_lock(desc);
        raw_spin_lock_irqsave(&desc->lock, flags);
 
        /*
@@ -1447,7 +1448,7 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
                if (!action) {
                        WARN(1, "Trying to free already-free IRQ %d\n", irq);
                        raw_spin_unlock_irqrestore(&desc->lock, flags);
-
+                       chip_bus_sync_unlock(desc);
                        return NULL;
                }
 
@@ -1475,6 +1476,7 @@ static struct irqaction *__free_irq(unsigned int irq, void *dev_id)
 #endif
 
        raw_spin_unlock_irqrestore(&desc->lock, flags);
+       chip_bus_sync_unlock(desc);
 
        unregister_handler_proc(irq, action);
 
@@ -1553,9 +1555,7 @@ void free_irq(unsigned int irq, void *dev_id)
                desc->affinity_notify = NULL;
 #endif
 
-       chip_bus_lock(desc);
        kfree(__free_irq(irq, dev_id));
-       chip_bus_sync_unlock(desc);
 }
 EXPORT_SYMBOL(free_irq);
 
index 8f051a1..38c7bd5 100644 (file)
@@ -3571,6 +3571,12 @@ static int load_module(struct load_info *info, const char __user *uargs,
        synchronize_sched();
        mutex_unlock(&module_mutex);
  free_module:
+       /*
+        * Ftrace needs to clean up what it initialized.
+        * This does nothing if ftrace_module_init() wasn't called,
+        * but it must be called outside of module_mutex.
+        */
+       ftrace_release_mod(mod);
        /* Free lock-classes; relies on the preceding sync_rcu() */
        lockdep_free_key_range(mod->module_core, mod->core_size);
 
index 90e26b1..cfdc0e6 100644 (file)
@@ -2689,7 +2689,7 @@ static inline int update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
        int decayed, removed = 0;
 
        if (atomic_long_read(&cfs_rq->removed_load_avg)) {
-               long r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0);
+               s64 r = atomic_long_xchg(&cfs_rq->removed_load_avg, 0);
                sa->load_avg = max_t(long, sa->load_avg - r, 0);
                sa->load_sum = max_t(s64, sa->load_sum - r * LOAD_AVG_MAX, 0);
                removed = 1;
index 1c2b285..060df67 100644 (file)
@@ -273,6 +273,7 @@ static const char **find_next(void *v, loff_t *pos)
        if (*pos < last_index + start_index)
                return __start___tracepoint_str + (*pos - last_index);
 
+       start_index += last_index;
        return find_next_mod_format(start_index, v, fmt, pos);
 }
 
index eb9240c..51282f5 100644 (file)
@@ -519,7 +519,8 @@ int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter)
                return -ENOMEM;
 
        spin_lock(&ht->lock);
-       iter->walker->tbl = rht_dereference(ht->tbl, ht);
+       iter->walker->tbl =
+               rcu_dereference_protected(ht->tbl, lockdep_is_held(&ht->lock));
        list_add(&iter->walker->list, &iter->walker->tbl->walkers);
        spin_unlock(&ht->lock);
 
index e234c21..fc10620 100644 (file)
@@ -903,14 +903,20 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
                if (prev && reclaim->generation != iter->generation)
                        goto out_unlock;
 
-               do {
+               while (1) {
                        pos = READ_ONCE(iter->position);
+                       if (!pos || css_tryget(&pos->css))
+                               break;
                        /*
-                        * A racing update may change the position and
-                        * put the last reference, hence css_tryget(),
-                        * or retry to see the updated position.
+                        * css reference reached zero, so iter->position will
+                        * be cleared by ->css_released. However, we should not
+                        * rely on this happening soon, because ->css_released
+                        * is called from a work queue, and by busy-waiting we
+                        * might block it. So we clear iter->position right
+                        * away.
                         */
-               } while (pos && !css_tryget(&pos->css));
+                       (void)cmpxchg(&iter->position, pos, NULL);
+               }
        }
 
        if (pos)
@@ -956,17 +962,13 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
        }
 
        if (reclaim) {
-               if (cmpxchg(&iter->position, pos, memcg) == pos) {
-                       if (memcg)
-                               css_get(&memcg->css);
-                       if (pos)
-                               css_put(&pos->css);
-               }
-
                /*
-                * pairs with css_tryget when dereferencing iter->position
-                * above.
+                * The position could have already been updated by a competing
+                * thread, so check that the value hasn't changed since we read
+                * it to avoid reclaiming from the same cgroup twice.
                 */
+               (void)cmpxchg(&iter->position, pos, memcg);
+
                if (pos)
                        css_put(&pos->css);
 
@@ -999,6 +1001,28 @@ void mem_cgroup_iter_break(struct mem_cgroup *root,
                css_put(&prev->css);
 }
 
+static void invalidate_reclaim_iterators(struct mem_cgroup *dead_memcg)
+{
+       struct mem_cgroup *memcg = dead_memcg;
+       struct mem_cgroup_reclaim_iter *iter;
+       struct mem_cgroup_per_zone *mz;
+       int nid, zid;
+       int i;
+
+       while ((memcg = parent_mem_cgroup(memcg))) {
+               for_each_node(nid) {
+                       for (zid = 0; zid < MAX_NR_ZONES; zid++) {
+                               mz = &memcg->nodeinfo[nid]->zoneinfo[zid];
+                               for (i = 0; i <= DEF_PRIORITY; i++) {
+                                       iter = &mz->iter[i];
+                                       cmpxchg(&iter->position,
+                                               dead_memcg, NULL);
+                               }
+                       }
+               }
+       }
+}
+
 /*
  * Iteration constructs for visiting all cgroups (under a tree).  If
  * loops are exited prematurely (break), mem_cgroup_iter_break() must
@@ -4324,6 +4348,13 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css)
        wb_memcg_offline(memcg);
 }
 
+static void mem_cgroup_css_released(struct cgroup_subsys_state *css)
+{
+       struct mem_cgroup *memcg = mem_cgroup_from_css(css);
+
+       invalidate_reclaim_iterators(memcg);
+}
+
 static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
 {
        struct mem_cgroup *memcg = mem_cgroup_from_css(css);
@@ -5185,6 +5216,7 @@ struct cgroup_subsys memory_cgrp_subsys = {
        .css_alloc = mem_cgroup_css_alloc,
        .css_online = mem_cgroup_css_online,
        .css_offline = mem_cgroup_css_offline,
+       .css_released = mem_cgroup_css_released,
        .css_free = mem_cgroup_css_free,
        .css_reset = mem_cgroup_css_reset,
        .can_attach = mem_cgroup_can_attach,
index 67d488a..a042a9d 100644 (file)
@@ -1375,23 +1375,30 @@ int is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)
  */
 int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn)
 {
-       unsigned long pfn;
+       unsigned long pfn, sec_end_pfn;
        struct zone *zone = NULL;
        struct page *page;
        int i;
-       for (pfn = start_pfn;
+       for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn);
             pfn < end_pfn;
-            pfn += MAX_ORDER_NR_PAGES) {
-               i = 0;
-               /* This is just a CONFIG_HOLES_IN_ZONE check.*/
-               while ((i < MAX_ORDER_NR_PAGES) && !pfn_valid_within(pfn + i))
-                       i++;
-               if (i == MAX_ORDER_NR_PAGES)
+            pfn = sec_end_pfn + 1, sec_end_pfn += PAGES_PER_SECTION) {
+               /* Make sure the memory section is present first */
+               if (!present_section_nr(pfn_to_section_nr(pfn)))
                        continue;
-               page = pfn_to_page(pfn + i);
-               if (zone && page_zone(page) != zone)
-                       return 0;
-               zone = page_zone(page);
+               for (; pfn < sec_end_pfn && pfn < end_pfn;
+                    pfn += MAX_ORDER_NR_PAGES) {
+                       i = 0;
+                       /* This is just a CONFIG_HOLES_IN_ZONE check.*/
+                       while ((i < MAX_ORDER_NR_PAGES) &&
+                               !pfn_valid_within(pfn + i))
+                               i++;
+                       if (i == MAX_ORDER_NR_PAGES)
+                               continue;
+                       page = pfn_to_page(pfn + i);
+                       if (zone && page_zone(page) != zone)
+                               return 0;
+                       zone = page_zone(page);
+               }
        }
        return 1;
 }
index 0d5712b..c54fd29 100644 (file)
@@ -219,7 +219,7 @@ void set_pgdat_percpu_threshold(pg_data_t *pgdat,
  * particular counter cannot be updated from interrupt context.
  */
 void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item,
-                               int delta)
+                          long delta)
 {
        struct per_cpu_pageset __percpu *pcp = zone->pageset;
        s8 __percpu *p = pcp->vm_stat_diff + item;
@@ -318,8 +318,8 @@ EXPORT_SYMBOL(__dec_zone_page_state);
  *     1       Overstepping half of threshold
  *     -1      Overstepping minus half of threshold
 */
-static inline void mod_state(struct zone *zone,
-       enum zone_stat_item item, int delta, int overstep_mode)
+static inline void mod_state(struct zone *zone, enum zone_stat_item item,
+                            long delta, int overstep_mode)
 {
        struct per_cpu_pageset __percpu *pcp = zone->pageset;
        s8 __percpu *p = pcp->vm_stat_diff + item;
@@ -357,7 +357,7 @@ static inline void mod_state(struct zone *zone,
 }
 
 void mod_zone_page_state(struct zone *zone, enum zone_stat_item item,
-                                       int delta)
+                        long delta)
 {
        mod_state(zone, item, delta, 0);
 }
@@ -384,7 +384,7 @@ EXPORT_SYMBOL(dec_zone_page_state);
  * Use interrupt disable to serialize counter updates
  */
 void mod_zone_page_state(struct zone *zone, enum zone_stat_item item,
-                                       int delta)
+                        long delta)
 {
        unsigned long flags;
 
@@ -1483,6 +1483,7 @@ static void __init start_shepherd_timer(void)
                BUG();
        cpumask_copy(cpu_stat_off, cpu_online_mask);
 
+       vmstat_wq = alloc_workqueue("vmstat", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
        schedule_delayed_work(&shepherd,
                round_jiffies_relative(sysctl_stat_interval));
 }
@@ -1550,7 +1551,6 @@ static int __init setup_vmstat(void)
 
        start_shepherd_timer();
        cpu_notifier_register_done();
-       vmstat_wq = alloc_workqueue("vmstat", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0);
 #endif
 #ifdef CONFIG_PROC_FS
        proc_create("buddyinfo", S_IRUGO, NULL, &fragmentation_file_operations);
index 5396ff0..8a7ada8 100644 (file)
@@ -39,7 +39,7 @@ void br_init_port(struct net_bridge_port *p)
        struct switchdev_attr attr = {
                .id = SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
                .flags = SWITCHDEV_F_SKIP_EOPNOTSUPP | SWITCHDEV_F_DEFER,
-               .u.ageing_time = p->br->ageing_time,
+               .u.ageing_time = jiffies_to_clock_t(p->br->ageing_time),
        };
        int err;
 
@@ -142,7 +142,10 @@ static void br_stp_start(struct net_bridge *br)
        char *envp[] = { NULL };
        struct net_bridge_port *p;
 
-       r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
+       if (net_eq(dev_net(br->dev), &init_net))
+               r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
+       else
+               r = -ENOENT;
 
        spin_lock_bh(&br->lock);
 
index e6dc772..a1656e3 100644 (file)
@@ -301,12 +301,13 @@ void dst_release(struct dst_entry *dst)
 {
        if (dst) {
                int newrefcnt;
+               unsigned short nocache = dst->flags & DST_NOCACHE;
 
                newrefcnt = atomic_dec_return(&dst->__refcnt);
                if (unlikely(newrefcnt < 0))
                        net_warn_ratelimited("%s: dst:%p refcnt:%d\n",
                                             __func__, dst, newrefcnt);
-               if (!newrefcnt && unlikely(dst->flags & DST_NOCACHE))
+               if (!newrefcnt && unlikely(nocache))
                        call_rcu(&dst->rcu_head, dst_destroy_rcu);
        }
 }
index f34c31d..a09fb0d 100644 (file)
@@ -253,9 +253,6 @@ ipip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
        p.i_key = p.o_key = 0;
        p.i_flags = p.o_flags = 0;
-       if (p.iph.ttl)
-               p.iph.frag_off |= htons(IP_DF);
-
        err = ip_tunnel_ioctl(dev, &p, cmd);
        if (err)
                return err;
index 63e5be0..bc35f18 100644 (file)
@@ -601,8 +601,11 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                            (inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),
                           daddr, saddr, 0, 0);
 
-       if (!saddr && ipc.oif)
-               l3mdev_get_saddr(net, ipc.oif, &fl4);
+       if (!saddr && ipc.oif) {
+               err = l3mdev_get_saddr(net, ipc.oif, &fl4);
+               if (err < 0)
+                       goto done;
+       }
 
        if (!inet->hdrincl) {
                rfv.msg = msg;
index 2d656ee..d4c5115 100644 (file)
@@ -2478,6 +2478,9 @@ static void tcp_cwnd_reduction(struct sock *sk, const int prior_unsacked,
        int newly_acked_sacked = prior_unsacked -
                                 (tp->packets_out - tp->sacked_out);
 
+       if (newly_acked_sacked <= 0 || WARN_ON_ONCE(!tp->prior_cwnd))
+               return;
+
        tp->prr_delivered += newly_acked_sacked;
        if (delta < 0) {
                u64 dividend = (u64)tp->snd_ssthresh * tp->prr_delivered +
index 0c7b0e6..c438908 100644 (file)
@@ -1025,8 +1025,11 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                                   flow_flags,
                                   faddr, saddr, dport, inet->inet_sport);
 
-               if (!saddr && ipc.oif)
-                       l3mdev_get_saddr(net, ipc.oif, fl4);
+               if (!saddr && ipc.oif) {
+                       err = l3mdev_get_saddr(net, ipc.oif, fl4);
+                       if (err < 0)
+                               goto out;
+               }
 
                security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
                rt = ip_route_output_flow(net, fl4, sk);
index 1e0c3c8..7b0edb3 100644 (file)
@@ -259,7 +259,7 @@ static void xfrm4_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        xfrm_dst_ifdown(dst, dev);
 }
 
-static struct dst_ops xfrm4_dst_ops = {
+static struct dst_ops xfrm4_dst_ops_template = {
        .family =               AF_INET,
        .gc =                   xfrm4_garbage_collect,
        .update_pmtu =          xfrm4_update_pmtu,
@@ -273,7 +273,7 @@ static struct dst_ops xfrm4_dst_ops = {
 
 static struct xfrm_policy_afinfo xfrm4_policy_afinfo = {
        .family =               AF_INET,
-       .dst_ops =              &xfrm4_dst_ops,
+       .dst_ops =              &xfrm4_dst_ops_template,
        .dst_lookup =           xfrm4_dst_lookup,
        .get_saddr =            xfrm4_get_saddr,
        .decode_session =       _decode_session4,
@@ -295,7 +295,7 @@ static struct ctl_table xfrm4_policy_table[] = {
        { }
 };
 
-static int __net_init xfrm4_net_init(struct net *net)
+static int __net_init xfrm4_net_sysctl_init(struct net *net)
 {
        struct ctl_table *table;
        struct ctl_table_header *hdr;
@@ -323,7 +323,7 @@ err_alloc:
        return -ENOMEM;
 }
 
-static void __net_exit xfrm4_net_exit(struct net *net)
+static void __net_exit xfrm4_net_sysctl_exit(struct net *net)
 {
        struct ctl_table *table;
 
@@ -335,12 +335,44 @@ static void __net_exit xfrm4_net_exit(struct net *net)
        if (!net_eq(net, &init_net))
                kfree(table);
 }
+#else /* CONFIG_SYSCTL */
+static int inline xfrm4_net_sysctl_init(struct net *net)
+{
+       return 0;
+}
+
+static void inline xfrm4_net_sysctl_exit(struct net *net)
+{
+}
+#endif
+
+static int __net_init xfrm4_net_init(struct net *net)
+{
+       int ret;
+
+       memcpy(&net->xfrm.xfrm4_dst_ops, &xfrm4_dst_ops_template,
+              sizeof(xfrm4_dst_ops_template));
+       ret = dst_entries_init(&net->xfrm.xfrm4_dst_ops);
+       if (ret)
+               return ret;
+
+       ret = xfrm4_net_sysctl_init(net);
+       if (ret)
+               dst_entries_destroy(&net->xfrm.xfrm4_dst_ops);
+
+       return ret;
+}
+
+static void __net_exit xfrm4_net_exit(struct net *net)
+{
+       xfrm4_net_sysctl_exit(net);
+       dst_entries_destroy(&net->xfrm.xfrm4_dst_ops);
+}
 
 static struct pernet_operations __net_initdata xfrm4_net_ops = {
        .init   = xfrm4_net_init,
        .exit   = xfrm4_net_exit,
 };
-#endif
 
 static void __init xfrm4_policy_init(void)
 {
@@ -349,13 +381,9 @@ static void __init xfrm4_policy_init(void)
 
 void __init xfrm4_init(void)
 {
-       dst_entries_init(&xfrm4_dst_ops);
-
        xfrm4_state_init();
        xfrm4_policy_init();
        xfrm4_protocol_init();
-#ifdef CONFIG_SYSCTL
        register_pernet_subsys(&xfrm4_net_ops);
-#endif
 }
 
index 17f8e7e..1f21087 100644 (file)
@@ -5369,13 +5369,10 @@ static int addrconf_sysctl_stable_secret(struct ctl_table *ctl, int write,
                goto out;
        }
 
-       if (!write) {
-               err = snprintf(str, sizeof(str), "%pI6",
-                              &secret->secret);
-               if (err >= sizeof(str)) {
-                       err = -EIO;
-                       goto out;
-               }
+       err = snprintf(str, sizeof(str), "%pI6", &secret->secret);
+       if (err >= sizeof(str)) {
+               err = -EIO;
+               goto out;
        }
 
        err = proc_dostring(&lctl, write, buffer, lenp, ppos);
index 882124e..a8f6986 100644 (file)
@@ -552,7 +552,7 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct nlmsghdr *nlh)
 
        rcu_read_lock();
        p = __ipv6_addr_label(net, addr, ipv6_addr_type(addr), ifal->ifal_index);
-       if (p && ip6addrlbl_hold(p))
+       if (p && !ip6addrlbl_hold(p))
                p = NULL;
        lseq = ip6addrlbl_table.seq;
        rcu_read_unlock();
index d6161e1..84afb9a 100644 (file)
@@ -1183,7 +1183,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
         */
        if (!in6_dev->cnf.accept_ra_from_local &&
            ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
-                         NULL, 0)) {
+                         in6_dev->dev, 0)) {
                ND_PRINTK(2, info,
                          "RA from local address detected on dev: %s: default router ignored\n",
                          skb->dev->name);
@@ -1337,7 +1337,7 @@ skip_linkparms:
 #ifdef CONFIG_IPV6_ROUTE_INFO
        if (!in6_dev->cnf.accept_ra_from_local &&
            ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
-                         NULL, 0)) {
+                         in6_dev->dev, 0)) {
                ND_PRINTK(2, info,
                          "RA from local address detected on dev: %s: router info ignored.\n",
                          skb->dev->name);
index 5643423..c074771 100644 (file)
@@ -279,7 +279,7 @@ static void xfrm6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
        xfrm_dst_ifdown(dst, dev);
 }
 
-static struct dst_ops xfrm6_dst_ops = {
+static struct dst_ops xfrm6_dst_ops_template = {
        .family =               AF_INET6,
        .gc =                   xfrm6_garbage_collect,
        .update_pmtu =          xfrm6_update_pmtu,
@@ -293,7 +293,7 @@ static struct dst_ops xfrm6_dst_ops = {
 
 static struct xfrm_policy_afinfo xfrm6_policy_afinfo = {
        .family =               AF_INET6,
-       .dst_ops =              &xfrm6_dst_ops,
+       .dst_ops =              &xfrm6_dst_ops_template,
        .dst_lookup =           xfrm6_dst_lookup,
        .get_saddr =            xfrm6_get_saddr,
        .decode_session =       _decode_session6,
@@ -325,7 +325,7 @@ static struct ctl_table xfrm6_policy_table[] = {
        { }
 };
 
-static int __net_init xfrm6_net_init(struct net *net)
+static int __net_init xfrm6_net_sysctl_init(struct net *net)
 {
        struct ctl_table *table;
        struct ctl_table_header *hdr;
@@ -353,7 +353,7 @@ err_alloc:
        return -ENOMEM;
 }
 
-static void __net_exit xfrm6_net_exit(struct net *net)
+static void __net_exit xfrm6_net_sysctl_exit(struct net *net)
 {
        struct ctl_table *table;
 
@@ -365,24 +365,52 @@ static void __net_exit xfrm6_net_exit(struct net *net)
        if (!net_eq(net, &init_net))
                kfree(table);
 }
+#else /* CONFIG_SYSCTL */
+static int inline xfrm6_net_sysctl_init(struct net *net)
+{
+       return 0;
+}
+
+static void inline xfrm6_net_sysctl_exit(struct net *net)
+{
+}
+#endif
+
+static int __net_init xfrm6_net_init(struct net *net)
+{
+       int ret;
+
+       memcpy(&net->xfrm.xfrm6_dst_ops, &xfrm6_dst_ops_template,
+              sizeof(xfrm6_dst_ops_template));
+       ret = dst_entries_init(&net->xfrm.xfrm6_dst_ops);
+       if (ret)
+               return ret;
+
+       ret = xfrm6_net_sysctl_init(net);
+       if (ret)
+               dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
+
+       return ret;
+}
+
+static void __net_exit xfrm6_net_exit(struct net *net)
+{
+       xfrm6_net_sysctl_exit(net);
+       dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
+}
 
 static struct pernet_operations xfrm6_net_ops = {
        .init   = xfrm6_net_init,
        .exit   = xfrm6_net_exit,
 };
-#endif
 
 int __init xfrm6_init(void)
 {
        int ret;
 
-       dst_entries_init(&xfrm6_dst_ops);
-
        ret = xfrm6_policy_init();
-       if (ret) {
-               dst_entries_destroy(&xfrm6_dst_ops);
+       if (ret)
                goto out;
-       }
        ret = xfrm6_state_init();
        if (ret)
                goto out_policy;
@@ -391,9 +419,7 @@ int __init xfrm6_init(void)
        if (ret)
                goto out_state;
 
-#ifdef CONFIG_SYSCTL
        register_pernet_subsys(&xfrm6_net_ops);
-#endif
 out:
        return ret;
 out_state:
@@ -405,11 +431,8 @@ out_policy:
 
 void xfrm6_fini(void)
 {
-#ifdef CONFIG_SYSCTL
        unregister_pernet_subsys(&xfrm6_net_ops);
-#endif
        xfrm6_protocol_fini();
        xfrm6_policy_fini();
        xfrm6_state_fini();
-       dst_entries_destroy(&xfrm6_dst_ops);
 }
index 7b9c053..edb3502 100644 (file)
@@ -94,7 +94,7 @@ nft_do_chain_netdev(void *priv, struct sk_buff *skb,
 {
        struct nft_pktinfo pkt;
 
-       switch (eth_hdr(skb)->h_proto) {
+       switch (skb->protocol) {
        case htons(ETH_P_IP):
                nft_netdev_set_pktinfo_ipv4(&pkt, skb, state);
                break;
index 8cbca34..9399215 100644 (file)
@@ -366,6 +366,7 @@ static int nft_ct_get_dump(struct sk_buff *skb, const struct nft_expr *expr)
                goto nla_put_failure;
 
        switch (priv->key) {
+       case NFT_CT_L3PROTOCOL:
        case NFT_CT_PROTOCOL:
        case NFT_CT_SRC:
        case NFT_CT_DST:
index 3e88922..e004067 100644 (file)
@@ -698,6 +698,10 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,
                OVS_NLERR(log, "Failed to allocate conntrack template");
                return -ENOMEM;
        }
+
+       __set_bit(IPS_CONFIRMED_BIT, &ct_info.ct->status);
+       nf_conntrack_get(&ct_info.ct->ct_general);
+
        if (helper) {
                err = ovs_ct_add_helper(&ct_info, helper, key, log);
                if (err)
@@ -709,8 +713,6 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr,
        if (err)
                goto err_free_ct;
 
-       __set_bit(IPS_CONFIRMED_BIT, &ct_info.ct->status);
-       nf_conntrack_get(&ct_info.ct->ct_general);
        return 0;
 err_free_ct:
        __ovs_ct_free_action(&ct_info);
index 907d6fd..d1bd4a4 100644 (file)
@@ -2434,7 +2434,10 @@ static int set_action_to_attr(const struct nlattr *a, struct sk_buff *skb)
                if (!start)
                        return -EMSGSIZE;
 
-               err = ovs_nla_put_tunnel_info(skb, tun_info);
+               err =  ip_tun_to_nlattr(skb, &tun_info->key,
+                                       ip_tunnel_info_opts(tun_info),
+                                       tun_info->options_len,
+                                       ip_tunnel_info_af(tun_info));
                if (err)
                        return err;
                nla_nest_end(skb, start);
index e82a1ad..16bc83b 100644 (file)
@@ -658,8 +658,10 @@ static void qdisc_rcu_free(struct rcu_head *head)
 {
        struct Qdisc *qdisc = container_of(head, struct Qdisc, rcu_head);
 
-       if (qdisc_is_percpu_stats(qdisc))
+       if (qdisc_is_percpu_stats(qdisc)) {
                free_percpu(qdisc->cpu_bstats);
+               free_percpu(qdisc->cpu_qstats);
+       }
 
        kfree((char *) qdisc - qdisc->padded);
 }
index cd34a4a..22c2bf3 100644 (file)
@@ -4829,7 +4829,8 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
 
        retval = SCTP_DISPOSITION_CONSUME;
 
-       sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
+       if (abort)
+               sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
 
        /* Even if we can't send the ABORT due to low memory delete the
         * TCB.  This is a departure from our typical NOMEM handling.
@@ -4966,7 +4967,8 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
                        SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
        retval = SCTP_DISPOSITION_CONSUME;
 
-       sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
+       if (abort)
+               sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
 
        sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
                        SCTP_STATE(SCTP_STATE_CLOSED));
index 9b6cc6d..ef1d90f 100644 (file)
@@ -1301,8 +1301,9 @@ static int __sctp_setsockopt_connectx(struct sock *sk,
                                      int addrs_size,
                                      sctp_assoc_t *assoc_id)
 {
-       int err = 0;
        struct sockaddr *kaddrs;
+       gfp_t gfp = GFP_KERNEL;
+       int err = 0;
 
        pr_debug("%s: sk:%p addrs:%p addrs_size:%d\n",
                 __func__, sk, addrs, addrs_size);
@@ -1315,7 +1316,9 @@ static int __sctp_setsockopt_connectx(struct sock *sk,
                return -EFAULT;
 
        /* Alloc space for the address array in kernel memory.  */
-       kaddrs = kmalloc(addrs_size, GFP_KERNEL);
+       if (sk->sk_socket->file)
+               gfp = GFP_USER | __GFP_NOWARN;
+       kaddrs = kmalloc(addrs_size, gfp);
        if (unlikely(!kaddrs))
                return -ENOMEM;
 
@@ -1513,8 +1516,7 @@ static void sctp_close(struct sock *sk, long timeout)
                        struct sctp_chunk *chunk;
 
                        chunk = sctp_make_abort_user(asoc, NULL, 0);
-                       if (chunk)
-                               sctp_primitive_ABORT(net, asoc, chunk);
+                       sctp_primitive_ABORT(net, asoc, chunk);
                } else
                        sctp_primitive_SHUTDOWN(net, asoc, NULL);
        }
@@ -5773,7 +5775,7 @@ static int sctp_getsockopt_assoc_ids(struct sock *sk, int len,
 
        len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num;
 
-       ids = kmalloc(len, GFP_KERNEL);
+       ids = kmalloc(len, GFP_USER | __GFP_NOWARN);
        if (unlikely(!ids))
                return -ENOMEM;
 
@@ -7199,6 +7201,8 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
 
        if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
                net_enable_timestamp();
+
+       security_sk_clone(sk, newsk);
 }
 
 static inline void sctp_copy_descendant(struct sock *sk_to,
index 29822d6..d730ef9 100644 (file)
@@ -257,6 +257,7 @@ static struct inode *sock_alloc_inode(struct super_block *sb)
        }
        init_waitqueue_head(&wq->wait);
        wq->fasync_list = NULL;
+       wq->flags = 0;
        RCU_INIT_POINTER(ei->socket.wq, wq);
 
        ei->socket.state = SS_UNCONNECTED;
index a463147..ef05cd9 100644 (file)
@@ -953,32 +953,20 @@ fail:
        return NULL;
 }
 
-static int unix_mknod(const char *sun_path, umode_t mode, struct path *res)
+static int unix_mknod(struct dentry *dentry, struct path *path, umode_t mode,
+                     struct path *res)
 {
-       struct dentry *dentry;
-       struct path path;
-       int err = 0;
-       /*
-        * Get the parent directory, calculate the hash for last
-        * component.
-        */
-       dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
-       err = PTR_ERR(dentry);
-       if (IS_ERR(dentry))
-               return err;
+       int err;
 
-       /*
-        * All right, let's create it.
-        */
-       err = security_path_mknod(&path, dentry, mode, 0);
+       err = security_path_mknod(path, dentry, mode, 0);
        if (!err) {
-               err = vfs_mknod(d_inode(path.dentry), dentry, mode, 0);
+               err = vfs_mknod(d_inode(path->dentry), dentry, mode, 0);
                if (!err) {
-                       res->mnt = mntget(path.mnt);
+                       res->mnt = mntget(path->mnt);
                        res->dentry = dget(dentry);
                }
        }
-       done_path_create(&path, dentry);
+
        return err;
 }
 
@@ -989,10 +977,12 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        struct unix_sock *u = unix_sk(sk);
        struct sockaddr_un *sunaddr = (struct sockaddr_un *)uaddr;
        char *sun_path = sunaddr->sun_path;
-       int err;
+       int err, name_err;
        unsigned int hash;
        struct unix_address *addr;
        struct hlist_head *list;
+       struct path path;
+       struct dentry *dentry;
 
        err = -EINVAL;
        if (sunaddr->sun_family != AF_UNIX)
@@ -1008,14 +998,34 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                goto out;
        addr_len = err;
 
+       name_err = 0;
+       dentry = NULL;
+       if (sun_path[0]) {
+               /* Get the parent directory, calculate the hash for last
+                * component.
+                */
+               dentry = kern_path_create(AT_FDCWD, sun_path, &path, 0);
+
+               if (IS_ERR(dentry)) {
+                       /* delay report until after 'already bound' check */
+                       name_err = PTR_ERR(dentry);
+                       dentry = NULL;
+               }
+       }
+
        err = mutex_lock_interruptible(&u->readlock);
        if (err)
-               goto out;
+               goto out_path;
 
        err = -EINVAL;
        if (u->addr)
                goto out_up;
 
+       if (name_err) {
+               err = name_err == -EEXIST ? -EADDRINUSE : name_err;
+               goto out_up;
+       }
+
        err = -ENOMEM;
        addr = kmalloc(sizeof(*addr)+addr_len, GFP_KERNEL);
        if (!addr)
@@ -1026,11 +1036,11 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        addr->hash = hash ^ sk->sk_type;
        atomic_set(&addr->refcnt, 1);
 
-       if (sun_path[0]) {
-               struct path path;
+       if (dentry) {
+               struct path u_path;
                umode_t mode = S_IFSOCK |
                       (SOCK_INODE(sock)->i_mode & ~current_umask());
-               err = unix_mknod(sun_path, mode, &path);
+               err = unix_mknod(dentry, &path, mode, &u_path);
                if (err) {
                        if (err == -EEXIST)
                                err = -EADDRINUSE;
@@ -1038,9 +1048,9 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                        goto out_up;
                }
                addr->hash = UNIX_HASH_SIZE;
-               hash = d_backing_inode(path.dentry)->i_ino & (UNIX_HASH_SIZE-1);
+               hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
                spin_lock(&unix_table_lock);
-               u->path = path;
+               u->path = u_path;
                list = &unix_socket_table[hash];
        } else {
                spin_lock(&unix_table_lock);
@@ -1063,6 +1073,10 @@ out_unlock:
        spin_unlock(&unix_table_lock);
 out_up:
        mutex_unlock(&u->readlock);
+out_path:
+       if (dentry)
+               done_path_create(&path, dentry);
+
 out:
        return err;
 }
index 948fa55..b5e665b 100644 (file)
@@ -2826,7 +2826,6 @@ static struct neighbour *xfrm_neigh_lookup(const struct dst_entry *dst,
 
 int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
 {
-       struct net *net;
        int err = 0;
        if (unlikely(afinfo == NULL))
                return -EINVAL;
@@ -2857,26 +2856,6 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
        }
        spin_unlock(&xfrm_policy_afinfo_lock);
 
-       rtnl_lock();
-       for_each_net(net) {
-               struct dst_ops *xfrm_dst_ops;
-
-               switch (afinfo->family) {
-               case AF_INET:
-                       xfrm_dst_ops = &net->xfrm.xfrm4_dst_ops;
-                       break;
-#if IS_ENABLED(CONFIG_IPV6)
-               case AF_INET6:
-                       xfrm_dst_ops = &net->xfrm.xfrm6_dst_ops;
-                       break;
-#endif
-               default:
-                       BUG();
-               }
-               *xfrm_dst_ops = *afinfo->dst_ops;
-       }
-       rtnl_unlock();
-
        return err;
 }
 EXPORT_SYMBOL(xfrm_policy_register_afinfo);
@@ -2912,22 +2891,6 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo)
 }
 EXPORT_SYMBOL(xfrm_policy_unregister_afinfo);
 
-static void __net_init xfrm_dst_ops_init(struct net *net)
-{
-       struct xfrm_policy_afinfo *afinfo;
-
-       rcu_read_lock();
-       afinfo = rcu_dereference(xfrm_policy_afinfo[AF_INET]);
-       if (afinfo)
-               net->xfrm.xfrm4_dst_ops = *afinfo->dst_ops;
-#if IS_ENABLED(CONFIG_IPV6)
-       afinfo = rcu_dereference(xfrm_policy_afinfo[AF_INET6]);
-       if (afinfo)
-               net->xfrm.xfrm6_dst_ops = *afinfo->dst_ops;
-#endif
-       rcu_read_unlock();
-}
-
 static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void *ptr)
 {
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
@@ -3076,7 +3039,6 @@ static int __net_init xfrm_net_init(struct net *net)
        rv = xfrm_policy_init(net);
        if (rv < 0)
                goto out_policy;
-       xfrm_dst_ops_init(net);
        rv = xfrm_sysctl_init(net);
        if (rv < 0)
                goto out_sysctl;
index 698768b..e167592 100644 (file)
 
 static int fd_map;     /* File descriptor for file being modified. */
 static int mmap_failed; /* Boolean flag. */
-static void *ehdr_curr; /* current ElfXX_Ehdr *  for resource cleanup */
 static char gpfx;      /* prefix for global symbol name (sometimes '_') */
 static struct stat sb; /* Remember .st_size, etc. */
 static jmp_buf jmpenv; /* setjmp/longjmp per-file error escape */
 static const char *altmcount;  /* alternate mcount symbol name */
 static int warn_on_notrace_sect; /* warn when section has mcount not being recorded */
+static void *file_map; /* pointer of the mapped file */
+static void *file_end; /* pointer to the end of the mapped file */
+static int file_updated; /* flag to state file was changed */
+static void *file_ptr; /* current file pointer location */
+static void *file_append; /* added to the end of the file */
+static size_t file_append_size; /* how much is added to end of file */
 
 /* setjmp() return values */
 enum {
@@ -67,10 +72,14 @@ static void
 cleanup(void)
 {
        if (!mmap_failed)
-               munmap(ehdr_curr, sb.st_size);
+               munmap(file_map, sb.st_size);
        else
-               free(ehdr_curr);
-       close(fd_map);
+               free(file_map);
+       file_map = NULL;
+       free(file_append);
+       file_append = NULL;
+       file_append_size = 0;
+       file_updated = 0;
 }
 
 static void __attribute__((noreturn))
@@ -92,12 +101,22 @@ succeed_file(void)
 static off_t
 ulseek(int const fd, off_t const offset, int const whence)
 {
-       off_t const w = lseek(fd, offset, whence);
-       if (w == (off_t)-1) {
-               perror("lseek");
+       switch (whence) {
+       case SEEK_SET:
+               file_ptr = file_map + offset;
+               break;
+       case SEEK_CUR:
+               file_ptr += offset;
+               break;
+       case SEEK_END:
+               file_ptr = file_map + (sb.st_size - offset);
+               break;
+       }
+       if (file_ptr < file_map) {
+               fprintf(stderr, "lseek: seek before file\n");
                fail_file();
        }
-       return w;
+       return file_ptr - file_map;
 }
 
 static size_t
@@ -114,12 +133,38 @@ uread(int const fd, void *const buf, size_t const count)
 static size_t
 uwrite(int const fd, void const *const buf, size_t const count)
 {
-       size_t const n = write(fd, buf, count);
-       if (n != count) {
-               perror("write");
-               fail_file();
+       size_t cnt = count;
+       off_t idx = 0;
+
+       file_updated = 1;
+
+       if (file_ptr + count >= file_end) {
+               off_t aoffset = (file_ptr + count) - file_end;
+
+               if (aoffset > file_append_size) {
+                       file_append = realloc(file_append, aoffset);
+                       file_append_size = aoffset;
+               }
+               if (!file_append) {
+                       perror("write");
+                       fail_file();
+               }
+               if (file_ptr < file_end) {
+                       cnt = file_end - file_ptr;
+               } else {
+                       cnt = 0;
+                       idx = aoffset - count;
+               }
        }
-       return n;
+
+       if (cnt)
+               memcpy(file_ptr, buf, cnt);
+
+       if (cnt < count)
+               memcpy(file_append + idx, buf + cnt, count - cnt);
+
+       file_ptr += count;
+       return count;
 }
 
 static void *
@@ -192,9 +237,7 @@ static int make_nop_arm64(void *map, size_t const offset)
  */
 static void *mmap_file(char const *fname)
 {
-       void *addr;
-
-       fd_map = open(fname, O_RDWR);
+       fd_map = open(fname, O_RDONLY);
        if (fd_map < 0 || fstat(fd_map, &sb) < 0) {
                perror(fname);
                fail_file();
@@ -203,15 +246,58 @@ static void *mmap_file(char const *fname)
                fprintf(stderr, "not a regular file: %s\n", fname);
                fail_file();
        }
-       addr = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
-                   fd_map, 0);
+       file_map = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
+                       fd_map, 0);
        mmap_failed = 0;
-       if (addr == MAP_FAILED) {
+       if (file_map == MAP_FAILED) {
                mmap_failed = 1;
-               addr = umalloc(sb.st_size);
-               uread(fd_map, addr, sb.st_size);
+               file_map = umalloc(sb.st_size);
+               uread(fd_map, file_map, sb.st_size);
+       }
+       close(fd_map);
+
+       file_end = file_map + sb.st_size;
+
+       return file_map;
+}
+
+static void write_file(const char *fname)
+{
+       char tmp_file[strlen(fname) + 4];
+       size_t n;
+
+       if (!file_updated)
+               return;
+
+       sprintf(tmp_file, "%s.rc", fname);
+
+       /*
+        * After reading the entire file into memory, delete it
+        * and write it back, to prevent weird side effects of modifying
+        * an object file in place.
+        */
+       fd_map = open(tmp_file, O_WRONLY | O_TRUNC | O_CREAT, sb.st_mode);
+       if (fd_map < 0) {
+               perror(fname);
+               fail_file();
+       }
+       n = write(fd_map, file_map, sb.st_size);
+       if (n != sb.st_size) {
+               perror("write");
+               fail_file();
+       }
+       if (file_append_size) {
+               n = write(fd_map, file_append, file_append_size);
+               if (n != file_append_size) {
+                       perror("write");
+                       fail_file();
+               }
+       }
+       close(fd_map);
+       if (rename(tmp_file, fname) < 0) {
+               perror(fname);
+               fail_file();
        }
-       return addr;
 }
 
 /* w8rev, w8nat, ...: Handle endianness. */
@@ -318,7 +404,6 @@ do_file(char const *const fname)
        Elf32_Ehdr *const ehdr = mmap_file(fname);
        unsigned int reltype = 0;
 
-       ehdr_curr = ehdr;
        w = w4nat;
        w2 = w2nat;
        w8 = w8nat;
@@ -441,6 +526,7 @@ do_file(char const *const fname)
        }
        }  /* end switch */
 
+       write_file(fname);
        cleanup();
 }
 
@@ -493,11 +579,14 @@ main(int argc, char *argv[])
                case SJ_SETJMP:    /* normal sequence */
                        /* Avoid problems if early cleanup() */
                        fd_map = -1;
-                       ehdr_curr = NULL;
                        mmap_failed = 1;
+                       file_map = NULL;
+                       file_ptr = NULL;
+                       file_updated = 0;
                        do_file(file);
                        break;
                case SJ_FAIL:    /* error in do_file or below */
+                       fprintf(stderr, "%s: failed\n", file);
                        ++n_error;
                        break;
                case SJ_SUCCEED:    /* premature success */
index fb111ea..1c3872a 100644 (file)
@@ -751,16 +751,16 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen)
 
        /* the key is probably readable - now try to read it */
 can_read_key:
-       ret = key_validate(key);
-       if (ret == 0) {
-               ret = -EOPNOTSUPP;
-               if (key->type->read) {
-                       /* read the data with the semaphore held (since we
-                        * might sleep) */
-                       down_read(&key->sem);
+       ret = -EOPNOTSUPP;
+       if (key->type->read) {
+               /* Read the data with the semaphore held (since we might sleep)
+                * to protect against the key being updated or revoked.
+                */
+               down_read(&key->sem);
+               ret = key_validate(key);
+               if (ret == 0)
                        ret = key->type->read(key, buffer, buflen);
-                       up_read(&key->sem);
-               }
+               up_read(&key->sem);
        }
 
 error2:
index bff5c8b..3b36582 100644 (file)
@@ -954,6 +954,36 @@ static int azx_resume(struct device *dev)
 }
 #endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
 
+#ifdef CONFIG_PM_SLEEP
+/* put codec down to D3 at hibernation for Intel SKL+;
+ * otherwise BIOS may still access the codec and screw up the driver
+ */
+#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170)
+#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
+#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
+#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci))
+
+static int azx_freeze_noirq(struct device *dev)
+{
+       struct pci_dev *pci = to_pci_dev(dev);
+
+       if (IS_SKL_PLUS(pci))
+               pci_set_power_state(pci, PCI_D3hot);
+
+       return 0;
+}
+
+static int azx_thaw_noirq(struct device *dev)
+{
+       struct pci_dev *pci = to_pci_dev(dev);
+
+       if (IS_SKL_PLUS(pci))
+               pci_set_power_state(pci, PCI_D0);
+
+       return 0;
+}
+#endif /* CONFIG_PM_SLEEP */
+
 #ifdef CONFIG_PM
 static int azx_runtime_suspend(struct device *dev)
 {
@@ -1063,6 +1093,10 @@ static int azx_runtime_idle(struct device *dev)
 
 static const struct dev_pm_ops azx_pm = {
        SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
+#ifdef CONFIG_PM_SLEEP
+       .freeze_noirq = azx_freeze_noirq,
+       .thaw_noirq = azx_thaw_noirq,
+#endif
        SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
 };
 
index 6c268da..3a89d82 100644 (file)
@@ -67,6 +67,10 @@ enum {
        ALC_HEADSET_TYPE_OMTP,
 };
 
+enum {
+       ALC_KEY_MICMUTE_INDEX,
+};
+
 struct alc_customize_define {
        unsigned int  sku_cfg;
        unsigned char port_connectivity;
@@ -123,6 +127,7 @@ struct alc_spec {
        unsigned int pll_coef_idx, pll_coef_bit;
        unsigned int coef0;
        struct input_dev *kb_dev;
+       u8 alc_mute_keycode_map[1];
 };
 
 /*
@@ -1775,6 +1780,7 @@ enum {
        ALC889_FIXUP_MBA11_VREF,
        ALC889_FIXUP_MBA21_VREF,
        ALC889_FIXUP_MP11_VREF,
+       ALC889_FIXUP_MP41_VREF,
        ALC882_FIXUP_INV_DMIC,
        ALC882_FIXUP_NO_PRIMARY_HP,
        ALC887_FIXUP_ASUS_BASS,
@@ -1863,7 +1869,7 @@ static void alc889_fixup_mbp_vref(struct hda_codec *codec,
                                  const struct hda_fixup *fix, int action)
 {
        struct alc_spec *spec = codec->spec;
-       static hda_nid_t nids[2] = { 0x14, 0x15 };
+       static hda_nid_t nids[3] = { 0x14, 0x15, 0x19 };
        int i;
 
        if (action != HDA_FIXUP_ACT_INIT)
@@ -2153,6 +2159,12 @@ static const struct hda_fixup alc882_fixups[] = {
                .chained = true,
                .chain_id = ALC885_FIXUP_MACPRO_GPIO,
        },
+       [ALC889_FIXUP_MP41_VREF] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc889_fixup_mbp_vref,
+               .chained = true,
+               .chain_id = ALC885_FIXUP_MACPRO_GPIO,
+       },
        [ALC882_FIXUP_INV_DMIC] = {
                .type = HDA_FIXUP_FUNC,
                .v.func = alc_fixup_inv_dmic,
@@ -2235,7 +2247,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
        SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
        SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
        SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
-       SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO),
+       SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
        SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
        SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
        SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
@@ -3455,12 +3467,43 @@ static void gpio2_mic_hotkey_event(struct hda_codec *codec,
 
        /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
           send both key on and key off event for every interrupt. */
-       input_report_key(spec->kb_dev, KEY_MICMUTE, 1);
+       input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
        input_sync(spec->kb_dev);
-       input_report_key(spec->kb_dev, KEY_MICMUTE, 0);
+       input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
        input_sync(spec->kb_dev);
 }
 
+static int alc_register_micmute_input_device(struct hda_codec *codec)
+{
+       struct alc_spec *spec = codec->spec;
+       int i;
+
+       spec->kb_dev = input_allocate_device();
+       if (!spec->kb_dev) {
+               codec_err(codec, "Out of memory (input_allocate_device)\n");
+               return -ENOMEM;
+       }
+
+       spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
+
+       spec->kb_dev->name = "Microphone Mute Button";
+       spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
+       spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
+       spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
+       spec->kb_dev->keycode = spec->alc_mute_keycode_map;
+       for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
+               set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
+
+       if (input_register_device(spec->kb_dev)) {
+               codec_err(codec, "input_register_device failed\n");
+               input_free_device(spec->kb_dev);
+               spec->kb_dev = NULL;
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
                                             const struct hda_fixup *fix, int action)
 {
@@ -3478,20 +3521,8 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
        struct alc_spec *spec = codec->spec;
 
        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
-               spec->kb_dev = input_allocate_device();
-               if (!spec->kb_dev) {
-                       codec_err(codec, "Out of memory (input_allocate_device)\n");
-                       return;
-               }
-               spec->kb_dev->name = "Microphone Mute Button";
-               spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
-               spec->kb_dev->keybit[BIT_WORD(KEY_MICMUTE)] = BIT_MASK(KEY_MICMUTE);
-               if (input_register_device(spec->kb_dev)) {
-                       codec_err(codec, "input_register_device failed\n");
-                       input_free_device(spec->kb_dev);
-                       spec->kb_dev = NULL;
+               if (alc_register_micmute_input_device(codec) != 0)
                        return;
-               }
 
                snd_hda_add_verbs(codec, gpio_init);
                snd_hda_codec_write_cache(codec, codec->core.afg, 0,
@@ -3521,6 +3552,47 @@ static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
        }
 }
 
+static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
+                                            const struct hda_fixup *fix, int action)
+{
+       /* Line2 = mic mute hotkey
+          GPIO2 = mic mute LED */
+       static const struct hda_verb gpio_init[] = {
+               { 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
+               { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
+               {}
+       };
+
+       struct alc_spec *spec = codec->spec;
+
+       if (action == HDA_FIXUP_ACT_PRE_PROBE) {
+               if (alc_register_micmute_input_device(codec) != 0)
+                       return;
+
+               snd_hda_add_verbs(codec, gpio_init);
+               snd_hda_jack_detect_enable_callback(codec, 0x1b,
+                                                   gpio2_mic_hotkey_event);
+
+               spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
+               spec->gpio_led = 0;
+               spec->mute_led_polarity = 0;
+               spec->gpio_mic_led_mask = 0x04;
+               return;
+       }
+
+       if (!spec->kb_dev)
+               return;
+
+       switch (action) {
+       case HDA_FIXUP_ACT_PROBE:
+               spec->init_amp = ALC_INIT_DEFAULT;
+               break;
+       case HDA_FIXUP_ACT_FREE:
+               input_unregister_device(spec->kb_dev);
+               spec->kb_dev = NULL;
+       }
+}
+
 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
                                const struct hda_fixup *fix, int action)
 {
@@ -4621,6 +4693,7 @@ enum {
        ALC275_FIXUP_DELL_XPS,
        ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
        ALC293_FIXUP_LENOVO_SPK_NOISE,
+       ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -5230,6 +5303,10 @@ static const struct hda_fixup alc269_fixups[] = {
                .chained = true,
                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
        },
+       [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
+       },
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -5379,6 +5456,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
        SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
        SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
+       SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
        SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
        SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
        SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
index b3ea24d..93b4008 100644 (file)
@@ -1537,7 +1537,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
        bool reconfig;
        unsigned int aif_tx_state, aif_rx_state;
 
-       if (params_rate(params) % 8000)
+       if (params_rate(params) % 4000)
                rates = &arizona_44k1_bclk_rates[0];
        else
                rates = &arizona_48k_bclk_rates[0];
index 84f5eb0..afa6c5d 100644 (file)
@@ -85,7 +85,15 @@ static const DECLARE_TLV_DB_SCALE(pga_tlv, 0, 300, 0);
 static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
 static const DECLARE_TLV_DB_SCALE(mic_tlv, 0, 300, 0);
 
-static const int deemph_settings[] = { 0, 32000, 44100, 48000 };
+static const struct {
+       int rate;
+       unsigned int val;
+} deemph_settings[] = {
+       { 0,     ES8328_DACCONTROL6_DEEMPH_OFF },
+       { 32000, ES8328_DACCONTROL6_DEEMPH_32k },
+       { 44100, ES8328_DACCONTROL6_DEEMPH_44_1k },
+       { 48000, ES8328_DACCONTROL6_DEEMPH_48k },
+};
 
 static int es8328_set_deemph(struct snd_soc_codec *codec)
 {
@@ -97,21 +105,22 @@ static int es8328_set_deemph(struct snd_soc_codec *codec)
         * rate.
         */
        if (es8328->deemph) {
-               best = 1;
-               for (i = 2; i < ARRAY_SIZE(deemph_settings); i++) {
-                       if (abs(deemph_settings[i] - es8328->playback_fs) <
-                           abs(deemph_settings[best] - es8328->playback_fs))
+               best = 0;
+               for (i = 1; i < ARRAY_SIZE(deemph_settings); i++) {
+                       if (abs(deemph_settings[i].rate - es8328->playback_fs) <
+                           abs(deemph_settings[best].rate - es8328->playback_fs))
                                best = i;
                }
 
-               val = best << 1;
+               val = deemph_settings[best].val;
        } else {
-               val = 0;
+               val = ES8328_DACCONTROL6_DEEMPH_OFF;
        }
 
        dev_dbg(codec->dev, "Set deemphasis %d\n", val);
 
-       return snd_soc_update_bits(codec, ES8328_DACCONTROL6, 0x6, val);
+       return snd_soc_update_bits(codec, ES8328_DACCONTROL6,
+                       ES8328_DACCONTROL6_DEEMPH_MASK, val);
 }
 
 static int es8328_get_deemph(struct snd_kcontrol *kcontrol,
index cb36afe..156c748 100644 (file)
@@ -153,6 +153,7 @@ int es8328_probe(struct device *dev, struct regmap *regmap);
 #define ES8328_DACCONTROL6_CLICKFREE (1 << 3)
 #define ES8328_DACCONTROL6_DAC_INVR (1 << 4)
 #define ES8328_DACCONTROL6_DAC_INVL (1 << 5)
+#define ES8328_DACCONTROL6_DEEMPH_MASK (3 << 6)
 #define ES8328_DACCONTROL6_DEEMPH_OFF (0 << 6)
 #define ES8328_DACCONTROL6_DEEMPH_32k (1 << 6)
 #define ES8328_DACCONTROL6_DEEMPH_44_1k (2 << 6)
index ef76940..3e3c7f6 100644 (file)
@@ -1667,9 +1667,13 @@ static int rt5645_spk_event(struct snd_soc_dapm_widget *w,
                        RT5645_PWR_CLS_D_L,
                        RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
                        RT5645_PWR_CLS_D_L);
+               snd_soc_update_bits(codec, RT5645_GEN_CTRL3,
+                       RT5645_DET_CLK_MASK, RT5645_DET_CLK_MODE1);
                break;
 
        case SND_SOC_DAPM_PRE_PMD:
+               snd_soc_update_bits(codec, RT5645_GEN_CTRL3,
+                       RT5645_DET_CLK_MASK, RT5645_DET_CLK_DIS);
                snd_soc_write(codec, RT5645_EQ_CTRL2, 0);
                snd_soc_update_bits(codec, RT5645_PWR_DIG1,
                        RT5645_PWR_CLS_D | RT5645_PWR_CLS_D_R |
index 093e46d..205e071 100644 (file)
@@ -2122,6 +2122,10 @@ enum {
 /* General Control3 (0xfc) */
 #define RT5645_JD_PSV_MODE                     (0x1 << 12)
 #define RT5645_IRQ_CLK_GATE_CTRL               (0x1 << 11)
+#define RT5645_DET_CLK_MASK                    (0x3 << 9)
+#define RT5645_DET_CLK_DIS                     (0x0 << 9)
+#define RT5645_DET_CLK_MODE1                   (0x1 << 9)
+#define RT5645_DET_CLK_MODE2                   (0x2 << 9)
 #define RT5645_MICINDET_MANU                   (0x1 << 7)
 #define RT5645_RING2_SLEEVE_GND                        (0x1 << 5)
 
index f540f82..08b4046 100644 (file)
@@ -189,6 +189,7 @@ static int power_vag_event(struct snd_soc_dapm_widget *w,
        case SND_SOC_DAPM_POST_PMU:
                snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
                        SGTL5000_VAG_POWERUP, SGTL5000_VAG_POWERUP);
+               msleep(400);
                break;
 
        case SND_SOC_DAPM_PRE_PMD:
index 0a60677..4c29bd2 100644 (file)
@@ -574,6 +574,7 @@ static const struct regmap_config wm8974_regmap = {
        .max_register = WM8974_MONOMIX,
        .reg_defaults = wm8974_reg_defaults,
        .num_reg_defaults = ARRAY_SIZE(wm8974_reg_defaults),
+       .cache_type = REGCACHE_FLAT,
 };
 
 static int wm8974_probe(struct snd_soc_codec *codec)
index c1c9c2e..2ccb8bc 100644 (file)
@@ -223,8 +223,8 @@ static void mcasp_start_tx(struct davinci_mcasp *mcasp)
 
        /* wait for XDATA to be cleared */
        cnt = 0;
-       while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) &
-                ~XRDATA) && (cnt < 100000))
+       while ((mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) & XRDATA) &&
+              (cnt < 100000))
                cnt++;
 
        /* Release TX state machine */
index ffd5f9a..08b460b 100644 (file)
@@ -505,6 +505,24 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
                                           FSL_SAI_CSR_FR, FSL_SAI_CSR_FR);
                        regmap_update_bits(sai->regmap, FSL_SAI_RCSR,
                                           FSL_SAI_CSR_FR, FSL_SAI_CSR_FR);
+
+                       /*
+                        * For sai master mode, after several open/close sai,
+                        * there will be no frame clock, and can't recover
+                        * anymore. Add software reset to fix this issue.
+                        * This is a hardware bug, and will be fix in the
+                        * next sai version.
+                        */
+                       if (!sai->is_slave_mode) {
+                               /* Software Reset for both Tx and Rx */
+                               regmap_write(sai->regmap,
+                                            FSL_SAI_TCSR, FSL_SAI_CSR_SR);
+                               regmap_write(sai->regmap,
+                                            FSL_SAI_RCSR, FSL_SAI_CSR_SR);
+                               /* Clear SR bit to finish the reset */
+                               regmap_write(sai->regmap, FSL_SAI_TCSR, 0);
+                               regmap_write(sai->regmap, FSL_SAI_RCSR, 0);
+                       }
                }
                break;
        default:
index ffea427..ad4d0f8 100644 (file)
@@ -1240,7 +1240,6 @@ int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus)
         */
        ret = snd_soc_tplg_component_load(&platform->component,
                                        &skl_tplg_ops, fw, 0);
-       release_firmware(fw);
        if (ret < 0) {
                dev_err(bus->dev, "tplg component load failed%d\n", ret);
                return -EINVAL;
@@ -1249,5 +1248,7 @@ int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus)
        skl->resource.max_mcps = SKL_MAX_MCPS;
        skl->resource.max_mem = SKL_FW_MAX_MEM;
 
+       skl->tplg = fw;
+
        return 0;
 }
index 5319529..caa69c4 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
 #include <linux/platform_device.h>
+#include <linux/firmware.h>
 #include <sound/pcm.h>
 #include "skl.h"
 
@@ -520,6 +521,9 @@ static void skl_remove(struct pci_dev *pci)
        struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
        struct skl *skl = ebus_to_skl(ebus);
 
+       if (skl->tplg)
+               release_firmware(skl->tplg);
+
        if (pci_dev_run_wake(pci))
                pm_runtime_get_noresume(&pci->dev);
        pci_dev_put(pci);
index dd2e79a..a0709e3 100644 (file)
@@ -68,6 +68,8 @@ struct skl {
        struct skl_dsp_resource resource;
        struct list_head ppl_list;
        struct list_head dapm_path_list;
+
+       const struct firmware *tplg;
 };
 
 #define skl_to_ebus(s) (&(s)->ebus)
index ac72ff5..5a806da 100644 (file)
@@ -152,8 +152,10 @@ static int rk_spdif_trigger(struct snd_pcm_substream *substream,
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
                ret = regmap_update_bits(spdif->regmap, SPDIF_DMACR,
-                                  SPDIF_DMACR_TDE_ENABLE,
-                                  SPDIF_DMACR_TDE_ENABLE);
+                                  SPDIF_DMACR_TDE_ENABLE |
+                                  SPDIF_DMACR_TDL_MASK,
+                                  SPDIF_DMACR_TDE_ENABLE |
+                                  SPDIF_DMACR_TDL(16));
 
                if (ret != 0)
                        return ret;
index 921b409..3ef1277 100644 (file)
@@ -42,7 +42,7 @@
 
 #define SPDIF_DMACR_TDL_SHIFT  0
 #define SPDIF_DMACR_TDL(x)     ((x) << SPDIF_DMACR_TDL_SHIFT)
-#define SPDIF_DMACR_TDL_MASK   (0x1f << SDPIF_DMACR_TDL_SHIFT)
+#define SPDIF_DMACR_TDL_MASK   (0x1f << SPDIF_DMACR_TDL_SHIFT)
 
 /*
  * XFER
index 918b4de..6419f57 100644 (file)
@@ -110,7 +110,7 @@ int cmd_buildid_list(int argc, const char **argv,
        setup_pager();
 
        if (show_kernel)
-               return sysfs__fprintf_build_id(stdout);
+               return !(sysfs__fprintf_build_id(stdout) > 0);
 
        return perf_session__list_build_ids(force, with_hits);
 }
index fa9eb92..81def6c 100644 (file)
@@ -298,6 +298,9 @@ static bool hist_browser__toggle_fold(struct hist_browser *browser)
        struct callchain_list *cl = container_of(ms, struct callchain_list, ms);
        bool has_children;
 
+       if (!he || !ms)
+               return false;
+
        if (ms == &he->ms)
                has_children = hist_entry__toggle_fold(he);
        else
@@ -928,6 +931,8 @@ static unsigned int hist_browser__refresh(struct ui_browser *browser)
        }
 
        ui_browser__hists_init_top(browser);
+       hb->he_selection = NULL;
+       hb->selection = NULL;
 
        for (nd = browser->top; nd; nd = rb_next(nd)) {
                struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
@@ -1033,6 +1038,9 @@ static void ui_browser__hists_seek(struct ui_browser *browser,
         * and stop when we printed enough lines to fill the screen.
         */
 do_offset:
+       if (!nd)
+               return;
+
        if (offset > 0) {
                do {
                        h = rb_entry(nd, struct hist_entry, rb_node);
index 217b5a6..6a7e273 100644 (file)
@@ -91,7 +91,7 @@ int build_id__sprintf(const u8 *build_id, int len, char *bf)
                bid += 2;
        }
 
-       return raw - build_id;
+       return (bid - bf) + 1;
 }
 
 int sysfs__sprintf_build_id(const char *root_dir, char *sbuild_id)
index e48d9da..6fc8cd7 100644 (file)
@@ -124,6 +124,10 @@ struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
                .symbol = "dummy",
                .alias  = "",
        },
+       [PERF_COUNT_SW_BPF_OUTPUT] = {
+               .symbol = "bpf-output",
+               .alias  = "",
+       },
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
@@ -1879,7 +1883,7 @@ restart:
 
        for (i = 0; i < max; i++, syms++) {
 
-               if (event_glob != NULL &&
+               if (event_glob != NULL && syms->symbol != NULL &&
                    !(strglobmatch(syms->symbol, event_glob) ||
                      (syms->alias && strglobmatch(syms->alias, event_glob))))
                        continue;
index e882c83..a8bf908 100644 (file)
 
 include ../../scripts/Makefile.include
 
-all: acpidump ec
-clean: acpidump_clean ec_clean
-install: acpidump_install ec_install
-uninstall: acpidump_uninstall ec_uninstall
+all: acpidbg acpidump ec
+clean: acpidbg_clean acpidump_clean ec_clean
+install: acpidbg_install acpidump_install ec_install
+uninstall: acpidbg_uninstall acpidump_uninstall ec_uninstall
 
-acpidump ec: FORCE
+acpidbg acpidump ec: FORCE
        $(call descend,tools/$@,all)
-acpidump_clean ec_clean:
+acpidbg_clean acpidump_clean ec_clean:
        $(call descend,tools/$(@:_clean=),clean)
-acpidump_install ec_install:
+acpidbg_install acpidump_install ec_install:
        $(call descend,tools/$(@:_install=),install)
-acpidump_uninstall ec_uninstall:
+acpidbg_uninstall acpidump_uninstall ec_uninstall:
        $(call descend,tools/$(@:_uninstall=),uninstall)
 
 .PHONY: FORCE
index 326e826..efefe30 100644 (file)
@@ -47,6 +47,7 @@
  * Option strings:
  *    "f"       - Option has no arguments
  *    "f:"      - Option requires an argument
+ *    "f+"      - Option has an optional argument
  *    "f^"      - Option has optional single-char sub-options
  *    "f|"      - Option has required single-char sub-options
  */
@@ -85,6 +86,7 @@ static int current_char_ptr = 1;
 
 int acpi_getopt_argument(int argc, char **argv)
 {
+
        acpi_gbl_optind--;
        current_char_ptr++;
 
index b51e40a..6df7583 100644 (file)
@@ -73,6 +73,7 @@ ACPI_FILE acpi_os_open_file(const char *path, u8 modes)
        if (modes & ACPI_FILE_WRITING) {
                modes_str[i++] = 'w';
        }
+
        if (modes & ACPI_FILE_BINARY) {
                modes_str[i++] = 'b';
        }
@@ -101,6 +102,7 @@ ACPI_FILE acpi_os_open_file(const char *path, u8 modes)
 
 void acpi_os_close_file(ACPI_FILE file)
 {
+
        fclose(file);
 }
 
@@ -202,6 +204,7 @@ acpi_status acpi_os_set_file_offset(ACPI_FILE file, long offset, u8 from)
        if (from == ACPI_FILE_BEGIN) {
                ret = fseek(file, offset, SEEK_SET);
        }
+
        if (from == ACPI_FILE_END) {
                ret = fseek(file, offset, SEEK_END);
        }
diff --git a/tools/power/acpi/tools/acpidbg/Makefile b/tools/power/acpi/tools/acpidbg/Makefile
new file mode 100644 (file)
index 0000000..352df4b
--- /dev/null
@@ -0,0 +1,27 @@
+# tools/power/acpi/tools/acpidbg/Makefile - ACPI tool Makefile
+#
+# Copyright (c) 2015, Intel Corporation
+#   Author: Lv Zheng <lv.zheng@intel.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; version 2
+# of the License.
+
+include ../../Makefile.config
+
+TOOL = acpidbg
+vpath %.c \
+       ../../../../../drivers/acpi/acpica\
+       ../../common\
+       ../../os_specific/service_layers\
+       .
+CFLAGS += -DACPI_APPLICATION -DACPI_SINGLE_THREAD -DACPI_DEBUGGER\
+       -I.\
+       -I../../../../../drivers/acpi/acpica\
+       -I../../../../../include
+LDFLAGS += -lpthread
+TOOL_OBJS = \
+       acpidbg.o
+
+include ../../Makefile.rules
diff --git a/tools/power/acpi/tools/acpidbg/acpidbg.c b/tools/power/acpi/tools/acpidbg/acpidbg.c
new file mode 100644 (file)
index 0000000..d070fcc
--- /dev/null
@@ -0,0 +1,438 @@
+/*
+ * ACPI AML interfacing userspace utility
+ *
+ * Copyright (C) 2015, Intel Corporation
+ * Authors: Lv Zheng <lv.zheng@intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <acpi/acpi.h>
+
+/* Headers not included by include/acpi/platform/aclinux.h */
+#include <stdbool.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <linux/circ_buf.h>
+
+#define ACPI_AML_FILE          "/sys/kernel/debug/acpi/acpidbg"
+#define ACPI_AML_SEC_TICK      1
+#define ACPI_AML_USEC_PEEK     200
+#define ACPI_AML_BUF_SIZE      4096
+
+#define ACPI_AML_BATCH_WRITE_CMD       0x00 /* Write command to kernel */
+#define ACPI_AML_BATCH_READ_LOG                0x01 /* Read log from kernel */
+#define ACPI_AML_BATCH_WRITE_LOG       0x02 /* Write log to console */
+
+#define ACPI_AML_LOG_START             0x00
+#define ACPI_AML_PROMPT_START          0x01
+#define ACPI_AML_PROMPT_STOP           0x02
+#define ACPI_AML_LOG_STOP              0x03
+#define ACPI_AML_PROMPT_ROLL           0x04
+
+#define ACPI_AML_INTERACTIVE   0x00
+#define ACPI_AML_BATCH         0x01
+
+#define circ_count(circ) \
+       (CIRC_CNT((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+#define circ_count_to_end(circ) \
+       (CIRC_CNT_TO_END((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+#define circ_space(circ) \
+       (CIRC_SPACE((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+#define circ_space_to_end(circ) \
+       (CIRC_SPACE_TO_END((circ)->head, (circ)->tail, ACPI_AML_BUF_SIZE))
+
+#define acpi_aml_cmd_count()   circ_count(&acpi_aml_cmd_crc)
+#define acpi_aml_log_count()   circ_count(&acpi_aml_log_crc)
+#define acpi_aml_cmd_space()   circ_space(&acpi_aml_cmd_crc)
+#define acpi_aml_log_space()   circ_space(&acpi_aml_log_crc)
+
+#define ACPI_AML_DO(_fd, _op, _buf, _ret)                              \
+       do {                                                            \
+               _ret = acpi_aml_##_op(_fd, &acpi_aml_##_buf##_crc);     \
+               if (_ret == 0) {                                        \
+                       fprintf(stderr,                                 \
+                               "%s %s pipe closed.\n", #_buf, #_op);   \
+                       return;                                         \
+               }                                                       \
+       } while (0)
+#define ACPI_AML_BATCH_DO(_fd, _op, _buf, _ret)                                \
+       do {                                                            \
+               _ret = acpi_aml_##_op##_batch_##_buf(_fd,               \
+                        &acpi_aml_##_buf##_crc);                       \
+               if (_ret == 0)                                          \
+                       return;                                         \
+       } while (0)
+
+
+static char acpi_aml_cmd_buf[ACPI_AML_BUF_SIZE];
+static char acpi_aml_log_buf[ACPI_AML_BUF_SIZE];
+static struct circ_buf acpi_aml_cmd_crc = {
+       .buf = acpi_aml_cmd_buf,
+       .head = 0,
+       .tail = 0,
+};
+static struct circ_buf acpi_aml_log_crc = {
+       .buf = acpi_aml_log_buf,
+       .head = 0,
+       .tail = 0,
+};
+static const char *acpi_aml_file_path = ACPI_AML_FILE;
+static unsigned long acpi_aml_mode = ACPI_AML_INTERACTIVE;
+static bool acpi_aml_exit;
+
+static bool acpi_aml_batch_drain;
+static unsigned long acpi_aml_batch_state;
+static char acpi_aml_batch_prompt;
+static char acpi_aml_batch_roll;
+static unsigned long acpi_aml_log_state;
+static char *acpi_aml_batch_cmd = NULL;
+static char *acpi_aml_batch_pos = NULL;
+
+static int acpi_aml_set_fl(int fd, int flags)
+{
+       int ret;
+
+       ret = fcntl(fd, F_GETFL, 0);
+       if (ret < 0) {
+               perror("fcntl(F_GETFL)");
+               return ret;
+       }
+       flags |= ret;
+       ret = fcntl(fd, F_SETFL, flags);
+       if (ret < 0) {
+               perror("fcntl(F_SETFL)");
+               return ret;
+       }
+       return ret;
+}
+
+static int acpi_aml_set_fd(int fd, int maxfd, fd_set *set)
+{
+       if (fd > maxfd)
+               maxfd = fd;
+       FD_SET(fd, set);
+       return maxfd;
+}
+
+static int acpi_aml_read(int fd, struct circ_buf *crc)
+{
+       char *p;
+       int len;
+
+       p = &crc->buf[crc->head];
+       len = circ_space_to_end(crc);
+       len = read(fd, p, len);
+       if (len < 0)
+               perror("read");
+       else if (len > 0)
+               crc->head = (crc->head + len) & (ACPI_AML_BUF_SIZE - 1);
+       return len;
+}
+
+static int acpi_aml_read_batch_cmd(int unused, struct circ_buf *crc)
+{
+       char *p;
+       int len;
+       int remained = strlen(acpi_aml_batch_pos);
+
+       p = &crc->buf[crc->head];
+       len = circ_space_to_end(crc);
+       if (len > remained) {
+               memcpy(p, acpi_aml_batch_pos, remained);
+               acpi_aml_batch_pos += remained;
+               len = remained;
+       } else {
+               memcpy(p, acpi_aml_batch_pos, len);
+               acpi_aml_batch_pos += len;
+       }
+       if (len > 0)
+               crc->head = (crc->head + len) & (ACPI_AML_BUF_SIZE - 1);
+       return len;
+}
+
+static int acpi_aml_read_batch_log(int fd, struct circ_buf *crc)
+{
+       char *p;
+       int len;
+       int ret = 0;
+
+       p = &crc->buf[crc->head];
+       len = circ_space_to_end(crc);
+       while (ret < len && acpi_aml_log_state != ACPI_AML_LOG_STOP) {
+               if (acpi_aml_log_state == ACPI_AML_PROMPT_ROLL) {
+                       *p = acpi_aml_batch_roll;
+                       len = 1;
+                       crc->head = (crc->head + 1) & (ACPI_AML_BUF_SIZE - 1);
+                       ret += 1;
+                       acpi_aml_log_state = ACPI_AML_LOG_START;
+               } else {
+                       len = read(fd, p, 1);
+                       if (len <= 0) {
+                               if (len < 0)
+                                       perror("read");
+                               ret = len;
+                               break;
+                       }
+               }
+               switch (acpi_aml_log_state) {
+               case ACPI_AML_LOG_START:
+                       if (*p == '\n')
+                               acpi_aml_log_state = ACPI_AML_PROMPT_START;
+                       crc->head = (crc->head + 1) & (ACPI_AML_BUF_SIZE - 1);
+                       ret += 1;
+                       break;
+               case ACPI_AML_PROMPT_START:
+                       if (*p == ACPI_DEBUGGER_COMMAND_PROMPT ||
+                           *p == ACPI_DEBUGGER_EXECUTE_PROMPT) {
+                               acpi_aml_batch_prompt = *p;
+                               acpi_aml_log_state = ACPI_AML_PROMPT_STOP;
+                       } else {
+                               if (*p != '\n')
+                                       acpi_aml_log_state = ACPI_AML_LOG_START;
+                               crc->head = (crc->head + 1) & (ACPI_AML_BUF_SIZE - 1);
+                               ret += 1;
+                       }
+                       break;
+               case ACPI_AML_PROMPT_STOP:
+                       if (*p == ' ') {
+                               acpi_aml_log_state = ACPI_AML_LOG_STOP;
+                               acpi_aml_exit = true;
+                       } else {
+                               /* Roll back */
+                               acpi_aml_log_state = ACPI_AML_PROMPT_ROLL;
+                               acpi_aml_batch_roll = *p;
+                               *p = acpi_aml_batch_prompt;
+                               crc->head = (crc->head + 1) & (ACPI_AML_BUF_SIZE - 1);
+                               ret += 1;
+                       }
+                       break;
+               default:
+                       assert(0);
+                       break;
+               }
+       }
+       return ret;
+}
+
+static int acpi_aml_write(int fd, struct circ_buf *crc)
+{
+       char *p;
+       int len;
+
+       p = &crc->buf[crc->tail];
+       len = circ_count_to_end(crc);
+       len = write(fd, p, len);
+       if (len < 0)
+               perror("write");
+       else if (len > 0)
+               crc->tail = (crc->tail + len) & (ACPI_AML_BUF_SIZE - 1);
+       return len;
+}
+
+static int acpi_aml_write_batch_log(int fd, struct circ_buf *crc)
+{
+       char *p;
+       int len;
+
+       p = &crc->buf[crc->tail];
+       len = circ_count_to_end(crc);
+       if (!acpi_aml_batch_drain) {
+               len = write(fd, p, len);
+               if (len < 0)
+                       perror("write");
+       }
+       if (len > 0)
+               crc->tail = (crc->tail + len) & (ACPI_AML_BUF_SIZE - 1);
+       return len;
+}
+
+static int acpi_aml_write_batch_cmd(int fd, struct circ_buf *crc)
+{
+       int len;
+
+       len = acpi_aml_write(fd, crc);
+       if (circ_count_to_end(crc) == 0)
+               acpi_aml_batch_state = ACPI_AML_BATCH_READ_LOG;
+       return len;
+}
+
+static void acpi_aml_loop(int fd)
+{
+       fd_set rfds;
+       fd_set wfds;
+       struct timeval tv;
+       int ret;
+       int maxfd = 0;
+
+       if (acpi_aml_mode == ACPI_AML_BATCH) {
+               acpi_aml_log_state = ACPI_AML_LOG_START;
+               acpi_aml_batch_pos = acpi_aml_batch_cmd;
+               if (acpi_aml_batch_drain)
+                       acpi_aml_batch_state = ACPI_AML_BATCH_READ_LOG;
+               else
+                       acpi_aml_batch_state = ACPI_AML_BATCH_WRITE_CMD;
+       }
+       acpi_aml_exit = false;
+       while (!acpi_aml_exit) {
+               tv.tv_sec = ACPI_AML_SEC_TICK;
+               tv.tv_usec = 0;
+               FD_ZERO(&rfds);
+               FD_ZERO(&wfds);
+
+               if (acpi_aml_cmd_space()) {
+                       if (acpi_aml_mode == ACPI_AML_INTERACTIVE)
+                               maxfd = acpi_aml_set_fd(STDIN_FILENO, maxfd, &rfds);
+                       else if (strlen(acpi_aml_batch_pos) &&
+                                acpi_aml_batch_state == ACPI_AML_BATCH_WRITE_CMD)
+                               ACPI_AML_BATCH_DO(STDIN_FILENO, read, cmd, ret);
+               }
+               if (acpi_aml_cmd_count() &&
+                   (acpi_aml_mode == ACPI_AML_INTERACTIVE ||
+                    acpi_aml_batch_state == ACPI_AML_BATCH_WRITE_CMD))
+                       maxfd = acpi_aml_set_fd(fd, maxfd, &wfds);
+               if (acpi_aml_log_space() &&
+                   (acpi_aml_mode == ACPI_AML_INTERACTIVE ||
+                    acpi_aml_batch_state == ACPI_AML_BATCH_READ_LOG))
+                       maxfd = acpi_aml_set_fd(fd, maxfd, &rfds);
+               if (acpi_aml_log_count())
+                       maxfd = acpi_aml_set_fd(STDOUT_FILENO, maxfd, &wfds);
+
+               ret = select(maxfd+1, &rfds, &wfds, NULL, &tv);
+               if (ret < 0) {
+                       perror("select");
+                       break;
+               }
+               if (ret > 0) {
+                       if (FD_ISSET(STDIN_FILENO, &rfds))
+                               ACPI_AML_DO(STDIN_FILENO, read, cmd, ret);
+                       if (FD_ISSET(fd, &wfds)) {
+                               if (acpi_aml_mode == ACPI_AML_BATCH)
+                                       ACPI_AML_BATCH_DO(fd, write, cmd, ret);
+                               else
+                                       ACPI_AML_DO(fd, write, cmd, ret);
+                       }
+                       if (FD_ISSET(fd, &rfds)) {
+                               if (acpi_aml_mode == ACPI_AML_BATCH)
+                                       ACPI_AML_BATCH_DO(fd, read, log, ret);
+                               else
+                                       ACPI_AML_DO(fd, read, log, ret);
+                       }
+                       if (FD_ISSET(STDOUT_FILENO, &wfds)) {
+                               if (acpi_aml_mode == ACPI_AML_BATCH)
+                                       ACPI_AML_BATCH_DO(STDOUT_FILENO, write, log, ret);
+                               else
+                                       ACPI_AML_DO(STDOUT_FILENO, write, log, ret);
+                       }
+               }
+       }
+}
+
+static bool acpi_aml_readable(int fd)
+{
+       fd_set rfds;
+       struct timeval tv;
+       int ret;
+       int maxfd = 0;
+
+       tv.tv_sec = 0;
+       tv.tv_usec = ACPI_AML_USEC_PEEK;
+       FD_ZERO(&rfds);
+       maxfd = acpi_aml_set_fd(fd, maxfd, &rfds);
+       ret = select(maxfd+1, &rfds, NULL, NULL, &tv);
+       if (ret < 0)
+               perror("select");
+       if (ret > 0 && FD_ISSET(fd, &rfds))
+               return true;
+       return false;
+}
+
+/*
+ * This is a userspace IO flush implementation, replying on the prompt
+ * characters and can be turned into a flush() call after kernel implements
+ * .flush() filesystem operation.
+ */
+static void acpi_aml_flush(int fd)
+{
+       while (acpi_aml_readable(fd)) {
+               acpi_aml_batch_drain = true;
+               acpi_aml_loop(fd);
+               acpi_aml_batch_drain = false;
+       }
+}
+
+void usage(FILE *file, char *progname)
+{
+       fprintf(file, "usage: %s [-b cmd] [-f file] [-h]\n", progname);
+       fprintf(file, "\nOptions:\n");
+       fprintf(file, "  -b     Specify command to be executed in batch mode\n");
+       fprintf(file, "  -f     Specify interface file other than");
+       fprintf(file, "         /sys/kernel/debug/acpi/acpidbg\n");
+       fprintf(file, "  -h     Print this help message\n");
+}
+
+int main(int argc, char **argv)
+{
+       int fd = 0;
+       int ch;
+       int len;
+       int ret = EXIT_SUCCESS;
+
+       while ((ch = getopt(argc, argv, "b:f:h")) != -1) {
+               switch (ch) {
+               case 'b':
+                       if (acpi_aml_batch_cmd) {
+                               fprintf(stderr, "Already specify %s\n",
+                                       acpi_aml_batch_cmd);
+                               ret = EXIT_FAILURE;
+                               goto exit;
+                       }
+                       len = strlen(optarg);
+                       acpi_aml_batch_cmd = calloc(len + 2, 1);
+                       if (!acpi_aml_batch_cmd) {
+                               perror("calloc");
+                               ret = EXIT_FAILURE;
+                               goto exit;
+                       }
+                       memcpy(acpi_aml_batch_cmd, optarg, len);
+                       acpi_aml_batch_cmd[len] = '\n';
+                       acpi_aml_mode = ACPI_AML_BATCH;
+                       break;
+               case 'f':
+                       acpi_aml_file_path = optarg;
+                       break;
+               case 'h':
+                       usage(stdout, argv[0]);
+                       goto exit;
+                       break;
+               case '?':
+               default:
+                       usage(stderr, argv[0]);
+                       ret = EXIT_FAILURE;
+                       goto exit;
+                       break;
+               }
+       }
+
+       fd = open(acpi_aml_file_path, O_RDWR | O_NONBLOCK);
+       if (fd < 0) {
+               perror("open");
+               ret = EXIT_FAILURE;
+               goto exit;
+       }
+       acpi_aml_set_fl(STDIN_FILENO, O_NONBLOCK);
+       acpi_aml_set_fl(STDOUT_FILENO, O_NONBLOCK);
+
+       if (acpi_aml_mode == ACPI_AML_BATCH)
+               acpi_aml_flush(fd);
+       acpi_aml_loop(fd);
+
+exit:
+       if (fd < 0)
+               close(fd);
+       if (acpi_aml_batch_cmd)
+               free(acpi_aml_batch_cmd);
+       return ret;
+}
index a1c62de..bbdf9e8 100644 (file)
 
 static int ap_is_existing_file(char *pathname);
 
+/******************************************************************************
+ *
+ * FUNCTION:    ap_is_existing_file
+ *
+ * PARAMETERS:  pathname            - Output filename
+ *
+ * RETURN:      0 on success
+ *
+ * DESCRIPTION: Query for file overwrite if it already exists.
+ *
+ ******************************************************************************/
+
 static int ap_is_existing_file(char *pathname)
 {
 #ifndef _GNU_EFI
@@ -136,6 +148,7 @@ int ap_write_to_binary_file(struct acpi_table_header *table, u32 instance)
        } else {
                ACPI_MOVE_NAME(filename, table->signature);
        }
+
        filename[0] = (char)tolower((int)filename[0]);
        filename[1] = (char)tolower((int)filename[1]);
        filename[2] = (char)tolower((int)filename[2]);
index 65461f8..7a2f449 100644 (file)
@@ -1114,7 +1114,7 @@ bool kvm_vgic_map_is_active(struct kvm_vcpu *vcpu, struct irq_phys_map *map)
                        return true;
        }
 
-       return dist_active_irq(vcpu);
+       return vgic_irq_is_active(vcpu, map->virt_irq);
 }
 
 /*