common.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights
  3. * reserved.
  4. *
  5. * This software is available to you under a choice of one of two
  6. * licenses. You may choose to be licensed under the terms of the GNU
  7. * General Public License (GPL) Version 2, available from the file
  8. * COPYING in the main directory of this source tree, or the NetLogic
  9. * license below:
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * 1. Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. * 2. Redistributions in binary form must reproduce the above copyright
  18. * notice, this list of conditions and the following disclaimer in
  19. * the documentation and/or other materials provided with the
  20. * distribution.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR
  23. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  24. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE
  26. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  27. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  28. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  29. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  30. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  31. * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  32. * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. #ifndef _NETLOGIC_COMMON_H_
  35. #define _NETLOGIC_COMMON_H_
  36. /*
  37. * Common SMP definitions
  38. */
  39. #define RESET_VEC_PHYS 0x1fc00000
  40. #define RESET_VEC_SIZE 8192 /* 8KB reset code and data */
  41. #define RESET_DATA_PHYS (RESET_VEC_PHYS + (1<<10))
  42. /* Offsets of parameters in the RESET_DATA_PHYS area */
  43. #define BOOT_THREAD_MODE 0
  44. #define BOOT_NMI_LOCK 4
  45. #define BOOT_NMI_HANDLER 8
  46. /* CPU ready flags for each CPU */
  47. #define BOOT_CPU_READY 2048
  48. #ifndef __ASSEMBLY__
  49. #include <linux/cpumask.h>
  50. #include <linux/spinlock.h>
  51. #include <asm/irq.h>
  52. #include <asm/mach-netlogic/multi-node.h>
  53. struct irq_desc;
  54. void nlm_smp_function_ipi_handler(struct irq_desc *desc);
  55. void nlm_smp_resched_ipi_handler(struct irq_desc *desc);
  56. void nlm_smp_irq_init(int hwcpuid);
  57. void nlm_boot_secondary_cpus(void);
  58. int nlm_wakeup_secondary_cpus(void);
  59. void nlm_rmiboot_preboot(void);
  60. void nlm_percpu_init(int hwcpuid);
  61. static inline void *
  62. nlm_get_boot_data(int offset)
  63. {
  64. return (void *)(CKSEG1ADDR(RESET_DATA_PHYS) + offset);
  65. }
  66. static inline void
  67. nlm_set_nmi_handler(void *handler)
  68. {
  69. void *nmih = nlm_get_boot_data(BOOT_NMI_HANDLER);
  70. *(int64_t *)nmih = (long)handler;
  71. }
  72. /*
  73. * Misc.
  74. */
  75. void nlm_init_boot_cpu(void);
  76. unsigned int nlm_get_cpu_frequency(void);
  77. extern const struct plat_smp_ops nlm_smp_ops;
  78. extern char nlm_reset_entry[], nlm_reset_entry_end[];
  79. extern unsigned int nlm_threads_per_core;
  80. extern cpumask_t nlm_cpumask;
  81. struct irq_data;
  82. uint64_t nlm_pci_irqmask(int node);
  83. void nlm_setup_pic_irq(int node, int picirq, int irq, int irt);
  84. void nlm_set_pic_extra_ack(int node, int irq, void (*xack)(struct irq_data *));
  85. #ifdef CONFIG_PCI_MSI
  86. void nlm_dispatch_msi(int node, int lirq);
  87. void nlm_dispatch_msix(int node, int msixirq);
  88. #endif
  89. /*
  90. * The NR_IRQs is divided between nodes, each of them has a separate irq space
  91. */
  92. static inline int nlm_irq_to_xirq(int node, int irq)
  93. {
  94. return node * NR_IRQS / NLM_NR_NODES + irq;
  95. }
  96. #ifdef CONFIG_CPU_XLR
  97. #define nlm_cores_per_node() 8
  98. #else
  99. static inline int nlm_cores_per_node(void)
  100. {
  101. return ((read_c0_prid() & PRID_IMP_MASK)
  102. == PRID_IMP_NETLOGIC_XLP9XX) ? 32 : 8;
  103. }
  104. #endif
  105. static inline int nlm_threads_per_node(void)
  106. {
  107. return nlm_cores_per_node() * NLM_THREADS_PER_CORE;
  108. }
  109. static inline int nlm_hwtid_to_node(int hwtid)
  110. {
  111. return hwtid / nlm_threads_per_node();
  112. }
  113. extern int nlm_cpu_ready[];
  114. #endif /* __ASSEMBLY__ */
  115. #endif /* _NETLOGIC_COMMON_H_ */