1. 22 3月, 2017 1 次提交
    • R
      iommu: Disambiguate MSI region types · 9d3a4de4
      Robin Murphy 提交于
      The introduction of reserved regions has left a couple of rough edges
      which we could do with sorting out sooner rather than later. Since we
      are not yet addressing the potential dynamic aspect of software-managed
      reservations and presenting them at arbitrary fixed addresses, it is
      incongruous that we end up displaying hardware vs. software-managed MSI
      regions to userspace differently, especially since ARM-based systems may
      actually require one or the other, or even potentially both at once,
      (which iommu-dma currently has no hope of dealing with at all). Let's
      resolve the former user-visible inconsistency ASAP before the ABI has
      been baked into a kernel release, in a way that also lays the groundwork
      for the latter shortcoming to be addressed by follow-up patches.
      
      For clarity, rename the software-managed type to IOMMU_RESV_SW_MSI, use
      IOMMU_RESV_MSI to describe the hardware type, and document everything a
      little bit. Since the x86 MSI remapping hardware falls squarely under
      this meaning of IOMMU_RESV_MSI, apply that type to their regions as well,
      so that we tell the same story to userspace across all platforms.
      
      Secondly, as the various region types require quite different handling,
      and it really makes little sense to ever try combining them, convert the
      bitfield-esque #defines to a plain enum in the process before anyone
      gets the wrong impression.
      
      Fixes: d30ddcaa ("iommu: Add a new type field in iommu_resv_region")
      Reviewed-by: NEric Auger <eric.auger@redhat.com>
      CC: Alex Williamson <alex.williamson@redhat.com>
      CC: David Woodhouse <dwmw2@infradead.org>
      CC: kvm@vger.kernel.org
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NJoerg Roedel <jroedel@suse.de>
      9d3a4de4
  2. 10 2月, 2017 2 次提交
  3. 27 1月, 2017 2 次提交
    • T
      iommu/arm-smmu: Fix for ThunderX erratum #27704 · 3677a649
      Tomasz Nowicki 提交于
      The goal of erratum #27704 workaround was to make sure that ASIDs and VMIDs
      are unique across all SMMU instances on affected Cavium systems.
      
      Currently, the workaround code partitions ASIDs and VMIDs by increasing
      global cavium_smmu_context_count which in turn becomes the base ASID and VMID
      value for the given SMMU instance upon the context bank initialization.
      
      For systems with multiple SMMU instances this approach implies the risk
      of crossing 8-bit ASID, like for 1-socket CN88xx capable of 4 SMMUv2,
      128 context banks each:
      SMMU_0 (0-127 ASID RANGE)
      SMMU_1 (127-255 ASID RANGE)
      SMMU_2 (256-383 ASID RANGE) <--- crossing 8-bit ASID
      SMMU_3 (384-511 ASID RANGE) <--- crossing 8-bit ASID
      
      Since now we use 8-bit ASID (SMMU_CBn_TCR2.AS = 0) we effectively misconfigure
      ASID[15:8] bits of SMMU_CBn_TTBRm register for SMMU_2/3. Moreover, we still
      assume non-zero ASID[15:8] bits upon context invalidation. In the end,
      except SMMU_0/1 devices all other devices under other SMMUs will fail on guest
      power off/on. Since we try to invalidate TLB with 16-bit ASID but we actually
      have 8-bit zero padded 16-bit entry.
      
      This patch adds 16-bit ASID support for stage-1 AArch64 contexts so that
      we use ASIDs consistently for all SMMU instances.
      Signed-off-by: NTomasz Nowicki <tn@semihalf.com>
      Reviewed-by: NRobin Murphy <robin.murphy@arm.com>
      Reviewed-by: NTirumalesh Chalamarla  <Tirumalesh.Chalamarla@cavium.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      3677a649
    • A
      iommu/arm-smmu: Support for Extended Stream ID (16 bit) · dc0eaa4e
      Aleksey Makarov 提交于
      It is the time we have the real 16-bit Stream ID user, which is the
      ThunderX. Its IO topology uses 1:1 map for Requester ID to Stream ID
      translation for each root complex which allows to get full 16-bit
      Stream ID.  Firmware assigns bus IDs that are greater than 128 (0x80)
      to some buses under PEM (external PCIe interface).  Eventually SMMU
      drops devices on that buses because their Stream ID is out of range:
      
        pci 0006:90:00.0: stream ID 0x9000 out of range for SMMU (0x7fff)
      
      To fix above issue enable the Extended Stream ID optional feature
      when available.
      Reviewed-by: NTomasz Nowicki <tomasz.nowicki@caviumnetworks.com>
      Signed-off-by: NAleksey Makarov <aleksey.makarov@linaro.org>
      Tested-by: NTomasz Nowicki <tomasz.nowicki@caviumnetworks.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      dc0eaa4e
  4. 23 1月, 2017 2 次提交
  5. 19 1月, 2017 1 次提交
  6. 29 11月, 2016 5 次提交
  7. 15 11月, 2016 1 次提交
  8. 08 11月, 2016 3 次提交
  9. 16 9月, 2016 12 次提交
    • R
      iommu/arm-smmu: Set domain geometry · 455eb7d3
      Robin Murphy 提交于
      For non-aperture-based IOMMUs, the domain geometry seems to have become
      the de-facto way of indicating the input address space size. That is
      quite a useful thing from the users' perspective, so let's do the same.
      Reviewed-by: NEric Auger <eric.auger@redhat.com>
      Tested-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      455eb7d3
    • R
      iommu/arm-smmu: Wire up generic configuration support · 021bb842
      Robin Murphy 提交于
      With everything else now in place, fill in an of_xlate callback and the
      appropriate registration to plumb into the generic configuration
      machinery, and watch everything just work.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      021bb842
    • R
      iommu/arm-smmu: Convert to iommu_fwspec · adfec2e7
      Robin Murphy 提交于
      In the final step of preparation for full generic configuration support,
      swap our fixed-size master_cfg for the generic iommu_fwspec. For the
      legacy DT bindings, the driver simply gets to act as its own 'firmware'.
      Farewell, arbitrary MAX_MASTER_STREAMIDS!
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      adfec2e7
    • R
      iommu/arm-smmu: Intelligent SMR allocation · 588888a7
      Robin Murphy 提交于
      Stream Match Registers are one of the more awkward parts of the SMMUv2
      architecture; there are typically never enough to assign one to each
      stream ID in the system, and configuring them such that a single ID
      matches multiple entries is catastrophically bad - at best, every
      transaction raises a global fault; at worst, they go *somewhere*.
      
      To address the former issue, we can mask ID bits such that a single
      register may be used to match multiple IDs belonging to the same device
      or group, but doing so also heightens the risk of the latter problem
      (which can be nasty to debug).
      
      Tackle both problems at once by replacing the simple bitmap allocator
      with something much cleverer. Now that we have convenient in-memory
      representations of the stream mapping table, it becomes straightforward
      to properly validate new SMR entries against the current state, opening
      the door to arbitrary masking and SMR sharing.
      
      Another feature which falls out of this is that with IDs shared by
      separate devices being automatically accounted for, simply associating a
      group pointer with the S2CR offers appropriate group allocation almost
      for free, so hook that up in the process.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      588888a7
    • R
      iommu/arm-smmu: Add a stream map entry iterator · d3097e39
      Robin Murphy 提交于
      We iterate over the SMEs associated with a master config quite a lot in
      various places, and are about to do so even more. Let's wrap the idiom
      in a handy iterator macro before the repetition gets out of hand.
      Tested-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      d3097e39
    • R
      iommu/arm-smmu: Streamline SMMU data lookups · d6fc5d97
      Robin Murphy 提交于
      Simplify things somewhat by stashing our arm_smmu_device instance in
      drvdata, so that it's readily available to our driver model callbacks.
      Then we can excise the private list entirely, since the driver core
      already has a perfectly good list of SMMU devices we can use in the one
      instance we actually need to. Finally, make a further modest code saving
      with the relatively new of_device_get_match_data() helper.
      Tested-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      d6fc5d97
    • R
      iommu/arm-smmu: Refactor mmu-masters handling · f80cd885
      Robin Murphy 提交于
      To be able to support the generic bindings and handle of_xlate() calls,
      we need to be able to associate SMMUs and stream IDs directly with
      devices *before* allocating IOMMU groups. Furthermore, to support real
      default domains with multi-device groups we also have to handle domain
      attach on a per-device basis, as the "whole group at a time" assumption
      fails to properly handle subsequent devices added to a group after the
      first has already triggered default domain creation and attachment.
      
      To that end, use the now-vacant dev->archdata.iommu field for easy
      config and SMMU instance lookup, and unify config management by chopping
      down the platform-device-specific tree and probing the "mmu-masters"
      property on-demand instead. This may add a bit of one-off overhead to
      initially adding a new device, but we're about to deprecate that binding
      in favour of the inherently-more-efficient generic ones anyway.
      
      For the sake of simplicity, this patch does temporarily regress the case
      of aliasing PCI devices by losing the duplicate stream ID detection that
      the previous per-group config had. Stay tuned, because we'll be back to
      fix that in a better and more general way momentarily...
      Tested-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      f80cd885
    • R
      iommu/arm-smmu: Keep track of S2CR state · 8e8b203e
      Robin Murphy 提交于
      Making S2CRs first-class citizens within the driver with a high-level
      representation of their state offers a neat solution to a few problems:
      
      Firstly, the information about which context a device's stream IDs are
      associated with is already present by necessity in the S2CR. With that
      state easily accessible we can refer directly to it and obviate the need
      to track an IOMMU domain in each device's archdata (its earlier purpose
      of enforcing correct attachment of multi-device groups now being handled
      by the IOMMU core itself).
      
      Secondly, the core API now deprecates explicit domain detach and expects
      domain attach to move devices smoothly from one domain to another; for
      SMMUv2, this notion maps directly to simply rewriting the S2CRs assigned
      to the device. By giving the driver a suitable abstraction of those
      S2CRs to work with, we can massively reduce the overhead of the current
      heavy-handed "detach, free resources, reallocate resources, attach"
      approach.
      
      Thirdly, making the software state hardware-shaped and attached to the
      SMMU instance once again makes suspend/resume of this register group
      that much simpler to implement in future.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      8e8b203e
    • R
      iommu/arm-smmu: Consolidate stream map entry state · 1f3d5ca4
      Robin Murphy 提交于
      In order to consider SMR masking, we really want to be able to validate
      ID/mask pairs against existing SMR contents to prevent stream match
      conflicts, which at best would cause transactions to fault unexpectedly,
      and at worst lead to silent unpredictable behaviour. With our SMMU
      instance data holding only an allocator bitmap, and the SMR values
      themselves scattered across master configs hanging off devices which we
      may have no way of finding, there's essentially no way short of digging
      everything back out of the hardware. Similarly, the thought of power
      management ops to support suspend/resume faces the exact same problem.
      
      By massaging the software state into a closer shape to the underlying
      hardware, everything comes together quite nicely; the allocator and the
      high-level view of the data become a single centralised state which we
      can easily keep track of, and to which any updates can be validated in
      full before being synchronised to the hardware itself.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      1f3d5ca4
    • R
      iommu/arm-smmu: Handle stream IDs more dynamically · 21174240
      Robin Murphy 提交于
      Rather than assuming fixed worst-case values for stream IDs and SMR
      masks, keep track of whatever implemented bits the hardware actually
      reports. This also obviates the slightly questionable validation of SMR
      fields in isolation - rather than aborting the whole SMMU probe for a
      hardware configuration which is still architecturally valid, we can
      simply refuse masters later if they try to claim an unrepresentable ID
      or mask (which almost certainly implies a DT error anyway).
      Acked-by: NWill Deacon <will.deacon@arm.com>
      Tested-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      21174240
    • R
      iommu/arm-smmu: Support v7s context format · 6070529b
      Robin Murphy 提交于
      Fill in the last bits of machinery required to drive a stage 1 context
      bank in v7 short descriptor format. By default we'll prefer to use it
      only when the CPUs are also using the same format, such that we're
      guaranteed that everything will be strictly 32-bit.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      6070529b
    • P
      iommu/arm-smmu: Drop devm_free_irq when driver detach · e2d42311
      Peng Fan 提交于
      There is no need to call devm_free_irq when driver detach.
      devres_release_all which is called after 'drv->remove' will
      release all managed resources.
      Signed-off-by: NPeng Fan <van.freenix@gmail.com>
      Reviewed-by: NRobin Murphy <robin.murphy@arm.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      e2d42311
  10. 19 8月, 2016 1 次提交
    • W
      iommu/arm-smmu: Disable stalling faults for all endpoints · 3714ce1d
      Will Deacon 提交于
      Enabling stalling faults can result in hardware deadlock on poorly
      designed systems, particularly those with a PCI root complex upstream of
      the SMMU.
      
      Although it's not really Linux's job to save hardware integrators from
      their own misfortune, it *is* our job to stop userspace (e.g. VFIO
      clients) from hosing the system for everybody else, even if they might
      already be required to have elevated privileges.
      
      Given that the fault handling code currently executes entirely in IRQ
      context, there is nothing that can sensibly be done to recover from
      things like page faults anyway, so let's rip this code out for now and
      avoid the potential for deadlock.
      
      Cc: <stable@vger.kernel.org>
      Fixes: 48ec83bc ("iommu/arm-smmu: Add initial driver support for ARM SMMUv3 devices")
      Reported-by: NMatt Evans <matt.evans@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      3714ce1d
  11. 07 7月, 2016 1 次提交
  12. 01 7月, 2016 1 次提交
    • W
      iommu/arm-smmu: request pcie devices to enable ACS · 112c898b
      Wei Chen 提交于
      The PCIe ACS capability will affect the layout of iommu groups.
      Generally speaking, if the path from root port to the PCIe device
      is ACS enabled, the iommu will create a single iommu group for this
      PCIe device. If all PCIe devices on the path are ACS enabled then
      Linux can determine this path is ACS enabled.
      
      Linux use two PCIe configuration registers to determine the ACS
      status of PCIe devices:
      ACS Capability Register and ACS Control Register.
      
      The first register is used to check the implementation of ACS function
      of a PCIe device, the second register is used to check the enable status
      of ACS function. If one PCIe device has implemented and enabled the ACS
      function then Linux will determine this PCIe device enabled ACS.
      
      From the Chapter:6.12 of PCI Express Base Specification Revision 3.1a,
      we can find that when a PCIe device implements ACS function, the enable
      status is set to disabled by default and can be enabled by ACS-aware
      software.
      
      ACS will affect the iommu groups topology, so, the iommu driver is
      ACS-aware software. This patch adds a call to pci_request_acs() to the
      arm-smmu driver to enable the ACS function in PCIe devices that support
      it, when they get probed.
      Reviewed-by: NRobin Murphy <robin.murphy@arm.com>
      Reviewed-by: NEric Auger <eric.auger@redhat.com>
      Signed-off-by: NWei Chen <Wei.Chen@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      112c898b
  13. 28 5月, 2016 1 次提交
    • A
      remove lots of IS_ERR_VALUE abuses · 287980e4
      Arnd Bergmann 提交于
      Most users of IS_ERR_VALUE() in the kernel are wrong, as they
      pass an 'int' into a function that takes an 'unsigned long'
      argument. This happens to work because the type is sign-extended
      on 64-bit architectures before it gets converted into an
      unsigned type.
      
      However, anything that passes an 'unsigned short' or 'unsigned int'
      argument into IS_ERR_VALUE() is guaranteed to be broken, as are
      8-bit integers and types that are wider than 'unsigned long'.
      
      Andrzej Hajda has already fixed a lot of the worst abusers that
      were causing actual bugs, but it would be nice to prevent any
      users that are not passing 'unsigned long' arguments.
      
      This patch changes all users of IS_ERR_VALUE() that I could find
      on 32-bit ARM randconfig builds and x86 allmodconfig. For the
      moment, this doesn't change the definition of IS_ERR_VALUE()
      because there are probably still architecture specific users
      elsewhere.
      
      Almost all the warnings I got are for files that are better off
      using 'if (err)' or 'if (err < 0)'.
      The only legitimate user I could find that we get a warning for
      is the (32-bit only) freescale fman driver, so I did not remove
      the IS_ERR_VALUE() there but changed the type to 'unsigned long'.
      For 9pfs, I just worked around one user whose calling conventions
      are so obscure that I did not dare change the behavior.
      
      I was using this definition for testing:
      
       #define IS_ERR_VALUE(x) ((unsigned long*)NULL == (typeof (x)*)NULL && \
             unlikely((unsigned long long)(x) >= (unsigned long long)(typeof(x))-MAX_ERRNO))
      
      which ends up making all 16-bit or wider types work correctly with
      the most plausible interpretation of what IS_ERR_VALUE() was supposed
      to return according to its users, but also causes a compile-time
      warning for any users that do not pass an 'unsigned long' argument.
      
      I suggested this approach earlier this year, but back then we ended
      up deciding to just fix the users that are obviously broken. After
      the initial warning that caused me to get involved in the discussion
      (fs/gfs2/dir.c) showed up again in the mainline kernel, Linus
      asked me to send the whole thing again.
      
      [ Updated the 9p parts as per Al Viro  - Linus ]
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Cc: Andrzej Hajda <a.hajda@samsung.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Link: https://lkml.org/lkml/2016/1/7/363
      Link: https://lkml.org/lkml/2016/5/27/486
      Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> # For nvmem part
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      287980e4
  14. 10 5月, 2016 1 次提交
  15. 04 5月, 2016 6 次提交
    • P
      iommu/arm-smmu: Clear cache lock bit of ACR · 3ca3712a
      Peng Fan 提交于
      According MMU-500r2 TRM, section 3.7.1 Auxiliary Control registers,
      You can modify ACTLR only when the ACR.CACHE_LOCK bit is 0.
      
      So before clearing ARM_MMU500_ACTLR_CPRE of each context bank,
      need clear CACHE_LOCK bit of ACR register first.
      
      Since CACHE_LOCK bit is only present in MMU-500r2 onwards,
      need to check the major number of IDR7.
      Reviewed-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NPeng Fan <van.freenix@gmail.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      3ca3712a
    • R
      iommu/arm-smmu: Support SMMUv1 64KB supplement · b7862e35
      Robin Murphy 提交于
      The 64KB Translation Granule Supplement to the SMMUv1 architecture
      allows an SMMUv1 implementation to support 64KB pages for stage 2
      translations, using a constrained VMSAv8 descriptor format limited
      to 40-bit addresses. Now that we can freely mix and match context
      formats, we can actually handle having 4KB pages via an AArch32
      context but 64KB pages via an AArch64 context, so plumb it in.
      
      It is assumed that any implementations will have hardware capabilities
      matching the format constraints, thus obviating the need for excessive
      sanity-checking; this is the case for MMU-401, the only ARM Ltd.
      implementation.
      
      CC: Eric Auger <eric.auger@linaro.org>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      b7862e35
    • R
      iommu/arm-smmu: Decouple context format from kernel config · 7602b871
      Robin Murphy 提交于
      The way the driver currently forces an AArch32 or AArch64 context format
      based on the kernel config and SMMU architecture version is suboptimal,
      in that it makes it very hard to support oddball mix-and-match cases
      like the SMMUv1 64KB supplement, or situations where the reduced table
      depth of an AArch32 short descriptor context may be desirable under an
      AArch64 kernel. It also only happens to work on current implementations
      which do support all the relevant formats.
      
      Introduce an explicit notion of context format, so we can manage that
      independently and get rid of the inflexible #ifdeffery.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      7602b871
    • R
      iommu/arm-smmu: Tidy up 64-bit/atomic I/O accesses · f9a05f05
      Robin Murphy 提交于
      With {read,write}q_relaxed now able to fall back to the common
      nonatomic-hi-lo helper, make use of that so that we don't have to
      open-code our own. In the process, also convert the other remaining
      split accesses, and repurpose the custom accessor to smooth out the
      couple of troublesome instances where we really want to avoid
      nonatomic writes (and a 64-bit access is unnecessary in the 32-bit
      context formats we would use on a 32-bit CPU).
      
      This paves the way for getting rid of some of the assumptions currently
      baked into the driver which make it really awkward to use 32-bit context
      formats with SMMUv2 under a 64-bit kernel.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      f9a05f05
    • R
      iommu/arm-smmu: Work around MMU-500 prefetch errata · f0cfffc4
      Robin Murphy 提交于
      MMU-500 erratum #841119 is tickled by a particular set of circumstances
      interacting with the next-page prefetcher. Since said prefetcher is
      quite dumb and actually detrimental to performance in some cases (by
      causing unwanted TLB evictions for non-sequential access patterns), we
      lose very little by turning it off, and what we gain is a guarantee that
      the erratum is never hit.
      
      As a bonus, the same workaround will also prevent erratum #826419 once
      v7 short descriptor support is implemented.
      
      CC: Catalin Marinas <catalin.marinas@arm.com>
      CC: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      f0cfffc4
    • R
      iommu/arm-smmu: Convert ThunderX workaround to new method · e086d912
      Robin Murphy 提交于
      With a framework for implementation-specific funtionality in place, the
      currently-FDT-dependent ThunderX workaround gets to be the first user.
      Acked-by: NTirumalesh Chalamarla <tchalamarla@caviumnetworks.com>
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      e086d912