1. 29 9月, 2012 1 次提交
  2. 25 9月, 2012 1 次提交
    • L
      ARM: mm: implement LoUIS API for cache maintenance ops · 031bd879
      Lorenzo Pieralisi 提交于
      ARM v7 architecture introduced the concept of cache levels and related
      control registers. New processors like A7 and A15 embed an L2 unified cache
      controller that becomes part of the cache level hierarchy. Some operations in
      the kernel like cpu_suspend and __cpu_disable do not require a flush of the
      entire cache hierarchy to DRAM but just the cache levels belonging to the
      Level of Unification Inner Shareable (LoUIS), which in most of ARM v7 systems
      correspond to L1.
      
      The current cache flushing API used in cpu_suspend and __cpu_disable,
      flush_cache_all(), ends up flushing the whole cache hierarchy since for
      v7 it cleans and invalidates all cache levels up to Level of Coherency
      (LoC) which cripples system performance when used in hot paths like hotplug
      and cpuidle.
      
      Therefore a new kernel cache maintenance API must be added to cope with
      latest ARM system requirements.
      
      This patch adds flush_cache_louis() to the ARM kernel cache maintenance API.
      
      This function cleans and invalidates all data cache levels up to the
      Level of Unification Inner Shareable (LoUIS) and invalidates the instruction
      cache for processors that support it (> v7).
      
      This patch also creates an alias of the cache LoUIS function to flush_kern_all
      for all processor versions prior to v7, so that the current cache flushing
      behaviour is unchanged for those processors.
      
      v7 cache maintenance code implements a cache LoUIS function that cleans and
      invalidates the D-cache up to LoUIS and invalidates the I-cache, according
      to the new API.
      Reviewed-by: NSantosh Shilimkar <santosh.shilimkar@ti.com>
      Reviewed-by: NNicolas Pitre <nico@linaro.org>
      Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      Tested-by: NShawn Guo <shawn.guo@linaro.org>
      031bd879
  3. 06 12月, 2011 1 次提交
  4. 21 9月, 2011 2 次提交
  5. 22 7月, 2011 1 次提交
  6. 07 7月, 2011 1 次提交
  7. 28 4月, 2011 1 次提交
  8. 02 4月, 2011 1 次提交
  9. 23 2月, 2011 1 次提交
  10. 22 12月, 2010 1 次提交
  11. 28 10月, 2010 1 次提交
    • M
      ARM: 6466/1: implement flush_icache_all for the rest of the CPUs · c8c90860
      Mika Westerberg 提交于
      Commit 81d11955 ("ARM: 6405/1: Handle __flush_icache_all for
      CONFIG_SMP_ON_UP") added a new function to struct cpu_cache_fns:
      flush_icache_all(). It also implemented this for v6 and v7 but not
      for v5 and backwards. Without the function pointer in place, we
      will be calling wrong cache functions.
      
      For example with ep93xx we get following:
      
          Unable to handle kernel paging request at virtual address ee070f38
          pgd = c0004000
          [ee070f38] *pgd=00000000
          Internal error: Oops: 80000005 [#1] PREEMPT
          last sysfs file:
          Modules linked in:
          CPU: 0    Not tainted  (2.6.36+ #1)
          PC is at 0xee070f38
          LR is at __dma_alloc+0x11c/0x2d0
          pc : [<ee070f38>]    lr : [<c0032c8c>]    psr: 60000013
          sp : c581bde0  ip : 00000000  fp : c0472000
          r10: c0472000  r9 : 000000d0  r8 : 00020000
          r7 : 0001ffff  r6 : 00000000  r5 : c0472400  r4 : c5980000
          r3 : c03ab7e0  r2 : 00000000  r1 : c59a0000  r0 : c5980000
          Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
          Control: c000717f  Table: c0004000  DAC: 00000017
          Process swapper (pid: 1, stack limit = 0xc581a270)
          [<c0032c8c>] (__dma_alloc+0x11c/0x2d0)
          [<c0032e5c>] (dma_alloc_writecombine+0x1c/0x24)
          [<c0204148>] (ep93xx_pcm_preallocate_dma_buffer+0x44/0x60)
          [<c02041c0>] (ep93xx_pcm_new+0x5c/0x88)
          [<c01ff188>] (snd_soc_instantiate_cards+0x8a8/0xbc0)
          [<c01ff59c>] (soc_probe+0xfc/0x134)
          [<c01adafc>] (platform_drv_probe+0x18/0x1c)
          [<c01acca4>] (driver_probe_device+0xb0/0x16c)
          [<c01ac284>] (bus_for_each_drv+0x48/0x84)
          [<c01ace90>] (device_attach+0x50/0x68)
          [<c01ac0f8>] (bus_probe_device+0x24/0x44)
          [<c01aad7c>] (device_add+0x2fc/0x44c)
          [<c01adfa8>] (platform_device_add+0x104/0x15c)
          [<c0015eb8>] (simone_init+0x60/0x94)
          [<c0021410>] (do_one_initcall+0xd0/0x1a4)
      
      __dma_alloc() calls (inlined) __dma_alloc_buffer() which ends up
      calling dmac_flush_range(). Now since the entries in the
      arm920_cache_fns are shifted by one, we jump into address 0xee070f38
      which is actually next instruction after the arm920_cache_fns
      structure.
      
      So implement flush_icache_all() for the rest of the supported CPUs
      using a generic 'invalidate I cache' instruction.
      Signed-off-by: NMika Westerberg <mika.westerberg@iki.fi>
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      c8c90860
  12. 08 10月, 2010 1 次提交
  13. 27 7月, 2010 1 次提交
    • R
      ARM: Factor out common code from cpu_proc_fin() · 9ca03a21
      Russell King 提交于
      All implementations of cpu_proc_fin() start by disabling interrupts
      and then flush caches.  Rather than have every processors proc_fin()
      implementation do this, move it out into generic code - and move the
      cache flush past setup_mm_for_reboot() (so it can benefit from having
      caches still enabled.)
      
      This allows cpu_proc_fin() to become independent of the L1/L2 cache
      types, and eventually move the L2 cache flushing into the L2 support
      code.
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      9ca03a21
  14. 15 2月, 2010 2 次提交
  15. 14 12月, 2009 1 次提交
  16. 03 10月, 2009 1 次提交
  17. 16 9月, 2009 1 次提交
  18. 01 10月, 2008 6 次提交
  19. 24 4月, 2008 1 次提交
  20. 19 4月, 2008 1 次提交
  21. 20 3月, 2008 1 次提交
  22. 22 4月, 2007 1 次提交
  23. 24 1月, 2007 1 次提交
  24. 13 12月, 2006 1 次提交
    • R
      [ARM] Unuse another Linux PTE bit · ad1ae2fe
      Russell King 提交于
      L_PTE_ASID is not really required to be stored in every PTE, since we
      can identify it via the address passed to set_pte_at().  So, create
      set_pte_ext() which takes the address of the PTE to set, the Linux
      PTE value, and the additional CPU PTE bits which aren't encoded in
      the Linux PTE value.
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      ad1ae2fe
  25. 04 12月, 2006 1 次提交
    • L
      [ARM] 3881/4: xscale: clean up cp0/cp1 handling · afe4b25e
      Lennert Buytenhek 提交于
      XScale cores either have a DSP coprocessor (which contains a single
      40 bit accumulator register), or an iWMMXt coprocessor (which contains
      eight 64 bit registers.)
      
      Because of the small amount of state in the DSP coprocessor, access to
      the DSP coprocessor (CP0) is always enabled, and DSP context switching
      is done unconditionally on every task switch.  Access to the iWMMXt
      coprocessor (CP0/CP1) is enabled only when an iWMMXt instruction is
      first issued, and iWMMXt context switching is done lazily.
      
      CONFIG_IWMMXT is supposed to mean 'the cpu we will be running on will
      have iWMMXt support', but boards are supposed to select this config
      symbol by hand, and at least one pxa27x board doesn't get this right,
      so on that board, proc-xscale.S will incorrectly assume that we have a
      DSP coprocessor, enable CP0 on boot, and we will then only save the
      first iWMMXt register (wR0) on context switches, which is Bad.
      
      This patch redefines CONFIG_IWMMXT as 'the cpu we will be running on
      might have iWMMXt support, and we will enable iWMMXt context switching
      if it does.'  This means that with this patch, running a CONFIG_IWMMXT=n
      kernel on an iWMMXt-capable CPU will no longer potentially corrupt iWMMXt
      state over context switches, and running a CONFIG_IWMMXT=y kernel on a
      non-iWMMXt capable CPU will still do DSP context save/restore.
      
      These changes should make iWMMXt work on PXA3xx, and as a side effect,
      enable proper acc0 save/restore on non-iWMMXt capable xsc3 cores such
      as IOP13xx and IXP23xx (which will not have CONFIG_CPU_XSCALE defined),
      as well as setting and using HWCAP_IWMMXT properly.
      Signed-off-by: NLennert Buytenhek <buytenh@wantstofly.org>
      Acked-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      afe4b25e
  26. 30 11月, 2006 1 次提交
  27. 03 11月, 2006 1 次提交
  28. 25 9月, 2006 1 次提交
  29. 15 9月, 2006 1 次提交
  30. 29 7月, 2006 1 次提交
  31. 02 7月, 2006 1 次提交
  32. 30 6月, 2006 1 次提交
    • R
      [ARM] Set bit 4 on section mappings correctly depending on CPU · 8799ee9f
      Russell King 提交于
      On some CPUs, bit 4 of section mappings means "update the
      cache when written to".  On others, this bit is required to
      be one, and others it's required to be zero.  Finally, on
      ARMv6 and above, setting it turns on "no execute" and prevents
      speculative prefetches.
      
      With all these combinations, no one value fits all CPUs, so we
      have to pick a value depending on the CPU type, and the area
      we're mapping.
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      8799ee9f
  33. 29 6月, 2006 1 次提交
    • R
      [ARM] nommu: provide a way for correct control register value selection · 22b19086
      Russell King 提交于
      Most MMU-based CPUs have a restriction on the setting of the data cache
      enable and mmu enable bits in the control register, whereby if the data
      cache is enabled, the MMU must also be enabled.  Enabling the data
      cache without the MMU is an invalid combination.
      
      However, there are CPUs where the data cache can be enabled without the
      MMU.
      
      In order to allow these CPUs to take advantage of that, provide a
      method whereby each proc-*.S file defines the control regsiter value
      for use with nommu (with the MMU disabled.)  Later on, when we add
      support for enabling the MMU on these devices, we can adjust the
      "crval" macro to also enable the data cache for nommu.
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      22b19086