1. 09 5月, 2016 1 次提交
    • V
      ARC: opencode arc_request_percpu_irq · 56957940
      Vineet Gupta 提交于
      - The idea is to remove the API usage since it has a subltle
        design flaw - relies on being called on cpu0 first. This is true for
        some early per cpu irqs such as TIMER/IPI, but not for late probed
        per cpu peripherals such a perf. And it's usage in perf has already
        bitten us once: see c6317bc7
        ("ARCv2: perf: Ensure perf intr gets enabled on all cores") where we
        ended up open coding it anyways
      
      - The seeming duplication will go away once we start using cpu notifier
        for timer setup
      Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
      56957940
  2. 11 3月, 2016 1 次提交
  3. 29 1月, 2016 1 次提交
  4. 28 10月, 2015 1 次提交
  5. 20 7月, 2015 1 次提交
  6. 22 6月, 2015 2 次提交
  7. 19 6月, 2015 2 次提交
  8. 23 7月, 2014 2 次提交
  9. 03 6月, 2014 1 次提交
  10. 26 3月, 2014 2 次提交
  11. 07 11月, 2013 1 次提交
  12. 06 11月, 2013 2 次提交
    • V
      ARC: use __weak instead of __attribute__((weak)) · 064a6269
      Vineet Gupta 提交于
      Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
      064a6269
    • C
      arc: Replace __get_cpu_var uses · 6855e95c
      Christoph Lameter 提交于
      __get_cpu_var() is used for multiple purposes in the kernel source. One of them is
      address calculation via the form &__get_cpu_var(x). This calculates the address for
      the instance of the percpu variable of the current processor based on an offset.
      
      Other use cases are for storing and retrieving data from the current processors percpu area.
      __get_cpu_var() can be used as an lvalue when writing data or on the right side of an assignment.
      
      __get_cpu_var() is defined as :
      
      #define __get_cpu_var(var) (*this_cpu_ptr(&(var)))
      
      __get_cpu_var() always only does an address determination. However, store and retrieve operations
      could use a segment prefix (or global register on other platforms) to avoid the address calculation.
      
      this_cpu_write() and this_cpu_read() can directly take an offset into a percpu area and use
      optimized assembly code to read and write per cpu variables.
      
      This patch converts __get_cpu_var into either an explicit address calculation using this_cpu_ptr()
      or into a use of this_cpu operations that use the offset. Thereby address calcualtions are avoided
      and less registers are used when code is generated.
      
      At the end of the patchset all uses of __get_cpu_var have been removed so the macro is removed too.
      
      The patchset includes passes over all arches as well. Once these operations are used throughout then
      specialized macros can be defined in non -x86 arches as well in order to optimize per cpu access by
      f.e. using a global register that may be set to the per cpu base.
      
      Transformations done to __get_cpu_var()
      
      1. Determine the address of the percpu instance of the current processor.
      
      	DEFINE_PER_CPU(int, y);
      	int *x = &__get_cpu_var(y);
      
          Converts to
      
      	int *x = this_cpu_ptr(&y);
      
      2. Same as #1 but this time an array structure is involved.
      
      	DEFINE_PER_CPU(int, y[20]);
      	int *x = __get_cpu_var(y);
      
          Converts to
      
      	int *x = this_cpu_ptr(y);
      
      3. Retrieve the content of the current processors instance of a per cpu variable.
      
      	DEFINE_PER_CPU(int, u);
      	int x = __get_cpu_var(y)
      
         Converts to
      
      	int x = __this_cpu_read(y);
      
      4. Retrieve the content of a percpu struct
      
      	DEFINE_PER_CPU(struct mystruct, y);
      	struct mystruct x = __get_cpu_var(y);
      
         Converts to
      
      	memcpy(this_cpu_ptr(&x), y, sizeof(x));
      
      5. Assignment to a per cpu variable
      
      	DEFINE_PER_CPU(int, y)
      	__get_cpu_var(y) = x;
      
         Converts to
      
      	this_cpu_write(y, x);
      
      6. Increment/Decrement etc of a per cpu variable
      
      	DEFINE_PER_CPU(int, y);
      	__get_cpu_var(y)++
      
         Converts to
      
      	this_cpu_inc(y)
      Acked-by: NVineet Gupta <vgupta@synopsys.com>
      Signed-off-by: NChristoph Lameter <cl@linux.com>
      6855e95c
  13. 27 9月, 2013 1 次提交
  14. 27 6月, 2013 1 次提交
    • P
      arc: delete __cpuinit usage from all arc files · ce759956
      Paul Gortmaker 提交于
      The __cpuinit type of throwaway sections might have made sense
      some time ago when RAM was more constrained, but now the savings
      do not offset the cost and complications.  For example, the fix in
      commit 5e427ec2 ("x86: Fix bit corruption at CPU resume time")
      is a good example of the nasty type of bugs that can be created
      with improper use of the various __init prefixes.
      
      After a discussion on LKML[1] it was decided that cpuinit should go
      the way of devinit and be phased out.  Once all the users are gone,
      we can then finally remove the macros themselves from linux/init.h.
      
      Note that some harmless section mismatch warnings may result, since
      notify_cpu_starting() and cpu_up() are arch independent (kernel/cpu.c)
      are flagged as __cpuinit  -- so if we remove the __cpuinit from
      arch specific callers, we will also get section mismatch warnings.
      As an intermediate step, we intend to turn the linux/init.h cpuinit
      content into no-ops as early as possible, since that will get rid
      of these warnings.  In any case, they are temporary and harmless.
      
      This removes all the arch/arc uses of the __cpuinit macros from
      all C files.  Currently arc does not have any __CPUINIT used in
      assembly files.
      
      [1] https://lkml.org/lkml/2013/5/20/589
      
      Cc: Vineet Gupta <vgupta@synopsys.com>
      Signed-off-by: NPaul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
      ce759956
  15. 22 6月, 2013 1 次提交
  16. 09 4月, 2013 1 次提交
  17. 16 2月, 2013 2 次提交
    • V
      ARC: 64bit RTSC timestamp hardware issue · 1e266629
      Vineet Gupta 提交于
      The 64bit RTSC is not reliable, causing spurious "jumps" in higher word,
      making Linux timekeeping go bonkers. So as of now just use the lower
      32bit timestamp.
      
      A cleaner approach would have been removing RTSC support altogether as the
      32bit RTSC is equivalent to old TIMER1 based solution, but some customers
      can use the 32bit RTSC in SMP syn fashion (vs. TIMER1 which being incore
      can't be done easily).
      
      A fallout of this is sched_clock()'s hardware assisted version needs to
      go away since it can't use 32bit wrapping counter - instead we use the
      generic "weak" jiffies based version.
      Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
      1e266629
    • V
      ARC: [Review] Multi-platform image #2: Board callback Infrastructure · 03a6d28c
      Vineet Gupta 提交于
      The orig platform code orgnaization was singleton design pattern - only
      one platform (and board thereof) would build at a time.
      
      Thus any platform/board specific code (e.g. irq init, early init ...)
      expected by ARC common code was exported as well defined set of APIs,
      with only ONE instance building ever.
      
      Now with multiple-platform build requirement, that design of code no
      longer holds - multiple board specific calls need to build at the same
      time - so ARC common code can't use the API approach, it needs a
      callback based design where each board registers it's specific set of
      functions, and at runtime, depending on board detection, the callbacks
      are used from the registry.
      
      This commit adds all the infrastructure, where board specific callbacks
      are specified as a "maThine description".
      
      All the hooks are placed in right spots, no board callbacks registered
      yet (with MACHINE_STARt/END constructs) so the hooks will not run.
      
      Next commit will actually convert the platform to this infrastructure.
      Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Acked-by: NArnd Bergmann <arnd@arndb.de>
      03a6d28c
  18. 11 2月, 2013 1 次提交
    • V
      ARC: Timers/counters/delay management · d8005e6b
      Vineet Gupta 提交于
      ARC700 includes 2 in-core 32bit timers TIMER0 and TIMER1.
      Both have exactly same capabilies.
      
      * programmable to count from TIMER<n>_CNT to TIMER<n>_LIMIT
      * for count 0 and LIMIT ~1, provides a free-running counter by
          auto-wrapping when limit is reached.
      * optionally interrupt when LIMIT is reached (oneshot event semantics)
      * rearming the interrupt provides periodic semantics
      * run at CPU clk
      
      ARC Linux uses TIMER0 for clockevent (periodic/oneshot) and TIMER1 for
      clocksource (free-running clock).
      
      Newer cores provide RTSC insn which gives a 64bit cpu clk snapshot hence
      is more apt for clocksource when available.
      
      SMP poses a bit of challenge for global timekeeping clocksource /
      sched_clock() backend:
       -TIMER1 based local clocks are out-of-sync hence can't be used
        (thus we default to jiffies based cs as well as sched_clock() one/both
        of which platform can override with it's specific hardware assist)
       -RTSC is only allowed in SMP if it's cross-core-sync (Kconfig glue
        ensures that) and thus usable for both requirements.
      Signed-off-by: NVineet Gupta <vgupta@synopsys.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      d8005e6b