History

Merge tag 'tag-remove-ia64' of git://git.kernel.org/pub/scm/linux/kernel/git/ardb/linux into asm-generic

Remove IA-64 architecture support Fix the IA-64 build before removing the architecture support completely. This makes v6.6 LTS the final Linux release with IA-64/Itanium support. * tag 'tag-remove-ia64' of git://git.kernel.org/pub/scm/linux/kernel/git/ardb/linux: Documentation: Drop or replace remaining mentions of IA64 lib/raid6: Drop IA64 support Documentation: Drop IA64 from feature descriptions kernel: Drop IA64 support from sig_fault handlers arch: Remove Itanium (IA-64) architecture acpi: Provide ia64 dummy implementation of acpi_proc_quirk_mwait_check()

Arnd Bergmann committed 3 years ago

Commit 43ff2212 parents 0bb80ec 9448349424 files · +74 −65172Browse files

Unified · Split

424 files
  1. Documentation/ABI/testing/sysfs-devices-system-cpu +0 −3
  2. Documentation/ABI/testing/sysfs-firmware-dmi-entries +1 −1
  3. Documentation/admin-guide/kdump/kdump.rst +3 −34
  4. Documentation/admin-guide/kdump/vmcoreinfo.rst +0 −30
  5. Documentation/admin-guide/kernel-parameters.txt +1 −7
  6. Documentation/admin-guide/mm/memory-hotplug.rst +1 −1
  7. Documentation/admin-guide/sysctl/kernel.rst +2 −21
  8. Documentation/arch/ia64/aliasing.rst +0 −246
  9. Documentation/arch/ia64/efirtc.rst +0 −144
  10. Documentation/arch/ia64/err_inject.rst +0 −1067
  11. Documentation/arch/ia64/features.rst +0 −3
  12. Documentation/arch/ia64/fsys.rst +0 −303
  13. Documentation/arch/ia64/ia64.rst +0 −49
  14. Documentation/arch/ia64/index.rst +0 −19
  15. Documentation/arch/ia64/irq-redir.rst +0 −80
  16. Documentation/arch/ia64/mca.rst +0 −198
  17. Documentation/arch/ia64/serial.rst +0 −165
  18. Documentation/arch/index.rst +0 −1
  19. Documentation/block/ioprio.rst +0 −3
  20. Documentation/core-api/cpu_hotplug.rst +0 −6
  21. Documentation/core-api/debugging-via-ohci1394.rst +3 −3
  22. Documentation/features/core/cBPF-JIT/arch-support.txt +0 −1
  23. Documentation/features/core/eBPF-JIT/arch-support.txt +0 −1
  24. Documentation/features/core/generic-idle-thread/arch-support.txt +0 −1
  25. Documentation/features/core/jump-labels/arch-support.txt +0 −1
  26. Documentation/features/core/thread-info-in-task/arch-support.txt +0 −1
  27. Documentation/features/core/tracehook/arch-support.txt +0 −1
  28. Documentation/features/debug/KASAN/arch-support.txt +0 −1
  29. Documentation/features/debug/debug-vm-pgtable/arch-support.txt +0 −1
  30. Documentation/features/debug/gcov-profile-all/arch-support.txt +0 −1
  31. Documentation/features/debug/kcov/arch-support.txt +0 −1
  32. Documentation/features/debug/kgdb/arch-support.txt +0 −1
  33. Documentation/features/debug/kmemleak/arch-support.txt +0 −1
  34. Documentation/features/debug/kprobes-on-ftrace/arch-support.txt +0 −1
  35. Documentation/features/debug/kprobes/arch-support.txt +0 −1
  36. Documentation/features/debug/kretprobes/arch-support.txt +0 −1
  37. Documentation/features/debug/optprobes/arch-support.txt +0 −1
  38. Documentation/features/debug/stackprotector/arch-support.txt +0 −1
  39. Documentation/features/debug/uprobes/arch-support.txt +0 −1
  40. Documentation/features/debug/user-ret-profiler/arch-support.txt +0 −1
  41. Documentation/features/io/dma-contiguous/arch-support.txt +0 −1
  42. Documentation/features/locking/cmpxchg-local/arch-support.txt +0 −1
  43. Documentation/features/locking/lockdep/arch-support.txt +0 −1
  44. Documentation/features/locking/queued-rwlocks/arch-support.txt +0 −1
  45. Documentation/features/locking/queued-spinlocks/arch-support.txt +0 −1
  46. Documentation/features/perf/kprobes-event/arch-support.txt +0 −1
  47. Documentation/features/perf/perf-regs/arch-support.txt +0 −1
  48. Documentation/features/perf/perf-stackdump/arch-support.txt +0 −1
  49. Documentation/features/sched/membarrier-sync-core/arch-support.txt +0 −1
  50. Documentation/features/sched/numa-balancing/arch-support.txt +0 −1
  51. Documentation/features/seccomp/seccomp-filter/arch-support.txt +0 −1
  52. Documentation/features/time/arch-tick-broadcast/arch-support.txt +0 −1
  53. Documentation/features/time/clockevents/arch-support.txt +0 −1
  54. Documentation/features/time/context-tracking/arch-support.txt +0 −1
  55. Documentation/features/time/irq-time-acct/arch-support.txt +0 −1
  56. Documentation/features/time/virt-cpuacct/arch-support.txt +0 −1
  57. Documentation/features/vm/ELF-ASLR/arch-support.txt +0 −1
  58. Documentation/features/vm/PG_uncached/arch-support.txt +0 −1
  59. Documentation/features/vm/THP/arch-support.txt +0 −1
  60. Documentation/features/vm/TLB/arch-support.txt +0 −1
  61. Documentation/features/vm/huge-vmap/arch-support.txt +0 −1
  62. Documentation/features/vm/ioremap_prot/arch-support.txt +0 −1
  63. Documentation/features/vm/pte_special/arch-support.txt +0 −1
  64. Documentation/kbuild/makefiles.rst +1 −1
  65. Documentation/networking/device_drivers/ethernet/neterion/s2io.rst +2 −2
  66. Documentation/scheduler/sched-arch.rst +1 −3
  67. Documentation/trace/kprobes.rst +0 −1
  68. Documentation/translations/zh_CN/arch/index.rst +0 −1
  69. Documentation/translations/zh_CN/core-api/cpu_hotplug.rst +0 −6
  70. Documentation/translations/zh_CN/scheduler/sched-arch.rst +1 −4
  71. MAINTAINERS +0 −11
  72. Makefile +2 −2
  73. arch/Kconfig +0 −1
  74. arch/ia64/Kbuild +0 −3
  75. arch/ia64/Kconfig +0 −394
  76. arch/ia64/Kconfig.debug +0 −55
  77. arch/ia64/Makefile +0 −82
  78. arch/ia64/configs/bigsur_defconfig +0 −102
  79. arch/ia64/configs/generic_defconfig +0 −206
  80. arch/ia64/configs/gensparse_defconfig +0 −184
  81. arch/ia64/configs/tiger_defconfig +0 −169
  82. arch/ia64/configs/zx1_defconfig +0 −148
  83. arch/ia64/hp/common/Makefile +0 −10
  84. arch/ia64/hp/common/aml_nfw.c +0 −232
  85. arch/ia64/hp/common/sba_iommu.c +0 −2155
  86. arch/ia64/include/asm/Kbuild +0 −6
  87. arch/ia64/include/asm/acenv.h +0 −49
  88. arch/ia64/include/asm/acpi-ext.h +0 −17
  89. arch/ia64/include/asm/acpi.h +0 −110
  90. arch/ia64/include/asm/asm-offsets.h +0 −1
  91. arch/ia64/include/asm/asm-prototypes.h +0 −30
  92. arch/ia64/include/asm/asmmacro.h +0 −136
  93. arch/ia64/include/asm/atomic.h +0 −216
  94. arch/ia64/include/asm/barrier.h +0 −79
  95. arch/ia64/include/asm/bitops.h +0 −453
  96. arch/ia64/include/asm/bug.h +0 −19
  97. arch/ia64/include/asm/cache.h +0 −30
  98. arch/ia64/include/asm/cacheflush.h +0 −39
  99. arch/ia64/include/asm/checksum.h +0 −63
  100. arch/ia64/include/asm/clocksource.h +0 −11
  101. arch/ia64/include/asm/cmpxchg.h +0 −33
  102. arch/ia64/include/asm/cpu.h +0 −23
  103. arch/ia64/include/asm/cputime.h +0 −21
  104. arch/ia64/include/asm/current.h +0 −18
  105. arch/ia64/include/asm/cyclone.h +0 −16
  106. arch/ia64/include/asm/delay.h +0 −89
  107. arch/ia64/include/asm/device.h +0 −14
  108. arch/ia64/include/asm/div64.h +0 −1
  109. arch/ia64/include/asm/dma-mapping.h +0 −16
  110. arch/ia64/include/asm/dma.h +0 −17
  111. arch/ia64/include/asm/dmi.h +0 −15
  112. arch/ia64/include/asm/early_ioremap.h +0 −11
  113. arch/ia64/include/asm/efi.h +0 −13
  114. arch/ia64/include/asm/elf.h +0 −233
  115. arch/ia64/include/asm/emergency-restart.h +0 −6
  116. arch/ia64/include/asm/esi.h +0 −30
  117. arch/ia64/include/asm/exception.h +0 −23
  118. arch/ia64/include/asm/extable.h +0 −12
  119. arch/ia64/include/asm/fb.h +0 −43
  120. arch/ia64/include/asm/fpswa.h +0 −74
  121. arch/ia64/include/asm/ftrace.h +0 −28
  122. arch/ia64/include/asm/futex.h +0 −109
  123. arch/ia64/include/asm/gcc_intrin.h +0 −13
  124. arch/ia64/include/asm/hardirq.h +0 −27
  125. arch/ia64/include/asm/hugetlb.h +0 −34
  126. arch/ia64/include/asm/hw_irq.h +0 −167
  127. arch/ia64/include/asm/idle.h +0 −8
  128. arch/ia64/include/asm/intrinsics.h +0 −13
  129. arch/ia64/include/asm/io.h +0 −271
  130. arch/ia64/include/asm/iommu.h +0 −22
  131. arch/ia64/include/asm/iosapic.h +0 −106
  132. arch/ia64/include/asm/irq.h +0 −37
  133. arch/ia64/include/asm/irq_regs.h +0 −1
  134. arch/ia64/include/asm/irq_remapping.h +0 −5
  135. arch/ia64/include/asm/irqflags.h +0 −95
  136. arch/ia64/include/asm/kdebug.h +0 −45
  137. arch/ia64/include/asm/kexec.h +0 −46
  138. arch/ia64/include/asm/kprobes.h +0 −116
  139. arch/ia64/include/asm/kregs.h +0 −166
  140. arch/ia64/include/asm/libata-portmap.h +0 −9
  141. arch/ia64/include/asm/linkage.h +0 −19
  142. arch/ia64/include/asm/local.h +0 −1
  143. arch/ia64/include/asm/mca.h +0 −185
  144. arch/ia64/include/asm/mca_asm.h +0 −245
  145. arch/ia64/include/asm/meminit.h +0 −59
  146. arch/ia64/include/asm/mman.h +0 −18
  147. arch/ia64/include/asm/mmiowb.h +0 −17
  148. arch/ia64/include/asm/mmu.h +0 −14
  149. arch/ia64/include/asm/mmu_context.h +0 −194
  150. arch/ia64/include/asm/mmzone.h +0 −35
  151. arch/ia64/include/asm/module.h +0 −35
  152. arch/ia64/include/asm/module.lds.h +0 −14
  153. arch/ia64/include/asm/msidef.h +0 −43
  154. arch/ia64/include/asm/native/inst.h +0 −119
  155. arch/ia64/include/asm/native/irq.h +0 −20
  156. arch/ia64/include/asm/native/patchlist.h +0 −24
  157. arch/ia64/include/asm/nodedata.h +0 −63
  158. arch/ia64/include/asm/numa.h +0 −83
  159. arch/ia64/include/asm/page.h +0 −208
  160. arch/ia64/include/asm/pal.h +0 −1827
  161. arch/ia64/include/asm/param.h +0 −18
  162. arch/ia64/include/asm/parport.h +0 −20
  163. arch/ia64/include/asm/patch.h +0 −28
  164. arch/ia64/include/asm/pci.h +0 −66
  165. arch/ia64/include/asm/percpu.h +0 −53
  166. arch/ia64/include/asm/pgalloc.h +0 −64
  167. arch/ia64/include/asm/pgtable.h +0 −545
  168. arch/ia64/include/asm/processor.h +0 −660
  169. arch/ia64/include/asm/ptrace.h +0 −146
  170. arch/ia64/include/asm/sal.h +0 −919
  171. arch/ia64/include/asm/sections.h +0 −33
  172. arch/ia64/include/asm/serial.h +0 −17
  173. arch/ia64/include/asm/shmparam.h +0 −13
  174. arch/ia64/include/asm/signal.h +0 −33
  175. arch/ia64/include/asm/smp.h +0 −103
  176. arch/ia64/include/asm/sn/intr.h +0 −15
  177. arch/ia64/include/asm/sn/sn_sal.h +0 −124
  178. arch/ia64/include/asm/sparsemem.h +0 −28
  179. arch/ia64/include/asm/spinlock.h +0 −265
  180. arch/ia64/include/asm/spinlock_types.h +0 −22
  181. arch/ia64/include/asm/string.h +0 −22
  182. arch/ia64/include/asm/switch_to.h +0 −71
  183. arch/ia64/include/asm/syscall.h +0 −65
  184. arch/ia64/include/asm/thread_info.h +0 −131
  185. arch/ia64/include/asm/timex.h +0 −47
  186. arch/ia64/include/asm/tlb.h +0 −50
  187. arch/ia64/include/asm/tlbflush.h +0 −128
  188. arch/ia64/include/asm/topology.h +0 −56
  189. arch/ia64/include/asm/types.h +0 −32
  190. arch/ia64/include/asm/uaccess.h +0 −265
  191. arch/ia64/include/asm/uncached.h +0 −9
  192. arch/ia64/include/asm/unistd.h +0 −38
  193. arch/ia64/include/asm/unwind.h +0 −234
  194. arch/ia64/include/asm/user.h +0 −53
  195. arch/ia64/include/asm/ustack.h +0 −12
  196. arch/ia64/include/asm/uv/uv.h +0 −30
  197. arch/ia64/include/asm/uv/uv_hub.h +0 −315
  198. arch/ia64/include/asm/uv/uv_mmrs.h +0 −825
  199. arch/ia64/include/asm/vermagic.h +0 −15
  200. arch/ia64/include/asm/vga.h +0 −26
  201. arch/ia64/include/asm/vmalloc.h +0 −4
  202. arch/ia64/include/asm/xor.h +0 −30
  203. arch/ia64/include/asm/xtp.h +0 −46
  204. arch/ia64/include/uapi/asm/Kbuild +0 −2
  205. arch/ia64/include/uapi/asm/auxvec.h +0 −14
  206. arch/ia64/include/uapi/asm/bitsperlong.h +0 −9
  207. arch/ia64/include/uapi/asm/break.h +0 −23
  208. arch/ia64/include/uapi/asm/byteorder.h +0 −7
  209. arch/ia64/include/uapi/asm/cmpxchg.h +0 −138
  210. arch/ia64/include/uapi/asm/fcntl.h +0 −15
  211. arch/ia64/include/uapi/asm/fpu.h +0 −67
  212. arch/ia64/include/uapi/asm/gcc_intrin.h +0 −619
  213. arch/ia64/include/uapi/asm/ia64regs.h +0 −101
  214. arch/ia64/include/uapi/asm/intrinsics.h +0 −82
  215. arch/ia64/include/uapi/asm/mman.h +0 −17
  216. arch/ia64/include/uapi/asm/param.h +0 −30
  217. arch/ia64/include/uapi/asm/posix_types.h +0 −9
  218. arch/ia64/include/uapi/asm/ptrace.h +0 −248
  219. arch/ia64/include/uapi/asm/ptrace_offsets.h +0 −269
  220. arch/ia64/include/uapi/asm/resource.h +0 −8
  221. arch/ia64/include/uapi/asm/rse.h +0 −67
  222. arch/ia64/include/uapi/asm/setup.h +0 −25
  223. arch/ia64/include/uapi/asm/sigcontext.h +0 −71
  224. arch/ia64/include/uapi/asm/siginfo.h +0 −28
  225. arch/ia64/include/uapi/asm/signal.h +0 −98
  226. arch/ia64/include/uapi/asm/stat.h +0 −52
  227. arch/ia64/include/uapi/asm/statfs.h +0 −21
  228. arch/ia64/include/uapi/asm/swab.h +0 −35
  229. arch/ia64/include/uapi/asm/types.h +0 −32
  230. arch/ia64/include/uapi/asm/ucontext.h +0 −13
  231. arch/ia64/include/uapi/asm/unistd.h +0 −22
  232. arch/ia64/include/uapi/asm/ustack.h +0 −13
  233. arch/ia64/install.sh +0 −30
  234. arch/ia64/kernel/.gitignore +0 −3
  235. arch/ia64/kernel/Makefile +0 −46
  236. arch/ia64/kernel/Makefile.gate +0 −29
  237. arch/ia64/kernel/acpi-ext.c +0 −101
  238. arch/ia64/kernel/acpi.c +0 −909
  239. arch/ia64/kernel/asm-offsets.c +0 −289
  240. arch/ia64/kernel/audit.c +0 −63
  241. arch/ia64/kernel/brl_emu.c +0 −217
  242. arch/ia64/kernel/crash.c +0 −257
  243. arch/ia64/kernel/crash_dump.c +0 −27
  244. arch/ia64/kernel/cyclone.c +0 −125
  245. arch/ia64/kernel/dma-mapping.c +0 −9
  246. arch/ia64/kernel/efi.c +0 −1360
  247. arch/ia64/kernel/efi_stub.S +0 −87
  248. arch/ia64/kernel/elfcore.c +0 −77
  249. arch/ia64/kernel/entry.S +0 −1427
  250. arch/ia64/kernel/entry.h +0 −83
  251. arch/ia64/kernel/err_inject.c +0 −273
  252. arch/ia64/kernel/esi.c +0 −193
  253. arch/ia64/kernel/esi_stub.S +0 −99
  254. arch/ia64/kernel/fsys.S +0 −837
  255. arch/ia64/kernel/fsyscall_gtod_data.h +0 −30
  256. arch/ia64/kernel/ftrace.c +0 −196
  257. arch/ia64/kernel/gate-data.S +0 −3
  258. arch/ia64/kernel/gate.S +0 −380
  259. arch/ia64/kernel/gate.lds.S +0 −108
  260. arch/ia64/kernel/head.S +0 −1167
  261. arch/ia64/kernel/iosapic.c +0 −1137
  262. arch/ia64/kernel/irq.c +0 −181
  263. arch/ia64/kernel/irq.h +0 −3
  264. arch/ia64/kernel/irq_ia64.c +0 −645
  265. arch/ia64/kernel/irq_lsapic.c +0 −45
  266. arch/ia64/kernel/ivt.S +0 −1688
  267. arch/ia64/kernel/kprobes.c +0 −911
  268. arch/ia64/kernel/machine_kexec.c +0 −163
  269. arch/ia64/kernel/mca.c +0 −2111
  270. arch/ia64/kernel/mca_asm.S +0 −1123
  271. arch/ia64/kernel/mca_drv.c +0 −796
  272. arch/ia64/kernel/mca_drv.h +0 −123
  273. arch/ia64/kernel/mca_drv_asm.S +0 −56
  274. arch/ia64/kernel/minstate.h +0 −251
  275. arch/ia64/kernel/module.c +0 −959
  276. arch/ia64/kernel/msi_ia64.c +0 −198
  277. arch/ia64/kernel/numa.c +0 −73
  278. arch/ia64/kernel/pal.S +0 −306
  279. arch/ia64/kernel/palinfo.c +0 −942
  280. arch/ia64/kernel/patch.c +0 −237
  281. arch/ia64/kernel/pci-dma.c +0 −33
  282. arch/ia64/kernel/perfmon_itanium.h +0 −116
  283. arch/ia64/kernel/process.c +0 −611
  284. arch/ia64/kernel/ptrace.c +0 −2012
  285. arch/ia64/kernel/relocate_kernel.S +0 −321
  286. arch/ia64/kernel/sal.c +0 −400
  287. arch/ia64/kernel/salinfo.c +0 −646
  288. arch/ia64/kernel/setup.c +0 −1081
  289. arch/ia64/kernel/sigframe.h +0 −26
  290. arch/ia64/kernel/signal.c +0 −412
  291. arch/ia64/kernel/smp.c +0 −335
  292. arch/ia64/kernel/smpboot.c +0 −839
  293. arch/ia64/kernel/stacktrace.c +0 −40
  294. arch/ia64/kernel/sys_ia64.c +0 −197
  295. arch/ia64/kernel/syscalls/Makefile +0 −32
  296. arch/ia64/kernel/syscalls/syscall.tbl +0 −375
  297. arch/ia64/kernel/time.c +0 −463
  298. arch/ia64/kernel/topology.c +0 −410
  299. arch/ia64/kernel/traps.c +0 −612
  300. arch/ia64/kernel/unaligned.c +0 −1560
  301. arch/ia64/kernel/uncached.c +0 −273
  302. arch/ia64/kernel/unwind.c +0 −2320
  303. arch/ia64/kernel/unwind_decoder.c +0 −460
  304. arch/ia64/kernel/unwind_i.h +0 −165
  305. arch/ia64/kernel/vmlinux.lds.S +0 −224
  306. arch/ia64/lib/Makefile +0 −48
  307. arch/ia64/lib/checksum.c +0 −102
  308. arch/ia64/lib/clear_page.S +0 −79
  309. arch/ia64/lib/clear_user.S +0 −212
  310. arch/ia64/lib/copy_page.S +0 −101
  311. arch/ia64/lib/copy_page_mck.S +0 −188
  312. arch/ia64/lib/copy_user.S +0 −613
  313. arch/ia64/lib/csum_partial_copy.c +0 −98
  314. arch/ia64/lib/do_csum.S +0 −324
  315. arch/ia64/lib/flush.S +0 −119
  316. arch/ia64/lib/idiv32.S +0 −86
  317. arch/ia64/lib/idiv64.S +0 −83
  318. arch/ia64/lib/io.c +0 −51
  319. arch/ia64/lib/ip_fast_csum.S +0 −148
  320. arch/ia64/lib/memcpy.S +0 −304
  321. arch/ia64/lib/memcpy_mck.S +0 −659
  322. arch/ia64/lib/memset.S +0 −365
  323. arch/ia64/lib/strlen.S +0 −195
  324. arch/ia64/lib/strncpy_from_user.S +0 −47
  325. arch/ia64/lib/strnlen_user.S +0 −48
  326. arch/ia64/lib/xor.S +0 −181
  327. arch/ia64/mm/Makefile +0 −11
  328. arch/ia64/mm/contig.c +0 −208
  329. arch/ia64/mm/discontig.c +0 −635
  330. arch/ia64/mm/extable.c +0 −24
  331. arch/ia64/mm/fault.c +0 −251
  332. arch/ia64/mm/hugetlbpage.c +0 −186
  333. arch/ia64/mm/init.c +0 −532
  334. arch/ia64/mm/ioremap.c +0 −94
  335. arch/ia64/mm/numa.c +0 −80
  336. arch/ia64/mm/tlb.c +0 −591
  337. arch/ia64/pci/Makefile +0 −5
  338. arch/ia64/pci/fixup.c +0 −80
  339. arch/ia64/pci/pci.c +0 −576
  340. arch/ia64/scripts/check-gas +0 −16
  341. arch/ia64/scripts/check-gas-asm.S +0 −2
  342. arch/ia64/scripts/check-model.c +0 −1
  343. arch/ia64/scripts/check-segrel.S +0 −5
  344. arch/ia64/scripts/check-segrel.lds +0 −13
  345. arch/ia64/scripts/check-serialize.S +0 −2
  346. arch/ia64/scripts/check-text-align.S +0 −7
  347. arch/ia64/scripts/toolchain-flags +0 −54
  348. arch/ia64/scripts/unwcheck.py +0 −65
  349. arch/ia64/uv/Makefile +0 −12
  350. arch/ia64/uv/kernel/Makefile +0 −12
  351. arch/ia64/uv/kernel/setup.c +0 −120
  352. drivers/acpi/Kconfig +3 −3
  353. drivers/acpi/numa/Kconfig +2 −2
  354. drivers/acpi/osl.c +1 −1
  355. drivers/char/Kconfig +2 −2
  356. drivers/char/Makefile +0 −1
  357. drivers/char/agp/Kconfig +1 −15
  358. drivers/char/agp/Makefile +0 −2
  359. drivers/char/agp/hp-agp.c +0 −550
  360. drivers/char/agp/i460-agp.c +0 −659
  361. drivers/char/hpet.c +0 −30
  362. drivers/char/hw_random/Kconfig +1 −1
  363. drivers/char/mem.c +0 −12
  364. drivers/char/mspec.c +0 −295
  365. drivers/cpufreq/Kconfig +0 −11
  366. drivers/cpufreq/Makefile +0 −1
  367. drivers/cpufreq/ia64-acpi-cpufreq.c +0 −353
  368. drivers/firmware/Kconfig +0 −24
  369. drivers/firmware/Makefile +0 −1
  370. drivers/firmware/efi/Kconfig +3 −3
  371. drivers/firmware/efi/efi.c +1 −12
  372. drivers/firmware/pcdp.c +0 −135
  373. drivers/firmware/pcdp.h +0 −108
  374. drivers/gpu/drm/drm_ioc32.c +2 −2
  375. drivers/input/serio/i8042.h +1 −1
  376. drivers/iommu/Kconfig +2 −2
  377. drivers/iommu/intel/Kconfig +1 −1
  378. drivers/media/cec/platform/Kconfig +1 −1
  379. drivers/misc/Kconfig +1 −1
  380. drivers/misc/sgi-gru/gru.h +1 −3
  381. drivers/misc/sgi-gru/gru_instructions.h +1 −11
  382. drivers/misc/sgi-gru/grufile.c +0 −72
  383. drivers/misc/sgi-gru/gruhandles.c +0 −6
  384. drivers/misc/sgi-gru/grumain.c +0 −4
  385. drivers/misc/sgi-xp/xp.h +1 −1
  386. drivers/misc/sgi-xp/xp_uv.c +0 −24
  387. drivers/misc/sgi-xp/xpc_main.c +0 −31
  388. drivers/misc/sgi-xp/xpc_uv.c +0 −85
  389. drivers/net/ethernet/broadcom/tg3.c +1 −1
  390. drivers/net/ethernet/brocade/bna/bnad.h +0 −1
  391. drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +0 −2
  392. drivers/pci/vgaarb.c +1 −1
  393. drivers/tty/serial/8250/Kconfig +1 −1
  394. drivers/tty/vt/keyboard.c +1 −1
  395. drivers/video/fbdev/Kconfig +1 −1
  396. drivers/watchdog/Kconfig +1 −1
  397. fs/Kconfig +1 −1
  398. fs/afs/main.c +0 −2
  399. fs/xfs/xfs_ioctl32.h +1 −1
  400. include/linux/acpi.h +1 −8
  401. include/linux/efi.h +0 −7
  402. include/linux/mm.h +0 −2
  403. include/linux/moduleparam.h +1 −1
  404. include/linux/raid/pq.h +0 −2
  405. include/linux/sched/signal.h +4 −13
  406. include/trace/events/mmflags.h +1 −1
  407. include/uapi/asm-generic/siginfo.h +0 −5
  408. init/Kconfig +1 −1
  409. kernel/cpu.c +0 −3
  410. kernel/fork.c +1 −1
  411. kernel/sched/core.c +3 −26
  412. kernel/signal.c +5 −20
  413. kernel/sysctl.c +0 −9
  414. lib/Kconfig.debug +1 −1
  415. lib/decompress_unxz.c +0 −3
  416. lib/raid6/Makefile +2 −2
  417. lib/raid6/algos.c +0 −4
  418. lib/raid6/int.uc +0 −9
  419. lib/xz/Kconfig +0 −5
  420. mm/mmap.c +3 −3
  421. tools/arch/ia64/include/asm/barrier.h +0 −59
  422. tools/arch/ia64/include/uapi/asm/bitsperlong.h +0 −9
  423. tools/arch/ia64/include/uapi/asm/mman.h +0 −7
  424. usr/include/Makefile +0 −6
Documentation/ABI/testing/sysfs-devices-system-cpu+0−3
@@ -354,9 +354,6 @@ Description: Parameters for the CPU cache attributes · 353 unmodified lines
354 - ReadWriteAllocate:354 - ReadWriteAllocate:
355 both writeallocate and readallocate355 both writeallocate and readallocate
356 356
357 attributes:
358 LEGACY used only on IA64 and is same as write_policy
359
360 coherency_line_size:357 coherency_line_size:
361 the minimum amount of data in bytes that gets358 the minimum amount of data in bytes that gets
362 transferred from memory to cache359 transferred from memory to cache
Documentation/ABI/testing/sysfs-firmware-dmi-entries+1−1
@@ -2,7 +2,7 @@ What: /sys/firmware/dmi/entries/ · 1 unmodified line
2Date: February 20112Date: February 2011
3Contact: Mike Waychison <mikew@google.com>3Contact: Mike Waychison <mikew@google.com>
4Description:4Description:
5 Many machines' firmware (x86 and ia64) export DMI /5 Many machines' firmware (x86 and arm64) export DMI /
6 SMBIOS tables to the operating system. Getting at this6 SMBIOS tables to the operating system. Getting at this
7 information is often valuable to userland, especially in7 information is often valuable to userland, especially in
8 cases where there are OEM extensions used.8 cases where there are OEM extensions used.
Documentation/admin-guide/kdump/kdump.rst+3−34
@@ -17,7 +17,7 @@ You can use common commands, such as cp, scp or makedumpfile to copy · 16 unmodified lines
17the memory image to a dump file on the local disk, or across the network17the memory image to a dump file on the local disk, or across the network
18to a remote system.18to a remote system.
19 19
20Kdump and kexec are currently supported on the x86, x86_64, ppc64, ia64,20Kdump and kexec are currently supported on the x86, x86_64, ppc64,
21s390x, arm and arm64 architectures.21s390x, arm and arm64 architectures.
22 22
23When the system kernel boots, it reserves a small section of memory for23When the system kernel boots, it reserves a small section of memory for
@@ -113,7 +113,7 @@ There are two possible methods of using Kdump. · 89 unmodified lines
1132) Or use the system kernel binary itself as dump-capture kernel and there is1132) Or use the system kernel binary itself as dump-capture kernel and there is
114 no need to build a separate dump-capture kernel. This is possible114 no need to build a separate dump-capture kernel. This is possible
115 only with the architectures which support a relocatable kernel. As115 only with the architectures which support a relocatable kernel. As
116 of today, i386, x86_64, ppc64, ia64, arm and arm64 architectures support116 of today, i386, x86_64, ppc64, arm and arm64 architectures support
117 relocatable kernel.117 relocatable kernel.
118 118
119Building a relocatable kernel is advantageous from the point of view that119Building a relocatable kernel is advantageous from the point of view that
@@ -236,24 +236,6 @@ Dump-capture kernel config options (Arch Dependent, ppc64) · 116 unmodified lines
236 236
237 Make and install the kernel and its modules.237 Make and install the kernel and its modules.
238 238
239Dump-capture kernel config options (Arch Dependent, ia64)
240----------------------------------------------------------
241
242- No specific options are required to create a dump-capture kernel
243 for ia64, other than those specified in the arch independent section
244 above. This means that it is possible to use the system kernel
245 as a dump-capture kernel if desired.
246
247 The crashkernel region can be automatically placed by the system
248 kernel at runtime. This is done by specifying the base address as 0,
249 or omitting it all together::
250
251 crashkernel=256M@0
252
253 or::
254
255 crashkernel=256M
256
257Dump-capture kernel config options (Arch Dependent, arm)239Dump-capture kernel config options (Arch Dependent, arm)
258----------------------------------------------------------240----------------------------------------------------------
259 241
@@ -348,11 +330,6 @@ Boot into System Kernel · 88 unmodified lines
348 330
349 On ppc64, use "crashkernel=128M@32M".331 On ppc64, use "crashkernel=128M@32M".
350 332
351 On ia64, 256M@256M is a generous value that typically works.
352 The region may be automatically placed on ia64, see the
353 dump-capture kernel config option notes above.
354 If use sparse memory, the size should be rounded to GRANULE boundaries.
355
356 On s390x, typically use "crashkernel=xxM". The value of xx is dependent333 On s390x, typically use "crashkernel=xxM". The value of xx is dependent
357 on the memory consumption of the kdump system. In general this is not334 on the memory consumption of the kdump system. In general this is not
358 dependent on the memory size of the production system.335 dependent on the memory size of the production system.
@@ -383,10 +360,6 @@ For ppc64: · 24 unmodified lines
383 360
384 - Use vmlinux361 - Use vmlinux
385 362
386For ia64:
387
388 - Use vmlinux or vmlinuz.gz
389
390For s390x:363For s390x:
391 364
392 - Use image or bzImage365 - Use image or bzImage
@@ -428,14 +401,10 @@ to load dump-capture kernel:: · 35 unmodified lines
428 --initrd=<initrd-for-dump-capture-kernel> \401 --initrd=<initrd-for-dump-capture-kernel> \
429 --append="root=<root-dev> <arch-specific-options>"402 --append="root=<root-dev> <arch-specific-options>"
430 403
431Please note, that --args-linux does not need to be specified for ia64.
432It is planned to make this a no-op on that architecture, but for now
433it should be omitted
434
435Following are the arch specific command line options to be used while404Following are the arch specific command line options to be used while
436loading dump-capture kernel.405loading dump-capture kernel.
437 406
438For i386, x86_64 and ia64:407For i386 and x86_64:
439 408
440 "1 irqpoll nr_cpus=1 reset_devices"409 "1 irqpoll nr_cpus=1 reset_devices"
441 410
Documentation/admin-guide/kdump/vmcoreinfo.rst+0−30
@@ -413,36 +413,6 @@ of a higher page table lookup overhead, and also consumes more page · 412 unmodified lines
413table space per process. Used to check whether PAE was enabled in the413table space per process. Used to check whether PAE was enabled in the
414crash kernel when converting virtual addresses to physical addresses.414crash kernel when converting virtual addresses to physical addresses.
415 415
416ia64
417====
418
419pgdat_list|(pgdat_list, MAX_NUMNODES)
420-------------------------------------
421
422pg_data_t array storing all NUMA nodes information. MAX_NUMNODES
423indicates the number of the nodes.
424
425node_memblk|(node_memblk, NR_NODE_MEMBLKS)
426------------------------------------------
427
428List of node memory chunks. Filled when parsing the SRAT table to obtain
429information about memory nodes. NR_NODE_MEMBLKS indicates the number of
430node memory chunks.
431
432These values are used to compute the number of nodes the crashed kernel used.
433
434node_memblk_s|(node_memblk_s, start_paddr)|(node_memblk_s, size)
435----------------------------------------------------------------
436
437The size of a struct node_memblk_s and the offsets of the
438node_memblk_s's members. Used to compute the number of nodes.
439
440PGTABLE_3|PGTABLE_4
441-------------------
442
443User-space tools need to know whether the crash kernel was in 3-level or
4444-level paging mode. Used to distinguish the page table.
445
446ARM64416ARM64
447=====417=====
448 418
Documentation/admin-guide/kernel-parameters.txt+1−7
@@ -1449,7 +1449,7 @@ · 1448 unmodified lines
1449 See comment before function elanfreq_setup() in1449 See comment before function elanfreq_setup() in
1450 arch/x86/kernel/cpu/cpufreq/elanfreq.c.1450 arch/x86/kernel/cpu/cpufreq/elanfreq.c.
1451 1451
1452 elfcorehdr=[size[KMG]@]offset[KMG] [IA64,PPC,SH,X86,S390]1452 elfcorehdr=[size[KMG]@]offset[KMG] [PPC,SH,X86,S390]
1453 Specifies physical address of start of kernel core1453 Specifies physical address of start of kernel core
1454 image elf header and optionally the size. Generally1454 image elf header and optionally the size. Generally
1455 kexec loader will pass this option to capture kernel.1455 kexec loader will pass this option to capture kernel.
@@ -1512,12 +1512,6 @@ · 56 unmodified lines
1512 floppy= [HW]1512 floppy= [HW]
1513 See Documentation/admin-guide/blockdev/floppy.rst.1513 See Documentation/admin-guide/blockdev/floppy.rst.
1514 1514
1515 force_pal_cache_flush
1516 [IA-64] Avoid check_sal_cache_flush which may hang on
1517 buggy SAL_CACHE_FLUSH implementations. Using this
1518 parameter will force ia64_sal_cache_flush to call
1519 ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
1520
1521 forcepae [X86-32]1515 forcepae [X86-32]
1522 Forcefully enable Physical Address Extension (PAE).1516 Forcefully enable Physical Address Extension (PAE).
1523 Many Pentium M systems disable PAE but may have a1517 Many Pentium M systems disable PAE but may have a
Documentation/admin-guide/mm/memory-hotplug.rst+1−1
@@ -33,7 +33,7 @@ used to expose persistent memory, other performance-differentiated memory and · 32 unmodified lines
33reserved memory regions as ordinary system RAM to Linux.33reserved memory regions as ordinary system RAM to Linux.
34 34
35Linux only supports memory hot(un)plug on selected 64 bit architectures, such as35Linux only supports memory hot(un)plug on selected 64 bit architectures, such as
36x86_64, arm64, ppc64, s390x and ia64.36x86_64, arm64, ppc64 and s390x.
37 37
38Memory Hot(Un)Plug Granularity38Memory Hot(Un)Plug Granularity
39------------------------------39------------------------------
Documentation/admin-guide/sysctl/kernel.rst+2−21
@@ -436,7 +436,7 @@ ignore-unaligned-usertrap · 435 unmodified lines
436 436
437On architectures where unaligned accesses cause traps, and where this437On architectures where unaligned accesses cause traps, and where this
438feature is supported (``CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN``;438feature is supported (``CONFIG_SYSCTL_ARCH_UNALIGN_NO_WARN``;
439currently, ``arc``, ``ia64`` and ``loongarch``), controls whether all439currently, ``arc`` and ``loongarch``), controls whether all
440unaligned traps are logged.440unaligned traps are logged.
441 441
442= =============================================================442= =============================================================
@@ -445,10 +445,7 @@ unaligned traps are logged. · 2 unmodified lines
445 setting.445 setting.
446= =============================================================446= =============================================================
447 447
448See also `unaligned-trap`_ and `unaligned-dump-stack`_. On ``ia64``,448See also `unaligned-trap`_.
449this allows system administrators to override the
450``IA64_THREAD_UAC_NOPRINT`` ``prctl`` and avoid logs being flooded.
451
452 449
453io_uring_disabled450io_uring_disabled
454=================451=================
@@ -1538,22 +1535,6 @@ See Documentation/admin-guide/kernel-parameters.rst and · 1083 unmodified lines
1538Documentation/trace/boottime-trace.rst.1535Documentation/trace/boottime-trace.rst.
1539 1536
1540 1537
1541.. _unaligned-dump-stack:
1542
1543unaligned-dump-stack (ia64)
1544===========================
1545
1546When logging unaligned accesses, controls whether the stack is
1547dumped.
1548
1549= ===================================================
15500 Do not dump the stack. This is the default setting.
15511 Dump the stack.
1552= ===================================================
1553
1554See also `ignore-unaligned-usertrap`_.
1555
1556
1557unaligned-trap1538unaligned-trap
1558==============1539==============
1559 1540
Documentation/arch/ia64/aliasing.rst+0−246
@@ -1,246 +0,0 @@
1==================================
2Memory Attribute Aliasing on IA-64
3==================================
4
5Bjorn Helgaas <bjorn.helgaas@hp.com>
6
7May 4, 2006
8
9
10Memory Attributes
11=================
12
13 Itanium supports several attributes for virtual memory references.
14 The attribute is part of the virtual translation, i.e., it is
15 contained in the TLB entry. The ones of most interest to the Linux
16 kernel are:
17
18 == ======================
19 WB Write-back (cacheable)
20 UC Uncacheable
21 WC Write-coalescing
22 == ======================
23
24 System memory typically uses the WB attribute. The UC attribute is
25 used for memory-mapped I/O devices. The WC attribute is uncacheable
26 like UC is, but writes may be delayed and combined to increase
27 performance for things like frame buffers.
28
29 The Itanium architecture requires that we avoid accessing the same
30 page with both a cacheable mapping and an uncacheable mapping[1].
31
32 The design of the chipset determines which attributes are supported
33 on which regions of the address space. For example, some chipsets
34 support either WB or UC access to main memory, while others support
35 only WB access.
36
37Memory Map
38==========
39
40 Platform firmware describes the physical memory map and the
41 supported attributes for each region. At boot-time, the kernel uses
42 the EFI GetMemoryMap() interface. ACPI can also describe memory
43 devices and the attributes they support, but Linux/ia64 currently
44 doesn't use this information.
45
46 The kernel uses the efi_memmap table returned from GetMemoryMap() to
47 learn the attributes supported by each region of physical address
48 space. Unfortunately, this table does not completely describe the
49 address space because some machines omit some or all of the MMIO
50 regions from the map.
51
52 The kernel maintains another table, kern_memmap, which describes the
53 memory Linux is actually using and the attribute for each region.
54 This contains only system memory; it does not contain MMIO space.
55
56 The kern_memmap table typically contains only a subset of the system
57 memory described by the efi_memmap. Linux/ia64 can't use all memory
58 in the system because of constraints imposed by the identity mapping
59 scheme.
60
61 The efi_memmap table is preserved unmodified because the original
62 boot-time information is required for kexec.
63
64Kernel Identity Mappings
65========================
66
67 Linux/ia64 identity mappings are done with large pages, currently
68 either 16MB or 64MB, referred to as "granules." Cacheable mappings
69 are speculative[2], so the processor can read any location in the
70 page at any time, independent of the programmer's intentions. This
71 means that to avoid attribute aliasing, Linux can create a cacheable
72 identity mapping only when the entire granule supports cacheable
73 access.
74
75 Therefore, kern_memmap contains only full granule-sized regions that
76 can referenced safely by an identity mapping.
77
78 Uncacheable mappings are not speculative, so the processor will
79 generate UC accesses only to locations explicitly referenced by
80 software. This allows UC identity mappings to cover granules that
81 are only partially populated, or populated with a combination of UC
82 and WB regions.
83
84User Mappings
85=============
86
87 User mappings are typically done with 16K or 64K pages. The smaller
88 page size allows more flexibility because only 16K or 64K has to be
89 homogeneous with respect to memory attributes.
90
91Potential Attribute Aliasing Cases
92==================================
93
94 There are several ways the kernel creates new mappings:
95
96mmap of /dev/mem
97----------------
98
99 This uses remap_pfn_range(), which creates user mappings. These
100 mappings may be either WB or UC. If the region being mapped
101 happens to be in kern_memmap, meaning that it may also be mapped
102 by a kernel identity mapping, the user mapping must use the same
103 attribute as the kernel mapping.
104
105 If the region is not in kern_memmap, the user mapping should use
106 an attribute reported as being supported in the EFI memory map.
107
108 Since the EFI memory map does not describe MMIO on some
109 machines, this should use an uncacheable mapping as a fallback.
110
111mmap of /sys/class/pci_bus/.../legacy_mem
112-----------------------------------------
113
114 This is very similar to mmap of /dev/mem, except that legacy_mem
115 only allows mmap of the one megabyte "legacy MMIO" area for a
116 specific PCI bus. Typically this is the first megabyte of
117 physical address space, but it may be different on machines with
118 several VGA devices.
119
120 "X" uses this to access VGA frame buffers. Using legacy_mem
121 rather than /dev/mem allows multiple instances of X to talk to
122 different VGA cards.
123
124 The /dev/mem mmap constraints apply.
125
126mmap of /proc/bus/pci/.../??.?
127------------------------------
128
129 This is an MMIO mmap of PCI functions, which additionally may or
130 may not be requested as using the WC attribute.
131
132 If WC is requested, and the region in kern_memmap is either WC
133 or UC, and the EFI memory map designates the region as WC, then
134 the WC mapping is allowed.
135
136 Otherwise, the user mapping must use the same attribute as the
137 kernel mapping.
138
139read/write of /dev/mem
140----------------------
141
142 This uses copy_from_user(), which implicitly uses a kernel
143 identity mapping. This is obviously safe for things in
144 kern_memmap.
145
146 There may be corner cases of things that are not in kern_memmap,
147 but could be accessed this way. For example, registers in MMIO
148 space are not in kern_memmap, but could be accessed with a UC
149 mapping. This would not cause attribute aliasing. But
150 registers typically can be accessed only with four-byte or
151 eight-byte accesses, and the copy_from_user() path doesn't allow
152 any control over the access size, so this would be dangerous.
153
154ioremap()
155---------
156
157 This returns a mapping for use inside the kernel.
158
159 If the region is in kern_memmap, we should use the attribute
160 specified there.
161
162 If the EFI memory map reports that the entire granule supports
163 WB, we should use that (granules that are partially reserved
164 or occupied by firmware do not appear in kern_memmap).
165
166 If the granule contains non-WB memory, but we can cover the
167 region safely with kernel page table mappings, we can use
168 ioremap_page_range() as most other architectures do.
169
170 Failing all of the above, we have to fall back to a UC mapping.
171
172Past Problem Cases
173==================
174
175mmap of various MMIO regions from /dev/mem by "X" on Intel platforms
176--------------------------------------------------------------------
177
178 The EFI memory map may not report these MMIO regions.
179
180 These must be allowed so that X will work. This means that
181 when the EFI memory map is incomplete, every /dev/mem mmap must
182 succeed. It may create either WB or UC user mappings, depending
183 on whether the region is in kern_memmap or the EFI memory map.
184
185mmap of 0x0-0x9FFFF /dev/mem by "hwinfo" on HP sx1000 with VGA enabled
186----------------------------------------------------------------------
187
188 The EFI memory map reports the following attributes:
189
190 =============== ======= ==================
191 0x00000-0x9FFFF WB only
192 0xA0000-0xBFFFF UC only (VGA frame buffer)
193 0xC0000-0xFFFFF WB only
194 =============== ======= ==================
195
196 This mmap is done with user pages, not kernel identity mappings,
197 so it is safe to use WB mappings.
198
199 The kernel VGA driver may ioremap the VGA frame buffer at 0xA0000,
200 which uses a granule-sized UC mapping. This granule will cover some
201 WB-only memory, but since UC is non-speculative, the processor will
202 never generate an uncacheable reference to the WB-only areas unless
203 the driver explicitly touches them.
204
205mmap of 0x0-0xFFFFF legacy_mem by "X"
206-------------------------------------
207
208 If the EFI memory map reports that the entire range supports the
209 same attributes, we can allow the mmap (and we will prefer WB if
210 supported, as is the case with HP sx[12]000 machines with VGA
211 disabled).
212
213 If EFI reports the range as partly WB and partly UC (as on sx[12]000
214 machines with VGA enabled), we must fail the mmap because there's no
215 safe attribute to use.
216
217 If EFI reports some of the range but not all (as on Intel firmware
218 that doesn't report the VGA frame buffer at all), we should fail the
219 mmap and force the user to map just the specific region of interest.
220
221mmap of 0xA0000-0xBFFFF legacy_mem by "X" on HP sx1000 with VGA disabled
222------------------------------------------------------------------------
223
224 The EFI memory map reports the following attributes::
225
226 0x00000-0xFFFFF WB only (no VGA MMIO hole)
227
228 This is a special case of the previous case, and the mmap should
229 fail for the same reason as above.
230
231read of /sys/devices/.../rom
232----------------------------
233
234 For VGA devices, this may cause an ioremap() of 0xC0000. This
235 used to be done with a UC mapping, because the VGA frame buffer
236 at 0xA0000 prevents use of a WB granule. The UC mapping causes
237 an MCA on HP sx[12]000 chipsets.
238
239 We should use WB page table mappings to avoid covering the VGA
240 frame buffer.
241
242Notes
243=====
244
245 [1] SDM rev 2.2, vol 2, sec 4.4.1.
246 [2] SDM rev 2.2, vol 2, sec 4.4.6.
Documentation/arch/ia64/efirtc.rst+0−144
@@ -1,144 +0,0 @@
1==========================
2EFI Real Time Clock driver
3==========================
4
5S. Eranian <eranian@hpl.hp.com>
6
7March 2000
8
91. Introduction
10===============
11
12This document describes the efirtc.c driver has provided for
13the IA-64 platform.
14
15The purpose of this driver is to supply an API for kernel and user applications
16to get access to the Time Service offered by EFI version 0.92.
17
18EFI provides 4 calls one can make once the OS is booted: GetTime(),
19SetTime(), GetWakeupTime(), SetWakeupTime() which are all supported by this
20driver. We describe those calls as well the design of the driver in the
21following sections.
22
232. Design Decisions
24===================
25
26The original ideas was to provide a very simple driver to get access to,
27at first, the time of day service. This is required in order to access, in a
28portable way, the CMOS clock. A program like /sbin/hwclock uses such a clock
29to initialize the system view of the time during boot.
30
31Because we wanted to minimize the impact on existing user-level apps using
32the CMOS clock, we decided to expose an API that was very similar to the one
33used today with the legacy RTC driver (driver/char/rtc.c). However, because
34EFI provides a simpler services, not all ioctl() are available. Also
35new ioctl()s have been introduced for things that EFI provides but not the
36legacy.
37
38EFI uses a slightly different way of representing the time, noticeably
39the reference date is different. Year is the using the full 4-digit format.
40The Epoch is January 1st 1998. For backward compatibility reasons we don't
41expose this new way of representing time. Instead we use something very
42similar to the struct tm, i.e. struct rtc_time, as used by hwclock.
43One of the reasons for doing it this way is to allow for EFI to still evolve
44without necessarily impacting any of the user applications. The decoupling
45enables flexibility and permits writing wrapper code is ncase things change.
46
47The driver exposes two interfaces, one via the device file and a set of
48ioctl()s. The other is read-only via the /proc filesystem.
49
50As of today we don't offer a /proc/sys interface.
51
52To allow for a uniform interface between the legacy RTC and EFI time service,
53we have created the include/linux/rtc.h header file to contain only the
54"public" API of the two drivers. The specifics of the legacy RTC are still
55in include/linux/mc146818rtc.h.
56
57
583. Time of day service
59======================
60
61The part of the driver gives access to the time of day service of EFI.
62Two ioctl()s, compatible with the legacy RTC calls:
63
64 Read the CMOS clock::
65
66 ioctl(d, RTC_RD_TIME, &rtc);
67
68 Write the CMOS clock::
69
70 ioctl(d, RTC_SET_TIME, &rtc);
71
72The rtc is a pointer to a data structure defined in rtc.h which is close
73to a struct tm::
74
75 struct rtc_time {
76 int tm_sec;
77 int tm_min;
78 int tm_hour;
79 int tm_mday;
80 int tm_mon;
81 int tm_year;
82 int tm_wday;
83 int tm_yday;
84 int tm_isdst;
85 };
86
87The driver takes care of converting back an forth between the EFI time and
88this format.
89
90Those two ioctl()s can be exercised with the hwclock command:
91
92For reading::
93
94 # /sbin/hwclock --show
95 Mon Mar 6 15:32:32 2000 -0.910248 seconds
96
97For setting::
98
99 # /sbin/hwclock --systohc
100
101Root privileges are required to be able to set the time of day.
102
1034. Wakeup Alarm service
104=======================
105
106EFI provides an API by which one can program when a machine should wakeup,
107i.e. reboot. This is very different from the alarm provided by the legacy
108RTC which is some kind of interval timer alarm. For this reason we don't use
109the same ioctl()s to get access to the service. Instead we have
110introduced 2 news ioctl()s to the interface of an RTC.
111
112We have added 2 new ioctl()s that are specific to the EFI driver:
113
114 Read the current state of the alarm::
115
116 ioctl(d, RTC_WKALM_RD, &wkt)
117
118 Set the alarm or change its status::
119
120 ioctl(d, RTC_WKALM_SET, &wkt)
121
122The wkt structure encapsulates a struct rtc_time + 2 extra fields to get
123status information::
124
125 struct rtc_wkalrm {
126
127 unsigned char enabled; /* =1 if alarm is enabled */
128 unsigned char pending; /* =1 if alarm is pending */
129
130 struct rtc_time time;
131 }
132
133As of today, none of the existing user-level apps supports this feature.
134However writing such a program should be hard by simply using those two
135ioctl().
136
137Root privileges are required to be able to set the alarm.
138
1395. References
140=============
141
142Checkout the following Web site for more information on EFI:
143
144http://developer.intel.com/technology/efi/
Documentation/arch/ia64/err_inject.rst+0−1067
@@ -1,1067 +0,0 @@
1========================================
2IPF Machine Check (MC) error inject tool
3========================================
4
5IPF Machine Check (MC) error inject tool is used to inject MC
6errors from Linux. The tool is a test bed for IPF MC work flow including
7hardware correctable error handling, OS recoverable error handling, MC
8event logging, etc.
9
10The tool includes two parts: a kernel driver and a user application
11sample. The driver provides interface to PAL to inject error
12and query error injection capabilities. The driver code is in
13arch/ia64/kernel/err_inject.c. The application sample (shown below)
14provides a combination of various errors and calls the driver's interface
15(sysfs interface) to inject errors or query error injection capabilities.
16
17The tool can be used to test Intel IPF machine MC handling capabilities.
18It's especially useful for people who can not access hardware MC injection
19tool to inject error. It's also very useful to integrate with other
20software test suits to do stressful testing on IPF.
21
22Below is a sample application as part of the whole tool. The sample
23can be used as a working test tool. Or it can be expanded to include
24more features. It also can be a integrated into a library or other user
25application to have more thorough test.
26
27The sample application takes err.conf as error configuration input. GCC
28compiles the code. After you install err_inject driver, you can run
29this sample application to inject errors.
30
31Errata: Itanium 2 Processors Specification Update lists some errata against
32the pal_mc_error_inject PAL procedure. The following err.conf has been tested
33on latest Montecito PAL.
34
35err.conf::
36
37 #This is configuration file for err_inject_tool.
38 #The format of the each line is:
39 #cpu, loop, interval, err_type_info, err_struct_info, err_data_buffer
40 #where
41 # cpu: logical cpu number the error will be inject in.
42 # loop: times the error will be injected.
43 # interval: In second. every so often one error is injected.
44 # err_type_info, err_struct_info: PAL parameters.
45 #
46 #Note: All values are hex w/o or w/ 0x prefix.
47
48
49 #On cpu2, inject only total 0x10 errors, interval 5 seconds
50 #corrected, data cache, hier-2, physical addr(assigned by tool code).
51 #working on Montecito latest PAL.
52 2, 10, 5, 4101, 95
53
54 #On cpu4, inject and consume total 0x10 errors, interval 5 seconds
55 #corrected, data cache, hier-2, physical addr(assigned by tool code).
56 #working on Montecito latest PAL.
57 4, 10, 5, 4109, 95
58
59 #On cpu15, inject and consume total 0x10 errors, interval 5 seconds
60 #recoverable, DTR0, hier-2.
61 #working on Montecito latest PAL.
62 0xf, 0x10, 5, 4249, 15
63
64The sample application source code:
65
66err_injection_tool.c::
67
68 /*
69 * This program is free software; you can redistribute it and/or modify
70 * it under the terms of the GNU General Public License as published by
71 * the Free Software Foundation; either version 2 of the License, or
72 * (at your option) any later version.
73 *
74 * This program is distributed in the hope that it will be useful, but
75 * WITHOUT ANY WARRANTY; without even the implied warranty of
76 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
77 * NON INFRINGEMENT. See the GNU General Public License for more
78 * details.
79 *
80 * You should have received a copy of the GNU General Public License
81 * along with this program; if not, write to the Free Software
82 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
83 *
84 * Copyright (C) 2006 Intel Co
85 * Fenghua Yu <fenghua.yu@intel.com>
86 *
87 */
88 #include <sys/types.h>
89 #include <sys/stat.h>
90 #include <fcntl.h>
91 #include <stdio.h>
92 #include <sched.h>
93 #include <unistd.h>
94 #include <stdlib.h>
95 #include <stdarg.h>
96 #include <string.h>
97 #include <errno.h>
98 #include <time.h>
99 #include <sys/ipc.h>
100 #include <sys/sem.h>
101 #include <sys/wait.h>
102 #include <sys/mman.h>
103 #include <sys/shm.h>
104
105 #define MAX_FN_SIZE 256
106 #define MAX_BUF_SIZE 256
107 #define DATA_BUF_SIZE 256
108 #define NR_CPUS 512
109 #define MAX_TASK_NUM 2048
110 #define MIN_INTERVAL 5 // seconds
111 #define ERR_DATA_BUFFER_SIZE 3 // Three 8-byte.
112 #define PARA_FIELD_NUM 5
113 #define MASK_SIZE (NR_CPUS/64)
114 #define PATH_FORMAT "/sys/devices/system/cpu/cpu%d/err_inject/"
115
116 int sched_setaffinity(pid_t pid, unsigned int len, unsigned long *mask);
117
118 int verbose;
119 #define vbprintf if (verbose) printf
120
121 int log_info(int cpu, const char *fmt, ...)
122 {
123 FILE *log;
124 char fn[MAX_FN_SIZE];
125 char buf[MAX_BUF_SIZE];
126 va_list args;
127
128 sprintf(fn, "%d.log", cpu);
129 log=fopen(fn, "a+");
130 if (log==NULL) {
131 perror("Error open:");
132 return -1;
133 }
134
135 va_start(args, fmt);
136 vprintf(fmt, args);
137 memset(buf, 0, MAX_BUF_SIZE);
138 vsprintf(buf, fmt, args);
139 va_end(args);
140
141 fwrite(buf, sizeof(buf), 1, log);
142 fclose(log);
143
144 return 0;
145 }
146
147 typedef unsigned long u64;
148 typedef unsigned int u32;
149
150 typedef union err_type_info_u {
151 struct {
152 u64 mode : 3, /* 0-2 */
153 err_inj : 3, /* 3-5 */
154 err_sev : 2, /* 6-7 */
155 err_struct : 5, /* 8-12 */
156 struct_hier : 3, /* 13-15 */
157 reserved : 48; /* 16-63 */
158 } err_type_info_u;
159 u64 err_type_info;
160 } err_type_info_t;
161
162 typedef union err_struct_info_u {
163 struct {
164 u64 siv : 1, /* 0 */
165 c_t : 2, /* 1-2 */
166 cl_p : 3, /* 3-5 */
167 cl_id : 3, /* 6-8 */
168 cl_dp : 1, /* 9 */
169 reserved1 : 22, /* 10-31 */
170 tiv : 1, /* 32 */
171 trigger : 4, /* 33-36 */
172 trigger_pl : 3, /* 37-39 */
173 reserved2 : 24; /* 40-63 */
174 } err_struct_info_cache;
175 struct {
176 u64 siv : 1, /* 0 */
177 tt : 2, /* 1-2 */
178 tc_tr : 2, /* 3-4 */
179 tr_slot : 8, /* 5-12 */
180 reserved1 : 19, /* 13-31 */
181 tiv : 1, /* 32 */
182 trigger : 4, /* 33-36 */
183 trigger_pl : 3, /* 37-39 */
184 reserved2 : 24; /* 40-63 */
185 } err_struct_info_tlb;
186 struct {
187 u64 siv : 1, /* 0 */
188 regfile_id : 4, /* 1-4 */
189 reg_num : 7, /* 5-11 */
190 reserved1 : 20, /* 12-31 */
191 tiv : 1, /* 32 */
192 trigger : 4, /* 33-36 */
193 trigger_pl : 3, /* 37-39 */
194 reserved2 : 24; /* 40-63 */
195 } err_struct_info_register;
196 struct {
197 u64 reserved;
198 } err_struct_info_bus_processor_interconnect;
199 u64 err_struct_info;
200 } err_struct_info_t;
201
202 typedef union err_data_buffer_u {
203 struct {
204 u64 trigger_addr; /* 0-63 */
205 u64 inj_addr; /* 64-127 */
206 u64 way : 5, /* 128-132 */
207 index : 20, /* 133-152 */
208 : 39; /* 153-191 */
209 } err_data_buffer_cache;
210 struct {
211 u64 trigger_addr; /* 0-63 */
212 u64 inj_addr; /* 64-127 */
213 u64 way : 5, /* 128-132 */
214 index : 20, /* 133-152 */
215 reserved : 39; /* 153-191 */
216 } err_data_buffer_tlb;
217 struct {
218 u64 trigger_addr; /* 0-63 */
219 } err_data_buffer_register;
220 struct {
221 u64 reserved; /* 0-63 */
222 } err_data_buffer_bus_processor_interconnect;
223 u64 err_data_buffer[ERR_DATA_BUFFER_SIZE];
224 } err_data_buffer_t;
225
226 typedef union capabilities_u {
227 struct {
228 u64 i : 1,
229 d : 1,
230 rv : 1,
231 tag : 1,
232 data : 1,
233 mesi : 1,
234 dp : 1,
235 reserved1 : 3,
236 pa : 1,
237 va : 1,
238 wi : 1,
239 reserved2 : 20,
240 trigger : 1,
241 trigger_pl : 1,
242 reserved3 : 30;
243 } capabilities_cache;
244 struct {
245 u64 d : 1,
246 i : 1,
247 rv : 1,
248 tc : 1,
249 tr : 1,
250 reserved1 : 27,
251 trigger : 1,
252 trigger_pl : 1,
253 reserved2 : 30;
254 } capabilities_tlb;
255 struct {
256 u64 gr_b0 : 1,
257 gr_b1 : 1,
258 fr : 1,
259 br : 1,
260 pr : 1,
261 ar : 1,
262 cr : 1,
263 rr : 1,
264 pkr : 1,
265 dbr : 1,
266 ibr : 1,
267 pmc : 1,
268 pmd : 1,
269 reserved1 : 3,
270 regnum : 1,
271 reserved2 : 15,
272 trigger : 1,
273 trigger_pl : 1,
274 reserved3 : 30;
275 } capabilities_register;
276 struct {
277 u64 reserved;
278 } capabilities_bus_processor_interconnect;
279 } capabilities_t;
280
281 typedef struct resources_s {
282 u64 ibr0 : 1,
283 ibr2 : 1,
284 ibr4 : 1,
285 ibr6 : 1,
286 dbr0 : 1,
287 dbr2 : 1,
288 dbr4 : 1,
289 dbr6 : 1,
290 reserved : 48;
291 } resources_t;
292
293
294 long get_page_size(void)
295 {
296 long page_size=sysconf(_SC_PAGESIZE);
297 return page_size;
298 }
299
300 #define PAGE_SIZE (get_page_size()==-1?0x4000:get_page_size())
301 #define SHM_SIZE (2*PAGE_SIZE*NR_CPUS)
302 #define SHM_VA 0x2000000100000000
303
304 int shmid;
305 void *shmaddr;
306
307 int create_shm(void)
308 {
309 key_t key;
310 char fn[MAX_FN_SIZE];
311
312 /* cpu0 is always existing */
313 sprintf(fn, PATH_FORMAT, 0);
314 if ((key = ftok(fn, 's')) == -1) {
315 perror("ftok");
316 return -1;
317 }
318
319 shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
320 if (shmid == -1) {
321 if (errno==EEXIST) {
322 shmid = shmget(key, SHM_SIZE, 0);
323 if (shmid == -1) {
324 perror("shmget");
325 return -1;
326 }
327 }
328 else {
329 perror("shmget");
330 return -1;
331 }
332 }
333 vbprintf("shmid=%d", shmid);
334
335 /* connect to the segment: */
336 shmaddr = shmat(shmid, (void *)SHM_VA, 0);
337 if (shmaddr == (void*)-1) {
338 perror("shmat");
339 return -1;
340 }
341
342 memset(shmaddr, 0, SHM_SIZE);
343 mlock(shmaddr, SHM_SIZE);
344
345 return 0;
346 }
347
348 int free_shm()
349 {
350 munlock(shmaddr, SHM_SIZE);
351 shmdt(shmaddr);
352 semctl(shmid, 0, IPC_RMID);
353
354 return 0;
355 }
356
357 #ifdef _SEM_SEMUN_UNDEFINED
358 union semun
359 {
360 int val;
361 struct semid_ds *buf;
362 unsigned short int *array;
363 struct seminfo *__buf;
364 };
365 #endif
366
367 u32 mode=1; /* 1: physical mode; 2: virtual mode. */
368 int one_lock=1;
369 key_t key[NR_CPUS];
370 int semid[NR_CPUS];
371
372 int create_sem(int cpu)
373 {
374 union semun arg;
375 char fn[MAX_FN_SIZE];
376 int sid;
377
378 sprintf(fn, PATH_FORMAT, cpu);
379 sprintf(fn, "%s/%s", fn, "err_type_info");
380 if ((key[cpu] = ftok(fn, 'e')) == -1) {
381 perror("ftok");
382 return -1;
383 }
384
385 if (semid[cpu]!=0)
386 return 0;
387
388 /* clear old semaphore */
389 if ((sid = semget(key[cpu], 1, 0)) != -1)
390 semctl(sid, 0, IPC_RMID);
391
392 /* get one semaphore */
393 if ((semid[cpu] = semget(key[cpu], 1, IPC_CREAT | IPC_EXCL)) == -1) {
394 perror("semget");
395 printf("Please remove semaphore with key=0x%lx, then run the tool.\n",
396 (u64)key[cpu]);
397 return -1;
398 }
399
400 vbprintf("semid[%d]=0x%lx, key[%d]=%lx\n",cpu,(u64)semid[cpu],cpu,
401 (u64)key[cpu]);
402 /* initialize the semaphore to 1: */
403 arg.val = 1;
404 if (semctl(semid[cpu], 0, SETVAL, arg) == -1) {
405 perror("semctl");
406 return -1;
407 }
408
409 return 0;
410 }
411
412 static int lock(int cpu)
413 {
414 struct sembuf lock;
415
416 lock.sem_num = cpu;
417 lock.sem_op = 1;
418 semop(semid[cpu], &lock, 1);
419
420 return 0;
421 }
422
423 static int unlock(int cpu)
424 {
425 struct sembuf unlock;
426
427 unlock.sem_num = cpu;
428 unlock.sem_op = -1;
429 semop(semid[cpu], &unlock, 1);
430
431 return 0;
432 }
433
434 void free_sem(int cpu)
435 {
436 semctl(semid[cpu], 0, IPC_RMID);
437 }
438
439 int wr_multi(char *fn, unsigned long *data, int size)
440 {
441 int fd;
442 char buf[MAX_BUF_SIZE];
443 int ret;
444
445 if (size==1)
446 sprintf(buf, "%lx", *data);
447 else if (size==3)
448 sprintf(buf, "%lx,%lx,%lx", data[0], data[1], data[2]);
449 else {
450 fprintf(stderr,"write to file with wrong size!\n");
451 return -1;
452 }
453
454 fd=open(fn, O_RDWR);
455 if (!fd) {
456 perror("Error:");
457 return -1;
458 }
459 ret=write(fd, buf, sizeof(buf));
460 close(fd);
461 return ret;
462 }
463
464 int wr(char *fn, unsigned long data)
465 {
466 return wr_multi(fn, &data, 1);
467 }
468
469 int rd(char *fn, unsigned long *data)
470 {
471 int fd;
472 char buf[MAX_BUF_SIZE];
473
474 fd=open(fn, O_RDONLY);
475 if (fd<0) {
476 perror("Error:");
477 return -1;
478 }
479 read(fd, buf, MAX_BUF_SIZE);
480 *data=strtoul(buf, NULL, 16);
481 close(fd);
482 return 0;
483 }
484
485 int rd_status(char *path, int *status)
486 {
487 char fn[MAX_FN_SIZE];
488 sprintf(fn, "%s/status", path);
489 if (rd(fn, (u64*)status)<0) {
490 perror("status reading error.\n");
491 return -1;
492 }
493
494 return 0;
495 }
496
497 int rd_capabilities(char *path, u64 *capabilities)
498 {
499 char fn[MAX_FN_SIZE];
500 sprintf(fn, "%s/capabilities", path);
501 if (rd(fn, capabilities)<0) {
502 perror("capabilities reading error.\n");
503 return -1;
504 }
505
506 return 0;
507 }
508
509 int rd_all(char *path)
510 {
511 unsigned long err_type_info, err_struct_info, err_data_buffer;
512 int status;
513 unsigned long capabilities, resources;
514 char fn[MAX_FN_SIZE];
515
516 sprintf(fn, "%s/err_type_info", path);
517 if (rd(fn, &err_type_info)<0) {
518 perror("err_type_info reading error.\n");
519 return -1;
520 }
521 printf("err_type_info=%lx\n", err_type_info);
522
523 sprintf(fn, "%s/err_struct_info", path);
524 if (rd(fn, &err_struct_info)<0) {
525 perror("err_struct_info reading error.\n");
526 return -1;
527 }
528 printf("err_struct_info=%lx\n", err_struct_info);
529
530 sprintf(fn, "%s/err_data_buffer", path);
531 if (rd(fn, &err_data_buffer)<0) {
532 perror("err_data_buffer reading error.\n");
533 return -1;
534 }
535 printf("err_data_buffer=%lx\n", err_data_buffer);
536
537 sprintf(fn, "%s/status", path);
538 if (rd("status", (u64*)&status)<0) {
539 perror("status reading error.\n");
540 return -1;
541 }
542 printf("status=%d\n", status);
543
544 sprintf(fn, "%s/capabilities", path);
545 if (rd(fn,&capabilities)<0) {
546 perror("capabilities reading error.\n");
547 return -1;
548 }
549 printf("capabilities=%lx\n", capabilities);
550
551 sprintf(fn, "%s/resources", path);
552 if (rd(fn, &resources)<0) {
553 perror("resources reading error.\n");
554 return -1;
555 }
556 printf("resources=%lx\n", resources);
557
558 return 0;
559 }
560
561 int query_capabilities(char *path, err_type_info_t err_type_info,
562 u64 *capabilities)
563 {
564 char fn[MAX_FN_SIZE];
565 err_struct_info_t err_struct_info;
566 err_data_buffer_t err_data_buffer;
567
568 err_struct_info.err_struct_info=0;
569 memset(err_data_buffer.err_data_buffer, -1, ERR_DATA_BUFFER_SIZE*8);
570
571 sprintf(fn, "%s/err_type_info", path);
572 wr(fn, err_type_info.err_type_info);
573 sprintf(fn, "%s/err_struct_info", path);
574 wr(fn, 0x0);
575 sprintf(fn, "%s/err_data_buffer", path);
576 wr_multi(fn, err_data_buffer.err_data_buffer, ERR_DATA_BUFFER_SIZE);
577
578 // Fire pal_mc_error_inject procedure.
579 sprintf(fn, "%s/call_start", path);
580 wr(fn, mode);
581
582 if (rd_capabilities(path, capabilities)<0)
583 return -1;
584
585 return 0;
586 }
587
588 int query_all_capabilities()
589 {
590 int status;
591 err_type_info_t err_type_info;
592 int err_sev, err_struct, struct_hier;
593 int cap=0;
594 u64 capabilities;
595 char path[MAX_FN_SIZE];
596
597 err_type_info.err_type_info=0; // Initial
598 err_type_info.err_type_info_u.mode=0; // Query mode;
599 err_type_info.err_type_info_u.err_inj=0;
600
601 printf("All capabilities implemented in pal_mc_error_inject:\n");
602 sprintf(path, PATH_FORMAT ,0);
603 for (err_sev=0;err_sev<3;err_sev++)
604 for (err_struct=0;err_struct<5;err_struct++)
605 for (struct_hier=0;struct_hier<5;struct_hier++)
606 {
607 status=-1;
608 capabilities=0;
609 err_type_info.err_type_info_u.err_sev=err_sev;
610 err_type_info.err_type_info_u.err_struct=err_struct;
611 err_type_info.err_type_info_u.struct_hier=struct_hier;
612
613 if (query_capabilities(path, err_type_info, &capabilities)<0)
614 continue;
615
616 if (rd_status(path, &status)<0)
617 continue;
618
619 if (status==0) {
620 cap=1;
621 printf("For err_sev=%d, err_struct=%d, struct_hier=%d: ",
622 err_sev, err_struct, struct_hier);
623 printf("capabilities 0x%lx\n", capabilities);
624 }
625 }
626 if (!cap) {
627 printf("No capabilities supported.\n");
628 return 0;
629 }
630
631 return 0;
632 }
633
634 int err_inject(int cpu, char *path, err_type_info_t err_type_info,
635 err_struct_info_t err_struct_info,
636 err_data_buffer_t err_data_buffer)
637 {
638 int status;
639 char fn[MAX_FN_SIZE];
640
641 log_info(cpu, "err_type_info=%lx, err_struct_info=%lx, ",
642 err_type_info.err_type_info,
643 err_struct_info.err_struct_info);
644 log_info(cpu,"err_data_buffer=[%lx,%lx,%lx]\n",
645 err_data_buffer.err_data_buffer[0],
646 err_data_buffer.err_data_buffer[1],
647 err_data_buffer.err_data_buffer[2]);
648 sprintf(fn, "%s/err_type_info", path);
649 wr(fn, err_type_info.err_type_info);
650 sprintf(fn, "%s/err_struct_info", path);
651 wr(fn, err_struct_info.err_struct_info);
652 sprintf(fn, "%s/err_data_buffer", path);
653 wr_multi(fn, err_data_buffer.err_data_buffer, ERR_DATA_BUFFER_SIZE);
654
655 // Fire pal_mc_error_inject procedure.
656 sprintf(fn, "%s/call_start", path);
657 wr(fn,mode);
658
659 if (rd_status(path, &status)<0) {
660 vbprintf("fail: read status\n");
661 return -100;
662 }
663
664 if (status!=0) {
665 log_info(cpu, "fail: status=%d\n", status);
666 return status;
667 }
668
669 return status;
670 }
671
672 static int construct_data_buf(char *path, err_type_info_t err_type_info,
673 err_struct_info_t err_struct_info,
674 err_data_buffer_t *err_data_buffer,
675 void *va1)
676 {
677 char fn[MAX_FN_SIZE];
678 u64 virt_addr=0, phys_addr=0;
679
680 vbprintf("va1=%lx\n", (u64)va1);
681 memset(&err_data_buffer->err_data_buffer_cache, 0, ERR_DATA_BUFFER_SIZE*8);
682
683 switch (err_type_info.err_type_info_u.err_struct) {
684 case 1: // Cache
685 switch (err_struct_info.err_struct_info_cache.cl_id) {
686 case 1: //Virtual addr
687 err_data_buffer->err_data_buffer_cache.inj_addr=(u64)va1;
688 break;
689 case 2: //Phys addr
690 sprintf(fn, "%s/virtual_to_phys", path);
691 virt_addr=(u64)va1;
692 if (wr(fn,virt_addr)<0)
693 return -1;
694 rd(fn, &phys_addr);
695 err_data_buffer->err_data_buffer_cache.inj_addr=phys_addr;
696 break;
697 default:
698 printf("Not supported cl_id\n");
699 break;
700 }
701 break;
702 case 2: // TLB
703 break;
704 case 3: // Register file
705 break;
706 case 4: // Bus/system interconnect
707 default:
708 printf("Not supported err_struct\n");
709 break;
710 }
711
712 return 0;
713 }
714
715 typedef struct {
716 u64 cpu;
717 u64 loop;
718 u64 interval;
719 u64 err_type_info;
720 u64 err_struct_info;
721 u64 err_data_buffer[ERR_DATA_BUFFER_SIZE];
722 } parameters_t;
723
724 parameters_t line_para;
725 int para;
726
727 static int empty_data_buffer(u64 *err_data_buffer)
728 {
729 int empty=1;
730 int i;
731
732 for (i=0;i<ERR_DATA_BUFFER_SIZE; i++)
733 if (err_data_buffer[i]!=-1)
734 empty=0;
735
736 return empty;
737 }
738
739 int err_inj()
740 {
741 err_type_info_t err_type_info;
742 err_struct_info_t err_struct_info;
743 err_data_buffer_t err_data_buffer;
744 int count;
745 FILE *fp;
746 unsigned long cpu, loop, interval, err_type_info_conf, err_struct_info_conf;
747 u64 err_data_buffer_conf[ERR_DATA_BUFFER_SIZE];
748 int num;
749 int i;
750 char path[MAX_FN_SIZE];
751 parameters_t parameters[MAX_TASK_NUM]={};
752 pid_t child_pid[MAX_TASK_NUM];
753 time_t current_time;
754 int status;
755
756 if (!para) {
757 fp=fopen("err.conf", "r");
758 if (fp==NULL) {
759 perror("Error open err.conf");
760 return -1;
761 }
762
763 num=0;
764 while (!feof(fp)) {
765 char buf[256];
766 memset(buf,0,256);
767 fgets(buf, 256, fp);
768 count=sscanf(buf, "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx\n",
769 &cpu, &loop, &interval,&err_type_info_conf,
770 &err_struct_info_conf,
771 &err_data_buffer_conf[0],
772 &err_data_buffer_conf[1],
773 &err_data_buffer_conf[2]);
774 if (count!=PARA_FIELD_NUM+3) {
775 err_data_buffer_conf[0]=-1;
776 err_data_buffer_conf[1]=-1;
777 err_data_buffer_conf[2]=-1;
778 count=sscanf(buf, "%lx, %lx, %lx, %lx, %lx\n",
779 &cpu, &loop, &interval,&err_type_info_conf,
780 &err_struct_info_conf);
781 if (count!=PARA_FIELD_NUM)
782 continue;
783 }
784
785 parameters[num].cpu=cpu;
786 parameters[num].loop=loop;
787 parameters[num].interval= interval>MIN_INTERVAL
788 ?interval:MIN_INTERVAL;
789 parameters[num].err_type_info=err_type_info_conf;
790 parameters[num].err_struct_info=err_struct_info_conf;
791 memcpy(parameters[num++].err_data_buffer,
792 err_data_buffer_conf,ERR_DATA_BUFFER_SIZE*8) ;
793
794 if (num>=MAX_TASK_NUM)
795 break;
796 }
797 }
798 else {
799 parameters[0].cpu=line_para.cpu;
800 parameters[0].loop=line_para.loop;
801 parameters[0].interval= line_para.interval>MIN_INTERVAL
802 ?line_para.interval:MIN_INTERVAL;
803 parameters[0].err_type_info=line_para.err_type_info;
804 parameters[0].err_struct_info=line_para.err_struct_info;
805 memcpy(parameters[0].err_data_buffer,
806 line_para.err_data_buffer,ERR_DATA_BUFFER_SIZE*8) ;
807
808 num=1;
809 }
810
811 /* Create semaphore: If one_lock, one semaphore for all processors.
812 Otherwise, one semaphore for each processor. */
813 if (one_lock) {
814 if (create_sem(0)) {
815 printf("Can not create semaphore...exit\n");
816 free_sem(0);
817 return -1;
818 }
819 }
820 else {
821 for (i=0;i<num;i++) {
822 if (create_sem(parameters[i].cpu)) {
823 printf("Can not create semaphore for cpu%d...exit\n",i);
824 free_sem(parameters[num].cpu);
825 return -1;
826 }
827 }
828 }
829
830 /* Create a shm segment which will be used to inject/consume errors on.*/
831 if (create_shm()==-1) {
832 printf("Error to create shm...exit\n");
833 return -1;
834 }
835
836 for (i=0;i<num;i++) {
837 pid_t pid;
838
839 current_time=time(NULL);
840 log_info(parameters[i].cpu, "\nBegine at %s", ctime(&current_time));
841 log_info(parameters[i].cpu, "Configurations:\n");
842 log_info(parameters[i].cpu,"On cpu%ld: loop=%lx, interval=%lx(s)",
843 parameters[i].cpu,
844 parameters[i].loop,
845 parameters[i].interval);
846 log_info(parameters[i].cpu," err_type_info=%lx,err_struct_info=%lx\n",
847 parameters[i].err_type_info,
848 parameters[i].err_struct_info);
849
850 sprintf(path, PATH_FORMAT, (int)parameters[i].cpu);
851 err_type_info.err_type_info=parameters[i].err_type_info;
852 err_struct_info.err_struct_info=parameters[i].err_struct_info;
853 memcpy(err_data_buffer.err_data_buffer,
854 parameters[i].err_data_buffer,
855 ERR_DATA_BUFFER_SIZE*8);
856
857 pid=fork();
858 if (pid==0) {
859 unsigned long mask[MASK_SIZE];
860 int j, k;
861
862 void *va1, *va2;
863
864 /* Allocate two memory areas va1 and va2 in shm */
865 va1=shmaddr+parameters[i].cpu*PAGE_SIZE;
866 va2=shmaddr+parameters[i].cpu*PAGE_SIZE+PAGE_SIZE;
867
868 vbprintf("va1=%lx, va2=%lx\n", (u64)va1, (u64)va2);
869 memset(va1, 0x1, PAGE_SIZE);
870 memset(va2, 0x2, PAGE_SIZE);
871
872 if (empty_data_buffer(err_data_buffer.err_data_buffer))
873 /* If not specified yet, construct data buffer
874 * with va1
875 */
876 construct_data_buf(path, err_type_info,
877 err_struct_info, &err_data_buffer,va1);
878
879 for (j=0;j<MASK_SIZE;j++)
880 mask[j]=0;
881
882 cpu=parameters[i].cpu;
883 k = cpu%64;
884 j = cpu/64;
885 mask[j] = 1UL << k;
886
887 if (sched_setaffinity(0, MASK_SIZE*8, mask)==-1) {
888 perror("Error sched_setaffinity:");
889 return -1;
890 }
891
892 for (j=0; j<parameters[i].loop; j++) {
893 log_info(parameters[i].cpu,"Injection ");
894 log_info(parameters[i].cpu,"on cpu%ld: #%d/%ld ",
895
896 parameters[i].cpu,j+1, parameters[i].loop);
897
898 /* Hold the lock */
899 if (one_lock)
900 lock(0);
901 else
902 /* Hold lock on this cpu */
903 lock(parameters[i].cpu);
904
905 if ((status=err_inject(parameters[i].cpu,
906 path, err_type_info,
907 err_struct_info, err_data_buffer))
908 ==0) {
909 /* consume the error for "inject only"*/
910 memcpy(va2, va1, PAGE_SIZE);
911 memcpy(va1, va2, PAGE_SIZE);
912 log_info(parameters[i].cpu,
913 "successful\n");
914 }
915 else {
916 log_info(parameters[i].cpu,"fail:");
917 log_info(parameters[i].cpu,
918 "status=%d\n", status);
919 unlock(parameters[i].cpu);
920 break;
921 }
922 if (one_lock)
923 /* Release the lock */
924 unlock(0);
925 /* Release lock on this cpu */
926 else
927 unlock(parameters[i].cpu);
928
929 if (j < parameters[i].loop-1)
930 sleep(parameters[i].interval);
931 }
932 current_time=time(NULL);
933 log_info(parameters[i].cpu, "Done at %s", ctime(&current_time));
934 return 0;
935 }
936 else if (pid<0) {
937 perror("Error fork:");
938 continue;
939 }
940 child_pid[i]=pid;
941 }
942 for (i=0;i<num;i++)
943 waitpid(child_pid[i], NULL, 0);
944
945 if (one_lock)
946 free_sem(0);
947 else
948 for (i=0;i<num;i++)
949 free_sem(parameters[i].cpu);
950
951 printf("All done.\n");
952
953 return 0;
954 }
955
956 void help()
957 {
958 printf("err_inject_tool:\n");
959 printf("\t-q: query all capabilities. default: off\n");
960 printf("\t-m: procedure mode. 1: physical 2: virtual. default: 1\n");
961 printf("\t-i: inject errors. default: off\n");
962 printf("\t-l: one lock per cpu. default: one lock for all\n");
963 printf("\t-e: error parameters:\n");
964 printf("\t\tcpu,loop,interval,err_type_info,err_struct_info[,err_data_buffer[0],err_data_buffer[1],err_data_buffer[2]]\n");
965 printf("\t\t cpu: logical cpu number the error will be inject in.\n");
966 printf("\t\t loop: times the error will be injected.\n");
967 printf("\t\t interval: In second. every so often one error is injected.\n");
968 printf("\t\t err_type_info, err_struct_info: PAL parameters.\n");
969 printf("\t\t err_data_buffer: PAL parameter. Optional. If not present,\n");
970 printf("\t\t it's constructed by tool automatically. Be\n");
971 printf("\t\t careful to provide err_data_buffer and make\n");
972 printf("\t\t sure it's working with the environment.\n");
973 printf("\t Note:no space between error parameters.\n");
974 printf("\t default: Take error parameters from err.conf instead of command line.\n");
975 printf("\t-v: verbose. default: off\n");
976 printf("\t-h: help\n\n");
977 printf("The tool will take err.conf file as ");
978 printf("input to inject single or multiple errors ");
979 printf("on one or multiple cpus in parallel.\n");
980 }
981
982 int main(int argc, char **argv)
983 {
984 char c;
985 int do_err_inj=0;
986 int do_query_all=0;
987 int count;
988 u32 m;
989
990 /* Default one lock for all cpu's */
991 one_lock=1;
992 while ((c = getopt(argc, argv, "m:iqvhle:")) != EOF)
993 switch (c) {
994 case 'm': /* Procedure mode. 1: phys 2: virt */
995 count=sscanf(optarg, "%x", &m);
996 if (count!=1 || (m!=1 && m!=2)) {
997 printf("Wrong mode number.\n");
998 help();
999 return -1;
1000 }
1001 mode=m;
1002 break;
1003 case 'i': /* Inject errors */
1004 do_err_inj=1;
1005 break;
1006 case 'q': /* Query */
1007 do_query_all=1;
1008 break;
1009 case 'v': /* Verbose */
1010 verbose=1;
1011 break;
1012 case 'l': /* One lock per cpu */
1013 one_lock=0;
1014 break;
1015 case 'e': /* error arguments */
1016 /* Take parameters:
1017 * #cpu, loop, interval, err_type_info, err_struct_info[, err_data_buffer]
1018 * err_data_buffer is optional. Recommend not to specify
1019 * err_data_buffer. Better to use tool to generate it.
1020 */
1021 count=sscanf(optarg,
1022 "%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx\n",
1023 &line_para.cpu,
1024 &line_para.loop,
1025 &line_para.interval,
1026 &line_para.err_type_info,
1027 &line_para.err_struct_info,
1028 &line_para.err_data_buffer[0],
1029 &line_para.err_data_buffer[1],
1030 &line_para.err_data_buffer[2]);
1031 if (count!=PARA_FIELD_NUM+3) {
1032 line_para.err_data_buffer[0]=-1,
1033 line_para.err_data_buffer[1]=-1,
1034 line_para.err_data_buffer[2]=-1;
1035 count=sscanf(optarg, "%lx, %lx, %lx, %lx, %lx\n",
1036 &line_para.cpu,
1037 &line_para.loop,
1038 &line_para.interval,
1039 &line_para.err_type_info,
1040 &line_para.err_struct_info);
1041 if (count!=PARA_FIELD_NUM) {
1042 printf("Wrong error arguments.\n");
1043 help();
1044 return -1;
1045 }
1046 }
1047 para=1;
1048 break;
1049 continue;
1050 break;
1051 case 'h':
1052 help();
1053 return 0;
1054 default:
1055 break;
1056 }
1057
1058 if (do_query_all)
1059 query_all_capabilities();
1060 if (do_err_inj)
1061 err_inj();
1062
1063 if (!do_query_all && !do_err_inj)
1064 help();
1065
1066 return 0;
1067 }
Documentation/arch/ia64/features.rst+0−3
@@ -1,3 +0,0 @@
1.. SPDX-License-Identifier: GPL-2.0
2
3.. kernel-feat:: $srctree/Documentation/features ia64
Documentation/arch/ia64/fsys.rst+0−303
@@ -1,303 +0,0 @@
1===================================
2Light-weight System Calls for IA-64
3===================================
4
5 Started: 13-Jan-2003
6
7 Last update: 27-Sep-2003
8
9 David Mosberger-Tang
10 <davidm@hpl.hp.com>
11
12Using the "epc" instruction effectively introduces a new mode of
13execution to the ia64 linux kernel. We call this mode the
14"fsys-mode". To recap, the normal states of execution are:
15
16 - kernel mode:
17 Both the register stack and the memory stack have been
18 switched over to kernel memory. The user-level state is saved
19 in a pt-regs structure at the top of the kernel memory stack.
20
21 - user mode:
22 Both the register stack and the kernel stack are in
23 user memory. The user-level state is contained in the
24 CPU registers.
25
26 - bank 0 interruption-handling mode:
27 This is the non-interruptible state which all
28 interruption-handlers start execution in. The user-level
29 state remains in the CPU registers and some kernel state may
30 be stored in bank 0 of registers r16-r31.
31
32In contrast, fsys-mode has the following special properties:
33
34 - execution is at privilege level 0 (most-privileged)
35
36 - CPU registers may contain a mixture of user-level and kernel-level
37 state (it is the responsibility of the kernel to ensure that no
38 security-sensitive kernel-level state is leaked back to
39 user-level)
40
41 - execution is interruptible and preemptible (an fsys-mode handler
42 can disable interrupts and avoid all other interruption-sources
43 to avoid preemption)
44
45 - neither the memory-stack nor the register-stack can be trusted while
46 in fsys-mode (they point to the user-level stacks, which may
47 be invalid, or completely bogus addresses)
48
49In summary, fsys-mode is much more similar to running in user-mode
50than it is to running in kernel-mode. Of course, given that the
51privilege level is at level 0, this means that fsys-mode requires some
52care (see below).
53
54
55How to tell fsys-mode
56=====================
57
58Linux operates in fsys-mode when (a) the privilege level is 0 (most
59privileged) and (b) the stacks have NOT been switched to kernel memory
60yet. For convenience, the header file <asm-ia64/ptrace.h> provides
61three macros::
62
63 user_mode(regs)
64 user_stack(task,regs)
65 fsys_mode(task,regs)
66
67The "regs" argument is a pointer to a pt_regs structure. The "task"
68argument is a pointer to the task structure to which the "regs"
69pointer belongs to. user_mode() returns TRUE if the CPU state pointed
70to by "regs" was executing in user mode (privilege level 3).
71user_stack() returns TRUE if the state pointed to by "regs" was
72executing on the user-level stack(s). Finally, fsys_mode() returns
73TRUE if the CPU state pointed to by "regs" was executing in fsys-mode.
74The fsys_mode() macro is equivalent to the expression::
75
76 !user_mode(regs) && user_stack(task,regs)
77
78How to write an fsyscall handler
79================================
80
81The file arch/ia64/kernel/fsys.S contains a table of fsyscall-handlers
82(fsyscall_table). This table contains one entry for each system call.
83By default, a system call is handled by fsys_fallback_syscall(). This
84routine takes care of entering (full) kernel mode and calling the
85normal Linux system call handler. For performance-critical system
86calls, it is possible to write a hand-tuned fsyscall_handler. For
87example, fsys.S contains fsys_getpid(), which is a hand-tuned version
88of the getpid() system call.
89
90The entry and exit-state of an fsyscall handler is as follows:
91
92Machine state on entry to fsyscall handler
93------------------------------------------
94
95 ========= ===============================================================
96 r10 0
97 r11 saved ar.pfs (a user-level value)
98 r15 system call number
99 r16 "current" task pointer (in normal kernel-mode, this is in r13)
100 r32-r39 system call arguments
101 b6 return address (a user-level value)
102 ar.pfs previous frame-state (a user-level value)
103 PSR.be cleared to zero (i.e., little-endian byte order is in effect)
104 - all other registers may contain values passed in from user-mode
105 ========= ===============================================================
106
107Required machine state on exit to fsyscall handler
108--------------------------------------------------
109
110 ========= ===========================================================
111 r11 saved ar.pfs (as passed into the fsyscall handler)
112 r15 system call number (as passed into the fsyscall handler)
113 r32-r39 system call arguments (as passed into the fsyscall handler)
114 b6 return address (as passed into the fsyscall handler)
115 ar.pfs previous frame-state (as passed into the fsyscall handler)
116 ========= ===========================================================
117
118Fsyscall handlers can execute with very little overhead, but with that
119speed comes a set of restrictions:
120
121 * Fsyscall-handlers MUST check for any pending work in the flags
122 member of the thread-info structure and if any of the
123 TIF_ALLWORK_MASK flags are set, the handler needs to fall back on
124 doing a full system call (by calling fsys_fallback_syscall).
125
126 * Fsyscall-handlers MUST preserve incoming arguments (r32-r39, r11,
127 r15, b6, and ar.pfs) because they will be needed in case of a
128 system call restart. Of course, all "preserved" registers also
129 must be preserved, in accordance to the normal calling conventions.
130
131 * Fsyscall-handlers MUST check argument registers for containing a
132 NaT value before using them in any way that could trigger a
133 NaT-consumption fault. If a system call argument is found to
134 contain a NaT value, an fsyscall-handler may return immediately
135 with r8=EINVAL, r10=-1.
136
137 * Fsyscall-handlers MUST NOT use the "alloc" instruction or perform
138 any other operation that would trigger mandatory RSE
139 (register-stack engine) traffic.
140
141 * Fsyscall-handlers MUST NOT write to any stacked registers because
142 it is not safe to assume that user-level called a handler with the
143 proper number of arguments.
144
145 * Fsyscall-handlers need to be careful when accessing per-CPU variables:
146 unless proper safe-guards are taken (e.g., interruptions are avoided),
147 execution may be pre-empted and resumed on another CPU at any given
148 time.
149
150 * Fsyscall-handlers must be careful not to leak sensitive kernel'
151 information back to user-level. In particular, before returning to
152 user-level, care needs to be taken to clear any scratch registers
153 that could contain sensitive information (note that the current
154 task pointer is not considered sensitive: it's already exposed
155 through ar.k6).
156
157 * Fsyscall-handlers MUST NOT access user-memory without first
158 validating access-permission (this can be done typically via
159 probe.r.fault and/or probe.w.fault) and without guarding against
160 memory access exceptions (this can be done with the EX() macros
161 defined by asmmacro.h).
162
163The above restrictions may seem draconian, but remember that it's
164possible to trade off some of the restrictions by paying a slightly
165higher overhead. For example, if an fsyscall-handler could benefit
166from the shadow register bank, it could temporarily disable PSR.i and
167PSR.ic, switch to bank 0 (bsw.0) and then use the shadow registers as
168needed. In other words, following the above rules yields extremely
169fast system call execution (while fully preserving system call
170semantics), but there is also a lot of flexibility in handling more
171complicated cases.
172
173Signal handling
174===============
175
176The delivery of (asynchronous) signals must be delayed until fsys-mode
177is exited. This is accomplished with the help of the lower-privilege
178transfer trap: arch/ia64/kernel/process.c:do_notify_resume_user()
179checks whether the interrupted task was in fsys-mode and, if so, sets
180PSR.lp and returns immediately. When fsys-mode is exited via the
181"br.ret" instruction that lowers the privilege level, a trap will
182occur. The trap handler clears PSR.lp again and returns immediately.
183The kernel exit path then checks for and delivers any pending signals.
184
185PSR Handling
186============
187
188The "epc" instruction doesn't change the contents of PSR at all. This
189is in contrast to a regular interruption, which clears almost all
190bits. Because of that, some care needs to be taken to ensure things
191work as expected. The following discussion describes how each PSR bit
192is handled.
193
194======= =======================================================================
195PSR.be Cleared when entering fsys-mode. A srlz.d instruction is used
196 to ensure the CPU is in little-endian mode before the first
197 load/store instruction is executed. PSR.be is normally NOT
198 restored upon return from an fsys-mode handler. In other
199 words, user-level code must not rely on PSR.be being preserved
200 across a system call.
201PSR.up Unchanged.
202PSR.ac Unchanged.
203PSR.mfl Unchanged. Note: fsys-mode handlers must not write-registers!
204PSR.mfh Unchanged. Note: fsys-mode handlers must not write-registers!
205PSR.ic Unchanged. Note: fsys-mode handlers can clear the bit, if needed.
206PSR.i Unchanged. Note: fsys-mode handlers can clear the bit, if needed.
207PSR.pk Unchanged.
208PSR.dt Unchanged.
209PSR.dfl Unchanged. Note: fsys-mode handlers must not write-registers!
210PSR.dfh Unchanged. Note: fsys-mode handlers must not write-registers!
211PSR.sp Unchanged.
212PSR.pp Unchanged.
213PSR.di Unchanged.
214PSR.si Unchanged.
215PSR.db Unchanged. The kernel prevents user-level from setting a hardware
216 breakpoint that triggers at any privilege level other than
217 3 (user-mode).
218PSR.lp Unchanged.
219PSR.tb Lazy redirect. If a taken-branch trap occurs while in
220 fsys-mode, the trap-handler modifies the saved machine state
221 such that execution resumes in the gate page at
222 syscall_via_break(), with privilege level 3. Note: the
223 taken branch would occur on the branch invoking the
224 fsyscall-handler, at which point, by definition, a syscall
225 restart is still safe. If the system call number is invalid,
226 the fsys-mode handler will return directly to user-level. This
227 return will trigger a taken-branch trap, but since the trap is
228 taken _after_ restoring the privilege level, the CPU has already
229 left fsys-mode, so no special treatment is needed.
230PSR.rt Unchanged.
231PSR.cpl Cleared to 0.
232PSR.is Unchanged (guaranteed to be 0 on entry to the gate page).
233PSR.mc Unchanged.
234PSR.it Unchanged (guaranteed to be 1).
235PSR.id Unchanged. Note: the ia64 linux kernel never sets this bit.
236PSR.da Unchanged. Note: the ia64 linux kernel never sets this bit.
237PSR.dd Unchanged. Note: the ia64 linux kernel never sets this bit.
238PSR.ss Lazy redirect. If set, "epc" will cause a Single Step Trap to
239 be taken. The trap handler then modifies the saved machine
240 state such that execution resumes in the gate page at
241 syscall_via_break(), with privilege level 3.
242PSR.ri Unchanged.
243PSR.ed Unchanged. Note: This bit could only have an effect if an fsys-mode
244 handler performed a speculative load that gets NaTted. If so, this
245 would be the normal & expected behavior, so no special treatment is
246 needed.
247PSR.bn Unchanged. Note: fsys-mode handlers may clear the bit, if needed.
248 Doing so requires clearing PSR.i and PSR.ic as well.
249PSR.ia Unchanged. Note: the ia64 linux kernel never sets this bit.
250======= =======================================================================
251
252Using fast system calls
253=======================
254
255To use fast system calls, userspace applications need simply call
256__kernel_syscall_via_epc(). For example
257
258-- example fgettimeofday() call --
259
260-- fgettimeofday.S --
261
262::
263
264 #include <asm/asmmacro.h>
265
266 GLOBAL_ENTRY(fgettimeofday)
267 .prologue
268 .save ar.pfs, r11
269 mov r11 = ar.pfs
270 .body
271
272 mov r2 = 0xa000000000020660;; // gate address
273 // found by inspection of System.map for the
274 // __kernel_syscall_via_epc() function. See
275 // below for how to do this for real.
276
277 mov b7 = r2
278 mov r15 = 1087 // gettimeofday syscall
279 ;;
280 br.call.sptk.many b6 = b7
281 ;;
282
283 .restore sp
284
285 mov ar.pfs = r11
286 br.ret.sptk.many rp;; // return to caller
287 END(fgettimeofday)
288
289-- end fgettimeofday.S --
290
291In reality, getting the gate address is accomplished by two extra
292values passed via the ELF auxiliary vector (include/asm-ia64/elf.h)
293
294 * AT_SYSINFO : is the address of __kernel_syscall_via_epc()
295 * AT_SYSINFO_EHDR : is the address of the kernel gate ELF DSO
296
297The ELF DSO is a pre-linked library that is mapped in by the kernel at
298the gate page. It is a proper ELF shared object so, with a dynamic
299loader that recognises the library, you should be able to make calls to
300the exported functions within it as with any other shared library.
301AT_SYSINFO points into the kernel DSO at the
302__kernel_syscall_via_epc() function for historical reasons (it was
303used before the kernel DSO) and as a convenience.
Documentation/arch/ia64/ia64.rst+0−49
@@ -1,49 +0,0 @@
1===========================================
2Linux kernel release for the IA-64 Platform
3===========================================
4
5 These are the release notes for Linux since version 2.4 for IA-64
6 platform. This document provides information specific to IA-64
7 ONLY, to get additional information about the Linux kernel also
8 read the original Linux README provided with the kernel.
9
10Installing the Kernel
11=====================
12
13 - IA-64 kernel installation is the same as the other platforms, see
14 original README for details.
15
16
17Software Requirements
18=====================
19
20 Compiling and running this kernel requires an IA-64 compliant GCC
21 compiler. And various software packages also compiled with an
22 IA-64 compliant GCC compiler.
23
24
25Configuring the Kernel
26======================
27
28 Configuration is the same, see original README for details.
29
30
31Compiling the Kernel:
32
33 - Compiling this kernel doesn't differ from other platform so read
34 the original README for details BUT make sure you have an IA-64
35 compliant GCC compiler.
36
37IA-64 Specifics
38===============
39
40 - General issues:
41
42 * Hardly any performance tuning has been done. Obvious targets
43 include the library routines (IP checksum, etc.). Less
44 obvious targets include making sure we don't flush the TLB
45 needlessly, etc.
46
47 * SMP locks cleanup/optimization
48
49 * IA32 support. Currently experimental. It mostly works.
Documentation/arch/ia64/index.rst+0−19
@@ -1,19 +0,0 @@
1.. SPDX-License-Identifier: GPL-2.0
2
3==================
4IA-64 Architecture
5==================
6
7.. toctree::
8 :maxdepth: 1
9
10 ia64
11 aliasing
12 efirtc
13 err_inject
14 fsys
15 irq-redir
16 mca
17 serial
18
19 features
Documentation/arch/ia64/irq-redir.rst+0−80
@@ -1,80 +0,0 @@
1==============================
2IRQ affinity on IA64 platforms
3==============================
4
507.01.2002, Erich Focht <efocht@ess.nec.de>
6
7
8By writing to /proc/irq/IRQ#/smp_affinity the interrupt routing can be
9controlled. The behavior on IA64 platforms is slightly different from
10that described in Documentation/core-api/irq/irq-affinity.rst for i386 systems.
11
12Because of the usage of SAPIC mode and physical destination mode the
13IRQ target is one particular CPU and cannot be a mask of several
14CPUs. Only the first non-zero bit is taken into account.
15
16
17Usage examples
18==============
19
20The target CPU has to be specified as a hexadecimal CPU mask. The
21first non-zero bit is the selected CPU. This format has been kept for
22compatibility reasons with i386.
23
24Set the delivery mode of interrupt 41 to fixed and route the
25interrupts to CPU #3 (logical CPU number) (2^3=0x08)::
26
27 echo "8" >/proc/irq/41/smp_affinity
28
29Set the default route for IRQ number 41 to CPU 6 in lowest priority
30delivery mode (redirectable)::
31
32 echo "r 40" >/proc/irq/41/smp_affinity
33
34The output of the command::
35
36 cat /proc/irq/IRQ#/smp_affinity
37
38gives the target CPU mask for the specified interrupt vector. If the CPU
39mask is preceded by the character "r", the interrupt is redirectable
40(i.e. lowest priority mode routing is used), otherwise its route is
41fixed.
42
43
44
45Initialization and default behavior
46===================================
47
48If the platform features IRQ redirection (info provided by SAL) all
49IO-SAPIC interrupts are initialized with CPU#0 as their default target
50and the routing is the so called "lowest priority mode" (actually
51fixed SAPIC mode with hint). The XTP chipset registers are used as hints
52for the IRQ routing. Currently in Linux XTP registers can have three
53values:
54
55 - minimal for an idle task,
56 - normal if any other task runs,
57 - maximal if the CPU is going to be switched off.
58
59The IRQ is routed to the CPU with lowest XTP register value, the
60search begins at the default CPU. Therefore most of the interrupts
61will be handled by CPU #0.
62
63If the platform doesn't feature interrupt redirection IOSAPIC fixed
64routing is used. The target CPUs are distributed in a round robin
65manner. IRQs will be routed only to the selected target CPUs. Check
66with::
67
68 cat /proc/interrupts
69
70
71
72Comments
73========
74
75On large (multi-node) systems it is recommended to route the IRQs to
76the node to which the corresponding device is connected.
77For systems like the NEC AzusA we get IRQ node-affinity for free. This
78is because usually the chipsets on each node redirect the interrupts
79only to their own CPUs (as they cannot see the XTP registers on the
80other nodes).
Documentation/arch/ia64/mca.rst+0−198
@@ -1,198 +0,0 @@
1=============================================================
2An ad-hoc collection of notes on IA64 MCA and INIT processing
3=============================================================
4
5Feel free to update it with notes about any area that is not clear.
6
7---
8
9MCA/INIT are completely asynchronous. They can occur at any time, when
10the OS is in any state. Including when one of the cpus is already
11holding a spinlock. Trying to get any lock from MCA/INIT state is
12asking for deadlock. Also the state of structures that are protected
13by locks is indeterminate, including linked lists.
14
15---
16
17The complicated ia64 MCA process. All of this is mandated by Intel's
18specification for ia64 SAL, error recovery and unwind, it is not as
19if we have a choice here.
20
21* MCA occurs on one cpu, usually due to a double bit memory error.
22 This is the monarch cpu.
23
24* SAL sends an MCA rendezvous interrupt (which is a normal interrupt)
25 to all the other cpus, the slaves.
26
27* Slave cpus that receive the MCA interrupt call down into SAL, they
28 end up spinning disabled while the MCA is being serviced.
29
30* If any slave cpu was already spinning disabled when the MCA occurred
31 then it cannot service the MCA interrupt. SAL waits ~20 seconds then
32 sends an unmaskable INIT event to the slave cpus that have not
33 already rendezvoused.
34
35* Because MCA/INIT can be delivered at any time, including when the cpu
36 is down in PAL in physical mode, the registers at the time of the
37 event are _completely_ undefined. In particular the MCA/INIT
38 handlers cannot rely on the thread pointer, PAL physical mode can
39 (and does) modify TP. It is allowed to do that as long as it resets
40 TP on return. However MCA/INIT events expose us to these PAL
41 internal TP changes. Hence curr_task().
42
43* If an MCA/INIT event occurs while the kernel was running (not user
44 space) and the kernel has called PAL then the MCA/INIT handler cannot
45 assume that the kernel stack is in a fit state to be used. Mainly
46 because PAL may or may not maintain the stack pointer internally.
47 Because the MCA/INIT handlers cannot trust the kernel stack, they
48 have to use their own, per-cpu stacks. The MCA/INIT stacks are
49 preformatted with just enough task state to let the relevant handlers
50 do their job.
51
52* Unlike most other architectures, the ia64 struct task is embedded in
53 the kernel stack[1]. So switching to a new kernel stack means that
54 we switch to a new task as well. Because various bits of the kernel
55 assume that current points into the struct task, switching to a new
56 stack also means a new value for current.
57
58* Once all slaves have rendezvoused and are spinning disabled, the
59 monarch is entered. The monarch now tries to diagnose the problem
60 and decide if it can recover or not.
61
62* Part of the monarch's job is to look at the state of all the other
63 tasks. The only way to do that on ia64 is to call the unwinder,
64 as mandated by Intel.
65
66* The starting point for the unwind depends on whether a task is
67 running or not. That is, whether it is on a cpu or is blocked. The
68 monarch has to determine whether or not a task is on a cpu before it
69 knows how to start unwinding it. The tasks that received an MCA or
70 INIT event are no longer running, they have been converted to blocked
71 tasks. But (and its a big but), the cpus that received the MCA
72 rendezvous interrupt are still running on their normal kernel stacks!
73
74* To distinguish between these two cases, the monarch must know which
75 tasks are on a cpu and which are not. Hence each slave cpu that
76 switches to an MCA/INIT stack, registers its new stack using
77 set_curr_task(), so the monarch can tell that the _original_ task is
78 no longer running on that cpu. That gives us a decent chance of
79 getting a valid backtrace of the _original_ task.
80
81* MCA/INIT can be nested, to a depth of 2 on any cpu. In the case of a
82 nested error, we want diagnostics on the MCA/INIT handler that
83 failed, not on the task that was originally running. Again this
84 requires set_curr_task() so the MCA/INIT handlers can register their
85 own stack as running on that cpu. Then a recursive error gets a
86 trace of the failing handler's "task".
87
88[1]
89 My (Keith Owens) original design called for ia64 to separate its
90 struct task and the kernel stacks. Then the MCA/INIT data would be
91 chained stacks like i386 interrupt stacks. But that required
92 radical surgery on the rest of ia64, plus extra hard wired TLB
93 entries with its associated performance degradation. David
94 Mosberger vetoed that approach. Which meant that separate kernel
95 stacks meant separate "tasks" for the MCA/INIT handlers.
96
97---
98
99INIT is less complicated than MCA. Pressing the nmi button or using
100the equivalent command on the management console sends INIT to all
101cpus. SAL picks one of the cpus as the monarch and the rest are
102slaves. All the OS INIT handlers are entered at approximately the same
103time. The OS monarch prints the state of all tasks and returns, after
104which the slaves return and the system resumes.
105
106At least that is what is supposed to happen. Alas there are broken
107versions of SAL out there. Some drive all the cpus as monarchs. Some
108drive them all as slaves. Some drive one cpu as monarch, wait for that
109cpu to return from the OS then drive the rest as slaves. Some versions
110of SAL cannot even cope with returning from the OS, they spin inside
111SAL on resume. The OS INIT code has workarounds for some of these
112broken SAL symptoms, but some simply cannot be fixed from the OS side.
113
114---
115
116The scheduler hooks used by ia64 (curr_task, set_curr_task) are layer
117violations. Unfortunately MCA/INIT start off as massive layer
118violations (can occur at _any_ time) and they build from there.
119
120At least ia64 makes an attempt at recovering from hardware errors, but
121it is a difficult problem because of the asynchronous nature of these
122errors. When processing an unmaskable interrupt we sometimes need
123special code to cope with our inability to take any locks.
124
125---
126
127How is ia64 MCA/INIT different from x86 NMI?
128
129* x86 NMI typically gets delivered to one cpu. MCA/INIT gets sent to
130 all cpus.
131
132* x86 NMI cannot be nested. MCA/INIT can be nested, to a depth of 2
133 per cpu.
134
135* x86 has a separate struct task which points to one of multiple kernel
136 stacks. ia64 has the struct task embedded in the single kernel
137 stack, so switching stack means switching task.
138
139* x86 does not call the BIOS so the NMI handler does not have to worry
140 about any registers having changed. MCA/INIT can occur while the cpu
141 is in PAL in physical mode, with undefined registers and an undefined
142 kernel stack.
143
144* i386 backtrace is not very sensitive to whether a process is running
145 or not. ia64 unwind is very, very sensitive to whether a process is
146 running or not.
147
148---
149
150What happens when MCA/INIT is delivered what a cpu is running user
151space code?
152
153The user mode registers are stored in the RSE area of the MCA/INIT on
154entry to the OS and are restored from there on return to SAL, so user
155mode registers are preserved across a recoverable MCA/INIT. Since the
156OS has no idea what unwind data is available for the user space stack,
157MCA/INIT never tries to backtrace user space. Which means that the OS
158does not bother making the user space process look like a blocked task,
159i.e. the OS does not copy pt_regs and switch_stack to the user space
160stack. Also the OS has no idea how big the user space RSE and memory
161stacks are, which makes it too risky to copy the saved state to a user
162mode stack.
163
164---
165
166How do we get a backtrace on the tasks that were running when MCA/INIT
167was delivered?
168
169mca.c:::ia64_mca_modify_original_stack(). That identifies and
170verifies the original kernel stack, copies the dirty registers from
171the MCA/INIT stack's RSE to the original stack's RSE, copies the
172skeleton struct pt_regs and switch_stack to the original stack, fills
173in the skeleton structures from the PAL minstate area and updates the
174original stack's thread.ksp. That makes the original stack look
175exactly like any other blocked task, i.e. it now appears to be
176sleeping. To get a backtrace, just start with thread.ksp for the
177original task and unwind like any other sleeping task.
178
179---
180
181How do we identify the tasks that were running when MCA/INIT was
182delivered?
183
184If the previous task has been verified and converted to a blocked
185state, then sos->prev_task on the MCA/INIT stack is updated to point to
186the previous task. You can look at that field in dumps or debuggers.
187To help distinguish between the handler and the original tasks,
188handlers have _TIF_MCA_INIT set in thread_info.flags.
189
190The sos data is always in the MCA/INIT handler stack, at offset
191MCA_SOS_OFFSET. You can get that value from mca_asm.h or calculate it
192as KERNEL_STACK_SIZE - sizeof(struct pt_regs) - sizeof(struct
193ia64_sal_os_state), with 16 byte alignment for all structures.
194
195Also the comm field of the MCA/INIT task is modified to include the pid
196of the original task, for humans to use. For example, a comm field of
197'MCA 12159' means that pid 12159 was running when the MCA was
198delivered.
Documentation/arch/ia64/serial.rst+0−165
@@ -1,165 +0,0 @@
1==============
2Serial Devices
3==============
4
5Serial Device Naming
6====================
7
8 As of 2.6.10, serial devices on ia64 are named based on the
9 order of ACPI and PCI enumeration. The first device in the
10 ACPI namespace (if any) becomes /dev/ttyS0, the second becomes
11 /dev/ttyS1, etc., and PCI devices are named sequentially
12 starting after the ACPI devices.
13
14 Prior to 2.6.10, there were confusing exceptions to this:
15
16 - Firmware on some machines (mostly from HP) provides an HCDP
17 table[1] that tells the kernel about devices that can be used
18 as a serial console. If the user specified "console=ttyS0"
19 or the EFI ConOut path contained only UART devices, the
20 kernel registered the device described by the HCDP as
21 /dev/ttyS0.
22
23 - If there was no HCDP, we assumed there were UARTs at the
24 legacy COM port addresses (I/O ports 0x3f8 and 0x2f8), so
25 the kernel registered those as /dev/ttyS0 and /dev/ttyS1.
26
27 Any additional ACPI or PCI devices were registered sequentially
28 after /dev/ttyS0 as they were discovered.
29
30 With an HCDP, device names changed depending on EFI configuration
31 and "console=" arguments. Without an HCDP, device names didn't
32 change, but we registered devices that might not really exist.
33
34 For example, an HP rx1600 with a single built-in serial port
35 (described in the ACPI namespace) plus an MP[2] (a PCI device) has
36 these ports:
37
38 ========== ========== ============ ============ =======
39 Type MMIO pre-2.6.10 pre-2.6.10 2.6.10+
40 address
41 (EFI console (EFI console
42 on builtin) on MP port)
43 ========== ========== ============ ============ =======
44 builtin 0xff5e0000 ttyS0 ttyS1 ttyS0
45 MP UPS 0xf8031000 ttyS1 ttyS2 ttyS1
46 MP Console 0xf8030000 ttyS2 ttyS0 ttyS2
47 MP 2 0xf8030010 ttyS3 ttyS3 ttyS3
48 MP 3 0xf8030038 ttyS4 ttyS4 ttyS4
49 ========== ========== ============ ============ =======
50
51Console Selection
52=================
53
54 EFI knows what your console devices are, but it doesn't tell the
55 kernel quite enough to actually locate them. The DIG64 HCDP
56 table[1] does tell the kernel where potential serial console
57 devices are, but not all firmware supplies it. Also, EFI supports
58 multiple simultaneous consoles and doesn't tell the kernel which
59 should be the "primary" one.
60
61 So how do you tell Linux which console device to use?
62
63 - If your firmware supplies the HCDP, it is simplest to
64 configure EFI with a single device (either a UART or a VGA
65 card) as the console. Then you don't need to tell Linux
66 anything; the kernel will automatically use the EFI console.
67
68 (This works only in 2.6.6 or later; prior to that you had
69 to specify "console=ttyS0" to get a serial console.)
70
71 - Without an HCDP, Linux defaults to a VGA console unless you
72 specify a "console=" argument.
73
74 NOTE: Don't assume that a serial console device will be /dev/ttyS0.
75 It might be ttyS1, ttyS2, etc. Make sure you have the appropriate
76 entries in /etc/inittab (for getty) and /etc/securetty (to allow
77 root login).
78
79Early Serial Console
80====================
81
82 The kernel can't start using a serial console until it knows where
83 the device lives. Normally this happens when the driver enumerates
84 all the serial devices, which can happen a minute or more after the
85 kernel starts booting.
86
87 2.6.10 and later kernels have an "early uart" driver that works
88 very early in the boot process. The kernel will automatically use
89 this if the user supplies an argument like "console=uart,io,0x3f8",
90 or if the EFI console path contains only a UART device and the
91 firmware supplies an HCDP.
92
93Troubleshooting Serial Console Problems
94=======================================
95
96 No kernel output after elilo prints "Uncompressing Linux... done":
97
98 - You specified "console=ttyS0" but Linux changed the device
99 to which ttyS0 refers. Configure exactly one EFI console
100 device[3] and remove the "console=" option.
101
102 - The EFI console path contains both a VGA device and a UART.
103 EFI and elilo use both, but Linux defaults to VGA. Remove
104 the VGA device from the EFI console path[3].
105
106 - Multiple UARTs selected as EFI console devices. EFI and
107 elilo use all selected devices, but Linux uses only one.
108 Make sure only one UART is selected in the EFI console
109 path[3].
110
111 - You're connected to an HP MP port[2] but have a non-MP UART
112 selected as EFI console device. EFI uses the MP as a
113 console device even when it isn't explicitly selected.
114 Either move the console cable to the non-MP UART, or change
115 the EFI console path[3] to the MP UART.
116
117 Long pause (60+ seconds) between "Uncompressing Linux... done" and
118 start of kernel output:
119
120 - No early console because you used "console=ttyS<n>". Remove
121 the "console=" option if your firmware supplies an HCDP.
122
123 - If you don't have an HCDP, the kernel doesn't know where
124 your console lives until the driver discovers serial
125 devices. Use "console=uart,io,0x3f8" (or appropriate
126 address for your machine).
127
128 Kernel and init script output works fine, but no "login:" prompt:
129
130 - Add getty entry to /etc/inittab for console tty. Look for
131 the "Adding console on ttyS<n>" message that tells you which
132 device is the console.
133
134 "login:" prompt, but can't login as root:
135
136 - Add entry to /etc/securetty for console tty.
137
138 No ACPI serial devices found in 2.6.17 or later:
139
140 - Turn on CONFIG_PNP and CONFIG_PNPACPI. Prior to 2.6.17, ACPI
141 serial devices were discovered by 8250_acpi. In 2.6.17,
142 8250_acpi was replaced by the combination of 8250_pnp and
143 CONFIG_PNPACPI.
144
145
146
147[1]
148 http://www.dig64.org/specifications/agreement
149 The table was originally defined as the "HCDP" for "Headless
150 Console/Debug Port." The current version is the "PCDP" for
151 "Primary Console and Debug Port Devices."
152
153[2]
154 The HP MP (management processor) is a PCI device that provides
155 several UARTs. One of the UARTs is often used as a console; the
156 EFI Boot Manager identifies it as "Acpi(HWP0002,700)/Pci(...)/Uart".
157 The external connection is usually a 25-pin connector, and a
158 special dongle converts that to three 9-pin connectors, one of
159 which is labelled "Console."
160
161[3]
162 EFI console devices are configured using the EFI Boot Manager
163 "Boot option maintenance" menu. You may have to interrupt the
164 boot sequence to use this menu, and you will have to reset the
165 box after changing console configuration.
Documentation/arch/index.rst+0−1
@@ -12,7 +12,6 @@ implementation. · 11 unmodified lines
12 arc/index12 arc/index
13 arm/index13 arm/index
14 arm64/index14 arm64/index
15 ia64/index
16 loongarch/index15 loongarch/index
17 m68k/index16 m68k/index
18 mips/index17 mips/index
Documentation/block/ioprio.rst+0−3
@@ -80,9 +80,6 @@ ionice.c tool:: · 79 unmodified lines
80 #elif defined(__x86_64__)80 #elif defined(__x86_64__)
81 #define __NR_ioprio_set 25181 #define __NR_ioprio_set 251
82 #define __NR_ioprio_get 25282 #define __NR_ioprio_get 252
83 #elif defined(__ia64__)
84 #define __NR_ioprio_set 1274
85 #define __NR_ioprio_get 1275
86 #else83 #else
87 #error "Unsupported arch"84 #error "Unsupported arch"
88 #endif85 #endif
Documentation/core-api/cpu_hotplug.rst+0−6
@@ -40,12 +40,6 @@ Command Line Switches · 39 unmodified lines
40 supplied here is lower than the number of physically available CPUs, then40 supplied here is lower than the number of physically available CPUs, then
41 those CPUs can not be brought online later.41 those CPUs can not be brought online later.
42 42
43``additional_cpus=n``
44 Use this to limit hotpluggable CPUs. This option sets
45 ``cpu_possible_mask = cpu_present_mask + additional_cpus``
46
47 This option is limited to the IA64 architecture.
48
49``possible_cpus=n``43``possible_cpus=n``
50 This option sets ``possible_cpus`` bits in ``cpu_possible_mask``.44 This option sets ``possible_cpus`` bits in ``cpu_possible_mask``.
51 45
Documentation/core-api/debugging-via-ohci1394.rst+3−3
@@ -23,9 +23,9 @@ Retrieving a full system memory dump is also possible over the FireWire, · 22 unmodified lines
23using data transfer rates in the order of 10MB/s or more.23using data transfer rates in the order of 10MB/s or more.
24 24
25With most FireWire controllers, memory access is limited to the low 4 GB25With most FireWire controllers, memory access is limited to the low 4 GB
26of physical address space. This can be a problem on IA64 machines where26of physical address space. This can be a problem on machines where memory is
27memory is located mostly above that limit, but it is rarely a problem on27located mostly above that limit, but it is rarely a problem on more common
28more common hardware such as x86, x86-64 and PowerPC.28hardware such as x86, x86-64 and PowerPC.
29 29
30At least LSI FW643e and FW643e2 controllers are known to support access to30At least LSI FW643e and FW643e2 controllers are known to support access to
31physical addresses above 4 GB, but this feature is currently not enabled by31physical addresses above 4 GB, but this feature is currently not enabled by
Documentation/features/core/cBPF-JIT/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | TODO |12 | arm64: | TODO |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/core/eBPF-JIT/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/core/generic-idle-thread/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | ok |14 | hexagon: | ok |
15 | ia64: | ok |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/core/jump-labels/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/core/thread-info-in-task/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/core/tracehook/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | ok |14 | hexagon: | ok |
15 | ia64: | ok |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/KASAN/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/debug-vm-pgtable/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/gcov-profile-all/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | ok |17 | microblaze: | ok |
Documentation/features/debug/kcov/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/kgdb/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | ok |14 | hexagon: | ok |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | ok |17 | microblaze: | ok |
Documentation/features/debug/kmemleak/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | ok |17 | microblaze: | ok |
Documentation/features/debug/kprobes-on-ftrace/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | TODO |12 | arm64: | TODO |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/kprobes/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | ok |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/kretprobes/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | ok |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/optprobes/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | TODO |12 | arm64: | TODO |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/stackprotector/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/uprobes/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/debug/user-ret-profiler/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | TODO |12 | arm64: | TODO |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/io/dma-contiguous/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | ok |17 | microblaze: | ok |
Documentation/features/locking/cmpxchg-local/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/locking/lockdep/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | ok |14 | hexagon: | ok |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | ok |17 | microblaze: | ok |
Documentation/features/locking/queued-rwlocks/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/locking/queued-spinlocks/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/perf/kprobes-event/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | ok |14 | hexagon: | ok |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/perf/perf-regs/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/perf/perf-stackdump/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/sched/membarrier-sync-core/arch-support.txt+0−1
@@ -35,7 +35,6 @@ · 34 unmodified lines
35 | arm64: | ok |35 | arm64: | ok |
36 | csky: | TODO |36 | csky: | TODO |
37 | hexagon: | TODO |37 | hexagon: | TODO |
38 | ia64: | TODO |
39 | loongarch: | TODO |38 | loongarch: | TODO |
40 | m68k: | TODO |39 | m68k: | TODO |
41 | microblaze: | TODO |40 | microblaze: | TODO |
Documentation/features/sched/numa-balancing/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | .. |13 | csky: | .. |
14 | hexagon: | .. |14 | hexagon: | .. |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | .. |16 | m68k: | .. |
18 | microblaze: | .. |17 | microblaze: | .. |
Documentation/features/seccomp/seccomp-filter/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | ok |16 | m68k: | ok |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/time/arch-tick-broadcast/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/time/clockevents/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | ok |14 | hexagon: | ok |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | ok |17 | microblaze: | ok |
Documentation/features/time/context-tracking/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/time/irq-time-acct/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | .. |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/time/virt-cpuacct/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | ok |13 | csky: | ok |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | ok |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/vm/ELF-ASLR/arch-support.txt+0−1
@@ -13,7 +13,6 @@ · 12 unmodified lines
13 | arm64: | ok |13 | arm64: | ok |
14 | csky: | ok |14 | csky: | ok |
15 | hexagon: | TODO |15 | hexagon: | TODO |
16 | ia64: | TODO |
17 | loongarch: | ok |16 | loongarch: | ok |
18 | m68k: | TODO |17 | m68k: | TODO |
19 | microblaze: | TODO |18 | microblaze: | TODO |
Documentation/features/vm/PG_uncached/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | TODO |12 | arm64: | TODO |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | ok |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/vm/THP/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | .. |13 | csky: | .. |
14 | hexagon: | .. |14 | hexagon: | .. |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | .. |16 | m68k: | .. |
18 | microblaze: | .. |17 | microblaze: | .. |
Documentation/features/vm/TLB/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | .. |16 | m68k: | .. |
18 | microblaze: | .. |17 | microblaze: | .. |
Documentation/features/vm/huge-vmap/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | TODO |15 | loongarch: | TODO |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/vm/ioremap_prot/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/features/vm/pte_special/arch-support.txt+0−1
@@ -12,7 +12,6 @@ · 11 unmodified lines
12 | arm64: | ok |12 | arm64: | ok |
13 | csky: | TODO |13 | csky: | TODO |
14 | hexagon: | TODO |14 | hexagon: | TODO |
15 | ia64: | TODO |
16 | loongarch: | ok |15 | loongarch: | ok |
17 | m68k: | TODO |16 | m68k: | TODO |
18 | microblaze: | TODO |17 | microblaze: | TODO |
Documentation/kbuild/makefiles.rst+1−1
@@ -53,7 +53,7 @@ knowledge about the kernel Makefiles, plus detailed knowledge about the · 52 unmodified lines
53public interface for kbuild.53public interface for kbuild.
54 54
55*Arch developers* are people who work on an entire architecture, such55*Arch developers* are people who work on an entire architecture, such
56as sparc or ia64. Arch developers need to know about the arch Makefile56as sparc or x86. Arch developers need to know about the arch Makefile
57as well as kbuild Makefiles.57as well as kbuild Makefiles.
58 58
59*Kbuild developers* are people who work on the kernel build system itself.59*Kbuild developers* are people who work on the kernel build system itself.
Documentation/networking/device_drivers/ethernet/neterion/s2io.rst+2−2
@@ -64,8 +64,8 @@ c. Multi-buffer receive mode. Scattering of packet across multiple · 63 unmodified lines
64 IBM xSeries).64 IBM xSeries).
65 65
66d. MSI/MSI-X. Can be enabled on platforms which support this feature66d. MSI/MSI-X. Can be enabled on platforms which support this feature
67 (IA64, Xeon) resulting in noticeable performance improvement(up to 7%67 resulting in noticeable performance improvement (up to 7% on certain
68 on certain platforms).68 platforms).
69 69
70e. Statistics. Comprehensive MAC-level and software statistics displayed70e. Statistics. Comprehensive MAC-level and software statistics displayed
71 using "ethtool -S" option.71 using "ethtool -S" option.
Documentation/scheduler/sched-arch.rst+1−3
@@ -10,7 +10,7 @@ Context switch · 9 unmodified lines
10By default, the switch_to arch function is called with the runqueue10By default, the switch_to arch function is called with the runqueue
11locked. This is usually not a problem unless switch_to may need to11locked. This is usually not a problem unless switch_to may need to
12take the runqueue lock. This is usually due to a wake up operation in12take the runqueue lock. This is usually due to a wake up operation in
13the context switch. See arch/ia64/include/asm/switch_to.h for an example.13the context switch.
14 14
15To request the scheduler call switch_to with the runqueue unlocked,15To request the scheduler call switch_to with the runqueue unlocked,
16you must `#define __ARCH_WANT_UNLOCKED_CTXSW` in a header file16you must `#define __ARCH_WANT_UNLOCKED_CTXSW` in a header file
@@ -68,7 +68,5 @@ Possible arch/ problems · 51 unmodified lines
68 68
69Possible arch problems I found (and either tried to fix or didn't):69Possible arch problems I found (and either tried to fix or didn't):
70 70
71ia64 - is safe_halt call racy vs interrupts? (does it sleep?) (See #4a)
72
73sparc - IRQs on at this point(?), change local_irq_save to _disable.71sparc - IRQs on at this point(?), change local_irq_save to _disable.
74 - TODO: needs secondary CPUs to disable preempt (See #1)72 - TODO: needs secondary CPUs to disable preempt (See #1)
Documentation/trace/kprobes.rst+0−1
@@ -315,7 +315,6 @@ architectures: · 314 unmodified lines
315- i386 (Supports jump optimization)315- i386 (Supports jump optimization)
316- x86_64 (AMD-64, EM64T) (Supports jump optimization)316- x86_64 (AMD-64, EM64T) (Supports jump optimization)
317- ppc64317- ppc64
318- ia64 (Does not support probes on instruction slot1.)
319- sparc64 (Return probes not yet implemented.)318- sparc64 (Return probes not yet implemented.)
320- arm319- arm
321- ppc320- ppc
Documentation/translations/zh_CN/arch/index.rst+0−1
@@ -18,7 +18,6 @@ · 17 unmodified lines
18TODOList:18TODOList:
19 19
20* arm/index20* arm/index
21* ia64/index
22* m68k/index21* m68k/index
23* nios2/index22* nios2/index
24* powerpc/index23* powerpc/index
Documentation/translations/zh_CN/core-api/cpu_hotplug.rst+0−6
@@ -49,12 +49,6 @@ CPU热拔插支持的一个更新颖的用途是它在SMP的暂停恢复支持 · 48 unmodified lines
49 限制内核将支持的CPU总量。如果这里提供的数量低于实际可用的CPU数量,那么其他CPU49 限制内核将支持的CPU总量。如果这里提供的数量低于实际可用的CPU数量,那么其他CPU
50 以后就不能上线了。50 以后就不能上线了。
51 51
52``additional_cpus=n``
53 使用它来限制可热插拔的CPU。该选项设置
54 ``cpu_possible_mask = cpu_present_mask + additional_cpus``
55
56 这个选项只限于IA64架构。
57
58``possible_cpus=n``52``possible_cpus=n``
59 这个选项设置 ``cpu_possible_mask`` 中的 ``possible_cpus`` 位。53 这个选项设置 ``cpu_possible_mask`` 中的 ``possible_cpus`` 位。
60 54
Documentation/translations/zh_CN/scheduler/sched-arch.rst+1−4
@@ -20,8 +20,7 @@ · 19 unmodified lines
20==========20==========
211. 运行队列锁211. 运行队列锁
22默认情况下,switch_to arch函数在调用时锁定了运行队列。这通常不是一个问题,除非22默认情况下,switch_to arch函数在调用时锁定了运行队列。这通常不是一个问题,除非
23switch_to可能需要获取运行队列锁。这通常是由于上下文切换中的唤醒操作造成的。见23switch_to可能需要获取运行队列锁。这通常是由于上下文切换中的唤醒操作造成的。
24arch/ia64/include/asm/switch_to.h的例子。
25 24
26为了要求调度器在运行队列解锁的情况下调用switch_to,你必须在头文件25为了要求调度器在运行队列解锁的情况下调用switch_to,你必须在头文件
27中`#define __ARCH_WANT_UNLOCKED_CTXSW`(通常是定义switch_to的那个文件)。26中`#define __ARCH_WANT_UNLOCKED_CTXSW`(通常是定义switch_to的那个文件)。
@@ -68,7 +67,5 @@ arch/x86/kernel/process.c有轮询和睡眠空闲函数的例子。 · 40 unmodified lines
68 67
69我发现的可能的arch问题(并试图解决或没有解决)。:68我发现的可能的arch问题(并试图解决或没有解决)。:
70 69
71ia64 - safe_halt的调用与中断相比,是否很荒谬? (它睡眠了吗) (参考 #4a)
72
73sparc - 在这一点上,IRQ是开着的(?),把local_irq_save改为_disable。70sparc - 在这一点上,IRQ是开着的(?),把local_irq_save改为_disable。
74 - 待办事项: 需要第二个CPU来禁用抢占 (参考 #1)71 - 待办事项: 需要第二个CPU来禁用抢占 (参考 #1)
MAINTAINERS+0−11
@@ -9935,12 +9935,6 @@ F: Documentation/driver-api/i3c · 9934 unmodified lines
9935F: drivers/i3c/9935F: drivers/i3c/
9936F: include/linux/i3c/9936F: include/linux/i3c/
9937 9937
9938IA64 (Itanium) PLATFORM
9939L: linux-ia64@vger.kernel.org
9940S: Orphan
9941F: Documentation/arch/ia64/
9942F: arch/ia64/
9943
9944IBM Operation Panel Input Driver9938IBM Operation Panel Input Driver
9945M: Eddie James <eajames@linux.ibm.com>9939M: Eddie James <eajames@linux.ibm.com>
9946L: linux-input@vger.kernel.org9940L: linux-input@vger.kernel.org
@@ -16269,11 +16263,6 @@ L: linux-i2c@vger.kernel.org · 6322 unmodified lines
16269S: Maintained16263S: Maintained
16270F: drivers/i2c/muxes/i2c-mux-pca9541.c16264F: drivers/i2c/muxes/i2c-mux-pca9541.c
16271 16265
16272PCDP - PRIMARY CONSOLE AND DEBUG PORT
16273M: Khalid Aziz <khalid@gonehiking.org>
16274S: Maintained
16275F: drivers/firmware/pcdp.*
16276
16277PCI DRIVER FOR AARDVARK (Marvell Armada 3700)16266PCI DRIVER FOR AARDVARK (Marvell Armada 3700)
16278M: Thomas Petazzoni <thomas.petazzoni@bootlin.com>16267M: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
16279M: Pali Rohár <pali@kernel.org>16268M: Pali Rohár <pali@kernel.org>
Makefile+2−2
@@ -378,7 +378,7 @@ include $(srctree)/scripts/subarch.include · 377 unmodified lines
378# When performing cross compilation for other architectures ARCH shall be set378# When performing cross compilation for other architectures ARCH shall be set
379# to the target architecture. (See arch/* for the possibilities).379# to the target architecture. (See arch/* for the possibilities).
380# ARCH can be set during invocation of make:380# ARCH can be set during invocation of make:
381# make ARCH=ia64381# make ARCH=arm64
382# Another way is to have ARCH set in the environment.382# Another way is to have ARCH set in the environment.
383# The default ARCH is the host where make is executed.383# The default ARCH is the host where make is executed.
384 384
@@ -386,7 +386,7 @@ include $(srctree)/scripts/subarch.include · 1 unmodified line
386# during compilation. Only gcc and related bin-utils executables386# during compilation. Only gcc and related bin-utils executables
387# are prefixed with $(CROSS_COMPILE).387# are prefixed with $(CROSS_COMPILE).
388# CROSS_COMPILE can be set on the command line388# CROSS_COMPILE can be set on the command line
389# make CROSS_COMPILE=ia64-linux-389# make CROSS_COMPILE=aarch64-linux-gnu-
390# Alternatively CROSS_COMPILE can be set in the environment.390# Alternatively CROSS_COMPILE can be set in the environment.
391# Default value for CROSS_COMPILE is not to prefix executables391# Default value for CROSS_COMPILE is not to prefix executables
392# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile392# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
arch/Kconfig+0−1
@@ -1088,7 +1088,6 @@ config HAVE_ARCH_COMPAT_MMAP_BASES · 1087 unmodified lines
1088config PAGE_SIZE_LESS_THAN_64KB1088config PAGE_SIZE_LESS_THAN_64KB
1089 def_bool y1089 def_bool y
1090 depends on !ARM64_64K_PAGES1090 depends on !ARM64_64K_PAGES
1091 depends on !IA64_PAGE_SIZE_64KB
1092 depends on !PAGE_SIZE_64KB1091 depends on !PAGE_SIZE_64KB
1093 depends on !PARISC_PAGE_SIZE_64KB1092 depends on !PARISC_PAGE_SIZE_64KB
1094 depends on PAGE_SIZE_LESS_THAN_256KB1093 depends on PAGE_SIZE_LESS_THAN_256KB
arch/ia64/Kbuild+0−3
@@ -1,3 +0,0 @@
1# SPDX-License-Identifier: GPL-2.0-only
2obj-y += kernel/ mm/
3obj-$(CONFIG_IA64_SGI_UV) += uv/
arch/ia64/Kconfig+0−394
@@ -1,394 +0,0 @@
1# SPDX-License-Identifier: GPL-2.0
2config PGTABLE_LEVELS
3 int "Page Table Levels" if !IA64_PAGE_SIZE_64KB
4 range 3 4 if !IA64_PAGE_SIZE_64KB
5 default 3
6
7menu "Processor type and features"
8
9config IA64
10 bool
11 select ARCH_BINFMT_ELF_EXTRA_PHDRS
12 select ARCH_HAS_CPU_FINALIZE_INIT
13 select ARCH_HAS_DMA_MARK_CLEAN
14 select ARCH_HAS_STRNCPY_FROM_USER
15 select ARCH_HAS_STRNLEN_USER
16 select ARCH_MIGHT_HAVE_PC_PARPORT
17 select ARCH_MIGHT_HAVE_PC_SERIO
18 select ACPI
19 select ACPI_NUMA if NUMA
20 select ARCH_ENABLE_MEMORY_HOTPLUG
21 select ARCH_ENABLE_MEMORY_HOTREMOVE
22 select ARCH_SUPPORTS_ACPI
23 select ACPI_SYSTEM_POWER_STATES_SUPPORT if ACPI
24 select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI
25 select FORCE_PCI
26 select PCI_DOMAINS if PCI
27 select PCI_MSI
28 select PCI_SYSCALL if PCI
29 select HAS_IOPORT
30 select HAVE_ASM_MODVERSIONS
31 select HAVE_UNSTABLE_SCHED_CLOCK
32 select HAVE_EXIT_THREAD
33 select HAVE_KPROBES
34 select HAVE_KRETPROBES
35 select HAVE_FTRACE_MCOUNT_RECORD
36 select HAVE_DYNAMIC_FTRACE if (!ITANIUM)
37 select HAVE_FUNCTION_TRACER
38 select HAVE_SETUP_PER_CPU_AREA
39 select TTY
40 select HAVE_ARCH_TRACEHOOK
41 select HAVE_FUNCTION_DESCRIPTORS
42 select HAVE_VIRT_CPU_ACCOUNTING
43 select HUGETLB_PAGE_SIZE_VARIABLE if HUGETLB_PAGE
44 select GENERIC_IRQ_PROBE
45 select GENERIC_PENDING_IRQ if SMP
46 select GENERIC_IRQ_SHOW
47 select GENERIC_IRQ_LEGACY
48 select ARCH_HAVE_NMI_SAFE_CMPXCHG
49 select GENERIC_IOMAP
50 select GENERIC_IOREMAP
51 select GENERIC_SMP_IDLE_THREAD
52 select ARCH_TASK_STRUCT_ON_STACK
53 select ARCH_TASK_STRUCT_ALLOCATOR
54 select ARCH_THREAD_STACK_ALLOCATOR
55 select ARCH_CLOCKSOURCE_DATA
56 select GENERIC_TIME_VSYSCALL
57 select LEGACY_TIMER_TICK
58 select SWIOTLB
59 select SYSCTL_ARCH_UNALIGN_NO_WARN
60 select HAVE_MOD_ARCH_SPECIFIC
61 select MODULES_USE_ELF_RELA
62 select ARCH_USE_CMPXCHG_LOCKREF
63 select HAVE_ARCH_AUDITSYSCALL
64 select NEED_DMA_MAP_STATE
65 select NEED_SG_DMA_LENGTH
66 select NUMA if !FLATMEM
67 select PCI_MSI_ARCH_FALLBACKS if PCI_MSI
68 select ZONE_DMA32
69 select FUNCTION_ALIGNMENT_32B
70 default y
71 help
72 The Itanium Processor Family is Intel's 64-bit successor to
73 the 32-bit X86 line. The IA-64 Linux project has a home
74 page at <http://www.linuxia64.org/> and a mailing list at
75 <linux-ia64@vger.kernel.org>.
76
77config 64BIT
78 bool
79 select ATA_NONSTANDARD if ATA
80 default y
81
82config MMU
83 bool
84 default y
85
86config STACKTRACE_SUPPORT
87 def_bool y
88
89config GENERIC_LOCKBREAK
90 def_bool n
91
92config GENERIC_CALIBRATE_DELAY
93 bool
94 default y
95
96config DMI
97 bool
98 default y
99 select DMI_SCAN_MACHINE_NON_EFI_FALLBACK
100
101config EFI
102 bool
103 select UCS2_STRING
104 default y
105
106config SCHED_OMIT_FRAME_POINTER
107 bool
108 default y
109
110config IA64_UNCACHED_ALLOCATOR
111 bool
112 select GENERIC_ALLOCATOR
113
114config ARCH_USES_PG_UNCACHED
115 def_bool y
116 depends on IA64_UNCACHED_ALLOCATOR
117
118config AUDIT_ARCH
119 bool
120 default y
121
122choice
123 prompt "Processor type"
124 default ITANIUM
125
126config ITANIUM
127 bool "Itanium"
128 help
129 Select your IA-64 processor type. The default is Itanium.
130 This choice is safe for all IA-64 systems, but may not perform
131 optimally on systems with, say, Itanium 2 or newer processors.
132
133config MCKINLEY
134 bool "Itanium 2"
135 help
136 Select this to configure for an Itanium 2 (McKinley) processor.
137
138endchoice
139
140choice
141 prompt "Kernel page size"
142 default IA64_PAGE_SIZE_16KB
143
144config IA64_PAGE_SIZE_4KB
145 bool "4KB"
146 help
147 This lets you select the page size of the kernel. For best IA-64
148 performance, a page size of 8KB or 16KB is recommended. For best
149 IA-32 compatibility, a page size of 4KB should be selected (the vast
150 majority of IA-32 binaries work perfectly fine with a larger page
151 size). For Itanium 2 or newer systems, a page size of 64KB can also
152 be selected.
153
154 4KB For best IA-32 compatibility
155 8KB For best IA-64 performance
156 16KB For best IA-64 performance
157 64KB Requires Itanium 2 or newer processor.
158
159 If you don't know what to do, choose 16KB.
160
161config IA64_PAGE_SIZE_8KB
162 bool "8KB"
163
164config IA64_PAGE_SIZE_16KB
165 bool "16KB"
166
167config IA64_PAGE_SIZE_64KB
168 depends on !ITANIUM
169 bool "64KB"
170
171endchoice
172
173source "kernel/Kconfig.hz"
174
175config IA64_BRL_EMU
176 bool
177 depends on ITANIUM
178 default y
179
180# align cache-sensitive data to 128 bytes
181config IA64_L1_CACHE_SHIFT
182 int
183 default "7" if MCKINLEY
184 default "6" if ITANIUM
185
186config IA64_SGI_UV
187 bool "SGI-UV support"
188 help
189 Selecting this option will add specific support for running on SGI
190 UV based systems. If you have an SGI UV system or are building a
191 distro kernel, select this option.
192
193config IA64_HP_SBA_IOMMU
194 bool "HP SBA IOMMU support"
195 select DMA_OPS
196 default y
197 help
198 Say Y here to add support for the SBA IOMMU found on HP zx1 and
199 sx1000 systems. If you're unsure, answer Y.
200
201config IA64_CYCLONE
202 bool "Cyclone (EXA) Time Source support"
203 help
204 Say Y here to enable support for IBM EXA Cyclone time source.
205 If you're unsure, answer N.
206
207config ARCH_FORCE_MAX_ORDER
208 int
209 default "16" if HUGETLB_PAGE
210 default "10"
211
212config SMP
213 bool "Symmetric multi-processing support"
214 help
215 This enables support for systems with more than one CPU. If you have
216 a system with only one CPU, say N. If you have a system with more
217 than one CPU, say Y.
218
219 If you say N here, the kernel will run on single and multiprocessor
220 systems, but will use only one CPU of a multiprocessor system. If
221 you say Y here, the kernel will run on many, but not all,
222 single processor systems. On a single processor system, the kernel
223 will run faster if you say N here.
224
225 See also the SMP-HOWTO available at
226 <http://www.tldp.org/docs.html#howto>.
227
228 If you don't know what to do here, say N.
229
230config NR_CPUS
231 int "Maximum number of CPUs (2-4096)"
232 range 2 4096
233 depends on SMP
234 default "4096"
235 help
236 You should set this to the number of CPUs in your system, but
237 keep in mind that a kernel compiled for, e.g., 2 CPUs will boot but
238 only use 2 CPUs on a >2 CPU system. Setting this to a value larger
239 than 64 will cause the use of a CPU mask array, causing a small
240 performance hit.
241
242config HOTPLUG_CPU
243 bool "Support for hot-pluggable CPUs"
244 depends on SMP
245 default n
246 help
247 Say Y here to experiment with turning CPUs off and on. CPUs
248 can be controlled through /sys/devices/system/cpu/cpu#.
249 Say N if you want to disable CPU hotplug.
250
251config SCHED_SMT
252 bool "SMT scheduler support"
253 depends on SMP
254 help
255 Improves the CPU scheduler's decision making when dealing with
256 Intel IA64 chips with MultiThreading at a cost of slightly increased
257 overhead in some places. If unsure say N here.
258
259config PERMIT_BSP_REMOVE
260 bool "Support removal of Bootstrap Processor"
261 depends on HOTPLUG_CPU
262 default n
263 help
264 Say Y here if your platform SAL will support removal of BSP with HOTPLUG_CPU
265 support.
266
267config FORCE_CPEI_RETARGET
268 bool "Force assumption that CPEI can be re-targeted"
269 depends on PERMIT_BSP_REMOVE
270 default n
271 help
272 Say Y if you need to force the assumption that CPEI can be re-targeted to
273 any cpu in the system. This hint is available via ACPI 3.0 specifications.
274 Tiger4 systems are capable of re-directing CPEI to any CPU other than BSP.
275 This option it useful to enable this feature on older BIOS's as well.
276 You can also enable this by using boot command line option force_cpei=1.
277
278config ARCH_SELECT_MEMORY_MODEL
279 def_bool y
280
281config ARCH_FLATMEM_ENABLE
282 def_bool y
283
284config ARCH_SPARSEMEM_ENABLE
285 def_bool y
286 select SPARSEMEM_VMEMMAP_ENABLE
287
288config ARCH_SPARSEMEM_DEFAULT
289 def_bool y
290 depends on ARCH_SPARSEMEM_ENABLE
291
292config NUMA
293 bool "NUMA support"
294 depends on !FLATMEM
295 select SMP
296 select USE_PERCPU_NUMA_NODE_ID
297 help
298 Say Y to compile the kernel to support NUMA (Non-Uniform Memory
299 Access). This option is for configuring high-end multiprocessor
300 server systems. If in doubt, say N.
301
302config NODES_SHIFT
303 int "Max num nodes shift(3-10)"
304 range 3 10
305 default "10"
306 depends on NUMA
307 help
308 This option specifies the maximum number of nodes in your SSI system.
309 MAX_NUMNODES will be 2^(This value).
310 If in doubt, use the default.
311
312config HAVE_ARCH_NODEDATA_EXTENSION
313 def_bool y
314 depends on NUMA
315
316config HAVE_MEMORYLESS_NODES
317 def_bool NUMA
318
319config ARCH_PROC_KCORE_TEXT
320 def_bool y
321 depends on PROC_KCORE
322
323config IA64_MCA_RECOVERY
324 bool "MCA recovery from errors other than TLB."
325
326config IA64_PALINFO
327 tristate "/proc/pal support"
328 help
329 If you say Y here, you are able to get PAL (Processor Abstraction
330 Layer) information in /proc/pal. This contains useful information
331 about the processors in your systems, such as cache and TLB sizes
332 and the PAL firmware version in use.
333
334 To use this option, you have to ensure that the "/proc file system
335 support" (CONFIG_PROC_FS) is enabled, too.
336
337config IA64_MC_ERR_INJECT
338 tristate "MC error injection support"
339 help
340 Adds support for MC error injection. If enabled, the kernel
341 will provide a sysfs interface for user applications to
342 call MC error injection PAL procedures to inject various errors.
343 This is a useful tool for MCA testing.
344
345 If you're unsure, do not select this option.
346
347config IA64_ESI
348 bool "ESI (Extensible SAL Interface) support"
349 help
350 If you say Y here, support is built into the kernel to
351 make ESI calls. ESI calls are used to support vendor-specific
352 firmware extensions, such as the ability to inject memory-errors
353 for test-purposes. If you're unsure, say N.
354
355config IA64_HP_AML_NFW
356 bool "Support ACPI AML calls to native firmware"
357 help
358 This driver installs a global ACPI Operation Region handler for
359 region 0xA1. AML methods can use this OpRegion to call arbitrary
360 native firmware functions. The driver installs the OpRegion
361 handler if there is an HPQ5001 device or if the user supplies
362 the "force" module parameter, e.g., with the "aml_nfw.force"
363 kernel command line option.
364
365endmenu
366
367config ARCH_SUPPORTS_KEXEC
368 def_bool !SMP || HOTPLUG_CPU
369
370config ARCH_SUPPORTS_CRASH_DUMP
371 def_bool IA64_MCA_RECOVERY && (!SMP || HOTPLUG_CPU)
372
373menu "Power management and ACPI options"
374
375source "kernel/power/Kconfig"
376
377source "drivers/acpi/Kconfig"
378
379if PM
380menu "CPU Frequency scaling"
381source "drivers/cpufreq/Kconfig"
382endmenu
383endif
384
385endmenu
386
387config MSPEC
388 tristate "Memory special operations driver"
389 depends on IA64
390 select IA64_UNCACHED_ALLOCATOR
391 help
392 If you have an ia64 and you want to enable memory special
393 operations support (formerly known as fetchop), say Y here,
394 otherwise say N.
arch/ia64/Kconfig.debug+0−55
@@ -1,55 +0,0 @@
1# SPDX-License-Identifier: GPL-2.0
2
3choice
4 prompt "Physical memory granularity"
5 default IA64_GRANULE_64MB
6
7config IA64_GRANULE_16MB
8 bool "16MB"
9 help
10 IA-64 identity-mapped regions use a large page size called "granules".
11
12 Select "16MB" for a small granule size.
13 Select "64MB" for a large granule size. This is the current default.
14
15config IA64_GRANULE_64MB
16 bool "64MB"
17 depends on BROKEN
18
19endchoice
20
21config IA64_PRINT_HAZARDS
22 bool "Print possible IA-64 dependency violations to console"
23 depends on DEBUG_KERNEL
24 help
25 Selecting this option prints more information for Illegal Dependency
26 Faults, that is, for Read-after-Write (RAW), Write-after-Write (WAW),
27 or Write-after-Read (WAR) violations. This option is ignored if you
28 are compiling for an Itanium A step processor
29 (CONFIG_ITANIUM_ASTEP_SPECIFIC). If you're unsure, select Y.
30
31config DISABLE_VHPT
32 bool "Disable VHPT"
33 depends on DEBUG_KERNEL
34 help
35 The Virtual Hash Page Table (VHPT) enhances virtual address
36 translation performance. Normally you want the VHPT active but you
37 can select this option to disable the VHPT for debugging. If you're
38 unsure, answer N.
39
40config IA64_DEBUG_CMPXCHG
41 bool "Turn on compare-and-exchange bug checking (slow!)"
42 depends on DEBUG_KERNEL && PRINTK
43 help
44 Selecting this option turns on bug checking for the IA-64
45 compare-and-exchange instructions. This is slow! Itaniums
46 from step B3 or later don't have this problem. If you're unsure,
47 select N.
48
49config IA64_DEBUG_IRQ
50 bool "Turn on irq debug checks (slow!)"
51 depends on DEBUG_KERNEL
52 help
53 Selecting this option turns on bug checking for the IA-64 irq_save
54 and restore instructions. It's useful for tracking down spinlock
55 problems, but slow! If you're unsure, select N.
arch/ia64/Makefile+0−82
@@ -1,82 +0,0 @@
1#
2# ia64/Makefile
3#
4# This file is included by the global makefile so that you can add your own
5# architecture-specific flags and dependencies.
6#
7# This file is subject to the terms and conditions of the GNU General Public
8# License. See the file "COPYING" in the main directory of this archive
9# for more details.
10#
11# Copyright (C) 1998-2004 by David Mosberger-Tang <davidm@hpl.hp.com>
12#
13
14KBUILD_DEFCONFIG := generic_defconfig
15
16NM := $(CROSS_COMPILE)nm -B
17
18CHECKFLAGS += -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
19
20OBJCOPYFLAGS := --strip-all
21LDFLAGS_vmlinux := -static
22KBUILD_AFLAGS_KERNEL := -mconstant-gp
23EXTRA :=
24
25cflags-y := -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f12-f15,f32-f127 \
26 -frename-registers -fno-optimize-sibling-calls
27KBUILD_CFLAGS_KERNEL := -mconstant-gp
28
29GAS_STATUS = $(shell $(srctree)/arch/ia64/scripts/check-gas "$(CC)" "$(OBJDUMP)")
30KBUILD_CPPFLAGS += $(shell $(srctree)/arch/ia64/scripts/toolchain-flags "$(CC)" "$(OBJDUMP)" "$(READELF)")
31
32ifeq ($(GAS_STATUS),buggy)
33$(error Sorry, you need a newer version of the assember, one that is built from \
34 a source-tree that post-dates 18-Dec-2002. You can find a pre-compiled \
35 static binary of such an assembler at: \
36 \
37 ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz)
38endif
39
40quiet_cmd_gzip = GZIP $@
41cmd_gzip = cat $(real-prereqs) | $(KGZIP) -n -f -9 > $@
42
43quiet_cmd_objcopy = OBJCOPY $@
44cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
45
46KBUILD_CFLAGS += $(cflags-y)
47
48libs-y += arch/ia64/lib/
49
50drivers-y += arch/ia64/pci/ arch/ia64/hp/common/
51
52PHONY += compressed check
53
54all: compressed unwcheck
55
56compressed: vmlinux.gz
57
58vmlinuz: vmlinux.gz
59
60vmlinux.gz: vmlinux.bin FORCE
61 $(call if_changed,gzip)
62
63vmlinux.bin: vmlinux FORCE
64 $(call if_changed,objcopy)
65
66unwcheck: vmlinux
67 -$(Q)READELF=$(READELF) $(PYTHON3) $(srctree)/arch/ia64/scripts/unwcheck.py $<
68
69archheaders:
70 $(Q)$(MAKE) $(build)=arch/ia64/kernel/syscalls all
71
72CLEAN_FILES += vmlinux.gz
73
74install: KBUILD_IMAGE := vmlinux.gz
75install:
76 $(call cmd,install)
77
78define archhelp
79 echo '* compressed - Build compressed kernel image'
80 echo ' install - Install compressed kernel image'
81 echo '* unwcheck - Check vmlinux for invalid unwind info'
82endef
arch/ia64/configs/bigsur_defconfig+0−102
@@ -1,102 +0,0 @@
1CONFIG_SYSVIPC=y
2CONFIG_POSIX_MQUEUE=y
3CONFIG_LOG_BUF_SHIFT=16
4CONFIG_PROFILING=y
5CONFIG_MODULES=y
6CONFIG_MODULE_UNLOAD=y
7CONFIG_PARTITION_ADVANCED=y
8CONFIG_SGI_PARTITION=y
9CONFIG_SMP=y
10CONFIG_NR_CPUS=2
11CONFIG_PREEMPT=y
12CONFIG_IA64_PALINFO=y
13CONFIG_BINFMT_MISC=m
14CONFIG_ACPI_BUTTON=m
15CONFIG_ACPI_FAN=m
16CONFIG_ACPI_PROCESSOR=m
17CONFIG_NET=y
18CONFIG_PACKET=y
19CONFIG_UNIX=y
20CONFIG_INET=y
21# CONFIG_IPV6 is not set
22CONFIG_BLK_DEV_LOOP=m
23CONFIG_BLK_DEV_NBD=m
24CONFIG_BLK_DEV_RAM=m
25CONFIG_ATA=m
26CONFIG_ATA_GENERIC=m
27CONFIG_ATA_PIIX=m
28CONFIG_SCSI=y
29CONFIG_BLK_DEV_SD=y
30CONFIG_SCSI_CONSTANTS=y
31CONFIG_SCSI_LOGGING=y
32CONFIG_SCSI_SPI_ATTRS=m
33CONFIG_SCSI_QLOGIC_1280=y
34CONFIG_MD=y
35CONFIG_BLK_DEV_MD=m
36CONFIG_MD_LINEAR=m
37CONFIG_MD_RAID0=m
38CONFIG_MD_RAID1=m
39CONFIG_MD_RAID10=m
40CONFIG_MD_MULTIPATH=m
41CONFIG_BLK_DEV_DM=m
42CONFIG_DM_CRYPT=m
43CONFIG_DM_SNAPSHOT=m
44CONFIG_DM_MIRROR=m
45CONFIG_DM_ZERO=m
46CONFIG_NETDEVICES=y
47CONFIG_DUMMY=y
48CONFIG_INPUT_EVDEV=y
49CONFIG_SERIAL_8250=y
50CONFIG_SERIAL_8250_CONSOLE=y
51CONFIG_SERIAL_8250_EXTENDED=y
52CONFIG_SERIAL_8250_SHARE_IRQ=y
53# CONFIG_HW_RANDOM is not set
54CONFIG_RTC_CLASS=y
55CONFIG_RTC_DRV_EFI=y
56CONFIG_I2C=y
57CONFIG_I2C_CHARDEV=y
58CONFIG_AGP=m
59CONFIG_AGP_I460=m
60CONFIG_DRM=m
61CONFIG_DRM_R128=m
62CONFIG_SOUND=m
63CONFIG_SND=m
64CONFIG_SND_SEQUENCER=m
65CONFIG_SND_MIXER_OSS=m
66CONFIG_SND_PCM_OSS=m
67CONFIG_SND_CS4281=m
68CONFIG_USB_HIDDEV=y
69CONFIG_USB=m
70CONFIG_USB_MON=m
71CONFIG_USB_UHCI_HCD=m
72CONFIG_USB_ACM=m
73CONFIG_USB_PRINTER=m
74CONFIG_USB_STORAGE=m
75CONFIG_EXT2_FS=y
76CONFIG_EXT3_FS=y
77CONFIG_XFS_FS=y
78CONFIG_XFS_QUOTA=y
79CONFIG_XFS_POSIX_ACL=y
80CONFIG_AUTOFS_FS=m
81CONFIG_ISO9660_FS=m
82CONFIG_JOLIET=y
83CONFIG_UDF_FS=m
84CONFIG_VFAT_FS=y
85CONFIG_PROC_KCORE=y
86CONFIG_TMPFS=y
87CONFIG_HUGETLBFS=y
88CONFIG_NFS_FS=m
89CONFIG_NFS_V4=m
90CONFIG_NFSD=m
91CONFIG_NFSD_V4=y
92CONFIG_CIFS=m
93CONFIG_CIFS_XATTR=y
94CONFIG_CIFS_POSIX=y
95CONFIG_NLS_CODEPAGE_437=y
96CONFIG_NLS_ISO8859_1=y
97CONFIG_NLS_UTF8=m
98CONFIG_MAGIC_SYSRQ=y
99CONFIG_DEBUG_KERNEL=y
100CONFIG_DEBUG_MUTEXES=y
101CONFIG_CRYPTO_MD5=y
102CONFIG_CRYPTO_DES=y
arch/ia64/configs/generic_defconfig+0−206
@@ -1,206 +0,0 @@
1CONFIG_SYSVIPC=y
2CONFIG_POSIX_MQUEUE=y
3CONFIG_IKCONFIG=y
4CONFIG_IKCONFIG_PROC=y
5CONFIG_LOG_BUF_SHIFT=20
6CONFIG_CGROUPS=y
7CONFIG_CPUSETS=y
8CONFIG_BLK_DEV_INITRD=y
9CONFIG_KALLSYMS_ALL=y
10CONFIG_MODULES=y
11CONFIG_MODULE_UNLOAD=y
12CONFIG_MODVERSIONS=y
13CONFIG_PARTITION_ADVANCED=y
14CONFIG_SGI_PARTITION=y
15CONFIG_MCKINLEY=y
16CONFIG_IA64_PAGE_SIZE_64KB=y
17CONFIG_IA64_CYCLONE=y
18CONFIG_SMP=y
19CONFIG_HOTPLUG_CPU=y
20CONFIG_IA64_MCA_RECOVERY=y
21CONFIG_IA64_PALINFO=y
22CONFIG_KEXEC=y
23CONFIG_CRASH_DUMP=y
24CONFIG_BINFMT_MISC=m
25CONFIG_ACPI_BUTTON=m
26CONFIG_ACPI_FAN=m
27CONFIG_ACPI_DOCK=y
28CONFIG_ACPI_PROCESSOR=m
29CONFIG_HOTPLUG_PCI=y
30CONFIG_HOTPLUG_PCI_ACPI=y
31CONFIG_NET=y
32CONFIG_PACKET=y
33CONFIG_UNIX=y
34CONFIG_INET=y
35CONFIG_IP_MULTICAST=y
36CONFIG_SYN_COOKIES=y
37# CONFIG_IPV6 is not set
38CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
39CONFIG_CONNECTOR=y
40# CONFIG_PNP_DEBUG_MESSAGES is not set
41CONFIG_BLK_DEV_LOOP=m
42CONFIG_BLK_DEV_NBD=m
43CONFIG_BLK_DEV_RAM=y
44CONFIG_SGI_XP=m
45CONFIG_ATA=y
46CONFIG_ATA_GENERIC=y
47CONFIG_PATA_CMD64X=y
48CONFIG_ATA_PIIX=y
49CONFIG_BLK_DEV_SD=y
50CONFIG_CHR_DEV_ST=m
51CONFIG_BLK_DEV_SR=m
52CONFIG_CHR_DEV_SG=m
53CONFIG_SCSI_FC_ATTRS=y
54CONFIG_SCSI_SYM53C8XX_2=y
55CONFIG_SCSI_QLOGIC_1280=y
56CONFIG_SATA_VITESSE=y
57CONFIG_MD=y
58CONFIG_BLK_DEV_MD=m
59CONFIG_MD_LINEAR=m
60CONFIG_MD_RAID0=m
61CONFIG_MD_RAID1=m
62CONFIG_MD_MULTIPATH=m
63CONFIG_BLK_DEV_DM=m
64CONFIG_DM_CRYPT=m
65CONFIG_DM_SNAPSHOT=m
66CONFIG_DM_MIRROR=m
67CONFIG_DM_ZERO=m
68CONFIG_DM_MULTIPATH=m
69CONFIG_FUSION=y
70CONFIG_FUSION_SPI=y
71CONFIG_FUSION_FC=m
72CONFIG_FUSION_SAS=y
73CONFIG_NETDEVICES=y
74CONFIG_DUMMY=m
75CONFIG_NETCONSOLE=y
76CONFIG_TIGON3=y
77CONFIG_NET_TULIP=y
78CONFIG_TULIP=m
79CONFIG_E100=m
80CONFIG_E1000=y
81CONFIG_IGB=y
82# CONFIG_SERIO_SERPORT is not set
83CONFIG_GAMEPORT=m
84CONFIG_SERIAL_NONSTANDARD=y
85CONFIG_SERIAL_8250=y
86CONFIG_SERIAL_8250_CONSOLE=y
87CONFIG_SERIAL_8250_NR_UARTS=6
88CONFIG_SERIAL_8250_EXTENDED=y
89CONFIG_SERIAL_8250_SHARE_IRQ=y
90# CONFIG_HW_RANDOM is not set
91CONFIG_RTC_CLASS=y
92CONFIG_RTC_DRV_EFI=y
93CONFIG_HPET=y
94CONFIG_AGP=m
95CONFIG_AGP_I460=m
96CONFIG_AGP_HP_ZX1=m
97CONFIG_DRM=m
98CONFIG_DRM_TDFX=m
99CONFIG_DRM_R128=m
100CONFIG_DRM_RADEON=m
101CONFIG_DRM_MGA=m
102CONFIG_DRM_SIS=m
103CONFIG_SOUND=m
104CONFIG_SND=m
105CONFIG_SND_SEQUENCER=m
106CONFIG_SND_SEQ_DUMMY=m
107CONFIG_SND_MIXER_OSS=m
108CONFIG_SND_PCM_OSS=m
109CONFIG_SND_SEQUENCER_OSS=y
110CONFIG_SND_VERBOSE_PRINTK=y
111CONFIG_SND_DUMMY=m
112CONFIG_SND_VIRMIDI=m
113CONFIG_SND_MTPAV=m
114CONFIG_SND_SERIAL_U16550=m
115CONFIG_SND_MPU401=m
116CONFIG_SND_CS4281=m
117CONFIG_SND_CS46XX=m
118CONFIG_SND_EMU10K1=m
119CONFIG_SND_FM801=m
120CONFIG_HID_GYRATION=m
121CONFIG_HID_PANTHERLORD=m
122CONFIG_HID_PETALYNX=m
123CONFIG_HID_SAMSUNG=m
124CONFIG_HID_SONY=m
125CONFIG_HID_SUNPLUS=m
126CONFIG_USB=m
127CONFIG_USB_MON=m
128CONFIG_USB_EHCI_HCD=m
129CONFIG_USB_OHCI_HCD=m
130CONFIG_USB_UHCI_HCD=m
131CONFIG_USB_STORAGE=m
132CONFIG_INFINIBAND=m
133CONFIG_INFINIBAND_MTHCA=m
134CONFIG_INFINIBAND_IPOIB=m
135CONFIG_INTEL_IOMMU=y
136CONFIG_MSPEC=m
137CONFIG_EXT2_FS=y
138CONFIG_EXT2_FS_XATTR=y
139CONFIG_EXT2_FS_POSIX_ACL=y
140CONFIG_EXT2_FS_SECURITY=y
141CONFIG_EXT3_FS=y
142CONFIG_EXT3_FS_POSIX_ACL=y
143CONFIG_EXT3_FS_SECURITY=y
144CONFIG_REISERFS_FS=y
145CONFIG_REISERFS_FS_XATTR=y
146CONFIG_REISERFS_FS_POSIX_ACL=y
147CONFIG_REISERFS_FS_SECURITY=y
148CONFIG_XFS_FS=y
149CONFIG_AUTOFS_FS=m
150CONFIG_ISO9660_FS=m
151CONFIG_JOLIET=y
152CONFIG_UDF_FS=m
153CONFIG_VFAT_FS=y
154CONFIG_NTFS_FS=m
155CONFIG_PROC_KCORE=y
156CONFIG_TMPFS=y
157CONFIG_HUGETLBFS=y
158CONFIG_NFS_FS=m
159CONFIG_NFS_V4=m
160CONFIG_NFSD=m
161CONFIG_NFSD_V4=y
162CONFIG_CIFS=m
163CONFIG_NLS_CODEPAGE_437=y
164CONFIG_NLS_CODEPAGE_737=m
165CONFIG_NLS_CODEPAGE_775=m
166CONFIG_NLS_CODEPAGE_850=m
167CONFIG_NLS_CODEPAGE_852=m
168CONFIG_NLS_CODEPAGE_855=m
169CONFIG_NLS_CODEPAGE_857=m
170CONFIG_NLS_CODEPAGE_860=m
171CONFIG_NLS_CODEPAGE_861=m
172CONFIG_NLS_CODEPAGE_862=m
173CONFIG_NLS_CODEPAGE_863=m
174CONFIG_NLS_CODEPAGE_864=m
175CONFIG_NLS_CODEPAGE_865=m
176CONFIG_NLS_CODEPAGE_866=m
177CONFIG_NLS_CODEPAGE_869=m
178CONFIG_NLS_CODEPAGE_936=m
179CONFIG_NLS_CODEPAGE_950=m
180CONFIG_NLS_CODEPAGE_932=m
181CONFIG_NLS_CODEPAGE_949=m
182CONFIG_NLS_CODEPAGE_874=m
183CONFIG_NLS_ISO8859_8=m
184CONFIG_NLS_CODEPAGE_1250=m
185CONFIG_NLS_CODEPAGE_1251=m
186CONFIG_NLS_ISO8859_1=y
187CONFIG_NLS_ISO8859_2=m
188CONFIG_NLS_ISO8859_3=m
189CONFIG_NLS_ISO8859_4=m
190CONFIG_NLS_ISO8859_5=m
191CONFIG_NLS_ISO8859_6=m
192CONFIG_NLS_ISO8859_7=m
193CONFIG_NLS_ISO8859_9=m
194CONFIG_NLS_ISO8859_13=m
195CONFIG_NLS_ISO8859_14=m
196CONFIG_NLS_ISO8859_15=m
197CONFIG_NLS_KOI8_R=m
198CONFIG_NLS_KOI8_U=m
199CONFIG_NLS_UTF8=m
200CONFIG_MAGIC_SYSRQ=y
201CONFIG_DEBUG_KERNEL=y
202CONFIG_DEBUG_MUTEXES=y
203CONFIG_CRYPTO_PCBC=m
204CONFIG_CRYPTO_MD5=y
205# CONFIG_CRYPTO_ANSI_CPRNG is not set
206CONFIG_CRC_T10DIF=y
arch/ia64/configs/gensparse_defconfig+0−184
@@ -1,184 +0,0 @@
1CONFIG_SYSVIPC=y
2CONFIG_POSIX_MQUEUE=y
3CONFIG_IKCONFIG=y
4CONFIG_IKCONFIG_PROC=y
5CONFIG_LOG_BUF_SHIFT=20
6CONFIG_BLK_DEV_INITRD=y
7CONFIG_KALLSYMS_ALL=y
8CONFIG_MODULES=y
9CONFIG_MODULE_UNLOAD=y
10CONFIG_MODVERSIONS=y
11CONFIG_PARTITION_ADVANCED=y
12CONFIG_SGI_PARTITION=y
13CONFIG_MCKINLEY=y
14CONFIG_IA64_CYCLONE=y
15CONFIG_SMP=y
16CONFIG_NR_CPUS=512
17CONFIG_HOTPLUG_CPU=y
18CONFIG_SPARSEMEM_MANUAL=y
19CONFIG_IA64_MCA_RECOVERY=y
20CONFIG_IA64_PALINFO=y
21CONFIG_BINFMT_MISC=m
22CONFIG_ACPI_BUTTON=m
23CONFIG_ACPI_FAN=m
24CONFIG_ACPI_PROCESSOR=m
25CONFIG_HOTPLUG_PCI=y
26CONFIG_NET=y
27CONFIG_PACKET=y
28CONFIG_UNIX=y
29CONFIG_INET=y
30CONFIG_IP_MULTICAST=y
31CONFIG_SYN_COOKIES=y
32# CONFIG_IPV6 is not set
33CONFIG_BLK_DEV_LOOP=m
34CONFIG_BLK_DEV_NBD=m
35CONFIG_BLK_DEV_RAM=y
36CONFIG_ATA=y
37CONFIG_ATA_GENERIC=y
38CONFIG_PATA_CMD64X=y
39CONFIG_ATA_PIIX=y
40CONFIG_SCSI=y
41CONFIG_BLK_DEV_SD=y
42CONFIG_CHR_DEV_ST=m
43CONFIG_BLK_DEV_SR=m
44CONFIG_CHR_DEV_SG=m
45CONFIG_SCSI_FC_ATTRS=y
46CONFIG_SCSI_SYM53C8XX_2=y
47CONFIG_SCSI_QLOGIC_1280=y
48CONFIG_MD=y
49CONFIG_BLK_DEV_MD=m
50CONFIG_MD_LINEAR=m
51CONFIG_MD_RAID0=m
52CONFIG_MD_RAID1=m
53CONFIG_MD_MULTIPATH=m
54CONFIG_BLK_DEV_DM=m
55CONFIG_DM_CRYPT=m
56CONFIG_DM_SNAPSHOT=m
57CONFIG_DM_MIRROR=m
58CONFIG_DM_ZERO=m
59CONFIG_DM_MULTIPATH=m
60CONFIG_FUSION=y
61CONFIG_FUSION_SPI=y
62CONFIG_FUSION_FC=m
63CONFIG_NETDEVICES=y
64CONFIG_DUMMY=m
65CONFIG_NETCONSOLE=y
66CONFIG_TIGON3=y
67CONFIG_NET_TULIP=y
68CONFIG_TULIP=m
69CONFIG_E100=m
70CONFIG_E1000=y
71# CONFIG_SERIO_SERPORT is not set
72CONFIG_GAMEPORT=m
73CONFIG_SERIAL_NONSTANDARD=y
74CONFIG_SERIAL_8250=y
75CONFIG_SERIAL_8250_CONSOLE=y
76CONFIG_SERIAL_8250_NR_UARTS=6
77CONFIG_SERIAL_8250_EXTENDED=y
78CONFIG_SERIAL_8250_SHARE_IRQ=y
79# CONFIG_HW_RANDOM is not set
80CONFIG_RTC_CLASS=y
81CONFIG_RTC_DRV_EFI=y
82CONFIG_HPET=y
83CONFIG_AGP=m
84CONFIG_AGP_I460=m
85CONFIG_AGP_HP_ZX1=m
86CONFIG_DRM=m
87CONFIG_DRM_TDFX=m
88CONFIG_DRM_R128=m
89CONFIG_DRM_RADEON=m
90CONFIG_DRM_MGA=m
91CONFIG_DRM_SIS=m
92CONFIG_SOUND=m
93CONFIG_SND=m
94CONFIG_SND_SEQUENCER=m
95CONFIG_SND_SEQ_DUMMY=m
96CONFIG_SND_MIXER_OSS=m
97CONFIG_SND_PCM_OSS=m
98CONFIG_SND_SEQUENCER_OSS=y
99CONFIG_SND_VERBOSE_PRINTK=y
100CONFIG_SND_DUMMY=m
101CONFIG_SND_VIRMIDI=m
102CONFIG_SND_MTPAV=m
103CONFIG_SND_SERIAL_U16550=m
104CONFIG_SND_MPU401=m
105CONFIG_SND_CS4281=m
106CONFIG_SND_CS46XX=m
107CONFIG_SND_EMU10K1=m
108CONFIG_SND_FM801=m
109CONFIG_USB=m
110CONFIG_USB_MON=m
111CONFIG_USB_EHCI_HCD=m
112CONFIG_USB_OHCI_HCD=m
113CONFIG_USB_UHCI_HCD=m
114CONFIG_USB_STORAGE=m
115CONFIG_INFINIBAND=m
116CONFIG_INFINIBAND_MTHCA=m
117CONFIG_INFINIBAND_IPOIB=m
118CONFIG_EXT2_FS=y
119CONFIG_EXT2_FS_XATTR=y
120CONFIG_EXT2_FS_POSIX_ACL=y
121CONFIG_EXT2_FS_SECURITY=y
122CONFIG_EXT3_FS=y
123CONFIG_EXT3_FS_POSIX_ACL=y
124CONFIG_EXT3_FS_SECURITY=y
125CONFIG_REISERFS_FS=y
126CONFIG_REISERFS_FS_XATTR=y
127CONFIG_REISERFS_FS_POSIX_ACL=y
128CONFIG_REISERFS_FS_SECURITY=y
129CONFIG_XFS_FS=y
130CONFIG_AUTOFS_FS=y
131CONFIG_ISO9660_FS=m
132CONFIG_JOLIET=y
133CONFIG_UDF_FS=m
134CONFIG_VFAT_FS=y
135CONFIG_NTFS_FS=m
136CONFIG_PROC_KCORE=y
137CONFIG_TMPFS=y
138CONFIG_HUGETLBFS=y
139CONFIG_NFS_FS=m
140CONFIG_NFS_V4=m
141CONFIG_NFSD=m
142CONFIG_NFSD_V4=y
143CONFIG_CIFS=m
144CONFIG_NLS_CODEPAGE_437=y
145CONFIG_NLS_CODEPAGE_737=m
146CONFIG_NLS_CODEPAGE_775=m
147CONFIG_NLS_CODEPAGE_850=m
148CONFIG_NLS_CODEPAGE_852=m
149CONFIG_NLS_CODEPAGE_855=m
150CONFIG_NLS_CODEPAGE_857=m
151CONFIG_NLS_CODEPAGE_860=m
152CONFIG_NLS_CODEPAGE_861=m
153CONFIG_NLS_CODEPAGE_862=m
154CONFIG_NLS_CODEPAGE_863=m
155CONFIG_NLS_CODEPAGE_864=m
156CONFIG_NLS_CODEPAGE_865=m
157CONFIG_NLS_CODEPAGE_866=m
158CONFIG_NLS_CODEPAGE_869=m
159CONFIG_NLS_CODEPAGE_936=m
160CONFIG_NLS_CODEPAGE_950=m
161CONFIG_NLS_CODEPAGE_932=m
162CONFIG_NLS_CODEPAGE_949=m
163CONFIG_NLS_CODEPAGE_874=m
164CONFIG_NLS_ISO8859_8=m
165CONFIG_NLS_CODEPAGE_1250=m
166CONFIG_NLS_CODEPAGE_1251=m
167CONFIG_NLS_ISO8859_1=y
168CONFIG_NLS_ISO8859_2=m
169CONFIG_NLS_ISO8859_3=m
170CONFIG_NLS_ISO8859_4=m
171CONFIG_NLS_ISO8859_5=m
172CONFIG_NLS_ISO8859_6=m
173CONFIG_NLS_ISO8859_7=m
174CONFIG_NLS_ISO8859_9=m
175CONFIG_NLS_ISO8859_13=m
176CONFIG_NLS_ISO8859_14=m
177CONFIG_NLS_ISO8859_15=m
178CONFIG_NLS_KOI8_R=m
179CONFIG_NLS_KOI8_U=m
180CONFIG_NLS_UTF8=m
181CONFIG_MAGIC_SYSRQ=y
182CONFIG_DEBUG_KERNEL=y
183CONFIG_DEBUG_MUTEXES=y
184CONFIG_CRYPTO_MD5=y
arch/ia64/configs/tiger_defconfig+0−169
@@ -1,169 +0,0 @@
1CONFIG_SYSVIPC=y
2CONFIG_POSIX_MQUEUE=y
3CONFIG_IKCONFIG=y
4CONFIG_IKCONFIG_PROC=y
5CONFIG_LOG_BUF_SHIFT=20
6CONFIG_BLK_DEV_INITRD=y
7CONFIG_KALLSYMS_ALL=y
8CONFIG_MODULES=y
9CONFIG_MODULE_UNLOAD=y
10CONFIG_MODVERSIONS=y
11CONFIG_MODULE_SRCVERSION_ALL=y
12# CONFIG_BLK_DEV_BSG is not set
13CONFIG_PARTITION_ADVANCED=y
14CONFIG_SGI_PARTITION=y
15CONFIG_MCKINLEY=y
16CONFIG_IA64_PAGE_SIZE_64KB=y
17CONFIG_IA64_CYCLONE=y
18CONFIG_SMP=y
19CONFIG_NR_CPUS=16
20CONFIG_HOTPLUG_CPU=y
21CONFIG_PERMIT_BSP_REMOVE=y
22CONFIG_FORCE_CPEI_RETARGET=y
23CONFIG_IA64_MCA_RECOVERY=y
24CONFIG_IA64_PALINFO=y
25CONFIG_KEXEC=y
26CONFIG_BINFMT_MISC=m
27CONFIG_ACPI_BUTTON=m
28CONFIG_ACPI_FAN=m
29CONFIG_ACPI_PROCESSOR=m
30CONFIG_HOTPLUG_PCI=y
31CONFIG_NET=y
32CONFIG_PACKET=y
33CONFIG_UNIX=y
34CONFIG_INET=y
35CONFIG_IP_MULTICAST=y
36CONFIG_SYN_COOKIES=y
37# CONFIG_IPV6 is not set
38CONFIG_BLK_DEV_LOOP=m
39CONFIG_BLK_DEV_NBD=m
40CONFIG_BLK_DEV_RAM=y
41CONFIG_ATA=y
42CONFIG_ATA_GENERIC=y
43CONFIG_PATA_CMD64X=y
44CONFIG_ATA_PIIX=y
45CONFIG_SCSI=y
46CONFIG_BLK_DEV_SD=y
47CONFIG_CHR_DEV_ST=m
48CONFIG_BLK_DEV_SR=m
49CONFIG_CHR_DEV_SG=m
50CONFIG_SCSI_FC_ATTRS=y
51CONFIG_SCSI_SYM53C8XX_2=y
52CONFIG_SCSI_QLOGIC_1280=y
53CONFIG_MD=y
54CONFIG_BLK_DEV_MD=m
55CONFIG_MD_LINEAR=m
56CONFIG_MD_RAID0=m
57CONFIG_MD_RAID1=m
58CONFIG_MD_MULTIPATH=m
59CONFIG_BLK_DEV_DM=m
60CONFIG_DM_CRYPT=m
61CONFIG_DM_SNAPSHOT=m
62CONFIG_DM_MIRROR=m
63CONFIG_DM_ZERO=m
64CONFIG_FUSION=y
65CONFIG_FUSION_SPI=y
66CONFIG_FUSION_FC=y
67CONFIG_FUSION_CTL=y
68CONFIG_NETDEVICES=y
69CONFIG_DUMMY=m
70CONFIG_NETCONSOLE=y
71CONFIG_TIGON3=y
72CONFIG_NET_TULIP=y
73CONFIG_TULIP=m
74CONFIG_E100=m
75CONFIG_E1000=y
76# CONFIG_SERIO_SERPORT is not set
77CONFIG_GAMEPORT=m
78CONFIG_SERIAL_NONSTANDARD=y
79CONFIG_SERIAL_8250=y
80CONFIG_SERIAL_8250_CONSOLE=y
81CONFIG_SERIAL_8250_NR_UARTS=6
82CONFIG_SERIAL_8250_EXTENDED=y
83CONFIG_SERIAL_8250_SHARE_IRQ=y
84# CONFIG_HW_RANDOM is not set
85CONFIG_RTC_CLASS=y
86CONFIG_RTC_DRV_EFI=y
87CONFIG_HPET=y
88CONFIG_AGP=m
89CONFIG_AGP_I460=m
90CONFIG_DRM=m
91CONFIG_DRM_TDFX=m
92CONFIG_DRM_R128=m
93CONFIG_DRM_RADEON=m
94CONFIG_DRM_MGA=m
95CONFIG_DRM_SIS=m
96CONFIG_USB=y
97CONFIG_USB_EHCI_HCD=m
98CONFIG_USB_OHCI_HCD=m
99CONFIG_USB_UHCI_HCD=y
100CONFIG_USB_STORAGE=m
101CONFIG_EXT2_FS=y
102CONFIG_EXT2_FS_XATTR=y
103CONFIG_EXT2_FS_POSIX_ACL=y
104CONFIG_EXT2_FS_SECURITY=y
105CONFIG_EXT3_FS=y
106CONFIG_EXT3_FS_POSIX_ACL=y
107CONFIG_EXT3_FS_SECURITY=y
108CONFIG_REISERFS_FS=y
109CONFIG_REISERFS_FS_XATTR=y
110CONFIG_REISERFS_FS_POSIX_ACL=y
111CONFIG_REISERFS_FS_SECURITY=y
112CONFIG_XFS_FS=y
113CONFIG_AUTOFS_FS=y
114CONFIG_ISO9660_FS=m
115CONFIG_JOLIET=y
116CONFIG_UDF_FS=m
117CONFIG_VFAT_FS=y
118CONFIG_NTFS_FS=m
119CONFIG_PROC_KCORE=y
120CONFIG_TMPFS=y
121CONFIG_HUGETLBFS=y
122CONFIG_NFS_FS=m
123CONFIG_NFS_V4=m
124CONFIG_NFSD=m
125CONFIG_NFSD_V4=y
126CONFIG_CIFS=m
127CONFIG_NLS_CODEPAGE_437=y
128CONFIG_NLS_CODEPAGE_737=m
129CONFIG_NLS_CODEPAGE_775=m
130CONFIG_NLS_CODEPAGE_850=m
131CONFIG_NLS_CODEPAGE_852=m
132CONFIG_NLS_CODEPAGE_855=m
133CONFIG_NLS_CODEPAGE_857=m
134CONFIG_NLS_CODEPAGE_860=m
135CONFIG_NLS_CODEPAGE_861=m
136CONFIG_NLS_CODEPAGE_862=m
137CONFIG_NLS_CODEPAGE_863=m
138CONFIG_NLS_CODEPAGE_864=m
139CONFIG_NLS_CODEPAGE_865=m
140CONFIG_NLS_CODEPAGE_866=m
141CONFIG_NLS_CODEPAGE_869=m
142CONFIG_NLS_CODEPAGE_936=m
143CONFIG_NLS_CODEPAGE_950=m
144CONFIG_NLS_CODEPAGE_932=m
145CONFIG_NLS_CODEPAGE_949=m
146CONFIG_NLS_CODEPAGE_874=m
147CONFIG_NLS_ISO8859_8=m
148CONFIG_NLS_CODEPAGE_1250=m
149CONFIG_NLS_CODEPAGE_1251=m
150CONFIG_NLS_ISO8859_1=y
151CONFIG_NLS_ISO8859_2=m
152CONFIG_NLS_ISO8859_3=m
153CONFIG_NLS_ISO8859_4=m
154CONFIG_NLS_ISO8859_5=m
155CONFIG_NLS_ISO8859_6=m
156CONFIG_NLS_ISO8859_7=m
157CONFIG_NLS_ISO8859_9=m
158CONFIG_NLS_ISO8859_13=m
159CONFIG_NLS_ISO8859_14=m
160CONFIG_NLS_ISO8859_15=m
161CONFIG_NLS_KOI8_R=m
162CONFIG_NLS_KOI8_U=m
163CONFIG_NLS_UTF8=m
164CONFIG_MAGIC_SYSRQ=y
165CONFIG_DEBUG_KERNEL=y
166CONFIG_DEBUG_MUTEXES=y
167CONFIG_IA64_GRANULE_16MB=y
168CONFIG_CRYPTO_PCBC=m
169CONFIG_CRYPTO_MD5=y
arch/ia64/configs/zx1_defconfig+0−148
@@ -1,148 +0,0 @@
1CONFIG_SYSVIPC=y
2CONFIG_BSD_PROCESS_ACCT=y
3CONFIG_BLK_DEV_INITRD=y
4CONFIG_KPROBES=y
5CONFIG_MODULES=y
6CONFIG_PARTITION_ADVANCED=y
7CONFIG_MCKINLEY=y
8CONFIG_SMP=y
9CONFIG_NR_CPUS=16
10CONFIG_HOTPLUG_CPU=y
11CONFIG_FLATMEM_MANUAL=y
12CONFIG_IA64_MCA_RECOVERY=y
13CONFIG_IA64_PALINFO=y
14CONFIG_CRASH_DUMP=y
15CONFIG_BINFMT_MISC=y
16CONFIG_HOTPLUG_PCI=y
17CONFIG_HOTPLUG_PCI_ACPI=y
18CONFIG_NET=y
19CONFIG_PACKET=y
20CONFIG_UNIX=y
21CONFIG_INET=y
22CONFIG_IP_MULTICAST=y
23# CONFIG_IPV6 is not set
24CONFIG_NETFILTER=y
25CONFIG_BLK_DEV_LOOP=y
26CONFIG_BLK_DEV_RAM=y
27CONFIG_ATA=y
28CONFIG_ATA_GENERIC=y
29CONFIG_PATA_CMD64X=y
30CONFIG_SCSI=y
31CONFIG_BLK_DEV_SD=y
32CONFIG_CHR_DEV_ST=y
33CONFIG_BLK_DEV_SR=y
34CONFIG_CHR_DEV_SG=y
35CONFIG_SCSI_CONSTANTS=y
36CONFIG_SCSI_LOGGING=y
37CONFIG_SCSI_FC_ATTRS=y
38CONFIG_SCSI_SYM53C8XX_2=y
39CONFIG_SCSI_QLOGIC_1280=y
40CONFIG_FUSION=y
41CONFIG_FUSION_SPI=y
42CONFIG_FUSION_FC=y
43CONFIG_FUSION_CTL=m
44CONFIG_NETDEVICES=y
45CONFIG_DUMMY=y
46CONFIG_TIGON3=y
47CONFIG_NET_TULIP=y
48CONFIG_TULIP=y
49CONFIG_TULIP_MWI=y
50CONFIG_TULIP_MMIO=y
51CONFIG_TULIP_NAPI=y
52CONFIG_TULIP_NAPI_HW_MITIGATION=y
53CONFIG_E100=y
54CONFIG_E1000=y
55CONFIG_INPUT_JOYDEV=y
56CONFIG_INPUT_EVDEV=y
57# CONFIG_INPUT_KEYBOARD is not set
58# CONFIG_INPUT_MOUSE is not set
59# CONFIG_SERIO_I8042 is not set
60# CONFIG_SERIO_SERPORT is not set
61CONFIG_SERIAL_8250=y
62CONFIG_SERIAL_8250_CONSOLE=y
63CONFIG_SERIAL_8250_NR_UARTS=8
64CONFIG_SERIAL_8250_EXTENDED=y
65CONFIG_SERIAL_8250_SHARE_IRQ=y
66# CONFIG_HW_RANDOM is not set
67CONFIG_RTC_CLASS=y
68CONFIG_RTC_DRV_EFI=y
69CONFIG_I2C_CHARDEV=y
70CONFIG_AGP=y
71CONFIG_AGP_HP_ZX1=y
72CONFIG_DRM=y
73CONFIG_DRM_RADEON=y
74CONFIG_FB_RADEON=y
75CONFIG_FB_RADEON_DEBUG=y
76CONFIG_LOGO=y
77# CONFIG_LOGO_LINUX_MONO is not set
78# CONFIG_LOGO_LINUX_VGA16 is not set
79CONFIG_SOUND=y
80CONFIG_SND=y
81CONFIG_SND_SEQUENCER=y
82CONFIG_SND_MIXER_OSS=y
83CONFIG_SND_PCM_OSS=y
84CONFIG_SND_SEQUENCER_OSS=y
85CONFIG_SND_FM801=y
86CONFIG_USB_HIDDEV=y
87CONFIG_USB=y
88CONFIG_USB_MON=y
89CONFIG_USB_EHCI_HCD=y
90CONFIG_USB_OHCI_HCD=y
91CONFIG_USB_UHCI_HCD=y
92CONFIG_USB_STORAGE=y
93CONFIG_EXT2_FS=y
94CONFIG_EXT2_FS_XATTR=y
95CONFIG_EXT3_FS=y
96CONFIG_ISO9660_FS=y
97CONFIG_JOLIET=y
98CONFIG_UDF_FS=y
99CONFIG_MSDOS_FS=y
100CONFIG_VFAT_FS=y
101CONFIG_PROC_KCORE=y
102CONFIG_TMPFS=y
103CONFIG_HUGETLBFS=y
104CONFIG_NFS_FS=y
105CONFIG_NFS_V4=y
106CONFIG_NFSD=y
107CONFIG_NLS_CODEPAGE_437=y
108CONFIG_NLS_CODEPAGE_737=y
109CONFIG_NLS_CODEPAGE_775=y
110CONFIG_NLS_CODEPAGE_850=y
111CONFIG_NLS_CODEPAGE_852=y
112CONFIG_NLS_CODEPAGE_855=y
113CONFIG_NLS_CODEPAGE_857=y
114CONFIG_NLS_CODEPAGE_860=y
115CONFIG_NLS_CODEPAGE_861=y
116CONFIG_NLS_CODEPAGE_862=y
117CONFIG_NLS_CODEPAGE_863=y
118CONFIG_NLS_CODEPAGE_864=y
119CONFIG_NLS_CODEPAGE_865=y
120CONFIG_NLS_CODEPAGE_866=y
121CONFIG_NLS_CODEPAGE_869=y
122CONFIG_NLS_CODEPAGE_936=y
123CONFIG_NLS_CODEPAGE_950=y
124CONFIG_NLS_CODEPAGE_932=y
125CONFIG_NLS_CODEPAGE_949=y
126CONFIG_NLS_CODEPAGE_874=y
127CONFIG_NLS_ISO8859_8=y
128CONFIG_NLS_CODEPAGE_1251=y
129CONFIG_NLS_ISO8859_1=y
130CONFIG_NLS_ISO8859_2=y
131CONFIG_NLS_ISO8859_3=y
132CONFIG_NLS_ISO8859_4=y
133CONFIG_NLS_ISO8859_5=y
134CONFIG_NLS_ISO8859_6=y
135CONFIG_NLS_ISO8859_7=y
136CONFIG_NLS_ISO8859_9=y
137CONFIG_NLS_ISO8859_13=y
138CONFIG_NLS_ISO8859_14=y
139CONFIG_NLS_ISO8859_15=y
140CONFIG_NLS_KOI8_R=y
141CONFIG_NLS_KOI8_U=y
142CONFIG_NLS_UTF8=y
143CONFIG_MAGIC_SYSRQ=y
144CONFIG_DEBUG_KERNEL=y
145CONFIG_DEBUG_MUTEXES=y
146CONFIG_IA64_PRINT_HAZARDS=y
147CONFIG_CRYPTO_ECB=m
148CONFIG_CRYPTO_PCBC=m
arch/ia64/hp/common/Makefile+0−10
@@ -1,10 +0,0 @@
1# SPDX-License-Identifier: GPL-2.0-only
2#
3# ia64/platform/hp/common/Makefile
4#
5# Copyright (C) 2002 Hewlett Packard
6# Copyright (C) Alex Williamson (alex_williamson@hp.com)
7#
8
9obj-$(CONFIG_IA64_HP_SBA_IOMMU) += sba_iommu.o
10obj-$(CONFIG_IA64_HP_AML_NFW) += aml_nfw.o
arch/ia64/hp/common/aml_nfw.c+0−232
@@ -1,232 +0,0 @@
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * OpRegion handler to allow AML to call native firmware
4 *
5 * (c) Copyright 2007 Hewlett-Packard Development Company, L.P.
6 * Bjorn Helgaas <bjorn.helgaas@hp.com>
7 *
8 * This driver implements HP Open Source Review Board proposal 1842,
9 * which was approved on 9/20/2006.
10 *
11 * For technical documentation, see the HP SPPA Firmware EAS, Appendix F.
12 *
13 * ACPI does not define a mechanism for AML methods to call native firmware
14 * interfaces such as PAL or SAL. This OpRegion handler adds such a mechanism.
15 * After the handler is installed, an AML method can call native firmware by
16 * storing the arguments and firmware entry point to specific offsets in the
17 * OpRegion. When AML reads the "return value" offset from the OpRegion, this
18 * handler loads up the arguments, makes the firmware call, and returns the
19 * result.
20 */
21
22#include <linux/module.h>
23#include <linux/acpi.h>
24#include <asm/sal.h>
25
26MODULE_AUTHOR("Bjorn Helgaas <bjorn.helgaas@hp.com>");
27MODULE_LICENSE("GPL");
28MODULE_DESCRIPTION("ACPI opregion handler for native firmware calls");
29
30static bool force_register;
31module_param_named(force, force_register, bool, 0);
32MODULE_PARM_DESC(force, "Install opregion handler even without HPQ5001 device");
33
34#define AML_NFW_SPACE 0xA1
35
36struct ia64_pdesc {
37 void *ip;
38 void *gp;
39};
40
41/*
42 * N.B. The layout of this structure is defined in the HP SPPA FW EAS, and
43 * the member offsets are embedded in AML methods.
44 */
45struct ia64_nfw_context {
46 u64 arg[8];
47 struct ia64_sal_retval ret;
48 u64 ip;
49 u64 gp;
50 u64 pad[2];
51};
52
53static void *virt_map(u64 address)
54{
55 if (address & (1UL << 63))
56 return (void *) (__IA64_UNCACHED_OFFSET | address);
57
58 return __va(address);
59}
60
61static void aml_nfw_execute(struct ia64_nfw_context *c)
62{
63 struct ia64_pdesc virt_entry;
64 ia64_sal_handler entry;
65
66 virt_entry.ip = virt_map(c->ip);
67 virt_entry.gp = virt_map(c->gp);
68
69 entry = (ia64_sal_handler) &virt_entry;
70
71 IA64_FW_CALL(entry, c->ret,
72 c->arg[0], c->arg[1], c->arg[2], c->arg[3],
73 c->arg[4], c->arg[5], c->arg[6], c->arg[7]);
74}
75
76static void aml_nfw_read_arg(u8 *offset, u32 bit_width, u64 *value)
77{
78 switch (bit_width) {
79 case 8:
80 *value = *(u8 *)offset;
81 break;
82 case 16:
83 *value = *(u16 *)offset;
84 break;
85 case 32:
86 *value = *(u32 *)offset;
87 break;
88 case 64:
89 *value = *(u64 *)offset;
90 break;
91 }
92}
93
94static void aml_nfw_write_arg(u8 *offset, u32 bit_width, u64 *value)
95{
96 switch (bit_width) {
97 case 8:
98 *(u8 *) offset = *value;
99 break;
100 case 16:
101 *(u16 *) offset = *value;
102 break;
103 case 32:
104 *(u32 *) offset = *value;
105 break;
106 case 64:
107 *(u64 *) offset = *value;
108 break;
109 }
110}
111
112static acpi_status aml_nfw_handler(u32 function, acpi_physical_address address,
113 u32 bit_width, u64 *value, void *handler_context,
114 void *region_context)
115{
116 struct ia64_nfw_context *context = handler_context;
117 u8 *offset = (u8 *) context + address;
118
119 if (bit_width != 8 && bit_width != 16 &&
120 bit_width != 32 && bit_width != 64)
121 return AE_BAD_PARAMETER;
122
123 if (address + (bit_width >> 3) > sizeof(struct ia64_nfw_context))
124 return AE_BAD_PARAMETER;
125
126 switch (function) {
127 case ACPI_READ:
128 if (address == offsetof(struct ia64_nfw_context, ret))
129 aml_nfw_execute(context);
130 aml_nfw_read_arg(offset, bit_width, value);
131 break;
132 case ACPI_WRITE:
133 aml_nfw_write_arg(offset, bit_width, value);
134 break;
135 }
136
137 return AE_OK;
138}
139
140static struct ia64_nfw_context global_context;
141static int global_handler_registered;
142
143static int aml_nfw_add_global_handler(void)
144{
145 acpi_status status;
146
147 if (global_handler_registered)
148 return 0;
149
150 status = acpi_install_address_space_handler(ACPI_ROOT_OBJECT,
151 AML_NFW_SPACE, aml_nfw_handler, NULL, &global_context);
152 if (ACPI_FAILURE(status))
153 return -ENODEV;
154
155 global_handler_registered = 1;
156 printk(KERN_INFO "Global 0x%02X opregion handler registered\n",
157 AML_NFW_SPACE);
158 return 0;
159}
160
161static int aml_nfw_remove_global_handler(void)
162{
163 acpi_status status;
164
165 if (!global_handler_registered)
166 return 0;
167
168 status = acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
169 AML_NFW_SPACE, aml_nfw_handler);
170 if (ACPI_FAILURE(status))
171 return -ENODEV;
172
173 global_handler_registered = 0;
174 printk(KERN_INFO "Global 0x%02X opregion handler removed\n",
175 AML_NFW_SPACE);
176 return 0;
177}
178
179static int aml_nfw_add(struct acpi_device *device)
180{
181 /*
182 * We would normally allocate a new context structure and install
183 * the address space handler for the specific device we found.
184 * But the HP-UX implementation shares a single global context
185 * and always puts the handler at the root, so we'll do the same.
186 */
187 return aml_nfw_add_global_handler();
188}
189
190static void aml_nfw_remove(struct acpi_device *device)
191{
192 aml_nfw_remove_global_handler();
193}
194
195static const struct acpi_device_id aml_nfw_ids[] = {
196 {"HPQ5001", 0},
197 {"", 0}
198};
199
200static struct acpi_driver acpi_aml_nfw_driver = {
201 .name = "native firmware",
202 .ids = aml_nfw_ids,
203 .ops = {
204 .add = aml_nfw_add,
205 .remove = aml_nfw_remove,
206 },
207};
208
209static int __init aml_nfw_init(void)
210{
211 int result;
212
213 if (force_register)
214 aml_nfw_add_global_handler();
215
216 result = acpi_bus_register_driver(&acpi_aml_nfw_driver);
217 if (result < 0) {
218 aml_nfw_remove_global_handler();
219 return result;
220 }
221
222 return 0;
223}
224
225static void __exit aml_nfw_exit(void)
226{
227 acpi_bus_unregister_driver(&acpi_aml_nfw_driver);
228 aml_nfw_remove_global_handler();
229}
230
231module_init(aml_nfw_init);
232module_exit(aml_nfw_exit);
arch/ia64/hp/common/sba_iommu.c+0−2155
@@ -1,2155 +0,0 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3** IA64 System Bus Adapter (SBA) I/O MMU manager
4**
5** (c) Copyright 2002-2005 Alex Williamson
6** (c) Copyright 2002-2003 Grant Grundler
7** (c) Copyright 2002-2005 Hewlett-Packard Company
8**
9** Portions (c) 2000 Grant Grundler (from parisc I/O MMU code)
10** Portions (c) 1999 Dave S. Miller (from sparc64 I/O MMU code)
11**
12**
13**
14** This module initializes the IOC (I/O Controller) found on HP
15** McKinley machines and their successors.
16**
17*/
18
19#include <linux/types.h>
20#include <linux/kernel.h>
21#include <linux/module.h>
22#include <linux/spinlock.h>
23#include <linux/slab.h>
24#include <linux/init.h>
25#include <linux/mm.h>
26#include <linux/string.h>
27#include <linux/pci.h>
28#include <linux/proc_fs.h>
29#include <linux/seq_file.h>
30#include <linux/acpi.h>
31#include <linux/efi.h>
32#include <linux/nodemask.h>
33#include <linux/bitops.h> /* hweight64() */
34#include <linux/crash_dump.h>
35#include <linux/iommu-helper.h>
36#include <linux/dma-map-ops.h>
37#include <linux/prefetch.h>
38#include <linux/swiotlb.h>
39
40#include <asm/delay.h> /* ia64_get_itc() */
41#include <asm/io.h>
42#include <asm/page.h> /* PAGE_OFFSET */
43#include <asm/dma.h>
44
45#include <asm/acpi-ext.h>
46
47#define PFX "IOC: "
48
49/*
50** Enabling timing search of the pdir resource map. Output in /proc.
51** Disabled by default to optimize performance.
52*/
53#undef PDIR_SEARCH_TIMING
54
55/*
56** This option allows cards capable of 64bit DMA to bypass the IOMMU. If
57** not defined, all DMA will be 32bit and go through the TLB.
58** There's potentially a conflict in the bio merge code with us
59** advertising an iommu, but then bypassing it. Since I/O MMU bypassing
60** appears to give more performance than bio-level virtual merging, we'll
61** do the former for now. NOTE: BYPASS_SG also needs to be undef'd to
62** completely restrict DMA to the IOMMU.
63*/
64#define ALLOW_IOV_BYPASS
65
66/*
67** This option specifically allows/disallows bypassing scatterlists with
68** multiple entries. Coalescing these entries can allow better DMA streaming
69** and in some cases shows better performance than entirely bypassing the
70** IOMMU. Performance increase on the order of 1-2% sequential output/input
71** using bonnie++ on a RAID0 MD device (sym2 & mpt).
72*/
73#undef ALLOW_IOV_BYPASS_SG
74
75/*
76** If a device prefetches beyond the end of a valid pdir entry, it will cause
77** a hard failure, ie. MCA. Version 3.0 and later of the zx1 LBA should
78** disconnect on 4k boundaries and prevent such issues. If the device is
79** particularly aggressive, this option will keep the entire pdir valid such
80** that prefetching will hit a valid address. This could severely impact
81** error containment, and is therefore off by default. The page that is
82** used for spill-over is poisoned, so that should help debugging somewhat.
83*/
84#undef FULL_VALID_PDIR
85
86#define ENABLE_MARK_CLEAN
87
88/*
89** The number of debug flags is a clue - this code is fragile. NOTE: since
90** tightening the use of res_lock the resource bitmap and actual pdir are no
91** longer guaranteed to stay in sync. The sanity checking code isn't going to
92** like that.
93*/
94#undef DEBUG_SBA_INIT
95#undef DEBUG_SBA_RUN
96#undef DEBUG_SBA_RUN_SG
97#undef DEBUG_SBA_RESOURCE
98#undef ASSERT_PDIR_SANITY
99#undef DEBUG_LARGE_SG_ENTRIES
100#undef DEBUG_BYPASS
101
102#if defined(FULL_VALID_PDIR) && defined(ASSERT_PDIR_SANITY)
103#error FULL_VALID_PDIR and ASSERT_PDIR_SANITY are mutually exclusive
104#endif
105
106#define SBA_INLINE __inline__
107/* #define SBA_INLINE */
108
109#ifdef DEBUG_SBA_INIT
110#define DBG_INIT(x...) printk(x)
111#else
112#define DBG_INIT(x...)
113#endif
114
115#ifdef DEBUG_SBA_RUN
116#define DBG_RUN(x...) printk(x)
117#else
118#define DBG_RUN(x...)
119#endif
120
121#ifdef DEBUG_SBA_RUN_SG
122#define DBG_RUN_SG(x...) printk(x)
123#else
124#define DBG_RUN_SG(x...)
125#endif
126
127
128#ifdef DEBUG_SBA_RESOURCE
129#define DBG_RES(x...) printk(x)
130#else
131#define DBG_RES(x...)
132#endif
133
134#ifdef DEBUG_BYPASS
135#define DBG_BYPASS(x...) printk(x)
136#else
137#define DBG_BYPASS(x...)
138#endif
139
140#ifdef ASSERT_PDIR_SANITY
141#define ASSERT(expr) \
142 if(!(expr)) { \
143 printk( "\n" __FILE__ ":%d: Assertion " #expr " failed!\n",__LINE__); \
144 panic(#expr); \
145 }
146#else
147#define ASSERT(expr)
148#endif
149
150/*
151** The number of pdir entries to "free" before issuing
152** a read to PCOM register to flush out PCOM writes.
153** Interacts with allocation granularity (ie 4 or 8 entries
154** allocated and free'd/purged at a time might make this
155** less interesting).
156*/
157#define DELAYED_RESOURCE_CNT 64
158
159#define PCI_DEVICE_ID_HP_SX2000_IOC 0x12ec
160
161#define ZX1_IOC_ID ((PCI_DEVICE_ID_HP_ZX1_IOC << 16) | PCI_VENDOR_ID_HP)
162#define ZX2_IOC_ID ((PCI_DEVICE_ID_HP_ZX2_IOC << 16) | PCI_VENDOR_ID_HP)
163#define REO_IOC_ID ((PCI_DEVICE_ID_HP_REO_IOC << 16) | PCI_VENDOR_ID_HP)
164#define SX1000_IOC_ID ((PCI_DEVICE_ID_HP_SX1000_IOC << 16) | PCI_VENDOR_ID_HP)
165#define SX2000_IOC_ID ((PCI_DEVICE_ID_HP_SX2000_IOC << 16) | PCI_VENDOR_ID_HP)
166
167#define ZX1_IOC_OFFSET 0x1000 /* ACPI reports SBA, we want IOC */
168
169#define IOC_FUNC_ID 0x000
170#define IOC_FCLASS 0x008 /* function class, bist, header, rev... */
171#define IOC_IBASE 0x300 /* IO TLB */
172#define IOC_IMASK 0x308
173#define IOC_PCOM 0x310
174#define IOC_TCNFG 0x318
175#define IOC_PDIR_BASE 0x320
176
177#define IOC_ROPE0_CFG 0x500
178#define IOC_ROPE_AO 0x10 /* Allow "Relaxed Ordering" */
179
180
181/* AGP GART driver looks for this */
182#define ZX1_SBA_IOMMU_COOKIE 0x0000badbadc0ffeeUL
183
184/*
185** The zx1 IOC supports 4/8/16/64KB page sizes (see TCNFG register)
186**
187** Some IOCs (sx1000) can run at the above pages sizes, but are
188** really only supported using the IOC at a 4k page size.
189**
190** iovp_size could only be greater than PAGE_SIZE if we are
191** confident the drivers really only touch the next physical
192** page iff that driver instance owns it.
193*/
194static unsigned long iovp_size;
195static unsigned long iovp_shift;
196static unsigned long iovp_mask;
197
198struct ioc {
199 void __iomem *ioc_hpa; /* I/O MMU base address */
200 char *res_map; /* resource map, bit == pdir entry */
201 u64 *pdir_base; /* physical base address */
202 unsigned long ibase; /* pdir IOV Space base */
203 unsigned long imask; /* pdir IOV Space mask */
204
205 unsigned long *res_hint; /* next avail IOVP - circular search */
206 unsigned long dma_mask;
207 spinlock_t res_lock; /* protects the resource bitmap, but must be held when */
208 /* clearing pdir to prevent races with allocations. */
209 unsigned int res_bitshift; /* from the RIGHT! */
210 unsigned int res_size; /* size of resource map in bytes */
211#ifdef CONFIG_NUMA
212 unsigned int node; /* node where this IOC lives */
213#endif
214#if DELAYED_RESOURCE_CNT > 0
215 spinlock_t saved_lock; /* may want to try to get this on a separate cacheline */
216 /* than res_lock for bigger systems. */
217 int saved_cnt;
218 struct sba_dma_pair {
219 dma_addr_t iova;
220 size_t size;
221 } saved[DELAYED_RESOURCE_CNT];
222#endif
223
224#ifdef PDIR_SEARCH_TIMING
225#define SBA_SEARCH_SAMPLE 0x100
226 unsigned long avg_search[SBA_SEARCH_SAMPLE];
227 unsigned long avg_idx; /* current index into avg_search */
228#endif
229
230 /* Stuff we don't need in performance path */
231 struct ioc *next; /* list of IOC's in system */
232 acpi_handle handle; /* for multiple IOC's */
233 const char *name;
234 unsigned int func_id;
235 unsigned int rev; /* HW revision of chip */
236 u32 iov_size;
237 unsigned int pdir_size; /* in bytes, determined by IOV Space size */
238 struct pci_dev *sac_only_dev;
239};
240
241static struct ioc *ioc_list, *ioc_found;
242static int reserve_sba_gart = 1;
243
244static SBA_INLINE void sba_mark_invalid(struct ioc *, dma_addr_t, size_t);
245static SBA_INLINE void sba_free_range(struct ioc *, dma_addr_t, size_t);
246
247#define sba_sg_address(sg) sg_virt((sg))
248
249#ifdef FULL_VALID_PDIR
250static u64 prefetch_spill_page;
251#endif
252
253#define GET_IOC(dev) ((dev_is_pci(dev)) \
254 ? ((struct ioc *) PCI_CONTROLLER(to_pci_dev(dev))->iommu) : NULL)
255
256/*
257** DMA_CHUNK_SIZE is used by the SCSI mid-layer to break up
258** (or rather not merge) DMAs into manageable chunks.
259** On parisc, this is more of the software/tuning constraint
260** rather than the HW. I/O MMU allocation algorithms can be
261** faster with smaller sizes (to some degree).
262*/
263#define DMA_CHUNK_SIZE (BITS_PER_LONG*iovp_size)
264
265#define ROUNDUP(x,y) ((x + ((y)-1)) & ~((y)-1))
266
267/************************************
268** SBA register read and write support
269**
270** BE WARNED: register writes are posted.
271** (ie follow writes which must reach HW with a read)
272**
273*/
274#define READ_REG(addr) __raw_readq(addr)
275#define WRITE_REG(val, addr) __raw_writeq(val, addr)
276
277#ifdef DEBUG_SBA_INIT
278
279/**
280 * sba_dump_tlb - debugging only - print IOMMU operating parameters
281 * @hpa: base address of the IOMMU
282 *
283 * Print the size/location of the IO MMU PDIR.
284 */
285static void
286sba_dump_tlb(char *hpa)
287{
288 DBG_INIT("IO TLB at 0x%p\n", (void *)hpa);
289 DBG_INIT("IOC_IBASE : %016lx\n", READ_REG(hpa+IOC_IBASE));
290 DBG_INIT("IOC_IMASK : %016lx\n", READ_REG(hpa+IOC_IMASK));
291 DBG_INIT("IOC_TCNFG : %016lx\n", READ_REG(hpa+IOC_TCNFG));
292 DBG_INIT("IOC_PDIR_BASE: %016lx\n", READ_REG(hpa+IOC_PDIR_BASE));
293 DBG_INIT("\n");
294}
295#endif
296
297
298#ifdef ASSERT_PDIR_SANITY
299
300/**
301 * sba_dump_pdir_entry - debugging only - print one IOMMU PDIR entry
302 * @ioc: IO MMU structure which owns the pdir we are interested in.
303 * @msg: text to print ont the output line.
304 * @pide: pdir index.
305 *
306 * Print one entry of the IO MMU PDIR in human readable form.
307 */
308static void
309sba_dump_pdir_entry(struct ioc *ioc, char *msg, uint pide)
310{
311 /* start printing from lowest pde in rval */
312 u64 *ptr = &ioc->pdir_base[pide & ~(BITS_PER_LONG - 1)];
313 unsigned long *rptr = (unsigned long *) &ioc->res_map[(pide >>3) & -sizeof(unsigned long)];
314 uint rcnt;
315
316 printk(KERN_DEBUG "SBA: %s rp %p bit %d rval 0x%lx\n",
317 msg, rptr, pide & (BITS_PER_LONG - 1), *rptr);
318
319 rcnt = 0;
320 while (rcnt < BITS_PER_LONG) {
321 printk(KERN_DEBUG "%s %2d %p %016Lx\n",
322 (rcnt == (pide & (BITS_PER_LONG - 1)))
323 ? " -->" : " ",
324 rcnt, ptr, (unsigned long long) *ptr );
325 rcnt++;
326 ptr++;
327 }
328 printk(KERN_DEBUG "%s", msg);
329}
330
331
332/**
333 * sba_check_pdir - debugging only - consistency checker
334 * @ioc: IO MMU structure which owns the pdir we are interested in.
335 * @msg: text to print ont the output line.
336 *
337 * Verify the resource map and pdir state is consistent
338 */
339static int
340sba_check_pdir(struct ioc *ioc, char *msg)
341{
342 u64 *rptr_end = (u64 *) &(ioc->res_map[ioc->res_size]);
343 u64 *rptr = (u64 *) ioc->res_map; /* resource map ptr */
344 u64 *pptr = ioc->pdir_base; /* pdir ptr */
345 uint pide = 0;
346
347 while (rptr < rptr_end) {
348 u64 rval;
349 int rcnt; /* number of bits we might check */
350
351 rval = *rptr;
352 rcnt = 64;
353
354 while (rcnt) {
355 /* Get last byte and highest bit from that */
356 u32 pde = ((u32)((*pptr >> (63)) & 0x1));
357 if ((rval & 0x1) ^ pde)
358 {
359 /*
360 ** BUMMER! -- res_map != pdir --
361 ** Dump rval and matching pdir entries
362 */
363 sba_dump_pdir_entry(ioc, msg, pide);
364 return(1);
365 }
366 rcnt--;
367 rval >>= 1; /* try the next bit */
368 pptr++;
369 pide++;
370 }
371 rptr++; /* look at next word of res_map */
372 }
373 /* It'd be nice if we always got here :^) */
374 return 0;
375}
376
377
378/**
379 * sba_dump_sg - debugging only - print Scatter-Gather list
380 * @ioc: IO MMU structure which owns the pdir we are interested in.
381 * @startsg: head of the SG list
382 * @nents: number of entries in SG list
383 *
384 * print the SG list so we can verify it's correct by hand.
385 */
386static void
387sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents)
388{
389 while (nents-- > 0) {
390 printk(KERN_DEBUG " %d : DMA %08lx/%05x CPU %p\n", nents,
391 startsg->dma_address, startsg->dma_length,
392 sba_sg_address(startsg));
393 startsg = sg_next(startsg);
394 }
395}
396
397static void
398sba_check_sg( struct ioc *ioc, struct scatterlist *startsg, int nents)
399{
400 struct scatterlist *the_sg = startsg;
401 int the_nents = nents;
402
403 while (the_nents-- > 0) {
404 if (sba_sg_address(the_sg) == 0x0UL)
405 sba_dump_sg(NULL, startsg, nents);
406 the_sg = sg_next(the_sg);
407 }
408}
409
410#endif /* ASSERT_PDIR_SANITY */
411
412
413
414
415/**************************************************************
416*
417* I/O Pdir Resource Management
418*
419* Bits set in the resource map are in use.
420* Each bit can represent a number of pages.
421* LSbs represent lower addresses (IOVA's).
422*
423***************************************************************/
424#define PAGES_PER_RANGE 1 /* could increase this to 4 or 8 if needed */
425
426/* Convert from IOVP to IOVA and vice versa. */
427#define SBA_IOVA(ioc,iovp,offset) ((ioc->ibase) | (iovp) | (offset))
428#define SBA_IOVP(ioc,iova) ((iova) & ~(ioc->ibase))
429
430#define PDIR_ENTRY_SIZE sizeof(u64)
431
432#define PDIR_INDEX(iovp) ((iovp)>>iovp_shift)
433
434#define RESMAP_MASK(n) ~(~0UL << (n))
435#define RESMAP_IDX_MASK (sizeof(unsigned long) - 1)
436
437
438/**
439 * For most cases the normal get_order is sufficient, however it limits us
440 * to PAGE_SIZE being the minimum mapping alignment and TC flush granularity.
441 * It only incurs about 1 clock cycle to use this one with the static variable
442 * and makes the code more intuitive.
443 */
444static SBA_INLINE int
445get_iovp_order (unsigned long size)
446{
447 long double d = size - 1;
448 long order;
449
450 order = ia64_getf_exp(d);
451 order = order - iovp_shift - 0xffff + 1;
452 if (order < 0)
453 order = 0;
454 return order;
455}
456
457static unsigned long ptr_to_pide(struct ioc *ioc, unsigned long *res_ptr,
458 unsigned int bitshiftcnt)
459{
460 return (((unsigned long)res_ptr - (unsigned long)ioc->res_map) << 3)
461 + bitshiftcnt;
462}
463
464/**
465 * sba_search_bitmap - find free space in IO PDIR resource bitmap
466 * @ioc: IO MMU structure which owns the pdir we are interested in.
467 * @bits_wanted: number of entries we need.
468 * @use_hint: use res_hint to indicate where to start looking
469 *
470 * Find consecutive free bits in resource bitmap.
471 * Each bit represents one entry in the IO Pdir.
472 * Cool perf optimization: search for log2(size) bits at a time.
473 */
474static SBA_INLINE unsigned long
475sba_search_bitmap(struct ioc *ioc, struct device *dev,
476 unsigned long bits_wanted, int use_hint)
477{
478 unsigned long *res_ptr;
479 unsigned long *res_end = (unsigned long *) &(ioc->res_map[ioc->res_size]);
480 unsigned long flags, pide = ~0UL, tpide;
481 unsigned long boundary_size;
482 unsigned long shift;
483 int ret;
484
485 ASSERT(((unsigned long) ioc->res_hint & (sizeof(unsigned long) - 1UL)) == 0);
486 ASSERT(res_ptr < res_end);
487
488 boundary_size = dma_get_seg_boundary_nr_pages(dev, iovp_shift);
489
490 BUG_ON(ioc->ibase & ~iovp_mask);
491 shift = ioc->ibase >> iovp_shift;
492
493 spin_lock_irqsave(&ioc->res_lock, flags);
494
495 /* Allow caller to force a search through the entire resource space */
496 if (likely(use_hint)) {
497 res_ptr = ioc->res_hint;
498 } else {
499 res_ptr = (ulong *)ioc->res_map;
500 ioc->res_bitshift = 0;
501 }
502
503 /*
504 * N.B. REO/Grande defect AR2305 can cause TLB fetch timeouts
505 * if a TLB entry is purged while in use. sba_mark_invalid()
506 * purges IOTLB entries in power-of-two sizes, so we also
507 * allocate IOVA space in power-of-two sizes.
508 */
509 bits_wanted = 1UL << get_iovp_order(bits_wanted << iovp_shift);
510
511 if (likely(bits_wanted == 1)) {
512 unsigned int bitshiftcnt;
513 for(; res_ptr < res_end ; res_ptr++) {
514 if (likely(*res_ptr != ~0UL)) {
515 bitshiftcnt = ffz(*res_ptr);
516 *res_ptr |= (1UL << bitshiftcnt);
517 pide = ptr_to_pide(ioc, res_ptr, bitshiftcnt);
518 ioc->res_bitshift = bitshiftcnt + bits_wanted;
519 goto found_it;
520 }
521 }
522 goto not_found;
523
524 }
525
526 if (likely(bits_wanted <= BITS_PER_LONG/2)) {
527 /*
528 ** Search the resource bit map on well-aligned values.
529 ** "o" is the alignment.
530 ** We need the alignment to invalidate I/O TLB using
531 ** SBA HW features in the unmap path.
532 */
533 unsigned long o = 1 << get_iovp_order(bits_wanted << iovp_shift);
534 uint bitshiftcnt = ROUNDUP(ioc->res_bitshift, o);
535 unsigned long mask, base_mask;
536
537 base_mask = RESMAP_MASK(bits_wanted);
538 mask = base_mask << bitshiftcnt;
539
540 DBG_RES("%s() o %ld %p", __func__, o, res_ptr);
541 for(; res_ptr < res_end ; res_ptr++)
542 {
543 DBG_RES(" %p %lx %lx\n", res_ptr, mask, *res_ptr);
544 ASSERT(0 != mask);
545 for (; mask ; mask <<= o, bitshiftcnt += o) {
546 tpide = ptr_to_pide(ioc, res_ptr, bitshiftcnt);
547 ret = iommu_is_span_boundary(tpide, bits_wanted,
548 shift,
549 boundary_size);
550 if ((0 == ((*res_ptr) & mask)) && !ret) {
551 *res_ptr |= mask; /* mark resources busy! */
552 pide = tpide;
553 ioc->res_bitshift = bitshiftcnt + bits_wanted;
554 goto found_it;
555 }
556 }
557
558 bitshiftcnt = 0;
559 mask = base_mask;
560
561 }
562
563 } else {
564 int qwords, bits, i;
565 unsigned long *end;
566
567 qwords = bits_wanted >> 6; /* /64 */
568 bits = bits_wanted - (qwords * BITS_PER_LONG);
569
570 end = res_end - qwords;
571
572 for (; res_ptr < end; res_ptr++) {
573 tpide = ptr_to_pide(ioc, res_ptr, 0);
574 ret = iommu_is_span_boundary(tpide, bits_wanted,
575 shift, boundary_size);
576 if (ret)
577 goto next_ptr;
578 for (i = 0 ; i < qwords ; i++) {
579 if (res_ptr[i] != 0)
580 goto next_ptr;
581 }
582 if (bits && res_ptr[i] && (__ffs(res_ptr[i]) < bits))
583 continue;
584
585 /* Found it, mark it */
586 for (i = 0 ; i < qwords ; i++)
587 res_ptr[i] = ~0UL;
588 res_ptr[i] |= RESMAP_MASK(bits);
589
590 pide = tpide;
591 res_ptr += qwords;
592 ioc->res_bitshift = bits;
593 goto found_it;
594next_ptr:
595 ;
596 }
597 }
598
599not_found:
600 prefetch(ioc->res_map);
601 ioc->res_hint = (unsigned long *) ioc->res_map;
602 ioc->res_bitshift = 0;
603 spin_unlock_irqrestore(&ioc->res_lock, flags);
604 return (pide);
605
606found_it:
607 ioc->res_hint = res_ptr;
608 spin_unlock_irqrestore(&ioc->res_lock, flags);
609 return (pide);
610}
611
612
613/**
614 * sba_alloc_range - find free bits and mark them in IO PDIR resource bitmap
615 * @ioc: IO MMU structure which owns the pdir we are interested in.
616 * @size: number of bytes to create a mapping for
617 *
618 * Given a size, find consecutive unmarked and then mark those bits in the
619 * resource bit map.
620 */
621static int
622sba_alloc_range(struct ioc *ioc, struct device *dev, size_t size)
623{
624 unsigned int pages_needed = size >> iovp_shift;
625#ifdef PDIR_SEARCH_TIMING
626 unsigned long itc_start;
627#endif
628 unsigned long pide;
629
630 ASSERT(pages_needed);
631 ASSERT(0 == (size & ~iovp_mask));
632
633#ifdef PDIR_SEARCH_TIMING
634 itc_start = ia64_get_itc();
635#endif
636 /*
637 ** "seek and ye shall find"...praying never hurts either...
638 */
639 pide = sba_search_bitmap(ioc, dev, pages_needed, 1);
640 if (unlikely(pide >= (ioc->res_size << 3))) {
641 pide = sba_search_bitmap(ioc, dev, pages_needed, 0);
642 if (unlikely(pide >= (ioc->res_size << 3))) {
643#if DELAYED_RESOURCE_CNT > 0
644 unsigned long flags;
645
646 /*
647 ** With delayed resource freeing, we can give this one more shot. We're
648 ** getting close to being in trouble here, so do what we can to make this
649 ** one count.
650 */
651 spin_lock_irqsave(&ioc->saved_lock, flags);
652 if (ioc->saved_cnt > 0) {
653 struct sba_dma_pair *d;
654 int cnt = ioc->saved_cnt;
655
656 d = &(ioc->saved[ioc->saved_cnt - 1]);
657
658 spin_lock(&ioc->res_lock);
659 while (cnt--) {
660 sba_mark_invalid(ioc, d->iova, d->size);
661 sba_free_range(ioc, d->iova, d->size);
662 d--;
663 }
664 ioc->saved_cnt = 0;
665 READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */
666 spin_unlock(&ioc->res_lock);
667 }
668 spin_unlock_irqrestore(&ioc->saved_lock, flags);
669
670 pide = sba_search_bitmap(ioc, dev, pages_needed, 0);
671 if (unlikely(pide >= (ioc->res_size << 3))) {
672 printk(KERN_WARNING "%s: I/O MMU @ %p is"
673 "out of mapping resources, %u %u %lx\n",
674 __func__, ioc->ioc_hpa, ioc->res_size,
675 pages_needed, dma_get_seg_boundary(dev));
676 return -1;
677 }
678#else
679 printk(KERN_WARNING "%s: I/O MMU @ %p is"
680 "out of mapping resources, %u %u %lx\n",
681 __func__, ioc->ioc_hpa, ioc->res_size,
682 pages_needed, dma_get_seg_boundary(dev));
683 return -1;
684#endif
685 }
686 }
687
688#ifdef PDIR_SEARCH_TIMING
689 ioc->avg_search[ioc->avg_idx++] = (ia64_get_itc() - itc_start) / pages_needed;
690 ioc->avg_idx &= SBA_SEARCH_SAMPLE - 1;
691#endif
692
693 prefetchw(&(ioc->pdir_base[pide]));
694
695#ifdef ASSERT_PDIR_SANITY
696 /* verify the first enable bit is clear */
697 if(0x00 != ((u8 *) ioc->pdir_base)[pide*PDIR_ENTRY_SIZE + 7]) {
698 sba_dump_pdir_entry(ioc, "sba_search_bitmap() botched it?", pide);
699 }
700#endif
701
702 DBG_RES("%s(%x) %d -> %lx hint %x/%x\n",
703 __func__, size, pages_needed, pide,
704 (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map),
705 ioc->res_bitshift );
706
707 return (pide);
708}
709
710
711/**
712 * sba_free_range - unmark bits in IO PDIR resource bitmap
713 * @ioc: IO MMU structure which owns the pdir we are interested in.
714 * @iova: IO virtual address which was previously allocated.
715 * @size: number of bytes to create a mapping for
716 *
717 * clear bits in the ioc's resource map
718 */
719static SBA_INLINE void
720sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
721{
722 unsigned long iovp = SBA_IOVP(ioc, iova);
723 unsigned int pide = PDIR_INDEX(iovp);
724 unsigned int ridx = pide >> 3; /* convert bit to byte address */
725 unsigned long *res_ptr = (unsigned long *) &((ioc)->res_map[ridx & ~RESMAP_IDX_MASK]);
726 int bits_not_wanted = size >> iovp_shift;
727 unsigned long m;
728
729 /* Round up to power-of-two size: see AR2305 note above */
730 bits_not_wanted = 1UL << get_iovp_order(bits_not_wanted << iovp_shift);
731 for (; bits_not_wanted > 0 ; res_ptr++) {
732
733 if (unlikely(bits_not_wanted > BITS_PER_LONG)) {
734
735 /* these mappings start 64bit aligned */
736 *res_ptr = 0UL;
737 bits_not_wanted -= BITS_PER_LONG;
738 pide += BITS_PER_LONG;
739
740 } else {
741
742 /* 3-bits "bit" address plus 2 (or 3) bits for "byte" == bit in word */
743 m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1));
744 bits_not_wanted = 0;
745
746 DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __func__, (uint) iova, size,
747 bits_not_wanted, m, pide, res_ptr, *res_ptr);
748
749 ASSERT(m != 0);
750 ASSERT(bits_not_wanted);
751 ASSERT((*res_ptr & m) == m); /* verify same bits are set */
752 *res_ptr &= ~m;
753 }
754 }
755}
756
757
758/**************************************************************
759*
760* "Dynamic DMA Mapping" support (aka "Coherent I/O")
761*
762***************************************************************/
763
764/**
765 * sba_io_pdir_entry - fill in one IO PDIR entry
766 * @pdir_ptr: pointer to IO PDIR entry
767 * @vba: Virtual CPU address of buffer to map
768 *
769 * SBA Mapping Routine
770 *
771 * Given a virtual address (vba, arg1) sba_io_pdir_entry()
772 * loads the I/O PDIR entry pointed to by pdir_ptr (arg0).
773 * Each IO Pdir entry consists of 8 bytes as shown below
774 * (LSB == bit 0):
775 *
776 * 63 40 11 7 0
777 * +-+---------------------+----------------------------------+----+--------+
778 * |V| U | PPN[39:12] | U | FF |
779 * +-+---------------------+----------------------------------+----+--------+
780 *
781 * V == Valid Bit
782 * U == Unused
783 * PPN == Physical Page Number
784 *
785 * The physical address fields are filled with the results of virt_to_phys()
786 * on the vba.
787 */
788
789#if 1
790#define sba_io_pdir_entry(pdir_ptr, vba) *pdir_ptr = ((vba & ~0xE000000000000FFFULL) \
791 | 0x8000000000000000ULL)
792#else
793void SBA_INLINE
794sba_io_pdir_entry(u64 *pdir_ptr, unsigned long vba)
795{
796 *pdir_ptr = ((vba & ~0xE000000000000FFFULL) | 0x80000000000000FFULL);
797}
798#endif
799
800#ifdef ENABLE_MARK_CLEAN
801/*
802 * Since DMA is i-cache coherent, any (complete) pages that were written via
803 * DMA can be marked as "clean" so that lazy_mmu_prot_update() doesn't have to
804 * flush them when they get mapped into an executable vm-area.
805 */
806static void mark_clean(void *addr, size_t size)
807{
808 struct folio *folio = virt_to_folio(addr);
809 ssize_t left = size;
810 size_t offset = offset_in_folio(folio, addr);
811
812 if (offset) {
813 left -= folio_size(folio) - offset;
814 if (left <= 0)
815 return;
816 folio = folio_next(folio);
817 }
818
819 while (left >= folio_size(folio)) {
820 left -= folio_size(folio);
821 set_bit(PG_arch_1, &folio->flags);
822 if (!left)
823 break;
824 folio = folio_next(folio);
825 }
826}
827#endif
828
829/**
830 * sba_mark_invalid - invalidate one or more IO PDIR entries
831 * @ioc: IO MMU structure which owns the pdir we are interested in.
832 * @iova: IO Virtual Address mapped earlier
833 * @byte_cnt: number of bytes this mapping covers.
834 *
835 * Marking the IO PDIR entry(ies) as Invalid and invalidate
836 * corresponding IO TLB entry. The PCOM (Purge Command Register)
837 * is to purge stale entries in the IO TLB when unmapping entries.
838 *
839 * The PCOM register supports purging of multiple pages, with a minium
840 * of 1 page and a maximum of 2GB. Hardware requires the address be
841 * aligned to the size of the range being purged. The size of the range
842 * must be a power of 2. The "Cool perf optimization" in the
843 * allocation routine helps keep that true.
844 */
845static SBA_INLINE void
846sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
847{
848 u32 iovp = (u32) SBA_IOVP(ioc,iova);
849
850 int off = PDIR_INDEX(iovp);
851
852 /* Must be non-zero and rounded up */
853 ASSERT(byte_cnt > 0);
854 ASSERT(0 == (byte_cnt & ~iovp_mask));
855
856#ifdef ASSERT_PDIR_SANITY
857 /* Assert first pdir entry is set */
858 if (!(ioc->pdir_base[off] >> 60)) {
859 sba_dump_pdir_entry(ioc,"sba_mark_invalid()", PDIR_INDEX(iovp));
860 }
861#endif
862
863 if (byte_cnt <= iovp_size)
864 {
865 ASSERT(off < ioc->pdir_size);
866
867 iovp |= iovp_shift; /* set "size" field for PCOM */
868
869#ifndef FULL_VALID_PDIR
870 /*
871 ** clear I/O PDIR entry "valid" bit
872 ** Do NOT clear the rest - save it for debugging.
873 ** We should only clear bits that have previously
874 ** been enabled.
875 */
876 ioc->pdir_base[off] &= ~(0x80000000000000FFULL);
877#else
878 /*
879 ** If we want to maintain the PDIR as valid, put in
880 ** the spill page so devices prefetching won't
881 ** cause a hard fail.
882 */
883 ioc->pdir_base[off] = (0x80000000000000FFULL | prefetch_spill_page);
884#endif
885 } else {
886 u32 t = get_iovp_order(byte_cnt) + iovp_shift;
887
888 iovp |= t;
889 ASSERT(t <= 31); /* 2GB! Max value of "size" field */
890
891 do {
892 /* verify this pdir entry is enabled */
893 ASSERT(ioc->pdir_base[off] >> 63);
894#ifndef FULL_VALID_PDIR
895 /* clear I/O Pdir entry "valid" bit first */
896 ioc->pdir_base[off] &= ~(0x80000000000000FFULL);
897#else
898 ioc->pdir_base[off] = (0x80000000000000FFULL | prefetch_spill_page);
899#endif
900 off++;
901 byte_cnt -= iovp_size;
902 } while (byte_cnt > 0);
903 }
904
905 WRITE_REG(iovp | ioc->ibase, ioc->ioc_hpa+IOC_PCOM);
906}
907
908/**
909 * sba_map_page - map one buffer and return IOVA for DMA
910 * @dev: instance of PCI owned by the driver that's asking.
911 * @page: page to map
912 * @poff: offset into page
913 * @size: number of bytes to map
914 * @dir: dma direction
915 * @attrs: optional dma attributes
916 *
917 * See Documentation/core-api/dma-api-howto.rst
918 */
919static dma_addr_t sba_map_page(struct device *dev, struct page *page,
920 unsigned long poff, size_t size,
921 enum dma_data_direction dir,
922 unsigned long attrs)
923{
924 struct ioc *ioc;
925 void *addr = page_address(page) + poff;
926 dma_addr_t iovp;
927 dma_addr_t offset;
928 u64 *pdir_start;
929 int pide;
930#ifdef ASSERT_PDIR_SANITY
931 unsigned long flags;
932#endif
933#ifdef ALLOW_IOV_BYPASS
934 unsigned long pci_addr = virt_to_phys(addr);
935#endif
936
937#ifdef ALLOW_IOV_BYPASS
938 ASSERT(to_pci_dev(dev)->dma_mask);
939 /*
940 ** Check if the PCI device can DMA to ptr... if so, just return ptr
941 */
942 if (likely((pci_addr & ~to_pci_dev(dev)->dma_mask) == 0)) {
943 /*
944 ** Device is bit capable of DMA'ing to the buffer...
945 ** just return the PCI address of ptr
946 */
947 DBG_BYPASS("sba_map_page() bypass mask/addr: "
948 "0x%lx/0x%lx\n",
949 to_pci_dev(dev)->dma_mask, pci_addr);
950 return pci_addr;
951 }
952#endif
953 ioc = GET_IOC(dev);
954 ASSERT(ioc);
955
956 prefetch(ioc->res_hint);
957
958 ASSERT(size > 0);
959 ASSERT(size <= DMA_CHUNK_SIZE);
960
961 /* save offset bits */
962 offset = ((dma_addr_t) (long) addr) & ~iovp_mask;
963
964 /* round up to nearest iovp_size */
965 size = (size + offset + ~iovp_mask) & iovp_mask;
966
967#ifdef ASSERT_PDIR_SANITY
968 spin_lock_irqsave(&ioc->res_lock, flags);
969 if (sba_check_pdir(ioc,"Check before sba_map_page()"))
970 panic("Sanity check failed");
971 spin_unlock_irqrestore(&ioc->res_lock, flags);
972#endif
973
974 pide = sba_alloc_range(ioc, dev, size);
975 if (pide < 0)
976 return DMA_MAPPING_ERROR;
977
978 iovp = (dma_addr_t) pide << iovp_shift;
979
980 DBG_RUN("%s() 0x%p -> 0x%lx\n", __func__, addr, (long) iovp | offset);
981
982 pdir_start = &(ioc->pdir_base[pide]);
983
984 while (size > 0) {
985 ASSERT(((u8 *)pdir_start)[7] == 0); /* verify availability */
986 sba_io_pdir_entry(pdir_start, (unsigned long) addr);
987
988 DBG_RUN(" pdir 0x%p %lx\n", pdir_start, *pdir_start);
989
990 addr += iovp_size;
991 size -= iovp_size;
992 pdir_start++;
993 }
994 /* force pdir update */
995 wmb();
996
997 /* form complete address */
998#ifdef ASSERT_PDIR_SANITY
999 spin_lock_irqsave(&ioc->res_lock, flags);
1000 sba_check_pdir(ioc,"Check after sba_map_page()");
1001 spin_unlock_irqrestore(&ioc->res_lock, flags);
1002#endif
1003 return SBA_IOVA(ioc, iovp, offset);
1004}
1005
1006#ifdef ENABLE_MARK_CLEAN
1007static SBA_INLINE void
1008sba_mark_clean(struct ioc *ioc, dma_addr_t iova, size_t size)
1009{
1010 u32 iovp = (u32) SBA_IOVP(ioc,iova);
1011 int off = PDIR_INDEX(iovp);
1012 void *addr;
1013
1014 if (size <= iovp_size) {
1015 addr = phys_to_virt(ioc->pdir_base[off] &
1016 ~0xE000000000000FFFULL);
1017 mark_clean(addr, size);
1018 } else {
1019 do {
1020 addr = phys_to_virt(ioc->pdir_base[off] &
1021 ~0xE000000000000FFFULL);
1022 mark_clean(addr, min(size, iovp_size));
1023 off++;
1024 size -= iovp_size;
1025 } while (size > 0);
1026 }
1027}
1028#endif
1029
1030/**
1031 * sba_unmap_page - unmap one IOVA and free resources
1032 * @dev: instance of PCI owned by the driver that's asking.
1033 * @iova: IOVA of driver buffer previously mapped.
1034 * @size: number of bytes mapped in driver buffer.
1035 * @dir: R/W or both.
1036 * @attrs: optional dma attributes
1037 *
1038 * See Documentation/core-api/dma-api-howto.rst
1039 */
1040static void sba_unmap_page(struct device *dev, dma_addr_t iova, size_t size,
1041 enum dma_data_direction dir, unsigned long attrs)
1042{
1043 struct ioc *ioc;
1044#if DELAYED_RESOURCE_CNT > 0
1045 struct sba_dma_pair *d;
1046#endif
1047 unsigned long flags;
1048 dma_addr_t offset;
1049
1050 ioc = GET_IOC(dev);
1051 ASSERT(ioc);
1052
1053#ifdef ALLOW_IOV_BYPASS
1054 if (likely((iova & ioc->imask) != ioc->ibase)) {
1055 /*
1056 ** Address does not fall w/in IOVA, must be bypassing
1057 */
1058 DBG_BYPASS("sba_unmap_page() bypass addr: 0x%lx\n",
1059 iova);
1060
1061#ifdef ENABLE_MARK_CLEAN
1062 if (dir == DMA_FROM_DEVICE) {
1063 mark_clean(phys_to_virt(iova), size);
1064 }
1065#endif
1066 return;
1067 }
1068#endif
1069 offset = iova & ~iovp_mask;
1070
1071 DBG_RUN("%s() iovp 0x%lx/%x\n", __func__, (long) iova, size);
1072
1073 iova ^= offset; /* clear offset bits */
1074 size += offset;
1075 size = ROUNDUP(size, iovp_size);
1076
1077#ifdef ENABLE_MARK_CLEAN
1078 if (dir == DMA_FROM_DEVICE)
1079 sba_mark_clean(ioc, iova, size);
1080#endif
1081
1082#if DELAYED_RESOURCE_CNT > 0
1083 spin_lock_irqsave(&ioc->saved_lock, flags);
1084 d = &(ioc->saved[ioc->saved_cnt]);
1085 d->iova = iova;
1086 d->size = size;
1087 if (unlikely(++(ioc->saved_cnt) >= DELAYED_RESOURCE_CNT)) {
1088 int cnt = ioc->saved_cnt;
1089 spin_lock(&ioc->res_lock);
1090 while (cnt--) {
1091 sba_mark_invalid(ioc, d->iova, d->size);
1092 sba_free_range(ioc, d->iova, d->size);
1093 d--;
1094 }
1095 ioc->saved_cnt = 0;
1096 READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */
1097 spin_unlock(&ioc->res_lock);
1098 }
1099 spin_unlock_irqrestore(&ioc->saved_lock, flags);
1100#else /* DELAYED_RESOURCE_CNT == 0 */
1101 spin_lock_irqsave(&ioc->res_lock, flags);
1102 sba_mark_invalid(ioc, iova, size);
1103 sba_free_range(ioc, iova, size);
1104 READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */
1105 spin_unlock_irqrestore(&ioc->res_lock, flags);
1106#endif /* DELAYED_RESOURCE_CNT == 0 */
1107}
1108
1109/**
1110 * sba_alloc_coherent - allocate/map shared mem for DMA
1111 * @dev: instance of PCI owned by the driver that's asking.
1112 * @size: number of bytes mapped in driver buffer.
1113 * @dma_handle: IOVA of new buffer.
1114 *
1115 * See Documentation/core-api/dma-api-howto.rst
1116 */
1117static void *
1118sba_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
1119 gfp_t flags, unsigned long attrs)
1120{
1121 struct page *page;
1122 struct ioc *ioc;
1123 int node = -1;
1124 void *addr;
1125
1126 ioc = GET_IOC(dev);
1127 ASSERT(ioc);
1128#ifdef CONFIG_NUMA
1129 node = ioc->node;
1130#endif
1131
1132 page = alloc_pages_node(node, flags, get_order(size));
1133 if (unlikely(!page))
1134 return NULL;
1135
1136 addr = page_address(page);
1137 memset(addr, 0, size);
1138 *dma_handle = page_to_phys(page);
1139
1140#ifdef ALLOW_IOV_BYPASS
1141 ASSERT(dev->coherent_dma_mask);
1142 /*
1143 ** Check if the PCI device can DMA to ptr... if so, just return ptr
1144 */
1145 if (likely((*dma_handle & ~dev->coherent_dma_mask) == 0)) {
1146 DBG_BYPASS("sba_alloc_coherent() bypass mask/addr: 0x%lx/0x%lx\n",
1147 dev->coherent_dma_mask, *dma_handle);
1148
1149 return addr;
1150 }
1151#endif
1152
1153 /*
1154 * If device can't bypass or bypass is disabled, pass the 32bit fake
1155 * device to map single to get an iova mapping.
1156 */
1157 *dma_handle = sba_map_page(&ioc->sac_only_dev->dev, page, 0, size,
1158 DMA_BIDIRECTIONAL, 0);
1159 if (dma_mapping_error(dev, *dma_handle))
1160 return NULL;
1161 return addr;
1162}
1163
1164
1165/**
1166 * sba_free_coherent - free/unmap shared mem for DMA
1167 * @dev: instance of PCI owned by the driver that's asking.
1168 * @size: number of bytes mapped in driver buffer.
1169 * @vaddr: virtual address IOVA of "consistent" buffer.
1170 * @dma_handler: IO virtual address of "consistent" buffer.
1171 *
1172 * See Documentation/core-api/dma-api-howto.rst
1173 */
1174static void sba_free_coherent(struct device *dev, size_t size, void *vaddr,
1175 dma_addr_t dma_handle, unsigned long attrs)
1176{
1177 sba_unmap_page(dev, dma_handle, size, 0, 0);
1178 free_pages((unsigned long) vaddr, get_order(size));
1179}
1180
1181
1182/*
1183** Since 0 is a valid pdir_base index value, can't use that
1184** to determine if a value is valid or not. Use a flag to indicate
1185** the SG list entry contains a valid pdir index.
1186*/
1187#define PIDE_FLAG 0x1UL
1188
1189#ifdef DEBUG_LARGE_SG_ENTRIES
1190int dump_run_sg = 0;
1191#endif
1192
1193
1194/**
1195 * sba_fill_pdir - write allocated SG entries into IO PDIR
1196 * @ioc: IO MMU structure which owns the pdir we are interested in.
1197 * @startsg: list of IOVA/size pairs
1198 * @nents: number of entries in startsg list
1199 *
1200 * Take preprocessed SG list and write corresponding entries
1201 * in the IO PDIR.
1202 */
1203
1204static SBA_INLINE int
1205sba_fill_pdir(
1206 struct ioc *ioc,
1207 struct scatterlist *startsg,
1208 int nents)
1209{
1210 struct scatterlist *dma_sg = startsg; /* pointer to current DMA */
1211 int n_mappings = 0;
1212 u64 *pdirp = NULL;
1213 unsigned long dma_offset = 0;
1214
1215 while (nents-- > 0) {
1216 int cnt = startsg->dma_length;
1217 startsg->dma_length = 0;
1218
1219#ifdef DEBUG_LARGE_SG_ENTRIES
1220 if (dump_run_sg)
1221 printk(" %2d : %08lx/%05x %p\n",
1222 nents, startsg->dma_address, cnt,
1223 sba_sg_address(startsg));
1224#else
1225 DBG_RUN_SG(" %d : %08lx/%05x %p\n",
1226 nents, startsg->dma_address, cnt,
1227 sba_sg_address(startsg));
1228#endif
1229 /*
1230 ** Look for the start of a new DMA stream
1231 */
1232 if (startsg->dma_address & PIDE_FLAG) {
1233 u32 pide = startsg->dma_address & ~PIDE_FLAG;
1234 dma_offset = (unsigned long) pide & ~iovp_mask;
1235 startsg->dma_address = 0;
1236 if (n_mappings)
1237 dma_sg = sg_next(dma_sg);
1238 dma_sg->dma_address = pide | ioc->ibase;
1239 pdirp = &(ioc->pdir_base[pide >> iovp_shift]);
1240 n_mappings++;
1241 }
1242
1243 /*
1244 ** Look for a VCONTIG chunk
1245 */
1246 if (cnt) {
1247 unsigned long vaddr = (unsigned long) sba_sg_address(startsg);
1248 ASSERT(pdirp);
1249
1250 /* Since multiple Vcontig blocks could make up
1251 ** one DMA stream, *add* cnt to dma_len.
1252 */
1253 dma_sg->dma_length += cnt;
1254 cnt += dma_offset;
1255 dma_offset=0; /* only want offset on first chunk */
1256 cnt = ROUNDUP(cnt, iovp_size);
1257 do {
1258 sba_io_pdir_entry(pdirp, vaddr);
1259 vaddr += iovp_size;
1260 cnt -= iovp_size;
1261 pdirp++;
1262 } while (cnt > 0);
1263 }
1264 startsg = sg_next(startsg);
1265 }
1266 /* force pdir update */
1267 wmb();
1268
1269#ifdef DEBUG_LARGE_SG_ENTRIES
1270 dump_run_sg = 0;
1271#endif
1272 return(n_mappings);
1273}
1274
1275
1276/*
1277** Two address ranges are DMA contiguous *iff* "end of prev" and
1278** "start of next" are both on an IOV page boundary.
1279**
1280** (shift left is a quick trick to mask off upper bits)
1281*/
1282#define DMA_CONTIG(__X, __Y) \
1283 (((((unsigned long) __X) | ((unsigned long) __Y)) << (BITS_PER_LONG - iovp_shift)) == 0UL)
1284
1285
1286/**
1287 * sba_coalesce_chunks - preprocess the SG list
1288 * @ioc: IO MMU structure which owns the pdir we are interested in.
1289 * @startsg: list of IOVA/size pairs
1290 * @nents: number of entries in startsg list
1291 *
1292 * First pass is to walk the SG list and determine where the breaks are
1293 * in the DMA stream. Allocates PDIR entries but does not fill them.
1294 * Returns the number of DMA chunks.
1295 *
1296 * Doing the fill separate from the coalescing/allocation keeps the
1297 * code simpler. Future enhancement could make one pass through
1298 * the sglist do both.
1299 */
1300static SBA_INLINE int
1301sba_coalesce_chunks(struct ioc *ioc, struct device *dev,
1302 struct scatterlist *startsg,
1303 int nents)
1304{
1305 struct scatterlist *vcontig_sg; /* VCONTIG chunk head */
1306 unsigned long vcontig_len; /* len of VCONTIG chunk */
1307 unsigned long vcontig_end;
1308 struct scatterlist *dma_sg; /* next DMA stream head */
1309 unsigned long dma_offset, dma_len; /* start/len of DMA stream */
1310 int n_mappings = 0;
1311 unsigned int max_seg_size = dma_get_max_seg_size(dev);
1312 int idx;
1313
1314 while (nents > 0) {
1315 unsigned long vaddr = (unsigned long) sba_sg_address(startsg);
1316
1317 /*
1318 ** Prepare for first/next DMA stream
1319 */
1320 dma_sg = vcontig_sg = startsg;
1321 dma_len = vcontig_len = vcontig_end = startsg->length;
1322 vcontig_end += vaddr;
1323 dma_offset = vaddr & ~iovp_mask;
1324
1325 /* PARANOID: clear entries */
1326 startsg->dma_address = startsg->dma_length = 0;
1327
1328 /*
1329 ** This loop terminates one iteration "early" since
1330 ** it's always looking one "ahead".
1331 */
1332 while (--nents > 0) {
1333 unsigned long vaddr; /* tmp */
1334
1335 startsg = sg_next(startsg);
1336
1337 /* PARANOID */
1338 startsg->dma_address = startsg->dma_length = 0;
1339
1340 /* catch brokenness in SCSI layer */
1341 ASSERT(startsg->length <= DMA_CHUNK_SIZE);
1342
1343 /*
1344 ** First make sure current dma stream won't
1345 ** exceed DMA_CHUNK_SIZE if we coalesce the
1346 ** next entry.
1347 */
1348 if (((dma_len + dma_offset + startsg->length + ~iovp_mask) & iovp_mask)
1349 > DMA_CHUNK_SIZE)
1350 break;
1351
1352 if (dma_len + startsg->length > max_seg_size)
1353 break;
1354
1355 /*
1356 ** Then look for virtually contiguous blocks.
1357 **
1358 ** append the next transaction?
1359 */
1360 vaddr = (unsigned long) sba_sg_address(startsg);
1361 if (vcontig_end == vaddr)
1362 {
1363 vcontig_len += startsg->length;
1364 vcontig_end += startsg->length;
1365 dma_len += startsg->length;
1366 continue;
1367 }
1368
1369#ifdef DEBUG_LARGE_SG_ENTRIES
1370 dump_run_sg = (vcontig_len > iovp_size);
1371#endif
1372
1373 /*
1374 ** Not virtually contiguous.
1375 ** Terminate prev chunk.
1376 ** Start a new chunk.
1377 **
1378 ** Once we start a new VCONTIG chunk, dma_offset
1379 ** can't change. And we need the offset from the first
1380 ** chunk - not the last one. Ergo Successive chunks
1381 ** must start on page boundaries and dove tail
1382 ** with it's predecessor.
1383 */
1384 vcontig_sg->dma_length = vcontig_len;
1385
1386 vcontig_sg = startsg;
1387 vcontig_len = startsg->length;
1388
1389 /*
1390 ** 3) do the entries end/start on page boundaries?
1391 ** Don't update vcontig_end until we've checked.
1392 */
1393 if (DMA_CONTIG(vcontig_end, vaddr))
1394 {
1395 vcontig_end = vcontig_len + vaddr;
1396 dma_len += vcontig_len;
1397 continue;
1398 } else {
1399 break;
1400 }
1401 }
1402
1403 /*
1404 ** End of DMA Stream
1405 ** Terminate last VCONTIG block.
1406 ** Allocate space for DMA stream.
1407 */
1408 vcontig_sg->dma_length = vcontig_len;
1409 dma_len = (dma_len + dma_offset + ~iovp_mask) & iovp_mask;
1410 ASSERT(dma_len <= DMA_CHUNK_SIZE);
1411 idx = sba_alloc_range(ioc, dev, dma_len);
1412 if (idx < 0) {
1413 dma_sg->dma_length = 0;
1414 return -1;
1415 }
1416 dma_sg->dma_address = (dma_addr_t)(PIDE_FLAG | (idx << iovp_shift)
1417 | dma_offset);
1418 n_mappings++;
1419 }
1420
1421 return n_mappings;
1422}
1423
1424static void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,
1425 int nents, enum dma_data_direction dir,
1426 unsigned long attrs);
1427/**
1428 * sba_map_sg - map Scatter/Gather list
1429 * @dev: instance of PCI owned by the driver that's asking.
1430 * @sglist: array of buffer/length pairs
1431 * @nents: number of entries in list
1432 * @dir: R/W or both.
1433 * @attrs: optional dma attributes
1434 *
1435 * See Documentation/core-api/dma-api-howto.rst
1436 */
1437static int sba_map_sg_attrs(struct device *dev, struct scatterlist *sglist,
1438 int nents, enum dma_data_direction dir,
1439 unsigned long attrs)
1440{
1441 struct ioc *ioc;
1442 int coalesced, filled = 0;
1443#ifdef ASSERT_PDIR_SANITY
1444 unsigned long flags;
1445#endif
1446#ifdef ALLOW_IOV_BYPASS_SG
1447 struct scatterlist *sg;
1448#endif
1449
1450 DBG_RUN_SG("%s() START %d entries\n", __func__, nents);
1451 ioc = GET_IOC(dev);
1452 ASSERT(ioc);
1453
1454#ifdef ALLOW_IOV_BYPASS_SG
1455 ASSERT(to_pci_dev(dev)->dma_mask);
1456 if (likely((ioc->dma_mask & ~to_pci_dev(dev)->dma_mask) == 0)) {
1457 for_each_sg(sglist, sg, nents, filled) {
1458 sg->dma_length = sg->length;
1459 sg->dma_address = virt_to_phys(sba_sg_address(sg));
1460 }
1461 return filled;
1462 }
1463#endif
1464 /* Fast path single entry scatterlists. */
1465 if (nents == 1) {
1466 sglist->dma_length = sglist->length;
1467 sglist->dma_address = sba_map_page(dev, sg_page(sglist),
1468 sglist->offset, sglist->length, dir, attrs);
1469 if (dma_mapping_error(dev, sglist->dma_address))
1470 return -EIO;
1471 return 1;
1472 }
1473
1474#ifdef ASSERT_PDIR_SANITY
1475 spin_lock_irqsave(&ioc->res_lock, flags);
1476 if (sba_check_pdir(ioc,"Check before sba_map_sg_attrs()"))
1477 {
1478 sba_dump_sg(ioc, sglist, nents);
1479 panic("Check before sba_map_sg_attrs()");
1480 }
1481 spin_unlock_irqrestore(&ioc->res_lock, flags);
1482#endif
1483
1484 prefetch(ioc->res_hint);
1485
1486 /*
1487 ** First coalesce the chunks and allocate I/O pdir space
1488 **
1489 ** If this is one DMA stream, we can properly map using the
1490 ** correct virtual address associated with each DMA page.
1491 ** w/o this association, we wouldn't have coherent DMA!
1492 ** Access to the virtual address is what forces a two pass algorithm.
1493 */
1494 coalesced = sba_coalesce_chunks(ioc, dev, sglist, nents);
1495 if (coalesced < 0) {
1496 sba_unmap_sg_attrs(dev, sglist, nents, dir, attrs);
1497 return -ENOMEM;
1498 }
1499
1500 /*
1501 ** Program the I/O Pdir
1502 **
1503 ** map the virtual addresses to the I/O Pdir
1504 ** o dma_address will contain the pdir index
1505 ** o dma_len will contain the number of bytes to map
1506 ** o address contains the virtual address.
1507 */
1508 filled = sba_fill_pdir(ioc, sglist, nents);
1509
1510#ifdef ASSERT_PDIR_SANITY
1511 spin_lock_irqsave(&ioc->res_lock, flags);
1512 if (sba_check_pdir(ioc,"Check after sba_map_sg_attrs()"))
1513 {
1514 sba_dump_sg(ioc, sglist, nents);
1515 panic("Check after sba_map_sg_attrs()\n");
1516 }
1517 spin_unlock_irqrestore(&ioc->res_lock, flags);
1518#endif
1519
1520 ASSERT(coalesced == filled);
1521 DBG_RUN_SG("%s() DONE %d mappings\n", __func__, filled);
1522
1523 return filled;
1524}
1525
1526/**
1527 * sba_unmap_sg_attrs - unmap Scatter/Gather list
1528 * @dev: instance of PCI owned by the driver that's asking.
1529 * @sglist: array of buffer/length pairs
1530 * @nents: number of entries in list
1531 * @dir: R/W or both.
1532 * @attrs: optional dma attributes
1533 *
1534 * See Documentation/core-api/dma-api-howto.rst
1535 */
1536static void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,
1537 int nents, enum dma_data_direction dir,
1538 unsigned long attrs)
1539{
1540#ifdef ASSERT_PDIR_SANITY
1541 struct ioc *ioc;
1542 unsigned long flags;
1543#endif
1544
1545 DBG_RUN_SG("%s() START %d entries, %p,%x\n",
1546 __func__, nents, sba_sg_address(sglist), sglist->length);
1547
1548#ifdef ASSERT_PDIR_SANITY
1549 ioc = GET_IOC(dev);
1550 ASSERT(ioc);
1551
1552 spin_lock_irqsave(&ioc->res_lock, flags);
1553 sba_check_pdir(ioc,"Check before sba_unmap_sg_attrs()");
1554 spin_unlock_irqrestore(&ioc->res_lock, flags);
1555#endif
1556
1557 while (nents && sglist->dma_length) {
1558
1559 sba_unmap_page(dev, sglist->dma_address, sglist->dma_length,
1560 dir, attrs);
1561 sglist = sg_next(sglist);
1562 nents--;
1563 }
1564
1565 DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents);
1566
1567#ifdef ASSERT_PDIR_SANITY
1568 spin_lock_irqsave(&ioc->res_lock, flags);
1569 sba_check_pdir(ioc,"Check after sba_unmap_sg_attrs()");
1570 spin_unlock_irqrestore(&ioc->res_lock, flags);
1571#endif
1572
1573}
1574
1575/**************************************************************
1576*
1577* Initialization and claim
1578*
1579***************************************************************/
1580
1581static void
1582ioc_iova_init(struct ioc *ioc)
1583{
1584 int tcnfg;
1585 int agp_found = 0;
1586 struct pci_dev *device = NULL;
1587#ifdef FULL_VALID_PDIR
1588 unsigned long index;
1589#endif
1590
1591 /*
1592 ** Firmware programs the base and size of a "safe IOVA space"
1593 ** (one that doesn't overlap memory or LMMIO space) in the
1594 ** IBASE and IMASK registers.
1595 */
1596 ioc->ibase = READ_REG(ioc->ioc_hpa + IOC_IBASE) & ~0x1UL;
1597 ioc->imask = READ_REG(ioc->ioc_hpa + IOC_IMASK) | 0xFFFFFFFF00000000UL;
1598
1599 ioc->iov_size = ~ioc->imask + 1;
1600
1601 DBG_INIT("%s() hpa %p IOV base 0x%lx mask 0x%lx (%dMB)\n",
1602 __func__, ioc->ioc_hpa, ioc->ibase, ioc->imask,
1603 ioc->iov_size >> 20);
1604
1605 switch (iovp_size) {
1606 case 4*1024: tcnfg = 0; break;
1607 case 8*1024: tcnfg = 1; break;
1608 case 16*1024: tcnfg = 2; break;
1609 case 64*1024: tcnfg = 3; break;
1610 default:
1611 panic(PFX "Unsupported IOTLB page size %ldK",
1612 iovp_size >> 10);
1613 break;
1614 }
1615 WRITE_REG(tcnfg, ioc->ioc_hpa + IOC_TCNFG);
1616
1617 ioc->pdir_size = (ioc->iov_size / iovp_size) * PDIR_ENTRY_SIZE;
1618 ioc->pdir_base = (void *) __get_free_pages(GFP_KERNEL,
1619 get_order(ioc->pdir_size));
1620 if (!ioc->pdir_base)
1621 panic(PFX "Couldn't allocate I/O Page Table\n");
1622
1623 memset(ioc->pdir_base, 0, ioc->pdir_size);
1624
1625 DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __func__,
1626 iovp_size >> 10, ioc->pdir_base, ioc->pdir_size);
1627
1628 ASSERT(ALIGN((unsigned long) ioc->pdir_base, 4*1024) == (unsigned long) ioc->pdir_base);
1629 WRITE_REG(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE);
1630
1631 /*
1632 ** If an AGP device is present, only use half of the IOV space
1633 ** for PCI DMA. Unfortunately we can't know ahead of time
1634 ** whether GART support will actually be used, for now we
1635 ** can just key on an AGP device found in the system.
1636 ** We program the next pdir index after we stop w/ a key for
1637 ** the GART code to handshake on.
1638 */
1639 for_each_pci_dev(device)
1640 agp_found |= pci_find_capability(device, PCI_CAP_ID_AGP);
1641
1642 if (agp_found && reserve_sba_gart) {
1643 printk(KERN_INFO PFX "reserving %dMb of IOVA space at 0x%lx for agpgart\n",
1644 ioc->iov_size/2 >> 20, ioc->ibase + ioc->iov_size/2);
1645 ioc->pdir_size /= 2;
1646 ((u64 *)ioc->pdir_base)[PDIR_INDEX(ioc->iov_size/2)] = ZX1_SBA_IOMMU_COOKIE;
1647 }
1648#ifdef FULL_VALID_PDIR
1649 /*
1650 ** Check to see if the spill page has been allocated, we don't need more than
1651 ** one across multiple SBAs.
1652 */
1653 if (!prefetch_spill_page) {
1654 char *spill_poison = "SBAIOMMU POISON";
1655 int poison_size = 16;
1656 void *poison_addr, *addr;
1657
1658 addr = (void *)__get_free_pages(GFP_KERNEL, get_order(iovp_size));
1659 if (!addr)
1660 panic(PFX "Couldn't allocate PDIR spill page\n");
1661
1662 poison_addr = addr;
1663 for ( ; (u64) poison_addr < addr + iovp_size; poison_addr += poison_size)
1664 memcpy(poison_addr, spill_poison, poison_size);
1665
1666 prefetch_spill_page = virt_to_phys(addr);
1667
1668 DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __func__, prefetch_spill_page);
1669 }
1670 /*
1671 ** Set all the PDIR entries valid w/ the spill page as the target
1672 */
1673 for (index = 0 ; index < (ioc->pdir_size / PDIR_ENTRY_SIZE) ; index++)
1674 ((u64 *)ioc->pdir_base)[index] = (0x80000000000000FF | prefetch_spill_page);
1675#endif
1676
1677 /* Clear I/O TLB of any possible entries */
1678 WRITE_REG(ioc->ibase | (get_iovp_order(ioc->iov_size) + iovp_shift), ioc->ioc_hpa + IOC_PCOM);
1679 READ_REG(ioc->ioc_hpa + IOC_PCOM);
1680
1681 /* Enable IOVA translation */
1682 WRITE_REG(ioc->ibase | 1, ioc->ioc_hpa + IOC_IBASE);
1683 READ_REG(ioc->ioc_hpa + IOC_IBASE);
1684}
1685
1686static void __init
1687ioc_resource_init(struct ioc *ioc)
1688{
1689 spin_lock_init(&ioc->res_lock);
1690#if DELAYED_RESOURCE_CNT > 0
1691 spin_lock_init(&ioc->saved_lock);
1692#endif
1693
1694 /* resource map size dictated by pdir_size */
1695 ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */
1696 ioc->res_size >>= 3; /* convert bit count to byte count */
1697 DBG_INIT("%s() res_size 0x%x\n", __func__, ioc->res_size);
1698
1699 ioc->res_map = (char *) __get_free_pages(GFP_KERNEL,
1700 get_order(ioc->res_size));
1701 if (!ioc->res_map)
1702 panic(PFX "Couldn't allocate resource map\n");
1703
1704 memset(ioc->res_map, 0, ioc->res_size);
1705 /* next available IOVP - circular search */
1706 ioc->res_hint = (unsigned long *) ioc->res_map;
1707
1708#ifdef ASSERT_PDIR_SANITY
1709 /* Mark first bit busy - ie no IOVA 0 */
1710 ioc->res_map[0] = 0x1;
1711 ioc->pdir_base[0] = 0x8000000000000000ULL | ZX1_SBA_IOMMU_COOKIE;
1712#endif
1713#ifdef FULL_VALID_PDIR
1714 /* Mark the last resource used so we don't prefetch beyond IOVA space */
1715 ioc->res_map[ioc->res_size - 1] |= 0x80UL; /* res_map is chars */
1716 ioc->pdir_base[(ioc->pdir_size / PDIR_ENTRY_SIZE) - 1] = (0x80000000000000FF
1717 | prefetch_spill_page);
1718#endif
1719
1720 DBG_INIT("%s() res_map %x %p\n", __func__,
1721 ioc->res_size, (void *) ioc->res_map);
1722}
1723
1724static void __init
1725ioc_sac_init(struct ioc *ioc)
1726{
1727 struct pci_dev *sac = NULL;
1728 struct pci_controller *controller = NULL;
1729
1730 /*
1731 * pci_alloc_coherent() must return a DMA address which is
1732 * SAC (single address cycle) addressable, so allocate a
1733 * pseudo-device to enforce that.
1734 */
1735 sac = kzalloc(sizeof(*sac), GFP_KERNEL);
1736 if (!sac)
1737 panic(PFX "Couldn't allocate struct pci_dev");
1738
1739 controller = kzalloc(sizeof(*controller), GFP_KERNEL);
1740 if (!controller)
1741 panic(PFX "Couldn't allocate struct pci_controller");
1742
1743 controller->iommu = ioc;
1744 sac->sysdata = controller;
1745 sac->dma_mask = 0xFFFFFFFFUL;
1746 sac->dev.bus = &pci_bus_type;
1747 ioc->sac_only_dev = sac;
1748}
1749
1750static void __init
1751ioc_zx1_init(struct ioc *ioc)
1752{
1753 unsigned long rope_config;
1754 unsigned int i;
1755
1756 if (ioc->rev < 0x20)
1757 panic(PFX "IOC 2.0 or later required for IOMMU support\n");
1758
1759 /* 38 bit memory controller + extra bit for range displaced by MMIO */
1760 ioc->dma_mask = (0x1UL << 39) - 1;
1761
1762 /*
1763 ** Clear ROPE(N)_CONFIG AO bit.
1764 ** Disables "NT Ordering" (~= !"Relaxed Ordering")
1765 ** Overrides bit 1 in DMA Hint Sets.
1766 ** Improves netperf UDP_STREAM by ~10% for tg3 on bcm5701.
1767 */
1768 for (i=0; i<(8*8); i+=8) {
1769 rope_config = READ_REG(ioc->ioc_hpa + IOC_ROPE0_CFG + i);
1770 rope_config &= ~IOC_ROPE_AO;
1771 WRITE_REG(rope_config, ioc->ioc_hpa + IOC_ROPE0_CFG + i);
1772 }
1773}
1774
1775typedef void (initfunc)(struct ioc *);
1776
1777struct ioc_iommu {
1778 u32 func_id;
1779 char *name;
1780 initfunc *init;
1781};
1782
1783static struct ioc_iommu ioc_iommu_info[] __initdata = {
1784 { ZX1_IOC_ID, "zx1", ioc_zx1_init },
1785 { ZX2_IOC_ID, "zx2", NULL },
1786 { SX1000_IOC_ID, "sx1000", NULL },
1787 { SX2000_IOC_ID, "sx2000", NULL },
1788};
1789
1790static void __init ioc_init(unsigned long hpa, struct ioc *ioc)
1791{
1792 struct ioc_iommu *info;
1793
1794 ioc->next = ioc_list;
1795 ioc_list = ioc;
1796
1797 ioc->ioc_hpa = ioremap(hpa, 0x1000);
1798
1799 ioc->func_id = READ_REG(ioc->ioc_hpa + IOC_FUNC_ID);
1800 ioc->rev = READ_REG(ioc->ioc_hpa + IOC_FCLASS) & 0xFFUL;
1801 ioc->dma_mask = 0xFFFFFFFFFFFFFFFFUL; /* conservative */
1802
1803 for (info = ioc_iommu_info; info < ioc_iommu_info + ARRAY_SIZE(ioc_iommu_info); info++) {
1804 if (ioc->func_id == info->func_id) {
1805 ioc->name = info->name;
1806 if (info->init)
1807 (info->init)(ioc);
1808 }
1809 }
1810
1811 iovp_size = (1 << iovp_shift);
1812 iovp_mask = ~(iovp_size - 1);
1813
1814 DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __func__,
1815 PAGE_SIZE >> 10, iovp_size >> 10);
1816
1817 if (!ioc->name) {
1818 ioc->name = kmalloc(24, GFP_KERNEL);
1819 if (ioc->name)
1820 sprintf((char *) ioc->name, "Unknown (%04x:%04x)",
1821 ioc->func_id & 0xFFFF, (ioc->func_id >> 16) & 0xFFFF);
1822 else
1823 ioc->name = "Unknown";
1824 }
1825
1826 ioc_iova_init(ioc);
1827 ioc_resource_init(ioc);
1828 ioc_sac_init(ioc);
1829
1830 printk(KERN_INFO PFX
1831 "%s %d.%d HPA 0x%lx IOVA space %dMb at 0x%lx\n",
1832 ioc->name, (ioc->rev >> 4) & 0xF, ioc->rev & 0xF,
1833 hpa, ioc->iov_size >> 20, ioc->ibase);
1834}
1835
1836
1837
1838/**************************************************************************
1839**
1840** SBA initialization code (HW and SW)
1841**
1842** o identify SBA chip itself
1843** o FIXME: initialize DMA hints for reasonable defaults
1844**
1845**************************************************************************/
1846
1847#ifdef CONFIG_PROC_FS
1848static void *
1849ioc_start(struct seq_file *s, loff_t *pos)
1850{
1851 struct ioc *ioc;
1852 loff_t n = *pos;
1853
1854 for (ioc = ioc_list; ioc; ioc = ioc->next)
1855 if (!n--)
1856 return ioc;
1857
1858 return NULL;
1859}
1860
1861static void *
1862ioc_next(struct seq_file *s, void *v, loff_t *pos)
1863{
1864 struct ioc *ioc = v;
1865
1866 ++*pos;
1867 return ioc->next;
1868}
1869
1870static void
1871ioc_stop(struct seq_file *s, void *v)
1872{
1873}
1874
1875static int
1876ioc_show(struct seq_file *s, void *v)
1877{
1878 struct ioc *ioc = v;
1879 unsigned long *res_ptr = (unsigned long *)ioc->res_map;
1880 int i, used = 0;
1881
1882 seq_printf(s, "Hewlett Packard %s IOC rev %d.%d\n",
1883 ioc->name, ((ioc->rev >> 4) & 0xF), (ioc->rev & 0xF));
1884#ifdef CONFIG_NUMA
1885 if (ioc->node != NUMA_NO_NODE)
1886 seq_printf(s, "NUMA node : %d\n", ioc->node);
1887#endif
1888 seq_printf(s, "IOVA size : %ld MB\n", ((ioc->pdir_size >> 3) * iovp_size)/(1024*1024));
1889 seq_printf(s, "IOVA page size : %ld kb\n", iovp_size/1024);
1890
1891 for (i = 0; i < (ioc->res_size / sizeof(unsigned long)); ++i, ++res_ptr)
1892 used += hweight64(*res_ptr);
1893
1894 seq_printf(s, "PDIR size : %d entries\n", ioc->pdir_size >> 3);
1895 seq_printf(s, "PDIR used : %d entries\n", used);
1896
1897#ifdef PDIR_SEARCH_TIMING
1898 {
1899 unsigned long i = 0, avg = 0, min, max;
1900 min = max = ioc->avg_search[0];
1901 for (i = 0; i < SBA_SEARCH_SAMPLE; i++) {
1902 avg += ioc->avg_search[i];
1903 if (ioc->avg_search[i] > max) max = ioc->avg_search[i];
1904 if (ioc->avg_search[i] < min) min = ioc->avg_search[i];
1905 }
1906 avg /= SBA_SEARCH_SAMPLE;
1907 seq_printf(s, "Bitmap search : %ld/%ld/%ld (min/avg/max CPU Cycles/IOVA page)\n",
1908 min, avg, max);
1909 }
1910#endif
1911#ifndef ALLOW_IOV_BYPASS
1912 seq_printf(s, "IOVA bypass disabled\n");
1913#endif
1914 return 0;
1915}
1916
1917static const struct seq_operations ioc_seq_ops = {
1918 .start = ioc_start,
1919 .next = ioc_next,
1920 .stop = ioc_stop,
1921 .show = ioc_show
1922};
1923
1924static void __init
1925ioc_proc_init(void)
1926{
1927 struct proc_dir_entry *dir;
1928
1929 dir = proc_mkdir("bus/mckinley", NULL);
1930 if (!dir)
1931 return;
1932
1933 proc_create_seq(ioc_list->name, 0, dir, &ioc_seq_ops);
1934}
1935#endif
1936
1937static void
1938sba_connect_bus(struct pci_bus *bus)
1939{
1940 acpi_handle handle, parent;
1941 acpi_status status;
1942 struct ioc *ioc;
1943
1944 if (!PCI_CONTROLLER(bus))
1945 panic(PFX "no sysdata on bus %d!\n", bus->number);
1946
1947 if (PCI_CONTROLLER(bus)->iommu)
1948 return;
1949
1950 handle = acpi_device_handle(PCI_CONTROLLER(bus)->companion);
1951 if (!handle)
1952 return;
1953
1954 /*
1955 * The IOC scope encloses PCI root bridges in the ACPI
1956 * namespace, so work our way out until we find an IOC we
1957 * claimed previously.
1958 */
1959 do {
1960 for (ioc = ioc_list; ioc; ioc = ioc->next)
1961 if (ioc->handle == handle) {
1962 PCI_CONTROLLER(bus)->iommu = ioc;
1963 return;
1964 }
1965
1966 status = acpi_get_parent(handle, &parent);
1967 handle = parent;
1968 } while (ACPI_SUCCESS(status));
1969
1970 printk(KERN_WARNING "No IOC for PCI Bus %04x:%02x in ACPI\n", pci_domain_nr(bus), bus->number);
1971}
1972
1973static void __init
1974sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle)
1975{
1976#ifdef CONFIG_NUMA
1977 unsigned int node;
1978
1979 node = acpi_get_node(handle);
1980 if (node != NUMA_NO_NODE && !node_online(node))
1981 node = NUMA_NO_NODE;
1982
1983 ioc->node = node;
1984#endif
1985}
1986
1987static void __init acpi_sba_ioc_add(struct ioc *ioc)
1988{
1989 acpi_handle handle = ioc->handle;
1990 acpi_status status;
1991 u64 hpa, length;
1992 struct acpi_device_info *adi;
1993
1994 ioc_found = ioc->next;
1995 status = hp_acpi_csr_space(handle, &hpa, &length);
1996 if (ACPI_FAILURE(status))
1997 goto err;
1998
1999 status = acpi_get_object_info(handle, &adi);
2000 if (ACPI_FAILURE(status))
2001 goto err;
2002
2003 /*
2004 * For HWP0001, only SBA appears in ACPI namespace. It encloses the PCI
2005 * root bridges, and its CSR space includes the IOC function.
2006 */
2007 if (strncmp("HWP0001", adi->hardware_id.string, 7) == 0) {
2008 hpa += ZX1_IOC_OFFSET;
2009 /* zx1 based systems default to kernel page size iommu pages */
2010 if (!iovp_shift)
2011 iovp_shift = min(PAGE_SHIFT, 16);
2012 }
2013 kfree(adi);
2014
2015 /*
2016 * default anything not caught above or specified on cmdline to 4k
2017 * iommu page size
2018 */
2019 if (!iovp_shift)
2020 iovp_shift = 12;
2021
2022 ioc_init(hpa, ioc);
2023 /* setup NUMA node association */
2024 sba_map_ioc_to_node(ioc, handle);
2025 return;
2026
2027 err:
2028 kfree(ioc);
2029}
2030
2031static const struct acpi_device_id hp_ioc_iommu_device_ids[] = {
2032 {"HWP0001", 0},
2033 {"HWP0004", 0},
2034 {"", 0},
2035};
2036
2037static int acpi_sba_ioc_attach(struct acpi_device *device,
2038 const struct acpi_device_id *not_used)
2039{
2040 struct ioc *ioc;
2041
2042 ioc = kzalloc(sizeof(*ioc), GFP_KERNEL);
2043 if (!ioc)
2044 return -ENOMEM;
2045
2046 ioc->next = ioc_found;
2047 ioc_found = ioc;
2048 ioc->handle = device->handle;
2049 return 1;
2050}
2051
2052
2053static struct acpi_scan_handler acpi_sba_ioc_handler = {
2054 .ids = hp_ioc_iommu_device_ids,
2055 .attach = acpi_sba_ioc_attach,
2056};
2057
2058static int __init acpi_sba_ioc_init_acpi(void)
2059{
2060 return acpi_scan_add_handler(&acpi_sba_ioc_handler);
2061}
2062/* This has to run before acpi_scan_init(). */
2063arch_initcall(acpi_sba_ioc_init_acpi);
2064
2065static int sba_dma_supported (struct device *dev, u64 mask)
2066{
2067 /* make sure it's at least 32bit capable */
2068 return ((mask & 0xFFFFFFFFUL) == 0xFFFFFFFFUL);
2069}
2070
2071static const struct dma_map_ops sba_dma_ops = {
2072 .alloc = sba_alloc_coherent,
2073 .free = sba_free_coherent,
2074 .map_page = sba_map_page,
2075 .unmap_page = sba_unmap_page,
2076 .map_sg = sba_map_sg_attrs,
2077 .unmap_sg = sba_unmap_sg_attrs,
2078 .dma_supported = sba_dma_supported,
2079 .mmap = dma_common_mmap,
2080 .get_sgtable = dma_common_get_sgtable,
2081 .alloc_pages = dma_common_alloc_pages,
2082 .free_pages = dma_common_free_pages,
2083};
2084
2085static int __init
2086sba_init(void)
2087{
2088 /*
2089 * If we are booting a kdump kernel, the sba_iommu will cause devices
2090 * that were not shutdown properly to MCA as soon as they are turned
2091 * back on. Our only option for a successful kdump kernel boot is to
2092 * use swiotlb.
2093 */
2094 if (is_kdump_kernel())
2095 return 0;
2096
2097 /*
2098 * ioc_found should be populated by the acpi_sba_ioc_handler's .attach()
2099 * routine, but that only happens if acpi_scan_init() has already run.
2100 */
2101 while (ioc_found)
2102 acpi_sba_ioc_add(ioc_found);
2103
2104 if (!ioc_list)
2105 return 0;
2106
2107 {
2108 struct pci_bus *b = NULL;
2109 while ((b = pci_find_next_bus(b)) != NULL)
2110 sba_connect_bus(b);
2111 }
2112
2113 /* no need for swiotlb with the iommu */
2114 swiotlb_exit();
2115 dma_ops = &sba_dma_ops;
2116
2117#ifdef CONFIG_PROC_FS
2118 ioc_proc_init();
2119#endif
2120 return 0;
2121}
2122
2123subsys_initcall(sba_init); /* must be initialized after ACPI etc., but before any drivers... */
2124
2125static int __init
2126nosbagart(char *str)
2127{
2128 reserve_sba_gart = 0;
2129 return 1;
2130}
2131
2132__setup("nosbagart", nosbagart);
2133
2134static int __init
2135sba_page_override(char *str)
2136{
2137 unsigned long page_size;
2138
2139 page_size = memparse(str, &str);
2140 switch (page_size) {
2141 case 4096:
2142 case 8192:
2143 case 16384:
2144 case 65536:
2145 iovp_shift = ffs(page_size) - 1;
2146 break;
2147 default:
2148 printk("%s: unknown/unsupported iommu page size %ld\n",
2149 __func__, page_size);
2150 }
2151
2152 return 1;
2153}
2154
2155__setup("sbapagesize=",sba_page_override);
arch/ia64/include/asm/Kbuild+0−6
@@ -1,6 +0,0 @@
1# SPDX-License-Identifier: GPL-2.0
2generated-y += syscall_table.h
3generic-y += agp.h
4generic-y += kvm_para.h
5generic-y += mcs_spinlock.h
6generic-y += vtime.h
arch/ia64/include/asm/acenv.h+0−49
@@ -1,49 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * IA64 specific ACPICA environments and implementation
4 *
5 * Copyright (C) 2014, Intel Corporation
6 * Author: Lv Zheng <lv.zheng@intel.com>
7 */
8
9#ifndef _ASM_IA64_ACENV_H
10#define _ASM_IA64_ACENV_H
11
12#include <asm/intrinsics.h>
13
14#define COMPILER_DEPENDENT_INT64 long
15#define COMPILER_DEPENDENT_UINT64 unsigned long
16
17/* Asm macros */
18
19static inline int
20ia64_acpi_acquire_global_lock(unsigned int *lock)
21{
22 unsigned int old, new, val;
23 do {
24 old = *lock;
25 new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
26 val = ia64_cmpxchg4_acq(lock, new, old);
27 } while (unlikely (val != old));
28 return (new < 3) ? -1 : 0;
29}
30
31static inline int
32ia64_acpi_release_global_lock(unsigned int *lock)
33{
34 unsigned int old, new, val;
35 do {
36 old = *lock;
37 new = old & ~0x3;
38 val = ia64_cmpxchg4_acq(lock, new, old);
39 } while (unlikely (val != old));
40 return old & 0x1;
41}
42
43#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq) \
44 ((Acq) = ia64_acpi_acquire_global_lock(&facs->global_lock))
45
46#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq) \
47 ((Acq) = ia64_acpi_release_global_lock(&facs->global_lock))
48
49#endif /* _ASM_IA64_ACENV_H */
arch/ia64/include/asm/acpi-ext.h+0−17
@@ -1,17 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * (c) Copyright 2003, 2006 Hewlett-Packard Development Company, L.P.
4 * Alex Williamson <alex.williamson@hp.com>
5 * Bjorn Helgaas <bjorn.helgaas@hp.com>
6 *
7 * Vendor specific extensions to ACPI.
8 */
9
10#ifndef _ASM_IA64_ACPI_EXT_H
11#define _ASM_IA64_ACPI_EXT_H
12
13#include <linux/types.h>
14
15extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length);
16
17#endif /* _ASM_IA64_ACPI_EXT_H */
arch/ia64/include/asm/acpi.h+0−110
@@ -1,110 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Copyright (C) 1999 VA Linux Systems
4 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
5 * Copyright (C) 2000,2001 J.I. Lee <jung-ik.lee@intel.com>
6 * Copyright (C) 2001,2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
7 */
8
9#ifndef _ASM_ACPI_H
10#define _ASM_ACPI_H
11
12#ifdef __KERNEL__
13
14#include <acpi/proc_cap_intel.h>
15
16#include <linux/init.h>
17#include <linux/numa.h>
18#include <asm/numa.h>
19
20
21extern int acpi_lapic;
22#define acpi_disabled 0 /* ACPI always enabled on IA64 */
23#define acpi_noirq 0 /* ACPI always enabled on IA64 */
24#define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */
25#define acpi_strict 1 /* no ACPI spec workarounds on IA64 */
26
27static inline bool acpi_has_cpu_in_madt(void)
28{
29 return !!acpi_lapic;
30}
31
32#define acpi_processor_cstate_check(x) (x) /* no idle limits on IA64 :) */
33static inline void disable_acpi(void) { }
34
35int acpi_request_vector (u32 int_type);
36int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
37
38/* Low-level suspend routine. */
39extern int acpi_suspend_lowlevel(void);
40
41static inline unsigned long acpi_get_wakeup_address(void)
42{
43 return 0;
44}
45
46/*
47 * Record the cpei override flag and current logical cpu. This is
48 * useful for CPU removal.
49 */
50extern unsigned int can_cpei_retarget(void);
51extern unsigned int is_cpu_cpei_target(unsigned int cpu);
52extern void set_cpei_target_cpu(unsigned int cpu);
53extern unsigned int get_cpei_target_cpu(void);
54extern void prefill_possible_map(void);
55#ifdef CONFIG_ACPI_HOTPLUG_CPU
56extern int additional_cpus;
57#else
58#define additional_cpus 0
59#endif
60
61#ifdef CONFIG_ACPI_NUMA
62#if MAX_NUMNODES > 256
63#define MAX_PXM_DOMAINS MAX_NUMNODES
64#else
65#define MAX_PXM_DOMAINS (256)
66#endif
67extern int pxm_to_nid_map[MAX_PXM_DOMAINS];
68extern int __initdata nid_to_pxm_map[MAX_NUMNODES];
69#endif
70
71static inline bool arch_has_acpi_pdc(void) { return true; }
72static inline void arch_acpi_set_proc_cap_bits(u32 *cap)
73{
74 *cap |= ACPI_PROC_CAP_EST_CAPABILITY_SMP;
75}
76
77#ifdef CONFIG_ACPI_NUMA
78extern cpumask_t early_cpu_possible_map;
79#define for_each_possible_early_cpu(cpu) \
80 for_each_cpu((cpu), &early_cpu_possible_map)
81
82static inline void per_cpu_scan_finalize(int min_cpus, int reserve_cpus)
83{
84 int low_cpu, high_cpu;
85 int cpu;
86 int next_nid = 0;
87
88 low_cpu = cpumask_weight(&early_cpu_possible_map);
89
90 high_cpu = max(low_cpu, min_cpus);
91 high_cpu = min(high_cpu + reserve_cpus, NR_CPUS);
92
93 for (cpu = low_cpu; cpu < high_cpu; cpu++) {
94 cpumask_set_cpu(cpu, &early_cpu_possible_map);
95 if (node_cpuid[cpu].nid == NUMA_NO_NODE) {
96 node_cpuid[cpu].nid = next_nid;
97 next_nid++;
98 if (next_nid >= num_online_nodes())
99 next_nid = 0;
100 }
101 }
102}
103
104extern void acpi_numa_fixup(void);
105
106#endif /* CONFIG_ACPI_NUMA */
107
108#endif /*__KERNEL__*/
109
110#endif /*_ASM_ACPI_H*/
arch/ia64/include/asm/asm-offsets.h+0−1
@@ -1 +0,0 @@
1#include <generated/asm-offsets.h>
arch/ia64/include/asm/asm-prototypes.h+0−30
@@ -1,30 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_ASM_PROTOTYPES_H
3#define _ASM_IA64_ASM_PROTOTYPES_H
4
5#include <asm/cacheflush.h>
6#include <asm/checksum.h>
7#include <asm/esi.h>
8#include <asm/ftrace.h>
9#include <asm/page.h>
10#include <asm/pal.h>
11#include <asm/string.h>
12#include <linux/uaccess.h>
13#include <asm/unwind.h>
14#include <asm/xor.h>
15
16extern const char ia64_ivt[];
17
18signed int __divsi3(signed int, unsigned int);
19signed int __modsi3(signed int, unsigned int);
20
21signed long long __divdi3(signed long long, unsigned long long);
22signed long long __moddi3(signed long long, unsigned long long);
23
24unsigned int __udivsi3(unsigned int, unsigned int);
25unsigned int __umodsi3(unsigned int, unsigned int);
26
27unsigned long long __udivdi3(unsigned long long, unsigned long long);
28unsigned long long __umoddi3(unsigned long long, unsigned long long);
29
30#endif /* _ASM_IA64_ASM_PROTOTYPES_H */
arch/ia64/include/asm/asmmacro.h+0−136
@@ -1,136 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_ASMMACRO_H
3#define _ASM_IA64_ASMMACRO_H
4
5/*
6 * Copyright (C) 2000-2001, 2003-2004 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10
11#define ENTRY(name) \
12 .align 32; \
13 .proc name; \
14name:
15
16#define ENTRY_MIN_ALIGN(name) \
17 .align 16; \
18 .proc name; \
19name:
20
21#define GLOBAL_ENTRY(name) \
22 .global name; \
23 ENTRY(name)
24
25#define END(name) \
26 .endp name
27
28/*
29 * Helper macros to make unwind directives more readable:
30 */
31
32/* prologue_gr: */
33#define ASM_UNW_PRLG_RP 0x8
34#define ASM_UNW_PRLG_PFS 0x4
35#define ASM_UNW_PRLG_PSP 0x2
36#define ASM_UNW_PRLG_PR 0x1
37#define ASM_UNW_PRLG_GRSAVE(ninputs) (32+(ninputs))
38
39/*
40 * Helper macros for accessing user memory.
41 *
42 * When adding any new .section/.previous entries here, make sure to
43 * also add it to the DISCARD section in arch/ia64/kernel/gate.lds.S or
44 * unpleasant things will happen.
45 */
46
47 .section "__ex_table", "a" // declare section & section attributes
48 .previous
49
50# define EX(y,x...) \
51 .xdata4 "__ex_table", 99f-., y-.; \
52 [99:] x
53# define EXCLR(y,x...) \
54 .xdata4 "__ex_table", 99f-., y-.+4; \
55 [99:] x
56
57/*
58 * Tag MCA recoverable instruction ranges.
59 */
60
61 .section "__mca_table", "a" // declare section & section attributes
62 .previous
63
64# define MCA_RECOVER_RANGE(y) \
65 .xdata4 "__mca_table", y-., 99f-.; \
66 [99:]
67
68/*
69 * Mark instructions that need a load of a virtual address patched to be
70 * a load of a physical address. We use this either in critical performance
71 * path (ivt.S - TLB miss processing) or in places where it might not be
72 * safe to use a "tpa" instruction (mca_asm.S - error recovery).
73 */
74 .section ".data..patch.vtop", "a" // declare section & section attributes
75 .previous
76
77#define LOAD_PHYSICAL(pr, reg, obj) \
78[1:](pr)movl reg = obj; \
79 .xdata4 ".data..patch.vtop", 1b-.
80
81/*
82 * For now, we always put in the McKinley E9 workaround. On CPUs that don't need it,
83 * we'll patch out the work-around bundles with NOPs, so their impact is minimal.
84 */
85#define DO_MCKINLEY_E9_WORKAROUND
86
87#ifdef DO_MCKINLEY_E9_WORKAROUND
88 .section ".data..patch.mckinley_e9", "a"
89 .previous
90/* workaround for Itanium 2 Errata 9: */
91# define FSYS_RETURN \
92 .xdata4 ".data..patch.mckinley_e9", 1f-.; \
931:{ .mib; \
94 nop.m 0; \
95 mov r16=ar.pfs; \
96 br.call.sptk.many b7=2f;; \
97 }; \
982:{ .mib; \
99 nop.m 0; \
100 mov ar.pfs=r16; \
101 br.ret.sptk.many b6;; \
102 }
103#else
104# define FSYS_RETURN br.ret.sptk.many b6
105#endif
106
107/*
108 * If physical stack register size is different from DEF_NUM_STACK_REG,
109 * dynamically patch the kernel for correct size.
110 */
111 .section ".data..patch.phys_stack_reg", "a"
112 .previous
113#define LOAD_PHYS_STACK_REG_SIZE(reg) \
114[1:] adds reg=IA64_NUM_PHYS_STACK_REG*8+8,r0; \
115 .xdata4 ".data..patch.phys_stack_reg", 1b-.
116
117/*
118 * Up until early 2004, use of .align within a function caused bad unwind info.
119 * TEXT_ALIGN(n) expands into ".align n" if a fixed GAS is available or into nothing
120 * otherwise.
121 */
122#ifdef HAVE_WORKING_TEXT_ALIGN
123# define TEXT_ALIGN(n) .align n
124#else
125# define TEXT_ALIGN(n)
126#endif
127
128#ifdef HAVE_SERIALIZE_DIRECTIVE
129# define dv_serialize_data .serialize.data
130# define dv_serialize_instruction .serialize.instruction
131#else
132# define dv_serialize_data
133# define dv_serialize_instruction
134#endif
135
136#endif /* _ASM_IA64_ASMMACRO_H */
arch/ia64/include/asm/atomic.h+0−216
@@ -1,216 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_ATOMIC_H
3#define _ASM_IA64_ATOMIC_H
4
5/*
6 * Atomic operations that C can't guarantee us. Useful for
7 * resource counting etc..
8 *
9 * NOTE: don't mess with the types below! The "unsigned long" and
10 * "int" types were carefully placed so as to ensure proper operation
11 * of the macros.
12 *
13 * Copyright (C) 1998, 1999, 2002-2003 Hewlett-Packard Co
14 * David Mosberger-Tang <davidm@hpl.hp.com>
15 */
16#include <linux/types.h>
17
18#include <asm/intrinsics.h>
19#include <asm/barrier.h>
20
21
22#define ATOMIC64_INIT(i) { (i) }
23
24#define arch_atomic_read(v) READ_ONCE((v)->counter)
25#define arch_atomic64_read(v) READ_ONCE((v)->counter)
26
27#define arch_atomic_set(v,i) WRITE_ONCE(((v)->counter), (i))
28#define arch_atomic64_set(v,i) WRITE_ONCE(((v)->counter), (i))
29
30#define ATOMIC_OP(op, c_op) \
31static __inline__ int \
32ia64_atomic_##op (int i, atomic_t *v) \
33{ \
34 __s32 old, new; \
35 CMPXCHG_BUGCHECK_DECL \
36 \
37 do { \
38 CMPXCHG_BUGCHECK(v); \
39 old = arch_atomic_read(v); \
40 new = old c_op i; \
41 } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic_t)) != old); \
42 return new; \
43}
44
45#define ATOMIC_FETCH_OP(op, c_op) \
46static __inline__ int \
47ia64_atomic_fetch_##op (int i, atomic_t *v) \
48{ \
49 __s32 old, new; \
50 CMPXCHG_BUGCHECK_DECL \
51 \
52 do { \
53 CMPXCHG_BUGCHECK(v); \
54 old = arch_atomic_read(v); \
55 new = old c_op i; \
56 } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic_t)) != old); \
57 return old; \
58}
59
60#define ATOMIC_OPS(op, c_op) \
61 ATOMIC_OP(op, c_op) \
62 ATOMIC_FETCH_OP(op, c_op)
63
64ATOMIC_OPS(add, +)
65ATOMIC_OPS(sub, -)
66
67#ifdef __OPTIMIZE__
68#define __ia64_atomic_const(i) \
69 static const int __ia64_atomic_p = __builtin_constant_p(i) ? \
70 ((i) == 1 || (i) == 4 || (i) == 8 || (i) == 16 || \
71 (i) == -1 || (i) == -4 || (i) == -8 || (i) == -16) : 0;\
72 __ia64_atomic_p
73#else
74#define __ia64_atomic_const(i) 0
75#endif
76
77#define arch_atomic_add_return(i,v) \
78({ \
79 int __ia64_aar_i = (i); \
80 __ia64_atomic_const(i) \
81 ? ia64_fetch_and_add(__ia64_aar_i, &(v)->counter) \
82 : ia64_atomic_add(__ia64_aar_i, v); \
83})
84
85#define arch_atomic_sub_return(i,v) \
86({ \
87 int __ia64_asr_i = (i); \
88 __ia64_atomic_const(i) \
89 ? ia64_fetch_and_add(-__ia64_asr_i, &(v)->counter) \
90 : ia64_atomic_sub(__ia64_asr_i, v); \
91})
92
93#define arch_atomic_fetch_add(i,v) \
94({ \
95 int __ia64_aar_i = (i); \
96 __ia64_atomic_const(i) \
97 ? ia64_fetchadd(__ia64_aar_i, &(v)->counter, acq) \
98 : ia64_atomic_fetch_add(__ia64_aar_i, v); \
99})
100
101#define arch_atomic_fetch_sub(i,v) \
102({ \
103 int __ia64_asr_i = (i); \
104 __ia64_atomic_const(i) \
105 ? ia64_fetchadd(-__ia64_asr_i, &(v)->counter, acq) \
106 : ia64_atomic_fetch_sub(__ia64_asr_i, v); \
107})
108
109ATOMIC_FETCH_OP(and, &)
110ATOMIC_FETCH_OP(or, |)
111ATOMIC_FETCH_OP(xor, ^)
112
113#define arch_atomic_and(i,v) (void)ia64_atomic_fetch_and(i,v)
114#define arch_atomic_or(i,v) (void)ia64_atomic_fetch_or(i,v)
115#define arch_atomic_xor(i,v) (void)ia64_atomic_fetch_xor(i,v)
116
117#define arch_atomic_fetch_and(i,v) ia64_atomic_fetch_and(i,v)
118#define arch_atomic_fetch_or(i,v) ia64_atomic_fetch_or(i,v)
119#define arch_atomic_fetch_xor(i,v) ia64_atomic_fetch_xor(i,v)
120
121#undef ATOMIC_OPS
122#undef ATOMIC_FETCH_OP
123#undef ATOMIC_OP
124
125#define ATOMIC64_OP(op, c_op) \
126static __inline__ s64 \
127ia64_atomic64_##op (s64 i, atomic64_t *v) \
128{ \
129 s64 old, new; \
130 CMPXCHG_BUGCHECK_DECL \
131 \
132 do { \
133 CMPXCHG_BUGCHECK(v); \
134 old = arch_atomic64_read(v); \
135 new = old c_op i; \
136 } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old); \
137 return new; \
138}
139
140#define ATOMIC64_FETCH_OP(op, c_op) \
141static __inline__ s64 \
142ia64_atomic64_fetch_##op (s64 i, atomic64_t *v) \
143{ \
144 s64 old, new; \
145 CMPXCHG_BUGCHECK_DECL \
146 \
147 do { \
148 CMPXCHG_BUGCHECK(v); \
149 old = arch_atomic64_read(v); \
150 new = old c_op i; \
151 } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old); \
152 return old; \
153}
154
155#define ATOMIC64_OPS(op, c_op) \
156 ATOMIC64_OP(op, c_op) \
157 ATOMIC64_FETCH_OP(op, c_op)
158
159ATOMIC64_OPS(add, +)
160ATOMIC64_OPS(sub, -)
161
162#define arch_atomic64_add_return(i,v) \
163({ \
164 s64 __ia64_aar_i = (i); \
165 __ia64_atomic_const(i) \
166 ? ia64_fetch_and_add(__ia64_aar_i, &(v)->counter) \
167 : ia64_atomic64_add(__ia64_aar_i, v); \
168})
169
170#define arch_atomic64_sub_return(i,v) \
171({ \
172 s64 __ia64_asr_i = (i); \
173 __ia64_atomic_const(i) \
174 ? ia64_fetch_and_add(-__ia64_asr_i, &(v)->counter) \
175 : ia64_atomic64_sub(__ia64_asr_i, v); \
176})
177
178#define arch_atomic64_fetch_add(i,v) \
179({ \
180 s64 __ia64_aar_i = (i); \
181 __ia64_atomic_const(i) \
182 ? ia64_fetchadd(__ia64_aar_i, &(v)->counter, acq) \
183 : ia64_atomic64_fetch_add(__ia64_aar_i, v); \
184})
185
186#define arch_atomic64_fetch_sub(i,v) \
187({ \
188 s64 __ia64_asr_i = (i); \
189 __ia64_atomic_const(i) \
190 ? ia64_fetchadd(-__ia64_asr_i, &(v)->counter, acq) \
191 : ia64_atomic64_fetch_sub(__ia64_asr_i, v); \
192})
193
194ATOMIC64_FETCH_OP(and, &)
195ATOMIC64_FETCH_OP(or, |)
196ATOMIC64_FETCH_OP(xor, ^)
197
198#define arch_atomic64_and(i,v) (void)ia64_atomic64_fetch_and(i,v)
199#define arch_atomic64_or(i,v) (void)ia64_atomic64_fetch_or(i,v)
200#define arch_atomic64_xor(i,v) (void)ia64_atomic64_fetch_xor(i,v)
201
202#define arch_atomic64_fetch_and(i,v) ia64_atomic64_fetch_and(i,v)
203#define arch_atomic64_fetch_or(i,v) ia64_atomic64_fetch_or(i,v)
204#define arch_atomic64_fetch_xor(i,v) ia64_atomic64_fetch_xor(i,v)
205
206#undef ATOMIC64_OPS
207#undef ATOMIC64_FETCH_OP
208#undef ATOMIC64_OP
209
210#define arch_atomic_add(i,v) (void)arch_atomic_add_return((i), (v))
211#define arch_atomic_sub(i,v) (void)arch_atomic_sub_return((i), (v))
212
213#define arch_atomic64_add(i,v) (void)arch_atomic64_add_return((i), (v))
214#define arch_atomic64_sub(i,v) (void)arch_atomic64_sub_return((i), (v))
215
216#endif /* _ASM_IA64_ATOMIC_H */
arch/ia64/include/asm/barrier.h+0−79
@@ -1,79 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Memory barrier definitions. This is based on information published
4 * in the Processor Abstraction Layer and the System Abstraction Layer
5 * manual.
6 *
7 * Copyright (C) 1998-2003 Hewlett-Packard Co
8 * David Mosberger-Tang <davidm@hpl.hp.com>
9 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
10 * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
11 */
12#ifndef _ASM_IA64_BARRIER_H
13#define _ASM_IA64_BARRIER_H
14
15#include <linux/compiler.h>
16
17/*
18 * Macros to force memory ordering. In these descriptions, "previous"
19 * and "subsequent" refer to program order; "visible" means that all
20 * architecturally visible effects of a memory access have occurred
21 * (at a minimum, this means the memory has been read or written).
22 *
23 * wmb(): Guarantees that all preceding stores to memory-
24 * like regions are visible before any subsequent
25 * stores and that all following stores will be
26 * visible only after all previous stores.
27 * rmb(): Like wmb(), but for reads.
28 * mb(): wmb()/rmb() combo, i.e., all previous memory
29 * accesses are visible before all subsequent
30 * accesses and vice versa. This is also known as
31 * a "fence."
32 *
33 * Note: "mb()" and its variants cannot be used as a fence to order
34 * accesses to memory mapped I/O registers. For that, mf.a needs to
35 * be used. However, we don't want to always use mf.a because (a)
36 * it's (presumably) much slower than mf and (b) mf.a is supported for
37 * sequential memory pages only.
38 */
39#define mb() ia64_mf()
40#define rmb() mb()
41#define wmb() mb()
42
43#define dma_rmb() mb()
44#define dma_wmb() mb()
45
46# define __smp_mb() mb()
47
48#define __smp_mb__before_atomic() barrier()
49#define __smp_mb__after_atomic() barrier()
50
51/*
52 * IA64 GCC turns volatile stores into st.rel and volatile loads into ld.acq no
53 * need for asm trickery!
54 */
55
56#define __smp_store_release(p, v) \
57do { \
58 compiletime_assert_atomic_type(*p); \
59 barrier(); \
60 WRITE_ONCE(*p, v); \
61} while (0)
62
63#define __smp_load_acquire(p) \
64({ \
65 typeof(*p) ___p1 = READ_ONCE(*p); \
66 compiletime_assert_atomic_type(*p); \
67 barrier(); \
68 ___p1; \
69})
70
71/*
72 * The group barrier in front of the rsm & ssm are necessary to ensure
73 * that none of the previous instructions in the same group are
74 * affected by the rsm/ssm.
75 */
76
77#include <asm-generic/barrier.h>
78
79#endif /* _ASM_IA64_BARRIER_H */
arch/ia64/include/asm/bitops.h+0−453
@@ -1,453 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_BITOPS_H
3#define _ASM_IA64_BITOPS_H
4
5/*
6 * Copyright (C) 1998-2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 *
9 * 02/06/02 find_next_bit() and find_first_bit() added from Erich Focht's ia64
10 * O(1) scheduler patch
11 */
12
13#ifndef _LINUX_BITOPS_H
14#error only <linux/bitops.h> can be included directly
15#endif
16
17#include <linux/compiler.h>
18#include <linux/types.h>
19#include <asm/intrinsics.h>
20#include <asm/barrier.h>
21
22/**
23 * set_bit - Atomically set a bit in memory
24 * @nr: the bit to set
25 * @addr: the address to start counting from
26 *
27 * This function is atomic and may not be reordered. See __set_bit()
28 * if you do not require the atomic guarantees.
29 * Note that @nr may be almost arbitrarily large; this function is not
30 * restricted to acting on a single-word quantity.
31 *
32 * The address must be (at least) "long" aligned.
33 * Note that there are driver (e.g., eepro100) which use these operations to
34 * operate on hw-defined data-structures, so we can't easily change these
35 * operations to force a bigger alignment.
36 *
37 * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
38 */
39static __inline__ void
40set_bit (int nr, volatile void *addr)
41{
42 __u32 bit, old, new;
43 volatile __u32 *m;
44 CMPXCHG_BUGCHECK_DECL
45
46 m = (volatile __u32 *) addr + (nr >> 5);
47 bit = 1 << (nr & 31);
48 do {
49 CMPXCHG_BUGCHECK(m);
50 old = *m;
51 new = old | bit;
52 } while (cmpxchg_acq(m, old, new) != old);
53}
54
55/**
56 * arch___set_bit - Set a bit in memory
57 * @nr: the bit to set
58 * @addr: the address to start counting from
59 *
60 * Unlike set_bit(), this function is non-atomic and may be reordered.
61 * If it's called on the same region of memory simultaneously, the effect
62 * may be that only one operation succeeds.
63 */
64static __always_inline void
65arch___set_bit(unsigned long nr, volatile unsigned long *addr)
66{
67 *((__u32 *) addr + (nr >> 5)) |= (1 << (nr & 31));
68}
69
70/**
71 * clear_bit - Clears a bit in memory
72 * @nr: Bit to clear
73 * @addr: Address to start counting from
74 *
75 * clear_bit() is atomic and may not be reordered. However, it does
76 * not contain a memory barrier, so if it is used for locking purposes,
77 * you should call smp_mb__before_atomic() and/or smp_mb__after_atomic()
78 * in order to ensure changes are visible on other processors.
79 */
80static __inline__ void
81clear_bit (int nr, volatile void *addr)
82{
83 __u32 mask, old, new;
84 volatile __u32 *m;
85 CMPXCHG_BUGCHECK_DECL
86
87 m = (volatile __u32 *) addr + (nr >> 5);
88 mask = ~(1 << (nr & 31));
89 do {
90 CMPXCHG_BUGCHECK(m);
91 old = *m;
92 new = old & mask;
93 } while (cmpxchg_acq(m, old, new) != old);
94}
95
96/**
97 * clear_bit_unlock - Clears a bit in memory with release
98 * @nr: Bit to clear
99 * @addr: Address to start counting from
100 *
101 * clear_bit_unlock() is atomic and may not be reordered. It does
102 * contain a memory barrier suitable for unlock type operations.
103 */
104static __inline__ void
105clear_bit_unlock (int nr, volatile void *addr)
106{
107 __u32 mask, old, new;
108 volatile __u32 *m;
109 CMPXCHG_BUGCHECK_DECL
110
111 m = (volatile __u32 *) addr + (nr >> 5);
112 mask = ~(1 << (nr & 31));
113 do {
114 CMPXCHG_BUGCHECK(m);
115 old = *m;
116 new = old & mask;
117 } while (cmpxchg_rel(m, old, new) != old);
118}
119
120/**
121 * __clear_bit_unlock - Non-atomically clears a bit in memory with release
122 * @nr: Bit to clear
123 * @addr: Address to start counting from
124 *
125 * Similarly to clear_bit_unlock, the implementation uses a store
126 * with release semantics. See also arch_spin_unlock().
127 */
128static __inline__ void
129__clear_bit_unlock(int nr, void *addr)
130{
131 __u32 * const m = (__u32 *) addr + (nr >> 5);
132 __u32 const new = *m & ~(1 << (nr & 31));
133
134 ia64_st4_rel_nta(m, new);
135}
136
137/**
138 * arch___clear_bit - Clears a bit in memory (non-atomic version)
139 * @nr: the bit to clear
140 * @addr: the address to start counting from
141 *
142 * Unlike clear_bit(), this function is non-atomic and may be reordered.
143 * If it's called on the same region of memory simultaneously, the effect
144 * may be that only one operation succeeds.
145 */
146static __always_inline void
147arch___clear_bit(unsigned long nr, volatile unsigned long *addr)
148{
149 *((__u32 *) addr + (nr >> 5)) &= ~(1 << (nr & 31));
150}
151
152/**
153 * change_bit - Toggle a bit in memory
154 * @nr: Bit to toggle
155 * @addr: Address to start counting from
156 *
157 * change_bit() is atomic and may not be reordered.
158 * Note that @nr may be almost arbitrarily large; this function is not
159 * restricted to acting on a single-word quantity.
160 */
161static __inline__ void
162change_bit (int nr, volatile void *addr)
163{
164 __u32 bit, old, new;
165 volatile __u32 *m;
166 CMPXCHG_BUGCHECK_DECL
167
168 m = (volatile __u32 *) addr + (nr >> 5);
169 bit = (1 << (nr & 31));
170 do {
171 CMPXCHG_BUGCHECK(m);
172 old = *m;
173 new = old ^ bit;
174 } while (cmpxchg_acq(m, old, new) != old);
175}
176
177/**
178 * arch___change_bit - Toggle a bit in memory
179 * @nr: the bit to toggle
180 * @addr: the address to start counting from
181 *
182 * Unlike change_bit(), this function is non-atomic and may be reordered.
183 * If it's called on the same region of memory simultaneously, the effect
184 * may be that only one operation succeeds.
185 */
186static __always_inline void
187arch___change_bit(unsigned long nr, volatile unsigned long *addr)
188{
189 *((__u32 *) addr + (nr >> 5)) ^= (1 << (nr & 31));
190}
191
192/**
193 * test_and_set_bit - Set a bit and return its old value
194 * @nr: Bit to set
195 * @addr: Address to count from
196 *
197 * This operation is atomic and cannot be reordered.
198 * It also implies the acquisition side of the memory barrier.
199 */
200static __inline__ int
201test_and_set_bit (int nr, volatile void *addr)
202{
203 __u32 bit, old, new;
204 volatile __u32 *m;
205 CMPXCHG_BUGCHECK_DECL
206
207 m = (volatile __u32 *) addr + (nr >> 5);
208 bit = 1 << (nr & 31);
209 do {
210 CMPXCHG_BUGCHECK(m);
211 old = *m;
212 new = old | bit;
213 } while (cmpxchg_acq(m, old, new) != old);
214 return (old & bit) != 0;
215}
216
217/**
218 * test_and_set_bit_lock - Set a bit and return its old value for lock
219 * @nr: Bit to set
220 * @addr: Address to count from
221 *
222 * This is the same as test_and_set_bit on ia64
223 */
224#define test_and_set_bit_lock test_and_set_bit
225
226/**
227 * arch___test_and_set_bit - Set a bit and return its old value
228 * @nr: Bit to set
229 * @addr: Address to count from
230 *
231 * This operation is non-atomic and can be reordered.
232 * If two examples of this operation race, one can appear to succeed
233 * but actually fail. You must protect multiple accesses with a lock.
234 */
235static __always_inline bool
236arch___test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
237{
238 __u32 *p = (__u32 *) addr + (nr >> 5);
239 __u32 m = 1 << (nr & 31);
240 int oldbitset = (*p & m) != 0;
241
242 *p |= m;
243 return oldbitset;
244}
245
246/**
247 * test_and_clear_bit - Clear a bit and return its old value
248 * @nr: Bit to clear
249 * @addr: Address to count from
250 *
251 * This operation is atomic and cannot be reordered.
252 * It also implies the acquisition side of the memory barrier.
253 */
254static __inline__ int
255test_and_clear_bit (int nr, volatile void *addr)
256{
257 __u32 mask, old, new;
258 volatile __u32 *m;
259 CMPXCHG_BUGCHECK_DECL
260
261 m = (volatile __u32 *) addr + (nr >> 5);
262 mask = ~(1 << (nr & 31));
263 do {
264 CMPXCHG_BUGCHECK(m);
265 old = *m;
266 new = old & mask;
267 } while (cmpxchg_acq(m, old, new) != old);
268 return (old & ~mask) != 0;
269}
270
271/**
272 * arch___test_and_clear_bit - Clear a bit and return its old value
273 * @nr: Bit to clear
274 * @addr: Address to count from
275 *
276 * This operation is non-atomic and can be reordered.
277 * If two examples of this operation race, one can appear to succeed
278 * but actually fail. You must protect multiple accesses with a lock.
279 */
280static __always_inline bool
281arch___test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
282{
283 __u32 *p = (__u32 *) addr + (nr >> 5);
284 __u32 m = 1 << (nr & 31);
285 int oldbitset = (*p & m) != 0;
286
287 *p &= ~m;
288 return oldbitset;
289}
290
291/**
292 * test_and_change_bit - Change a bit and return its old value
293 * @nr: Bit to change
294 * @addr: Address to count from
295 *
296 * This operation is atomic and cannot be reordered.
297 * It also implies the acquisition side of the memory barrier.
298 */
299static __inline__ int
300test_and_change_bit (int nr, volatile void *addr)
301{
302 __u32 bit, old, new;
303 volatile __u32 *m;
304 CMPXCHG_BUGCHECK_DECL
305
306 m = (volatile __u32 *) addr + (nr >> 5);
307 bit = (1 << (nr & 31));
308 do {
309 CMPXCHG_BUGCHECK(m);
310 old = *m;
311 new = old ^ bit;
312 } while (cmpxchg_acq(m, old, new) != old);
313 return (old & bit) != 0;
314}
315
316/**
317 * arch___test_and_change_bit - Change a bit and return its old value
318 * @nr: Bit to change
319 * @addr: Address to count from
320 *
321 * This operation is non-atomic and can be reordered.
322 */
323static __always_inline bool
324arch___test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
325{
326 __u32 old, bit = (1 << (nr & 31));
327 __u32 *m = (__u32 *) addr + (nr >> 5);
328
329 old = *m;
330 *m = old ^ bit;
331 return (old & bit) != 0;
332}
333
334#define arch_test_bit generic_test_bit
335#define arch_test_bit_acquire generic_test_bit_acquire
336
337/**
338 * ffz - find the first zero bit in a long word
339 * @x: The long word to find the bit in
340 *
341 * Returns the bit-number (0..63) of the first (least significant) zero bit.
342 * Undefined if no zero exists, so code should check against ~0UL first...
343 */
344static inline unsigned long
345ffz (unsigned long x)
346{
347 unsigned long result;
348
349 result = ia64_popcnt(x & (~x - 1));
350 return result;
351}
352
353/**
354 * __ffs - find first bit in word.
355 * @x: The word to search
356 *
357 * Undefined if no bit exists, so code should check against 0 first.
358 */
359static __inline__ unsigned long
360__ffs (unsigned long x)
361{
362 unsigned long result;
363
364 result = ia64_popcnt((x-1) & ~x);
365 return result;
366}
367
368#ifdef __KERNEL__
369
370/*
371 * Return bit number of last (most-significant) bit set. Undefined
372 * for x==0. Bits are numbered from 0..63 (e.g., ia64_fls(9) == 3).
373 */
374static inline unsigned long
375ia64_fls (unsigned long x)
376{
377 long double d = x;
378 long exp;
379
380 exp = ia64_getf_exp(d);
381 return exp - 0xffff;
382}
383
384/*
385 * Find the last (most significant) bit set. Returns 0 for x==0 and
386 * bits are numbered from 1..32 (e.g., fls(9) == 4).
387 */
388static inline int fls(unsigned int t)
389{
390 unsigned long x = t & 0xffffffffu;
391
392 if (!x)
393 return 0;
394 x |= x >> 1;
395 x |= x >> 2;
396 x |= x >> 4;
397 x |= x >> 8;
398 x |= x >> 16;
399 return ia64_popcnt(x);
400}
401
402/*
403 * Find the last (most significant) bit set. Undefined for x==0.
404 * Bits are numbered from 0..63 (e.g., __fls(9) == 3).
405 */
406static inline unsigned long
407__fls (unsigned long x)
408{
409 x |= x >> 1;
410 x |= x >> 2;
411 x |= x >> 4;
412 x |= x >> 8;
413 x |= x >> 16;
414 x |= x >> 32;
415 return ia64_popcnt(x) - 1;
416}
417
418#include <asm-generic/bitops/fls64.h>
419
420#include <asm-generic/bitops/builtin-ffs.h>
421
422/*
423 * hweightN: returns the hamming weight (i.e. the number
424 * of bits set) of a N-bit word
425 */
426static __inline__ unsigned long __arch_hweight64(unsigned long x)
427{
428 unsigned long result;
429 result = ia64_popcnt(x);
430 return result;
431}
432
433#define __arch_hweight32(x) ((unsigned int) __arch_hweight64((x) & 0xfffffffful))
434#define __arch_hweight16(x) ((unsigned int) __arch_hweight64((x) & 0xfffful))
435#define __arch_hweight8(x) ((unsigned int) __arch_hweight64((x) & 0xfful))
436
437#include <asm-generic/bitops/const_hweight.h>
438
439#endif /* __KERNEL__ */
440
441#ifdef __KERNEL__
442
443#include <asm-generic/bitops/non-instrumented-non-atomic.h>
444
445#include <asm-generic/bitops/le.h>
446
447#include <asm-generic/bitops/ext2-atomic-setbit.h>
448
449#include <asm-generic/bitops/sched.h>
450
451#endif /* __KERNEL__ */
452
453#endif /* _ASM_IA64_BITOPS_H */
arch/ia64/include/asm/bug.h+0−19
@@ -1,19 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_BUG_H
3#define _ASM_IA64_BUG_H
4
5#ifdef CONFIG_BUG
6#define ia64_abort() __builtin_trap()
7#define BUG() do { \
8 printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
9 barrier_before_unreachable(); \
10 ia64_abort(); \
11} while (0)
12
13/* should this BUG be made generic? */
14#define HAVE_ARCH_BUG
15#endif
16
17#include <asm-generic/bug.h>
18
19#endif
arch/ia64/include/asm/cache.h+0−30
@@ -1,30 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_CACHE_H
3#define _ASM_IA64_CACHE_H
4
5
6/*
7 * Copyright (C) 1998-2000 Hewlett-Packard Co
8 * David Mosberger-Tang <davidm@hpl.hp.com>
9 */
10
11/* Bytes per L1 (data) cache line. */
12#define L1_CACHE_SHIFT CONFIG_IA64_L1_CACHE_SHIFT
13#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
14
15#ifdef CONFIG_SMP
16# define SMP_CACHE_SHIFT L1_CACHE_SHIFT
17# define SMP_CACHE_BYTES L1_CACHE_BYTES
18#else
19 /*
20 * The "aligned" directive can only _increase_ alignment, so this is
21 * safe and provides an easy way to avoid wasting space on a
22 * uni-processor:
23 */
24# define SMP_CACHE_SHIFT 3
25# define SMP_CACHE_BYTES (1 << 3)
26#endif
27
28#define __read_mostly __section(".data..read_mostly")
29
30#endif /* _ASM_IA64_CACHE_H */
arch/ia64/include/asm/cacheflush.h+0−39
@@ -1,39 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_CACHEFLUSH_H
3#define _ASM_IA64_CACHEFLUSH_H
4
5/*
6 * Copyright (C) 2002 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10#include <linux/page-flags.h>
11#include <linux/bitops.h>
12
13#include <asm/page.h>
14
15#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
16static inline void flush_dcache_folio(struct folio *folio)
17{
18 clear_bit(PG_arch_1, &folio->flags);
19}
20#define flush_dcache_folio flush_dcache_folio
21
22static inline void flush_dcache_page(struct page *page)
23{
24 flush_dcache_folio(page_folio(page));
25}
26
27extern void flush_icache_range(unsigned long start, unsigned long end);
28#define flush_icache_range flush_icache_range
29extern void clflush_cache_range(void *addr, int size);
30
31#define flush_icache_user_page(vma, page, user_addr, len) \
32do { \
33 unsigned long _addr = (unsigned long) page_address(page) + ((user_addr) & ~PAGE_MASK); \
34 flush_icache_range(_addr, _addr + (len)); \
35} while (0)
36
37#include <asm-generic/cacheflush.h>
38
39#endif /* _ASM_IA64_CACHEFLUSH_H */
arch/ia64/include/asm/checksum.h+0−63
@@ -1,63 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_CHECKSUM_H
3#define _ASM_IA64_CHECKSUM_H
4
5/*
6 * Modified 1998, 1999
7 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
8 */
9
10/*
11 * This is a version of ip_compute_csum() optimized for IP headers,
12 * which always checksum on 4 octet boundaries.
13 */
14extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
15
16/*
17 * Computes the checksum of the TCP/UDP pseudo-header returns a 16-bit
18 * checksum, already complemented
19 */
20extern __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
21 __u32 len, __u8 proto, __wsum sum);
22
23extern __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
24 __u32 len, __u8 proto, __wsum sum);
25
26/*
27 * Computes the checksum of a memory block at buff, length len,
28 * and adds in "sum" (32-bit)
29 *
30 * returns a 32-bit number suitable for feeding into itself
31 * or csum_tcpudp_magic
32 *
33 * this function must be called with even lengths, except
34 * for the last fragment, which may be odd
35 *
36 * it's best to have buff aligned on a 32-bit boundary
37 */
38extern __wsum csum_partial(const void *buff, int len, __wsum sum);
39
40/*
41 * This routine is used for miscellaneous IP-like checksums, mainly in
42 * icmp.c
43 */
44extern __sum16 ip_compute_csum(const void *buff, int len);
45
46/*
47 * Fold a partial checksum without adding pseudo headers.
48 */
49static inline __sum16 csum_fold(__wsum csum)
50{
51 u32 sum = (__force u32)csum;
52 sum = (sum & 0xffff) + (sum >> 16);
53 sum = (sum & 0xffff) + (sum >> 16);
54 return (__force __sum16)~sum;
55}
56
57#define _HAVE_ARCH_IPV6_CSUM 1
58struct in6_addr;
59extern __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
60 const struct in6_addr *daddr,
61 __u32 len, __u8 proto, __wsum csum);
62
63#endif /* _ASM_IA64_CHECKSUM_H */
arch/ia64/include/asm/clocksource.h+0−11
@@ -1,11 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/* IA64-specific clocksource additions */
3
4#ifndef _ASM_IA64_CLOCKSOURCE_H
5#define _ASM_IA64_CLOCKSOURCE_H
6
7struct arch_clocksource_data {
8 void *fsys_mmio; /* used by fsyscall asm code */
9};
10
11#endif /* _ASM_IA64_CLOCKSOURCE_H */
arch/ia64/include/asm/cmpxchg.h+0−33
@@ -1,33 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_CMPXCHG_H
3#define _ASM_IA64_CMPXCHG_H
4
5#include <uapi/asm/cmpxchg.h>
6
7#define arch_xchg(ptr, x) \
8({(__typeof__(*(ptr))) __arch_xchg((unsigned long) (x), (ptr), sizeof(*(ptr)));})
9
10#define arch_cmpxchg(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
11#define arch_cmpxchg64(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
12
13#define arch_cmpxchg_local arch_cmpxchg
14#define arch_cmpxchg64_local arch_cmpxchg64
15
16#ifdef CONFIG_IA64_DEBUG_CMPXCHG
17# define CMPXCHG_BUGCHECK_DECL int _cmpxchg_bugcheck_count = 128;
18# define CMPXCHG_BUGCHECK(v) \
19do { \
20 if (_cmpxchg_bugcheck_count-- <= 0) { \
21 void *ip; \
22 extern int _printk(const char *fmt, ...); \
23 ip = (void *) ia64_getreg(_IA64_REG_IP); \
24 _printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
25 break; \
26 } \
27} while (0)
28#else /* !CONFIG_IA64_DEBUG_CMPXCHG */
29# define CMPXCHG_BUGCHECK_DECL
30# define CMPXCHG_BUGCHECK(v)
31#endif /* !CONFIG_IA64_DEBUG_CMPXCHG */
32
33#endif /* _ASM_IA64_CMPXCHG_H */
arch/ia64/include/asm/cpu.h+0−23
@@ -1,23 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_CPU_H_
3#define _ASM_IA64_CPU_H_
4
5#include <linux/device.h>
6#include <linux/cpu.h>
7#include <linux/topology.h>
8#include <linux/percpu.h>
9
10struct ia64_cpu {
11 struct cpu cpu;
12};
13
14DECLARE_PER_CPU(struct ia64_cpu, cpu_devices);
15
16DECLARE_PER_CPU(int, cpu_state);
17
18#ifdef CONFIG_HOTPLUG_CPU
19extern int arch_register_cpu(int num);
20extern void arch_unregister_cpu(int);
21#endif
22
23#endif /* _ASM_IA64_CPU_H_ */
arch/ia64/include/asm/cputime.h+0−21
@@ -1,21 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Definitions for measuring cputime on ia64 machines.
4 *
5 * Based on <asm-powerpc/cputime.h>.
6 *
7 * Copyright (C) 2007 FUJITSU LIMITED
8 * Copyright (C) 2007 Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
9 *
10 * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in nsec.
11 * Otherwise we measure cpu time in jiffies using the generic definitions.
12 */
13
14#ifndef __IA64_CPUTIME_H
15#define __IA64_CPUTIME_H
16
17#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
18extern void arch_vtime_task_switch(struct task_struct *tsk);
19#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
20
21#endif /* __IA64_CPUTIME_H */
arch/ia64/include/asm/current.h+0−18
@@ -1,18 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_CURRENT_H
3#define _ASM_IA64_CURRENT_H
4
5/*
6 * Modified 1998-2000
7 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
8 */
9
10#include <asm/intrinsics.h>
11
12/*
13 * In kernel mode, thread pointer (r13) is used to point to the current task
14 * structure.
15 */
16#define current ((struct task_struct *) ia64_getreg(_IA64_REG_TP))
17
18#endif /* _ASM_IA64_CURRENT_H */
arch/ia64/include/asm/cyclone.h+0−16
@@ -1,16 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef ASM_IA64_CYCLONE_H
3#define ASM_IA64_CYCLONE_H
4
5#ifdef CONFIG_IA64_CYCLONE
6extern int use_cyclone;
7extern void __init cyclone_setup(void);
8#else /* CONFIG_IA64_CYCLONE */
9#define use_cyclone 0
10static inline void cyclone_setup(void)
11{
12 printk(KERN_ERR "Cyclone Counter: System not configured"
13 " w/ CONFIG_IA64_CYCLONE.\n");
14}
15#endif /* CONFIG_IA64_CYCLONE */
16#endif /* !ASM_IA64_CYCLONE_H */
arch/ia64/include/asm/delay.h+0−89
@@ -1,89 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_DELAY_H
3#define _ASM_IA64_DELAY_H
4
5/*
6 * Delay routines using a pre-computed "cycles/usec" value.
7 *
8 * Copyright (C) 1998, 1999 Hewlett-Packard Co
9 * David Mosberger-Tang <davidm@hpl.hp.com>
10 * Copyright (C) 1999 VA Linux Systems
11 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
12 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
13 * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
14 */
15
16#include <linux/kernel.h>
17#include <linux/sched.h>
18#include <linux/compiler.h>
19
20#include <asm/intrinsics.h>
21#include <asm/processor.h>
22
23static __inline__ void
24ia64_set_itm (unsigned long val)
25{
26 ia64_setreg(_IA64_REG_CR_ITM, val);
27 ia64_srlz_d();
28}
29
30static __inline__ unsigned long
31ia64_get_itm (void)
32{
33 unsigned long result;
34
35 result = ia64_getreg(_IA64_REG_CR_ITM);
36 ia64_srlz_d();
37 return result;
38}
39
40static __inline__ void
41ia64_set_itv (unsigned long val)
42{
43 ia64_setreg(_IA64_REG_CR_ITV, val);
44 ia64_srlz_d();
45}
46
47static __inline__ unsigned long
48ia64_get_itv (void)
49{
50 return ia64_getreg(_IA64_REG_CR_ITV);
51}
52
53static __inline__ void
54ia64_set_itc (unsigned long val)
55{
56 ia64_setreg(_IA64_REG_AR_ITC, val);
57 ia64_srlz_d();
58}
59
60static __inline__ unsigned long
61ia64_get_itc (void)
62{
63 unsigned long result;
64
65 result = ia64_getreg(_IA64_REG_AR_ITC);
66 ia64_barrier();
67#ifdef CONFIG_ITANIUM
68 while (unlikely((__s32) result == -1)) {
69 result = ia64_getreg(_IA64_REG_AR_ITC);
70 ia64_barrier();
71 }
72#endif
73 return result;
74}
75
76extern void ia64_delay_loop (unsigned long loops);
77
78static __inline__ void
79__delay (unsigned long loops)
80{
81 if (unlikely(loops < 1))
82 return;
83
84 ia64_delay_loop (loops - 1);
85}
86
87extern void udelay (unsigned long usecs);
88
89#endif /* _ASM_IA64_DELAY_H */
arch/ia64/include/asm/device.h+0−14
@@ -1,14 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Arch specific extensions to struct device
4 */
5#ifndef _ASM_IA64_DEVICE_H
6#define _ASM_IA64_DEVICE_H
7
8struct dev_archdata {
9};
10
11struct pdev_archdata {
12};
13
14#endif /* _ASM_IA64_DEVICE_H */
arch/ia64/include/asm/div64.h+0−1
@@ -1 +0,0 @@
1#include <asm-generic/div64.h>
arch/ia64/include/asm/dma-mapping.h+0−16
@@ -1,16 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_DMA_MAPPING_H
3#define _ASM_IA64_DMA_MAPPING_H
4
5/*
6 * Copyright (C) 2003-2004 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9extern const struct dma_map_ops *dma_ops;
10
11static inline const struct dma_map_ops *get_arch_dma_ops(void)
12{
13 return dma_ops;
14}
15
16#endif /* _ASM_IA64_DMA_MAPPING_H */
arch/ia64/include/asm/dma.h+0−17
@@ -1,17 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_DMA_H
3#define _ASM_IA64_DMA_H
4
5/*
6 * Copyright (C) 1998-2002 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10
11#include <asm/io.h> /* need byte IO */
12
13extern unsigned long MAX_DMA_ADDRESS;
14
15#define free_dma(x)
16
17#endif /* _ASM_IA64_DMA_H */
arch/ia64/include/asm/dmi.h+0−15
@@ -1,15 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_DMI_H
3#define _ASM_DMI_H 1
4
5#include <linux/slab.h>
6#include <asm/io.h>
7
8/* Use normal IO mappings for DMI */
9#define dmi_early_remap ioremap
10#define dmi_early_unmap(x, l) iounmap(x)
11#define dmi_remap ioremap
12#define dmi_unmap iounmap
13#define dmi_alloc(l) kzalloc(l, GFP_ATOMIC)
14
15#endif
arch/ia64/include/asm/early_ioremap.h+0−11
@@ -1,11 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_EARLY_IOREMAP_H
3#define _ASM_IA64_EARLY_IOREMAP_H
4
5extern void __iomem * early_ioremap (unsigned long phys_addr, unsigned long size);
6#define early_memremap(phys_addr, size) early_ioremap(phys_addr, size)
7
8extern void early_iounmap (volatile void __iomem *addr, unsigned long size);
9#define early_memunmap(addr, size) early_iounmap(addr, size)
10
11#endif
arch/ia64/include/asm/efi.h+0−13
@@ -1,13 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_EFI_H
3#define _ASM_EFI_H
4
5typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
6
7void *efi_get_pal_addr(void);
8void efi_map_pal_code(void);
9void efi_memmap_walk(efi_freemem_callback_t, void *);
10void efi_memmap_walk_uc(efi_freemem_callback_t, void *);
11void efi_gettimeofday(struct timespec64 *ts);
12
13#endif
arch/ia64/include/asm/elf.h+0−233
@@ -1,233 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_ELF_H
3#define _ASM_IA64_ELF_H
4
5/*
6 * ELF-specific definitions.
7 *
8 * Copyright (C) 1998-1999, 2002-2004 Hewlett-Packard Co
9 * David Mosberger-Tang <davidm@hpl.hp.com>
10 */
11
12
13#include <asm/fpu.h>
14#include <asm/page.h>
15#include <asm/auxvec.h>
16
17/*
18 * This is used to ensure we don't load something for the wrong architecture.
19 */
20#define elf_check_arch(x) ((x)->e_machine == EM_IA_64)
21
22/*
23 * These are used to set parameters in the core dumps.
24 */
25#define ELF_CLASS ELFCLASS64
26#define ELF_DATA ELFDATA2LSB
27#define ELF_ARCH EM_IA_64
28
29#define CORE_DUMP_USE_REGSET
30
31/* Least-significant four bits of ELF header's e_flags are OS-specific. The bits are
32 interpreted as follows by Linux: */
33#define EF_IA_64_LINUX_EXECUTABLE_STACK 0x1 /* is stack (& heap) executable by default? */
34
35#define ELF_EXEC_PAGESIZE PAGE_SIZE
36
37/*
38 * This is the location that an ET_DYN program is loaded if exec'ed.
39 * Typical use of this is to invoke "./ld.so someprog" to test out a
40 * new version of the loader. We need to make sure that it is out of
41 * the way of the program that it will "exec", and that there is
42 * sufficient room for the brk.
43 */
44#define ELF_ET_DYN_BASE (TASK_UNMAPPED_BASE + 0x800000000UL)
45
46#define PT_IA_64_UNWIND 0x70000001
47
48/* IA-64 relocations: */
49#define R_IA64_NONE 0x00 /* none */
50#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
51#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
52#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
53#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
54#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
55#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
56#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
57#define R_IA64_GPREL22 0x2a /* @gprel(sym+add), add imm22 */
58#define R_IA64_GPREL64I 0x2b /* @gprel(sym+add), mov imm64 */
59#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym+add), data4 MSB */
60#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym+add), data4 LSB */
61#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym+add), data8 MSB */
62#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym+add), data8 LSB */
63#define R_IA64_LTOFF22 0x32 /* @ltoff(sym+add), add imm22 */
64#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym+add), mov imm64 */
65#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym+add), add imm22 */
66#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym+add), mov imm64 */
67#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym+add), data8 MSB */
68#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym+add), data8 LSB */
69#define R_IA64_FPTR64I 0x43 /* @fptr(sym+add), mov imm64 */
70#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym+add), data4 MSB */
71#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym+add), data4 LSB */
72#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym+add), data8 MSB */
73#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym+add), data8 LSB */
74#define R_IA64_PCREL60B 0x48 /* @pcrel(sym+add), brl */
75#define R_IA64_PCREL21B 0x49 /* @pcrel(sym+add), ptb, call */
76#define R_IA64_PCREL21M 0x4a /* @pcrel(sym+add), chk.s */
77#define R_IA64_PCREL21F 0x4b /* @pcrel(sym+add), fchkf */
78#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym+add), data4 MSB */
79#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym+add), data4 LSB */
80#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym+add), data8 MSB */
81#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym+add), data8 LSB */
82#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
83#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
84#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), 4 MSB */
85#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), 4 LSB */
86#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), 8 MSB */
87#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), 8 LSB */
88#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym+add), data4 MSB */
89#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym+add), data4 LSB */
90#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym+add), data8 MSB */
91#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym+add), data8 LSB */
92#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym+add), data4 MSB */
93#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym+add), data4 LSB */
94#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym+add), data8 MSB */
95#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym+add), data8 LSB */
96#define R_IA64_REL32MSB 0x6c /* data 4 + REL */
97#define R_IA64_REL32LSB 0x6d /* data 4 + REL */
98#define R_IA64_REL64MSB 0x6e /* data 8 + REL */
99#define R_IA64_REL64LSB 0x6f /* data 8 + REL */
100#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
101#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
102#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
103#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
104#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym+add), ptb, call */
105#define R_IA64_PCREL22 0x7a /* @pcrel(sym+add), imm22 */
106#define R_IA64_PCREL64I 0x7b /* @pcrel(sym+add), imm64 */
107#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
108#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
109#define R_IA64_COPY 0x84 /* dynamic reloc, data copy */
110#define R_IA64_SUB 0x85 /* -symbol + addend, add imm22 */
111#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
112#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
113#define R_IA64_TPREL14 0x91 /* @tprel(sym+add), add imm14 */
114#define R_IA64_TPREL22 0x92 /* @tprel(sym+add), add imm22 */
115#define R_IA64_TPREL64I 0x93 /* @tprel(sym+add), add imm64 */
116#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym+add), data8 MSB */
117#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym+add), data8 LSB */
118#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), add imm22 */
119#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym+add), data8 MSB */
120#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym+add), data8 LSB */
121#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(s+a)), imm22 */
122#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym+add), imm14 */
123#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym+add), imm22 */
124#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym+add), imm64 */
125#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym+add), data4 MSB */
126#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym+add), data4 LSB */
127#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym+add), data8 MSB */
128#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym+add), data8 LSB */
129#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
130
131/* IA-64 specific section flags: */
132#define SHF_IA_64_SHORT 0x10000000 /* section near gp */
133
134/*
135 * We use (abuse?) this macro to insert the (empty) vm_area that is
136 * used to map the register backing store. I don't see any better
137 * place to do this, but we should discuss this with Linus once we can
138 * talk to him...
139 */
140extern void ia64_init_addr_space (void);
141#define ELF_PLAT_INIT(_r, load_addr) ia64_init_addr_space()
142
143/* ELF register definitions. This is needed for core dump support. */
144
145/*
146 * elf_gregset_t contains the application-level state in the following order:
147 * r0-r31
148 * NaT bits (for r0-r31; bit N == 1 iff rN is a NaT)
149 * predicate registers (p0-p63)
150 * b0-b7
151 * ip cfm psr
152 * ar.rsc ar.bsp ar.bspstore ar.rnat
153 * ar.ccv ar.unat ar.fpsr ar.pfs ar.lc ar.ec ar.csd ar.ssd
154 */
155#define ELF_NGREG 128 /* we really need just 72 but let's leave some headroom... */
156#define ELF_NFPREG 128 /* f0 and f1 could be omitted, but so what... */
157
158/* elf_gregset_t register offsets */
159#define ELF_GR_0_OFFSET 0
160#define ELF_NAT_OFFSET (32 * sizeof(elf_greg_t))
161#define ELF_PR_OFFSET (33 * sizeof(elf_greg_t))
162#define ELF_BR_0_OFFSET (34 * sizeof(elf_greg_t))
163#define ELF_CR_IIP_OFFSET (42 * sizeof(elf_greg_t))
164#define ELF_CFM_OFFSET (43 * sizeof(elf_greg_t))
165#define ELF_CR_IPSR_OFFSET (44 * sizeof(elf_greg_t))
166#define ELF_GR_OFFSET(i) (ELF_GR_0_OFFSET + i * sizeof(elf_greg_t))
167#define ELF_BR_OFFSET(i) (ELF_BR_0_OFFSET + i * sizeof(elf_greg_t))
168#define ELF_AR_RSC_OFFSET (45 * sizeof(elf_greg_t))
169#define ELF_AR_BSP_OFFSET (46 * sizeof(elf_greg_t))
170#define ELF_AR_BSPSTORE_OFFSET (47 * sizeof(elf_greg_t))
171#define ELF_AR_RNAT_OFFSET (48 * sizeof(elf_greg_t))
172#define ELF_AR_CCV_OFFSET (49 * sizeof(elf_greg_t))
173#define ELF_AR_UNAT_OFFSET (50 * sizeof(elf_greg_t))
174#define ELF_AR_FPSR_OFFSET (51 * sizeof(elf_greg_t))
175#define ELF_AR_PFS_OFFSET (52 * sizeof(elf_greg_t))
176#define ELF_AR_LC_OFFSET (53 * sizeof(elf_greg_t))
177#define ELF_AR_EC_OFFSET (54 * sizeof(elf_greg_t))
178#define ELF_AR_CSD_OFFSET (55 * sizeof(elf_greg_t))
179#define ELF_AR_SSD_OFFSET (56 * sizeof(elf_greg_t))
180#define ELF_AR_END_OFFSET (57 * sizeof(elf_greg_t))
181
182typedef unsigned long elf_greg_t;
183typedef elf_greg_t elf_gregset_t[ELF_NGREG];
184
185typedef struct ia64_fpreg elf_fpreg_t;
186typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
187
188
189
190struct pt_regs; /* forward declaration... */
191extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst);
192#define ELF_CORE_COPY_REGS(_dest,_regs) ia64_elf_core_copy_regs(_regs, _dest);
193
194/* This macro yields a bitmask that programs can use to figure out
195 what instruction set this CPU supports. */
196#define ELF_HWCAP 0
197
198/* This macro yields a string that ld.so will use to load
199 implementation specific libraries for optimization. Not terribly
200 relevant until we have real hardware to play with... */
201#define ELF_PLATFORM NULL
202
203#define elf_read_implies_exec(ex, executable_stack) \
204 ((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0)
205
206struct task_struct;
207
208#define GATE_EHDR ((const struct elfhdr *) GATE_ADDR)
209
210/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */
211#define ARCH_DLINFO \
212do { \
213 extern char __kernel_syscall_via_epc[]; \
214 NEW_AUX_ENT(AT_SYSINFO, (unsigned long) __kernel_syscall_via_epc); \
215 NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR); \
216} while (0)
217
218/*
219 * format for entries in the Global Offset Table
220 */
221struct got_entry {
222 uint64_t val;
223};
224
225/*
226 * Layout of the Function Descriptor
227 */
228struct fdesc {
229 uint64_t addr;
230 uint64_t gp;
231};
232
233#endif /* _ASM_IA64_ELF_H */
arch/ia64/include/asm/emergency-restart.h+0−6
@@ -1,6 +0,0 @@
1#ifndef _ASM_EMERGENCY_RESTART_H
2#define _ASM_EMERGENCY_RESTART_H
3
4#include <asm-generic/emergency-restart.h>
5
6#endif /* _ASM_EMERGENCY_RESTART_H */
arch/ia64/include/asm/esi.h+0−30
@@ -1,30 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * ESI service calls.
4 *
5 * Copyright (c) Copyright 2005-2006 Hewlett-Packard Development Company, L.P.
6 * Alex Williamson <alex.williamson@hp.com>
7 */
8#ifndef esi_h
9#define esi_h
10
11#include <linux/efi.h>
12
13#define ESI_QUERY 0x00000001
14#define ESI_OPEN_HANDLE 0x02000000
15#define ESI_CLOSE_HANDLE 0x02000001
16
17enum esi_proc_type {
18 ESI_PROC_SERIALIZED, /* calls need to be serialized */
19 ESI_PROC_MP_SAFE, /* MP-safe, but not reentrant */
20 ESI_PROC_REENTRANT /* MP-safe and reentrant */
21};
22
23extern struct ia64_sal_retval esi_call_phys (void *, u64 *);
24extern int ia64_esi_call(efi_guid_t, struct ia64_sal_retval *,
25 enum esi_proc_type,
26 u64, u64, u64, u64, u64, u64, u64, u64);
27extern int ia64_esi_call_phys(efi_guid_t, struct ia64_sal_retval *, u64, u64,
28 u64, u64, u64, u64, u64, u64);
29
30#endif /* esi_h */
arch/ia64/include/asm/exception.h+0−23
@@ -1,23 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2#ifndef __ASM_EXCEPTION_H
3#define __ASM_EXCEPTION_H
4
5struct pt_regs;
6struct exception_table_entry;
7
8extern void ia64_handle_exception(struct pt_regs *regs,
9 const struct exception_table_entry *e);
10
11#define ia64_done_with_exception(regs) \
12({ \
13 int __ex_ret = 0; \
14 const struct exception_table_entry *e; \
15 e = search_exception_tables((regs)->cr_iip + ia64_psr(regs)->ri); \
16 if (e) { \
17 ia64_handle_exception(regs, e); \
18 __ex_ret = 1; \
19 } \
20 __ex_ret; \
21})
22
23#endif /* __ASM_EXCEPTION_H */
arch/ia64/include/asm/extable.h+0−12
@@ -1,12 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_EXTABLE_H
3#define _ASM_IA64_EXTABLE_H
4
5#define ARCH_HAS_RELATIVE_EXTABLE
6
7struct exception_table_entry {
8 int insn; /* location-relative address of insn this fixup is for */
9 int fixup; /* location-relative continuation addr.; if bit 2 is set, r9 is set to 0 */
10};
11
12#endif
arch/ia64/include/asm/fb.h+0−43
@@ -1,43 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_FB_H_
3#define _ASM_FB_H_
4
5#include <linux/compiler.h>
6#include <linux/efi.h>
7#include <linux/string.h>
8
9#include <asm/page.h>
10
11struct file;
12
13static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma,
14 unsigned long off)
15{
16 if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start))
17 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
18 else
19 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
20}
21#define fb_pgprotect fb_pgprotect
22
23static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n)
24{
25 memcpy(to, (void __force *)from, n);
26}
27#define fb_memcpy_fromio fb_memcpy_fromio
28
29static inline void fb_memcpy_toio(volatile void __iomem *to, const void *from, size_t n)
30{
31 memcpy((void __force *)to, from, n);
32}
33#define fb_memcpy_toio fb_memcpy_toio
34
35static inline void fb_memset_io(volatile void __iomem *addr, int c, size_t n)
36{
37 memset((void __force *)addr, c, n);
38}
39#define fb_memset fb_memset_io
40
41#include <asm-generic/fb.h>
42
43#endif /* _ASM_FB_H_ */
arch/ia64/include/asm/fpswa.h+0−74
@@ -1,74 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_FPSWA_H
3#define _ASM_IA64_FPSWA_H
4
5/*
6 * Floating-point Software Assist
7 *
8 * Copyright (C) 1999 Intel Corporation.
9 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
10 * Copyright (C) 1999 Goutham Rao <goutham.rao@intel.com>
11 */
12
13typedef struct {
14 /* 4 * 128 bits */
15 unsigned long fp_lp[4*2];
16} fp_state_low_preserved_t;
17
18typedef struct {
19 /* 10 * 128 bits */
20 unsigned long fp_lv[10 * 2];
21} fp_state_low_volatile_t;
22
23typedef struct {
24 /* 16 * 128 bits */
25 unsigned long fp_hp[16 * 2];
26} fp_state_high_preserved_t;
27
28typedef struct {
29 /* 96 * 128 bits */
30 unsigned long fp_hv[96 * 2];
31} fp_state_high_volatile_t;
32
33/**
34 * floating point state to be passed to the FP emulation library by
35 * the trap/fault handler
36 */
37typedef struct {
38 unsigned long bitmask_low64;
39 unsigned long bitmask_high64;
40 fp_state_low_preserved_t *fp_state_low_preserved;
41 fp_state_low_volatile_t *fp_state_low_volatile;
42 fp_state_high_preserved_t *fp_state_high_preserved;
43 fp_state_high_volatile_t *fp_state_high_volatile;
44} fp_state_t;
45
46typedef struct {
47 unsigned long status;
48 unsigned long err0;
49 unsigned long err1;
50 unsigned long err2;
51} fpswa_ret_t;
52
53/**
54 * function header for the Floating Point software assist
55 * library. This function is invoked by the Floating point software
56 * assist trap/fault handler.
57 */
58typedef fpswa_ret_t (*efi_fpswa_t) (unsigned long trap_type, void *bundle, unsigned long *ipsr,
59 unsigned long *fsr, unsigned long *isr, unsigned long *preds,
60 unsigned long *ifs, fp_state_t *fp_state);
61
62/**
63 * This is the FPSWA library interface as defined by EFI. We need to pass a
64 * pointer to the interface itself on a call to the assist library
65 */
66typedef struct {
67 unsigned int revision;
68 unsigned int reserved;
69 efi_fpswa_t fpswa;
70} fpswa_interface_t;
71
72extern fpswa_interface_t *fpswa_interface;
73
74#endif /* _ASM_IA64_FPSWA_H */
arch/ia64/include/asm/ftrace.h+0−28
@@ -1,28 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_FTRACE_H
3#define _ASM_IA64_FTRACE_H
4
5#ifdef CONFIG_FUNCTION_TRACER
6#define MCOUNT_INSN_SIZE 32 /* sizeof mcount call */
7
8#ifndef __ASSEMBLY__
9extern void _mcount(unsigned long pfs, unsigned long r1, unsigned long b0, unsigned long r0);
10#define mcount _mcount
11
12/* In IA64, MCOUNT_ADDR is set in link time, so it's not a constant at compile time */
13#define MCOUNT_ADDR (((struct fnptr *)mcount)->ip)
14#define FTRACE_ADDR (((struct fnptr *)ftrace_caller)->ip)
15
16static inline unsigned long ftrace_call_adjust(unsigned long addr)
17{
18 /* second bundle, insn 2 */
19 return addr - 0x12;
20}
21
22struct dyn_arch_ftrace {
23};
24#endif
25
26#endif /* CONFIG_FUNCTION_TRACER */
27
28#endif /* _ASM_IA64_FTRACE_H */
arch/ia64/include/asm/futex.h+0−109
@@ -1,109 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_FUTEX_H
3#define _ASM_FUTEX_H
4
5#include <linux/futex.h>
6#include <linux/uaccess.h>
7#include <asm/errno.h>
8
9#define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg) \
10do { \
11 register unsigned long r8 __asm ("r8") = 0; \
12 __asm__ __volatile__( \
13 " mf;; \n" \
14 "[1:] " insn ";; \n" \
15 " .xdata4 \"__ex_table\", 1b-., 2f-. \n" \
16 "[2:]" \
17 : "+r" (r8), "=r" (oldval) \
18 : "r" (uaddr), "r" (oparg) \
19 : "memory"); \
20 ret = r8; \
21} while (0)
22
23#define __futex_atomic_op2(insn, ret, oldval, uaddr, oparg) \
24do { \
25 register unsigned long r8 __asm ("r8") = 0; \
26 int val, newval; \
27 do { \
28 __asm__ __volatile__( \
29 " mf;; \n" \
30 "[1:] ld4 %3=[%4];; \n" \
31 " mov %2=%3 \n" \
32 insn ";; \n" \
33 " mov ar.ccv=%2;; \n" \
34 "[2:] cmpxchg4.acq %1=[%4],%3,ar.ccv;; \n" \
35 " .xdata4 \"__ex_table\", 1b-., 3f-.\n" \
36 " .xdata4 \"__ex_table\", 2b-., 3f-.\n" \
37 "[3:]" \
38 : "+r" (r8), "=r" (val), "=&r" (oldval), \
39 "=&r" (newval) \
40 : "r" (uaddr), "r" (oparg) \
41 : "memory"); \
42 if (unlikely (r8)) \
43 break; \
44 } while (unlikely (val != oldval)); \
45 ret = r8; \
46} while (0)
47
48static inline int
49arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
50{
51 int oldval = 0, ret;
52
53 if (!access_ok(uaddr, sizeof(u32)))
54 return -EFAULT;
55
56 switch (op) {
57 case FUTEX_OP_SET:
58 __futex_atomic_op1("xchg4 %1=[%2],%3", ret, oldval, uaddr,
59 oparg);
60 break;
61 case FUTEX_OP_ADD:
62 __futex_atomic_op2("add %3=%3,%5", ret, oldval, uaddr, oparg);
63 break;
64 case FUTEX_OP_OR:
65 __futex_atomic_op2("or %3=%3,%5", ret, oldval, uaddr, oparg);
66 break;
67 case FUTEX_OP_ANDN:
68 __futex_atomic_op2("and %3=%3,%5", ret, oldval, uaddr,
69 ~oparg);
70 break;
71 case FUTEX_OP_XOR:
72 __futex_atomic_op2("xor %3=%3,%5", ret, oldval, uaddr, oparg);
73 break;
74 default:
75 ret = -ENOSYS;
76 }
77
78 if (!ret)
79 *oval = oldval;
80
81 return ret;
82}
83
84static inline int
85futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
86 u32 oldval, u32 newval)
87{
88 if (!access_ok(uaddr, sizeof(u32)))
89 return -EFAULT;
90
91 {
92 register unsigned long r8 __asm ("r8") = 0;
93 unsigned long prev;
94 __asm__ __volatile__(
95 " mf;; \n"
96 " mov ar.ccv=%4;; \n"
97 "[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n"
98 " .xdata4 \"__ex_table\", 1b-., 2f-. \n"
99 "[2:]"
100 : "+r" (r8), "=&r" (prev)
101 : "r" (uaddr), "r" (newval),
102 "rO" ((long) (unsigned) oldval)
103 : "memory");
104 *uval = prev;
105 return r8;
106 }
107}
108
109#endif /* _ASM_FUTEX_H */
arch/ia64/include/asm/gcc_intrin.h+0−13
@@ -1,13 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 *
4 * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
5 * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
6 */
7#ifndef _ASM_IA64_GCC_INTRIN_H
8#define _ASM_IA64_GCC_INTRIN_H
9
10#include <uapi/asm/gcc_intrin.h>
11
12register unsigned long ia64_r13 asm ("r13") __used;
13#endif /* _ASM_IA64_GCC_INTRIN_H */
arch/ia64/include/asm/hardirq.h+0−27
@@ -1,27 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_HARDIRQ_H
3#define _ASM_IA64_HARDIRQ_H
4
5/*
6 * Modified 1998-2002, 2004 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10/*
11 * No irq_cpustat_t for IA-64. The data is held in the per-CPU data structure.
12 */
13
14#define __ARCH_IRQ_STAT 1
15
16#define local_softirq_pending_ref ia64_cpu_info.softirq_pending
17
18#include <linux/threads.h>
19#include <linux/irq.h>
20
21#include <asm/processor.h>
22
23extern void __iomem *ipi_base_addr;
24
25void ack_bad_irq(unsigned int irq);
26
27#endif /* _ASM_IA64_HARDIRQ_H */
arch/ia64/include/asm/hugetlb.h+0−34
@@ -1,34 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_HUGETLB_H
3#define _ASM_IA64_HUGETLB_H
4
5#include <asm/page.h>
6
7#define __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
8void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
9 unsigned long end, unsigned long floor,
10 unsigned long ceiling);
11
12#define __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE
13int prepare_hugepage_range(struct file *file,
14 unsigned long addr, unsigned long len);
15
16static inline int is_hugepage_only_range(struct mm_struct *mm,
17 unsigned long addr,
18 unsigned long len)
19{
20 return (REGION_NUMBER(addr) == RGN_HPAGE ||
21 REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE);
22}
23#define is_hugepage_only_range is_hugepage_only_range
24
25#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
26static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
27 unsigned long addr, pte_t *ptep)
28{
29 return *ptep;
30}
31
32#include <asm-generic/hugetlb.h>
33
34#endif /* _ASM_IA64_HUGETLB_H */
arch/ia64/include/asm/hw_irq.h+0−167
@@ -1,167 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_HW_IRQ_H
3#define _ASM_IA64_HW_IRQ_H
4
5/*
6 * Copyright (C) 2001-2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10#include <linux/interrupt.h>
11#include <linux/sched.h>
12#include <linux/types.h>
13#include <linux/profile.h>
14
15#include <asm/ptrace.h>
16#include <asm/smp.h>
17
18typedef u8 ia64_vector;
19
20/*
21 * 0 special
22 *
23 * 1,3-14 are reserved from firmware
24 *
25 * 16-255 (vectored external interrupts) are available
26 *
27 * 15 spurious interrupt (see IVR)
28 *
29 * 16 lowest priority, 255 highest priority
30 *
31 * 15 classes of 16 interrupts each.
32 */
33#define IA64_MIN_VECTORED_IRQ 16
34#define IA64_MAX_VECTORED_IRQ 255
35#define IA64_NUM_VECTORS 256
36
37#define AUTO_ASSIGN -1
38
39#define IA64_SPURIOUS_INT_VECTOR 0x0f
40
41/*
42 * Vectors 0x10-0x1f are used for low priority interrupts, e.g. CMCI.
43 */
44#define IA64_CPEP_VECTOR 0x1c /* corrected platform error polling vector */
45#define IA64_CMCP_VECTOR 0x1d /* corrected machine-check polling vector */
46#define IA64_CPE_VECTOR 0x1e /* corrected platform error interrupt vector */
47#define IA64_CMC_VECTOR 0x1f /* corrected machine-check interrupt vector */
48/*
49 * Vectors 0x20-0x2f are reserved for legacy ISA IRQs.
50 * Use vectors 0x30-0xe7 as the default device vector range for ia64.
51 * Platforms may choose to reduce this range in platform_irq_setup, but the
52 * platform range must fall within
53 * [IA64_DEF_FIRST_DEVICE_VECTOR..IA64_DEF_LAST_DEVICE_VECTOR]
54 */
55extern int ia64_first_device_vector;
56extern int ia64_last_device_vector;
57
58#ifdef CONFIG_SMP
59/* Reserve the lower priority vector than device vectors for "move IRQ" IPI */
60#define IA64_IRQ_MOVE_VECTOR 0x30 /* "move IRQ" IPI */
61#define IA64_DEF_FIRST_DEVICE_VECTOR 0x31
62#else
63#define IA64_DEF_FIRST_DEVICE_VECTOR 0x30
64#endif
65#define IA64_DEF_LAST_DEVICE_VECTOR 0xe7
66#define IA64_FIRST_DEVICE_VECTOR ia64_first_device_vector
67#define IA64_LAST_DEVICE_VECTOR ia64_last_device_vector
68#define IA64_MAX_DEVICE_VECTORS (IA64_DEF_LAST_DEVICE_VECTOR - IA64_DEF_FIRST_DEVICE_VECTOR + 1)
69#define IA64_NUM_DEVICE_VECTORS (IA64_LAST_DEVICE_VECTOR - IA64_FIRST_DEVICE_VECTOR + 1)
70
71#define IA64_MCA_RENDEZ_VECTOR 0xe8 /* MCA rendez interrupt */
72#define IA64_TIMER_VECTOR 0xef /* use highest-prio group 15 interrupt for timer */
73#define IA64_MCA_WAKEUP_VECTOR 0xf0 /* MCA wakeup (must be >MCA_RENDEZ_VECTOR) */
74#define IA64_IPI_LOCAL_TLB_FLUSH 0xfc /* SMP flush local TLB */
75#define IA64_IPI_RESCHEDULE 0xfd /* SMP reschedule */
76#define IA64_IPI_VECTOR 0xfe /* inter-processor interrupt vector */
77
78/* Used for encoding redirected irqs */
79
80#define IA64_IRQ_REDIRECTED (1 << 31)
81
82/* IA64 inter-cpu interrupt related definitions */
83
84#define IA64_IPI_DEFAULT_BASE_ADDR 0xfee00000
85
86/* Delivery modes for inter-cpu interrupts */
87enum {
88 IA64_IPI_DM_INT = 0x0, /* pend an external interrupt */
89 IA64_IPI_DM_PMI = 0x2, /* pend a PMI */
90 IA64_IPI_DM_NMI = 0x4, /* pend an NMI (vector 2) */
91 IA64_IPI_DM_INIT = 0x5, /* pend an INIT interrupt */
92 IA64_IPI_DM_EXTINT = 0x7, /* pend an 8259-compatible interrupt. */
93};
94
95extern __u8 isa_irq_to_vector_map[16];
96#define isa_irq_to_vector(x) isa_irq_to_vector_map[(x)]
97
98struct irq_cfg {
99 ia64_vector vector;
100 cpumask_t domain;
101 cpumask_t old_domain;
102 unsigned move_cleanup_count;
103 u8 move_in_progress : 1;
104};
105extern spinlock_t vector_lock;
106extern struct irq_cfg irq_cfg[NR_IRQS];
107#define irq_to_domain(x) irq_cfg[(x)].domain
108DECLARE_PER_CPU(int[IA64_NUM_VECTORS], vector_irq);
109
110extern struct irq_chip irq_type_ia64_lsapic; /* CPU-internal interrupt controller */
111
112#define ia64_register_ipi ia64_native_register_ipi
113#define assign_irq_vector ia64_native_assign_irq_vector
114#define free_irq_vector ia64_native_free_irq_vector
115#define ia64_resend_irq ia64_native_resend_irq
116
117extern void ia64_native_register_ipi(void);
118extern int bind_irq_vector(int irq, int vector, cpumask_t domain);
119extern int ia64_native_assign_irq_vector (int irq); /* allocate a free vector */
120extern void ia64_native_free_irq_vector (int vector);
121extern int reserve_irq_vector (int vector);
122extern void __setup_vector_irq(int cpu);
123extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);
124extern void destroy_and_reserve_irq (unsigned int irq);
125
126#ifdef CONFIG_SMP
127extern int irq_prepare_move(int irq, int cpu);
128extern void irq_complete_move(unsigned int irq);
129#else
130static inline int irq_prepare_move(int irq, int cpu) { return 0; }
131static inline void irq_complete_move(unsigned int irq) {}
132#endif
133
134static inline void ia64_native_resend_irq(unsigned int vector)
135{
136 ia64_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0);
137}
138
139/*
140 * Next follows the irq descriptor interface. On IA-64, each CPU supports 256 interrupt
141 * vectors. On smaller systems, there is a one-to-one correspondence between interrupt
142 * vectors and the Linux irq numbers. However, larger systems may have multiple interrupt
143 * domains meaning that the translation from vector number to irq number depends on the
144 * interrupt domain that a CPU belongs to. This API abstracts such platform-dependent
145 * differences and provides a uniform means to translate between vector and irq numbers
146 * and to obtain the irq descriptor for a given irq number.
147 */
148
149/* Extract the IA-64 vector that corresponds to IRQ. */
150static inline ia64_vector
151irq_to_vector (int irq)
152{
153 return irq_cfg[irq].vector;
154}
155
156/*
157 * Convert the local IA-64 vector to the corresponding irq number. This translation is
158 * done in the context of the interrupt domain that the currently executing CPU belongs
159 * to.
160 */
161static inline unsigned int
162local_vector_to_irq (ia64_vector vec)
163{
164 return __this_cpu_read(vector_irq[vec]);
165}
166
167#endif /* _ASM_IA64_HW_IRQ_H */
arch/ia64/include/asm/idle.h+0−8
@@ -1,8 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_IDLE_H
3#define _ASM_IA64_IDLE_H
4
5static inline void enter_idle(void) { }
6static inline void exit_idle(void) { }
7
8#endif /* _ASM_IA64_IDLE_H */
arch/ia64/include/asm/intrinsics.h+0−13
@@ -1,13 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Compiler-dependent intrinsics.
4 *
5 * Copyright (C) 2002-2003 Hewlett-Packard Co
6 * David Mosberger-Tang <davidm@hpl.hp.com>
7 */
8#ifndef _ASM_IA64_INTRINSICS_H
9#define _ASM_IA64_INTRINSICS_H
10
11#include <uapi/asm/intrinsics.h>
12
13#endif /* _ASM_IA64_INTRINSICS_H */
arch/ia64/include/asm/io.h+0−271
@@ -1,271 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_IO_H
3#define _ASM_IA64_IO_H
4
5/*
6 * This file contains the definitions for the emulated IO instructions
7 * inb/inw/inl/outb/outw/outl and the "string versions" of the same
8 * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
9 * versions of the single-IO instructions (inb_p/inw_p/..).
10 *
11 * This file is not meant to be obfuscating: it's just complicated to
12 * (a) handle it all in a way that makes gcc able to optimize it as
13 * well as possible and (b) trying to avoid writing the same thing
14 * over and over again with slight variations and possibly making a
15 * mistake somewhere.
16 *
17 * Copyright (C) 1998-2003 Hewlett-Packard Co
18 * David Mosberger-Tang <davidm@hpl.hp.com>
19 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
20 * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
21 */
22
23#include <asm/unaligned.h>
24#include <asm/early_ioremap.h>
25
26#define __IA64_UNCACHED_OFFSET RGN_BASE(RGN_UNCACHED)
27
28/*
29 * The legacy I/O space defined by the ia64 architecture supports only 65536 ports, but
30 * large machines may have multiple other I/O spaces so we can't place any a priori limit
31 * on IO_SPACE_LIMIT. These additional spaces are described in ACPI.
32 */
33#define IO_SPACE_LIMIT 0xffffffffffffffffUL
34
35#define MAX_IO_SPACES_BITS 8
36#define MAX_IO_SPACES (1UL << MAX_IO_SPACES_BITS)
37#define IO_SPACE_BITS 24
38#define IO_SPACE_SIZE (1UL << IO_SPACE_BITS)
39
40#define IO_SPACE_NR(port) ((port) >> IO_SPACE_BITS)
41#define IO_SPACE_BASE(space) ((space) << IO_SPACE_BITS)
42#define IO_SPACE_PORT(port) ((port) & (IO_SPACE_SIZE - 1))
43
44#define IO_SPACE_SPARSE_ENCODING(p) ((((p) >> 2) << 12) | ((p) & 0xfff))
45
46struct io_space {
47 unsigned long mmio_base; /* base in MMIO space */
48 int sparse;
49};
50
51extern struct io_space io_space[];
52extern unsigned int num_io_spaces;
53
54# ifdef __KERNEL__
55
56/*
57 * All MMIO iomem cookies are in region 6; anything less is a PIO cookie:
58 * 0xCxxxxxxxxxxxxxxx MMIO cookie (return from ioremap)
59 * 0x000000001SPPPPPP PIO cookie (S=space number, P..P=port)
60 *
61 * ioread/writeX() uses the leading 1 in PIO cookies (PIO_OFFSET) to catch
62 * code that uses bare port numbers without the prerequisite pci_iomap().
63 */
64#define PIO_OFFSET (1UL << (MAX_IO_SPACES_BITS + IO_SPACE_BITS))
65#define PIO_MASK (PIO_OFFSET - 1)
66#define PIO_RESERVED __IA64_UNCACHED_OFFSET
67#define HAVE_ARCH_PIO_SIZE
68
69#include <asm/intrinsics.h>
70#include <asm/page.h>
71#include <asm-generic/iomap.h>
72
73/*
74 * Change virtual addresses to physical addresses and vv.
75 */
76static inline unsigned long
77virt_to_phys (volatile void *address)
78{
79 return (unsigned long) address - PAGE_OFFSET;
80}
81#define virt_to_phys virt_to_phys
82
83static inline void*
84phys_to_virt (unsigned long address)
85{
86 return (void *) (address + PAGE_OFFSET);
87}
88#define phys_to_virt phys_to_virt
89
90#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
91extern u64 kern_mem_attribute (unsigned long phys_addr, unsigned long size);
92extern int valid_phys_addr_range (phys_addr_t addr, size_t count); /* efi.c */
93extern int valid_mmap_phys_addr_range (unsigned long pfn, size_t count);
94
95# endif /* KERNEL */
96
97/*
98 * Memory fence w/accept. This should never be used in code that is
99 * not IA-64 specific.
100 */
101#define __ia64_mf_a() ia64_mfa()
102
103static inline void*
104__ia64_mk_io_addr (unsigned long port)
105{
106 struct io_space *space;
107 unsigned long offset;
108
109 space = &io_space[IO_SPACE_NR(port)];
110 port = IO_SPACE_PORT(port);
111 if (space->sparse)
112 offset = IO_SPACE_SPARSE_ENCODING(port);
113 else
114 offset = port;
115
116 return (void *) (space->mmio_base | offset);
117}
118
119/*
120 * For the in/out routines, we need to do "mf.a" _after_ doing the I/O access to ensure
121 * that the access has completed before executing other I/O accesses. Since we're doing
122 * the accesses through an uncachable (UC) translation, the CPU will execute them in
123 * program order. However, we still need to tell the compiler not to shuffle them around
124 * during optimization, which is why we use "volatile" pointers.
125 */
126
127#define inb inb
128static inline unsigned int inb(unsigned long port)
129{
130 volatile unsigned char *addr = __ia64_mk_io_addr(port);
131 unsigned char ret;
132
133 ret = *addr;
134 __ia64_mf_a();
135 return ret;
136}
137
138#define inw inw
139static inline unsigned int inw(unsigned long port)
140{
141 volatile unsigned short *addr = __ia64_mk_io_addr(port);
142 unsigned short ret;
143
144 ret = *addr;
145 __ia64_mf_a();
146 return ret;
147}
148
149#define inl inl
150static inline unsigned int inl(unsigned long port)
151{
152 volatile unsigned int *addr = __ia64_mk_io_addr(port);
153 unsigned int ret;
154
155 ret = *addr;
156 __ia64_mf_a();
157 return ret;
158}
159
160#define outb outb
161static inline void outb(unsigned char val, unsigned long port)
162{
163 volatile unsigned char *addr = __ia64_mk_io_addr(port);
164
165 *addr = val;
166 __ia64_mf_a();
167}
168
169#define outw outw
170static inline void outw(unsigned short val, unsigned long port)
171{
172 volatile unsigned short *addr = __ia64_mk_io_addr(port);
173
174 *addr = val;
175 __ia64_mf_a();
176}
177
178#define outl outl
179static inline void outl(unsigned int val, unsigned long port)
180{
181 volatile unsigned int *addr = __ia64_mk_io_addr(port);
182
183 *addr = val;
184 __ia64_mf_a();
185}
186
187#define insb insb
188static inline void insb(unsigned long port, void *dst, unsigned long count)
189{
190 unsigned char *dp = dst;
191
192 while (count--)
193 *dp++ = inb(port);
194}
195
196#define insw insw
197static inline void insw(unsigned long port, void *dst, unsigned long count)
198{
199 unsigned short *dp = dst;
200
201 while (count--)
202 put_unaligned(inw(port), dp++);
203}
204
205#define insl insl
206static inline void insl(unsigned long port, void *dst, unsigned long count)
207{
208 unsigned int *dp = dst;
209
210 while (count--)
211 put_unaligned(inl(port), dp++);
212}
213
214#define outsb outsb
215static inline void outsb(unsigned long port, const void *src,
216 unsigned long count)
217{
218 const unsigned char *sp = src;
219
220 while (count--)
221 outb(*sp++, port);
222}
223
224#define outsw outsw
225static inline void outsw(unsigned long port, const void *src,
226 unsigned long count)
227{
228 const unsigned short *sp = src;
229
230 while (count--)
231 outw(get_unaligned(sp++), port);
232}
233
234#define outsl outsl
235static inline void outsl(unsigned long port, const void *src,
236 unsigned long count)
237{
238 const unsigned int *sp = src;
239
240 while (count--)
241 outl(get_unaligned(sp++), port);
242}
243
244# ifdef __KERNEL__
245
246#define _PAGE_IOREMAP pgprot_val(PAGE_KERNEL)
247
248extern void __iomem * ioremap_uc(unsigned long offset, unsigned long size);
249
250#define ioremap_prot ioremap_prot
251#define ioremap_cache ioremap
252#define ioremap_uc ioremap_uc
253#define iounmap iounmap
254
255/*
256 * String version of IO memory access ops:
257 */
258extern void memcpy_fromio(void *dst, const volatile void __iomem *src, long n);
259extern void memcpy_toio(volatile void __iomem *dst, const void *src, long n);
260extern void memset_io(volatile void __iomem *s, int c, long n);
261
262#define memcpy_fromio memcpy_fromio
263#define memcpy_toio memcpy_toio
264#define memset_io memset_io
265#define xlate_dev_mem_ptr xlate_dev_mem_ptr
266#include <asm-generic/io.h>
267#undef PCI_IOBASE
268
269# endif /* __KERNEL__ */
270
271#endif /* _ASM_IA64_IO_H */
arch/ia64/include/asm/iommu.h+0−22
@@ -1,22 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_IOMMU_H
3#define _ASM_IA64_IOMMU_H 1
4
5#include <linux/acpi.h>
6
7/* 10 seconds */
8#define DMAR_OPERATION_TIMEOUT (((cycles_t) local_cpu_data->itc_freq)*10)
9
10extern void no_iommu_init(void);
11#ifdef CONFIG_INTEL_IOMMU
12extern int force_iommu, no_iommu;
13extern int iommu_detected;
14
15static inline int __init
16arch_rmrr_sanity_check(struct acpi_dmar_reserved_memory *rmrr) { return 0; }
17#else
18#define no_iommu (1)
19#define iommu_detected (0)
20#endif
21
22#endif
arch/ia64/include/asm/iosapic.h+0−106
@@ -1,106 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_IA64_IOSAPIC_H
3#define __ASM_IA64_IOSAPIC_H
4
5#define IOSAPIC_REG_SELECT 0x0
6#define IOSAPIC_WINDOW 0x10
7#define IOSAPIC_EOI 0x40
8
9#define IOSAPIC_VERSION 0x1
10
11/*
12 * Redirection table entry
13 */
14#define IOSAPIC_RTE_LOW(i) (0x10+i*2)
15#define IOSAPIC_RTE_HIGH(i) (0x11+i*2)
16
17#define IOSAPIC_DEST_SHIFT 16
18
19/*
20 * Delivery mode
21 */
22#define IOSAPIC_DELIVERY_SHIFT 8
23#define IOSAPIC_FIXED 0x0
24#define IOSAPIC_LOWEST_PRIORITY 0x1
25#define IOSAPIC_PMI 0x2
26#define IOSAPIC_NMI 0x4
27#define IOSAPIC_INIT 0x5
28#define IOSAPIC_EXTINT 0x7
29
30/*
31 * Interrupt polarity
32 */
33#define IOSAPIC_POLARITY_SHIFT 13
34#define IOSAPIC_POL_HIGH 0
35#define IOSAPIC_POL_LOW 1
36
37/*
38 * Trigger mode
39 */
40#define IOSAPIC_TRIGGER_SHIFT 15
41#define IOSAPIC_EDGE 0
42#define IOSAPIC_LEVEL 1
43
44/*
45 * Mask bit
46 */
47
48#define IOSAPIC_MASK_SHIFT 16
49#define IOSAPIC_MASK (1<<IOSAPIC_MASK_SHIFT)
50
51#define IOSAPIC_VECTOR_MASK 0xffffff00
52
53#ifndef __ASSEMBLY__
54
55#define NR_IOSAPICS 256
56
57#define iosapic_pcat_compat_init ia64_native_iosapic_pcat_compat_init
58#define __iosapic_read __ia64_native_iosapic_read
59#define __iosapic_write __ia64_native_iosapic_write
60#define iosapic_get_irq_chip ia64_native_iosapic_get_irq_chip
61
62extern void __init ia64_native_iosapic_pcat_compat_init(void);
63extern struct irq_chip *ia64_native_iosapic_get_irq_chip(unsigned long trigger);
64
65static inline unsigned int
66__ia64_native_iosapic_read(char __iomem *iosapic, unsigned int reg)
67{
68 writel(reg, iosapic + IOSAPIC_REG_SELECT);
69 return readl(iosapic + IOSAPIC_WINDOW);
70}
71
72static inline void
73__ia64_native_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
74{
75 writel(reg, iosapic + IOSAPIC_REG_SELECT);
76 writel(val, iosapic + IOSAPIC_WINDOW);
77}
78
79static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)
80{
81 writel(vector, iosapic + IOSAPIC_EOI);
82}
83
84extern void __init iosapic_system_init (int pcat_compat);
85extern int iosapic_init (unsigned long address, unsigned int gsi_base);
86extern int iosapic_remove (unsigned int gsi_base);
87extern int gsi_to_irq (unsigned int gsi);
88extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,
89 unsigned long trigger);
90extern void iosapic_unregister_intr (unsigned int irq);
91extern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
92 unsigned long polarity,
93 unsigned long trigger);
94extern int __init iosapic_register_platform_intr (u32 int_type,
95 unsigned int gsi,
96 int pmi_vector,
97 u16 eid, u16 id,
98 unsigned long polarity,
99 unsigned long trigger);
100
101#ifdef CONFIG_NUMA
102extern void map_iosapic_to_node (unsigned int, int);
103#endif
104
105# endif /* !__ASSEMBLY__ */
106#endif /* __ASM_IA64_IOSAPIC_H */
arch/ia64/include/asm/irq.h+0−37
@@ -1,37 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_IRQ_H
3#define _ASM_IA64_IRQ_H
4
5/*
6 * Copyright (C) 1999-2000, 2002 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 * Stephane Eranian <eranian@hpl.hp.com>
9 *
10 * 11/24/98 S.Eranian updated TIMER_IRQ and irq_canonicalize
11 * 01/20/99 S.Eranian added keyboard interrupt
12 * 02/29/00 D.Mosberger moved most things into hw_irq.h
13 */
14
15#include <linux/types.h>
16#include <linux/cpumask.h>
17#include <asm/native/irq.h>
18
19#define NR_IRQS IA64_NATIVE_NR_IRQS
20
21static __inline__ int
22irq_canonicalize (int irq)
23{
24 /*
25 * We do the legacy thing here of pretending that irqs < 16
26 * are 8259 irqs. This really shouldn't be necessary at all,
27 * but we keep it here as serial.c still uses it...
28 */
29 return ((irq == 2) ? 9 : irq);
30}
31
32extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
33
34int create_irq(void);
35void destroy_irq(unsigned int irq);
36
37#endif /* _ASM_IA64_IRQ_H */
arch/ia64/include/asm/irq_regs.h+0−1
@@ -1 +0,0 @@
1#include <asm-generic/irq_regs.h>
arch/ia64/include/asm/irq_remapping.h+0−5
@@ -1,5 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __IA64_INTR_REMAPPING_H
3#define __IA64_INTR_REMAPPING_H
4#define irq_remapping_enabled 0
5#endif
arch/ia64/include/asm/irqflags.h+0−95
@@ -1,95 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * IRQ flags defines.
4 *
5 * Copyright (C) 1998-2003 Hewlett-Packard Co
6 * David Mosberger-Tang <davidm@hpl.hp.com>
7 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
8 * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
9 */
10
11#ifndef _ASM_IA64_IRQFLAGS_H
12#define _ASM_IA64_IRQFLAGS_H
13
14#include <asm/pal.h>
15#include <asm/kregs.h>
16
17#ifdef CONFIG_IA64_DEBUG_IRQ
18extern unsigned long last_cli_ip;
19static inline void arch_maybe_save_ip(unsigned long flags)
20{
21 if (flags & IA64_PSR_I)
22 last_cli_ip = ia64_getreg(_IA64_REG_IP);
23}
24#else
25#define arch_maybe_save_ip(flags) do {} while (0)
26#endif
27
28/*
29 * - clearing psr.i is implicitly serialized (visible by next insn)
30 * - setting psr.i requires data serialization
31 * - we need a stop-bit before reading PSR because we sometimes
32 * write a floating-point register right before reading the PSR
33 * and that writes to PSR.mfl
34 */
35
36static inline unsigned long arch_local_save_flags(void)
37{
38 ia64_stop();
39 return ia64_getreg(_IA64_REG_PSR);
40}
41
42static inline unsigned long arch_local_irq_save(void)
43{
44 unsigned long flags = arch_local_save_flags();
45
46 ia64_stop();
47 ia64_rsm(IA64_PSR_I);
48 arch_maybe_save_ip(flags);
49 return flags;
50}
51
52static inline void arch_local_irq_disable(void)
53{
54#ifdef CONFIG_IA64_DEBUG_IRQ
55 arch_local_irq_save();
56#else
57 ia64_stop();
58 ia64_rsm(IA64_PSR_I);
59#endif
60}
61
62static inline void arch_local_irq_enable(void)
63{
64 ia64_stop();
65 ia64_ssm(IA64_PSR_I);
66 ia64_srlz_d();
67}
68
69static inline void arch_local_irq_restore(unsigned long flags)
70{
71#ifdef CONFIG_IA64_DEBUG_IRQ
72 unsigned long old_psr = arch_local_save_flags();
73#endif
74 ia64_intrin_local_irq_restore(flags & IA64_PSR_I);
75 arch_maybe_save_ip(old_psr & ~flags);
76}
77
78static inline bool arch_irqs_disabled_flags(unsigned long flags)
79{
80 return (flags & IA64_PSR_I) == 0;
81}
82
83static inline bool arch_irqs_disabled(void)
84{
85 return arch_irqs_disabled_flags(arch_local_save_flags());
86}
87
88static inline void arch_safe_halt(void)
89{
90 arch_local_irq_enable();
91 ia64_pal_halt_light(); /* PAL_HALT_LIGHT */
92}
93
94
95#endif /* _ASM_IA64_IRQFLAGS_H */
arch/ia64/include/asm/kdebug.h+0−45
@@ -1,45 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2#ifndef _IA64_KDEBUG_H
3#define _IA64_KDEBUG_H 1
4/*
5 *
6 * Copyright (C) Intel Corporation, 2005
7 *
8 * 2005-Apr Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
9 * <anil.s.keshavamurthy@intel.com> adopted from
10 * include/asm-x86_64/kdebug.h
11 *
12 * 2005-Oct Keith Owens <kaos@sgi.com>. Expand notify_die to cover more
13 * events.
14 */
15
16enum die_val {
17 DIE_BREAK = 1,
18 DIE_FAULT,
19 DIE_OOPS,
20 DIE_MACHINE_HALT,
21 DIE_MACHINE_RESTART,
22 DIE_MCA_MONARCH_ENTER,
23 DIE_MCA_MONARCH_PROCESS,
24 DIE_MCA_MONARCH_LEAVE,
25 DIE_MCA_SLAVE_ENTER,
26 DIE_MCA_SLAVE_PROCESS,
27 DIE_MCA_SLAVE_LEAVE,
28 DIE_MCA_RENDZVOUS_ENTER,
29 DIE_MCA_RENDZVOUS_PROCESS,
30 DIE_MCA_RENDZVOUS_LEAVE,
31 DIE_MCA_NEW_TIMEOUT,
32 DIE_INIT_ENTER,
33 DIE_INIT_MONARCH_ENTER,
34 DIE_INIT_MONARCH_PROCESS,
35 DIE_INIT_MONARCH_LEAVE,
36 DIE_INIT_SLAVE_ENTER,
37 DIE_INIT_SLAVE_PROCESS,
38 DIE_INIT_SLAVE_LEAVE,
39 DIE_KDEBUG_ENTER,
40 DIE_KDEBUG_LEAVE,
41 DIE_KDUMP_ENTER,
42 DIE_KDUMP_LEAVE,
43};
44
45#endif
arch/ia64/include/asm/kexec.h+0−46
@@ -1,46 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_KEXEC_H
3#define _ASM_IA64_KEXEC_H
4
5#include <asm/setup.h>
6
7/* Maximum physical address we can use pages from */
8#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
9/* Maximum address we can reach in physical address mode */
10#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
11/* Maximum address we can use for the control code buffer */
12#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
13
14#define KEXEC_CONTROL_PAGE_SIZE (8192 + 8192 + 4096)
15
16/* The native architecture */
17#define KEXEC_ARCH KEXEC_ARCH_IA_64
18
19#define kexec_flush_icache_page(page) do { \
20 unsigned long page_addr = (unsigned long)page_address(page); \
21 flush_icache_range(page_addr, page_addr + PAGE_SIZE); \
22 } while(0)
23
24extern struct kimage *ia64_kimage;
25extern const unsigned int relocate_new_kernel_size;
26extern void relocate_new_kernel(unsigned long, unsigned long,
27 struct ia64_boot_param *, unsigned long);
28static inline void
29crash_setup_regs(struct pt_regs *newregs, struct pt_regs *oldregs)
30{
31}
32extern struct resource efi_memmap_res;
33extern struct resource boot_param_res;
34extern void kdump_smp_send_stop(void);
35extern void kdump_smp_send_init(void);
36extern void kexec_disable_iosapic(void);
37extern void crash_save_this_cpu(void);
38struct rsvd_region;
39extern unsigned long kdump_find_rsvd_region(unsigned long size,
40 struct rsvd_region *rsvd_regions, int n);
41extern void kdump_cpu_freeze(struct unw_frame_info *info, void *arg);
42extern int kdump_status[];
43extern atomic_t kdump_cpu_freezed;
44extern atomic_t kdump_in_progress;
45
46#endif /* _ASM_IA64_KEXEC_H */
arch/ia64/include/asm/kprobes.h+0−116
@@ -1,116 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2#ifndef _ASM_KPROBES_H
3#define _ASM_KPROBES_H
4/*
5 * Kernel Probes (KProbes)
6 *
7 * Copyright (C) IBM Corporation, 2002, 2004
8 * Copyright (C) Intel Corporation, 2005
9 *
10 * 2005-Apr Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
11 * <anil.s.keshavamurthy@intel.com> adapted from i386
12 */
13#include <asm-generic/kprobes.h>
14#include <asm/break.h>
15
16#define BREAK_INST (long)(__IA64_BREAK_KPROBE << 6)
17
18#ifdef CONFIG_KPROBES
19
20#include <linux/types.h>
21#include <linux/ptrace.h>
22#include <linux/percpu.h>
23
24#define __ARCH_WANT_KPROBES_INSN_SLOT
25#define MAX_INSN_SIZE 2 /* last half is for kprobe-booster */
26#define NOP_M_INST (long)(1<<27)
27#define BRL_INST(i1, i2) ((long)((0xcL << 37) | /* brl */ \
28 (0x1L << 12) | /* many */ \
29 (((i1) & 1) << 36) | ((i2) << 13))) /* imm */
30
31typedef union cmp_inst {
32 struct {
33 unsigned long long qp : 6;
34 unsigned long long p1 : 6;
35 unsigned long long c : 1;
36 unsigned long long r2 : 7;
37 unsigned long long r3 : 7;
38 unsigned long long p2 : 6;
39 unsigned long long ta : 1;
40 unsigned long long x2 : 2;
41 unsigned long long tb : 1;
42 unsigned long long opcode : 4;
43 unsigned long long reserved : 23;
44 }f;
45 unsigned long long l;
46} cmp_inst_t;
47
48struct kprobe;
49
50typedef struct _bundle {
51 struct {
52 unsigned long long template : 5;
53 unsigned long long slot0 : 41;
54 unsigned long long slot1_p0 : 64-46;
55 } quad0;
56 struct {
57 unsigned long long slot1_p1 : 41 - (64-46);
58 unsigned long long slot2 : 41;
59 } quad1;
60} __attribute__((__aligned__(16))) bundle_t;
61
62struct prev_kprobe {
63 struct kprobe *kp;
64 unsigned long status;
65};
66
67#define MAX_PARAM_RSE_SIZE (0x60+0x60/0x3f)
68/* per-cpu kprobe control block */
69#define ARCH_PREV_KPROBE_SZ 2
70struct kprobe_ctlblk {
71 unsigned long kprobe_status;
72 unsigned long *bsp;
73 unsigned long cfm;
74 atomic_t prev_kprobe_index;
75 struct prev_kprobe prev_kprobe[ARCH_PREV_KPROBE_SZ];
76};
77
78#define kretprobe_blacklist_size 0
79
80#define SLOT0_OPCODE_SHIFT (37)
81#define SLOT1_p1_OPCODE_SHIFT (37 - (64-46))
82#define SLOT2_OPCODE_SHIFT (37)
83
84#define INDIRECT_CALL_OPCODE (1)
85#define IP_RELATIVE_CALL_OPCODE (5)
86#define IP_RELATIVE_BRANCH_OPCODE (4)
87#define IP_RELATIVE_PREDICT_OPCODE (7)
88#define LONG_BRANCH_OPCODE (0xC)
89#define LONG_CALL_OPCODE (0xD)
90#define flush_insn_slot(p) do { } while (0)
91
92typedef struct kprobe_opcode {
93 bundle_t bundle;
94} kprobe_opcode_t;
95
96/* Architecture specific copy of original instruction*/
97struct arch_specific_insn {
98 /* copy of the instruction to be emulated */
99 kprobe_opcode_t *insn;
100 #define INST_FLAG_FIX_RELATIVE_IP_ADDR 1
101 #define INST_FLAG_FIX_BRANCH_REG 2
102 #define INST_FLAG_BREAK_INST 4
103 #define INST_FLAG_BOOSTABLE 8
104 unsigned long inst_flag;
105 unsigned short target_br_reg;
106 unsigned short slot;
107};
108
109extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
110extern int kprobe_exceptions_notify(struct notifier_block *self,
111 unsigned long val, void *data);
112
113extern void arch_remove_kprobe(struct kprobe *p);
114
115#endif /* CONFIG_KPROBES */
116#endif /* _ASM_KPROBES_H */
arch/ia64/include/asm/kregs.h+0−166
@@ -1,166 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_KREGS_H
3#define _ASM_IA64_KREGS_H
4
5/*
6 * Copyright (C) 2001-2002 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9/*
10 * This file defines the kernel register usage convention used by Linux/ia64.
11 */
12
13/*
14 * Kernel registers:
15 */
16#define IA64_KR_IO_BASE 0 /* ar.k0: legacy I/O base address */
17#define IA64_KR_TSSD 1 /* ar.k1: IVE uses this as the TSSD */
18#define IA64_KR_PER_CPU_DATA 3 /* ar.k3: physical per-CPU base */
19#define IA64_KR_CURRENT_STACK 4 /* ar.k4: what's mapped in IA64_TR_CURRENT_STACK */
20#define IA64_KR_FPU_OWNER 5 /* ar.k5: fpu-owner (UP only, at the moment) */
21#define IA64_KR_CURRENT 6 /* ar.k6: "current" task pointer */
22#define IA64_KR_PT_BASE 7 /* ar.k7: page table base address (physical) */
23
24#define _IA64_KR_PASTE(x,y) x##y
25#define _IA64_KR_PREFIX(n) _IA64_KR_PASTE(ar.k, n)
26#define IA64_KR(n) _IA64_KR_PREFIX(IA64_KR_##n)
27
28/*
29 * Translation registers:
30 */
31#define IA64_TR_KERNEL 0 /* itr0, dtr0: maps kernel image (code & data) */
32#define IA64_TR_PALCODE 1 /* itr1: maps PALcode as required by EFI */
33#define IA64_TR_CURRENT_STACK 1 /* dtr1: maps kernel's memory- & register-stacks */
34
35#define IA64_TR_ALLOC_BASE 2 /* itr&dtr: Base of dynamic TR resource*/
36#define IA64_TR_ALLOC_MAX 64 /* Max number for dynamic use*/
37
38/* Processor status register bits: */
39#define IA64_PSR_BE_BIT 1
40#define IA64_PSR_UP_BIT 2
41#define IA64_PSR_AC_BIT 3
42#define IA64_PSR_MFL_BIT 4
43#define IA64_PSR_MFH_BIT 5
44#define IA64_PSR_IC_BIT 13
45#define IA64_PSR_I_BIT 14
46#define IA64_PSR_PK_BIT 15
47#define IA64_PSR_DT_BIT 17
48#define IA64_PSR_DFL_BIT 18
49#define IA64_PSR_DFH_BIT 19
50#define IA64_PSR_SP_BIT 20
51#define IA64_PSR_PP_BIT 21
52#define IA64_PSR_DI_BIT 22
53#define IA64_PSR_SI_BIT 23
54#define IA64_PSR_DB_BIT 24
55#define IA64_PSR_LP_BIT 25
56#define IA64_PSR_TB_BIT 26
57#define IA64_PSR_RT_BIT 27
58/* The following are not affected by save_flags()/restore_flags(): */
59#define IA64_PSR_CPL0_BIT 32
60#define IA64_PSR_CPL1_BIT 33
61#define IA64_PSR_IS_BIT 34
62#define IA64_PSR_MC_BIT 35
63#define IA64_PSR_IT_BIT 36
64#define IA64_PSR_ID_BIT 37
65#define IA64_PSR_DA_BIT 38
66#define IA64_PSR_DD_BIT 39
67#define IA64_PSR_SS_BIT 40
68#define IA64_PSR_RI_BIT 41
69#define IA64_PSR_ED_BIT 43
70#define IA64_PSR_BN_BIT 44
71#define IA64_PSR_IA_BIT 45
72
73/* A mask of PSR bits that we generally don't want to inherit across a clone2() or an
74 execve(). Only list flags here that need to be cleared/set for BOTH clone2() and
75 execve(). */
76#define IA64_PSR_BITS_TO_CLEAR (IA64_PSR_MFL | IA64_PSR_MFH | IA64_PSR_DB | IA64_PSR_LP | \
77 IA64_PSR_TB | IA64_PSR_ID | IA64_PSR_DA | IA64_PSR_DD | \
78 IA64_PSR_SS | IA64_PSR_ED | IA64_PSR_IA)
79#define IA64_PSR_BITS_TO_SET (IA64_PSR_DFH | IA64_PSR_SP)
80
81#define IA64_PSR_BE (__IA64_UL(1) << IA64_PSR_BE_BIT)
82#define IA64_PSR_UP (__IA64_UL(1) << IA64_PSR_UP_BIT)
83#define IA64_PSR_AC (__IA64_UL(1) << IA64_PSR_AC_BIT)
84#define IA64_PSR_MFL (__IA64_UL(1) << IA64_PSR_MFL_BIT)
85#define IA64_PSR_MFH (__IA64_UL(1) << IA64_PSR_MFH_BIT)
86#define IA64_PSR_IC (__IA64_UL(1) << IA64_PSR_IC_BIT)
87#define IA64_PSR_I (__IA64_UL(1) << IA64_PSR_I_BIT)
88#define IA64_PSR_PK (__IA64_UL(1) << IA64_PSR_PK_BIT)
89#define IA64_PSR_DT (__IA64_UL(1) << IA64_PSR_DT_BIT)
90#define IA64_PSR_DFL (__IA64_UL(1) << IA64_PSR_DFL_BIT)
91#define IA64_PSR_DFH (__IA64_UL(1) << IA64_PSR_DFH_BIT)
92#define IA64_PSR_SP (__IA64_UL(1) << IA64_PSR_SP_BIT)
93#define IA64_PSR_PP (__IA64_UL(1) << IA64_PSR_PP_BIT)
94#define IA64_PSR_DI (__IA64_UL(1) << IA64_PSR_DI_BIT)
95#define IA64_PSR_SI (__IA64_UL(1) << IA64_PSR_SI_BIT)
96#define IA64_PSR_DB (__IA64_UL(1) << IA64_PSR_DB_BIT)
97#define IA64_PSR_LP (__IA64_UL(1) << IA64_PSR_LP_BIT)
98#define IA64_PSR_TB (__IA64_UL(1) << IA64_PSR_TB_BIT)
99#define IA64_PSR_RT (__IA64_UL(1) << IA64_PSR_RT_BIT)
100/* The following are not affected by save_flags()/restore_flags(): */
101#define IA64_PSR_CPL (__IA64_UL(3) << IA64_PSR_CPL0_BIT)
102#define IA64_PSR_IS (__IA64_UL(1) << IA64_PSR_IS_BIT)
103#define IA64_PSR_MC (__IA64_UL(1) << IA64_PSR_MC_BIT)
104#define IA64_PSR_IT (__IA64_UL(1) << IA64_PSR_IT_BIT)
105#define IA64_PSR_ID (__IA64_UL(1) << IA64_PSR_ID_BIT)
106#define IA64_PSR_DA (__IA64_UL(1) << IA64_PSR_DA_BIT)
107#define IA64_PSR_DD (__IA64_UL(1) << IA64_PSR_DD_BIT)
108#define IA64_PSR_SS (__IA64_UL(1) << IA64_PSR_SS_BIT)
109#define IA64_PSR_RI (__IA64_UL(3) << IA64_PSR_RI_BIT)
110#define IA64_PSR_ED (__IA64_UL(1) << IA64_PSR_ED_BIT)
111#define IA64_PSR_BN (__IA64_UL(1) << IA64_PSR_BN_BIT)
112#define IA64_PSR_IA (__IA64_UL(1) << IA64_PSR_IA_BIT)
113
114/* User mask bits: */
115#define IA64_PSR_UM (IA64_PSR_BE | IA64_PSR_UP | IA64_PSR_AC | IA64_PSR_MFL | IA64_PSR_MFH)
116
117/* Default Control Register */
118#define IA64_DCR_PP_BIT 0 /* privileged performance monitor default */
119#define IA64_DCR_BE_BIT 1 /* big-endian default */
120#define IA64_DCR_LC_BIT 2 /* ia32 lock-check enable */
121#define IA64_DCR_DM_BIT 8 /* defer TLB miss faults */
122#define IA64_DCR_DP_BIT 9 /* defer page-not-present faults */
123#define IA64_DCR_DK_BIT 10 /* defer key miss faults */
124#define IA64_DCR_DX_BIT 11 /* defer key permission faults */
125#define IA64_DCR_DR_BIT 12 /* defer access right faults */
126#define IA64_DCR_DA_BIT 13 /* defer access bit faults */
127#define IA64_DCR_DD_BIT 14 /* defer debug faults */
128
129#define IA64_DCR_PP (__IA64_UL(1) << IA64_DCR_PP_BIT)
130#define IA64_DCR_BE (__IA64_UL(1) << IA64_DCR_BE_BIT)
131#define IA64_DCR_LC (__IA64_UL(1) << IA64_DCR_LC_BIT)
132#define IA64_DCR_DM (__IA64_UL(1) << IA64_DCR_DM_BIT)
133#define IA64_DCR_DP (__IA64_UL(1) << IA64_DCR_DP_BIT)
134#define IA64_DCR_DK (__IA64_UL(1) << IA64_DCR_DK_BIT)
135#define IA64_DCR_DX (__IA64_UL(1) << IA64_DCR_DX_BIT)
136#define IA64_DCR_DR (__IA64_UL(1) << IA64_DCR_DR_BIT)
137#define IA64_DCR_DA (__IA64_UL(1) << IA64_DCR_DA_BIT)
138#define IA64_DCR_DD (__IA64_UL(1) << IA64_DCR_DD_BIT)
139
140/* Interrupt Status Register */
141#define IA64_ISR_X_BIT 32 /* execute access */
142#define IA64_ISR_W_BIT 33 /* write access */
143#define IA64_ISR_R_BIT 34 /* read access */
144#define IA64_ISR_NA_BIT 35 /* non-access */
145#define IA64_ISR_SP_BIT 36 /* speculative load exception */
146#define IA64_ISR_RS_BIT 37 /* mandatory register-stack exception */
147#define IA64_ISR_IR_BIT 38 /* invalid register frame exception */
148#define IA64_ISR_CODE_MASK 0xf
149
150#define IA64_ISR_X (__IA64_UL(1) << IA64_ISR_X_BIT)
151#define IA64_ISR_W (__IA64_UL(1) << IA64_ISR_W_BIT)
152#define IA64_ISR_R (__IA64_UL(1) << IA64_ISR_R_BIT)
153#define IA64_ISR_NA (__IA64_UL(1) << IA64_ISR_NA_BIT)
154#define IA64_ISR_SP (__IA64_UL(1) << IA64_ISR_SP_BIT)
155#define IA64_ISR_RS (__IA64_UL(1) << IA64_ISR_RS_BIT)
156#define IA64_ISR_IR (__IA64_UL(1) << IA64_ISR_IR_BIT)
157
158/* ISR code field for non-access instructions */
159#define IA64_ISR_CODE_TPA 0
160#define IA64_ISR_CODE_FC 1
161#define IA64_ISR_CODE_PROBE 2
162#define IA64_ISR_CODE_TAK 3
163#define IA64_ISR_CODE_LFETCH 4
164#define IA64_ISR_CODE_PROBEF 5
165
166#endif /* _ASM_IA64_kREGS_H */
arch/ia64/include/asm/libata-portmap.h+0−9
@@ -1,9 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_IA64_LIBATA_PORTMAP_H
3#define __ASM_IA64_LIBATA_PORTMAP_H
4
5#define ATA_PRIMARY_IRQ(dev) isa_irq_to_vector(14)
6
7#define ATA_SECONDARY_IRQ(dev) isa_irq_to_vector(15)
8
9#endif
arch/ia64/include/asm/linkage.h+0−19
@@ -1,19 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ASM_LINKAGE_H
3#define __ASM_LINKAGE_H
4
5#ifndef __ASSEMBLY__
6
7#define asmlinkage CPP_ASMLINKAGE __attribute__((syscall_linkage))
8
9#else
10
11#include <asm/asmmacro.h>
12
13#endif
14
15#define cond_syscall(x) asm(".weak\t" #x "#\n" #x "#\t=\tsys_ni_syscall#")
16#define SYSCALL_ALIAS(alias, name) \
17 asm ( #alias "# = " #name "#\n\t.globl " #alias "#")
18
19#endif
arch/ia64/include/asm/local.h+0−1
@@ -1 +0,0 @@
1#include <asm-generic/local.h>
arch/ia64/include/asm/mca.h+0−185
@@ -1,185 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * File: mca.h
4 * Purpose: Machine check handling specific defines
5 *
6 * Copyright (C) 1999, 2004 Silicon Graphics, Inc.
7 * Copyright (C) Vijay Chander <vijay@engr.sgi.com>
8 * Copyright (C) Srinivasa Thirumalachar <sprasad@engr.sgi.com>
9 * Copyright (C) Russ Anderson <rja@sgi.com>
10 */
11
12#ifndef _ASM_IA64_MCA_H
13#define _ASM_IA64_MCA_H
14
15#if !defined(__ASSEMBLY__)
16
17#include <linux/percpu.h>
18#include <linux/threads.h>
19#include <linux/types.h>
20#include <asm/ptrace.h>
21
22#define IA64_MCA_RENDEZ_TIMEOUT (20 * 1000) /* value in milliseconds - 20 seconds */
23
24typedef struct ia64_fptr {
25 unsigned long fp;
26 unsigned long gp;
27} ia64_fptr_t;
28
29typedef union cmcv_reg_u {
30 u64 cmcv_regval;
31 struct {
32 u64 cmcr_vector : 8;
33 u64 cmcr_reserved1 : 4;
34 u64 cmcr_ignored1 : 1;
35 u64 cmcr_reserved2 : 3;
36 u64 cmcr_mask : 1;
37 u64 cmcr_ignored2 : 47;
38 } cmcv_reg_s;
39
40} cmcv_reg_t;
41
42#define cmcv_mask cmcv_reg_s.cmcr_mask
43#define cmcv_vector cmcv_reg_s.cmcr_vector
44
45enum {
46 IA64_MCA_RENDEZ_CHECKIN_NOTDONE = 0x0,
47 IA64_MCA_RENDEZ_CHECKIN_DONE = 0x1,
48 IA64_MCA_RENDEZ_CHECKIN_INIT = 0x2,
49 IA64_MCA_RENDEZ_CHECKIN_CONCURRENT_MCA = 0x3,
50};
51
52/* Information maintained by the MC infrastructure */
53typedef struct ia64_mc_info_s {
54 u64 imi_mca_handler;
55 size_t imi_mca_handler_size;
56 u64 imi_monarch_init_handler;
57 size_t imi_monarch_init_handler_size;
58 u64 imi_slave_init_handler;
59 size_t imi_slave_init_handler_size;
60 u8 imi_rendez_checkin[NR_CPUS];
61
62} ia64_mc_info_t;
63
64/* Handover state from SAL to OS and vice versa, for both MCA and INIT events.
65 * Besides the handover state, it also contains some saved registers from the
66 * time of the event.
67 * Note: mca_asm.S depends on the precise layout of this structure.
68 */
69
70struct ia64_sal_os_state {
71
72 /* SAL to OS */
73 unsigned long os_gp; /* GP of the os registered with the SAL, physical */
74 unsigned long pal_proc; /* PAL_PROC entry point, physical */
75 unsigned long sal_proc; /* SAL_PROC entry point, physical */
76 unsigned long rv_rc; /* MCA - Rendezvous state, INIT - reason code */
77 unsigned long proc_state_param; /* from R18 */
78 unsigned long monarch; /* 1 for a monarch event, 0 for a slave */
79
80 /* common */
81 unsigned long sal_ra; /* Return address in SAL, physical */
82 unsigned long sal_gp; /* GP of the SAL - physical */
83 struct pal_min_state_area *pal_min_state; /* from R17. physical in asm, virtual in C */
84 /* Previous values of IA64_KR(CURRENT) and IA64_KR(CURRENT_STACK).
85 * Note: if the MCA/INIT recovery code wants to resume to a new context
86 * then it must change these values to reflect the new kernel stack.
87 */
88 unsigned long prev_IA64_KR_CURRENT; /* previous value of IA64_KR(CURRENT) */
89 unsigned long prev_IA64_KR_CURRENT_STACK;
90 struct task_struct *prev_task; /* previous task, NULL if it is not useful */
91 /* Some interrupt registers are not saved in minstate, pt_regs or
92 * switch_stack. Because MCA/INIT can occur when interrupts are
93 * disabled, we need to save the additional interrupt registers over
94 * MCA/INIT and resume.
95 */
96 unsigned long isr;
97 unsigned long ifa;
98 unsigned long itir;
99 unsigned long iipa;
100 unsigned long iim;
101 unsigned long iha;
102
103 /* OS to SAL */
104 unsigned long os_status; /* OS status to SAL, enum below */
105 unsigned long context; /* 0 if return to same context
106 1 if return to new context */
107
108 /* I-resources */
109 unsigned long iip;
110 unsigned long ipsr;
111 unsigned long ifs;
112};
113
114enum {
115 IA64_MCA_CORRECTED = 0x0, /* Error has been corrected by OS_MCA */
116 IA64_MCA_WARM_BOOT = -1, /* Warm boot of the system need from SAL */
117 IA64_MCA_COLD_BOOT = -2, /* Cold boot of the system need from SAL */
118 IA64_MCA_HALT = -3 /* System to be halted by SAL */
119};
120
121enum {
122 IA64_INIT_RESUME = 0x0, /* Resume after return from INIT */
123 IA64_INIT_WARM_BOOT = -1, /* Warm boot of the system need from SAL */
124};
125
126enum {
127 IA64_MCA_SAME_CONTEXT = 0x0, /* SAL to return to same context */
128 IA64_MCA_NEW_CONTEXT = -1 /* SAL to return to new context */
129};
130
131/* Per-CPU MCA state that is too big for normal per-CPU variables. */
132
133struct ia64_mca_cpu {
134 u64 mca_stack[KERNEL_STACK_SIZE/8];
135 u64 init_stack[KERNEL_STACK_SIZE/8];
136};
137
138/* Array of physical addresses of each CPU's MCA area. */
139extern unsigned long __per_cpu_mca[NR_CPUS];
140
141extern int cpe_vector;
142extern int ia64_cpe_irq;
143extern void ia64_mca_init(void);
144extern void ia64_mca_irq_init(void);
145extern void ia64_mca_cpu_init(void *);
146extern void ia64_os_mca_dispatch(void);
147extern void ia64_os_mca_dispatch_end(void);
148extern void ia64_mca_ucmc_handler(struct pt_regs *, struct ia64_sal_os_state *);
149extern void ia64_init_handler(struct pt_regs *,
150 struct switch_stack *,
151 struct ia64_sal_os_state *);
152extern void ia64_os_init_on_kdump(void);
153extern void ia64_monarch_init_handler(void);
154extern void ia64_slave_init_handler(void);
155extern void ia64_mca_cmc_vector_setup(void);
156extern int ia64_reg_MCA_extension(int (*fn)(void *, struct ia64_sal_os_state *));
157extern void ia64_unreg_MCA_extension(void);
158extern unsigned long ia64_get_rnat(unsigned long *);
159extern void ia64_set_psr_mc(void);
160extern void ia64_mca_printk(const char * fmt, ...)
161 __attribute__ ((format (printf, 1, 2)));
162
163struct ia64_mca_notify_die {
164 struct ia64_sal_os_state *sos;
165 int *monarch_cpu;
166 int *data;
167};
168
169DECLARE_PER_CPU(u64, ia64_mca_pal_base);
170
171#else /* __ASSEMBLY__ */
172
173#define IA64_MCA_CORRECTED 0x0 /* Error has been corrected by OS_MCA */
174#define IA64_MCA_WARM_BOOT -1 /* Warm boot of the system need from SAL */
175#define IA64_MCA_COLD_BOOT -2 /* Cold boot of the system need from SAL */
176#define IA64_MCA_HALT -3 /* System to be halted by SAL */
177
178#define IA64_INIT_RESUME 0x0 /* Resume after return from INIT */
179#define IA64_INIT_WARM_BOOT -1 /* Warm boot of the system need from SAL */
180
181#define IA64_MCA_SAME_CONTEXT 0x0 /* SAL to return to same context */
182#define IA64_MCA_NEW_CONTEXT -1 /* SAL to return to new context */
183
184#endif /* !__ASSEMBLY__ */
185#endif /* _ASM_IA64_MCA_H */
arch/ia64/include/asm/mca_asm.h+0−245
@@ -1,245 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * File: mca_asm.h
4 * Purpose: Machine check handling specific defines
5 *
6 * Copyright (C) 1999 Silicon Graphics, Inc.
7 * Copyright (C) Vijay Chander <vijay@engr.sgi.com>
8 * Copyright (C) Srinivasa Thirumalachar <sprasad@engr.sgi.com>
9 * Copyright (C) 2000 Hewlett-Packard Co.
10 * Copyright (C) 2000 David Mosberger-Tang <davidm@hpl.hp.com>
11 * Copyright (C) 2002 Intel Corp.
12 * Copyright (C) 2002 Jenna Hall <jenna.s.hall@intel.com>
13 * Copyright (C) 2005 Silicon Graphics, Inc
14 * Copyright (C) 2005 Keith Owens <kaos@sgi.com>
15 */
16#ifndef _ASM_IA64_MCA_ASM_H
17#define _ASM_IA64_MCA_ASM_H
18
19#include <asm/percpu.h>
20
21#define PSR_IC 13
22#define PSR_I 14
23#define PSR_DT 17
24#define PSR_RT 27
25#define PSR_MC 35
26#define PSR_IT 36
27#define PSR_BN 44
28
29/*
30 * This macro converts a instruction virtual address to a physical address
31 * Right now for simulation purposes the virtual addresses are
32 * direct mapped to physical addresses.
33 * 1. Lop off bits 61 thru 63 in the virtual address
34 */
35#define INST_VA_TO_PA(addr) \
36 dep addr = 0, addr, 61, 3
37/*
38 * This macro converts a data virtual address to a physical address
39 * Right now for simulation purposes the virtual addresses are
40 * direct mapped to physical addresses.
41 * 1. Lop off bits 61 thru 63 in the virtual address
42 */
43#define DATA_VA_TO_PA(addr) \
44 tpa addr = addr
45/*
46 * This macro converts a data physical address to a virtual address
47 * Right now for simulation purposes the virtual addresses are
48 * direct mapped to physical addresses.
49 * 1. Put 0x7 in bits 61 thru 63.
50 */
51#define DATA_PA_TO_VA(addr,temp) \
52 mov temp = 0x7 ;; \
53 dep addr = temp, addr, 61, 3
54
55#define GET_THIS_PADDR(reg, var) \
56 mov reg = IA64_KR(PER_CPU_DATA);; \
57 addl reg = THIS_CPU(var), reg
58
59/*
60 * This macro jumps to the instruction at the given virtual address
61 * and starts execution in physical mode with all the address
62 * translations turned off.
63 * 1. Save the current psr
64 * 2. Make sure that all the upper 32 bits are off
65 *
66 * 3. Clear the interrupt enable and interrupt state collection bits
67 * in the psr before updating the ipsr and iip.
68 *
69 * 4. Turn off the instruction, data and rse translation bits of the psr
70 * and store the new value into ipsr
71 * Also make sure that the interrupts are disabled.
72 * Ensure that we are in little endian mode.
73 * [psr.{rt, it, dt, i, be} = 0]
74 *
75 * 5. Get the physical address corresponding to the virtual address
76 * of the next instruction bundle and put it in iip.
77 * (Using magic numbers 24 and 40 in the deposint instruction since
78 * the IA64_SDK code directly maps to lower 24bits as physical address
79 * from a virtual address).
80 *
81 * 6. Do an rfi to move the values from ipsr to psr and iip to ip.
82 */
83#define PHYSICAL_MODE_ENTER(temp1, temp2, start_addr, old_psr) \
84 mov old_psr = psr; \
85 ;; \
86 dep old_psr = 0, old_psr, 32, 32; \
87 \
88 mov ar.rsc = 0 ; \
89 ;; \
90 srlz.d; \
91 mov temp2 = ar.bspstore; \
92 ;; \
93 DATA_VA_TO_PA(temp2); \
94 ;; \
95 mov temp1 = ar.rnat; \
96 ;; \
97 mov ar.bspstore = temp2; \
98 ;; \
99 mov ar.rnat = temp1; \
100 mov temp1 = psr; \
101 mov temp2 = psr; \
102 ;; \
103 \
104 dep temp2 = 0, temp2, PSR_IC, 2; \
105 ;; \
106 mov psr.l = temp2; \
107 ;; \
108 srlz.d; \
109 dep temp1 = 0, temp1, 32, 32; \
110 ;; \
111 dep temp1 = 0, temp1, PSR_IT, 1; \
112 ;; \
113 dep temp1 = 0, temp1, PSR_DT, 1; \
114 ;; \
115 dep temp1 = 0, temp1, PSR_RT, 1; \
116 ;; \
117 dep temp1 = 0, temp1, PSR_I, 1; \
118 ;; \
119 dep temp1 = 0, temp1, PSR_IC, 1; \
120 ;; \
121 dep temp1 = -1, temp1, PSR_MC, 1; \
122 ;; \
123 mov cr.ipsr = temp1; \
124 ;; \
125 LOAD_PHYSICAL(p0, temp2, start_addr); \
126 ;; \
127 mov cr.iip = temp2; \
128 mov cr.ifs = r0; \
129 DATA_VA_TO_PA(sp); \
130 DATA_VA_TO_PA(gp); \
131 ;; \
132 srlz.i; \
133 ;; \
134 nop 1; \
135 nop 2; \
136 nop 1; \
137 nop 2; \
138 rfi; \
139 ;;
140
141/*
142 * This macro jumps to the instruction at the given virtual address
143 * and starts execution in virtual mode with all the address
144 * translations turned on.
145 * 1. Get the old saved psr
146 *
147 * 2. Clear the interrupt state collection bit in the current psr.
148 *
149 * 3. Set the instruction translation bit back in the old psr
150 * Note we have to do this since we are right now saving only the
151 * lower 32-bits of old psr.(Also the old psr has the data and
152 * rse translation bits on)
153 *
154 * 4. Set ipsr to this old_psr with "it" bit set and "bn" = 1.
155 *
156 * 5. Reset the current thread pointer (r13).
157 *
158 * 6. Set iip to the virtual address of the next instruction bundle.
159 *
160 * 7. Do an rfi to move ipsr to psr and iip to ip.
161 */
162
163#define VIRTUAL_MODE_ENTER(temp1, temp2, start_addr, old_psr) \
164 mov temp2 = psr; \
165 ;; \
166 mov old_psr = temp2; \
167 ;; \
168 dep temp2 = 0, temp2, PSR_IC, 2; \
169 ;; \
170 mov psr.l = temp2; \
171 mov ar.rsc = 0; \
172 ;; \
173 srlz.d; \
174 mov r13 = ar.k6; \
175 mov temp2 = ar.bspstore; \
176 ;; \
177 DATA_PA_TO_VA(temp2,temp1); \
178 ;; \
179 mov temp1 = ar.rnat; \
180 ;; \
181 mov ar.bspstore = temp2; \
182 ;; \
183 mov ar.rnat = temp1; \
184 ;; \
185 mov temp1 = old_psr; \
186 ;; \
187 mov temp2 = 1; \
188 ;; \
189 dep temp1 = temp2, temp1, PSR_IC, 1; \
190 ;; \
191 dep temp1 = temp2, temp1, PSR_IT, 1; \
192 ;; \
193 dep temp1 = temp2, temp1, PSR_DT, 1; \
194 ;; \
195 dep temp1 = temp2, temp1, PSR_RT, 1; \
196 ;; \
197 dep temp1 = temp2, temp1, PSR_BN, 1; \
198 ;; \
199 \
200 mov cr.ipsr = temp1; \
201 movl temp2 = start_addr; \
202 ;; \
203 mov cr.iip = temp2; \
204 movl gp = __gp \
205 ;; \
206 DATA_PA_TO_VA(sp, temp1); \
207 srlz.i; \
208 ;; \
209 nop 1; \
210 nop 2; \
211 nop 1; \
212 rfi \
213 ;;
214
215/*
216 * The MCA and INIT stacks in struct ia64_mca_cpu look like normal kernel
217 * stacks, except that the SAL/OS state and a switch_stack are stored near the
218 * top of the MCA/INIT stack. To support concurrent entry to MCA or INIT, as
219 * well as MCA over INIT, each event needs its own SAL/OS state. All entries
220 * are 16 byte aligned.
221 *
222 * +---------------------------+
223 * | pt_regs |
224 * +---------------------------+
225 * | switch_stack |
226 * +---------------------------+
227 * | SAL/OS state |
228 * +---------------------------+
229 * | 16 byte scratch area |
230 * +---------------------------+ <-------- SP at start of C MCA handler
231 * | ..... |
232 * +---------------------------+
233 * | RBS for MCA/INIT handler |
234 * +---------------------------+
235 * | struct task for MCA/INIT |
236 * +---------------------------+ <-------- Bottom of MCA/INIT stack
237 */
238
239#define ALIGN16(x) ((x)&~15)
240#define MCA_PT_REGS_OFFSET ALIGN16(KERNEL_STACK_SIZE-IA64_PT_REGS_SIZE)
241#define MCA_SWITCH_STACK_OFFSET ALIGN16(MCA_PT_REGS_OFFSET-IA64_SWITCH_STACK_SIZE)
242#define MCA_SOS_OFFSET ALIGN16(MCA_SWITCH_STACK_OFFSET-IA64_SAL_OS_STATE_SIZE)
243#define MCA_SP_OFFSET ALIGN16(MCA_SOS_OFFSET-16)
244
245#endif /* _ASM_IA64_MCA_ASM_H */
arch/ia64/include/asm/meminit.h+0−59
@@ -1,59 +0,0 @@
1#ifndef meminit_h
2#define meminit_h
3
4/*
5 * This file is subject to the terms and conditions of the GNU General Public
6 * License. See the file "COPYING" in the main directory of this archive
7 * for more details.
8 */
9
10
11/*
12 * Entries defined so far:
13 * - boot param structure itself
14 * - memory map
15 * - initrd (optional)
16 * - command line string
17 * - kernel code & data
18 * - crash dumping code reserved region
19 * - Kernel memory map built from EFI memory map
20 * - ELF core header
21 *
22 * More could be added if necessary
23 */
24#define IA64_MAX_RSVD_REGIONS 9
25
26struct rsvd_region {
27 u64 start; /* virtual address of beginning of element */
28 u64 end; /* virtual address of end of element + 1 */
29};
30
31extern struct rsvd_region rsvd_region[IA64_MAX_RSVD_REGIONS + 1];
32
33extern void find_memory (void);
34extern void reserve_memory (void);
35extern void find_initrd (void);
36extern int filter_rsvd_memory (u64 start, u64 end, void *arg);
37extern int filter_memory (u64 start, u64 end, void *arg);
38extern unsigned long efi_memmap_init(u64 *s, u64 *e);
39extern int find_max_min_low_pfn (u64, u64, void *);
40
41extern unsigned long vmcore_find_descriptor_size(unsigned long address);
42
43/*
44 * For rounding an address to the next IA64_GRANULE_SIZE or order
45 */
46#define GRANULEROUNDDOWN(n) ((n) & ~(IA64_GRANULE_SIZE-1))
47#define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1))
48
49#ifdef CONFIG_NUMA
50 extern void call_pernode_memory (unsigned long start, unsigned long len, void *func);
51#else
52# define call_pernode_memory(start, len, func) (*func)(start, len, 0)
53#endif
54
55#define IGNORE_PFN0 1 /* XXX fix me: ignore pfn 0 until TLB miss handler is updated... */
56
57extern int register_active_ranges(u64 start, u64 len, int nid);
58
59#endif /* meminit_h */
arch/ia64/include/asm/mman.h+0−18
@@ -1,18 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Based on <asm-i386/mman.h>.
4 *
5 * Modified 1998-2000, 2002
6 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
7 */
8#ifndef _ASM_IA64_MMAN_H
9#define _ASM_IA64_MMAN_H
10
11#include <uapi/asm/mman.h>
12
13#ifndef __ASSEMBLY__
14#define arch_mmap_check ia64_mmap_check
15int ia64_mmap_check(unsigned long addr, unsigned long len,
16 unsigned long flags);
17#endif
18#endif /* _ASM_IA64_MMAN_H */
arch/ia64/include/asm/mmiowb.h+0−17
@@ -1,17 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#ifndef _ASM_IA64_MMIOWB_H
4#define _ASM_IA64_MMIOWB_H
5
6/**
7 * mmiowb - I/O write barrier
8 *
9 * Ensure ordering of I/O space writes. This will make sure that writes
10 * following the barrier will arrive after all previous writes. For most
11 * ia64 platforms, this is a simple 'mf.a' instruction.
12 */
13#define mmiowb() ia64_mfa()
14
15#include <asm-generic/mmiowb.h>
16
17#endif /* _ASM_IA64_MMIOWB_H */
arch/ia64/include/asm/mmu.h+0−14
@@ -1,14 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __MMU_H
3#define __MMU_H
4
5/*
6 * Type for a context number. We declare it volatile to ensure proper
7 * ordering when it's accessed outside of spinlock'd critical sections
8 * (e.g., as done in activate_mm() and init_new_context()).
9 */
10typedef volatile unsigned long mm_context_t;
11
12typedef unsigned long nv_mm_context_t;
13
14#endif
arch/ia64/include/asm/mmu_context.h+0−194
@@ -1,194 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_MMU_CONTEXT_H
3#define _ASM_IA64_MMU_CONTEXT_H
4
5/*
6 * Copyright (C) 1998-2002 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10/*
11 * Routines to manage the allocation of task context numbers. Task context
12 * numbers are used to reduce or eliminate the need to perform TLB flushes
13 * due to context switches. Context numbers are implemented using ia-64
14 * region ids. Since the IA-64 TLB does not consider the region number when
15 * performing a TLB lookup, we need to assign a unique region id to each
16 * region in a process. We use the least significant three bits in aregion
17 * id for this purpose.
18 */
19
20#define IA64_REGION_ID_KERNEL 0 /* the kernel's region id (tlb.c depends on this being 0) */
21
22#define ia64_rid(ctx,addr) (((ctx) << 3) | (addr >> 61))
23
24# include <asm/page.h>
25# ifndef __ASSEMBLY__
26
27#include <linux/compiler.h>
28#include <linux/percpu.h>
29#include <linux/sched.h>
30#include <linux/mm_types.h>
31#include <linux/spinlock.h>
32
33#include <asm/processor.h>
34#include <asm-generic/mm_hooks.h>
35
36struct ia64_ctx {
37 spinlock_t lock;
38 unsigned int next; /* next context number to use */
39 unsigned int limit; /* available free range */
40 unsigned int max_ctx; /* max. context value supported by all CPUs */
41 /* call wrap_mmu_context when next >= max */
42 unsigned long *bitmap; /* bitmap size is max_ctx+1 */
43 unsigned long *flushmap;/* pending rid to be flushed */
44};
45
46extern struct ia64_ctx ia64_ctx;
47DECLARE_PER_CPU(u8, ia64_need_tlb_flush);
48
49extern void mmu_context_init (void);
50extern void wrap_mmu_context (struct mm_struct *mm);
51
52/*
53 * When the context counter wraps around all TLBs need to be flushed because
54 * an old context number might have been reused. This is signalled by the
55 * ia64_need_tlb_flush per-CPU variable, which is checked in the routine
56 * below. Called by activate_mm(). <efocht@ess.nec.de>
57 */
58static inline void
59delayed_tlb_flush (void)
60{
61 extern void local_flush_tlb_all (void);
62 unsigned long flags;
63
64 if (unlikely(__ia64_per_cpu_var(ia64_need_tlb_flush))) {
65 spin_lock_irqsave(&ia64_ctx.lock, flags);
66 if (__ia64_per_cpu_var(ia64_need_tlb_flush)) {
67 local_flush_tlb_all();
68 __ia64_per_cpu_var(ia64_need_tlb_flush) = 0;
69 }
70 spin_unlock_irqrestore(&ia64_ctx.lock, flags);
71 }
72}
73
74static inline nv_mm_context_t
75get_mmu_context (struct mm_struct *mm)
76{
77 unsigned long flags;
78 nv_mm_context_t context = mm->context;
79
80 if (likely(context))
81 goto out;
82
83 spin_lock_irqsave(&ia64_ctx.lock, flags);
84 /* re-check, now that we've got the lock: */
85 context = mm->context;
86 if (context == 0) {
87 cpumask_clear(mm_cpumask(mm));
88 if (ia64_ctx.next >= ia64_ctx.limit) {
89 ia64_ctx.next = find_next_zero_bit(ia64_ctx.bitmap,
90 ia64_ctx.max_ctx, ia64_ctx.next);
91 ia64_ctx.limit = find_next_bit(ia64_ctx.bitmap,
92 ia64_ctx.max_ctx, ia64_ctx.next);
93 if (ia64_ctx.next >= ia64_ctx.max_ctx)
94 wrap_mmu_context(mm);
95 }
96 mm->context = context = ia64_ctx.next++;
97 __set_bit(context, ia64_ctx.bitmap);
98 }
99 spin_unlock_irqrestore(&ia64_ctx.lock, flags);
100out:
101 /*
102 * Ensure we're not starting to use "context" before any old
103 * uses of it are gone from our TLB.
104 */
105 delayed_tlb_flush();
106
107 return context;
108}
109
110/*
111 * Initialize context number to some sane value. MM is guaranteed to be a
112 * brand-new address-space, so no TLB flushing is needed, ever.
113 */
114#define init_new_context init_new_context
115static inline int
116init_new_context (struct task_struct *p, struct mm_struct *mm)
117{
118 mm->context = 0;
119 return 0;
120}
121
122static inline void
123reload_context (nv_mm_context_t context)
124{
125 unsigned long rid;
126 unsigned long rid_incr = 0;
127 unsigned long rr0, rr1, rr2, rr3, rr4;
128
129#ifdef CONFIG_HUGETLB_PAGE
130 unsigned long old_rr4;
131 old_rr4 = ia64_get_rr(RGN_BASE(RGN_HPAGE));
132#endif
133 rid = context << 3; /* make space for encoding the region number */
134 rid_incr = 1 << 8;
135
136 /* encode the region id, preferred page size, and VHPT enable bit: */
137 rr0 = (rid << 8) | (PAGE_SHIFT << 2) | 1;
138 rr1 = rr0 + 1*rid_incr;
139 rr2 = rr0 + 2*rid_incr;
140 rr3 = rr0 + 3*rid_incr;
141 rr4 = rr0 + 4*rid_incr;
142#ifdef CONFIG_HUGETLB_PAGE
143 rr4 = (rr4 & (~(0xfcUL))) | (old_rr4 & 0xfc);
144
145# if RGN_HPAGE != 4
146# error "reload_context assumes RGN_HPAGE is 4"
147# endif
148#endif
149
150 ia64_set_rr0_to_rr4(rr0, rr1, rr2, rr3, rr4);
151 ia64_srlz_i(); /* srlz.i implies srlz.d */
152}
153
154/*
155 * Must be called with preemption off
156 */
157static inline void
158activate_context (struct mm_struct *mm)
159{
160 nv_mm_context_t context;
161
162 do {
163 context = get_mmu_context(mm);
164 if (!cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)))
165 cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
166 reload_context(context);
167 /*
168 * in the unlikely event of a TLB-flush by another thread,
169 * redo the load.
170 */
171 } while (unlikely(context != mm->context));
172}
173
174/*
175 * Switch from address space PREV to address space NEXT.
176 */
177#define activate_mm activate_mm
178static inline void
179activate_mm (struct mm_struct *prev, struct mm_struct *next)
180{
181 /*
182 * We may get interrupts here, but that's OK because interrupt
183 * handlers cannot touch user-space.
184 */
185 ia64_set_kr(IA64_KR_PT_BASE, __pa(next->pgd));
186 activate_context(next);
187}
188
189#define switch_mm(prev_mm,next_mm,next_task) activate_mm(prev_mm, next_mm)
190
191#include <asm-generic/mmu_context.h>
192
193# endif /* ! __ASSEMBLY__ */
194#endif /* _ASM_IA64_MMU_CONTEXT_H */
arch/ia64/include/asm/mmzone.h+0−35
@@ -1,35 +0,0 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (c) 2000,2003 Silicon Graphics, Inc. All rights reserved.
7 * Copyright (c) 2002 NEC Corp.
8 * Copyright (c) 2002 Erich Focht <efocht@ess.nec.de>
9 * Copyright (c) 2002 Kimio Suganuma <k-suganuma@da.jp.nec.com>
10 */
11#ifndef _ASM_IA64_MMZONE_H
12#define _ASM_IA64_MMZONE_H
13
14#include <linux/numa.h>
15#include <asm/page.h>
16#include <asm/meminit.h>
17
18#ifdef CONFIG_NUMA
19
20static inline int pfn_to_nid(unsigned long pfn)
21{
22 extern int paddr_to_nid(unsigned long);
23 int nid = paddr_to_nid(pfn << PAGE_SHIFT);
24 if (nid < 0)
25 return 0;
26 else
27 return nid;
28}
29
30#define MAX_PHYSNODE_ID 2048
31#endif /* CONFIG_NUMA */
32
33#define NR_NODE_MEMBLKS (MAX_NUMNODES * 4)
34
35#endif /* _ASM_IA64_MMZONE_H */
arch/ia64/include/asm/module.h+0−35
@@ -1,35 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_MODULE_H
3#define _ASM_IA64_MODULE_H
4
5#include <asm-generic/module.h>
6
7/*
8 * IA-64-specific support for kernel module loader.
9 *
10 * Copyright (C) 2003 Hewlett-Packard Co
11 * David Mosberger-Tang <davidm@hpl.hp.com>
12 */
13
14struct elf64_shdr; /* forward declration */
15
16struct mod_arch_specific {
17 /* Used only at module load time. */
18 struct elf64_shdr *core_plt; /* core PLT section */
19 struct elf64_shdr *init_plt; /* init PLT section */
20 struct elf64_shdr *got; /* global offset table */
21 struct elf64_shdr *opd; /* official procedure descriptors */
22 struct elf64_shdr *unwind; /* unwind-table section */
23 unsigned long gp; /* global-pointer for module */
24 unsigned int next_got_entry; /* index of next available got entry */
25
26 /* Used at module run and cleanup time. */
27 void *core_unw_table; /* core unwind-table cookie returned by unwinder */
28 void *init_unw_table; /* init unwind-table cookie returned by unwinder */
29 void *opd_addr; /* symbolize uses .opd to get to actual function */
30 unsigned long opd_size;
31};
32
33#define ARCH_SHF_SMALL SHF_IA_64_SHORT
34
35#endif /* _ASM_IA64_MODULE_H */
arch/ia64/include/asm/module.lds.h+0−14
@@ -1,14 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2SECTIONS {
3 /* Group unwind sections into a single section: */
4 .IA_64.unwind_info : { *(.IA_64.unwind_info*) }
5 .IA_64.unwind : { *(.IA_64.unwind*) }
6 /*
7 * Create place-holder sections to hold the PLTs, GOT, and
8 * official procedure-descriptors (.opd).
9 */
10 .core.plt : { BYTE(0) }
11 .init.plt : { BYTE(0) }
12 .got : { BYTE(0) }
13 .opd : { BYTE(0) }
14}
arch/ia64/include/asm/msidef.h+0−43
@@ -1,43 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _IA64_MSI_DEF_H
3#define _IA64_MSI_DEF_H
4
5/*
6 * Shifts for APIC-based data
7 */
8
9#define MSI_DATA_VECTOR_SHIFT 0
10#define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT)
11#define MSI_DATA_VECTOR_MASK 0xffffff00
12
13#define MSI_DATA_DELIVERY_MODE_SHIFT 8
14#define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_MODE_SHIFT)
15#define MSI_DATA_DELIVERY_LOWPRI (1 << MSI_DATA_DELIVERY_MODE_SHIFT)
16
17#define MSI_DATA_LEVEL_SHIFT 14
18#define MSI_DATA_LEVEL_DEASSERT (0 << MSI_DATA_LEVEL_SHIFT)
19#define MSI_DATA_LEVEL_ASSERT (1 << MSI_DATA_LEVEL_SHIFT)
20
21#define MSI_DATA_TRIGGER_SHIFT 15
22#define MSI_DATA_TRIGGER_EDGE (0 << MSI_DATA_TRIGGER_SHIFT)
23#define MSI_DATA_TRIGGER_LEVEL (1 << MSI_DATA_TRIGGER_SHIFT)
24
25/*
26 * Shift/mask fields for APIC-based bus address
27 */
28
29#define MSI_ADDR_DEST_ID_SHIFT 4
30#define MSI_ADDR_HEADER 0xfee00000
31
32#define MSI_ADDR_DEST_ID_MASK 0xfff0000f
33#define MSI_ADDR_DEST_ID_CPU(cpu) ((cpu) << MSI_ADDR_DEST_ID_SHIFT)
34
35#define MSI_ADDR_DEST_MODE_SHIFT 2
36#define MSI_ADDR_DEST_MODE_PHYS (0 << MSI_ADDR_DEST_MODE_SHIFT)
37#define MSI_ADDR_DEST_MODE_LOGIC (1 << MSI_ADDR_DEST_MODE_SHIFT)
38
39#define MSI_ADDR_REDIRECTION_SHIFT 3
40#define MSI_ADDR_REDIRECTION_CPU (0 << MSI_ADDR_REDIRECTION_SHIFT)
41#define MSI_ADDR_REDIRECTION_LOWPRI (1 << MSI_ADDR_REDIRECTION_SHIFT)
42
43#endif/* _IA64_MSI_DEF_H */
arch/ia64/include/asm/native/inst.h+0−119
@@ -1,119 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/******************************************************************************
3 * arch/ia64/include/asm/native/inst.h
4 *
5 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
6 * VA Linux Systems Japan K.K.
7 */
8
9#define DO_SAVE_MIN IA64_NATIVE_DO_SAVE_MIN
10
11#define MOV_FROM_IFA(reg) \
12 mov reg = cr.ifa
13
14#define MOV_FROM_ITIR(reg) \
15 mov reg = cr.itir
16
17#define MOV_FROM_ISR(reg) \
18 mov reg = cr.isr
19
20#define MOV_FROM_IHA(reg) \
21 mov reg = cr.iha
22
23#define MOV_FROM_IPSR(pred, reg) \
24(pred) mov reg = cr.ipsr
25
26#define MOV_FROM_IIM(reg) \
27 mov reg = cr.iim
28
29#define MOV_FROM_IIP(reg) \
30 mov reg = cr.iip
31
32#define MOV_FROM_IVR(reg, clob) \
33 mov reg = cr.ivr
34
35#define MOV_FROM_PSR(pred, reg, clob) \
36(pred) mov reg = psr
37
38#define MOV_FROM_ITC(pred, pred_clob, reg, clob) \
39(pred) mov reg = ar.itc
40
41#define MOV_TO_IFA(reg, clob) \
42 mov cr.ifa = reg
43
44#define MOV_TO_ITIR(pred, reg, clob) \
45(pred) mov cr.itir = reg
46
47#define MOV_TO_IHA(pred, reg, clob) \
48(pred) mov cr.iha = reg
49
50#define MOV_TO_IPSR(pred, reg, clob) \
51(pred) mov cr.ipsr = reg
52
53#define MOV_TO_IFS(pred, reg, clob) \
54(pred) mov cr.ifs = reg
55
56#define MOV_TO_IIP(reg, clob) \
57 mov cr.iip = reg
58
59#define MOV_TO_KR(kr, reg, clob0, clob1) \
60 mov IA64_KR(kr) = reg
61
62#define ITC_I(pred, reg, clob) \
63(pred) itc.i reg
64
65#define ITC_D(pred, reg, clob) \
66(pred) itc.d reg
67
68#define ITC_I_AND_D(pred_i, pred_d, reg, clob) \
69(pred_i) itc.i reg; \
70(pred_d) itc.d reg
71
72#define THASH(pred, reg0, reg1, clob) \
73(pred) thash reg0 = reg1
74
75#define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \
76 ssm psr.ic | PSR_DEFAULT_BITS \
77 ;; \
78 srlz.i /* guarantee that interruption collectin is on */ \
79 ;;
80
81#define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \
82 ssm psr.ic \
83 ;; \
84 srlz.d
85
86#define RSM_PSR_IC(clob) \
87 rsm psr.ic
88
89#define SSM_PSR_I(pred, pred_clob, clob) \
90(pred) ssm psr.i
91
92#define RSM_PSR_I(pred, clob0, clob1) \
93(pred) rsm psr.i
94
95#define RSM_PSR_I_IC(clob0, clob1, clob2) \
96 rsm psr.i | psr.ic
97
98#define RSM_PSR_DT \
99 rsm psr.dt
100
101#define RSM_PSR_BE_I(clob0, clob1) \
102 rsm psr.be | psr.i
103
104#define SSM_PSR_DT_AND_SRLZ_I \
105 ssm psr.dt \
106 ;; \
107 srlz.i
108
109#define BSW_0(clob0, clob1, clob2) \
110 bsw.0
111
112#define BSW_1(clob0, clob1) \
113 bsw.1
114
115#define COVER \
116 cover
117
118#define RFI \
119 rfi
arch/ia64/include/asm/native/irq.h+0−20
@@ -1,20 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/******************************************************************************
3 * arch/ia64/include/asm/native/irq.h
4 *
5 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
6 * VA Linux Systems Japan K.K.
7 */
8
9#ifndef _ASM_IA64_NATIVE_IRQ_H
10#define _ASM_IA64_NATIVE_IRQ_H
11
12#define NR_VECTORS 256
13
14#if (NR_VECTORS + 32 * NR_CPUS) < 1024
15#define IA64_NATIVE_NR_IRQS (NR_VECTORS + 32 * NR_CPUS)
16#else
17#define IA64_NATIVE_NR_IRQS 1024
18#endif
19
20#endif /* _ASM_IA64_NATIVE_IRQ_H */
arch/ia64/include/asm/native/patchlist.h+0−24
@@ -1,24 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/******************************************************************************
3 * arch/ia64/include/asm/native/inst.h
4 *
5 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
6 * VA Linux Systems Japan K.K.
7 */
8
9#define __paravirt_start_gate_fsyscall_patchlist \
10 __ia64_native_start_gate_fsyscall_patchlist
11#define __paravirt_end_gate_fsyscall_patchlist \
12 __ia64_native_end_gate_fsyscall_patchlist
13#define __paravirt_start_gate_brl_fsys_bubble_down_patchlist \
14 __ia64_native_start_gate_brl_fsys_bubble_down_patchlist
15#define __paravirt_end_gate_brl_fsys_bubble_down_patchlist \
16 __ia64_native_end_gate_brl_fsys_bubble_down_patchlist
17#define __paravirt_start_gate_vtop_patchlist \
18 __ia64_native_start_gate_vtop_patchlist
19#define __paravirt_end_gate_vtop_patchlist \
20 __ia64_native_end_gate_vtop_patchlist
21#define __paravirt_start_gate_mckinley_e9_patchlist \
22 __ia64_native_start_gate_mckinley_e9_patchlist
23#define __paravirt_end_gate_mckinley_e9_patchlist \
24 __ia64_native_end_gate_mckinley_e9_patchlist
arch/ia64/include/asm/nodedata.h+0−63
@@ -1,63 +0,0 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (c) 2000 Silicon Graphics, Inc. All rights reserved.
7 * Copyright (c) 2002 NEC Corp.
8 * Copyright (c) 2002 Erich Focht <efocht@ess.nec.de>
9 * Copyright (c) 2002 Kimio Suganuma <k-suganuma@da.jp.nec.com>
10 */
11#ifndef _ASM_IA64_NODEDATA_H
12#define _ASM_IA64_NODEDATA_H
13
14#include <linux/numa.h>
15
16#include <asm/percpu.h>
17#include <asm/mmzone.h>
18
19#ifdef CONFIG_NUMA
20
21/*
22 * Node Data. One of these structures is located on each node of a NUMA system.
23 */
24
25struct pglist_data;
26struct ia64_node_data {
27 short active_cpu_count;
28 short node;
29 struct pglist_data *pg_data_ptrs[MAX_NUMNODES];
30};
31
32
33/*
34 * Return a pointer to the node_data structure for the executing cpu.
35 */
36#define local_node_data (local_cpu_data->node_data)
37
38/*
39 * Given a node id, return a pointer to the pg_data_t for the node.
40 *
41 * NODE_DATA - should be used in all code not related to system
42 * initialization. It uses pernode data structures to minimize
43 * offnode memory references. However, these structure are not
44 * present during boot. This macro can be used once cpu_init
45 * completes.
46 */
47#define NODE_DATA(nid) (local_node_data->pg_data_ptrs[nid])
48
49/*
50 * LOCAL_DATA_ADDR - This is to calculate the address of other node's
51 * "local_node_data" at hot-plug phase. The local_node_data
52 * is pointed by per_cpu_page. Kernel usually use it for
53 * just executing cpu. However, when new node is hot-added,
54 * the addresses of local data for other nodes are necessary
55 * to update all of them.
56 */
57#define LOCAL_DATA_ADDR(pgdat) \
58 ((struct ia64_node_data *)((u64)(pgdat) + \
59 L1_CACHE_ALIGN(sizeof(struct pglist_data))))
60
61#endif /* CONFIG_NUMA */
62
63#endif /* _ASM_IA64_NODEDATA_H */
arch/ia64/include/asm/numa.h+0−83
@@ -1,83 +0,0 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * This file contains NUMA specific prototypes and definitions.
7 *
8 * 2002/08/05 Erich Focht <efocht@ess.nec.de>
9 *
10 */
11#ifndef _ASM_IA64_NUMA_H
12#define _ASM_IA64_NUMA_H
13
14
15#ifdef CONFIG_NUMA
16
17#include <linux/cache.h>
18#include <linux/cpumask.h>
19#include <linux/numa.h>
20#include <linux/smp.h>
21#include <linux/threads.h>
22
23#include <asm/mmzone.h>
24
25extern u16 cpu_to_node_map[NR_CPUS] __cacheline_aligned;
26extern cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;
27extern pg_data_t *pgdat_list[MAX_NUMNODES];
28
29/* Stuff below this line could be architecture independent */
30
31extern int num_node_memblks; /* total number of memory chunks */
32
33/*
34 * List of node memory chunks. Filled when parsing SRAT table to
35 * obtain information about memory nodes.
36*/
37
38struct node_memblk_s {
39 unsigned long start_paddr;
40 unsigned long size;
41 int nid; /* which logical node contains this chunk? */
42 int bank; /* which mem bank on this node */
43};
44
45struct node_cpuid_s {
46 u16 phys_id; /* id << 8 | eid */
47 int nid; /* logical node containing this CPU */
48};
49
50extern struct node_memblk_s node_memblk[NR_NODE_MEMBLKS];
51extern struct node_cpuid_s node_cpuid[NR_CPUS];
52
53/*
54 * ACPI 2.0 SLIT (System Locality Information Table)
55 * http://devresource.hp.com/devresource/Docs/TechPapers/IA64/slit.pdf
56 *
57 * This is a matrix with "distances" between nodes, they should be
58 * proportional to the memory access latency ratios.
59 */
60
61extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES];
62#define slit_distance(from,to) (numa_slit[(from) * MAX_NUMNODES + (to)])
63extern int __node_distance(int from, int to);
64#define node_distance(from,to) __node_distance(from, to)
65
66extern int paddr_to_nid(unsigned long paddr);
67
68#define local_nodeid (cpu_to_node_map[smp_processor_id()])
69
70#define numa_off 0
71
72extern void map_cpu_to_node(int cpu, int nid);
73extern void unmap_cpu_from_node(int cpu, int nid);
74extern void numa_clear_node(int cpu);
75
76#else /* !CONFIG_NUMA */
77#define map_cpu_to_node(cpu, nid) do{}while(0)
78#define unmap_cpu_from_node(cpu, nid) do{}while(0)
79#define paddr_to_nid(addr) 0
80#define numa_clear_node(cpu) do { } while (0)
81#endif /* CONFIG_NUMA */
82
83#endif /* _ASM_IA64_NUMA_H */
arch/ia64/include/asm/page.h+0−208
@@ -1,208 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PAGE_H
3#define _ASM_IA64_PAGE_H
4/*
5 * Pagetable related stuff.
6 *
7 * Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
8 * David Mosberger-Tang <davidm@hpl.hp.com>
9 */
10
11#include <asm/intrinsics.h>
12#include <asm/types.h>
13
14/*
15 * The top three bits of an IA64 address are its Region Number.
16 * Different regions are assigned to different purposes.
17 */
18#define RGN_SHIFT (61)
19#define RGN_BASE(r) (__IA64_UL_CONST(r)<<RGN_SHIFT)
20#define RGN_BITS (RGN_BASE(-1))
21
22#define RGN_KERNEL 7 /* Identity mapped region */
23#define RGN_UNCACHED 6 /* Identity mapped I/O region */
24#define RGN_GATE 5 /* Gate page, Kernel text, etc */
25#define RGN_HPAGE 4 /* For Huge TLB pages */
26
27/*
28 * PAGE_SHIFT determines the actual kernel page size.
29 */
30#if defined(CONFIG_IA64_PAGE_SIZE_4KB)
31# define PAGE_SHIFT 12
32#elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
33# define PAGE_SHIFT 13
34#elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
35# define PAGE_SHIFT 14
36#elif defined(CONFIG_IA64_PAGE_SIZE_64KB)
37# define PAGE_SHIFT 16
38#else
39# error Unsupported page size!
40#endif
41
42#define PAGE_SIZE (__IA64_UL_CONST(1) << PAGE_SHIFT)
43#define PAGE_MASK (~(PAGE_SIZE - 1))
44
45#define PERCPU_PAGE_SHIFT 18 /* log2() of max. size of per-CPU area */
46#define PERCPU_PAGE_SIZE (__IA64_UL_CONST(1) << PERCPU_PAGE_SHIFT)
47
48
49#ifdef CONFIG_HUGETLB_PAGE
50# define HPAGE_REGION_BASE RGN_BASE(RGN_HPAGE)
51# define HPAGE_SHIFT hpage_shift
52# define HPAGE_SHIFT_DEFAULT 28 /* check ia64 SDM for architecture supported size */
53# define HPAGE_SIZE (__IA64_UL_CONST(1) << HPAGE_SHIFT)
54# define HPAGE_MASK (~(HPAGE_SIZE - 1))
55
56# define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
57#endif /* CONFIG_HUGETLB_PAGE */
58
59#ifdef __ASSEMBLY__
60# define __pa(x) ((x) - PAGE_OFFSET)
61# define __va(x) ((x) + PAGE_OFFSET)
62#else /* !__ASSEMBLY */
63# define STRICT_MM_TYPECHECKS
64
65extern void clear_page (void *page);
66extern void copy_page (void *to, void *from);
67
68/*
69 * clear_user_page() and copy_user_page() can't be inline functions because
70 * flush_dcache_page() can't be defined until later...
71 */
72#define clear_user_page(addr, vaddr, page) \
73do { \
74 clear_page(addr); \
75 flush_dcache_page(page); \
76} while (0)
77
78#define copy_user_page(to, from, vaddr, page) \
79do { \
80 copy_page((to), (from)); \
81 flush_dcache_page(page); \
82} while (0)
83
84
85#define vma_alloc_zeroed_movable_folio(vma, vaddr) \
86({ \
87 struct folio *folio = vma_alloc_folio( \
88 GFP_HIGHUSER_MOVABLE | __GFP_ZERO, 0, vma, vaddr, false); \
89 if (folio) \
90 flush_dcache_folio(folio); \
91 folio; \
92})
93
94#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
95
96#include <asm-generic/memory_model.h>
97
98#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
99#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
100#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
101
102typedef union ia64_va {
103 struct {
104 unsigned long off : 61; /* intra-region offset */
105 unsigned long reg : 3; /* region number */
106 } f;
107 unsigned long l;
108 void *p;
109} ia64_va;
110
111/*
112 * Note: These macros depend on the fact that PAGE_OFFSET has all
113 * region bits set to 1 and all other bits set to zero. They are
114 * expressed in this way to ensure they result in a single "dep"
115 * instruction.
116 */
117#define __pa(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg = 0; _v.l;})
118#define __va(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.p;})
119
120#define REGION_NUMBER(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg;})
121#define REGION_OFFSET(x) ({ia64_va _v; _v.l = (long) (x); _v.f.off;})
122
123#ifdef CONFIG_HUGETLB_PAGE
124# define htlbpage_to_page(x) (((unsigned long) REGION_NUMBER(x) << 61) \
125 | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT)))
126# define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
127extern unsigned int hpage_shift;
128#endif
129
130static __inline__ int
131get_order (unsigned long size)
132{
133 long double d = size - 1;
134 long order;
135
136 order = ia64_getf_exp(d);
137 order = order - PAGE_SHIFT - 0xffff + 1;
138 if (order < 0)
139 order = 0;
140 return order;
141}
142
143#endif /* !__ASSEMBLY__ */
144
145#ifdef STRICT_MM_TYPECHECKS
146 /*
147 * These are used to make use of C type-checking..
148 */
149 typedef struct { unsigned long pte; } pte_t;
150 typedef struct { unsigned long pmd; } pmd_t;
151#if CONFIG_PGTABLE_LEVELS == 4
152 typedef struct { unsigned long pud; } pud_t;
153#endif
154 typedef struct { unsigned long pgd; } pgd_t;
155 typedef struct { unsigned long pgprot; } pgprot_t;
156 typedef struct page *pgtable_t;
157
158# define pte_val(x) ((x).pte)
159# define pmd_val(x) ((x).pmd)
160#if CONFIG_PGTABLE_LEVELS == 4
161# define pud_val(x) ((x).pud)
162#endif
163# define pgd_val(x) ((x).pgd)
164# define pgprot_val(x) ((x).pgprot)
165
166# define __pte(x) ((pte_t) { (x) } )
167# define __pmd(x) ((pmd_t) { (x) } )
168# define __pgprot(x) ((pgprot_t) { (x) } )
169
170#else /* !STRICT_MM_TYPECHECKS */
171 /*
172 * .. while these make it easier on the compiler
173 */
174# ifndef __ASSEMBLY__
175 typedef unsigned long pte_t;
176 typedef unsigned long pmd_t;
177 typedef unsigned long pgd_t;
178 typedef unsigned long pgprot_t;
179 typedef struct page *pgtable_t;
180# endif
181
182# define pte_val(x) (x)
183# define pmd_val(x) (x)
184# define pgd_val(x) (x)
185# define pgprot_val(x) (x)
186
187# define __pte(x) (x)
188# define __pgd(x) (x)
189# define __pgprot(x) (x)
190#endif /* !STRICT_MM_TYPECHECKS */
191
192#define PAGE_OFFSET RGN_BASE(RGN_KERNEL)
193
194#define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_TSK_EXEC
195
196#define GATE_ADDR RGN_BASE(RGN_GATE)
197
198/*
199 * 0xa000000000000000+2*PERCPU_PAGE_SIZE
200 * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page)
201 */
202#define KERNEL_START (GATE_ADDR+__IA64_UL_CONST(0x100000000))
203#define PERCPU_ADDR (-PERCPU_PAGE_SIZE)
204#define LOAD_OFFSET (KERNEL_START - KERNEL_TR_PAGE_SIZE)
205
206#define __HAVE_ARCH_GATE_AREA 1
207
208#endif /* _ASM_IA64_PAGE_H */
arch/ia64/include/asm/pal.h+0−1827
@@ -1,1827 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PAL_H
3#define _ASM_IA64_PAL_H
4
5/*
6 * Processor Abstraction Layer definitions.
7 *
8 * This is based on Intel IA-64 Architecture Software Developer's Manual rev 1.0
9 * chapter 11 IA-64 Processor Abstraction Layer
10 *
11 * Copyright (C) 1998-2001 Hewlett-Packard Co
12 * David Mosberger-Tang <davidm@hpl.hp.com>
13 * Stephane Eranian <eranian@hpl.hp.com>
14 * Copyright (C) 1999 VA Linux Systems
15 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
16 * Copyright (C) 1999 Srinivasa Prasad Thirumalachar <sprasad@sprasad.engr.sgi.com>
17 * Copyright (C) 2008 Silicon Graphics, Inc. (SGI)
18 *
19 * 99/10/01 davidm Make sure we pass zero for reserved parameters.
20 * 00/03/07 davidm Updated pal_cache_flush() to be in sync with PAL v2.6.
21 * 00/03/23 cfleck Modified processor min-state save area to match updated PAL & SAL info
22 * 00/05/24 eranian Updated to latest PAL spec, fix structures bugs, added
23 * 00/05/25 eranian Support for stack calls, and static physical calls
24 * 00/06/18 eranian Support for stacked physical calls
25 * 06/10/26 rja Support for Intel Itanium Architecture Software Developer's
26 * Manual Rev 2.2 (Jan 2006)
27 */
28
29/*
30 * Note that some of these calls use a static-register only calling
31 * convention which has nothing to do with the regular calling
32 * convention.
33 */
34#define PAL_CACHE_FLUSH 1 /* flush i/d cache */
35#define PAL_CACHE_INFO 2 /* get detailed i/d cache info */
36#define PAL_CACHE_INIT 3 /* initialize i/d cache */
37#define PAL_CACHE_SUMMARY 4 /* get summary of cache hierarchy */
38#define PAL_MEM_ATTRIB 5 /* list supported memory attributes */
39#define PAL_PTCE_INFO 6 /* purge TLB info */
40#define PAL_VM_INFO 7 /* return supported virtual memory features */
41#define PAL_VM_SUMMARY 8 /* return summary on supported vm features */
42#define PAL_BUS_GET_FEATURES 9 /* return processor bus interface features settings */
43#define PAL_BUS_SET_FEATURES 10 /* set processor bus features */
44#define PAL_DEBUG_INFO 11 /* get number of debug registers */
45#define PAL_FIXED_ADDR 12 /* get fixed component of processors's directed address */
46#define PAL_FREQ_BASE 13 /* base frequency of the platform */
47#define PAL_FREQ_RATIOS 14 /* ratio of processor, bus and ITC frequency */
48#define PAL_PERF_MON_INFO 15 /* return performance monitor info */
49#define PAL_PLATFORM_ADDR 16 /* set processor interrupt block and IO port space addr */
50#define PAL_PROC_GET_FEATURES 17 /* get configurable processor features & settings */
51#define PAL_PROC_SET_FEATURES 18 /* enable/disable configurable processor features */
52#define PAL_RSE_INFO 19 /* return rse information */
53#define PAL_VERSION 20 /* return version of PAL code */
54#define PAL_MC_CLEAR_LOG 21 /* clear all processor log info */
55#define PAL_MC_DRAIN 22 /* drain operations which could result in an MCA */
56#define PAL_MC_EXPECTED 23 /* set/reset expected MCA indicator */
57#define PAL_MC_DYNAMIC_STATE 24 /* get processor dynamic state */
58#define PAL_MC_ERROR_INFO 25 /* get processor MCA info and static state */
59#define PAL_MC_RESUME 26 /* Return to interrupted process */
60#define PAL_MC_REGISTER_MEM 27 /* Register memory for PAL to use during MCAs and inits */
61#define PAL_HALT 28 /* enter the low power HALT state */
62#define PAL_HALT_LIGHT 29 /* enter the low power light halt state*/
63#define PAL_COPY_INFO 30 /* returns info needed to relocate PAL */
64#define PAL_CACHE_LINE_INIT 31 /* init tags & data of cache line */
65#define PAL_PMI_ENTRYPOINT 32 /* register PMI memory entry points with the processor */
66#define PAL_ENTER_IA_32_ENV 33 /* enter IA-32 system environment */
67#define PAL_VM_PAGE_SIZE 34 /* return vm TC and page walker page sizes */
68
69#define PAL_MEM_FOR_TEST 37 /* get amount of memory needed for late processor test */
70#define PAL_CACHE_PROT_INFO 38 /* get i/d cache protection info */
71#define PAL_REGISTER_INFO 39 /* return AR and CR register information*/
72#define PAL_SHUTDOWN 40 /* enter processor shutdown state */
73#define PAL_PREFETCH_VISIBILITY 41 /* Make Processor Prefetches Visible */
74#define PAL_LOGICAL_TO_PHYSICAL 42 /* returns information on logical to physical processor mapping */
75#define PAL_CACHE_SHARED_INFO 43 /* returns information on caches shared by logical processor */
76#define PAL_GET_HW_POLICY 48 /* Get current hardware resource sharing policy */
77#define PAL_SET_HW_POLICY 49 /* Set current hardware resource sharing policy */
78#define PAL_VP_INFO 50 /* Information about virtual processor features */
79#define PAL_MC_HW_TRACKING 51 /* Hardware tracking status */
80
81#define PAL_COPY_PAL 256 /* relocate PAL procedures and PAL PMI */
82#define PAL_HALT_INFO 257 /* return the low power capabilities of processor */
83#define PAL_TEST_PROC 258 /* perform late processor self-test */
84#define PAL_CACHE_READ 259 /* read tag & data of cacheline for diagnostic testing */
85#define PAL_CACHE_WRITE 260 /* write tag & data of cacheline for diagnostic testing */
86#define PAL_VM_TR_READ 261 /* read contents of translation register */
87#define PAL_GET_PSTATE 262 /* get the current P-state */
88#define PAL_SET_PSTATE 263 /* set the P-state */
89#define PAL_BRAND_INFO 274 /* Processor branding information */
90
91#define PAL_GET_PSTATE_TYPE_LASTSET 0
92#define PAL_GET_PSTATE_TYPE_AVGANDRESET 1
93#define PAL_GET_PSTATE_TYPE_AVGNORESET 2
94#define PAL_GET_PSTATE_TYPE_INSTANT 3
95
96#define PAL_MC_ERROR_INJECT 276 /* Injects processor error or returns injection capabilities */
97
98#ifndef __ASSEMBLY__
99
100#include <linux/types.h>
101#include <asm/fpu.h>
102#include <asm/intrinsics.h>
103
104/*
105 * Data types needed to pass information into PAL procedures and
106 * interpret information returned by them.
107 */
108
109/* Return status from the PAL procedure */
110typedef s64 pal_status_t;
111
112#define PAL_STATUS_SUCCESS 0 /* No error */
113#define PAL_STATUS_UNIMPLEMENTED (-1) /* Unimplemented procedure */
114#define PAL_STATUS_EINVAL (-2) /* Invalid argument */
115#define PAL_STATUS_ERROR (-3) /* Error */
116#define PAL_STATUS_CACHE_INIT_FAIL (-4) /* Could not initialize the
117 * specified level and type of
118 * cache without sideeffects
119 * and "restrict" was 1
120 */
121#define PAL_STATUS_REQUIRES_MEMORY (-9) /* Call requires PAL memory buffer */
122
123/* Processor cache level in the hierarchy */
124typedef u64 pal_cache_level_t;
125#define PAL_CACHE_LEVEL_L0 0 /* L0 */
126#define PAL_CACHE_LEVEL_L1 1 /* L1 */
127#define PAL_CACHE_LEVEL_L2 2 /* L2 */
128
129
130/* Processor cache type at a particular level in the hierarchy */
131
132typedef u64 pal_cache_type_t;
133#define PAL_CACHE_TYPE_INSTRUCTION 1 /* Instruction cache */
134#define PAL_CACHE_TYPE_DATA 2 /* Data or unified cache */
135#define PAL_CACHE_TYPE_INSTRUCTION_DATA 3 /* Both Data & Instruction */
136
137
138#define PAL_CACHE_FLUSH_INVALIDATE 1 /* Invalidate clean lines */
139#define PAL_CACHE_FLUSH_CHK_INTRS 2 /* check for interrupts/mc while flushing */
140
141/* Processor cache line size in bytes */
142typedef int pal_cache_line_size_t;
143
144/* Processor cache line state */
145typedef u64 pal_cache_line_state_t;
146#define PAL_CACHE_LINE_STATE_INVALID 0 /* Invalid */
147#define PAL_CACHE_LINE_STATE_SHARED 1 /* Shared */
148#define PAL_CACHE_LINE_STATE_EXCLUSIVE 2 /* Exclusive */
149#define PAL_CACHE_LINE_STATE_MODIFIED 3 /* Modified */
150
151typedef struct pal_freq_ratio {
152 u32 den, num; /* numerator & denominator */
153} itc_ratio, proc_ratio;
154
155typedef union pal_cache_config_info_1_s {
156 struct {
157 u64 u : 1, /* 0 Unified cache ? */
158 at : 2, /* 2-1 Cache mem attr*/
159 reserved : 5, /* 7-3 Reserved */
160 associativity : 8, /* 16-8 Associativity*/
161 line_size : 8, /* 23-17 Line size */
162 stride : 8, /* 31-24 Stride */
163 store_latency : 8, /*39-32 Store latency*/
164 load_latency : 8, /* 47-40 Load latency*/
165 store_hints : 8, /* 55-48 Store hints*/
166 load_hints : 8; /* 63-56 Load hints */
167 } pcci1_bits;
168 u64 pcci1_data;
169} pal_cache_config_info_1_t;
170
171typedef union pal_cache_config_info_2_s {
172 struct {
173 u32 cache_size; /*cache size in bytes*/
174
175
176 u32 alias_boundary : 8, /* 39-32 aliased addr
177 * separation for max
178 * performance.
179 */
180 tag_ls_bit : 8, /* 47-40 LSb of addr*/
181 tag_ms_bit : 8, /* 55-48 MSb of addr*/
182 reserved : 8; /* 63-56 Reserved */
183 } pcci2_bits;
184 u64 pcci2_data;
185} pal_cache_config_info_2_t;
186
187
188typedef struct pal_cache_config_info_s {
189 pal_status_t pcci_status;
190 pal_cache_config_info_1_t pcci_info_1;
191 pal_cache_config_info_2_t pcci_info_2;
192 u64 pcci_reserved;
193} pal_cache_config_info_t;
194
195#define pcci_ld_hints pcci_info_1.pcci1_bits.load_hints
196#define pcci_st_hints pcci_info_1.pcci1_bits.store_hints
197#define pcci_ld_latency pcci_info_1.pcci1_bits.load_latency
198#define pcci_st_latency pcci_info_1.pcci1_bits.store_latency
199#define pcci_stride pcci_info_1.pcci1_bits.stride
200#define pcci_line_size pcci_info_1.pcci1_bits.line_size
201#define pcci_assoc pcci_info_1.pcci1_bits.associativity
202#define pcci_cache_attr pcci_info_1.pcci1_bits.at
203#define pcci_unified pcci_info_1.pcci1_bits.u
204#define pcci_tag_msb pcci_info_2.pcci2_bits.tag_ms_bit
205#define pcci_tag_lsb pcci_info_2.pcci2_bits.tag_ls_bit
206#define pcci_alias_boundary pcci_info_2.pcci2_bits.alias_boundary
207#define pcci_cache_size pcci_info_2.pcci2_bits.cache_size
208
209
210
211/* Possible values for cache attributes */
212
213#define PAL_CACHE_ATTR_WT 0 /* Write through cache */
214#define PAL_CACHE_ATTR_WB 1 /* Write back cache */
215#define PAL_CACHE_ATTR_WT_OR_WB 2 /* Either write thru or write
216 * back depending on TLB
217 * memory attributes
218 */
219
220
221/* Possible values for cache hints */
222
223#define PAL_CACHE_HINT_TEMP_1 0 /* Temporal level 1 */
224#define PAL_CACHE_HINT_NTEMP_1 1 /* Non-temporal level 1 */
225#define PAL_CACHE_HINT_NTEMP_ALL 3 /* Non-temporal all levels */
226
227/* Processor cache protection information */
228typedef union pal_cache_protection_element_u {
229 u32 pcpi_data;
230 struct {
231 u32 data_bits : 8, /* # data bits covered by
232 * each unit of protection
233 */
234
235 tagprot_lsb : 6, /* Least -do- */
236 tagprot_msb : 6, /* Most Sig. tag address
237 * bit that this
238 * protection covers.
239 */
240 prot_bits : 6, /* # of protection bits */
241 method : 4, /* Protection method */
242 t_d : 2; /* Indicates which part
243 * of the cache this
244 * protection encoding
245 * applies.
246 */
247 } pcp_info;
248} pal_cache_protection_element_t;
249
250#define pcpi_cache_prot_part pcp_info.t_d
251#define pcpi_prot_method pcp_info.method
252#define pcpi_prot_bits pcp_info.prot_bits
253#define pcpi_tagprot_msb pcp_info.tagprot_msb
254#define pcpi_tagprot_lsb pcp_info.tagprot_lsb
255#define pcpi_data_bits pcp_info.data_bits
256
257/* Processor cache part encodings */
258#define PAL_CACHE_PROT_PART_DATA 0 /* Data protection */
259#define PAL_CACHE_PROT_PART_TAG 1 /* Tag protection */
260#define PAL_CACHE_PROT_PART_TAG_DATA 2 /* Tag+data protection (tag is
261 * more significant )
262 */
263#define PAL_CACHE_PROT_PART_DATA_TAG 3 /* Data+tag protection (data is
264 * more significant )
265 */
266#define PAL_CACHE_PROT_PART_MAX 6
267
268
269typedef struct pal_cache_protection_info_s {
270 pal_status_t pcpi_status;
271 pal_cache_protection_element_t pcp_info[PAL_CACHE_PROT_PART_MAX];
272} pal_cache_protection_info_t;
273
274
275/* Processor cache protection method encodings */
276#define PAL_CACHE_PROT_METHOD_NONE 0 /* No protection */
277#define PAL_CACHE_PROT_METHOD_ODD_PARITY 1 /* Odd parity */
278#define PAL_CACHE_PROT_METHOD_EVEN_PARITY 2 /* Even parity */
279#define PAL_CACHE_PROT_METHOD_ECC 3 /* ECC protection */
280
281
282/* Processor cache line identification in the hierarchy */
283typedef union pal_cache_line_id_u {
284 u64 pclid_data;
285 struct {
286 u64 cache_type : 8, /* 7-0 cache type */
287 level : 8, /* 15-8 level of the
288 * cache in the
289 * hierarchy.
290 */
291 way : 8, /* 23-16 way in the set
292 */
293 part : 8, /* 31-24 part of the
294 * cache
295 */
296 reserved : 32; /* 63-32 is reserved*/
297 } pclid_info_read;
298 struct {
299 u64 cache_type : 8, /* 7-0 cache type */
300 level : 8, /* 15-8 level of the
301 * cache in the
302 * hierarchy.
303 */
304 way : 8, /* 23-16 way in the set
305 */
306 part : 8, /* 31-24 part of the
307 * cache
308 */
309 mesi : 8, /* 39-32 cache line
310 * state
311 */
312 start : 8, /* 47-40 lsb of data to
313 * invert
314 */
315 length : 8, /* 55-48 #bits to
316 * invert
317 */
318 trigger : 8; /* 63-56 Trigger error
319 * by doing a load
320 * after the write
321 */
322
323 } pclid_info_write;
324} pal_cache_line_id_u_t;
325
326#define pclid_read_part pclid_info_read.part
327#define pclid_read_way pclid_info_read.way
328#define pclid_read_level pclid_info_read.level
329#define pclid_read_cache_type pclid_info_read.cache_type
330
331#define pclid_write_trigger pclid_info_write.trigger
332#define pclid_write_length pclid_info_write.length
333#define pclid_write_start pclid_info_write.start
334#define pclid_write_mesi pclid_info_write.mesi
335#define pclid_write_part pclid_info_write.part
336#define pclid_write_way pclid_info_write.way
337#define pclid_write_level pclid_info_write.level
338#define pclid_write_cache_type pclid_info_write.cache_type
339
340/* Processor cache line part encodings */
341#define PAL_CACHE_LINE_ID_PART_DATA 0 /* Data */
342#define PAL_CACHE_LINE_ID_PART_TAG 1 /* Tag */
343#define PAL_CACHE_LINE_ID_PART_DATA_PROT 2 /* Data protection */
344#define PAL_CACHE_LINE_ID_PART_TAG_PROT 3 /* Tag protection */
345#define PAL_CACHE_LINE_ID_PART_DATA_TAG_PROT 4 /* Data+tag
346 * protection
347 */
348typedef struct pal_cache_line_info_s {
349 pal_status_t pcli_status; /* Return status of the read cache line
350 * info call.
351 */
352 u64 pcli_data; /* 64-bit data, tag, protection bits .. */
353 u64 pcli_data_len; /* data length in bits */
354 pal_cache_line_state_t pcli_cache_line_state; /* mesi state */
355
356} pal_cache_line_info_t;
357
358
359/* Machine Check related crap */
360
361/* Pending event status bits */
362typedef u64 pal_mc_pending_events_t;
363
364#define PAL_MC_PENDING_MCA (1 << 0)
365#define PAL_MC_PENDING_INIT (1 << 1)
366
367/* Error information type */
368typedef u64 pal_mc_info_index_t;
369
370#define PAL_MC_INFO_PROCESSOR 0 /* Processor */
371#define PAL_MC_INFO_CACHE_CHECK 1 /* Cache check */
372#define PAL_MC_INFO_TLB_CHECK 2 /* Tlb check */
373#define PAL_MC_INFO_BUS_CHECK 3 /* Bus check */
374#define PAL_MC_INFO_REQ_ADDR 4 /* Requestor address */
375#define PAL_MC_INFO_RESP_ADDR 5 /* Responder address */
376#define PAL_MC_INFO_TARGET_ADDR 6 /* Target address */
377#define PAL_MC_INFO_IMPL_DEP 7 /* Implementation
378 * dependent
379 */
380
381#define PAL_TLB_CHECK_OP_PURGE 8
382
383typedef struct pal_process_state_info_s {
384 u64 reserved1 : 2,
385 rz : 1, /* PAL_CHECK processor
386 * rendezvous
387 * successful.
388 */
389
390 ra : 1, /* PAL_CHECK attempted
391 * a rendezvous.
392 */
393 me : 1, /* Distinct multiple
394 * errors occurred
395 */
396
397 mn : 1, /* Min. state save
398 * area has been
399 * registered with PAL
400 */
401
402 sy : 1, /* Storage integrity
403 * synched
404 */
405
406
407 co : 1, /* Continuable */
408 ci : 1, /* MC isolated */
409 us : 1, /* Uncontained storage
410 * damage.
411 */
412
413
414 hd : 1, /* Non-essential hw
415 * lost (no loss of
416 * functionality)
417 * causing the
418 * processor to run in
419 * degraded mode.
420 */
421
422 tl : 1, /* 1 => MC occurred
423 * after an instr was
424 * executed but before
425 * the trap that
426 * resulted from instr
427 * execution was
428 * generated.
429 * (Trap Lost )
430 */
431 mi : 1, /* More information available
432 * call PAL_MC_ERROR_INFO
433 */
434 pi : 1, /* Precise instruction pointer */
435 pm : 1, /* Precise min-state save area */
436
437 dy : 1, /* Processor dynamic
438 * state valid
439 */
440
441
442 in : 1, /* 0 = MC, 1 = INIT */
443 rs : 1, /* RSE valid */
444 cm : 1, /* MC corrected */
445 ex : 1, /* MC is expected */
446 cr : 1, /* Control regs valid*/
447 pc : 1, /* Perf cntrs valid */
448 dr : 1, /* Debug regs valid */
449 tr : 1, /* Translation regs
450 * valid
451 */
452 rr : 1, /* Region regs valid */
453 ar : 1, /* App regs valid */
454 br : 1, /* Branch regs valid */
455 pr : 1, /* Predicate registers
456 * valid
457 */
458
459 fp : 1, /* fp registers valid*/
460 b1 : 1, /* Preserved bank one
461 * general registers
462 * are valid
463 */
464 b0 : 1, /* Preserved bank zero
465 * general registers
466 * are valid
467 */
468 gr : 1, /* General registers
469 * are valid
470 * (excl. banked regs)
471 */
472 dsize : 16, /* size of dynamic
473 * state returned
474 * by the processor
475 */
476
477 se : 1, /* Shared error. MCA in a
478 shared structure */
479 reserved2 : 10,
480 cc : 1, /* Cache check */
481 tc : 1, /* TLB check */
482 bc : 1, /* Bus check */
483 rc : 1, /* Register file check */
484 uc : 1; /* Uarch check */
485
486} pal_processor_state_info_t;
487
488typedef struct pal_cache_check_info_s {
489 u64 op : 4, /* Type of cache
490 * operation that
491 * caused the machine
492 * check.
493 */
494 level : 2, /* Cache level */
495 reserved1 : 2,
496 dl : 1, /* Failure in data part
497 * of cache line
498 */
499 tl : 1, /* Failure in tag part
500 * of cache line
501 */
502 dc : 1, /* Failure in dcache */
503 ic : 1, /* Failure in icache */
504 mesi : 3, /* Cache line state */
505 mv : 1, /* mesi valid */
506 way : 5, /* Way in which the
507 * error occurred
508 */
509 wiv : 1, /* Way field valid */
510 reserved2 : 1,
511 dp : 1, /* Data poisoned on MBE */
512 reserved3 : 6,
513 hlth : 2, /* Health indicator */
514
515 index : 20, /* Cache line index */
516 reserved4 : 2,
517
518 is : 1, /* instruction set (1 == ia32) */
519 iv : 1, /* instruction set field valid */
520 pl : 2, /* privilege level */
521 pv : 1, /* privilege level field valid */
522 mcc : 1, /* Machine check corrected */
523 tv : 1, /* Target address
524 * structure is valid
525 */
526 rq : 1, /* Requester identifier
527 * structure is valid
528 */
529 rp : 1, /* Responder identifier
530 * structure is valid
531 */
532 pi : 1; /* Precise instruction pointer
533 * structure is valid
534 */
535} pal_cache_check_info_t;
536
537typedef struct pal_tlb_check_info_s {
538
539 u64 tr_slot : 8, /* Slot# of TR where
540 * error occurred
541 */
542 trv : 1, /* tr_slot field is valid */
543 reserved1 : 1,
544 level : 2, /* TLB level where failure occurred */
545 reserved2 : 4,
546 dtr : 1, /* Fail in data TR */
547 itr : 1, /* Fail in inst TR */
548 dtc : 1, /* Fail in data TC */
549 itc : 1, /* Fail in inst. TC */
550 op : 4, /* Cache operation */
551 reserved3 : 6,
552 hlth : 2, /* Health indicator */
553 reserved4 : 22,
554
555 is : 1, /* instruction set (1 == ia32) */
556 iv : 1, /* instruction set field valid */
557 pl : 2, /* privilege level */
558 pv : 1, /* privilege level field valid */
559 mcc : 1, /* Machine check corrected */
560 tv : 1, /* Target address
561 * structure is valid
562 */
563 rq : 1, /* Requester identifier
564 * structure is valid
565 */
566 rp : 1, /* Responder identifier
567 * structure is valid
568 */
569 pi : 1; /* Precise instruction pointer
570 * structure is valid
571 */
572} pal_tlb_check_info_t;
573
574typedef struct pal_bus_check_info_s {
575 u64 size : 5, /* Xaction size */
576 ib : 1, /* Internal bus error */
577 eb : 1, /* External bus error */
578 cc : 1, /* Error occurred
579 * during cache-cache
580 * transfer.
581 */
582 type : 8, /* Bus xaction type*/
583 sev : 5, /* Bus error severity*/
584 hier : 2, /* Bus hierarchy level */
585 dp : 1, /* Data poisoned on MBE */
586 bsi : 8, /* Bus error status
587 * info
588 */
589 reserved2 : 22,
590
591 is : 1, /* instruction set (1 == ia32) */
592 iv : 1, /* instruction set field valid */
593 pl : 2, /* privilege level */
594 pv : 1, /* privilege level field valid */
595 mcc : 1, /* Machine check corrected */
596 tv : 1, /* Target address
597 * structure is valid
598 */
599 rq : 1, /* Requester identifier
600 * structure is valid
601 */
602 rp : 1, /* Responder identifier
603 * structure is valid
604 */
605 pi : 1; /* Precise instruction pointer
606 * structure is valid
607 */
608} pal_bus_check_info_t;
609
610typedef struct pal_reg_file_check_info_s {
611 u64 id : 4, /* Register file identifier */
612 op : 4, /* Type of register
613 * operation that
614 * caused the machine
615 * check.
616 */
617 reg_num : 7, /* Register number */
618 rnv : 1, /* reg_num valid */
619 reserved2 : 38,
620
621 is : 1, /* instruction set (1 == ia32) */
622 iv : 1, /* instruction set field valid */
623 pl : 2, /* privilege level */
624 pv : 1, /* privilege level field valid */
625 mcc : 1, /* Machine check corrected */
626 reserved3 : 3,
627 pi : 1; /* Precise instruction pointer
628 * structure is valid
629 */
630} pal_reg_file_check_info_t;
631
632typedef struct pal_uarch_check_info_s {
633 u64 sid : 5, /* Structure identification */
634 level : 3, /* Level of failure */
635 array_id : 4, /* Array identification */
636 op : 4, /* Type of
637 * operation that
638 * caused the machine
639 * check.
640 */
641 way : 6, /* Way of structure */
642 wv : 1, /* way valid */
643 xv : 1, /* index valid */
644 reserved1 : 6,
645 hlth : 2, /* Health indicator */
646 index : 8, /* Index or set of the uarch
647 * structure that failed.
648 */
649 reserved2 : 24,
650
651 is : 1, /* instruction set (1 == ia32) */
652 iv : 1, /* instruction set field valid */
653 pl : 2, /* privilege level */
654 pv : 1, /* privilege level field valid */
655 mcc : 1, /* Machine check corrected */
656 tv : 1, /* Target address
657 * structure is valid
658 */
659 rq : 1, /* Requester identifier
660 * structure is valid
661 */
662 rp : 1, /* Responder identifier
663 * structure is valid
664 */
665 pi : 1; /* Precise instruction pointer
666 * structure is valid
667 */
668} pal_uarch_check_info_t;
669
670typedef union pal_mc_error_info_u {
671 u64 pmei_data;
672 pal_processor_state_info_t pme_processor;
673 pal_cache_check_info_t pme_cache;
674 pal_tlb_check_info_t pme_tlb;
675 pal_bus_check_info_t pme_bus;
676 pal_reg_file_check_info_t pme_reg_file;
677 pal_uarch_check_info_t pme_uarch;
678} pal_mc_error_info_t;
679
680#define pmci_proc_unknown_check pme_processor.uc
681#define pmci_proc_bus_check pme_processor.bc
682#define pmci_proc_tlb_check pme_processor.tc
683#define pmci_proc_cache_check pme_processor.cc
684#define pmci_proc_dynamic_state_size pme_processor.dsize
685#define pmci_proc_gpr_valid pme_processor.gr
686#define pmci_proc_preserved_bank0_gpr_valid pme_processor.b0
687#define pmci_proc_preserved_bank1_gpr_valid pme_processor.b1
688#define pmci_proc_fp_valid pme_processor.fp
689#define pmci_proc_predicate_regs_valid pme_processor.pr
690#define pmci_proc_branch_regs_valid pme_processor.br
691#define pmci_proc_app_regs_valid pme_processor.ar
692#define pmci_proc_region_regs_valid pme_processor.rr
693#define pmci_proc_translation_regs_valid pme_processor.tr
694#define pmci_proc_debug_regs_valid pme_processor.dr
695#define pmci_proc_perf_counters_valid pme_processor.pc
696#define pmci_proc_control_regs_valid pme_processor.cr
697#define pmci_proc_machine_check_expected pme_processor.ex
698#define pmci_proc_machine_check_corrected pme_processor.cm
699#define pmci_proc_rse_valid pme_processor.rs
700#define pmci_proc_machine_check_or_init pme_processor.in
701#define pmci_proc_dynamic_state_valid pme_processor.dy
702#define pmci_proc_operation pme_processor.op
703#define pmci_proc_trap_lost pme_processor.tl
704#define pmci_proc_hardware_damage pme_processor.hd
705#define pmci_proc_uncontained_storage_damage pme_processor.us
706#define pmci_proc_machine_check_isolated pme_processor.ci
707#define pmci_proc_continuable pme_processor.co
708#define pmci_proc_storage_intergrity_synced pme_processor.sy
709#define pmci_proc_min_state_save_area_regd pme_processor.mn
710#define pmci_proc_distinct_multiple_errors pme_processor.me
711#define pmci_proc_pal_attempted_rendezvous pme_processor.ra
712#define pmci_proc_pal_rendezvous_complete pme_processor.rz
713
714
715#define pmci_cache_level pme_cache.level
716#define pmci_cache_line_state pme_cache.mesi
717#define pmci_cache_line_state_valid pme_cache.mv
718#define pmci_cache_line_index pme_cache.index
719#define pmci_cache_instr_cache_fail pme_cache.ic
720#define pmci_cache_data_cache_fail pme_cache.dc
721#define pmci_cache_line_tag_fail pme_cache.tl
722#define pmci_cache_line_data_fail pme_cache.dl
723#define pmci_cache_operation pme_cache.op
724#define pmci_cache_way_valid pme_cache.wv
725#define pmci_cache_target_address_valid pme_cache.tv
726#define pmci_cache_way pme_cache.way
727#define pmci_cache_mc pme_cache.mc
728
729#define pmci_tlb_instr_translation_cache_fail pme_tlb.itc
730#define pmci_tlb_data_translation_cache_fail pme_tlb.dtc
731#define pmci_tlb_instr_translation_reg_fail pme_tlb.itr
732#define pmci_tlb_data_translation_reg_fail pme_tlb.dtr
733#define pmci_tlb_translation_reg_slot pme_tlb.tr_slot
734#define pmci_tlb_mc pme_tlb.mc
735
736#define pmci_bus_status_info pme_bus.bsi
737#define pmci_bus_req_address_valid pme_bus.rq
738#define pmci_bus_resp_address_valid pme_bus.rp
739#define pmci_bus_target_address_valid pme_bus.tv
740#define pmci_bus_error_severity pme_bus.sev
741#define pmci_bus_transaction_type pme_bus.type
742#define pmci_bus_cache_cache_transfer pme_bus.cc
743#define pmci_bus_transaction_size pme_bus.size
744#define pmci_bus_internal_error pme_bus.ib
745#define pmci_bus_external_error pme_bus.eb
746#define pmci_bus_mc pme_bus.mc
747
748/*
749 * NOTE: this min_state_save area struct only includes the 1KB
750 * architectural state save area. The other 3 KB is scratch space
751 * for PAL.
752 */
753
754struct pal_min_state_area {
755 u64 pmsa_nat_bits; /* nat bits for saved GRs */
756 u64 pmsa_gr[15]; /* GR1 - GR15 */
757 u64 pmsa_bank0_gr[16]; /* GR16 - GR31 */
758 u64 pmsa_bank1_gr[16]; /* GR16 - GR31 */
759 u64 pmsa_pr; /* predicate registers */
760 u64 pmsa_br0; /* branch register 0 */
761 u64 pmsa_rsc; /* ar.rsc */
762 u64 pmsa_iip; /* cr.iip */
763 u64 pmsa_ipsr; /* cr.ipsr */
764 u64 pmsa_ifs; /* cr.ifs */
765 u64 pmsa_xip; /* previous iip */
766 u64 pmsa_xpsr; /* previous psr */
767 u64 pmsa_xfs; /* previous ifs */
768 u64 pmsa_br1; /* branch register 1 */
769 u64 pmsa_reserved[70]; /* pal_min_state_area should total to 1KB */
770};
771
772
773struct ia64_pal_retval {
774 /*
775 * A zero status value indicates call completed without error.
776 * A negative status value indicates reason of call failure.
777 * A positive status value indicates success but an
778 * informational value should be printed (e.g., "reboot for
779 * change to take effect").
780 */
781 s64 status;
782 u64 v0;
783 u64 v1;
784 u64 v2;
785};
786
787/*
788 * Note: Currently unused PAL arguments are generally labeled
789 * "reserved" so the value specified in the PAL documentation
790 * (generally 0) MUST be passed. Reserved parameters are not optional
791 * parameters.
792 */
793extern struct ia64_pal_retval ia64_pal_call_static (u64, u64, u64, u64);
794extern struct ia64_pal_retval ia64_pal_call_stacked (u64, u64, u64, u64);
795extern struct ia64_pal_retval ia64_pal_call_phys_static (u64, u64, u64, u64);
796extern struct ia64_pal_retval ia64_pal_call_phys_stacked (u64, u64, u64, u64);
797extern void ia64_save_scratch_fpregs (struct ia64_fpreg *);
798extern void ia64_load_scratch_fpregs (struct ia64_fpreg *);
799
800#define PAL_CALL(iprv,a0,a1,a2,a3) do { \
801 struct ia64_fpreg fr[6]; \
802 ia64_save_scratch_fpregs(fr); \
803 iprv = ia64_pal_call_static(a0, a1, a2, a3); \
804 ia64_load_scratch_fpregs(fr); \
805} while (0)
806
807#define PAL_CALL_STK(iprv,a0,a1,a2,a3) do { \
808 struct ia64_fpreg fr[6]; \
809 ia64_save_scratch_fpregs(fr); \
810 iprv = ia64_pal_call_stacked(a0, a1, a2, a3); \
811 ia64_load_scratch_fpregs(fr); \
812} while (0)
813
814#define PAL_CALL_PHYS(iprv,a0,a1,a2,a3) do { \
815 struct ia64_fpreg fr[6]; \
816 ia64_save_scratch_fpregs(fr); \
817 iprv = ia64_pal_call_phys_static(a0, a1, a2, a3); \
818 ia64_load_scratch_fpregs(fr); \
819} while (0)
820
821#define PAL_CALL_PHYS_STK(iprv,a0,a1,a2,a3) do { \
822 struct ia64_fpreg fr[6]; \
823 ia64_save_scratch_fpregs(fr); \
824 iprv = ia64_pal_call_phys_stacked(a0, a1, a2, a3); \
825 ia64_load_scratch_fpregs(fr); \
826} while (0)
827
828typedef int (*ia64_pal_handler) (u64, ...);
829extern ia64_pal_handler ia64_pal;
830extern void ia64_pal_handler_init (void *);
831
832extern ia64_pal_handler ia64_pal;
833
834extern pal_cache_config_info_t l0d_cache_config_info;
835extern pal_cache_config_info_t l0i_cache_config_info;
836extern pal_cache_config_info_t l1_cache_config_info;
837extern pal_cache_config_info_t l2_cache_config_info;
838
839extern pal_cache_protection_info_t l0d_cache_protection_info;
840extern pal_cache_protection_info_t l0i_cache_protection_info;
841extern pal_cache_protection_info_t l1_cache_protection_info;
842extern pal_cache_protection_info_t l2_cache_protection_info;
843
844extern pal_cache_config_info_t pal_cache_config_info_get(pal_cache_level_t,
845 pal_cache_type_t);
846
847extern pal_cache_protection_info_t pal_cache_protection_info_get(pal_cache_level_t,
848 pal_cache_type_t);
849
850
851extern void pal_error(int);
852
853
854/* Useful wrappers for the current list of pal procedures */
855
856typedef union pal_bus_features_u {
857 u64 pal_bus_features_val;
858 struct {
859 u64 pbf_reserved1 : 29;
860 u64 pbf_req_bus_parking : 1;
861 u64 pbf_bus_lock_mask : 1;
862 u64 pbf_enable_half_xfer_rate : 1;
863 u64 pbf_reserved2 : 20;
864 u64 pbf_enable_shared_line_replace : 1;
865 u64 pbf_enable_exclusive_line_replace : 1;
866 u64 pbf_disable_xaction_queueing : 1;
867 u64 pbf_disable_resp_err_check : 1;
868 u64 pbf_disable_berr_check : 1;
869 u64 pbf_disable_bus_req_internal_err_signal : 1;
870 u64 pbf_disable_bus_req_berr_signal : 1;
871 u64 pbf_disable_bus_init_event_check : 1;
872 u64 pbf_disable_bus_init_event_signal : 1;
873 u64 pbf_disable_bus_addr_err_check : 1;
874 u64 pbf_disable_bus_addr_err_signal : 1;
875 u64 pbf_disable_bus_data_err_check : 1;
876 } pal_bus_features_s;
877} pal_bus_features_u_t;
878
879extern void pal_bus_features_print (u64);
880
881/* Provide information about configurable processor bus features */
882static inline s64
883ia64_pal_bus_get_features (pal_bus_features_u_t *features_avail,
884 pal_bus_features_u_t *features_status,
885 pal_bus_features_u_t *features_control)
886{
887 struct ia64_pal_retval iprv;
888 PAL_CALL_PHYS(iprv, PAL_BUS_GET_FEATURES, 0, 0, 0);
889 if (features_avail)
890 features_avail->pal_bus_features_val = iprv.v0;
891 if (features_status)
892 features_status->pal_bus_features_val = iprv.v1;
893 if (features_control)
894 features_control->pal_bus_features_val = iprv.v2;
895 return iprv.status;
896}
897
898/* Enables/disables specific processor bus features */
899static inline s64
900ia64_pal_bus_set_features (pal_bus_features_u_t feature_select)
901{
902 struct ia64_pal_retval iprv;
903 PAL_CALL_PHYS(iprv, PAL_BUS_SET_FEATURES, feature_select.pal_bus_features_val, 0, 0);
904 return iprv.status;
905}
906
907/* Get detailed cache information */
908static inline s64
909ia64_pal_cache_config_info (u64 cache_level, u64 cache_type, pal_cache_config_info_t *conf)
910{
911 struct ia64_pal_retval iprv;
912
913 PAL_CALL(iprv, PAL_CACHE_INFO, cache_level, cache_type, 0);
914
915 if (iprv.status == 0) {
916 conf->pcci_status = iprv.status;
917 conf->pcci_info_1.pcci1_data = iprv.v0;
918 conf->pcci_info_2.pcci2_data = iprv.v1;
919 conf->pcci_reserved = iprv.v2;
920 }
921 return iprv.status;
922
923}
924
925/* Get detailed cche protection information */
926static inline s64
927ia64_pal_cache_prot_info (u64 cache_level, u64 cache_type, pal_cache_protection_info_t *prot)
928{
929 struct ia64_pal_retval iprv;
930
931 PAL_CALL(iprv, PAL_CACHE_PROT_INFO, cache_level, cache_type, 0);
932
933 if (iprv.status == 0) {
934 prot->pcpi_status = iprv.status;
935 prot->pcp_info[0].pcpi_data = iprv.v0 & 0xffffffff;
936 prot->pcp_info[1].pcpi_data = iprv.v0 >> 32;
937 prot->pcp_info[2].pcpi_data = iprv.v1 & 0xffffffff;
938 prot->pcp_info[3].pcpi_data = iprv.v1 >> 32;
939 prot->pcp_info[4].pcpi_data = iprv.v2 & 0xffffffff;
940 prot->pcp_info[5].pcpi_data = iprv.v2 >> 32;
941 }
942 return iprv.status;
943}
944
945/*
946 * Flush the processor instruction or data caches. *PROGRESS must be
947 * initialized to zero before calling this for the first time..
948 */
949static inline s64
950ia64_pal_cache_flush (u64 cache_type, u64 invalidate, u64 *progress, u64 *vector)
951{
952 struct ia64_pal_retval iprv;
953 PAL_CALL(iprv, PAL_CACHE_FLUSH, cache_type, invalidate, *progress);
954 if (vector)
955 *vector = iprv.v0;
956 *progress = iprv.v1;
957 return iprv.status;
958}
959
960
961/* Initialize the processor controlled caches */
962static inline s64
963ia64_pal_cache_init (u64 level, u64 cache_type, u64 rest)
964{
965 struct ia64_pal_retval iprv;
966 PAL_CALL(iprv, PAL_CACHE_INIT, level, cache_type, rest);
967 return iprv.status;
968}
969
970/* Initialize the tags and data of a data or unified cache line of
971 * processor controlled cache to known values without the availability
972 * of backing memory.
973 */
974static inline s64
975ia64_pal_cache_line_init (u64 physical_addr, u64 data_value)
976{
977 struct ia64_pal_retval iprv;
978 PAL_CALL(iprv, PAL_CACHE_LINE_INIT, physical_addr, data_value, 0);
979 return iprv.status;
980}
981
982
983/* Read the data and tag of a processor controlled cache line for diags */
984static inline s64
985ia64_pal_cache_read (pal_cache_line_id_u_t line_id, u64 physical_addr)
986{
987 struct ia64_pal_retval iprv;
988 PAL_CALL_PHYS_STK(iprv, PAL_CACHE_READ, line_id.pclid_data,
989 physical_addr, 0);
990 return iprv.status;
991}
992
993/* Return summary information about the hierarchy of caches controlled by the processor */
994static inline long ia64_pal_cache_summary(unsigned long *cache_levels,
995 unsigned long *unique_caches)
996{
997 struct ia64_pal_retval iprv;
998 PAL_CALL(iprv, PAL_CACHE_SUMMARY, 0, 0, 0);
999 if (cache_levels)
1000 *cache_levels = iprv.v0;
1001 if (unique_caches)
1002 *unique_caches = iprv.v1;
1003 return iprv.status;
1004}
1005
1006/* Write the data and tag of a processor-controlled cache line for diags */
1007static inline s64
1008ia64_pal_cache_write (pal_cache_line_id_u_t line_id, u64 physical_addr, u64 data)
1009{
1010 struct ia64_pal_retval iprv;
1011 PAL_CALL_PHYS_STK(iprv, PAL_CACHE_WRITE, line_id.pclid_data,
1012 physical_addr, data);
1013 return iprv.status;
1014}
1015
1016
1017/* Return the parameters needed to copy relocatable PAL procedures from ROM to memory */
1018static inline s64
1019ia64_pal_copy_info (u64 copy_type, u64 num_procs, u64 num_iopics,
1020 u64 *buffer_size, u64 *buffer_align)
1021{
1022 struct ia64_pal_retval iprv;
1023 PAL_CALL(iprv, PAL_COPY_INFO, copy_type, num_procs, num_iopics);
1024 if (buffer_size)
1025 *buffer_size = iprv.v0;
1026 if (buffer_align)
1027 *buffer_align = iprv.v1;
1028 return iprv.status;
1029}
1030
1031/* Copy relocatable PAL procedures from ROM to memory */
1032static inline s64
1033ia64_pal_copy_pal (u64 target_addr, u64 alloc_size, u64 processor, u64 *pal_proc_offset)
1034{
1035 struct ia64_pal_retval iprv;
1036 PAL_CALL(iprv, PAL_COPY_PAL, target_addr, alloc_size, processor);
1037 if (pal_proc_offset)
1038 *pal_proc_offset = iprv.v0;
1039 return iprv.status;
1040}
1041
1042/* Return the number of instruction and data debug register pairs */
1043static inline long ia64_pal_debug_info(unsigned long *inst_regs,
1044 unsigned long *data_regs)
1045{
1046 struct ia64_pal_retval iprv;
1047 PAL_CALL(iprv, PAL_DEBUG_INFO, 0, 0, 0);
1048 if (inst_regs)
1049 *inst_regs = iprv.v0;
1050 if (data_regs)
1051 *data_regs = iprv.v1;
1052
1053 return iprv.status;
1054}
1055
1056#ifdef TBD
1057/* Switch from IA64-system environment to IA-32 system environment */
1058static inline s64
1059ia64_pal_enter_ia32_env (ia32_env1, ia32_env2, ia32_env3)
1060{
1061 struct ia64_pal_retval iprv;
1062 PAL_CALL(iprv, PAL_ENTER_IA_32_ENV, ia32_env1, ia32_env2, ia32_env3);
1063 return iprv.status;
1064}
1065#endif
1066
1067/* Get unique geographical address of this processor on its bus */
1068static inline s64
1069ia64_pal_fixed_addr (u64 *global_unique_addr)
1070{
1071 struct ia64_pal_retval iprv;
1072 PAL_CALL(iprv, PAL_FIXED_ADDR, 0, 0, 0);
1073 if (global_unique_addr)
1074 *global_unique_addr = iprv.v0;
1075 return iprv.status;
1076}
1077
1078/* Get base frequency of the platform if generated by the processor */
1079static inline long ia64_pal_freq_base(unsigned long *platform_base_freq)
1080{
1081 struct ia64_pal_retval iprv;
1082 PAL_CALL(iprv, PAL_FREQ_BASE, 0, 0, 0);
1083 if (platform_base_freq)
1084 *platform_base_freq = iprv.v0;
1085 return iprv.status;
1086}
1087
1088/*
1089 * Get the ratios for processor frequency, bus frequency and interval timer to
1090 * the base frequency of the platform
1091 */
1092static inline s64
1093ia64_pal_freq_ratios (struct pal_freq_ratio *proc_ratio, struct pal_freq_ratio *bus_ratio,
1094 struct pal_freq_ratio *itc_ratio)
1095{
1096 struct ia64_pal_retval iprv;
1097 PAL_CALL(iprv, PAL_FREQ_RATIOS, 0, 0, 0);
1098 if (proc_ratio)
1099 *(u64 *)proc_ratio = iprv.v0;
1100 if (bus_ratio)
1101 *(u64 *)bus_ratio = iprv.v1;
1102 if (itc_ratio)
1103 *(u64 *)itc_ratio = iprv.v2;
1104 return iprv.status;
1105}
1106
1107/*
1108 * Get the current hardware resource sharing policy of the processor
1109 */
1110static inline s64
1111ia64_pal_get_hw_policy (u64 proc_num, u64 *cur_policy, u64 *num_impacted,
1112 u64 *la)
1113{
1114 struct ia64_pal_retval iprv;
1115 PAL_CALL(iprv, PAL_GET_HW_POLICY, proc_num, 0, 0);
1116 if (cur_policy)
1117 *cur_policy = iprv.v0;
1118 if (num_impacted)
1119 *num_impacted = iprv.v1;
1120 if (la)
1121 *la = iprv.v2;
1122 return iprv.status;
1123}
1124
1125/* Make the processor enter HALT or one of the implementation dependent low
1126 * power states where prefetching and execution are suspended and cache and
1127 * TLB coherency is not maintained.
1128 */
1129static inline s64
1130ia64_pal_halt (u64 halt_state)
1131{
1132 struct ia64_pal_retval iprv;
1133 PAL_CALL(iprv, PAL_HALT, halt_state, 0, 0);
1134 return iprv.status;
1135}
1136
1137typedef union pal_power_mgmt_info_u {
1138 u64 ppmi_data;
1139 struct {
1140 u64 exit_latency : 16,
1141 entry_latency : 16,
1142 power_consumption : 28,
1143 im : 1,
1144 co : 1,
1145 reserved : 2;
1146 } pal_power_mgmt_info_s;
1147} pal_power_mgmt_info_u_t;
1148
1149/* Return information about processor's optional power management capabilities. */
1150static inline s64
1151ia64_pal_halt_info (pal_power_mgmt_info_u_t *power_buf)
1152{
1153 struct ia64_pal_retval iprv;
1154 PAL_CALL_STK(iprv, PAL_HALT_INFO, (unsigned long) power_buf, 0, 0);
1155 return iprv.status;
1156}
1157
1158/* Get the current P-state information */
1159static inline s64
1160ia64_pal_get_pstate (u64 *pstate_index, unsigned long type)
1161{
1162 struct ia64_pal_retval iprv;
1163 PAL_CALL_STK(iprv, PAL_GET_PSTATE, type, 0, 0);
1164 *pstate_index = iprv.v0;
1165 return iprv.status;
1166}
1167
1168/* Set the P-state */
1169static inline s64
1170ia64_pal_set_pstate (u64 pstate_index)
1171{
1172 struct ia64_pal_retval iprv;
1173 PAL_CALL_STK(iprv, PAL_SET_PSTATE, pstate_index, 0, 0);
1174 return iprv.status;
1175}
1176
1177/* Processor branding information*/
1178static inline s64
1179ia64_pal_get_brand_info (char *brand_info)
1180{
1181 struct ia64_pal_retval iprv;
1182 PAL_CALL_STK(iprv, PAL_BRAND_INFO, 0, (u64)brand_info, 0);
1183 return iprv.status;
1184}
1185
1186/* Cause the processor to enter LIGHT HALT state, where prefetching and execution are
1187 * suspended, but cache and TLB coherency is maintained.
1188 */
1189static inline s64
1190ia64_pal_halt_light (void)
1191{
1192 struct ia64_pal_retval iprv;
1193 PAL_CALL(iprv, PAL_HALT_LIGHT, 0, 0, 0);
1194 return iprv.status;
1195}
1196
1197/* Clear all the processor error logging registers and reset the indicator that allows
1198 * the error logging registers to be written. This procedure also checks the pending
1199 * machine check bit and pending INIT bit and reports their states.
1200 */
1201static inline s64
1202ia64_pal_mc_clear_log (u64 *pending_vector)
1203{
1204 struct ia64_pal_retval iprv;
1205 PAL_CALL(iprv, PAL_MC_CLEAR_LOG, 0, 0, 0);
1206 if (pending_vector)
1207 *pending_vector = iprv.v0;
1208 return iprv.status;
1209}
1210
1211/* Ensure that all outstanding transactions in a processor are completed or that any
1212 * MCA due to thes outstanding transaction is taken.
1213 */
1214static inline s64
1215ia64_pal_mc_drain (void)
1216{
1217 struct ia64_pal_retval iprv;
1218 PAL_CALL(iprv, PAL_MC_DRAIN, 0, 0, 0);
1219 return iprv.status;
1220}
1221
1222/* Return the machine check dynamic processor state */
1223static inline s64
1224ia64_pal_mc_dynamic_state (u64 info_type, u64 dy_buffer, u64 *size)
1225{
1226 struct ia64_pal_retval iprv;
1227 PAL_CALL(iprv, PAL_MC_DYNAMIC_STATE, info_type, dy_buffer, 0);
1228 if (size)
1229 *size = iprv.v0;
1230 return iprv.status;
1231}
1232
1233/* Return processor machine check information */
1234static inline s64
1235ia64_pal_mc_error_info (u64 info_index, u64 type_index, u64 *size, u64 *error_info)
1236{
1237 struct ia64_pal_retval iprv;
1238 PAL_CALL(iprv, PAL_MC_ERROR_INFO, info_index, type_index, 0);
1239 if (size)
1240 *size = iprv.v0;
1241 if (error_info)
1242 *error_info = iprv.v1;
1243 return iprv.status;
1244}
1245
1246/* Injects the requested processor error or returns info on
1247 * supported injection capabilities for current processor implementation
1248 */
1249static inline s64
1250ia64_pal_mc_error_inject_phys (u64 err_type_info, u64 err_struct_info,
1251 u64 err_data_buffer, u64 *capabilities, u64 *resources)
1252{
1253 struct ia64_pal_retval iprv;
1254 PAL_CALL_PHYS_STK(iprv, PAL_MC_ERROR_INJECT, err_type_info,
1255 err_struct_info, err_data_buffer);
1256 if (capabilities)
1257 *capabilities= iprv.v0;
1258 if (resources)
1259 *resources= iprv.v1;
1260 return iprv.status;
1261}
1262
1263static inline s64
1264ia64_pal_mc_error_inject_virt (u64 err_type_info, u64 err_struct_info,
1265 u64 err_data_buffer, u64 *capabilities, u64 *resources)
1266{
1267 struct ia64_pal_retval iprv;
1268 PAL_CALL_STK(iprv, PAL_MC_ERROR_INJECT, err_type_info,
1269 err_struct_info, err_data_buffer);
1270 if (capabilities)
1271 *capabilities= iprv.v0;
1272 if (resources)
1273 *resources= iprv.v1;
1274 return iprv.status;
1275}
1276
1277/* Inform PALE_CHECK whether a machine check is expected so that PALE_CHECK willnot
1278 * attempt to correct any expected machine checks.
1279 */
1280static inline s64
1281ia64_pal_mc_expected (u64 expected, u64 *previous)
1282{
1283 struct ia64_pal_retval iprv;
1284 PAL_CALL(iprv, PAL_MC_EXPECTED, expected, 0, 0);
1285 if (previous)
1286 *previous = iprv.v0;
1287 return iprv.status;
1288}
1289
1290typedef union pal_hw_tracking_u {
1291 u64 pht_data;
1292 struct {
1293 u64 itc :4, /* Instruction cache tracking */
1294 dct :4, /* Date cache tracking */
1295 itt :4, /* Instruction TLB tracking */
1296 ddt :4, /* Data TLB tracking */
1297 reserved:48;
1298 } pal_hw_tracking_s;
1299} pal_hw_tracking_u_t;
1300
1301/*
1302 * Hardware tracking status.
1303 */
1304static inline s64
1305ia64_pal_mc_hw_tracking (u64 *status)
1306{
1307 struct ia64_pal_retval iprv;
1308 PAL_CALL(iprv, PAL_MC_HW_TRACKING, 0, 0, 0);
1309 if (status)
1310 *status = iprv.v0;
1311 return iprv.status;
1312}
1313
1314/* Register a platform dependent location with PAL to which it can save
1315 * minimal processor state in the event of a machine check or initialization
1316 * event.
1317 */
1318static inline s64
1319ia64_pal_mc_register_mem (u64 physical_addr, u64 size, u64 *req_size)
1320{
1321 struct ia64_pal_retval iprv;
1322 PAL_CALL(iprv, PAL_MC_REGISTER_MEM, physical_addr, size, 0);
1323 if (req_size)
1324 *req_size = iprv.v0;
1325 return iprv.status;
1326}
1327
1328/* Restore minimal architectural processor state, set CMC interrupt if necessary
1329 * and resume execution
1330 */
1331static inline s64
1332ia64_pal_mc_resume (u64 set_cmci, u64 save_ptr)
1333{
1334 struct ia64_pal_retval iprv;
1335 PAL_CALL(iprv, PAL_MC_RESUME, set_cmci, save_ptr, 0);
1336 return iprv.status;
1337}
1338
1339/* Return the memory attributes implemented by the processor */
1340static inline s64
1341ia64_pal_mem_attrib (u64 *mem_attrib)
1342{
1343 struct ia64_pal_retval iprv;
1344 PAL_CALL(iprv, PAL_MEM_ATTRIB, 0, 0, 0);
1345 if (mem_attrib)
1346 *mem_attrib = iprv.v0 & 0xff;
1347 return iprv.status;
1348}
1349
1350/* Return the amount of memory needed for second phase of processor
1351 * self-test and the required alignment of memory.
1352 */
1353static inline s64
1354ia64_pal_mem_for_test (u64 *bytes_needed, u64 *alignment)
1355{
1356 struct ia64_pal_retval iprv;
1357 PAL_CALL(iprv, PAL_MEM_FOR_TEST, 0, 0, 0);
1358 if (bytes_needed)
1359 *bytes_needed = iprv.v0;
1360 if (alignment)
1361 *alignment = iprv.v1;
1362 return iprv.status;
1363}
1364
1365typedef union pal_perf_mon_info_u {
1366 u64 ppmi_data;
1367 struct {
1368 u64 generic : 8,
1369 width : 8,
1370 cycles : 8,
1371 retired : 8,
1372 reserved : 32;
1373 } pal_perf_mon_info_s;
1374} pal_perf_mon_info_u_t;
1375
1376/* Return the performance monitor information about what can be counted
1377 * and how to configure the monitors to count the desired events.
1378 */
1379static inline s64
1380ia64_pal_perf_mon_info (u64 *pm_buffer, pal_perf_mon_info_u_t *pm_info)
1381{
1382 struct ia64_pal_retval iprv;
1383 PAL_CALL(iprv, PAL_PERF_MON_INFO, (unsigned long) pm_buffer, 0, 0);
1384 if (pm_info)
1385 pm_info->ppmi_data = iprv.v0;
1386 return iprv.status;
1387}
1388
1389/* Specifies the physical address of the processor interrupt block
1390 * and I/O port space.
1391 */
1392static inline s64
1393ia64_pal_platform_addr (u64 type, u64 physical_addr)
1394{
1395 struct ia64_pal_retval iprv;
1396 PAL_CALL(iprv, PAL_PLATFORM_ADDR, type, physical_addr, 0);
1397 return iprv.status;
1398}
1399
1400/* Set the SAL PMI entrypoint in memory */
1401static inline s64
1402ia64_pal_pmi_entrypoint (u64 sal_pmi_entry_addr)
1403{
1404 struct ia64_pal_retval iprv;
1405 PAL_CALL(iprv, PAL_PMI_ENTRYPOINT, sal_pmi_entry_addr, 0, 0);
1406 return iprv.status;
1407}
1408
1409struct pal_features_s;
1410/* Provide information about configurable processor features */
1411static inline s64
1412ia64_pal_proc_get_features (u64 *features_avail,
1413 u64 *features_status,
1414 u64 *features_control,
1415 u64 features_set)
1416{
1417 struct ia64_pal_retval iprv;
1418 PAL_CALL_PHYS(iprv, PAL_PROC_GET_FEATURES, 0, features_set, 0);
1419 if (iprv.status == 0) {
1420 *features_avail = iprv.v0;
1421 *features_status = iprv.v1;
1422 *features_control = iprv.v2;
1423 }
1424 return iprv.status;
1425}
1426
1427/* Enable/disable processor dependent features */
1428static inline s64
1429ia64_pal_proc_set_features (u64 feature_select)
1430{
1431 struct ia64_pal_retval iprv;
1432 PAL_CALL_PHYS(iprv, PAL_PROC_SET_FEATURES, feature_select, 0, 0);
1433 return iprv.status;
1434}
1435
1436/*
1437 * Put everything in a struct so we avoid the global offset table whenever
1438 * possible.
1439 */
1440typedef struct ia64_ptce_info_s {
1441 unsigned long base;
1442 u32 count[2];
1443 u32 stride[2];
1444} ia64_ptce_info_t;
1445
1446/* Return the information required for the architected loop used to purge
1447 * (initialize) the entire TC
1448 */
1449static inline s64
1450ia64_get_ptce (ia64_ptce_info_t *ptce)
1451{
1452 struct ia64_pal_retval iprv;
1453
1454 if (!ptce)
1455 return -1;
1456
1457 PAL_CALL(iprv, PAL_PTCE_INFO, 0, 0, 0);
1458 if (iprv.status == 0) {
1459 ptce->base = iprv.v0;
1460 ptce->count[0] = iprv.v1 >> 32;
1461 ptce->count[1] = iprv.v1 & 0xffffffff;
1462 ptce->stride[0] = iprv.v2 >> 32;
1463 ptce->stride[1] = iprv.v2 & 0xffffffff;
1464 }
1465 return iprv.status;
1466}
1467
1468/* Return info about implemented application and control registers. */
1469static inline s64
1470ia64_pal_register_info (u64 info_request, u64 *reg_info_1, u64 *reg_info_2)
1471{
1472 struct ia64_pal_retval iprv;
1473 PAL_CALL(iprv, PAL_REGISTER_INFO, info_request, 0, 0);
1474 if (reg_info_1)
1475 *reg_info_1 = iprv.v0;
1476 if (reg_info_2)
1477 *reg_info_2 = iprv.v1;
1478 return iprv.status;
1479}
1480
1481typedef union pal_hints_u {
1482 unsigned long ph_data;
1483 struct {
1484 unsigned long si : 1,
1485 li : 1,
1486 reserved : 62;
1487 } pal_hints_s;
1488} pal_hints_u_t;
1489
1490/* Return information about the register stack and RSE for this processor
1491 * implementation.
1492 */
1493static inline long ia64_pal_rse_info(unsigned long *num_phys_stacked,
1494 pal_hints_u_t *hints)
1495{
1496 struct ia64_pal_retval iprv;
1497 PAL_CALL(iprv, PAL_RSE_INFO, 0, 0, 0);
1498 if (num_phys_stacked)
1499 *num_phys_stacked = iprv.v0;
1500 if (hints)
1501 hints->ph_data = iprv.v1;
1502 return iprv.status;
1503}
1504
1505/*
1506 * Set the current hardware resource sharing policy of the processor
1507 */
1508static inline s64
1509ia64_pal_set_hw_policy (u64 policy)
1510{
1511 struct ia64_pal_retval iprv;
1512 PAL_CALL(iprv, PAL_SET_HW_POLICY, policy, 0, 0);
1513 return iprv.status;
1514}
1515
1516/* Cause the processor to enter SHUTDOWN state, where prefetching and execution are
1517 * suspended, but cause cache and TLB coherency to be maintained.
1518 * This is usually called in IA-32 mode.
1519 */
1520static inline s64
1521ia64_pal_shutdown (void)
1522{
1523 struct ia64_pal_retval iprv;
1524 PAL_CALL(iprv, PAL_SHUTDOWN, 0, 0, 0);
1525 return iprv.status;
1526}
1527
1528/* Perform the second phase of processor self-test. */
1529static inline s64
1530ia64_pal_test_proc (u64 test_addr, u64 test_size, u64 attributes, u64 *self_test_state)
1531{
1532 struct ia64_pal_retval iprv;
1533 PAL_CALL(iprv, PAL_TEST_PROC, test_addr, test_size, attributes);
1534 if (self_test_state)
1535 *self_test_state = iprv.v0;
1536 return iprv.status;
1537}
1538
1539typedef union pal_version_u {
1540 u64 pal_version_val;
1541 struct {
1542 u64 pv_pal_b_rev : 8;
1543 u64 pv_pal_b_model : 8;
1544 u64 pv_reserved1 : 8;
1545 u64 pv_pal_vendor : 8;
1546 u64 pv_pal_a_rev : 8;
1547 u64 pv_pal_a_model : 8;
1548 u64 pv_reserved2 : 16;
1549 } pal_version_s;
1550} pal_version_u_t;
1551
1552
1553/*
1554 * Return PAL version information. While the documentation states that
1555 * PAL_VERSION can be called in either physical or virtual mode, some
1556 * implementations only allow physical calls. We don't call it very often,
1557 * so the overhead isn't worth eliminating.
1558 */
1559static inline s64
1560ia64_pal_version (pal_version_u_t *pal_min_version, pal_version_u_t *pal_cur_version)
1561{
1562 struct ia64_pal_retval iprv;
1563 PAL_CALL_PHYS(iprv, PAL_VERSION, 0, 0, 0);
1564 if (pal_min_version)
1565 pal_min_version->pal_version_val = iprv.v0;
1566
1567 if (pal_cur_version)
1568 pal_cur_version->pal_version_val = iprv.v1;
1569
1570 return iprv.status;
1571}
1572
1573typedef union pal_tc_info_u {
1574 u64 pti_val;
1575 struct {
1576 u64 num_sets : 8,
1577 associativity : 8,
1578 num_entries : 16,
1579 pf : 1,
1580 unified : 1,
1581 reduce_tr : 1,
1582 reserved : 29;
1583 } pal_tc_info_s;
1584} pal_tc_info_u_t;
1585
1586#define tc_reduce_tr pal_tc_info_s.reduce_tr
1587#define tc_unified pal_tc_info_s.unified
1588#define tc_pf pal_tc_info_s.pf
1589#define tc_num_entries pal_tc_info_s.num_entries
1590#define tc_associativity pal_tc_info_s.associativity
1591#define tc_num_sets pal_tc_info_s.num_sets
1592
1593
1594/* Return information about the virtual memory characteristics of the processor
1595 * implementation.
1596 */
1597static inline s64
1598ia64_pal_vm_info (u64 tc_level, u64 tc_type, pal_tc_info_u_t *tc_info, u64 *tc_pages)
1599{
1600 struct ia64_pal_retval iprv;
1601 PAL_CALL(iprv, PAL_VM_INFO, tc_level, tc_type, 0);
1602 if (tc_info)
1603 tc_info->pti_val = iprv.v0;
1604 if (tc_pages)
1605 *tc_pages = iprv.v1;
1606 return iprv.status;
1607}
1608
1609/* Get page size information about the virtual memory characteristics of the processor
1610 * implementation.
1611 */
1612static inline s64 ia64_pal_vm_page_size(u64 *tr_pages, u64 *vw_pages)
1613{
1614 struct ia64_pal_retval iprv;
1615 PAL_CALL(iprv, PAL_VM_PAGE_SIZE, 0, 0, 0);
1616 if (tr_pages)
1617 *tr_pages = iprv.v0;
1618 if (vw_pages)
1619 *vw_pages = iprv.v1;
1620 return iprv.status;
1621}
1622
1623typedef union pal_vm_info_1_u {
1624 u64 pvi1_val;
1625 struct {
1626 u64 vw : 1,
1627 phys_add_size : 7,
1628 key_size : 8,
1629 max_pkr : 8,
1630 hash_tag_id : 8,
1631 max_dtr_entry : 8,
1632 max_itr_entry : 8,
1633 max_unique_tcs : 8,
1634 num_tc_levels : 8;
1635 } pal_vm_info_1_s;
1636} pal_vm_info_1_u_t;
1637
1638#define PAL_MAX_PURGES 0xFFFF /* all ones is means unlimited */
1639
1640typedef union pal_vm_info_2_u {
1641 u64 pvi2_val;
1642 struct {
1643 u64 impl_va_msb : 8,
1644 rid_size : 8,
1645 max_purges : 16,
1646 reserved : 32;
1647 } pal_vm_info_2_s;
1648} pal_vm_info_2_u_t;
1649
1650/* Get summary information about the virtual memory characteristics of the processor
1651 * implementation.
1652 */
1653static inline s64
1654ia64_pal_vm_summary (pal_vm_info_1_u_t *vm_info_1, pal_vm_info_2_u_t *vm_info_2)
1655{
1656 struct ia64_pal_retval iprv;
1657 PAL_CALL(iprv, PAL_VM_SUMMARY, 0, 0, 0);
1658 if (vm_info_1)
1659 vm_info_1->pvi1_val = iprv.v0;
1660 if (vm_info_2)
1661 vm_info_2->pvi2_val = iprv.v1;
1662 return iprv.status;
1663}
1664
1665typedef union pal_vp_info_u {
1666 u64 pvi_val;
1667 struct {
1668 u64 index: 48, /* virtual feature set info */
1669 vmm_id: 16; /* feature set id */
1670 } pal_vp_info_s;
1671} pal_vp_info_u_t;
1672
1673/*
1674 * Returns information about virtual processor features
1675 */
1676static inline s64
1677ia64_pal_vp_info (u64 feature_set, u64 vp_buffer, u64 *vp_info, u64 *vmm_id)
1678{
1679 struct ia64_pal_retval iprv;
1680 PAL_CALL(iprv, PAL_VP_INFO, feature_set, vp_buffer, 0);
1681 if (vp_info)
1682 *vp_info = iprv.v0;
1683 if (vmm_id)
1684 *vmm_id = iprv.v1;
1685 return iprv.status;
1686}
1687
1688typedef union pal_itr_valid_u {
1689 u64 piv_val;
1690 struct {
1691 u64 access_rights_valid : 1,
1692 priv_level_valid : 1,
1693 dirty_bit_valid : 1,
1694 mem_attr_valid : 1,
1695 reserved : 60;
1696 } pal_tr_valid_s;
1697} pal_tr_valid_u_t;
1698
1699/* Read a translation register */
1700static inline s64
1701ia64_pal_tr_read (u64 reg_num, u64 tr_type, u64 *tr_buffer, pal_tr_valid_u_t *tr_valid)
1702{
1703 struct ia64_pal_retval iprv;
1704 PAL_CALL_PHYS_STK(iprv, PAL_VM_TR_READ, reg_num, tr_type,(u64)ia64_tpa(tr_buffer));
1705 if (tr_valid)
1706 tr_valid->piv_val = iprv.v0;
1707 return iprv.status;
1708}
1709
1710/*
1711 * PAL_PREFETCH_VISIBILITY transaction types
1712 */
1713#define PAL_VISIBILITY_VIRTUAL 0
1714#define PAL_VISIBILITY_PHYSICAL 1
1715
1716/*
1717 * PAL_PREFETCH_VISIBILITY return codes
1718 */
1719#define PAL_VISIBILITY_OK 1
1720#define PAL_VISIBILITY_OK_REMOTE_NEEDED 0
1721#define PAL_VISIBILITY_INVAL_ARG -2
1722#define PAL_VISIBILITY_ERROR -3
1723
1724static inline s64
1725ia64_pal_prefetch_visibility (s64 trans_type)
1726{
1727 struct ia64_pal_retval iprv;
1728 PAL_CALL(iprv, PAL_PREFETCH_VISIBILITY, trans_type, 0, 0);
1729 return iprv.status;
1730}
1731
1732/* data structure for getting information on logical to physical mappings */
1733typedef union pal_log_overview_u {
1734 struct {
1735 u64 num_log :16, /* Total number of logical
1736 * processors on this die
1737 */
1738 tpc :8, /* Threads per core */
1739 reserved3 :8, /* Reserved */
1740 cpp :8, /* Cores per processor */
1741 reserved2 :8, /* Reserved */
1742 ppid :8, /* Physical processor ID */
1743 reserved1 :8; /* Reserved */
1744 } overview_bits;
1745 u64 overview_data;
1746} pal_log_overview_t;
1747
1748typedef union pal_proc_n_log_info1_u{
1749 struct {
1750 u64 tid :16, /* Thread id */
1751 reserved2 :16, /* Reserved */
1752 cid :16, /* Core id */
1753 reserved1 :16; /* Reserved */
1754 } ppli1_bits;
1755 u64 ppli1_data;
1756} pal_proc_n_log_info1_t;
1757
1758typedef union pal_proc_n_log_info2_u {
1759 struct {
1760 u64 la :16, /* Logical address */
1761 reserved :48; /* Reserved */
1762 } ppli2_bits;
1763 u64 ppli2_data;
1764} pal_proc_n_log_info2_t;
1765
1766typedef struct pal_logical_to_physical_s
1767{
1768 pal_log_overview_t overview;
1769 pal_proc_n_log_info1_t ppli1;
1770 pal_proc_n_log_info2_t ppli2;
1771} pal_logical_to_physical_t;
1772
1773#define overview_num_log overview.overview_bits.num_log
1774#define overview_tpc overview.overview_bits.tpc
1775#define overview_cpp overview.overview_bits.cpp
1776#define overview_ppid overview.overview_bits.ppid
1777#define log1_tid ppli1.ppli1_bits.tid
1778#define log1_cid ppli1.ppli1_bits.cid
1779#define log2_la ppli2.ppli2_bits.la
1780
1781/* Get information on logical to physical processor mappings. */
1782static inline s64
1783ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping)
1784{
1785 struct ia64_pal_retval iprv;
1786
1787 PAL_CALL(iprv, PAL_LOGICAL_TO_PHYSICAL, proc_number, 0, 0);
1788
1789 if (iprv.status == PAL_STATUS_SUCCESS)
1790 {
1791 mapping->overview.overview_data = iprv.v0;
1792 mapping->ppli1.ppli1_data = iprv.v1;
1793 mapping->ppli2.ppli2_data = iprv.v2;
1794 }
1795
1796 return iprv.status;
1797}
1798
1799typedef struct pal_cache_shared_info_s
1800{
1801 u64 num_shared;
1802 pal_proc_n_log_info1_t ppli1;
1803 pal_proc_n_log_info2_t ppli2;
1804} pal_cache_shared_info_t;
1805
1806/* Get information on logical to physical processor mappings. */
1807static inline s64
1808ia64_pal_cache_shared_info(u64 level,
1809 u64 type,
1810 u64 proc_number,
1811 pal_cache_shared_info_t *info)
1812{
1813 struct ia64_pal_retval iprv;
1814
1815 PAL_CALL(iprv, PAL_CACHE_SHARED_INFO, level, type, proc_number);
1816
1817 if (iprv.status == PAL_STATUS_SUCCESS) {
1818 info->num_shared = iprv.v0;
1819 info->ppli1.ppli1_data = iprv.v1;
1820 info->ppli2.ppli2_data = iprv.v2;
1821 }
1822
1823 return iprv.status;
1824}
1825#endif /* __ASSEMBLY__ */
1826
1827#endif /* _ASM_IA64_PAL_H */
arch/ia64/include/asm/param.h+0−18
@@ -1,18 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Fundamental kernel parameters.
4 *
5 * Based on <asm-i386/param.h>.
6 *
7 * Modified 1998, 1999, 2002-2003
8 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
9 */
10#ifndef _ASM_IA64_PARAM_H
11#define _ASM_IA64_PARAM_H
12
13#include <uapi/asm/param.h>
14
15# define HZ CONFIG_HZ
16# define USER_HZ HZ
17# define CLOCKS_PER_SEC HZ /* frequency at which times() counts */
18#endif /* _ASM_IA64_PARAM_H */
arch/ia64/include/asm/parport.h+0−20
@@ -1,20 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * parport.h: platform-specific PC-style parport initialisation
4 *
5 * Copyright (C) 1999, 2000 Tim Waugh <tim@cyberelk.demon.co.uk>
6 *
7 * This file should only be included by drivers/parport/parport_pc.c.
8 */
9
10#ifndef _ASM_IA64_PARPORT_H
11#define _ASM_IA64_PARPORT_H 1
12
13static int parport_pc_find_isa_ports(int autoirq, int autodma);
14
15static int parport_pc_find_nonpci_ports(int autoirq, int autodma)
16{
17 return parport_pc_find_isa_ports(autoirq, autodma);
18}
19
20#endif /* _ASM_IA64_PARPORT_H */
arch/ia64/include/asm/patch.h+0−28
@@ -1,28 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PATCH_H
3#define _ASM_IA64_PATCH_H
4
5/*
6 * Copyright (C) 2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 *
9 * There are a number of reasons for patching instructions. Rather than duplicating code
10 * all over the place, we put the common stuff here. Reasons for patching: in-kernel
11 * module-loader, virtual-to-physical patch-list, McKinley Errata 9 workaround, and gate
12 * shared library. Undoubtedly, some of these reasons will disappear and others will
13 * be added over time.
14 */
15#include <linux/elf.h>
16#include <linux/types.h>
17
18extern void ia64_patch (u64 insn_addr, u64 mask, u64 val); /* patch any insn slot */
19extern void ia64_patch_imm64 (u64 insn_addr, u64 val); /* patch "movl" w/abs. value*/
20extern void ia64_patch_imm60 (u64 insn_addr, u64 val); /* patch "brl" w/ip-rel value */
21
22extern void ia64_patch_mckinley_e9 (unsigned long start, unsigned long end);
23extern void ia64_patch_vtop (unsigned long start, unsigned long end);
24extern void ia64_patch_phys_stack_reg(unsigned long val);
25extern void ia64_patch_rse (unsigned long start, unsigned long end);
26extern void ia64_patch_gate (void);
27
28#endif /* _ASM_IA64_PATCH_H */
arch/ia64/include/asm/pci.h+0−66
@@ -1,66 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PCI_H
3#define _ASM_IA64_PCI_H
4
5#include <linux/mm.h>
6#include <linux/slab.h>
7#include <linux/spinlock.h>
8#include <linux/string.h>
9#include <linux/types.h>
10#include <linux/scatterlist.h>
11
12#include <asm/io.h>
13#include <asm/hw_irq.h>
14
15struct pci_vector_struct {
16 __u16 segment; /* PCI Segment number */
17 __u16 bus; /* PCI Bus number */
18 __u32 pci_id; /* ACPI split 16 bits device, 16 bits function (see section 6.1.1) */
19 __u8 pin; /* PCI PIN (0 = A, 1 = B, 2 = C, 3 = D) */
20 __u32 irq; /* IRQ assigned */
21};
22
23/*
24 * Can be used to override the logic in pci_scan_bus for skipping already-configured bus
25 * numbers - to be used for buggy BIOSes or architectures with incomplete PCI setup by the
26 * loader.
27 */
28#define pcibios_assign_all_busses() 0
29
30#define PCIBIOS_MIN_IO 0x1000
31#define PCIBIOS_MIN_MEM 0x10000000
32
33#define HAVE_PCI_MMAP
34#define ARCH_GENERIC_PCI_MMAP_RESOURCE
35#define arch_can_pci_mmap_wc() 1
36
37#define HAVE_PCI_LEGACY
38extern int pci_mmap_legacy_page_range(struct pci_bus *bus,
39 struct vm_area_struct *vma,
40 enum pci_mmap_state mmap_state);
41
42char *pci_get_legacy_mem(struct pci_bus *bus);
43int pci_legacy_read(struct pci_bus *bus, u16 port, u32 *val, u8 size);
44int pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size);
45
46struct pci_controller {
47 struct acpi_device *companion;
48 void *iommu;
49 int segment;
50 int node; /* nearest node with memory or NUMA_NO_NODE for global allocation */
51
52 void *platform_data;
53};
54
55
56#define PCI_CONTROLLER(busdev) ((struct pci_controller *) busdev->sysdata)
57#define pci_domain_nr(busdev) (PCI_CONTROLLER(busdev)->segment)
58
59extern struct pci_ops pci_root_ops;
60
61static inline int pci_proc_domain(struct pci_bus *bus)
62{
63 return (pci_domain_nr(bus) != 0);
64}
65
66#endif /* _ASM_IA64_PCI_H */
arch/ia64/include/asm/percpu.h+0−53
@@ -1,53 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PERCPU_H
3#define _ASM_IA64_PERCPU_H
4
5/*
6 * Copyright (C) 2002-2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10#ifdef __ASSEMBLY__
11# define THIS_CPU(var) (var) /* use this to mark accesses to per-CPU variables... */
12#else /* !__ASSEMBLY__ */
13
14
15#include <linux/threads.h>
16
17#ifdef CONFIG_SMP
18
19#ifdef HAVE_MODEL_SMALL_ATTRIBUTE
20# define PER_CPU_ATTRIBUTES __attribute__((__model__ (__small__)))
21#endif
22
23#define __my_cpu_offset __ia64_per_cpu_var(local_per_cpu_offset)
24
25extern void *per_cpu_init(void);
26
27#else /* ! SMP */
28
29#define per_cpu_init() (__phys_per_cpu_start)
30
31#endif /* SMP */
32
33#define PER_CPU_BASE_SECTION ".data..percpu"
34
35/*
36 * Be extremely careful when taking the address of this variable! Due to virtual
37 * remapping, it is different from the canonical address returned by this_cpu_ptr(&var)!
38 * On the positive side, using __ia64_per_cpu_var() instead of this_cpu_ptr() is slightly
39 * more efficient.
40 */
41#define __ia64_per_cpu_var(var) (*({ \
42 __verify_pcpu_ptr(&(var)); \
43 ((typeof(var) __kernel __force *)&(var)); \
44}))
45
46#include <asm-generic/percpu.h>
47
48/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
49DECLARE_PER_CPU(unsigned long, local_per_cpu_offset);
50
51#endif /* !__ASSEMBLY__ */
52
53#endif /* _ASM_IA64_PERCPU_H */
arch/ia64/include/asm/pgalloc.h+0−64
@@ -1,64 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PGALLOC_H
3#define _ASM_IA64_PGALLOC_H
4
5/*
6 * This file contains the functions and defines necessary to allocate
7 * page tables.
8 *
9 * This hopefully works with any (fixed) ia-64 page-size, as defined
10 * in <asm/page.h> (currently 8192).
11 *
12 * Copyright (C) 1998-2001 Hewlett-Packard Co
13 * David Mosberger-Tang <davidm@hpl.hp.com>
14 * Copyright (C) 2000, Goutham Rao <goutham.rao@intel.com>
15 */
16
17
18#include <linux/compiler.h>
19#include <linux/mm.h>
20#include <linux/page-flags.h>
21#include <linux/threads.h>
22
23#include <asm-generic/pgalloc.h>
24
25#include <asm/mmu_context.h>
26
27static inline pgd_t *pgd_alloc(struct mm_struct *mm)
28{
29 return (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
30}
31
32#if CONFIG_PGTABLE_LEVELS == 4
33static inline void
34p4d_populate(struct mm_struct *mm, p4d_t * p4d_entry, pud_t * pud)
35{
36 p4d_val(*p4d_entry) = __pa(pud);
37}
38
39#define __pud_free_tlb(tlb, pud, address) pud_free((tlb)->mm, pud)
40#endif /* CONFIG_PGTABLE_LEVELS == 4 */
41
42static inline void
43pud_populate(struct mm_struct *mm, pud_t * pud_entry, pmd_t * pmd)
44{
45 pud_val(*pud_entry) = __pa(pmd);
46}
47
48#define __pmd_free_tlb(tlb, pmd, address) pmd_free((tlb)->mm, pmd)
49
50static inline void
51pmd_populate(struct mm_struct *mm, pmd_t * pmd_entry, pgtable_t pte)
52{
53 pmd_val(*pmd_entry) = page_to_phys(pte);
54}
55
56static inline void
57pmd_populate_kernel(struct mm_struct *mm, pmd_t * pmd_entry, pte_t * pte)
58{
59 pmd_val(*pmd_entry) = __pa(pte);
60}
61
62#define __pte_free_tlb(tlb, pte, address) pte_free((tlb)->mm, pte)
63
64#endif /* _ASM_IA64_PGALLOC_H */
arch/ia64/include/asm/pgtable.h+0−545
@@ -1,545 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PGTABLE_H
3#define _ASM_IA64_PGTABLE_H
4
5/*
6 * This file contains the functions and defines necessary to modify and use
7 * the IA-64 page table tree.
8 *
9 * This hopefully works with any (fixed) IA-64 page-size, as defined
10 * in <asm/page.h>.
11 *
12 * Copyright (C) 1998-2005 Hewlett-Packard Co
13 * David Mosberger-Tang <davidm@hpl.hp.com>
14 */
15
16
17#include <asm/mman.h>
18#include <asm/page.h>
19#include <asm/processor.h>
20#include <asm/types.h>
21
22#define IA64_MAX_PHYS_BITS 50 /* max. number of physical address bits (architected) */
23
24/*
25 * First, define the various bits in a PTE. Note that the PTE format
26 * matches the VHPT short format, the firt doubleword of the VHPD long
27 * format, and the first doubleword of the TLB insertion format.
28 */
29#define _PAGE_P_BIT 0
30#define _PAGE_A_BIT 5
31#define _PAGE_D_BIT 6
32
33#define _PAGE_P (1 << _PAGE_P_BIT) /* page present bit */
34#define _PAGE_MA_WB (0x0 << 2) /* write back memory attribute */
35#define _PAGE_MA_UC (0x4 << 2) /* uncacheable memory attribute */
36#define _PAGE_MA_UCE (0x5 << 2) /* UC exported attribute */
37#define _PAGE_MA_WC (0x6 << 2) /* write coalescing memory attribute */
38#define _PAGE_MA_NAT (0x7 << 2) /* not-a-thing attribute */
39#define _PAGE_MA_MASK (0x7 << 2)
40#define _PAGE_PL_0 (0 << 7) /* privilege level 0 (kernel) */
41#define _PAGE_PL_1 (1 << 7) /* privilege level 1 (unused) */
42#define _PAGE_PL_2 (2 << 7) /* privilege level 2 (unused) */
43#define _PAGE_PL_3 (3 << 7) /* privilege level 3 (user) */
44#define _PAGE_PL_MASK (3 << 7)
45#define _PAGE_AR_R (0 << 9) /* read only */
46#define _PAGE_AR_RX (1 << 9) /* read & execute */
47#define _PAGE_AR_RW (2 << 9) /* read & write */
48#define _PAGE_AR_RWX (3 << 9) /* read, write & execute */
49#define _PAGE_AR_R_RW (4 << 9) /* read / read & write */
50#define _PAGE_AR_RX_RWX (5 << 9) /* read & exec / read, write & exec */
51#define _PAGE_AR_RWX_RW (6 << 9) /* read, write & exec / read & write */
52#define _PAGE_AR_X_RX (7 << 9) /* exec & promote / read & exec */
53#define _PAGE_AR_MASK (7 << 9)
54#define _PAGE_AR_SHIFT 9
55#define _PAGE_A (1 << _PAGE_A_BIT) /* page accessed bit */
56#define _PAGE_D (1 << _PAGE_D_BIT) /* page dirty bit */
57#define _PAGE_PPN_MASK (((__IA64_UL(1) << IA64_MAX_PHYS_BITS) - 1) & ~0xfffUL)
58#define _PAGE_ED (__IA64_UL(1) << 52) /* exception deferral */
59#define _PAGE_PROTNONE (__IA64_UL(1) << 63)
60
61/* We borrow bit 7 to store the exclusive marker in swap PTEs. */
62#define _PAGE_SWP_EXCLUSIVE (1 << 7)
63
64#define _PFN_MASK _PAGE_PPN_MASK
65/* Mask of bits which may be changed by pte_modify(); the odd bits are there for _PAGE_PROTNONE */
66#define _PAGE_CHG_MASK (_PAGE_P | _PAGE_PROTNONE | _PAGE_PL_MASK | _PAGE_AR_MASK | _PAGE_ED)
67
68#define _PAGE_SIZE_4K 12
69#define _PAGE_SIZE_8K 13
70#define _PAGE_SIZE_16K 14
71#define _PAGE_SIZE_64K 16
72#define _PAGE_SIZE_256K 18
73#define _PAGE_SIZE_1M 20
74#define _PAGE_SIZE_4M 22
75#define _PAGE_SIZE_16M 24
76#define _PAGE_SIZE_64M 26
77#define _PAGE_SIZE_256M 28
78#define _PAGE_SIZE_1G 30
79#define _PAGE_SIZE_4G 32
80
81#define __ACCESS_BITS _PAGE_ED | _PAGE_A | _PAGE_P | _PAGE_MA_WB
82#define __DIRTY_BITS_NO_ED _PAGE_A | _PAGE_P | _PAGE_D | _PAGE_MA_WB
83#define __DIRTY_BITS _PAGE_ED | __DIRTY_BITS_NO_ED
84
85/*
86 * How many pointers will a page table level hold expressed in shift
87 */
88#define PTRS_PER_PTD_SHIFT (PAGE_SHIFT-3)
89
90/*
91 * Definitions for fourth level:
92 */
93#define PTRS_PER_PTE (__IA64_UL(1) << (PTRS_PER_PTD_SHIFT))
94
95/*
96 * Definitions for third level:
97 *
98 * PMD_SHIFT determines the size of the area a third-level page table
99 * can map.
100 */
101#define PMD_SHIFT (PAGE_SHIFT + (PTRS_PER_PTD_SHIFT))
102#define PMD_SIZE (1UL << PMD_SHIFT)
103#define PMD_MASK (~(PMD_SIZE-1))
104#define PTRS_PER_PMD (1UL << (PTRS_PER_PTD_SHIFT))
105
106#if CONFIG_PGTABLE_LEVELS == 4
107/*
108 * Definitions for second level:
109 *
110 * PUD_SHIFT determines the size of the area a second-level page table
111 * can map.
112 */
113#define PUD_SHIFT (PMD_SHIFT + (PTRS_PER_PTD_SHIFT))
114#define PUD_SIZE (1UL << PUD_SHIFT)
115#define PUD_MASK (~(PUD_SIZE-1))
116#define PTRS_PER_PUD (1UL << (PTRS_PER_PTD_SHIFT))
117#endif
118
119/*
120 * Definitions for first level:
121 *
122 * PGDIR_SHIFT determines what a first-level page table entry can map.
123 */
124#if CONFIG_PGTABLE_LEVELS == 4
125#define PGDIR_SHIFT (PUD_SHIFT + (PTRS_PER_PTD_SHIFT))
126#else
127#define PGDIR_SHIFT (PMD_SHIFT + (PTRS_PER_PTD_SHIFT))
128#endif
129#define PGDIR_SIZE (__IA64_UL(1) << PGDIR_SHIFT)
130#define PGDIR_MASK (~(PGDIR_SIZE-1))
131#define PTRS_PER_PGD_SHIFT PTRS_PER_PTD_SHIFT
132#define PTRS_PER_PGD (1UL << PTRS_PER_PGD_SHIFT)
133#define USER_PTRS_PER_PGD (5*PTRS_PER_PGD/8) /* regions 0-4 are user regions */
134
135/*
136 * All the normal masks have the "page accessed" bits on, as any time
137 * they are used, the page is accessed. They are cleared only by the
138 * page-out routines.
139 */
140#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_A)
141#define PAGE_SHARED __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RW)
142#define PAGE_READONLY __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R)
143#define PAGE_COPY __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_R)
144#define PAGE_COPY_EXEC __pgprot(__ACCESS_BITS | _PAGE_PL_3 | _PAGE_AR_RX)
145#define PAGE_GATE __pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_X_RX)
146#define PAGE_KERNEL __pgprot(__DIRTY_BITS | _PAGE_PL_0 | _PAGE_AR_RWX)
147#define PAGE_KERNELRX __pgprot(__ACCESS_BITS | _PAGE_PL_0 | _PAGE_AR_RX)
148#define PAGE_KERNEL_UC __pgprot(__DIRTY_BITS | _PAGE_PL_0 | _PAGE_AR_RWX | \
149 _PAGE_MA_UC)
150
151# ifndef __ASSEMBLY__
152
153#include <linux/sched/mm.h> /* for mm_struct */
154#include <linux/bitops.h>
155#include <asm/cacheflush.h>
156#include <asm/mmu_context.h>
157
158/*
159 * Next come the mappings that determine how mmap() protection bits
160 * (PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE) get implemented. The
161 * _P version gets used for a private shared memory segment, the _S
162 * version gets used for a shared memory segment with MAP_SHARED on.
163 * In a private shared memory segment, we do a copy-on-write if a task
164 * attempts to write to the page.
165 */
166 /* xwr */
167#define pgd_ERROR(e) printk("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e))
168#if CONFIG_PGTABLE_LEVELS == 4
169#define pud_ERROR(e) printk("%s:%d: bad pud %016lx.\n", __FILE__, __LINE__, pud_val(e))
170#endif
171#define pmd_ERROR(e) printk("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e))
172#define pte_ERROR(e) printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
173
174
175/*
176 * Some definitions to translate between mem_map, PTEs, and page addresses:
177 */
178
179
180/* Quick test to see if ADDR is a (potentially) valid physical address. */
181static inline long
182ia64_phys_addr_valid (unsigned long addr)
183{
184 return (addr & (local_cpu_data->unimpl_pa_mask)) == 0;
185}
186
187/*
188 * Now come the defines and routines to manage and access the three-level
189 * page table.
190 */
191
192
193#define VMALLOC_START (RGN_BASE(RGN_GATE) + 0x200000000UL)
194#if defined(CONFIG_SPARSEMEM) && defined(CONFIG_SPARSEMEM_VMEMMAP)
195/* SPARSEMEM_VMEMMAP uses half of vmalloc... */
196# define VMALLOC_END (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 10)))
197# define vmemmap ((struct page *)VMALLOC_END)
198#else
199# define VMALLOC_END (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 9)))
200#endif
201
202/* fs/proc/kcore.c */
203#define kc_vaddr_to_offset(v) ((v) - RGN_BASE(RGN_GATE))
204#define kc_offset_to_vaddr(o) ((o) + RGN_BASE(RGN_GATE))
205
206#define RGN_MAP_SHIFT (PGDIR_SHIFT + PTRS_PER_PGD_SHIFT - 3)
207#define RGN_MAP_LIMIT ((1UL << RGN_MAP_SHIFT) - PAGE_SIZE) /* per region addr limit */
208
209#define PFN_PTE_SHIFT PAGE_SHIFT
210/*
211 * Conversion functions: convert page frame number (pfn) and a protection value to a page
212 * table entry (pte).
213 */
214#define pfn_pte(pfn, pgprot) \
215({ pte_t __pte; pte_val(__pte) = ((pfn) << PAGE_SHIFT) | pgprot_val(pgprot); __pte; })
216
217/* Extract pfn from pte. */
218#define pte_pfn(_pte) ((pte_val(_pte) & _PFN_MASK) >> PAGE_SHIFT)
219
220#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
221
222/* This takes a physical page address that is used by the remapping functions */
223#define mk_pte_phys(physpage, pgprot) \
224({ pte_t __pte; pte_val(__pte) = physpage + pgprot_val(pgprot); __pte; })
225
226#define pte_modify(_pte, newprot) \
227 (__pte((pte_val(_pte) & ~_PAGE_CHG_MASK) | (pgprot_val(newprot) & _PAGE_CHG_MASK)))
228
229#define pte_none(pte) (!pte_val(pte))
230#define pte_present(pte) (pte_val(pte) & (_PAGE_P | _PAGE_PROTNONE))
231#define pte_clear(mm,addr,pte) (pte_val(*(pte)) = 0UL)
232/* pte_page() returns the "struct page *" corresponding to the PTE: */
233#define pte_page(pte) virt_to_page(((pte_val(pte) & _PFN_MASK) + PAGE_OFFSET))
234
235#define pmd_none(pmd) (!pmd_val(pmd))
236#define pmd_bad(pmd) (!ia64_phys_addr_valid(pmd_val(pmd)))
237#define pmd_present(pmd) (pmd_val(pmd) != 0UL)
238#define pmd_clear(pmdp) (pmd_val(*(pmdp)) = 0UL)
239#define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val(pmd) & _PFN_MASK))
240#define pmd_pfn(pmd) ((pmd_val(pmd) & _PFN_MASK) >> PAGE_SHIFT)
241#define pmd_page(pmd) virt_to_page((pmd_val(pmd) + PAGE_OFFSET))
242
243#define pud_none(pud) (!pud_val(pud))
244#define pud_bad(pud) (!ia64_phys_addr_valid(pud_val(pud)))
245#define pud_present(pud) (pud_val(pud) != 0UL)
246#define pud_clear(pudp) (pud_val(*(pudp)) = 0UL)
247#define pud_pgtable(pud) ((pmd_t *) __va(pud_val(pud) & _PFN_MASK))
248#define pud_page(pud) virt_to_page((pud_val(pud) + PAGE_OFFSET))
249
250#if CONFIG_PGTABLE_LEVELS == 4
251#define p4d_none(p4d) (!p4d_val(p4d))
252#define p4d_bad(p4d) (!ia64_phys_addr_valid(p4d_val(p4d)))
253#define p4d_present(p4d) (p4d_val(p4d) != 0UL)
254#define p4d_clear(p4dp) (p4d_val(*(p4dp)) = 0UL)
255#define p4d_pgtable(p4d) ((pud_t *) __va(p4d_val(p4d) & _PFN_MASK))
256#define p4d_page(p4d) virt_to_page((p4d_val(p4d) + PAGE_OFFSET))
257#endif
258
259/*
260 * The following have defined behavior only work if pte_present() is true.
261 */
262#define pte_write(pte) ((unsigned) (((pte_val(pte) & _PAGE_AR_MASK) >> _PAGE_AR_SHIFT) - 2) <= 4)
263#define pte_exec(pte) ((pte_val(pte) & _PAGE_AR_RX) != 0)
264#define pte_dirty(pte) ((pte_val(pte) & _PAGE_D) != 0)
265#define pte_young(pte) ((pte_val(pte) & _PAGE_A) != 0)
266
267/*
268 * Note: we convert AR_RWX to AR_RX and AR_RW to AR_R by clearing the 2nd bit in the
269 * access rights:
270 */
271#define pte_wrprotect(pte) (__pte(pte_val(pte) & ~_PAGE_AR_RW))
272#define pte_mkwrite_novma(pte) (__pte(pte_val(pte) | _PAGE_AR_RW))
273#define pte_mkold(pte) (__pte(pte_val(pte) & ~_PAGE_A))
274#define pte_mkyoung(pte) (__pte(pte_val(pte) | _PAGE_A))
275#define pte_mkclean(pte) (__pte(pte_val(pte) & ~_PAGE_D))
276#define pte_mkdirty(pte) (__pte(pte_val(pte) | _PAGE_D))
277#define pte_mkhuge(pte) (__pte(pte_val(pte)))
278
279/*
280 * Because ia64's Icache and Dcache is not coherent (on a cpu), we need to
281 * sync icache and dcache when we insert *new* executable page.
282 * __ia64_sync_icache_dcache() check Pg_arch_1 bit and flush icache
283 * if necessary.
284 *
285 * set_pte() is also called by the kernel, but we can expect that the kernel
286 * flushes icache explicitly if necessary.
287 */
288#define pte_present_exec_user(pte)\
289 ((pte_val(pte) & (_PAGE_P | _PAGE_PL_MASK | _PAGE_AR_RX)) == \
290 (_PAGE_P | _PAGE_PL_3 | _PAGE_AR_RX))
291
292extern void __ia64_sync_icache_dcache(pte_t pteval);
293static inline void set_pte(pte_t *ptep, pte_t pteval)
294{
295 /* page is present && page is user && page is executable
296 * && (page swapin or new page or page migration
297 * || copy_on_write with page copying.)
298 */
299 if (pte_present_exec_user(pteval) &&
300 (!pte_present(*ptep) ||
301 pte_pfn(*ptep) != pte_pfn(pteval)))
302 /* load_module() calles flush_icache_range() explicitly*/
303 __ia64_sync_icache_dcache(pteval);
304 *ptep = pteval;
305}
306
307/*
308 * Make page protection values cacheable, uncacheable, or write-
309 * combining. Note that "protection" is really a misnomer here as the
310 * protection value contains the memory attribute bits, dirty bits, and
311 * various other bits as well.
312 */
313#define pgprot_cacheable(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_WB)
314#define pgprot_noncached(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_UC)
315#define pgprot_writecombine(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_WC)
316
317struct file;
318extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
319 unsigned long size, pgprot_t vma_prot);
320#define __HAVE_PHYS_MEM_ACCESS_PROT
321
322static inline unsigned long
323pgd_index (unsigned long address)
324{
325 unsigned long region = address >> 61;
326 unsigned long l1index = (address >> PGDIR_SHIFT) & ((PTRS_PER_PGD >> 3) - 1);
327
328 return (region << (PAGE_SHIFT - 6)) | l1index;
329}
330#define pgd_index pgd_index
331
332/*
333 * In the kernel's mapped region we know everything is in region number 5, so
334 * as an optimisation its PGD already points to the area for that region.
335 * However, this also means that we cannot use pgd_index() and we must
336 * never add the region here.
337 */
338#define pgd_offset_k(addr) \
339 (init_mm.pgd + (((addr) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)))
340
341/* Look up a pgd entry in the gate area. On IA-64, the gate-area
342 resides in the kernel-mapped segment, hence we use pgd_offset_k()
343 here. */
344#define pgd_offset_gate(mm, addr) pgd_offset_k(addr)
345
346/* atomic versions of the some PTE manipulations: */
347
348static inline int
349ptep_test_and_clear_young (struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
350{
351#ifdef CONFIG_SMP
352 if (!pte_young(*ptep))
353 return 0;
354 return test_and_clear_bit(_PAGE_A_BIT, ptep);
355#else
356 pte_t pte = *ptep;
357 if (!pte_young(pte))
358 return 0;
359 set_pte_at(vma->vm_mm, addr, ptep, pte_mkold(pte));
360 return 1;
361#endif
362}
363
364static inline pte_t
365ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
366{
367#ifdef CONFIG_SMP
368 return __pte(xchg((long *) ptep, 0));
369#else
370 pte_t pte = *ptep;
371 pte_clear(mm, addr, ptep);
372 return pte;
373#endif
374}
375
376static inline void
377ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
378{
379#ifdef CONFIG_SMP
380 unsigned long new, old;
381
382 do {
383 old = pte_val(*ptep);
384 new = pte_val(pte_wrprotect(__pte (old)));
385 } while (cmpxchg((unsigned long *) ptep, old, new) != old);
386#else
387 pte_t old_pte = *ptep;
388 set_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
389#endif
390}
391
392static inline int
393pte_same (pte_t a, pte_t b)
394{
395 return pte_val(a) == pte_val(b);
396}
397
398#define update_mmu_cache_range(vmf, vma, address, ptep, nr) do { } while (0)
399#define update_mmu_cache(vma, address, ptep) do { } while (0)
400
401extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
402extern void paging_init (void);
403
404/*
405 * Encode/decode swap entries and swap PTEs. Swap PTEs are all PTEs that
406 * are !pte_none() && !pte_present().
407 *
408 * Note: The macros below rely on the fact that MAX_SWAPFILES_SHIFT <= number of
409 * bits in the swap-type field of the swap pte. It would be nice to
410 * enforce that, but we can't easily include <linux/swap.h> here.
411 * (Of course, better still would be to define MAX_SWAPFILES_SHIFT here...).
412 *
413 * Format of swap pte:
414 * bit 0 : present bit (must be zero)
415 * bits 1- 6: swap type
416 * bit 7 : exclusive marker
417 * bits 8-62: swap offset
418 * bit 63 : _PAGE_PROTNONE bit
419 */
420#define __swp_type(entry) (((entry).val >> 1) & 0x3f)
421#define __swp_offset(entry) (((entry).val << 1) >> 9)
422#define __swp_entry(type, offset) ((swp_entry_t) { ((type & 0x3f) << 1) | \
423 ((long) (offset) << 8) })
424#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
425#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
426
427static inline int pte_swp_exclusive(pte_t pte)
428{
429 return pte_val(pte) & _PAGE_SWP_EXCLUSIVE;
430}
431
432static inline pte_t pte_swp_mkexclusive(pte_t pte)
433{
434 pte_val(pte) |= _PAGE_SWP_EXCLUSIVE;
435 return pte;
436}
437
438static inline pte_t pte_swp_clear_exclusive(pte_t pte)
439{
440 pte_val(pte) &= ~_PAGE_SWP_EXCLUSIVE;
441 return pte;
442}
443
444/*
445 * ZERO_PAGE is a global shared page that is always zero: used
446 * for zero-mapped memory areas etc..
447 */
448extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
449extern struct page *zero_page_memmap_ptr;
450#define ZERO_PAGE(vaddr) (zero_page_memmap_ptr)
451
452/* We provide our own get_unmapped_area to cope with VA holes for userland */
453#define HAVE_ARCH_UNMAPPED_AREA
454
455#ifdef CONFIG_HUGETLB_PAGE
456#define HUGETLB_PGDIR_SHIFT (HPAGE_SHIFT + 2*(PAGE_SHIFT-3))
457#define HUGETLB_PGDIR_SIZE (__IA64_UL(1) << HUGETLB_PGDIR_SHIFT)
458#define HUGETLB_PGDIR_MASK (~(HUGETLB_PGDIR_SIZE-1))
459#endif
460
461
462#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
463/*
464 * Update PTEP with ENTRY, which is guaranteed to be a less
465 * restrictive PTE. That is, ENTRY may have the ACCESSED, DIRTY, and
466 * WRITABLE bits turned on, when the value at PTEP did not. The
467 * WRITABLE bit may only be turned if SAFELY_WRITABLE is TRUE.
468 *
469 * SAFELY_WRITABLE is TRUE if we can update the value at PTEP without
470 * having to worry about races. On SMP machines, there are only two
471 * cases where this is true:
472 *
473 * (1) *PTEP has the PRESENT bit turned OFF
474 * (2) ENTRY has the DIRTY bit turned ON
475 *
476 * On ia64, we could implement this routine with a cmpxchg()-loop
477 * which ORs in the _PAGE_A/_PAGE_D bit if they're set in ENTRY.
478 * However, like on x86, we can get a more streamlined version by
479 * observing that it is OK to drop ACCESSED bit updates when
480 * SAFELY_WRITABLE is FALSE. Besides being rare, all that would do is
481 * result in an extra Access-bit fault, which would then turn on the
482 * ACCESSED bit in the low-level fault handler (iaccess_bit or
483 * daccess_bit in ivt.S).
484 */
485#ifdef CONFIG_SMP
486# define ptep_set_access_flags(__vma, __addr, __ptep, __entry, __safely_writable) \
487({ \
488 int __changed = !pte_same(*(__ptep), __entry); \
489 if (__changed && __safely_writable) { \
490 set_pte(__ptep, __entry); \
491 flush_tlb_page(__vma, __addr); \
492 } \
493 __changed; \
494})
495#else
496# define ptep_set_access_flags(__vma, __addr, __ptep, __entry, __safely_writable) \
497({ \
498 int __changed = !pte_same(*(__ptep), __entry); \
499 if (__changed) { \
500 set_pte_at((__vma)->vm_mm, (__addr), __ptep, __entry); \
501 flush_tlb_page(__vma, __addr); \
502 } \
503 __changed; \
504})
505#endif
506# endif /* !__ASSEMBLY__ */
507
508/*
509 * Identity-mapped regions use a large page size. We'll call such large pages
510 * "granules". If you can think of a better name that's unambiguous, let me
511 * know...
512 */
513#if defined(CONFIG_IA64_GRANULE_64MB)
514# define IA64_GRANULE_SHIFT _PAGE_SIZE_64M
515#elif defined(CONFIG_IA64_GRANULE_16MB)
516# define IA64_GRANULE_SHIFT _PAGE_SIZE_16M
517#endif
518#define IA64_GRANULE_SIZE (1 << IA64_GRANULE_SHIFT)
519/*
520 * log2() of the page size we use to map the kernel image (IA64_TR_KERNEL):
521 */
522#define KERNEL_TR_PAGE_SHIFT _PAGE_SIZE_64M
523#define KERNEL_TR_PAGE_SIZE (1 << KERNEL_TR_PAGE_SHIFT)
524
525/* These tell get_user_pages() that the first gate page is accessible from user-level. */
526#define FIXADDR_USER_START GATE_ADDR
527#ifdef HAVE_BUGGY_SEGREL
528# define FIXADDR_USER_END (GATE_ADDR + 2*PAGE_SIZE)
529#else
530# define FIXADDR_USER_END (GATE_ADDR + 2*PERCPU_PAGE_SIZE)
531#endif
532
533#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
534#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
535#define __HAVE_ARCH_PTEP_SET_WRPROTECT
536#define __HAVE_ARCH_PTE_SAME
537#define __HAVE_ARCH_PGD_OFFSET_GATE
538
539
540#if CONFIG_PGTABLE_LEVELS == 3
541#include <asm-generic/pgtable-nopud.h>
542#endif
543#include <asm-generic/pgtable-nop4d.h>
544
545#endif /* _ASM_IA64_PGTABLE_H */
arch/ia64/include/asm/processor.h+0−660
@@ -1,660 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_PROCESSOR_H
3#define _ASM_IA64_PROCESSOR_H
4
5/*
6 * Copyright (C) 1998-2004 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 * Stephane Eranian <eranian@hpl.hp.com>
9 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
10 * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
11 *
12 * 11/24/98 S.Eranian added ia64_set_iva()
13 * 12/03/99 D. Mosberger implement thread_saved_pc() via kernel unwind API
14 * 06/16/00 A. Mallick added csd/ssd/tssd for ia32 support
15 */
16
17
18#include <asm/intrinsics.h>
19#include <asm/kregs.h>
20#include <asm/ptrace.h>
21#include <asm/ustack.h>
22
23#define IA64_NUM_PHYS_STACK_REG 96
24#define IA64_NUM_DBG_REGS 8
25
26#define DEFAULT_MAP_BASE __IA64_UL_CONST(0x2000000000000000)
27#define DEFAULT_TASK_SIZE __IA64_UL_CONST(0xa000000000000000)
28
29/*
30 * TASK_SIZE really is a mis-named. It really is the maximum user
31 * space address (plus one). On IA-64, there are five regions of 2TB
32 * each (assuming 8KB page size), for a total of 8TB of user virtual
33 * address space.
34 */
35#define TASK_SIZE DEFAULT_TASK_SIZE
36
37/*
38 * This decides where the kernel will search for a free chunk of vm
39 * space during mmap's.
40 */
41#define TASK_UNMAPPED_BASE (current->thread.map_base)
42
43#define IA64_THREAD_FPH_VALID (__IA64_UL(1) << 0) /* floating-point high state valid? */
44#define IA64_THREAD_DBG_VALID (__IA64_UL(1) << 1) /* debug registers valid? */
45#define IA64_THREAD_PM_VALID (__IA64_UL(1) << 2) /* performance registers valid? */
46#define IA64_THREAD_UAC_NOPRINT (__IA64_UL(1) << 3) /* don't log unaligned accesses */
47#define IA64_THREAD_UAC_SIGBUS (__IA64_UL(1) << 4) /* generate SIGBUS on unaligned acc. */
48#define IA64_THREAD_MIGRATION (__IA64_UL(1) << 5) /* require migration
49 sync at ctx sw */
50#define IA64_THREAD_FPEMU_NOPRINT (__IA64_UL(1) << 6) /* don't log any fpswa faults */
51#define IA64_THREAD_FPEMU_SIGFPE (__IA64_UL(1) << 7) /* send a SIGFPE for fpswa faults */
52
53#define IA64_THREAD_UAC_SHIFT 3
54#define IA64_THREAD_UAC_MASK (IA64_THREAD_UAC_NOPRINT | IA64_THREAD_UAC_SIGBUS)
55#define IA64_THREAD_FPEMU_SHIFT 6
56#define IA64_THREAD_FPEMU_MASK (IA64_THREAD_FPEMU_NOPRINT | IA64_THREAD_FPEMU_SIGFPE)
57
58
59/*
60 * This shift should be large enough to be able to represent 1000000000/itc_freq with good
61 * accuracy while being small enough to fit 10*1000000000<<IA64_NSEC_PER_CYC_SHIFT in 64 bits
62 * (this will give enough slack to represent 10 seconds worth of time as a scaled number).
63 */
64#define IA64_NSEC_PER_CYC_SHIFT 30
65
66#ifndef __ASSEMBLY__
67
68#include <linux/cache.h>
69#include <linux/compiler.h>
70#include <linux/threads.h>
71#include <linux/types.h>
72#include <linux/bitops.h>
73
74#include <asm/fpu.h>
75#include <asm/page.h>
76#include <asm/percpu.h>
77#include <asm/rse.h>
78#include <asm/unwind.h>
79#include <linux/atomic.h>
80#ifdef CONFIG_NUMA
81#include <asm/nodedata.h>
82#endif
83
84/* like above but expressed as bitfields for more efficient access: */
85struct ia64_psr {
86 __u64 reserved0 : 1;
87 __u64 be : 1;
88 __u64 up : 1;
89 __u64 ac : 1;
90 __u64 mfl : 1;
91 __u64 mfh : 1;
92 __u64 reserved1 : 7;
93 __u64 ic : 1;
94 __u64 i : 1;
95 __u64 pk : 1;
96 __u64 reserved2 : 1;
97 __u64 dt : 1;
98 __u64 dfl : 1;
99 __u64 dfh : 1;
100 __u64 sp : 1;
101 __u64 pp : 1;
102 __u64 di : 1;
103 __u64 si : 1;
104 __u64 db : 1;
105 __u64 lp : 1;
106 __u64 tb : 1;
107 __u64 rt : 1;
108 __u64 reserved3 : 4;
109 __u64 cpl : 2;
110 __u64 is : 1;
111 __u64 mc : 1;
112 __u64 it : 1;
113 __u64 id : 1;
114 __u64 da : 1;
115 __u64 dd : 1;
116 __u64 ss : 1;
117 __u64 ri : 2;
118 __u64 ed : 1;
119 __u64 bn : 1;
120 __u64 reserved4 : 19;
121};
122
123union ia64_isr {
124 __u64 val;
125 struct {
126 __u64 code : 16;
127 __u64 vector : 8;
128 __u64 reserved1 : 8;
129 __u64 x : 1;
130 __u64 w : 1;
131 __u64 r : 1;
132 __u64 na : 1;
133 __u64 sp : 1;
134 __u64 rs : 1;
135 __u64 ir : 1;
136 __u64 ni : 1;
137 __u64 so : 1;
138 __u64 ei : 2;
139 __u64 ed : 1;
140 __u64 reserved2 : 20;
141 };
142};
143
144union ia64_lid {
145 __u64 val;
146 struct {
147 __u64 rv : 16;
148 __u64 eid : 8;
149 __u64 id : 8;
150 __u64 ig : 32;
151 };
152};
153
154union ia64_tpr {
155 __u64 val;
156 struct {
157 __u64 ig0 : 4;
158 __u64 mic : 4;
159 __u64 rsv : 8;
160 __u64 mmi : 1;
161 __u64 ig1 : 47;
162 };
163};
164
165union ia64_itir {
166 __u64 val;
167 struct {
168 __u64 rv3 : 2; /* 0-1 */
169 __u64 ps : 6; /* 2-7 */
170 __u64 key : 24; /* 8-31 */
171 __u64 rv4 : 32; /* 32-63 */
172 };
173};
174
175union ia64_rr {
176 __u64 val;
177 struct {
178 __u64 ve : 1; /* enable hw walker */
179 __u64 reserved0: 1; /* reserved */
180 __u64 ps : 6; /* log page size */
181 __u64 rid : 24; /* region id */
182 __u64 reserved1: 32; /* reserved */
183 };
184};
185
186/*
187 * CPU type, hardware bug flags, and per-CPU state. Frequently used
188 * state comes earlier:
189 */
190struct cpuinfo_ia64 {
191 unsigned int softirq_pending;
192 unsigned long itm_delta; /* # of clock cycles between clock ticks */
193 unsigned long itm_next; /* interval timer mask value to use for next clock tick */
194 unsigned long nsec_per_cyc; /* (1000000000<<IA64_NSEC_PER_CYC_SHIFT)/itc_freq */
195 unsigned long unimpl_va_mask; /* mask of unimplemented virtual address bits (from PAL) */
196 unsigned long unimpl_pa_mask; /* mask of unimplemented physical address bits (from PAL) */
197 unsigned long itc_freq; /* frequency of ITC counter */
198 unsigned long proc_freq; /* frequency of processor */
199 unsigned long cyc_per_usec; /* itc_freq/1000000 */
200 unsigned long ptce_base;
201 unsigned int ptce_count[2];
202 unsigned int ptce_stride[2];
203 struct task_struct *ksoftirqd; /* kernel softirq daemon for this CPU */
204
205#ifdef CONFIG_SMP
206 unsigned long loops_per_jiffy;
207 int cpu;
208 unsigned int socket_id; /* physical processor socket id */
209 unsigned short core_id; /* core id */
210 unsigned short thread_id; /* thread id */
211 unsigned short num_log; /* Total number of logical processors on
212 * this socket that were successfully booted */
213 unsigned char cores_per_socket; /* Cores per processor socket */
214 unsigned char threads_per_core; /* Threads per core */
215#endif
216
217 /* CPUID-derived information: */
218 unsigned long ppn;
219 unsigned long features;
220 unsigned char number;
221 unsigned char revision;
222 unsigned char model;
223 unsigned char family;
224 unsigned char archrev;
225 char vendor[16];
226 char *model_name;
227
228#ifdef CONFIG_NUMA
229 struct ia64_node_data *node_data;
230#endif
231};
232
233DECLARE_PER_CPU(struct cpuinfo_ia64, ia64_cpu_info);
234
235/*
236 * The "local" data variable. It refers to the per-CPU data of the currently executing
237 * CPU, much like "current" points to the per-task data of the currently executing task.
238 * Do not use the address of local_cpu_data, since it will be different from
239 * cpu_data(smp_processor_id())!
240 */
241#define local_cpu_data (&__ia64_per_cpu_var(ia64_cpu_info))
242#define cpu_data(cpu) (&per_cpu(ia64_cpu_info, cpu))
243
244extern void print_cpu_info (struct cpuinfo_ia64 *);
245
246#define SET_UNALIGN_CTL(task,value) \
247({ \
248 (task)->thread.flags = (((task)->thread.flags & ~IA64_THREAD_UAC_MASK) \
249 | (((value) << IA64_THREAD_UAC_SHIFT) & IA64_THREAD_UAC_MASK)); \
250 0; \
251})
252#define GET_UNALIGN_CTL(task,addr) \
253({ \
254 put_user(((task)->thread.flags & IA64_THREAD_UAC_MASK) >> IA64_THREAD_UAC_SHIFT, \
255 (int __user *) (addr)); \
256})
257
258#define SET_FPEMU_CTL(task,value) \
259({ \
260 (task)->thread.flags = (((task)->thread.flags & ~IA64_THREAD_FPEMU_MASK) \
261 | (((value) << IA64_THREAD_FPEMU_SHIFT) & IA64_THREAD_FPEMU_MASK)); \
262 0; \
263})
264#define GET_FPEMU_CTL(task,addr) \
265({ \
266 put_user(((task)->thread.flags & IA64_THREAD_FPEMU_MASK) >> IA64_THREAD_FPEMU_SHIFT, \
267 (int __user *) (addr)); \
268})
269
270struct thread_struct {
271 __u32 flags; /* various thread flags (see IA64_THREAD_*) */
272 /* writing on_ustack is performance-critical, so it's worth spending 8 bits on it... */
273 __u8 on_ustack; /* executing on user-stacks? */
274 __u8 pad[3];
275 __u64 ksp; /* kernel stack pointer */
276 __u64 map_base; /* base address for get_unmapped_area() */
277 __u64 rbs_bot; /* the base address for the RBS */
278 int last_fph_cpu; /* CPU that may hold the contents of f32-f127 */
279 unsigned long dbr[IA64_NUM_DBG_REGS];
280 unsigned long ibr[IA64_NUM_DBG_REGS];
281 struct ia64_fpreg fph[96]; /* saved/loaded on demand */
282};
283
284#define INIT_THREAD { \
285 .flags = 0, \
286 .on_ustack = 0, \
287 .ksp = 0, \
288 .map_base = DEFAULT_MAP_BASE, \
289 .rbs_bot = STACK_TOP - DEFAULT_USER_STACK_SIZE, \
290 .last_fph_cpu = -1, \
291 .dbr = {0, }, \
292 .ibr = {0, }, \
293 .fph = {{{{0}}}, } \
294}
295
296#define start_thread(regs,new_ip,new_sp) do { \
297 regs->cr_ipsr = ((regs->cr_ipsr | (IA64_PSR_BITS_TO_SET | IA64_PSR_CPL)) \
298 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_RI | IA64_PSR_IS)); \
299 regs->cr_iip = new_ip; \
300 regs->ar_rsc = 0xf; /* eager mode, privilege level 3 */ \
301 regs->ar_rnat = 0; \
302 regs->ar_bspstore = current->thread.rbs_bot; \
303 regs->ar_fpsr = FPSR_DEFAULT; \
304 regs->loadrs = 0; \
305 regs->r8 = get_dumpable(current->mm); /* set "don't zap registers" flag */ \
306 regs->r12 = new_sp - 16; /* allocate 16 byte scratch area */ \
307 if (unlikely(get_dumpable(current->mm) != SUID_DUMP_USER)) { \
308 /* \
309 * Zap scratch regs to avoid leaking bits between processes with different \
310 * uid/privileges. \
311 */ \
312 regs->ar_pfs = 0; regs->b0 = 0; regs->pr = 0; \
313 regs->r1 = 0; regs->r9 = 0; regs->r11 = 0; regs->r13 = 0; regs->r15 = 0; \
314 } \
315} while (0)
316
317/* Forward declarations, a strange C thing... */
318struct mm_struct;
319struct task_struct;
320
321/* Get wait channel for task P. */
322extern unsigned long __get_wchan (struct task_struct *p);
323
324/* Return instruction pointer of blocked task TSK. */
325#define KSTK_EIP(tsk) \
326 ({ \
327 struct pt_regs *_regs = task_pt_regs(tsk); \
328 _regs->cr_iip + ia64_psr(_regs)->ri; \
329 })
330
331/* Return stack pointer of blocked task TSK. */
332#define KSTK_ESP(tsk) ((tsk)->thread.ksp)
333
334extern void ia64_getreg_unknown_kr (void);
335extern void ia64_setreg_unknown_kr (void);
336
337#define ia64_get_kr(regnum) \
338({ \
339 unsigned long r = 0; \
340 \
341 switch (regnum) { \
342 case 0: r = ia64_getreg(_IA64_REG_AR_KR0); break; \
343 case 1: r = ia64_getreg(_IA64_REG_AR_KR1); break; \
344 case 2: r = ia64_getreg(_IA64_REG_AR_KR2); break; \
345 case 3: r = ia64_getreg(_IA64_REG_AR_KR3); break; \
346 case 4: r = ia64_getreg(_IA64_REG_AR_KR4); break; \
347 case 5: r = ia64_getreg(_IA64_REG_AR_KR5); break; \
348 case 6: r = ia64_getreg(_IA64_REG_AR_KR6); break; \
349 case 7: r = ia64_getreg(_IA64_REG_AR_KR7); break; \
350 default: ia64_getreg_unknown_kr(); break; \
351 } \
352 r; \
353})
354
355#define ia64_set_kr(regnum, r) \
356({ \
357 switch (regnum) { \
358 case 0: ia64_setreg(_IA64_REG_AR_KR0, r); break; \
359 case 1: ia64_setreg(_IA64_REG_AR_KR1, r); break; \
360 case 2: ia64_setreg(_IA64_REG_AR_KR2, r); break; \
361 case 3: ia64_setreg(_IA64_REG_AR_KR3, r); break; \
362 case 4: ia64_setreg(_IA64_REG_AR_KR4, r); break; \
363 case 5: ia64_setreg(_IA64_REG_AR_KR5, r); break; \
364 case 6: ia64_setreg(_IA64_REG_AR_KR6, r); break; \
365 case 7: ia64_setreg(_IA64_REG_AR_KR7, r); break; \
366 default: ia64_setreg_unknown_kr(); break; \
367 } \
368})
369
370/*
371 * The following three macros can't be inline functions because we don't have struct
372 * task_struct at this point.
373 */
374
375/*
376 * Return TRUE if task T owns the fph partition of the CPU we're running on.
377 * Must be called from code that has preemption disabled.
378 */
379#define ia64_is_local_fpu_owner(t) \
380({ \
381 struct task_struct *__ia64_islfo_task = (t); \
382 (__ia64_islfo_task->thread.last_fph_cpu == smp_processor_id() \
383 && __ia64_islfo_task == (struct task_struct *) ia64_get_kr(IA64_KR_FPU_OWNER)); \
384})
385
386/*
387 * Mark task T as owning the fph partition of the CPU we're running on.
388 * Must be called from code that has preemption disabled.
389 */
390#define ia64_set_local_fpu_owner(t) do { \
391 struct task_struct *__ia64_slfo_task = (t); \
392 __ia64_slfo_task->thread.last_fph_cpu = smp_processor_id(); \
393 ia64_set_kr(IA64_KR_FPU_OWNER, (unsigned long) __ia64_slfo_task); \
394} while (0)
395
396/* Mark the fph partition of task T as being invalid on all CPUs. */
397#define ia64_drop_fpu(t) ((t)->thread.last_fph_cpu = -1)
398
399extern void __ia64_init_fpu (void);
400extern void __ia64_save_fpu (struct ia64_fpreg *fph);
401extern void __ia64_load_fpu (struct ia64_fpreg *fph);
402extern void ia64_save_debug_regs (unsigned long *save_area);
403extern void ia64_load_debug_regs (unsigned long *save_area);
404
405#define ia64_fph_enable() do { ia64_rsm(IA64_PSR_DFH); ia64_srlz_d(); } while (0)
406#define ia64_fph_disable() do { ia64_ssm(IA64_PSR_DFH); ia64_srlz_d(); } while (0)
407
408/* load fp 0.0 into fph */
409static inline void
410ia64_init_fpu (void) {
411 ia64_fph_enable();
412 __ia64_init_fpu();
413 ia64_fph_disable();
414}
415
416/* save f32-f127 at FPH */
417static inline void
418ia64_save_fpu (struct ia64_fpreg *fph) {
419 ia64_fph_enable();
420 __ia64_save_fpu(fph);
421 ia64_fph_disable();
422}
423
424/* load f32-f127 from FPH */
425static inline void
426ia64_load_fpu (struct ia64_fpreg *fph) {
427 ia64_fph_enable();
428 __ia64_load_fpu(fph);
429 ia64_fph_disable();
430}
431
432static inline __u64
433ia64_clear_ic (void)
434{
435 __u64 psr;
436 psr = ia64_getreg(_IA64_REG_PSR);
437 ia64_stop();
438 ia64_rsm(IA64_PSR_I | IA64_PSR_IC);
439 ia64_srlz_i();
440 return psr;
441}
442
443/*
444 * Restore the psr.
445 */
446static inline void
447ia64_set_psr (__u64 psr)
448{
449 ia64_stop();
450 ia64_setreg(_IA64_REG_PSR_L, psr);
451 ia64_srlz_i();
452}
453
454/*
455 * Insert a translation into an instruction and/or data translation
456 * register.
457 */
458static inline void
459ia64_itr (__u64 target_mask, __u64 tr_num,
460 __u64 vmaddr, __u64 pte,
461 __u64 log_page_size)
462{
463 ia64_setreg(_IA64_REG_CR_ITIR, (log_page_size << 2));
464 ia64_setreg(_IA64_REG_CR_IFA, vmaddr);
465 ia64_stop();
466 if (target_mask & 0x1)
467 ia64_itri(tr_num, pte);
468 if (target_mask & 0x2)
469 ia64_itrd(tr_num, pte);
470}
471
472/*
473 * Insert a translation into the instruction and/or data translation
474 * cache.
475 */
476static inline void
477ia64_itc (__u64 target_mask, __u64 vmaddr, __u64 pte,
478 __u64 log_page_size)
479{
480 ia64_setreg(_IA64_REG_CR_ITIR, (log_page_size << 2));
481 ia64_setreg(_IA64_REG_CR_IFA, vmaddr);
482 ia64_stop();
483 /* as per EAS2.6, itc must be the last instruction in an instruction group */
484 if (target_mask & 0x1)
485 ia64_itci(pte);
486 if (target_mask & 0x2)
487 ia64_itcd(pte);
488}
489
490/*
491 * Purge a range of addresses from instruction and/or data translation
492 * register(s).
493 */
494static inline void
495ia64_ptr (__u64 target_mask, __u64 vmaddr, __u64 log_size)
496{
497 if (target_mask & 0x1)
498 ia64_ptri(vmaddr, (log_size << 2));
499 if (target_mask & 0x2)
500 ia64_ptrd(vmaddr, (log_size << 2));
501}
502
503/* Set the interrupt vector address. The address must be suitably aligned (32KB). */
504static inline void
505ia64_set_iva (void *ivt_addr)
506{
507 ia64_setreg(_IA64_REG_CR_IVA, (__u64) ivt_addr);
508 ia64_srlz_i();
509}
510
511/* Set the page table address and control bits. */
512static inline void
513ia64_set_pta (__u64 pta)
514{
515 /* Note: srlz.i implies srlz.d */
516 ia64_setreg(_IA64_REG_CR_PTA, pta);
517 ia64_srlz_i();
518}
519
520static inline void
521ia64_eoi (void)
522{
523 ia64_setreg(_IA64_REG_CR_EOI, 0);
524 ia64_srlz_d();
525}
526
527#define cpu_relax() ia64_hint(ia64_hint_pause)
528
529static inline int
530ia64_get_irr(unsigned int vector)
531{
532 unsigned int reg = vector / 64;
533 unsigned int bit = vector % 64;
534 unsigned long irr;
535
536 switch (reg) {
537 case 0: irr = ia64_getreg(_IA64_REG_CR_IRR0); break;
538 case 1: irr = ia64_getreg(_IA64_REG_CR_IRR1); break;
539 case 2: irr = ia64_getreg(_IA64_REG_CR_IRR2); break;
540 case 3: irr = ia64_getreg(_IA64_REG_CR_IRR3); break;
541 }
542
543 return test_bit(bit, &irr);
544}
545
546static inline void
547ia64_set_lrr0 (unsigned long val)
548{
549 ia64_setreg(_IA64_REG_CR_LRR0, val);
550 ia64_srlz_d();
551}
552
553static inline void
554ia64_set_lrr1 (unsigned long val)
555{
556 ia64_setreg(_IA64_REG_CR_LRR1, val);
557 ia64_srlz_d();
558}
559
560
561/*
562 * Given the address to which a spill occurred, return the unat bit
563 * number that corresponds to this address.
564 */
565static inline __u64
566ia64_unat_pos (void *spill_addr)
567{
568 return ((__u64) spill_addr >> 3) & 0x3f;
569}
570
571/*
572 * Set the NaT bit of an integer register which was spilled at address
573 * SPILL_ADDR. UNAT is the mask to be updated.
574 */
575static inline void
576ia64_set_unat (__u64 *unat, void *spill_addr, unsigned long nat)
577{
578 __u64 bit = ia64_unat_pos(spill_addr);
579 __u64 mask = 1UL << bit;
580
581 *unat = (*unat & ~mask) | (nat << bit);
582}
583
584static inline __u64
585ia64_get_ivr (void)
586{
587 __u64 r;
588 ia64_srlz_d();
589 r = ia64_getreg(_IA64_REG_CR_IVR);
590 ia64_srlz_d();
591 return r;
592}
593
594static inline void
595ia64_set_dbr (__u64 regnum, __u64 value)
596{
597 __ia64_set_dbr(regnum, value);
598#ifdef CONFIG_ITANIUM
599 ia64_srlz_d();
600#endif
601}
602
603static inline __u64
604ia64_get_dbr (__u64 regnum)
605{
606 __u64 retval;
607
608 retval = __ia64_get_dbr(regnum);
609#ifdef CONFIG_ITANIUM
610 ia64_srlz_d();
611#endif
612 return retval;
613}
614
615static inline __u64
616ia64_rotr (__u64 w, __u64 n)
617{
618 return (w >> n) | (w << (64 - n));
619}
620
621#define ia64_rotl(w,n) ia64_rotr((w), (64) - (n))
622
623/*
624 * Take a mapped kernel address and return the equivalent address
625 * in the region 7 identity mapped virtual area.
626 */
627static inline void *
628ia64_imva (void *addr)
629{
630 void *result;
631 result = (void *) ia64_tpa(addr);
632 return __va(result);
633}
634
635#define ARCH_HAS_PREFETCH
636#define ARCH_HAS_PREFETCHW
637#define PREFETCH_STRIDE L1_CACHE_BYTES
638
639static inline void
640prefetch (const void *x)
641{
642 ia64_lfetch(ia64_lfhint_none, x);
643}
644
645static inline void
646prefetchw (const void *x)
647{
648 ia64_lfetch_excl(ia64_lfhint_none, x);
649}
650
651extern unsigned long boot_option_idle_override;
652
653enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_FORCE_MWAIT,
654 IDLE_NOMWAIT, IDLE_POLL};
655
656void default_idle(void);
657
658#endif /* !__ASSEMBLY__ */
659
660#endif /* _ASM_IA64_PROCESSOR_H */
arch/ia64/include/asm/ptrace.h+0−146
@@ -1,146 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 1998-2004 Hewlett-Packard Co
4 * David Mosberger-Tang <davidm@hpl.hp.com>
5 * Stephane Eranian <eranian@hpl.hp.com>
6 * Copyright (C) 2003 Intel Co
7 * Suresh Siddha <suresh.b.siddha@intel.com>
8 * Fenghua Yu <fenghua.yu@intel.com>
9 * Arun Sharma <arun.sharma@intel.com>
10 *
11 * 12/07/98 S. Eranian added pt_regs & switch_stack
12 * 12/21/98 D. Mosberger updated to match latest code
13 * 6/17/99 D. Mosberger added second unat member to "struct switch_stack"
14 *
15 */
16#ifndef _ASM_IA64_PTRACE_H
17#define _ASM_IA64_PTRACE_H
18
19#ifndef ASM_OFFSETS_C
20#include <asm/asm-offsets.h>
21#endif
22#include <uapi/asm/ptrace.h>
23
24/*
25 * Base-2 logarithm of number of pages to allocate per task structure
26 * (including register backing store and memory stack):
27 */
28#if defined(CONFIG_IA64_PAGE_SIZE_4KB)
29# define KERNEL_STACK_SIZE_ORDER 3
30#elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
31# define KERNEL_STACK_SIZE_ORDER 2
32#elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
33# define KERNEL_STACK_SIZE_ORDER 1
34#else
35# define KERNEL_STACK_SIZE_ORDER 0
36#endif
37
38#define IA64_RBS_OFFSET ((IA64_TASK_SIZE + IA64_THREAD_INFO_SIZE + 31) & ~31)
39#define IA64_STK_OFFSET ((1 << KERNEL_STACK_SIZE_ORDER)*PAGE_SIZE)
40
41#define KERNEL_STACK_SIZE IA64_STK_OFFSET
42
43#ifndef __ASSEMBLY__
44
45#include <asm/current.h>
46#include <asm/page.h>
47
48/*
49 * We use the ia64_psr(regs)->ri to determine which of the three
50 * instructions in bundle (16 bytes) took the sample. Generate
51 * the canonical representation by adding to instruction pointer.
52 */
53# define instruction_pointer(regs) ((regs)->cr_iip + ia64_psr(regs)->ri)
54# define instruction_pointer_set(regs, val) \
55({ \
56 ia64_psr(regs)->ri = (val & 0xf); \
57 regs->cr_iip = (val & ~0xfULL); \
58})
59
60static inline unsigned long user_stack_pointer(struct pt_regs *regs)
61{
62 return regs->r12;
63}
64
65static inline int is_syscall_success(struct pt_regs *regs)
66{
67 return regs->r10 != -1;
68}
69
70static inline long regs_return_value(struct pt_regs *regs)
71{
72 if (is_syscall_success(regs))
73 return regs->r8;
74 else
75 return -regs->r8;
76}
77
78/* Conserve space in histogram by encoding slot bits in address
79 * bits 2 and 3 rather than bits 0 and 1.
80 */
81#define profile_pc(regs) \
82({ \
83 unsigned long __ip = instruction_pointer(regs); \
84 (__ip & ~3UL) + ((__ip & 3UL) << 2); \
85})
86
87 /* given a pointer to a task_struct, return the user's pt_regs */
88# define task_pt_regs(t) (((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1)
89# define ia64_psr(regs) ((struct ia64_psr *) &(regs)->cr_ipsr)
90# define user_mode(regs) (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0)
91# define user_stack(task,regs) ((long) regs - (long) task == IA64_STK_OFFSET - sizeof(*regs))
92# define fsys_mode(task,regs) \
93 ({ \
94 struct task_struct *_task = (task); \
95 struct pt_regs *_regs = (regs); \
96 !user_mode(_regs) && user_stack(_task, _regs); \
97 })
98
99 /*
100 * System call handlers that, upon successful completion, need to return a negative value
101 * should call force_successful_syscall_return() right before returning. On architectures
102 * where the syscall convention provides for a separate error flag (e.g., alpha, ia64,
103 * ppc{,64}, sparc{,64}, possibly others), this macro can be used to ensure that the error
104 * flag will not get set. On architectures which do not support a separate error flag,
105 * the macro is a no-op and the spurious error condition needs to be filtered out by some
106 * other means (e.g., in user-level, by passing an extra argument to the syscall handler,
107 * or something along those lines).
108 *
109 * On ia64, we can clear the user's pt_regs->r8 to force a successful syscall.
110 */
111# define force_successful_syscall_return() (task_pt_regs(current)->r8 = 0)
112
113 struct task_struct; /* forward decl */
114 struct unw_frame_info; /* forward decl */
115
116 extern unsigned long ia64_get_user_rbs_end (struct task_struct *, struct pt_regs *,
117 unsigned long *);
118 extern long ia64_peek (struct task_struct *, struct switch_stack *, unsigned long,
119 unsigned long, long *);
120 extern long ia64_poke (struct task_struct *, struct switch_stack *, unsigned long,
121 unsigned long, long);
122 extern void ia64_flush_fph (struct task_struct *);
123 extern void ia64_sync_fph (struct task_struct *);
124 extern void ia64_sync_krbs(void);
125 extern long ia64_sync_user_rbs (struct task_struct *, struct switch_stack *,
126 unsigned long, unsigned long);
127
128 /* get nat bits for scratch registers such that bit N==1 iff scratch register rN is a NaT */
129 extern unsigned long ia64_get_scratch_nat_bits (struct pt_regs *pt, unsigned long scratch_unat);
130 /* put nat bits for scratch registers such that scratch register rN is a NaT iff bit N==1 */
131 extern unsigned long ia64_put_scratch_nat_bits (struct pt_regs *pt, unsigned long nat);
132
133 extern void ia64_increment_ip (struct pt_regs *pt);
134 extern void ia64_decrement_ip (struct pt_regs *pt);
135
136 extern void ia64_ptrace_stop(void);
137 #define arch_ptrace_stop() \
138 ia64_ptrace_stop()
139 #define arch_ptrace_stop_needed() \
140 (!test_thread_flag(TIF_RESTORE_RSE))
141
142 #define arch_has_single_step() (1)
143 #define arch_has_block_step() (1)
144
145#endif /* !__ASSEMBLY__ */
146#endif /* _ASM_IA64_PTRACE_H */
arch/ia64/include/asm/sal.h+0−919
@@ -1,919 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_SAL_H
3#define _ASM_IA64_SAL_H
4
5/*
6 * System Abstraction Layer definitions.
7 *
8 * This is based on version 2.5 of the manual "IA-64 System
9 * Abstraction Layer".
10 *
11 * Copyright (C) 2001 Intel
12 * Copyright (C) 2002 Jenna Hall <jenna.s.hall@intel.com>
13 * Copyright (C) 2001 Fred Lewis <frederick.v.lewis@intel.com>
14 * Copyright (C) 1998, 1999, 2001, 2003 Hewlett-Packard Co
15 * David Mosberger-Tang <davidm@hpl.hp.com>
16 * Copyright (C) 1999 Srinivasa Prasad Thirumalachar <sprasad@sprasad.engr.sgi.com>
17 *
18 * 02/01/04 J. Hall Updated Error Record Structures to conform to July 2001
19 * revision of the SAL spec.
20 * 01/01/03 fvlewis Updated Error Record Structures to conform with Nov. 2000
21 * revision of the SAL spec.
22 * 99/09/29 davidm Updated for SAL 2.6.
23 * 00/03/29 cfleck Updated SAL Error Logging info for processor (SAL 2.6)
24 * (plus examples of platform error info structures from smariset @ Intel)
25 */
26
27#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT 0
28#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT 1
29#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT 2
30#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT 3
31
32#define IA64_SAL_PLATFORM_FEATURE_BUS_LOCK (1<<IA64_SAL_PLATFORM_FEATURE_BUS_LOCK_BIT)
33#define IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT (1<<IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT_BIT)
34#define IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT (1<<IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT_BIT)
35#define IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT (1<<IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT_BIT)
36
37#ifndef __ASSEMBLY__
38
39#include <linux/bcd.h>
40#include <linux/spinlock.h>
41#include <linux/efi.h>
42
43#include <asm/pal.h>
44#include <asm/fpu.h>
45
46extern unsigned long sal_systab_phys;
47extern spinlock_t sal_lock;
48
49/* SAL spec _requires_ eight args for each call. */
50#define __IA64_FW_CALL(entry,result,a0,a1,a2,a3,a4,a5,a6,a7) \
51 result = (*entry)(a0,a1,a2,a3,a4,a5,a6,a7)
52
53# define IA64_FW_CALL(entry,result,args...) do { \
54 unsigned long __ia64_sc_flags; \
55 struct ia64_fpreg __ia64_sc_fr[6]; \
56 ia64_save_scratch_fpregs(__ia64_sc_fr); \
57 spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \
58 __IA64_FW_CALL(entry, result, args); \
59 spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \
60 ia64_load_scratch_fpregs(__ia64_sc_fr); \
61} while (0)
62
63# define SAL_CALL(result,args...) \
64 IA64_FW_CALL(ia64_sal, result, args);
65
66# define SAL_CALL_NOLOCK(result,args...) do { \
67 unsigned long __ia64_scn_flags; \
68 struct ia64_fpreg __ia64_scn_fr[6]; \
69 ia64_save_scratch_fpregs(__ia64_scn_fr); \
70 local_irq_save(__ia64_scn_flags); \
71 __IA64_FW_CALL(ia64_sal, result, args); \
72 local_irq_restore(__ia64_scn_flags); \
73 ia64_load_scratch_fpregs(__ia64_scn_fr); \
74} while (0)
75
76# define SAL_CALL_REENTRANT(result,args...) do { \
77 struct ia64_fpreg __ia64_scs_fr[6]; \
78 ia64_save_scratch_fpregs(__ia64_scs_fr); \
79 preempt_disable(); \
80 __IA64_FW_CALL(ia64_sal, result, args); \
81 preempt_enable(); \
82 ia64_load_scratch_fpregs(__ia64_scs_fr); \
83} while (0)
84
85#define SAL_SET_VECTORS 0x01000000
86#define SAL_GET_STATE_INFO 0x01000001
87#define SAL_GET_STATE_INFO_SIZE 0x01000002
88#define SAL_CLEAR_STATE_INFO 0x01000003
89#define SAL_MC_RENDEZ 0x01000004
90#define SAL_MC_SET_PARAMS 0x01000005
91#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006
92
93#define SAL_CACHE_FLUSH 0x01000008
94#define SAL_CACHE_INIT 0x01000009
95#define SAL_PCI_CONFIG_READ 0x01000010
96#define SAL_PCI_CONFIG_WRITE 0x01000011
97#define SAL_FREQ_BASE 0x01000012
98#define SAL_PHYSICAL_ID_INFO 0x01000013
99
100#define SAL_UPDATE_PAL 0x01000020
101
102struct ia64_sal_retval {
103 /*
104 * A zero status value indicates call completed without error.
105 * A negative status value indicates reason of call failure.
106 * A positive status value indicates success but an
107 * informational value should be printed (e.g., "reboot for
108 * change to take effect").
109 */
110 long status;
111 unsigned long v0;
112 unsigned long v1;
113 unsigned long v2;
114};
115
116typedef struct ia64_sal_retval (*ia64_sal_handler) (u64, ...);
117
118enum {
119 SAL_FREQ_BASE_PLATFORM = 0,
120 SAL_FREQ_BASE_INTERVAL_TIMER = 1,
121 SAL_FREQ_BASE_REALTIME_CLOCK = 2
122};
123
124/*
125 * The SAL system table is followed by a variable number of variable
126 * length descriptors. The structure of these descriptors follows
127 * below.
128 * The defininition follows SAL specs from July 2000
129 */
130struct ia64_sal_systab {
131 u8 signature[4]; /* should be "SST_" */
132 u32 size; /* size of this table in bytes */
133 u8 sal_rev_minor;
134 u8 sal_rev_major;
135 u16 entry_count; /* # of entries in variable portion */
136 u8 checksum;
137 u8 reserved1[7];
138 u8 sal_a_rev_minor;
139 u8 sal_a_rev_major;
140 u8 sal_b_rev_minor;
141 u8 sal_b_rev_major;
142 /* oem_id & product_id: terminating NUL is missing if string is exactly 32 bytes long. */
143 u8 oem_id[32];
144 u8 product_id[32]; /* ASCII product id */
145 u8 reserved2[8];
146};
147
148enum sal_systab_entry_type {
149 SAL_DESC_ENTRY_POINT = 0,
150 SAL_DESC_MEMORY = 1,
151 SAL_DESC_PLATFORM_FEATURE = 2,
152 SAL_DESC_TR = 3,
153 SAL_DESC_PTC = 4,
154 SAL_DESC_AP_WAKEUP = 5
155};
156
157/*
158 * Entry type: Size:
159 * 0 48
160 * 1 32
161 * 2 16
162 * 3 32
163 * 4 16
164 * 5 16
165 */
166#define SAL_DESC_SIZE(type) "\060\040\020\040\020\020"[(unsigned) type]
167
168typedef struct ia64_sal_desc_entry_point {
169 u8 type;
170 u8 reserved1[7];
171 u64 pal_proc;
172 u64 sal_proc;
173 u64 gp;
174 u8 reserved2[16];
175}ia64_sal_desc_entry_point_t;
176
177typedef struct ia64_sal_desc_memory {
178 u8 type;
179 u8 used_by_sal; /* needs to be mapped for SAL? */
180 u8 mem_attr; /* current memory attribute setting */
181 u8 access_rights; /* access rights set up by SAL */
182 u8 mem_attr_mask; /* mask of supported memory attributes */
183 u8 reserved1;
184 u8 mem_type; /* memory type */
185 u8 mem_usage; /* memory usage */
186 u64 addr; /* physical address of memory */
187 u32 length; /* length (multiple of 4KB pages) */
188 u32 reserved2;
189 u8 oem_reserved[8];
190} ia64_sal_desc_memory_t;
191
192typedef struct ia64_sal_desc_platform_feature {
193 u8 type;
194 u8 feature_mask;
195 u8 reserved1[14];
196} ia64_sal_desc_platform_feature_t;
197
198typedef struct ia64_sal_desc_tr {
199 u8 type;
200 u8 tr_type; /* 0 == instruction, 1 == data */
201 u8 regnum; /* translation register number */
202 u8 reserved1[5];
203 u64 addr; /* virtual address of area covered */
204 u64 page_size; /* encoded page size */
205 u8 reserved2[8];
206} ia64_sal_desc_tr_t;
207
208typedef struct ia64_sal_desc_ptc {
209 u8 type;
210 u8 reserved1[3];
211 u32 num_domains; /* # of coherence domains */
212 u64 domain_info; /* physical address of domain info table */
213} ia64_sal_desc_ptc_t;
214
215typedef struct ia64_sal_ptc_domain_info {
216 u64 proc_count; /* number of processors in domain */
217 u64 proc_list; /* physical address of LID array */
218} ia64_sal_ptc_domain_info_t;
219
220typedef struct ia64_sal_ptc_domain_proc_entry {
221 u64 id : 8; /* id of processor */
222 u64 eid : 8; /* eid of processor */
223} ia64_sal_ptc_domain_proc_entry_t;
224
225
226#define IA64_SAL_AP_EXTERNAL_INT 0
227
228typedef struct ia64_sal_desc_ap_wakeup {
229 u8 type;
230 u8 mechanism; /* 0 == external interrupt */
231 u8 reserved1[6];
232 u64 vector; /* interrupt vector in range 0x10-0xff */
233} ia64_sal_desc_ap_wakeup_t ;
234
235extern ia64_sal_handler ia64_sal;
236extern struct ia64_sal_desc_ptc *ia64_ptc_domain_info;
237
238extern unsigned short sal_revision; /* supported SAL spec revision */
239extern unsigned short sal_version; /* SAL version; OEM dependent */
240#define SAL_VERSION_CODE(major, minor) ((bin2bcd(major) << 8) | bin2bcd(minor))
241
242extern const char *ia64_sal_strerror (long status);
243extern void ia64_sal_init (struct ia64_sal_systab *sal_systab);
244
245/* SAL information type encodings */
246enum {
247 SAL_INFO_TYPE_MCA = 0, /* Machine check abort information */
248 SAL_INFO_TYPE_INIT = 1, /* Init information */
249 SAL_INFO_TYPE_CMC = 2, /* Corrected machine check information */
250 SAL_INFO_TYPE_CPE = 3 /* Corrected platform error information */
251};
252
253/* Encodings for machine check parameter types */
254enum {
255 SAL_MC_PARAM_RENDEZ_INT = 1, /* Rendezvous interrupt */
256 SAL_MC_PARAM_RENDEZ_WAKEUP = 2, /* Wakeup */
257 SAL_MC_PARAM_CPE_INT = 3 /* Corrected Platform Error Int */
258};
259
260/* Encodings for rendezvous mechanisms */
261enum {
262 SAL_MC_PARAM_MECHANISM_INT = 1, /* Use interrupt */
263 SAL_MC_PARAM_MECHANISM_MEM = 2 /* Use memory synchronization variable*/
264};
265
266/* Encodings for vectors which can be registered by the OS with SAL */
267enum {
268 SAL_VECTOR_OS_MCA = 0,
269 SAL_VECTOR_OS_INIT = 1,
270 SAL_VECTOR_OS_BOOT_RENDEZ = 2
271};
272
273/* Encodings for mca_opt parameter sent to SAL_MC_SET_PARAMS */
274#define SAL_MC_PARAM_RZ_ALWAYS 0x1
275#define SAL_MC_PARAM_BINIT_ESCALATE 0x10
276
277/*
278 * Definition of the SAL Error Log from the SAL spec
279 */
280
281/* SAL Error Record Section GUID Definitions */
282#define SAL_PROC_DEV_ERR_SECT_GUID \
283 EFI_GUID(0xe429faf1, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
284#define SAL_PLAT_MEM_DEV_ERR_SECT_GUID \
285 EFI_GUID(0xe429faf2, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
286#define SAL_PLAT_SEL_DEV_ERR_SECT_GUID \
287 EFI_GUID(0xe429faf3, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
288#define SAL_PLAT_PCI_BUS_ERR_SECT_GUID \
289 EFI_GUID(0xe429faf4, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
290#define SAL_PLAT_SMBIOS_DEV_ERR_SECT_GUID \
291 EFI_GUID(0xe429faf5, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
292#define SAL_PLAT_PCI_COMP_ERR_SECT_GUID \
293 EFI_GUID(0xe429faf6, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
294#define SAL_PLAT_SPECIFIC_ERR_SECT_GUID \
295 EFI_GUID(0xe429faf7, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
296#define SAL_PLAT_HOST_CTLR_ERR_SECT_GUID \
297 EFI_GUID(0xe429faf8, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
298#define SAL_PLAT_BUS_ERR_SECT_GUID \
299 EFI_GUID(0xe429faf9, 0x3cb7, 0x11d4, 0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81)
300#define PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID \
301 EFI_GUID(0x6cb0a200, 0x893a, 0x11da, 0x96, 0xd2, 0x0, 0x10, 0x83, 0xff, \
302 0xca, 0x4d)
303
304#define MAX_CACHE_ERRORS 6
305#define MAX_TLB_ERRORS 6
306#define MAX_BUS_ERRORS 1
307
308/* Definition of version according to SAL spec for logging purposes */
309typedef struct sal_log_revision {
310 u8 minor; /* BCD (0..99) */
311 u8 major; /* BCD (0..99) */
312} sal_log_revision_t;
313
314/* Definition of timestamp according to SAL spec for logging purposes */
315typedef struct sal_log_timestamp {
316 u8 slh_second; /* Second (0..59) */
317 u8 slh_minute; /* Minute (0..59) */
318 u8 slh_hour; /* Hour (0..23) */
319 u8 slh_reserved;
320 u8 slh_day; /* Day (1..31) */
321 u8 slh_month; /* Month (1..12) */
322 u8 slh_year; /* Year (00..99) */
323 u8 slh_century; /* Century (19, 20, 21, ...) */
324} sal_log_timestamp_t;
325
326/* Definition of log record header structures */
327typedef struct sal_log_record_header {
328 u64 id; /* Unique monotonically increasing ID */
329 sal_log_revision_t revision; /* Major and Minor revision of header */
330 u8 severity; /* Error Severity */
331 u8 validation_bits; /* 0: platform_guid, 1: !timestamp */
332 u32 len; /* Length of this error log in bytes */
333 sal_log_timestamp_t timestamp; /* Timestamp */
334 efi_guid_t platform_guid; /* Unique OEM Platform ID */
335} sal_log_record_header_t;
336
337#define sal_log_severity_recoverable 0
338#define sal_log_severity_fatal 1
339#define sal_log_severity_corrected 2
340
341/*
342 * Error Recovery Info (ERI) bit decode. From SAL Spec section B.2.2 Table B-3
343 * Error Section Error_Recovery_Info Field Definition.
344 */
345#define ERI_NOT_VALID 0x0 /* Error Recovery Field is not valid */
346#define ERI_NOT_ACCESSIBLE 0x30 /* Resource not accessible */
347#define ERI_CONTAINMENT_WARN 0x22 /* Corrupt data propagated */
348#define ERI_UNCORRECTED_ERROR 0x20 /* Uncorrected error */
349#define ERI_COMPONENT_RESET 0x24 /* Component must be reset */
350#define ERI_CORR_ERROR_LOG 0x21 /* Corrected error, needs logging */
351#define ERI_CORR_ERROR_THRESH 0x29 /* Corrected error threshold exceeded */
352
353/* Definition of log section header structures */
354typedef struct sal_log_sec_header {
355 efi_guid_t guid; /* Unique Section ID */
356 sal_log_revision_t revision; /* Major and Minor revision of Section */
357 u8 error_recovery_info; /* Platform error recovery status */
358 u8 reserved;
359 u32 len; /* Section length */
360} sal_log_section_hdr_t;
361
362typedef struct sal_log_mod_error_info {
363 struct {
364 u64 check_info : 1,
365 requestor_identifier : 1,
366 responder_identifier : 1,
367 target_identifier : 1,
368 precise_ip : 1,
369 reserved : 59;
370 } valid;
371 u64 check_info;
372 u64 requestor_identifier;
373 u64 responder_identifier;
374 u64 target_identifier;
375 u64 precise_ip;
376} sal_log_mod_error_info_t;
377
378typedef struct sal_processor_static_info {
379 struct {
380 u64 minstate : 1,
381 br : 1,
382 cr : 1,
383 ar : 1,
384 rr : 1,
385 fr : 1,
386 reserved : 58;
387 } valid;
388 struct pal_min_state_area min_state_area;
389 u64 br[8];
390 u64 cr[128];
391 u64 ar[128];
392 u64 rr[8];
393 struct ia64_fpreg __attribute__ ((packed)) fr[128];
394} sal_processor_static_info_t;
395
396struct sal_cpuid_info {
397 u64 regs[5];
398 u64 reserved;
399};
400
401typedef struct sal_log_processor_info {
402 sal_log_section_hdr_t header;
403 struct {
404 u64 proc_error_map : 1,
405 proc_state_param : 1,
406 proc_cr_lid : 1,
407 psi_static_struct : 1,
408 num_cache_check : 4,
409 num_tlb_check : 4,
410 num_bus_check : 4,
411 num_reg_file_check : 4,
412 num_ms_check : 4,
413 cpuid_info : 1,
414 reserved1 : 39;
415 } valid;
416 u64 proc_error_map;
417 u64 proc_state_parameter;
418 u64 proc_cr_lid;
419 /*
420 * The rest of this structure consists of variable-length arrays, which can't be
421 * expressed in C.
422 */
423 sal_log_mod_error_info_t info[];
424 /*
425 * This is what the rest looked like if C supported variable-length arrays:
426 *
427 * sal_log_mod_error_info_t cache_check_info[.valid.num_cache_check];
428 * sal_log_mod_error_info_t tlb_check_info[.valid.num_tlb_check];
429 * sal_log_mod_error_info_t bus_check_info[.valid.num_bus_check];
430 * sal_log_mod_error_info_t reg_file_check_info[.valid.num_reg_file_check];
431 * sal_log_mod_error_info_t ms_check_info[.valid.num_ms_check];
432 * struct sal_cpuid_info cpuid_info;
433 * sal_processor_static_info_t processor_static_info;
434 */
435} sal_log_processor_info_t;
436
437/* Given a sal_log_processor_info_t pointer, return a pointer to the processor_static_info: */
438#define SAL_LPI_PSI_INFO(l) \
439({ sal_log_processor_info_t *_l = (l); \
440 ((sal_processor_static_info_t *) \
441 ((char *) _l->info + ((_l->valid.num_cache_check + _l->valid.num_tlb_check \
442 + _l->valid.num_bus_check + _l->valid.num_reg_file_check \
443 + _l->valid.num_ms_check) * sizeof(sal_log_mod_error_info_t) \
444 + sizeof(struct sal_cpuid_info)))); \
445})
446
447/* platform error log structures */
448
449typedef struct sal_log_mem_dev_err_info {
450 sal_log_section_hdr_t header;
451 struct {
452 u64 error_status : 1,
453 physical_addr : 1,
454 addr_mask : 1,
455 node : 1,
456 card : 1,
457 module : 1,
458 bank : 1,
459 device : 1,
460 row : 1,
461 column : 1,
462 bit_position : 1,
463 requestor_id : 1,
464 responder_id : 1,
465 target_id : 1,
466 bus_spec_data : 1,
467 oem_id : 1,
468 oem_data : 1,
469 reserved : 47;
470 } valid;
471 u64 error_status;
472 u64 physical_addr;
473 u64 addr_mask;
474 u16 node;
475 u16 card;
476 u16 module;
477 u16 bank;
478 u16 device;
479 u16 row;
480 u16 column;
481 u16 bit_position;
482 u64 requestor_id;
483 u64 responder_id;
484 u64 target_id;
485 u64 bus_spec_data;
486 u8 oem_id[16];
487 u8 oem_data[1]; /* Variable length data */
488} sal_log_mem_dev_err_info_t;
489
490typedef struct sal_log_sel_dev_err_info {
491 sal_log_section_hdr_t header;
492 struct {
493 u64 record_id : 1,
494 record_type : 1,
495 generator_id : 1,
496 evm_rev : 1,
497 sensor_type : 1,
498 sensor_num : 1,
499 event_dir : 1,
500 event_data1 : 1,
501 event_data2 : 1,
502 event_data3 : 1,
503 reserved : 54;
504 } valid;
505 u16 record_id;
506 u8 record_type;
507 u8 timestamp[4];
508 u16 generator_id;
509 u8 evm_rev;
510 u8 sensor_type;
511 u8 sensor_num;
512 u8 event_dir;
513 u8 event_data1;
514 u8 event_data2;
515 u8 event_data3;
516} sal_log_sel_dev_err_info_t;
517
518typedef struct sal_log_pci_bus_err_info {
519 sal_log_section_hdr_t header;
520 struct {
521 u64 err_status : 1,
522 err_type : 1,
523 bus_id : 1,
524 bus_address : 1,
525 bus_data : 1,
526 bus_cmd : 1,
527 requestor_id : 1,
528 responder_id : 1,
529 target_id : 1,
530 oem_data : 1,
531 reserved : 54;
532 } valid;
533 u64 err_status;
534 u16 err_type;
535 u16 bus_id;
536 u32 reserved;
537 u64 bus_address;
538 u64 bus_data;
539 u64 bus_cmd;
540 u64 requestor_id;
541 u64 responder_id;
542 u64 target_id;
543 u8 oem_data[1]; /* Variable length data */
544} sal_log_pci_bus_err_info_t;
545
546typedef struct sal_log_smbios_dev_err_info {
547 sal_log_section_hdr_t header;
548 struct {
549 u64 event_type : 1,
550 length : 1,
551 time_stamp : 1,
552 data : 1,
553 reserved1 : 60;
554 } valid;
555 u8 event_type;
556 u8 length;
557 u8 time_stamp[6];
558 u8 data[1]; /* data of variable length, length == slsmb_length */
559} sal_log_smbios_dev_err_info_t;
560
561typedef struct sal_log_pci_comp_err_info {
562 sal_log_section_hdr_t header;
563 struct {
564 u64 err_status : 1,
565 comp_info : 1,
566 num_mem_regs : 1,
567 num_io_regs : 1,
568 reg_data_pairs : 1,
569 oem_data : 1,
570 reserved : 58;
571 } valid;
572 u64 err_status;
573 struct {
574 u16 vendor_id;
575 u16 device_id;
576 u8 class_code[3];
577 u8 func_num;
578 u8 dev_num;
579 u8 bus_num;
580 u8 seg_num;
581 u8 reserved[5];
582 } comp_info;
583 u32 num_mem_regs;
584 u32 num_io_regs;
585 u64 reg_data_pairs[1];
586 /*
587 * array of address/data register pairs is num_mem_regs + num_io_regs elements
588 * long. Each array element consists of a u64 address followed by a u64 data
589 * value. The oem_data array immediately follows the reg_data_pairs array
590 */
591 u8 oem_data[1]; /* Variable length data */
592} sal_log_pci_comp_err_info_t;
593
594typedef struct sal_log_plat_specific_err_info {
595 sal_log_section_hdr_t header;
596 struct {
597 u64 err_status : 1,
598 guid : 1,
599 oem_data : 1,
600 reserved : 61;
601 } valid;
602 u64 err_status;
603 efi_guid_t guid;
604 u8 oem_data[1]; /* platform specific variable length data */
605} sal_log_plat_specific_err_info_t;
606
607typedef struct sal_log_host_ctlr_err_info {
608 sal_log_section_hdr_t header;
609 struct {
610 u64 err_status : 1,
611 requestor_id : 1,
612 responder_id : 1,
613 target_id : 1,
614 bus_spec_data : 1,
615 oem_data : 1,
616 reserved : 58;
617 } valid;
618 u64 err_status;
619 u64 requestor_id;
620 u64 responder_id;
621 u64 target_id;
622 u64 bus_spec_data;
623 u8 oem_data[1]; /* Variable length OEM data */
624} sal_log_host_ctlr_err_info_t;
625
626typedef struct sal_log_plat_bus_err_info {
627 sal_log_section_hdr_t header;
628 struct {
629 u64 err_status : 1,
630 requestor_id : 1,
631 responder_id : 1,
632 target_id : 1,
633 bus_spec_data : 1,
634 oem_data : 1,
635 reserved : 58;
636 } valid;
637 u64 err_status;
638 u64 requestor_id;
639 u64 responder_id;
640 u64 target_id;
641 u64 bus_spec_data;
642 u8 oem_data[1]; /* Variable length OEM data */
643} sal_log_plat_bus_err_info_t;
644
645/* Overall platform error section structure */
646typedef union sal_log_platform_err_info {
647 sal_log_mem_dev_err_info_t mem_dev_err;
648 sal_log_sel_dev_err_info_t sel_dev_err;
649 sal_log_pci_bus_err_info_t pci_bus_err;
650 sal_log_smbios_dev_err_info_t smbios_dev_err;
651 sal_log_pci_comp_err_info_t pci_comp_err;
652 sal_log_plat_specific_err_info_t plat_specific_err;
653 sal_log_host_ctlr_err_info_t host_ctlr_err;
654 sal_log_plat_bus_err_info_t plat_bus_err;
655} sal_log_platform_err_info_t;
656
657/* SAL log over-all, multi-section error record structure (processor+platform) */
658typedef struct err_rec {
659 sal_log_record_header_t sal_elog_header;
660 sal_log_processor_info_t proc_err;
661 sal_log_platform_err_info_t plat_err;
662 u8 oem_data_pad[1024];
663} ia64_err_rec_t;
664
665/*
666 * Now define a couple of inline functions for improved type checking
667 * and convenience.
668 */
669
670extern s64 ia64_sal_cache_flush (u64 cache_type);
671extern void __init check_sal_cache_flush (void);
672
673/* Initialize all the processor and platform level instruction and data caches */
674static inline s64
675ia64_sal_cache_init (void)
676{
677 struct ia64_sal_retval isrv;
678 SAL_CALL(isrv, SAL_CACHE_INIT, 0, 0, 0, 0, 0, 0, 0);
679 return isrv.status;
680}
681
682/*
683 * Clear the processor and platform information logged by SAL with respect to the machine
684 * state at the time of MCA's, INITs, CMCs, or CPEs.
685 */
686static inline s64
687ia64_sal_clear_state_info (u64 sal_info_type)
688{
689 struct ia64_sal_retval isrv;
690 SAL_CALL_REENTRANT(isrv, SAL_CLEAR_STATE_INFO, sal_info_type, 0,
691 0, 0, 0, 0, 0);
692 return isrv.status;
693}
694
695
696/* Get the processor and platform information logged by SAL with respect to the machine
697 * state at the time of the MCAs, INITs, CMCs, or CPEs.
698 */
699static inline u64
700ia64_sal_get_state_info (u64 sal_info_type, u64 *sal_info)
701{
702 struct ia64_sal_retval isrv;
703 SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO, sal_info_type, 0,
704 sal_info, 0, 0, 0, 0);
705 if (isrv.status)
706 return 0;
707
708 return isrv.v0;
709}
710
711/*
712 * Get the maximum size of the information logged by SAL with respect to the machine state
713 * at the time of MCAs, INITs, CMCs, or CPEs.
714 */
715static inline u64
716ia64_sal_get_state_info_size (u64 sal_info_type)
717{
718 struct ia64_sal_retval isrv;
719 SAL_CALL_REENTRANT(isrv, SAL_GET_STATE_INFO_SIZE, sal_info_type, 0,
720 0, 0, 0, 0, 0);
721 if (isrv.status)
722 return 0;
723 return isrv.v0;
724}
725
726/*
727 * Causes the processor to go into a spin loop within SAL where SAL awaits a wakeup from
728 * the monarch processor. Must not lock, because it will not return on any cpu until the
729 * monarch processor sends a wake up.
730 */
731static inline s64
732ia64_sal_mc_rendez (void)
733{
734 struct ia64_sal_retval isrv;
735 SAL_CALL_NOLOCK(isrv, SAL_MC_RENDEZ, 0, 0, 0, 0, 0, 0, 0);
736 return isrv.status;
737}
738
739/*
740 * Allow the OS to specify the interrupt number to be used by SAL to interrupt OS during
741 * the machine check rendezvous sequence as well as the mechanism to wake up the
742 * non-monarch processor at the end of machine check processing.
743 * Returns the complete ia64_sal_retval because some calls return more than just a status
744 * value.
745 */
746static inline struct ia64_sal_retval
747ia64_sal_mc_set_params (u64 param_type, u64 i_or_m, u64 i_or_m_val, u64 timeout, u64 rz_always)
748{
749 struct ia64_sal_retval isrv;
750 SAL_CALL(isrv, SAL_MC_SET_PARAMS, param_type, i_or_m, i_or_m_val,
751 timeout, rz_always, 0, 0);
752 return isrv;
753}
754
755/* Read from PCI configuration space */
756static inline s64
757ia64_sal_pci_config_read (u64 pci_config_addr, int type, u64 size, u64 *value)
758{
759 struct ia64_sal_retval isrv;
760 SAL_CALL(isrv, SAL_PCI_CONFIG_READ, pci_config_addr, size, type, 0, 0, 0, 0);
761 if (value)
762 *value = isrv.v0;
763 return isrv.status;
764}
765
766/* Write to PCI configuration space */
767static inline s64
768ia64_sal_pci_config_write (u64 pci_config_addr, int type, u64 size, u64 value)
769{
770 struct ia64_sal_retval isrv;
771 SAL_CALL(isrv, SAL_PCI_CONFIG_WRITE, pci_config_addr, size, value,
772 type, 0, 0, 0);
773 return isrv.status;
774}
775
776/*
777 * Register physical addresses of locations needed by SAL when SAL procedures are invoked
778 * in virtual mode.
779 */
780static inline s64
781ia64_sal_register_physical_addr (u64 phys_entry, u64 phys_addr)
782{
783 struct ia64_sal_retval isrv;
784 SAL_CALL(isrv, SAL_REGISTER_PHYSICAL_ADDR, phys_entry, phys_addr,
785 0, 0, 0, 0, 0);
786 return isrv.status;
787}
788
789/*
790 * Register software dependent code locations within SAL. These locations are handlers or
791 * entry points where SAL will pass control for the specified event. These event handlers
792 * are for the bott rendezvous, MCAs and INIT scenarios.
793 */
794static inline s64
795ia64_sal_set_vectors (u64 vector_type,
796 u64 handler_addr1, u64 gp1, u64 handler_len1,
797 u64 handler_addr2, u64 gp2, u64 handler_len2)
798{
799 struct ia64_sal_retval isrv;
800 SAL_CALL(isrv, SAL_SET_VECTORS, vector_type,
801 handler_addr1, gp1, handler_len1,
802 handler_addr2, gp2, handler_len2);
803
804 return isrv.status;
805}
806
807/* Update the contents of PAL block in the non-volatile storage device */
808static inline s64
809ia64_sal_update_pal (u64 param_buf, u64 scratch_buf, u64 scratch_buf_size,
810 u64 *error_code, u64 *scratch_buf_size_needed)
811{
812 struct ia64_sal_retval isrv;
813 SAL_CALL(isrv, SAL_UPDATE_PAL, param_buf, scratch_buf, scratch_buf_size,
814 0, 0, 0, 0);
815 if (error_code)
816 *error_code = isrv.v0;
817 if (scratch_buf_size_needed)
818 *scratch_buf_size_needed = isrv.v1;
819 return isrv.status;
820}
821
822/* Get physical processor die mapping in the platform. */
823static inline s64
824ia64_sal_physical_id_info(u16 *splid)
825{
826 struct ia64_sal_retval isrv;
827
828 if (sal_revision < SAL_VERSION_CODE(3,2))
829 return -1;
830
831 SAL_CALL(isrv, SAL_PHYSICAL_ID_INFO, 0, 0, 0, 0, 0, 0, 0);
832 if (splid)
833 *splid = isrv.v0;
834 return isrv.status;
835}
836
837extern unsigned long sal_platform_features;
838
839extern int (*salinfo_platform_oemdata)(const u8 *, u8 **, u64 *);
840
841struct sal_ret_values {
842 long r8; long r9; long r10; long r11;
843};
844
845#define IA64_SAL_OEMFUNC_MIN 0x02000000
846#define IA64_SAL_OEMFUNC_MAX 0x03ffffff
847
848extern int ia64_sal_oemcall(struct ia64_sal_retval *, u64, u64, u64, u64, u64,
849 u64, u64, u64);
850extern int ia64_sal_oemcall_nolock(struct ia64_sal_retval *, u64, u64, u64,
851 u64, u64, u64, u64, u64);
852extern int ia64_sal_oemcall_reentrant(struct ia64_sal_retval *, u64, u64, u64,
853 u64, u64, u64, u64, u64);
854extern long
855ia64_sal_freq_base (unsigned long which, unsigned long *ticks_per_second,
856 unsigned long *drift_info);
857#ifdef CONFIG_HOTPLUG_CPU
858/*
859 * System Abstraction Layer Specification
860 * Section 3.2.5.1: OS_BOOT_RENDEZ to SAL return State.
861 * Note: region regs are stored first in head.S _start. Hence they must
862 * stay up front.
863 */
864struct sal_to_os_boot {
865 u64 rr[8]; /* Region Registers */
866 u64 br[6]; /* br0:
867 * return addr into SAL boot rendez routine */
868 u64 gr1; /* SAL:GP */
869 u64 gr12; /* SAL:SP */
870 u64 gr13; /* SAL: Task Pointer */
871 u64 fpsr;
872 u64 pfs;
873 u64 rnat;
874 u64 unat;
875 u64 bspstore;
876 u64 dcr; /* Default Control Register */
877 u64 iva;
878 u64 pta;
879 u64 itv;
880 u64 pmv;
881 u64 cmcv;
882 u64 lrr[2];
883 u64 gr[4];
884 u64 pr; /* Predicate registers */
885 u64 lc; /* Loop Count */
886 struct ia64_fpreg fp[20];
887};
888
889/*
890 * Global array allocated for NR_CPUS at boot time
891 */
892extern struct sal_to_os_boot sal_boot_rendez_state[NR_CPUS];
893
894extern void ia64_jump_to_sal(struct sal_to_os_boot *);
895#endif
896
897extern void ia64_sal_handler_init(void *entry_point, void *gpval);
898
899#define PALO_MAX_TLB_PURGES 0xFFFF
900#define PALO_SIG "PALO"
901
902struct palo_table {
903 u8 signature[4]; /* Should be "PALO" */
904 u32 length;
905 u8 minor_revision;
906 u8 major_revision;
907 u8 checksum;
908 u8 reserved1[5];
909 u16 max_tlb_purges;
910 u8 reserved2[6];
911};
912
913#define NPTCG_FROM_PAL 0
914#define NPTCG_FROM_PALO 1
915#define NPTCG_FROM_KERNEL_PARAMETER 2
916
917#endif /* __ASSEMBLY__ */
918
919#endif /* _ASM_IA64_SAL_H */
arch/ia64/include/asm/sections.h+0−33
@@ -1,33 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_SECTIONS_H
3#define _ASM_IA64_SECTIONS_H
4
5/*
6 * Copyright (C) 1998-2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10#include <linux/elf.h>
11#include <linux/uaccess.h>
12
13typedef struct fdesc func_desc_t;
14
15#include <asm-generic/sections.h>
16
17extern char __phys_per_cpu_start[];
18#ifdef CONFIG_SMP
19extern char __cpu0_per_cpu[];
20#endif
21extern char __start___vtop_patchlist[], __end___vtop_patchlist[];
22extern char __start___rse_patchlist[], __end___rse_patchlist[];
23extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[];
24extern char __start___phys_stack_reg_patchlist[], __end___phys_stack_reg_patchlist[];
25extern char __start_gate_section[];
26extern char __start_gate_mckinley_e9_patchlist[], __end_gate_mckinley_e9_patchlist[];
27extern char __start_gate_vtop_patchlist[], __end_gate_vtop_patchlist[];
28extern char __start_gate_fsyscall_patchlist[], __end_gate_fsyscall_patchlist[];
29extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_bubble_down_patchlist[];
30extern char __start_unwind[], __end_unwind[];
31extern char __start_ivt_text[], __end_ivt_text[];
32
33#endif /* _ASM_IA64_SECTIONS_H */
arch/ia64/include/asm/serial.h+0−17
@@ -1,17 +0,0 @@
1/*
2 * Derived from the i386 version.
3 */
4
5/*
6 * This assumes you have a 1.8432 MHz clock for your UART.
7 *
8 * It'd be nice if someone built a serial card with a 24.576 MHz
9 * clock, since the 16550A is capable of handling a top speed of 1.5
10 * megabits/second; but this requires the faster clock.
11 */
12#define BASE_BAUD ( 1843200 / 16 )
13
14/*
15 * All legacy serial ports should be enumerated via ACPI namespace, so
16 * we need not list them here.
17 */
arch/ia64/include/asm/shmparam.h+0−13
@@ -1,13 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_SHMPARAM_H
3#define _ASM_IA64_SHMPARAM_H
4
5/*
6 * SHMLBA controls minimum alignment at which shared memory segments
7 * get attached. The IA-64 architecture says that there may be a
8 * performance degradation when there are virtual aliases within 1MB.
9 * To reduce the chance of this, we set SHMLBA to 1MB. --davidm 00/12/20
10 */
11#define SHMLBA (1024*1024)
12
13#endif /* _ASM_IA64_SHMPARAM_H */
arch/ia64/include/asm/signal.h+0−33
@@ -1,33 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Modified 1998-2001, 2003
4 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
5 *
6 * Unfortunately, this file is being included by bits/signal.h in
7 * glibc-2.x. Hence the #ifdef __KERNEL__ ugliness.
8 */
9#ifndef _ASM_IA64_SIGNAL_H
10#define _ASM_IA64_SIGNAL_H
11
12#include <uapi/asm/signal.h>
13
14
15#define _NSIG 64
16#define _NSIG_BPW 64
17#define _NSIG_WORDS (_NSIG / _NSIG_BPW)
18
19# ifndef __ASSEMBLY__
20
21/* Most things should be clean enough to redefine this at will, if care
22 is taken to make libc match. */
23
24typedef unsigned long old_sigset_t;
25
26typedef struct {
27 unsigned long sig[_NSIG_WORDS];
28} sigset_t;
29
30# include <asm/sigcontext.h>
31
32# endif /* !__ASSEMBLY__ */
33#endif /* _ASM_IA64_SIGNAL_H */
arch/ia64/include/asm/smp.h+0−103
@@ -1,103 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * SMP Support
4 *
5 * Copyright (C) 1999 VA Linux Systems
6 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
7 * (c) Copyright 2001-2003, 2005 Hewlett-Packard Development Company, L.P.
8 * David Mosberger-Tang <davidm@hpl.hp.com>
9 * Bjorn Helgaas <bjorn.helgaas@hp.com>
10 */
11#ifndef _ASM_IA64_SMP_H
12#define _ASM_IA64_SMP_H
13
14#include <linux/init.h>
15#include <linux/threads.h>
16#include <linux/kernel.h>
17#include <linux/cpumask.h>
18#include <linux/bitops.h>
19#include <linux/irqreturn.h>
20
21#include <asm/param.h>
22#include <asm/processor.h>
23#include <asm/ptrace.h>
24
25static inline unsigned int
26ia64_get_lid (void)
27{
28 union {
29 struct {
30 unsigned long reserved : 16;
31 unsigned long eid : 8;
32 unsigned long id : 8;
33 unsigned long ignored : 32;
34 } f;
35 unsigned long bits;
36 } lid;
37
38 lid.bits = ia64_getreg(_IA64_REG_CR_LID);
39 return lid.f.id << 8 | lid.f.eid;
40}
41
42#define hard_smp_processor_id() ia64_get_lid()
43
44#ifdef CONFIG_SMP
45
46#define raw_smp_processor_id() (current_thread_info()->cpu)
47
48extern struct smp_boot_data {
49 int cpu_count;
50 int cpu_phys_id[NR_CPUS];
51} smp_boot_data __initdata;
52
53extern char no_int_routing;
54
55extern cpumask_t cpu_core_map[NR_CPUS];
56DECLARE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map);
57extern int smp_num_siblings;
58extern void __iomem *ipi_base_addr;
59
60extern volatile int ia64_cpu_to_sapicid[];
61#define cpu_physical_id(i) ia64_cpu_to_sapicid[i]
62
63extern unsigned long ap_wakeup_vector;
64
65/*
66 * Function to map hard smp processor id to logical id. Slow, so don't use this in
67 * performance-critical code.
68 */
69static inline int
70cpu_logical_id (int cpuid)
71{
72 int i;
73
74 for (i = 0; i < NR_CPUS; ++i)
75 if (cpu_physical_id(i) == cpuid)
76 break;
77 return i;
78}
79
80/* Upping and downing of CPUs */
81extern int __cpu_disable (void);
82extern void __cpu_die (unsigned int cpu);
83extern void cpu_die (void) __attribute__ ((noreturn));
84extern void __init smp_build_cpu_map(void);
85
86extern void __init init_smp_config (void);
87extern void smp_do_timer (struct pt_regs *regs);
88
89extern irqreturn_t handle_IPI(int irq, void *dev_id);
90extern void smp_send_reschedule (int cpu);
91extern void identify_siblings (struct cpuinfo_ia64 *);
92extern int is_multithreading_enabled(void);
93
94extern void arch_send_call_function_single_ipi(int cpu);
95extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
96
97#else /* CONFIG_SMP */
98
99#define cpu_logical_id(i) 0
100#define cpu_physical_id(i) ia64_get_lid()
101
102#endif /* CONFIG_SMP */
103#endif /* _ASM_IA64_SMP_H */
arch/ia64/include/asm/sn/intr.h+0−15
@@ -1,15 +0,0 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 1992 - 1997, 2000-2006 Silicon Graphics, Inc. All rights reserved.
7 */
8
9#ifndef _ASM_IA64_SN_INTR_H
10#define _ASM_IA64_SN_INTR_H
11
12#define SGI_XPC_ACTIVATE 0x30
13#define SGI_XPC_NOTIFY 0xe7
14
15#endif /* _ASM_IA64_SN_INTR_H */
arch/ia64/include/asm/sn/sn_sal.h+0−124
@@ -1,124 +0,0 @@
1#ifndef _ASM_IA64_SN_SN_SAL_H
2#define _ASM_IA64_SN_SN_SAL_H
3
4/*
5 * System Abstraction Layer definitions for IA64
6 *
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file "COPYING" in the main directory of this archive
9 * for more details.
10 *
11 * Copyright (c) 2000-2006 Silicon Graphics, Inc. All rights reserved.
12 */
13
14#include <linux/types.h>
15#include <asm/sal.h>
16
17// SGI Specific Calls
18#define SN_SAL_GET_PARTITION_ADDR 0x02000009
19#define SN_SAL_MEMPROTECT 0x0200003e
20
21#define SN_SAL_WATCHLIST_ALLOC 0x02000070
22#define SN_SAL_WATCHLIST_FREE 0x02000071
23
24/*
25 * SAL Error Codes
26 */
27#define SALRET_MORE_PASSES 1
28#define SALRET_OK 0
29#define SALRET_NOT_IMPLEMENTED (-1)
30#define SALRET_INVALID_ARG (-2)
31#define SALRET_ERROR (-3)
32
33/*
34 * Returns the physical address of the partition's reserved page through
35 * an iterative number of calls.
36 *
37 * On first call, 'cookie' and 'len' should be set to 0, and 'addr'
38 * set to the nasid of the partition whose reserved page's address is
39 * being sought.
40 * On subsequent calls, pass the values, that were passed back on the
41 * previous call.
42 *
43 * While the return status equals SALRET_MORE_PASSES, keep calling
44 * this function after first copying 'len' bytes starting at 'addr'
45 * into 'buf'. Once the return status equals SALRET_OK, 'addr' will
46 * be the physical address of the partition's reserved page. If the
47 * return status equals neither of these, an error as occurred.
48 */
49static inline s64
50sn_partition_reserved_page_pa(u64 buf, u64 *cookie, u64 *addr, u64 *len)
51{
52 struct ia64_sal_retval rv;
53 ia64_sal_oemcall_reentrant(&rv, SN_SAL_GET_PARTITION_ADDR, *cookie,
54 *addr, buf, *len, 0, 0, 0);
55 *cookie = rv.v0;
56 *addr = rv.v1;
57 *len = rv.v2;
58 return rv.status;
59}
60
61/*
62 * Change memory access protections for a physical address range.
63 * nasid_array is not used on Altix, but may be in future architectures.
64 * Available memory protection access classes are defined after the function.
65 */
66static inline int
67sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array)
68{
69 struct ia64_sal_retval ret_stuff;
70
71 ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_MEMPROTECT, paddr, len,
72 (u64)nasid_array, perms, 0, 0, 0);
73 return ret_stuff.status;
74}
75#define SN_MEMPROT_ACCESS_CLASS_0 0x14a080
76#define SN_MEMPROT_ACCESS_CLASS_1 0x2520c2
77#define SN_MEMPROT_ACCESS_CLASS_2 0x14a1ca
78#define SN_MEMPROT_ACCESS_CLASS_3 0x14a290
79#define SN_MEMPROT_ACCESS_CLASS_6 0x084080
80#define SN_MEMPROT_ACCESS_CLASS_7 0x021080
81
82union sn_watchlist_u {
83 u64 val;
84 struct {
85 u64 blade : 16,
86 size : 32,
87 filler : 16;
88 };
89};
90
91static inline int
92sn_mq_watchlist_alloc(int blade, void *mq, unsigned int mq_size,
93 unsigned long *intr_mmr_offset)
94{
95 struct ia64_sal_retval rv;
96 unsigned long addr;
97 union sn_watchlist_u size_blade;
98 int watchlist;
99
100 addr = (unsigned long)mq;
101 size_blade.size = mq_size;
102 size_blade.blade = blade;
103
104 /*
105 * bios returns watchlist number or negative error number.
106 */
107 ia64_sal_oemcall_nolock(&rv, SN_SAL_WATCHLIST_ALLOC, addr,
108 size_blade.val, (u64)intr_mmr_offset,
109 (u64)&watchlist, 0, 0, 0);
110 if (rv.status < 0)
111 return rv.status;
112
113 return watchlist;
114}
115
116static inline int
117sn_mq_watchlist_free(int blade, int watchlist_num)
118{
119 struct ia64_sal_retval rv;
120 ia64_sal_oemcall_nolock(&rv, SN_SAL_WATCHLIST_FREE, blade,
121 watchlist_num, 0, 0, 0, 0, 0);
122 return rv.status;
123}
124#endif /* _ASM_IA64_SN_SN_SAL_H */
arch/ia64/include/asm/sparsemem.h+0−28
@@ -1,28 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_SPARSEMEM_H
3#define _ASM_IA64_SPARSEMEM_H
4
5#ifdef CONFIG_SPARSEMEM
6#include <asm/page.h>
7/*
8 * SECTION_SIZE_BITS 2^N: how big each section will be
9 * MAX_PHYSMEM_BITS 2^N: how much memory we can have in that space
10 */
11
12#define SECTION_SIZE_BITS (30)
13#define MAX_PHYSMEM_BITS (50)
14#ifdef CONFIG_ARCH_FORCE_MAX_ORDER
15#if (CONFIG_ARCH_FORCE_MAX_ORDER + PAGE_SHIFT > SECTION_SIZE_BITS)
16#undef SECTION_SIZE_BITS
17#define SECTION_SIZE_BITS (CONFIG_ARCH_FORCE_MAX_ORDER + PAGE_SHIFT)
18#endif
19#endif
20
21#endif /* CONFIG_SPARSEMEM */
22
23#ifdef CONFIG_MEMORY_HOTPLUG
24int memory_add_physaddr_to_nid(u64 addr);
25#define memory_add_physaddr_to_nid memory_add_physaddr_to_nid
26#endif
27
28#endif /* _ASM_IA64_SPARSEMEM_H */
arch/ia64/include/asm/spinlock.h+0−265
@@ -1,265 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_SPINLOCK_H
3#define _ASM_IA64_SPINLOCK_H
4
5/*
6 * Copyright (C) 1998-2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
9 *
10 * This file is used for SMP configurations only.
11 */
12
13#include <linux/compiler.h>
14#include <linux/kernel.h>
15#include <linux/bitops.h>
16
17#include <linux/atomic.h>
18#include <asm/intrinsics.h>
19#include <asm/barrier.h>
20#include <asm/processor.h>
21
22#define arch_spin_lock_init(x) ((x)->lock = 0)
23
24/*
25 * Ticket locks are conceptually two parts, one indicating the current head of
26 * the queue, and the other indicating the current tail. The lock is acquired
27 * by atomically noting the tail and incrementing it by one (thus adding
28 * ourself to the queue and noting our position), then waiting until the head
29 * becomes equal to the initial value of the tail.
30 * The pad bits in the middle are used to prevent the next_ticket number
31 * overflowing into the now_serving number.
32 *
33 * 31 17 16 15 14 0
34 * +----------------------------------------------------+
35 * | now_serving | padding | next_ticket |
36 * +----------------------------------------------------+
37 */
38
39#define TICKET_SHIFT 17
40#define TICKET_BITS 15
41#define TICKET_MASK ((1 << TICKET_BITS) - 1)
42
43static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
44{
45 int *p = (int *)&lock->lock, ticket, serve;
46
47 ticket = ia64_fetchadd(1, p, acq);
48
49 if (!(((ticket >> TICKET_SHIFT) ^ ticket) & TICKET_MASK))
50 return;
51
52 ia64_invala();
53
54 for (;;) {
55 asm volatile ("ld4.c.nc %0=[%1]" : "=r"(serve) : "r"(p) : "memory");
56
57 if (!(((serve >> TICKET_SHIFT) ^ ticket) & TICKET_MASK))
58 return;
59 cpu_relax();
60 }
61}
62
63static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
64{
65 int tmp = READ_ONCE(lock->lock);
66
67 if (!(((tmp >> TICKET_SHIFT) ^ tmp) & TICKET_MASK))
68 return ia64_cmpxchg(acq, &lock->lock, tmp, tmp + 1, sizeof (tmp)) == tmp;
69 return 0;
70}
71
72static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
73{
74 unsigned short *p = (unsigned short *)&lock->lock + 1, tmp;
75
76 /* This could be optimised with ARCH_HAS_MMIOWB */
77 mmiowb();
78 asm volatile ("ld2.bias %0=[%1]" : "=r"(tmp) : "r"(p));
79 WRITE_ONCE(*p, (tmp + 2) & ~1);
80}
81
82static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
83{
84 long tmp = READ_ONCE(lock->lock);
85
86 return !!(((tmp >> TICKET_SHIFT) ^ tmp) & TICKET_MASK);
87}
88
89static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
90{
91 long tmp = READ_ONCE(lock->lock);
92
93 return ((tmp - (tmp >> TICKET_SHIFT)) & TICKET_MASK) > 1;
94}
95
96static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock)
97{
98 return !(((lock.lock >> TICKET_SHIFT) ^ lock.lock) & TICKET_MASK);
99}
100
101static inline int arch_spin_is_locked(arch_spinlock_t *lock)
102{
103 return __ticket_spin_is_locked(lock);
104}
105
106static inline int arch_spin_is_contended(arch_spinlock_t *lock)
107{
108 return __ticket_spin_is_contended(lock);
109}
110#define arch_spin_is_contended arch_spin_is_contended
111
112static __always_inline void arch_spin_lock(arch_spinlock_t *lock)
113{
114 __ticket_spin_lock(lock);
115}
116
117static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
118{
119 return __ticket_spin_trylock(lock);
120}
121
122static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
123{
124 __ticket_spin_unlock(lock);
125}
126
127#ifdef ASM_SUPPORTED
128
129static __always_inline void
130arch_read_lock(arch_rwlock_t *lock)
131{
132 unsigned long flags = 0;
133
134 __asm__ __volatile__ (
135 "tbit.nz p6, p0 = %1,%2\n"
136 "br.few 3f\n"
137 "1:\n"
138 "fetchadd4.rel r2 = [%0], -1;;\n"
139 "(p6) ssm psr.i\n"
140 "2:\n"
141 "hint @pause\n"
142 "ld4 r2 = [%0];;\n"
143 "cmp4.lt p7,p0 = r2, r0\n"
144 "(p7) br.cond.spnt.few 2b\n"
145 "(p6) rsm psr.i\n"
146 ";;\n"
147 "3:\n"
148 "fetchadd4.acq r2 = [%0], 1;;\n"
149 "cmp4.lt p7,p0 = r2, r0\n"
150 "(p7) br.cond.spnt.few 1b\n"
151 : : "r"(lock), "r"(flags), "i"(IA64_PSR_I_BIT)
152 : "p6", "p7", "r2", "memory");
153}
154
155#else /* !ASM_SUPPORTED */
156
157#define arch_read_lock(rw) \
158do { \
159 arch_rwlock_t *__read_lock_ptr = (rw); \
160 \
161 while (unlikely(ia64_fetchadd(1, (int *) __read_lock_ptr, acq) < 0)) { \
162 ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \
163 while (*(volatile int *)__read_lock_ptr < 0) \
164 cpu_relax(); \
165 } \
166} while (0)
167
168#endif /* !ASM_SUPPORTED */
169
170#define arch_read_unlock(rw) \
171do { \
172 arch_rwlock_t *__read_lock_ptr = (rw); \
173 ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \
174} while (0)
175
176#ifdef ASM_SUPPORTED
177
178static __always_inline void
179arch_write_lock(arch_rwlock_t *lock)
180{
181 unsigned long flags = 0;
182
183 __asm__ __volatile__ (
184 "tbit.nz p6, p0 = %1, %2\n"
185 "mov ar.ccv = r0\n"
186 "dep r29 = -1, r0, 31, 1\n"
187 "br.few 3f;;\n"
188 "1:\n"
189 "(p6) ssm psr.i\n"
190 "2:\n"
191 "hint @pause\n"
192 "ld4 r2 = [%0];;\n"
193 "cmp4.eq p0,p7 = r0, r2\n"
194 "(p7) br.cond.spnt.few 2b\n"
195 "(p6) rsm psr.i\n"
196 ";;\n"
197 "3:\n"
198 "cmpxchg4.acq r2 = [%0], r29, ar.ccv;;\n"
199 "cmp4.eq p0,p7 = r0, r2\n"
200 "(p7) br.cond.spnt.few 1b;;\n"
201 : : "r"(lock), "r"(flags), "i"(IA64_PSR_I_BIT)
202 : "ar.ccv", "p6", "p7", "r2", "r29", "memory");
203}
204
205#define arch_write_trylock(rw) \
206({ \
207 register long result; \
208 \
209 __asm__ __volatile__ ( \
210 "mov ar.ccv = r0\n" \
211 "dep r29 = -1, r0, 31, 1;;\n" \
212 "cmpxchg4.acq %0 = [%1], r29, ar.ccv\n" \
213 : "=r"(result) : "r"(rw) : "ar.ccv", "r29", "memory"); \
214 (result == 0); \
215})
216
217static inline void arch_write_unlock(arch_rwlock_t *x)
218{
219 u8 *y = (u8 *)x;
220 barrier();
221 asm volatile ("st1.rel.nta [%0] = r0\n\t" :: "r"(y+3) : "memory" );
222}
223
224#else /* !ASM_SUPPORTED */
225
226#define arch_write_lock(l) \
227({ \
228 __u64 ia64_val, ia64_set_val = ia64_dep_mi(-1, 0, 31, 1); \
229 __u32 *ia64_write_lock_ptr = (__u32 *) (l); \
230 do { \
231 while (*ia64_write_lock_ptr) \
232 ia64_barrier(); \
233 ia64_val = ia64_cmpxchg4_acq(ia64_write_lock_ptr, ia64_set_val, 0); \
234 } while (ia64_val); \
235})
236
237#define arch_write_trylock(rw) \
238({ \
239 __u64 ia64_val; \
240 __u64 ia64_set_val = ia64_dep_mi(-1, 0, 31,1); \
241 ia64_val = ia64_cmpxchg4_acq((__u32 *)(rw), ia64_set_val, 0); \
242 (ia64_val == 0); \
243})
244
245static inline void arch_write_unlock(arch_rwlock_t *x)
246{
247 barrier();
248 x->write_lock = 0;
249}
250
251#endif /* !ASM_SUPPORTED */
252
253static inline int arch_read_trylock(arch_rwlock_t *x)
254{
255 union {
256 arch_rwlock_t lock;
257 __u32 word;
258 } old, new;
259 old.lock = new.lock = *x;
260 old.lock.write_lock = new.lock.write_lock = 0;
261 ++new.lock.read_counter;
262 return (u32)ia64_cmpxchg4_acq((__u32 *)(x), new.word, old.word) == old.word;
263}
264
265#endif /* _ASM_IA64_SPINLOCK_H */
arch/ia64/include/asm/spinlock_types.h+0−22
@@ -1,22 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_SPINLOCK_TYPES_H
3#define _ASM_IA64_SPINLOCK_TYPES_H
4
5#ifndef __LINUX_SPINLOCK_TYPES_RAW_H
6# error "please don't include this file directly"
7#endif
8
9typedef struct {
10 volatile unsigned int lock;
11} arch_spinlock_t;
12
13#define __ARCH_SPIN_LOCK_UNLOCKED { 0 }
14
15typedef struct {
16 volatile unsigned int read_counter : 31;
17 volatile unsigned int write_lock : 1;
18} arch_rwlock_t;
19
20#define __ARCH_RW_LOCK_UNLOCKED { 0, 0 }
21
22#endif
arch/ia64/include/asm/string.h+0−22
@@ -1,22 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_STRING_H
3#define _ASM_IA64_STRING_H
4
5/*
6 * Here is where we want to put optimized versions of the string
7 * routines.
8 *
9 * Copyright (C) 1998-2000, 2002 Hewlett-Packard Co
10 * David Mosberger-Tang <davidm@hpl.hp.com>
11 */
12
13
14#define __HAVE_ARCH_STRLEN 1 /* see arch/ia64/lib/strlen.S */
15#define __HAVE_ARCH_MEMSET 1 /* see arch/ia64/lib/memset.S */
16#define __HAVE_ARCH_MEMCPY 1 /* see arch/ia64/lib/memcpy.S */
17
18extern __kernel_size_t strlen (const char *);
19extern void *memcpy (void *, const void *, __kernel_size_t);
20extern void *memset (void *, int, __kernel_size_t);
21
22#endif /* _ASM_IA64_STRING_H */
arch/ia64/include/asm/switch_to.h+0−71
@@ -1,71 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Low-level task switching. This is based on information published in
4 * the Processor Abstraction Layer and the System Abstraction Layer
5 * manual.
6 *
7 * Copyright (C) 1998-2003 Hewlett-Packard Co
8 * David Mosberger-Tang <davidm@hpl.hp.com>
9 * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
10 * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
11 */
12#ifndef _ASM_IA64_SWITCH_TO_H
13#define _ASM_IA64_SWITCH_TO_H
14
15#include <linux/percpu.h>
16
17struct task_struct;
18
19/*
20 * Context switch from one thread to another. If the two threads have
21 * different address spaces, schedule() has already taken care of
22 * switching to the new address space by calling switch_mm().
23 *
24 * Disabling access to the fph partition and the debug-register
25 * context switch MUST be done before calling ia64_switch_to() since a
26 * newly created thread returns directly to
27 * ia64_ret_from_syscall_clear_r8.
28 */
29extern struct task_struct *ia64_switch_to (void *next_task);
30
31extern void ia64_save_extra (struct task_struct *task);
32extern void ia64_load_extra (struct task_struct *task);
33
34#define IA64_HAS_EXTRA_STATE(t) \
35 ((t)->thread.flags & (IA64_THREAD_DBG_VALID|IA64_THREAD_PM_VALID))
36
37#define __switch_to(prev,next,last) do { \
38 if (IA64_HAS_EXTRA_STATE(prev)) \
39 ia64_save_extra(prev); \
40 if (IA64_HAS_EXTRA_STATE(next)) \
41 ia64_load_extra(next); \
42 ia64_psr(task_pt_regs(next))->dfh = !ia64_is_local_fpu_owner(next); \
43 (last) = ia64_switch_to((next)); \
44} while (0)
45
46#ifdef CONFIG_SMP
47/*
48 * In the SMP case, we save the fph state when context-switching away from a thread that
49 * modified fph. This way, when the thread gets scheduled on another CPU, the CPU can
50 * pick up the state from task->thread.fph, avoiding the complication of having to fetch
51 * the latest fph state from another CPU. In other words: eager save, lazy restore.
52 */
53# define switch_to(prev,next,last) do { \
54 if (ia64_psr(task_pt_regs(prev))->mfh && ia64_is_local_fpu_owner(prev)) { \
55 ia64_psr(task_pt_regs(prev))->mfh = 0; \
56 (prev)->thread.flags |= IA64_THREAD_FPH_VALID; \
57 __ia64_save_fpu((prev)->thread.fph); \
58 } \
59 __switch_to(prev, next, last); \
60 /* "next" in old context is "current" in new context */ \
61 if (unlikely((current->thread.flags & IA64_THREAD_MIGRATION) && \
62 (task_cpu(current) != \
63 task_thread_info(current)->last_cpu))) { \
64 task_thread_info(current)->last_cpu = task_cpu(current); \
65 } \
66} while (0)
67#else
68# define switch_to(prev,next,last) __switch_to(prev, next, last)
69#endif
70
71#endif /* _ASM_IA64_SWITCH_TO_H */
arch/ia64/include/asm/syscall.h+0−65
@@ -1,65 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Access to user system call parameters and results
4 *
5 * Copyright (C) 2008 Intel Corp. Shaohua Li <shaohua.li@intel.com>
6 *
7 * See asm-generic/syscall.h for descriptions of what we must do here.
8 */
9
10#ifndef _ASM_SYSCALL_H
11#define _ASM_SYSCALL_H 1
12
13#include <uapi/linux/audit.h>
14#include <linux/sched.h>
15#include <linux/err.h>
16
17static inline long syscall_get_nr(struct task_struct *task,
18 struct pt_regs *regs)
19{
20 if ((long)regs->cr_ifs < 0) /* Not a syscall */
21 return -1;
22
23 return regs->r15;
24}
25
26static inline void syscall_rollback(struct task_struct *task,
27 struct pt_regs *regs)
28{
29 /* do nothing */
30}
31
32static inline long syscall_get_error(struct task_struct *task,
33 struct pt_regs *regs)
34{
35 return regs->r10 == -1 ? -regs->r8:0;
36}
37
38static inline long syscall_get_return_value(struct task_struct *task,
39 struct pt_regs *regs)
40{
41 return regs->r8;
42}
43
44static inline void syscall_set_return_value(struct task_struct *task,
45 struct pt_regs *regs,
46 int error, long val)
47{
48 if (error) {
49 /* error < 0, but ia64 uses > 0 return value */
50 regs->r8 = -error;
51 regs->r10 = -1;
52 } else {
53 regs->r8 = val;
54 regs->r10 = 0;
55 }
56}
57
58extern void syscall_get_arguments(struct task_struct *task,
59 struct pt_regs *regs, unsigned long *args);
60
61static inline int syscall_get_arch(struct task_struct *task)
62{
63 return AUDIT_ARCH_IA64;
64}
65#endif /* _ASM_SYSCALL_H */
arch/ia64/include/asm/thread_info.h+0−131
@@ -1,131 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2002-2003 Hewlett-Packard Co
4 * David Mosberger-Tang <davidm@hpl.hp.com>
5 */
6#ifndef _ASM_IA64_THREAD_INFO_H
7#define _ASM_IA64_THREAD_INFO_H
8
9#ifndef ASM_OFFSETS_C
10#include <asm/asm-offsets.h>
11#endif
12#include <asm/processor.h>
13#include <asm/ptrace.h>
14
15#define THREAD_SIZE KERNEL_STACK_SIZE
16
17#ifndef __ASSEMBLY__
18
19/*
20 * On IA-64, we want to keep the task structure and kernel stack together, so they can be
21 * mapped by a single TLB entry and so they can be addressed by the "current" pointer
22 * without having to do pointer masking.
23 */
24struct thread_info {
25 struct task_struct *task; /* XXX not really needed, except for dup_task_struct() */
26 __u32 flags; /* thread_info flags (see TIF_*) */
27 __u32 cpu; /* current CPU */
28 __u32 last_cpu; /* Last CPU thread ran on */
29 __u32 status; /* Thread synchronous flags */
30 int preempt_count; /* 0=premptable, <0=BUG; will also serve as bh-counter */
31#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
32 __u64 utime;
33 __u64 stime;
34 __u64 gtime;
35 __u64 hardirq_time;
36 __u64 softirq_time;
37 __u64 idle_time;
38 __u64 ac_stamp;
39 __u64 ac_leave;
40 __u64 ac_stime;
41 __u64 ac_utime;
42#endif
43};
44
45#define INIT_THREAD_INFO(tsk) \
46{ \
47 .task = &tsk, \
48 .flags = 0, \
49 .cpu = 0, \
50 .preempt_count = INIT_PREEMPT_COUNT, \
51}
52
53#ifndef ASM_OFFSETS_C
54/* how to get the thread information struct from C */
55#define current_thread_info() ((struct thread_info *) ((char *) current + IA64_TASK_SIZE))
56#define arch_alloc_thread_stack_node(tsk, node) \
57 ((unsigned long *) ((char *) (tsk) + IA64_TASK_SIZE))
58#define task_thread_info(tsk) ((struct thread_info *) ((char *) (tsk) + IA64_TASK_SIZE))
59#else
60#define current_thread_info() ((struct thread_info *) 0)
61#define arch_alloc_thread_stack_node(tsk, node) ((unsigned long *) 0)
62#define task_thread_info(tsk) ((struct thread_info *) 0)
63#endif
64#define arch_free_thread_stack(tsk) /* nothing */
65#define task_stack_page(tsk) ((void *)(tsk))
66
67#define __HAVE_THREAD_FUNCTIONS
68#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
69#define setup_thread_stack(p, org) \
70 *task_thread_info(p) = *task_thread_info(org); \
71 task_thread_info(p)->ac_stime = 0; \
72 task_thread_info(p)->ac_utime = 0; \
73 task_thread_info(p)->task = (p);
74#else
75#define setup_thread_stack(p, org) \
76 *task_thread_info(p) = *task_thread_info(org); \
77 task_thread_info(p)->task = (p);
78#endif
79#define end_of_stack(p) (unsigned long *)((void *)(p) + IA64_RBS_OFFSET)
80
81#define alloc_task_struct_node(node) \
82({ \
83 struct page *page = alloc_pages_node(node, GFP_KERNEL | __GFP_COMP, \
84 KERNEL_STACK_SIZE_ORDER); \
85 struct task_struct *ret = page ? page_address(page) : NULL; \
86 \
87 ret; \
88})
89#define free_task_struct(tsk) free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER)
90
91#endif /* !__ASSEMBLY */
92
93/*
94 * thread information flags
95 * - these are process state flags that various assembly files may need to access
96 * - pending work-to-be-done flags are in least-significant 16 bits, other flags
97 * in top 16 bits
98 */
99#define TIF_SIGPENDING 0 /* signal pending */
100#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
101#define TIF_SYSCALL_TRACE 2 /* syscall trace active */
102#define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */
103#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */
104#define TIF_NOTIFY_SIGNAL 5 /* signal notification exist */
105#define TIF_NOTIFY_RESUME 6 /* resumption notification requested */
106#define TIF_MEMDIE 17 /* is terminating due to OOM killer */
107#define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */
108#define TIF_DB_DISABLED 19 /* debug trap disabled for fsyscall */
109#define TIF_RESTORE_RSE 21 /* user RBS is newer than kernel RBS */
110#define TIF_POLLING_NRFLAG 22 /* idle is polling for TIF_NEED_RESCHED */
111
112#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
113#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
114#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
115#define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP)
116#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
117#define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL)
118#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
119#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
120#define _TIF_MCA_INIT (1 << TIF_MCA_INIT)
121#define _TIF_DB_DISABLED (1 << TIF_DB_DISABLED)
122#define _TIF_RESTORE_RSE (1 << TIF_RESTORE_RSE)
123#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
124
125/* "work to do on user-return" bits */
126#define TIF_ALLWORK_MASK (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SYSCALL_AUDIT|\
127 _TIF_NEED_RESCHED|_TIF_SYSCALL_TRACE|_TIF_NOTIFY_SIGNAL)
128/* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */
129#define TIF_WORK_MASK (TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT))
130
131#endif /* _ASM_IA64_THREAD_INFO_H */
arch/ia64/include/asm/timex.h+0−47
@@ -1,47 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_TIMEX_H
3#define _ASM_IA64_TIMEX_H
4
5/*
6 * Copyright (C) 1998-2001, 2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9/*
10 * 2001/01/18 davidm Removed CLOCK_TICK_RATE. It makes no sense on IA-64.
11 * Also removed cacheflush_time as it's entirely unused.
12 */
13
14#include <asm/intrinsics.h>
15#include <asm/processor.h>
16
17typedef unsigned long cycles_t;
18
19extern void (*ia64_udelay)(unsigned long usecs);
20
21/*
22 * For performance reasons, we don't want to define CLOCK_TICK_TRATE as
23 * local_cpu_data->itc_rate. Fortunately, we don't have to, either: according to George
24 * Anzinger, 1/CLOCK_TICK_RATE is taken as the resolution of the timer clock. The time
25 * calculation assumes that you will use enough of these so that your tick size <= 1/HZ.
26 * If the calculation shows that your CLOCK_TICK_RATE can not supply exactly 1/HZ ticks,
27 * the actual value is calculated and used to update the wall clock each jiffie. Setting
28 * the CLOCK_TICK_RATE to x*HZ insures that the calculation will find no errors. Hence we
29 * pick a multiple of HZ which gives us a (totally virtual) CLOCK_TICK_RATE of about
30 * 100MHz.
31 */
32#define CLOCK_TICK_RATE (HZ * 100000UL)
33
34static inline cycles_t
35get_cycles (void)
36{
37 cycles_t ret;
38
39 ret = ia64_getreg(_IA64_REG_AR_ITC);
40 return ret;
41}
42#define get_cycles get_cycles
43
44extern void ia64_cpu_local_tick (void);
45extern unsigned long long ia64_native_sched_clock (void);
46
47#endif /* _ASM_IA64_TIMEX_H */
arch/ia64/include/asm/tlb.h+0−50
@@ -1,50 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_TLB_H
3#define _ASM_IA64_TLB_H
4/*
5 * Based on <asm-generic/tlb.h>.
6 *
7 * Copyright (C) 2002-2003 Hewlett-Packard Co
8 * David Mosberger-Tang <davidm@hpl.hp.com>
9 */
10/*
11 * Removing a translation from a page table (including TLB-shootdown) is a four-step
12 * procedure:
13 *
14 * (1) Flush (virtual) caches --- ensures virtual memory is coherent with kernel memory
15 * (this is a no-op on ia64).
16 * (2) Clear the relevant portions of the page-table
17 * (3) Flush the TLBs --- ensures that stale content is gone from CPU TLBs
18 * (4) Release the pages that were freed up in step (2).
19 *
20 * Note that the ordering of these steps is crucial to avoid races on MP machines.
21 *
22 * The Linux kernel defines several platform-specific hooks for TLB-shootdown. When
23 * unmapping a portion of the virtual address space, these hooks are called according to
24 * the following template:
25 *
26 * tlb <- tlb_gather_mmu(mm); // start unmap for address space MM
27 * {
28 * for each vma that needs a shootdown do {
29 * tlb_start_vma(tlb, vma);
30 * for each page-table-entry PTE that needs to be removed do {
31 * tlb_remove_tlb_entry(tlb, pte, address);
32 * if (pte refers to a normal page) {
33 * tlb_remove_page(tlb, page);
34 * }
35 * }
36 * tlb_end_vma(tlb, vma);
37 * }
38 * }
39 * tlb_finish_mmu(tlb); // finish unmap for address space MM
40 */
41#include <linux/mm.h>
42#include <linux/pagemap.h>
43#include <linux/swap.h>
44
45#include <asm/processor.h>
46#include <asm/tlbflush.h>
47
48#include <asm-generic/tlb.h>
49
50#endif /* _ASM_IA64_TLB_H */
arch/ia64/include/asm/tlbflush.h+0−128
@@ -1,128 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_TLBFLUSH_H
3#define _ASM_IA64_TLBFLUSH_H
4
5/*
6 * Copyright (C) 2002 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10
11#include <linux/mm.h>
12
13#include <asm/intrinsics.h>
14#include <asm/mmu_context.h>
15#include <asm/page.h>
16
17struct ia64_tr_entry {
18 u64 ifa;
19 u64 itir;
20 u64 pte;
21 u64 rr;
22}; /*Record for tr entry!*/
23
24extern int ia64_itr_entry(u64 target_mask, u64 va, u64 pte, u64 log_size);
25extern void ia64_ptr_entry(u64 target_mask, int slot);
26extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS];
27
28/*
29 region register macros
30*/
31#define RR_TO_VE(val) (((val) >> 0) & 0x0000000000000001)
32#define RR_VE(val) (((val) & 0x0000000000000001) << 0)
33#define RR_VE_MASK 0x0000000000000001L
34#define RR_VE_SHIFT 0
35#define RR_TO_PS(val) (((val) >> 2) & 0x000000000000003f)
36#define RR_PS(val) (((val) & 0x000000000000003f) << 2)
37#define RR_PS_MASK 0x00000000000000fcL
38#define RR_PS_SHIFT 2
39#define RR_RID_MASK 0x00000000ffffff00L
40#define RR_TO_RID(val) ((val >> 8) & 0xffffff)
41
42/*
43 * Now for some TLB flushing routines. This is the kind of stuff that
44 * can be very expensive, so try to avoid them whenever possible.
45 */
46extern void setup_ptcg_sem(int max_purges, int from_palo);
47
48/*
49 * Flush everything (kernel mapping may also have changed due to
50 * vmalloc/vfree).
51 */
52extern void local_flush_tlb_all (void);
53
54#ifdef CONFIG_SMP
55 extern void smp_flush_tlb_all (void);
56 extern void smp_flush_tlb_mm (struct mm_struct *mm);
57 extern void smp_flush_tlb_cpumask (cpumask_t xcpumask);
58# define flush_tlb_all() smp_flush_tlb_all()
59#else
60# define flush_tlb_all() local_flush_tlb_all()
61# define smp_flush_tlb_cpumask(m) local_flush_tlb_all()
62#endif
63
64static inline void
65local_finish_flush_tlb_mm (struct mm_struct *mm)
66{
67 if (mm == current->active_mm)
68 activate_context(mm);
69}
70
71/*
72 * Flush a specified user mapping. This is called, e.g., as a result of fork() and
73 * exit(). fork() ends up here because the copy-on-write mechanism needs to write-protect
74 * the PTEs of the parent task.
75 */
76static inline void
77flush_tlb_mm (struct mm_struct *mm)
78{
79 if (!mm)
80 return;
81
82 set_bit(mm->context, ia64_ctx.flushmap);
83 mm->context = 0;
84
85 if (atomic_read(&mm->mm_users) == 0)
86 return; /* happens as a result of exit_mmap() */
87
88#ifdef CONFIG_SMP
89 smp_flush_tlb_mm(mm);
90#else
91 local_finish_flush_tlb_mm(mm);
92#endif
93}
94
95extern void flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long end);
96
97/*
98 * Page-granular tlb flush.
99 */
100static inline void
101flush_tlb_page (struct vm_area_struct *vma, unsigned long addr)
102{
103#ifdef CONFIG_SMP
104 flush_tlb_range(vma, (addr & PAGE_MASK), (addr & PAGE_MASK) + PAGE_SIZE);
105#else
106 if (vma->vm_mm == current->active_mm)
107 ia64_ptcl(addr, (PAGE_SHIFT << 2));
108 else
109 vma->vm_mm->context = 0;
110#endif
111}
112
113/*
114 * Flush the local TLB. Invoked from another cpu using an IPI.
115 */
116#ifdef CONFIG_SMP
117void smp_local_flush_tlb(void);
118#else
119#define smp_local_flush_tlb()
120#endif
121
122static inline void flush_tlb_kernel_range(unsigned long start,
123 unsigned long end)
124{
125 flush_tlb_all(); /* XXX fix me */
126}
127
128#endif /* _ASM_IA64_TLBFLUSH_H */
arch/ia64/include/asm/topology.h+0−56
@@ -1,56 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Copyright (C) 2002, Erich Focht, NEC
4 *
5 * All rights reserved.
6 */
7#ifndef _ASM_IA64_TOPOLOGY_H
8#define _ASM_IA64_TOPOLOGY_H
9
10#include <asm/acpi.h>
11#include <asm/numa.h>
12#include <asm/smp.h>
13
14#ifdef CONFIG_NUMA
15
16/* Nodes w/o CPUs are preferred for memory allocations, see build_zonelists */
17#define PENALTY_FOR_NODE_WITH_CPUS 255
18
19/*
20 * Nodes within this distance are eligible for reclaim by zone_reclaim() when
21 * zone_reclaim_mode is enabled.
22 */
23#define RECLAIM_DISTANCE 15
24
25/*
26 * Returns a bitmask of CPUs on Node 'node'.
27 */
28#define cpumask_of_node(node) ((node) == -1 ? \
29 cpu_all_mask : \
30 &node_to_cpu_mask[node])
31
32/*
33 * Determines the node for a given pci bus
34 */
35#define pcibus_to_node(bus) PCI_CONTROLLER(bus)->node
36
37void build_cpu_to_node_map(void);
38
39#endif /* CONFIG_NUMA */
40
41#ifdef CONFIG_SMP
42#define topology_physical_package_id(cpu) (cpu_data(cpu)->socket_id)
43#define topology_core_id(cpu) (cpu_data(cpu)->core_id)
44#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
45#define topology_sibling_cpumask(cpu) (&per_cpu(cpu_sibling_map, cpu))
46#endif
47
48extern void arch_fix_phys_package_id(int num, u32 slot);
49
50#define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \
51 cpu_all_mask : \
52 cpumask_of_node(pcibus_to_node(bus)))
53
54#include <asm-generic/topology.h>
55
56#endif /* _ASM_IA64_TOPOLOGY_H */
arch/ia64/include/asm/types.h+0−32
@@ -1,32 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * This file is never included by application software unless explicitly
4 * requested (e.g., via linux/types.h) in which case the application is
5 * Linux specific so (user-) name space pollution is not a major issue.
6 * However, for interoperability, libraries still need to be careful to
7 * avoid naming clashes.
8 *
9 * Based on <asm-alpha/types.h>.
10 *
11 * Modified 1998-2000, 2002
12 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
13 */
14#ifndef _ASM_IA64_TYPES_H
15#define _ASM_IA64_TYPES_H
16
17#include <asm-generic/int-ll64.h>
18#include <uapi/asm/types.h>
19
20#ifdef __ASSEMBLY__
21#else
22/*
23 * These aren't exported outside the kernel to avoid name space clashes
24 */
25
26struct fnptr {
27 unsigned long ip;
28 unsigned long gp;
29};
30
31#endif /* !__ASSEMBLY__ */
32#endif /* _ASM_IA64_TYPES_H */
arch/ia64/include/asm/uaccess.h+0−265
@@ -1,265 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_UACCESS_H
3#define _ASM_IA64_UACCESS_H
4
5/*
6 * This file defines various macros to transfer memory areas across
7 * the user/kernel boundary. This needs to be done carefully because
8 * this code is executed in kernel mode and uses user-specified
9 * addresses. Thus, we need to be careful not to let the user to
10 * trick us into accessing kernel memory that would normally be
11 * inaccessible. This code is also fairly performance sensitive,
12 * so we want to spend as little time doing safety checks as
13 * possible.
14 *
15 * To make matters a bit more interesting, these macros sometimes also
16 * called from within the kernel itself, in which case the address
17 * validity check must be skipped. The get_fs() macro tells us what
18 * to do: if get_fs()==USER_DS, checking is performed, if
19 * get_fs()==KERNEL_DS, checking is bypassed.
20 *
21 * Note that even if the memory area specified by the user is in a
22 * valid address range, it is still possible that we'll get a page
23 * fault while accessing it. This is handled by filling out an
24 * exception handler fixup entry for each instruction that has the
25 * potential to fault. When such a fault occurs, the page fault
26 * handler checks to see whether the faulting instruction has a fixup
27 * associated and, if so, sets r8 to -EFAULT and clears r9 to 0 and
28 * then resumes execution at the continuation point.
29 *
30 * Based on <asm-alpha/uaccess.h>.
31 *
32 * Copyright (C) 1998, 1999, 2001-2004 Hewlett-Packard Co
33 * David Mosberger-Tang <davidm@hpl.hp.com>
34 */
35
36#include <linux/compiler.h>
37#include <linux/page-flags.h>
38
39#include <asm/intrinsics.h>
40#include <linux/pgtable.h>
41#include <asm/io.h>
42#include <asm/extable.h>
43
44/*
45 * When accessing user memory, we need to make sure the entire area really is
46 * in user-level space. We also need to make sure that the address doesn't
47 * point inside the virtually mapped linear page table.
48 */
49static inline int __access_ok(const void __user *p, unsigned long size)
50{
51 unsigned long limit = TASK_SIZE;
52 unsigned long addr = (unsigned long)p;
53
54 return likely((size <= limit) && (addr <= (limit - size)) &&
55 likely(REGION_OFFSET(addr) < RGN_MAP_LIMIT));
56}
57#define __access_ok __access_ok
58#include <asm-generic/access_ok.h>
59
60/*
61 * These are the main single-value transfer routines. They automatically
62 * use the right size if we just have the right pointer type.
63 *
64 * Careful to not
65 * (a) re-use the arguments for side effects (sizeof/typeof is ok)
66 * (b) require any knowledge of processes at this stage
67 */
68#define put_user(x, ptr) __put_user_check((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)))
69#define get_user(x, ptr) __get_user_check((x), (ptr), sizeof(*(ptr)))
70
71/*
72 * The "__xxx" versions do not do address space checking, useful when
73 * doing multiple accesses to the same area (the programmer has to do the
74 * checks by hand with "access_ok()")
75 */
76#define __put_user(x, ptr) __put_user_nocheck((__typeof__(*(ptr))) (x), (ptr), sizeof(*(ptr)))
77#define __get_user(x, ptr) __get_user_nocheck((x), (ptr), sizeof(*(ptr)))
78
79#ifdef ASM_SUPPORTED
80 struct __large_struct { unsigned long buf[100]; };
81# define __m(x) (*(struct __large_struct __user *)(x))
82
83/* We need to declare the __ex_table section before we can use it in .xdata. */
84asm (".section \"__ex_table\", \"a\"\n\t.previous");
85
86# define __get_user_size(val, addr, n, err) \
87do { \
88 register long __gu_r8 asm ("r8") = 0; \
89 register long __gu_r9 asm ("r9"); \
90 asm ("\n[1:]\tld"#n" %0=%2%P2\t// %0 and %1 get overwritten by exception handler\n" \
91 "\t.xdata4 \"__ex_table\", 1b-., 1f-.+4\n" \
92 "[1:]" \
93 : "=r"(__gu_r9), "=r"(__gu_r8) : "m"(__m(addr)), "1"(__gu_r8)); \
94 (err) = __gu_r8; \
95 (val) = __gu_r9; \
96} while (0)
97
98/*
99 * The "__put_user_size()" macro tells gcc it reads from memory instead of writing it. This
100 * is because they do not write to any memory gcc knows about, so there are no aliasing
101 * issues.
102 */
103# define __put_user_size(val, addr, n, err) \
104do { \
105 register long __pu_r8 asm ("r8") = 0; \
106 asm volatile ("\n[1:]\tst"#n" %1=%r2%P1\t// %0 gets overwritten by exception handler\n" \
107 "\t.xdata4 \"__ex_table\", 1b-., 1f-.\n" \
108 "[1:]" \
109 : "=r"(__pu_r8) : "m"(__m(addr)), "rO"(val), "0"(__pu_r8)); \
110 (err) = __pu_r8; \
111} while (0)
112
113#else /* !ASM_SUPPORTED */
114# define RELOC_TYPE 2 /* ip-rel */
115# define __get_user_size(val, addr, n, err) \
116do { \
117 __ld_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE); \
118 (err) = ia64_getreg(_IA64_REG_R8); \
119 (val) = ia64_getreg(_IA64_REG_R9); \
120} while (0)
121# define __put_user_size(val, addr, n, err) \
122do { \
123 __st_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE, \
124 (__force unsigned long) (val)); \
125 (err) = ia64_getreg(_IA64_REG_R8); \
126} while (0)
127#endif /* !ASM_SUPPORTED */
128
129extern void __get_user_unknown (void);
130
131/*
132 * Evaluating arguments X, PTR, SIZE, and SEGMENT may involve subroutine-calls, which
133 * could clobber r8 and r9 (among others). Thus, be careful not to evaluate it while
134 * using r8/r9.
135 */
136#define __do_get_user(check, x, ptr, size) \
137({ \
138 const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
139 __typeof__ (size) __gu_size = (size); \
140 long __gu_err = -EFAULT; \
141 unsigned long __gu_val = 0; \
142 if (!check || __access_ok(__gu_ptr, size)) \
143 switch (__gu_size) { \
144 case 1: __get_user_size(__gu_val, __gu_ptr, 1, __gu_err); break; \
145 case 2: __get_user_size(__gu_val, __gu_ptr, 2, __gu_err); break; \
146 case 4: __get_user_size(__gu_val, __gu_ptr, 4, __gu_err); break; \
147 case 8: __get_user_size(__gu_val, __gu_ptr, 8, __gu_err); break; \
148 default: __get_user_unknown(); break; \
149 } \
150 (x) = (__force __typeof__(*(__gu_ptr))) __gu_val; \
151 __gu_err; \
152})
153
154#define __get_user_nocheck(x, ptr, size) __do_get_user(0, x, ptr, size)
155#define __get_user_check(x, ptr, size) __do_get_user(1, x, ptr, size)
156
157extern void __put_user_unknown (void);
158
159/*
160 * Evaluating arguments X, PTR, SIZE, and SEGMENT may involve subroutine-calls, which
161 * could clobber r8 (among others). Thus, be careful not to evaluate them while using r8.
162 */
163#define __do_put_user(check, x, ptr, size) \
164({ \
165 __typeof__ (x) __pu_x = (x); \
166 __typeof__ (*(ptr)) __user *__pu_ptr = (ptr); \
167 __typeof__ (size) __pu_size = (size); \
168 long __pu_err = -EFAULT; \
169 \
170 if (!check || __access_ok(__pu_ptr, __pu_size)) \
171 switch (__pu_size) { \
172 case 1: __put_user_size(__pu_x, __pu_ptr, 1, __pu_err); break; \
173 case 2: __put_user_size(__pu_x, __pu_ptr, 2, __pu_err); break; \
174 case 4: __put_user_size(__pu_x, __pu_ptr, 4, __pu_err); break; \
175 case 8: __put_user_size(__pu_x, __pu_ptr, 8, __pu_err); break; \
176 default: __put_user_unknown(); break; \
177 } \
178 __pu_err; \
179})
180
181#define __put_user_nocheck(x, ptr, size) __do_put_user(0, x, ptr, size)
182#define __put_user_check(x, ptr, size) __do_put_user(1, x, ptr, size)
183
184/*
185 * Complex access routines
186 */
187extern unsigned long __must_check __copy_user (void __user *to, const void __user *from,
188 unsigned long count);
189
190static inline unsigned long
191raw_copy_to_user(void __user *to, const void *from, unsigned long count)
192{
193 return __copy_user(to, (__force void __user *) from, count);
194}
195
196static inline unsigned long
197raw_copy_from_user(void *to, const void __user *from, unsigned long count)
198{
199 return __copy_user((__force void __user *) to, from, count);
200}
201
202#define INLINE_COPY_FROM_USER
203#define INLINE_COPY_TO_USER
204
205extern unsigned long __do_clear_user (void __user *, unsigned long);
206
207#define __clear_user(to, n) __do_clear_user(to, n)
208
209#define clear_user(to, n) \
210({ \
211 unsigned long __cu_len = (n); \
212 if (__access_ok(to, __cu_len)) \
213 __cu_len = __do_clear_user(to, __cu_len); \
214 __cu_len; \
215})
216
217
218/*
219 * Returns: -EFAULT if exception before terminator, N if the entire buffer filled, else
220 * strlen.
221 */
222extern long __must_check __strncpy_from_user (char *to, const char __user *from, long to_len);
223
224#define strncpy_from_user(to, from, n) \
225({ \
226 const char __user * __sfu_from = (from); \
227 long __sfu_ret = -EFAULT; \
228 if (__access_ok(__sfu_from, 0)) \
229 __sfu_ret = __strncpy_from_user((to), __sfu_from, (n)); \
230 __sfu_ret; \
231})
232
233/*
234 * Returns: 0 if exception before NUL or reaching the supplied limit
235 * (N), a value greater than N if the limit would be exceeded, else
236 * strlen.
237 */
238extern unsigned long __strnlen_user (const char __user *, long);
239
240#define strnlen_user(str, len) \
241({ \
242 const char __user *__su_str = (str); \
243 unsigned long __su_ret = 0; \
244 if (__access_ok(__su_str, 0)) \
245 __su_ret = __strnlen_user(__su_str, len); \
246 __su_ret; \
247})
248
249#define ARCH_HAS_TRANSLATE_MEM_PTR 1
250static __inline__ void *
251xlate_dev_mem_ptr(phys_addr_t p)
252{
253 struct page *page;
254 void *ptr;
255
256 page = pfn_to_page(p >> PAGE_SHIFT);
257 if (PageUncached(page))
258 ptr = (void *)p + __IA64_UNCACHED_OFFSET;
259 else
260 ptr = __va(p);
261
262 return ptr;
263}
264
265#endif /* _ASM_IA64_UACCESS_H */
arch/ia64/include/asm/uncached.h+0−9
@@ -1,9 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2001-2008 Silicon Graphics, Inc. All rights reserved.
4 *
5 * Prototypes for the uncached page allocator
6 */
7
8extern unsigned long uncached_alloc_page(int starting_nid, int n_pages);
9extern void uncached_free_page(unsigned long uc_addr, int n_pages);
arch/ia64/include/asm/unistd.h+0−38
@@ -1,38 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * IA-64 Linux syscall numbers and inline-functions.
4 *
5 * Copyright (C) 1998-2005 Hewlett-Packard Co
6 * David Mosberger-Tang <davidm@hpl.hp.com>
7 */
8#ifndef _ASM_IA64_UNISTD_H
9#define _ASM_IA64_UNISTD_H
10
11#include <uapi/asm/unistd.h>
12
13#define NR_syscalls __NR_syscalls /* length of syscall table */
14
15#define __ARCH_WANT_NEW_STAT
16#define __ARCH_WANT_SYS_UTIME
17
18#if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
19
20#include <linux/types.h>
21#include <linux/linkage.h>
22#include <linux/compiler.h>
23
24extern long __ia64_syscall (long a0, long a1, long a2, long a3, long a4, long nr);
25
26asmlinkage unsigned long sys_mmap(
27 unsigned long addr, unsigned long len,
28 int prot, int flags,
29 int fd, long off);
30asmlinkage unsigned long sys_mmap2(
31 unsigned long addr, unsigned long len,
32 int prot, int flags,
33 int fd, long pgoff);
34struct pt_regs;
35asmlinkage long sys_ia64_pipe(void);
36
37#endif /* !__ASSEMBLY__ */
38#endif /* _ASM_IA64_UNISTD_H */
arch/ia64/include/asm/unwind.h+0−234
@@ -1,234 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_UNWIND_H
3#define _ASM_IA64_UNWIND_H
4
5/*
6 * Copyright (C) 1999-2000, 2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 *
9 * A simple API for unwinding kernel stacks. This is used for
10 * debugging and error reporting purposes. The kernel doesn't need
11 * full-blown stack unwinding with all the bells and whitles, so there
12 * is not much point in implementing the full IA-64 unwind API (though
13 * it would of course be possible to implement the kernel API on top
14 * of it).
15 */
16
17struct task_struct; /* forward declaration */
18struct switch_stack; /* forward declaration */
19
20enum unw_application_register {
21 UNW_AR_BSP,
22 UNW_AR_BSPSTORE,
23 UNW_AR_PFS,
24 UNW_AR_RNAT,
25 UNW_AR_UNAT,
26 UNW_AR_LC,
27 UNW_AR_EC,
28 UNW_AR_FPSR,
29 UNW_AR_RSC,
30 UNW_AR_CCV,
31 UNW_AR_CSD,
32 UNW_AR_SSD
33};
34
35/*
36 * The following declarations are private to the unwind
37 * implementation:
38 */
39
40struct unw_stack {
41 unsigned long limit;
42 unsigned long top;
43};
44
45#define UNW_FLAG_INTERRUPT_FRAME (1UL << 0)
46
47/*
48 * No user of this module should every access this structure directly
49 * as it is subject to change. It is declared here solely so we can
50 * use automatic variables.
51 */
52struct unw_frame_info {
53 struct unw_stack regstk;
54 struct unw_stack memstk;
55 unsigned int flags;
56 short hint;
57 short prev_script;
58
59 /* current frame info: */
60 unsigned long bsp; /* backing store pointer value */
61 unsigned long sp; /* stack pointer value */
62 unsigned long psp; /* previous sp value */
63 unsigned long ip; /* instruction pointer value */
64 unsigned long pr; /* current predicate values */
65 unsigned long *cfm_loc; /* cfm save location (or NULL) */
66 unsigned long pt; /* struct pt_regs location */
67
68 struct task_struct *task;
69 struct switch_stack *sw;
70
71 /* preserved state: */
72 unsigned long *bsp_loc; /* previous bsp save location */
73 unsigned long *bspstore_loc;
74 unsigned long *pfs_loc;
75 unsigned long *rnat_loc;
76 unsigned long *rp_loc;
77 unsigned long *pri_unat_loc;
78 unsigned long *unat_loc;
79 unsigned long *pr_loc;
80 unsigned long *lc_loc;
81 unsigned long *fpsr_loc;
82 struct unw_ireg {
83 unsigned long *loc;
84 struct unw_ireg_nat {
85 unsigned long type : 3; /* enum unw_nat_type */
86 signed long off : 61; /* NaT word is at loc+nat.off */
87 } nat;
88 } r4, r5, r6, r7;
89 unsigned long *b1_loc, *b2_loc, *b3_loc, *b4_loc, *b5_loc;
90 struct ia64_fpreg *f2_loc, *f3_loc, *f4_loc, *f5_loc, *fr_loc[16];
91};
92
93/*
94 * The official API follows below:
95 */
96
97struct unw_table_entry {
98 u64 start_offset;
99 u64 end_offset;
100 u64 info_offset;
101};
102
103/*
104 * Initialize unwind support.
105 */
106extern void unw_init (void);
107
108extern void *unw_add_unwind_table (const char *name, unsigned long segment_base, unsigned long gp,
109 const void *table_start, const void *table_end);
110
111extern void unw_remove_unwind_table (void *handle);
112
113/*
114 * Prepare to unwind blocked task t.
115 */
116extern void unw_init_from_blocked_task (struct unw_frame_info *info, struct task_struct *t);
117
118extern void unw_init_frame_info (struct unw_frame_info *info, struct task_struct *t,
119 struct switch_stack *sw);
120
121/*
122 * Prepare to unwind the currently running thread.
123 */
124extern void unw_init_running (void (*callback)(struct unw_frame_info *info, void *arg), void *arg);
125
126/*
127 * Unwind to previous to frame. Returns 0 if successful, negative
128 * number in case of an error.
129 */
130extern int unw_unwind (struct unw_frame_info *info);
131
132/*
133 * Unwind until the return pointer is in user-land (or until an error
134 * occurs). Returns 0 if successful, negative number in case of
135 * error.
136 */
137extern int unw_unwind_to_user (struct unw_frame_info *info);
138
139#define unw_is_intr_frame(info) (((info)->flags & UNW_FLAG_INTERRUPT_FRAME) != 0)
140
141static inline int
142unw_get_ip (struct unw_frame_info *info, unsigned long *valp)
143{
144 *valp = (info)->ip;
145 return 0;
146}
147
148static inline int
149unw_get_sp (struct unw_frame_info *info, unsigned long *valp)
150{
151 *valp = (info)->sp;
152 return 0;
153}
154
155static inline int
156unw_get_psp (struct unw_frame_info *info, unsigned long *valp)
157{
158 *valp = (info)->psp;
159 return 0;
160}
161
162static inline int
163unw_get_bsp (struct unw_frame_info *info, unsigned long *valp)
164{
165 *valp = (info)->bsp;
166 return 0;
167}
168
169static inline int
170unw_get_cfm (struct unw_frame_info *info, unsigned long *valp)
171{
172 *valp = *(info)->cfm_loc;
173 return 0;
174}
175
176static inline int
177unw_set_cfm (struct unw_frame_info *info, unsigned long val)
178{
179 *(info)->cfm_loc = val;
180 return 0;
181}
182
183static inline int
184unw_get_rp (struct unw_frame_info *info, unsigned long *val)
185{
186 if (!info->rp_loc)
187 return -1;
188 *val = *info->rp_loc;
189 return 0;
190}
191
192extern int unw_access_gr (struct unw_frame_info *, int, unsigned long *, char *, int);
193extern int unw_access_br (struct unw_frame_info *, int, unsigned long *, int);
194extern int unw_access_fr (struct unw_frame_info *, int, struct ia64_fpreg *, int);
195extern int unw_access_ar (struct unw_frame_info *, int, unsigned long *, int);
196extern int unw_access_pr (struct unw_frame_info *, unsigned long *, int);
197
198static inline int
199unw_set_gr (struct unw_frame_info *i, int n, unsigned long v, char nat)
200{
201 return unw_access_gr(i, n, &v, &nat, 1);
202}
203
204static inline int
205unw_set_br (struct unw_frame_info *i, int n, unsigned long v)
206{
207 return unw_access_br(i, n, &v, 1);
208}
209
210static inline int
211unw_set_fr (struct unw_frame_info *i, int n, struct ia64_fpreg v)
212{
213 return unw_access_fr(i, n, &v, 1);
214}
215
216static inline int
217unw_set_ar (struct unw_frame_info *i, int n, unsigned long v)
218{
219 return unw_access_ar(i, n, &v, 1);
220}
221
222static inline int
223unw_set_pr (struct unw_frame_info *i, unsigned long v)
224{
225 return unw_access_pr(i, &v, 1);
226}
227
228#define unw_get_gr(i,n,v,nat) unw_access_gr(i,n,v,nat,0)
229#define unw_get_br(i,n,v) unw_access_br(i,n,v,0)
230#define unw_get_fr(i,n,v) unw_access_fr(i,n,v,0)
231#define unw_get_ar(i,n,v) unw_access_ar(i,n,v,0)
232#define unw_get_pr(i,v) unw_access_pr(i,v,0)
233
234#endif /* _ASM_UNWIND_H */
arch/ia64/include/asm/user.h+0−53
@@ -1,53 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_USER_H
3#define _ASM_IA64_USER_H
4
5/*
6 * Core file format: The core file is written in such a way that gdb
7 * can understand it and provide useful information to the user (under
8 * linux we use the `trad-core' bfd). The file contents are as
9 * follows:
10 *
11 * upage: 1 page consisting of a user struct that tells gdb
12 * what is present in the file. Directly after this is a
13 * copy of the task_struct, which is currently not used by gdb,
14 * but it may come in handy at some point. All of the registers
15 * are stored as part of the upage. The upage should always be
16 * only one page long.
17 * data: The data segment follows next. We use current->end_text to
18 * current->brk to pick up all of the user variables, plus any memory
19 * that may have been sbrk'ed. No attempt is made to determine if a
20 * page is demand-zero or if a page is totally unused, we just cover
21 * the entire range. All of the addresses are rounded in such a way
22 * that an integral number of pages is written.
23 * stack: We need the stack information in order to get a meaningful
24 * backtrace. We need to write the data from usp to
25 * current->start_stack, so we round each of these in order to be able
26 * to write an integer number of pages.
27 *
28 * Modified 1998, 1999, 2001
29 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
30 */
31
32#include <linux/ptrace.h>
33#include <linux/types.h>
34
35#include <asm/page.h>
36
37#define EF_SIZE 3072 /* XXX fix me */
38
39struct user {
40 unsigned long regs[EF_SIZE/8+32]; /* integer and fp regs */
41 size_t u_tsize; /* text size (pages) */
42 size_t u_dsize; /* data size (pages) */
43 size_t u_ssize; /* stack size (pages) */
44 unsigned long start_code; /* text starting address */
45 unsigned long start_data; /* data starting address */
46 unsigned long start_stack; /* stack starting address */
47 long int signal; /* signal causing core dump */
48 unsigned long u_ar0; /* help gdb find registers */
49 unsigned long magic; /* identifies a core file */
50 char u_comm[32]; /* user command name */
51};
52
53#endif /* _ASM_IA64_USER_H */
arch/ia64/include/asm/ustack.h+0−12
@@ -1,12 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_USTACK_H
3#define _ASM_IA64_USTACK_H
4
5#include <asm/page.h>
6#include <uapi/asm/ustack.h>
7
8/* The absolute hard limit for stack size is 1/2 of the mappable space in the region */
9#define MAX_USER_STACK_SIZE (RGN_MAP_LIMIT/2)
10#define STACK_TOP (0x6000000000000000UL + RGN_MAP_LIMIT)
11#define STACK_TOP_MAX STACK_TOP
12#endif /* _ASM_IA64_USTACK_H */
arch/ia64/include/asm/uv/uv.h+0−30
@@ -1,30 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_UV_UV_H
3#define _ASM_IA64_UV_UV_H
4
5#ifdef CONFIG_IA64_SGI_UV
6extern bool ia64_is_uv;
7
8static inline int is_uv_system(void)
9{
10 return ia64_is_uv;
11}
12
13void __init uv_probe_system_type(void);
14void __init uv_setup(char **cmdline_p);
15#else /* CONFIG_IA64_SGI_UV */
16static inline int is_uv_system(void)
17{
18 return false;
19}
20
21static inline void __init uv_probe_system_type(void)
22{
23}
24
25static inline void __init uv_setup(char **cmdline_p)
26{
27}
28#endif /* CONFIG_IA64_SGI_UV */
29
30#endif /* _ASM_IA64_UV_UV_H */
arch/ia64/include/asm/uv/uv_hub.h+0−315
@@ -1,315 +0,0 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * SGI UV architectural definitions
7 *
8 * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved.
9 */
10
11#ifndef __ASM_IA64_UV_HUB_H__
12#define __ASM_IA64_UV_HUB_H__
13
14#include <linux/numa.h>
15#include <linux/percpu.h>
16#include <asm/types.h>
17#include <asm/percpu.h>
18
19
20/*
21 * Addressing Terminology
22 *
23 * M - The low M bits of a physical address represent the offset
24 * into the blade local memory. RAM memory on a blade is physically
25 * contiguous (although various IO spaces may punch holes in
26 * it)..
27 *
28 * N - Number of bits in the node portion of a socket physical
29 * address.
30 *
31 * NASID - network ID of a router, Mbrick or Cbrick. Nasid values of
32 * routers always have low bit of 1, C/MBricks have low bit
33 * equal to 0. Most addressing macros that target UV hub chips
34 * right shift the NASID by 1 to exclude the always-zero bit.
35 * NASIDs contain up to 15 bits.
36 *
37 * GNODE - NASID right shifted by 1 bit. Most mmrs contain gnodes instead
38 * of nasids.
39 *
40 * PNODE - the low N bits of the GNODE. The PNODE is the most useful variant
41 * of the nasid for socket usage.
42 *
43 *
44 * NumaLink Global Physical Address Format:
45 * +--------------------------------+---------------------+
46 * |00..000| GNODE | NodeOffset |
47 * +--------------------------------+---------------------+
48 * |<-------53 - M bits --->|<--------M bits ----->
49 *
50 * M - number of node offset bits (35 .. 40)
51 *
52 *
53 * Memory/UV-HUB Processor Socket Address Format:
54 * +----------------+---------------+---------------------+
55 * |00..000000000000| PNODE | NodeOffset |
56 * +----------------+---------------+---------------------+
57 * <--- N bits --->|<--------M bits ----->
58 *
59 * M - number of node offset bits (35 .. 40)
60 * N - number of PNODE bits (0 .. 10)
61 *
62 * Note: M + N cannot currently exceed 44 (x86_64) or 46 (IA64).
63 * The actual values are configuration dependent and are set at
64 * boot time. M & N values are set by the hardware/BIOS at boot.
65 */
66
67
68/*
69 * Maximum number of bricks in all partitions and in all coherency domains.
70 * This is the total number of bricks accessible in the numalink fabric. It
71 * includes all C & M bricks. Routers are NOT included.
72 *
73 * This value is also the value of the maximum number of non-router NASIDs
74 * in the numalink fabric.
75 *
76 * NOTE: a brick may contain 1 or 2 OS nodes. Don't get these confused.
77 */
78#define UV_MAX_NUMALINK_BLADES 16384
79
80/*
81 * Maximum number of C/Mbricks within a software SSI (hardware may support
82 * more).
83 */
84#define UV_MAX_SSI_BLADES 1
85
86/*
87 * The largest possible NASID of a C or M brick (+ 2)
88 */
89#define UV_MAX_NASID_VALUE (UV_MAX_NUMALINK_NODES * 2)
90
91/*
92 * The following defines attributes of the HUB chip. These attributes are
93 * frequently referenced and are kept in the per-cpu data areas of each cpu.
94 * They are kept together in a struct to minimize cache misses.
95 */
96struct uv_hub_info_s {
97 unsigned long global_mmr_base;
98 unsigned long gpa_mask;
99 unsigned long gnode_upper;
100 unsigned long lowmem_remap_top;
101 unsigned long lowmem_remap_base;
102 unsigned short pnode;
103 unsigned short pnode_mask;
104 unsigned short coherency_domain_number;
105 unsigned short numa_blade_id;
106 unsigned char blade_processor_id;
107 unsigned char m_val;
108 unsigned char n_val;
109};
110DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);
111#define uv_hub_info this_cpu_ptr(&__uv_hub_info)
112#define uv_cpu_hub_info(cpu) (&per_cpu(__uv_hub_info, cpu))
113
114/*
115 * Local & Global MMR space macros.
116 * Note: macros are intended to be used ONLY by inline functions
117 * in this file - not by other kernel code.
118 * n - NASID (full 15-bit global nasid)
119 * g - GNODE (full 15-bit global nasid, right shifted 1)
120 * p - PNODE (local part of nsids, right shifted 1)
121 */
122#define UV_NASID_TO_PNODE(n) (((n) >> 1) & uv_hub_info->pnode_mask)
123#define UV_PNODE_TO_NASID(p) (((p) << 1) | uv_hub_info->gnode_upper)
124
125#define UV_LOCAL_MMR_BASE 0xf4000000UL
126#define UV_GLOBAL_MMR32_BASE 0xf8000000UL
127#define UV_GLOBAL_MMR64_BASE (uv_hub_info->global_mmr_base)
128
129#define UV_GLOBAL_MMR32_PNODE_SHIFT 15
130#define UV_GLOBAL_MMR64_PNODE_SHIFT 26
131
132#define UV_GLOBAL_MMR32_PNODE_BITS(p) ((p) << (UV_GLOBAL_MMR32_PNODE_SHIFT))
133
134#define UV_GLOBAL_MMR64_PNODE_BITS(p) \
135 ((unsigned long)(p) << UV_GLOBAL_MMR64_PNODE_SHIFT)
136
137/*
138 * Macros for converting between kernel virtual addresses, socket local physical
139 * addresses, and UV global physical addresses.
140 * Note: use the standard __pa() & __va() macros for converting
141 * between socket virtual and socket physical addresses.
142 */
143
144/* socket phys RAM --> UV global physical address */
145static inline unsigned long uv_soc_phys_ram_to_gpa(unsigned long paddr)
146{
147 if (paddr < uv_hub_info->lowmem_remap_top)
148 paddr += uv_hub_info->lowmem_remap_base;
149 return paddr | uv_hub_info->gnode_upper;
150}
151
152
153/* socket virtual --> UV global physical address */
154static inline unsigned long uv_gpa(void *v)
155{
156 return __pa(v) | uv_hub_info->gnode_upper;
157}
158
159/* socket virtual --> UV global physical address */
160static inline void *uv_vgpa(void *v)
161{
162 return (void *)uv_gpa(v);
163}
164
165/* UV global physical address --> socket virtual */
166static inline void *uv_va(unsigned long gpa)
167{
168 return __va(gpa & uv_hub_info->gpa_mask);
169}
170
171/* pnode, offset --> socket virtual */
172static inline void *uv_pnode_offset_to_vaddr(int pnode, unsigned long offset)
173{
174 return __va(((unsigned long)pnode << uv_hub_info->m_val) | offset);
175}
176
177
178/*
179 * Access global MMRs using the low memory MMR32 space. This region supports
180 * faster MMR access but not all MMRs are accessible in this space.
181 */
182static inline unsigned long *uv_global_mmr32_address(int pnode,
183 unsigned long offset)
184{
185 return __va(UV_GLOBAL_MMR32_BASE |
186 UV_GLOBAL_MMR32_PNODE_BITS(pnode) | offset);
187}
188
189static inline void uv_write_global_mmr32(int pnode, unsigned long offset,
190 unsigned long val)
191{
192 *uv_global_mmr32_address(pnode, offset) = val;
193}
194
195static inline unsigned long uv_read_global_mmr32(int pnode,
196 unsigned long offset)
197{
198 return *uv_global_mmr32_address(pnode, offset);
199}
200
201/*
202 * Access Global MMR space using the MMR space located at the top of physical
203 * memory.
204 */
205static inline unsigned long *uv_global_mmr64_address(int pnode,
206 unsigned long offset)
207{
208 return __va(UV_GLOBAL_MMR64_BASE |
209 UV_GLOBAL_MMR64_PNODE_BITS(pnode) | offset);
210}
211
212static inline void uv_write_global_mmr64(int pnode, unsigned long offset,
213 unsigned long val)
214{
215 *uv_global_mmr64_address(pnode, offset) = val;
216}
217
218static inline unsigned long uv_read_global_mmr64(int pnode,
219 unsigned long offset)
220{
221 return *uv_global_mmr64_address(pnode, offset);
222}
223
224/*
225 * Access hub local MMRs. Faster than using global space but only local MMRs
226 * are accessible.
227 */
228static inline unsigned long *uv_local_mmr_address(unsigned long offset)
229{
230 return __va(UV_LOCAL_MMR_BASE | offset);
231}
232
233static inline unsigned long uv_read_local_mmr(unsigned long offset)
234{
235 return *uv_local_mmr_address(offset);
236}
237
238static inline void uv_write_local_mmr(unsigned long offset, unsigned long val)
239{
240 *uv_local_mmr_address(offset) = val;
241}
242
243/*
244 * Structures and definitions for converting between cpu, node, pnode, and blade
245 * numbers.
246 */
247
248/* Blade-local cpu number of current cpu. Numbered 0 .. <# cpus on the blade> */
249static inline int uv_blade_processor_id(void)
250{
251 return smp_processor_id();
252}
253
254/* Blade number of current cpu. Numnbered 0 .. <#blades -1> */
255static inline int uv_numa_blade_id(void)
256{
257 return 0;
258}
259
260/* Convert a cpu number to the UV blade number */
261static inline int uv_cpu_to_blade_id(int cpu)
262{
263 return 0;
264}
265
266/* Convert linux node number to the UV blade number */
267static inline int uv_node_to_blade_id(int nid)
268{
269 return 0;
270}
271
272/* Convert a blade id to the PNODE of the blade */
273static inline int uv_blade_to_pnode(int bid)
274{
275 return 0;
276}
277
278/* Determine the number of possible cpus on a blade */
279static inline int uv_blade_nr_possible_cpus(int bid)
280{
281 return num_possible_cpus();
282}
283
284/* Determine the number of online cpus on a blade */
285static inline int uv_blade_nr_online_cpus(int bid)
286{
287 return num_online_cpus();
288}
289
290/* Convert a cpu id to the PNODE of the blade containing the cpu */
291static inline int uv_cpu_to_pnode(int cpu)
292{
293 return 0;
294}
295
296/* Convert a linux node number to the PNODE of the blade */
297static inline int uv_node_to_pnode(int nid)
298{
299 return 0;
300}
301
302/* Maximum possible number of blades */
303static inline int uv_num_possible_blades(void)
304{
305 return 1;
306}
307
308static inline void uv_hub_send_ipi(int pnode, int apicid, int vector)
309{
310 /* not currently needed on ia64 */
311}
312
313
314#endif /* __ASM_IA64_UV_HUB__ */
315
arch/ia64/include/asm/uv/uv_mmrs.h+0−825
@@ -1,825 +0,0 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * SGI UV MMR definitions
7 *
8 * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved.
9 */
10
11#ifndef _ASM_IA64_UV_UV_MMRS_H
12#define _ASM_IA64_UV_UV_MMRS_H
13
14#define UV_MMR_ENABLE (1UL << 63)
15
16/* ========================================================================= */
17/* UVH_BAU_DATA_CONFIG */
18/* ========================================================================= */
19#define UVH_BAU_DATA_CONFIG 0x61680UL
20#define UVH_BAU_DATA_CONFIG_32 0x0438
21
22#define UVH_BAU_DATA_CONFIG_VECTOR_SHFT 0
23#define UVH_BAU_DATA_CONFIG_VECTOR_MASK 0x00000000000000ffUL
24#define UVH_BAU_DATA_CONFIG_DM_SHFT 8
25#define UVH_BAU_DATA_CONFIG_DM_MASK 0x0000000000000700UL
26#define UVH_BAU_DATA_CONFIG_DESTMODE_SHFT 11
27#define UVH_BAU_DATA_CONFIG_DESTMODE_MASK 0x0000000000000800UL
28#define UVH_BAU_DATA_CONFIG_STATUS_SHFT 12
29#define UVH_BAU_DATA_CONFIG_STATUS_MASK 0x0000000000001000UL
30#define UVH_BAU_DATA_CONFIG_P_SHFT 13
31#define UVH_BAU_DATA_CONFIG_P_MASK 0x0000000000002000UL
32#define UVH_BAU_DATA_CONFIG_T_SHFT 15
33#define UVH_BAU_DATA_CONFIG_T_MASK 0x0000000000008000UL
34#define UVH_BAU_DATA_CONFIG_M_SHFT 16
35#define UVH_BAU_DATA_CONFIG_M_MASK 0x0000000000010000UL
36#define UVH_BAU_DATA_CONFIG_APIC_ID_SHFT 32
37#define UVH_BAU_DATA_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
38
39union uvh_bau_data_config_u {
40 unsigned long v;
41 struct uvh_bau_data_config_s {
42 unsigned long vector_ : 8; /* RW */
43 unsigned long dm : 3; /* RW */
44 unsigned long destmode : 1; /* RW */
45 unsigned long status : 1; /* RO */
46 unsigned long p : 1; /* RO */
47 unsigned long rsvd_14 : 1; /* */
48 unsigned long t : 1; /* RO */
49 unsigned long m : 1; /* RW */
50 unsigned long rsvd_17_31: 15; /* */
51 unsigned long apic_id : 32; /* RW */
52 } s;
53};
54
55/* ========================================================================= */
56/* UVH_EVENT_OCCURRED0 */
57/* ========================================================================= */
58#define UVH_EVENT_OCCURRED0 0x70000UL
59#define UVH_EVENT_OCCURRED0_32 0x005e8
60
61#define UVH_EVENT_OCCURRED0_LB_HCERR_SHFT 0
62#define UVH_EVENT_OCCURRED0_LB_HCERR_MASK 0x0000000000000001UL
63#define UVH_EVENT_OCCURRED0_GR0_HCERR_SHFT 1
64#define UVH_EVENT_OCCURRED0_GR0_HCERR_MASK 0x0000000000000002UL
65#define UVH_EVENT_OCCURRED0_GR1_HCERR_SHFT 2
66#define UVH_EVENT_OCCURRED0_GR1_HCERR_MASK 0x0000000000000004UL
67#define UVH_EVENT_OCCURRED0_LH_HCERR_SHFT 3
68#define UVH_EVENT_OCCURRED0_LH_HCERR_MASK 0x0000000000000008UL
69#define UVH_EVENT_OCCURRED0_RH_HCERR_SHFT 4
70#define UVH_EVENT_OCCURRED0_RH_HCERR_MASK 0x0000000000000010UL
71#define UVH_EVENT_OCCURRED0_XN_HCERR_SHFT 5
72#define UVH_EVENT_OCCURRED0_XN_HCERR_MASK 0x0000000000000020UL
73#define UVH_EVENT_OCCURRED0_SI_HCERR_SHFT 6
74#define UVH_EVENT_OCCURRED0_SI_HCERR_MASK 0x0000000000000040UL
75#define UVH_EVENT_OCCURRED0_LB_AOERR0_SHFT 7
76#define UVH_EVENT_OCCURRED0_LB_AOERR0_MASK 0x0000000000000080UL
77#define UVH_EVENT_OCCURRED0_GR0_AOERR0_SHFT 8
78#define UVH_EVENT_OCCURRED0_GR0_AOERR0_MASK 0x0000000000000100UL
79#define UVH_EVENT_OCCURRED0_GR1_AOERR0_SHFT 9
80#define UVH_EVENT_OCCURRED0_GR1_AOERR0_MASK 0x0000000000000200UL
81#define UVH_EVENT_OCCURRED0_LH_AOERR0_SHFT 10
82#define UVH_EVENT_OCCURRED0_LH_AOERR0_MASK 0x0000000000000400UL
83#define UVH_EVENT_OCCURRED0_RH_AOERR0_SHFT 11
84#define UVH_EVENT_OCCURRED0_RH_AOERR0_MASK 0x0000000000000800UL
85#define UVH_EVENT_OCCURRED0_XN_AOERR0_SHFT 12
86#define UVH_EVENT_OCCURRED0_XN_AOERR0_MASK 0x0000000000001000UL
87#define UVH_EVENT_OCCURRED0_SI_AOERR0_SHFT 13
88#define UVH_EVENT_OCCURRED0_SI_AOERR0_MASK 0x0000000000002000UL
89#define UVH_EVENT_OCCURRED0_LB_AOERR1_SHFT 14
90#define UVH_EVENT_OCCURRED0_LB_AOERR1_MASK 0x0000000000004000UL
91#define UVH_EVENT_OCCURRED0_GR0_AOERR1_SHFT 15
92#define UVH_EVENT_OCCURRED0_GR0_AOERR1_MASK 0x0000000000008000UL
93#define UVH_EVENT_OCCURRED0_GR1_AOERR1_SHFT 16
94#define UVH_EVENT_OCCURRED0_GR1_AOERR1_MASK 0x0000000000010000UL
95#define UVH_EVENT_OCCURRED0_LH_AOERR1_SHFT 17
96#define UVH_EVENT_OCCURRED0_LH_AOERR1_MASK 0x0000000000020000UL
97#define UVH_EVENT_OCCURRED0_RH_AOERR1_SHFT 18
98#define UVH_EVENT_OCCURRED0_RH_AOERR1_MASK 0x0000000000040000UL
99#define UVH_EVENT_OCCURRED0_XN_AOERR1_SHFT 19
100#define UVH_EVENT_OCCURRED0_XN_AOERR1_MASK 0x0000000000080000UL
101#define UVH_EVENT_OCCURRED0_SI_AOERR1_SHFT 20
102#define UVH_EVENT_OCCURRED0_SI_AOERR1_MASK 0x0000000000100000UL
103#define UVH_EVENT_OCCURRED0_RH_VPI_INT_SHFT 21
104#define UVH_EVENT_OCCURRED0_RH_VPI_INT_MASK 0x0000000000200000UL
105#define UVH_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_SHFT 22
106#define UVH_EVENT_OCCURRED0_SYSTEM_SHUTDOWN_INT_MASK 0x0000000000400000UL
107#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_0_SHFT 23
108#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_0_MASK 0x0000000000800000UL
109#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_1_SHFT 24
110#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_1_MASK 0x0000000001000000UL
111#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_2_SHFT 25
112#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_2_MASK 0x0000000002000000UL
113#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_3_SHFT 26
114#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_3_MASK 0x0000000004000000UL
115#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_4_SHFT 27
116#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_4_MASK 0x0000000008000000UL
117#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_5_SHFT 28
118#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_5_MASK 0x0000000010000000UL
119#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_6_SHFT 29
120#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_6_MASK 0x0000000020000000UL
121#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_7_SHFT 30
122#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_7_MASK 0x0000000040000000UL
123#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_8_SHFT 31
124#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_8_MASK 0x0000000080000000UL
125#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_9_SHFT 32
126#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_9_MASK 0x0000000100000000UL
127#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_10_SHFT 33
128#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_10_MASK 0x0000000200000000UL
129#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_11_SHFT 34
130#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_11_MASK 0x0000000400000000UL
131#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_12_SHFT 35
132#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_12_MASK 0x0000000800000000UL
133#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_13_SHFT 36
134#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_13_MASK 0x0000001000000000UL
135#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_14_SHFT 37
136#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_14_MASK 0x0000002000000000UL
137#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_15_SHFT 38
138#define UVH_EVENT_OCCURRED0_LB_IRQ_INT_15_MASK 0x0000004000000000UL
139#define UVH_EVENT_OCCURRED0_L1_NMI_INT_SHFT 39
140#define UVH_EVENT_OCCURRED0_L1_NMI_INT_MASK 0x0000008000000000UL
141#define UVH_EVENT_OCCURRED0_STOP_CLOCK_SHFT 40
142#define UVH_EVENT_OCCURRED0_STOP_CLOCK_MASK 0x0000010000000000UL
143#define UVH_EVENT_OCCURRED0_ASIC_TO_L1_SHFT 41
144#define UVH_EVENT_OCCURRED0_ASIC_TO_L1_MASK 0x0000020000000000UL
145#define UVH_EVENT_OCCURRED0_L1_TO_ASIC_SHFT 42
146#define UVH_EVENT_OCCURRED0_L1_TO_ASIC_MASK 0x0000040000000000UL
147#define UVH_EVENT_OCCURRED0_LTC_INT_SHFT 43
148#define UVH_EVENT_OCCURRED0_LTC_INT_MASK 0x0000080000000000UL
149#define UVH_EVENT_OCCURRED0_LA_SEQ_TRIGGER_SHFT 44
150#define UVH_EVENT_OCCURRED0_LA_SEQ_TRIGGER_MASK 0x0000100000000000UL
151#define UVH_EVENT_OCCURRED0_IPI_INT_SHFT 45
152#define UVH_EVENT_OCCURRED0_IPI_INT_MASK 0x0000200000000000UL
153#define UVH_EVENT_OCCURRED0_EXTIO_INT0_SHFT 46
154#define UVH_EVENT_OCCURRED0_EXTIO_INT0_MASK 0x0000400000000000UL
155#define UVH_EVENT_OCCURRED0_EXTIO_INT1_SHFT 47
156#define UVH_EVENT_OCCURRED0_EXTIO_INT1_MASK 0x0000800000000000UL
157#define UVH_EVENT_OCCURRED0_EXTIO_INT2_SHFT 48
158#define UVH_EVENT_OCCURRED0_EXTIO_INT2_MASK 0x0001000000000000UL
159#define UVH_EVENT_OCCURRED0_EXTIO_INT3_SHFT 49
160#define UVH_EVENT_OCCURRED0_EXTIO_INT3_MASK 0x0002000000000000UL
161#define UVH_EVENT_OCCURRED0_PROFILE_INT_SHFT 50
162#define UVH_EVENT_OCCURRED0_PROFILE_INT_MASK 0x0004000000000000UL
163#define UVH_EVENT_OCCURRED0_RTC0_SHFT 51
164#define UVH_EVENT_OCCURRED0_RTC0_MASK 0x0008000000000000UL
165#define UVH_EVENT_OCCURRED0_RTC1_SHFT 52
166#define UVH_EVENT_OCCURRED0_RTC1_MASK 0x0010000000000000UL
167#define UVH_EVENT_OCCURRED0_RTC2_SHFT 53
168#define UVH_EVENT_OCCURRED0_RTC2_MASK 0x0020000000000000UL
169#define UVH_EVENT_OCCURRED0_RTC3_SHFT 54
170#define UVH_EVENT_OCCURRED0_RTC3_MASK 0x0040000000000000UL
171#define UVH_EVENT_OCCURRED0_BAU_DATA_SHFT 55
172#define UVH_EVENT_OCCURRED0_BAU_DATA_MASK 0x0080000000000000UL
173#define UVH_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_SHFT 56
174#define UVH_EVENT_OCCURRED0_POWER_MANAGEMENT_REQ_MASK 0x0100000000000000UL
175union uvh_event_occurred0_u {
176 unsigned long v;
177 struct uvh_event_occurred0_s {
178 unsigned long lb_hcerr : 1; /* RW, W1C */
179 unsigned long gr0_hcerr : 1; /* RW, W1C */
180 unsigned long gr1_hcerr : 1; /* RW, W1C */
181 unsigned long lh_hcerr : 1; /* RW, W1C */
182 unsigned long rh_hcerr : 1; /* RW, W1C */
183 unsigned long xn_hcerr : 1; /* RW, W1C */
184 unsigned long si_hcerr : 1; /* RW, W1C */
185 unsigned long lb_aoerr0 : 1; /* RW, W1C */
186 unsigned long gr0_aoerr0 : 1; /* RW, W1C */
187 unsigned long gr1_aoerr0 : 1; /* RW, W1C */
188 unsigned long lh_aoerr0 : 1; /* RW, W1C */
189 unsigned long rh_aoerr0 : 1; /* RW, W1C */
190 unsigned long xn_aoerr0 : 1; /* RW, W1C */
191 unsigned long si_aoerr0 : 1; /* RW, W1C */
192 unsigned long lb_aoerr1 : 1; /* RW, W1C */
193 unsigned long gr0_aoerr1 : 1; /* RW, W1C */
194 unsigned long gr1_aoerr1 : 1; /* RW, W1C */
195 unsigned long lh_aoerr1 : 1; /* RW, W1C */
196 unsigned long rh_aoerr1 : 1; /* RW, W1C */
197 unsigned long xn_aoerr1 : 1; /* RW, W1C */
198 unsigned long si_aoerr1 : 1; /* RW, W1C */
199 unsigned long rh_vpi_int : 1; /* RW, W1C */
200 unsigned long system_shutdown_int : 1; /* RW, W1C */
201 unsigned long lb_irq_int_0 : 1; /* RW, W1C */
202 unsigned long lb_irq_int_1 : 1; /* RW, W1C */
203 unsigned long lb_irq_int_2 : 1; /* RW, W1C */
204 unsigned long lb_irq_int_3 : 1; /* RW, W1C */
205 unsigned long lb_irq_int_4 : 1; /* RW, W1C */
206 unsigned long lb_irq_int_5 : 1; /* RW, W1C */
207 unsigned long lb_irq_int_6 : 1; /* RW, W1C */
208 unsigned long lb_irq_int_7 : 1; /* RW, W1C */
209 unsigned long lb_irq_int_8 : 1; /* RW, W1C */
210 unsigned long lb_irq_int_9 : 1; /* RW, W1C */
211 unsigned long lb_irq_int_10 : 1; /* RW, W1C */
212 unsigned long lb_irq_int_11 : 1; /* RW, W1C */
213 unsigned long lb_irq_int_12 : 1; /* RW, W1C */
214 unsigned long lb_irq_int_13 : 1; /* RW, W1C */
215 unsigned long lb_irq_int_14 : 1; /* RW, W1C */
216 unsigned long lb_irq_int_15 : 1; /* RW, W1C */
217 unsigned long l1_nmi_int : 1; /* RW, W1C */
218 unsigned long stop_clock : 1; /* RW, W1C */
219 unsigned long asic_to_l1 : 1; /* RW, W1C */
220 unsigned long l1_to_asic : 1; /* RW, W1C */
221 unsigned long ltc_int : 1; /* RW, W1C */
222 unsigned long la_seq_trigger : 1; /* RW, W1C */
223 unsigned long ipi_int : 1; /* RW, W1C */
224 unsigned long extio_int0 : 1; /* RW, W1C */
225 unsigned long extio_int1 : 1; /* RW, W1C */
226 unsigned long extio_int2 : 1; /* RW, W1C */
227 unsigned long extio_int3 : 1; /* RW, W1C */
228 unsigned long profile_int : 1; /* RW, W1C */
229 unsigned long rtc0 : 1; /* RW, W1C */
230 unsigned long rtc1 : 1; /* RW, W1C */
231 unsigned long rtc2 : 1; /* RW, W1C */
232 unsigned long rtc3 : 1; /* RW, W1C */
233 unsigned long bau_data : 1; /* RW, W1C */
234 unsigned long power_management_req : 1; /* RW, W1C */
235 unsigned long rsvd_57_63 : 7; /* */
236 } s;
237};
238
239/* ========================================================================= */
240/* UVH_EVENT_OCCURRED0_ALIAS */
241/* ========================================================================= */
242#define UVH_EVENT_OCCURRED0_ALIAS 0x0000000000070008UL
243#define UVH_EVENT_OCCURRED0_ALIAS_32 0x005f0
244
245/* ========================================================================= */
246/* UVH_GR0_TLB_INT0_CONFIG */
247/* ========================================================================= */
248#define UVH_GR0_TLB_INT0_CONFIG 0x61b00UL
249
250#define UVH_GR0_TLB_INT0_CONFIG_VECTOR_SHFT 0
251#define UVH_GR0_TLB_INT0_CONFIG_VECTOR_MASK 0x00000000000000ffUL
252#define UVH_GR0_TLB_INT0_CONFIG_DM_SHFT 8
253#define UVH_GR0_TLB_INT0_CONFIG_DM_MASK 0x0000000000000700UL
254#define UVH_GR0_TLB_INT0_CONFIG_DESTMODE_SHFT 11
255#define UVH_GR0_TLB_INT0_CONFIG_DESTMODE_MASK 0x0000000000000800UL
256#define UVH_GR0_TLB_INT0_CONFIG_STATUS_SHFT 12
257#define UVH_GR0_TLB_INT0_CONFIG_STATUS_MASK 0x0000000000001000UL
258#define UVH_GR0_TLB_INT0_CONFIG_P_SHFT 13
259#define UVH_GR0_TLB_INT0_CONFIG_P_MASK 0x0000000000002000UL
260#define UVH_GR0_TLB_INT0_CONFIG_T_SHFT 15
261#define UVH_GR0_TLB_INT0_CONFIG_T_MASK 0x0000000000008000UL
262#define UVH_GR0_TLB_INT0_CONFIG_M_SHFT 16
263#define UVH_GR0_TLB_INT0_CONFIG_M_MASK 0x0000000000010000UL
264#define UVH_GR0_TLB_INT0_CONFIG_APIC_ID_SHFT 32
265#define UVH_GR0_TLB_INT0_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
266
267union uvh_gr0_tlb_int0_config_u {
268 unsigned long v;
269 struct uvh_gr0_tlb_int0_config_s {
270 unsigned long vector_ : 8; /* RW */
271 unsigned long dm : 3; /* RW */
272 unsigned long destmode : 1; /* RW */
273 unsigned long status : 1; /* RO */
274 unsigned long p : 1; /* RO */
275 unsigned long rsvd_14 : 1; /* */
276 unsigned long t : 1; /* RO */
277 unsigned long m : 1; /* RW */
278 unsigned long rsvd_17_31: 15; /* */
279 unsigned long apic_id : 32; /* RW */
280 } s;
281};
282
283/* ========================================================================= */
284/* UVH_GR0_TLB_INT1_CONFIG */
285/* ========================================================================= */
286#define UVH_GR0_TLB_INT1_CONFIG 0x61b40UL
287
288#define UVH_GR0_TLB_INT1_CONFIG_VECTOR_SHFT 0
289#define UVH_GR0_TLB_INT1_CONFIG_VECTOR_MASK 0x00000000000000ffUL
290#define UVH_GR0_TLB_INT1_CONFIG_DM_SHFT 8
291#define UVH_GR0_TLB_INT1_CONFIG_DM_MASK 0x0000000000000700UL
292#define UVH_GR0_TLB_INT1_CONFIG_DESTMODE_SHFT 11
293#define UVH_GR0_TLB_INT1_CONFIG_DESTMODE_MASK 0x0000000000000800UL
294#define UVH_GR0_TLB_INT1_CONFIG_STATUS_SHFT 12
295#define UVH_GR0_TLB_INT1_CONFIG_STATUS_MASK 0x0000000000001000UL
296#define UVH_GR0_TLB_INT1_CONFIG_P_SHFT 13
297#define UVH_GR0_TLB_INT1_CONFIG_P_MASK 0x0000000000002000UL
298#define UVH_GR0_TLB_INT1_CONFIG_T_SHFT 15
299#define UVH_GR0_TLB_INT1_CONFIG_T_MASK 0x0000000000008000UL
300#define UVH_GR0_TLB_INT1_CONFIG_M_SHFT 16
301#define UVH_GR0_TLB_INT1_CONFIG_M_MASK 0x0000000000010000UL
302#define UVH_GR0_TLB_INT1_CONFIG_APIC_ID_SHFT 32
303#define UVH_GR0_TLB_INT1_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
304
305union uvh_gr0_tlb_int1_config_u {
306 unsigned long v;
307 struct uvh_gr0_tlb_int1_config_s {
308 unsigned long vector_ : 8; /* RW */
309 unsigned long dm : 3; /* RW */
310 unsigned long destmode : 1; /* RW */
311 unsigned long status : 1; /* RO */
312 unsigned long p : 1; /* RO */
313 unsigned long rsvd_14 : 1; /* */
314 unsigned long t : 1; /* RO */
315 unsigned long m : 1; /* RW */
316 unsigned long rsvd_17_31: 15; /* */
317 unsigned long apic_id : 32; /* RW */
318 } s;
319};
320
321/* ========================================================================= */
322/* UVH_GR1_TLB_INT0_CONFIG */
323/* ========================================================================= */
324#define UVH_GR1_TLB_INT0_CONFIG 0x61f00UL
325
326#define UVH_GR1_TLB_INT0_CONFIG_VECTOR_SHFT 0
327#define UVH_GR1_TLB_INT0_CONFIG_VECTOR_MASK 0x00000000000000ffUL
328#define UVH_GR1_TLB_INT0_CONFIG_DM_SHFT 8
329#define UVH_GR1_TLB_INT0_CONFIG_DM_MASK 0x0000000000000700UL
330#define UVH_GR1_TLB_INT0_CONFIG_DESTMODE_SHFT 11
331#define UVH_GR1_TLB_INT0_CONFIG_DESTMODE_MASK 0x0000000000000800UL
332#define UVH_GR1_TLB_INT0_CONFIG_STATUS_SHFT 12
333#define UVH_GR1_TLB_INT0_CONFIG_STATUS_MASK 0x0000000000001000UL
334#define UVH_GR1_TLB_INT0_CONFIG_P_SHFT 13
335#define UVH_GR1_TLB_INT0_CONFIG_P_MASK 0x0000000000002000UL
336#define UVH_GR1_TLB_INT0_CONFIG_T_SHFT 15
337#define UVH_GR1_TLB_INT0_CONFIG_T_MASK 0x0000000000008000UL
338#define UVH_GR1_TLB_INT0_CONFIG_M_SHFT 16
339#define UVH_GR1_TLB_INT0_CONFIG_M_MASK 0x0000000000010000UL
340#define UVH_GR1_TLB_INT0_CONFIG_APIC_ID_SHFT 32
341#define UVH_GR1_TLB_INT0_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
342
343union uvh_gr1_tlb_int0_config_u {
344 unsigned long v;
345 struct uvh_gr1_tlb_int0_config_s {
346 unsigned long vector_ : 8; /* RW */
347 unsigned long dm : 3; /* RW */
348 unsigned long destmode : 1; /* RW */
349 unsigned long status : 1; /* RO */
350 unsigned long p : 1; /* RO */
351 unsigned long rsvd_14 : 1; /* */
352 unsigned long t : 1; /* RO */
353 unsigned long m : 1; /* RW */
354 unsigned long rsvd_17_31: 15; /* */
355 unsigned long apic_id : 32; /* RW */
356 } s;
357};
358
359/* ========================================================================= */
360/* UVH_GR1_TLB_INT1_CONFIG */
361/* ========================================================================= */
362#define UVH_GR1_TLB_INT1_CONFIG 0x61f40UL
363
364#define UVH_GR1_TLB_INT1_CONFIG_VECTOR_SHFT 0
365#define UVH_GR1_TLB_INT1_CONFIG_VECTOR_MASK 0x00000000000000ffUL
366#define UVH_GR1_TLB_INT1_CONFIG_DM_SHFT 8
367#define UVH_GR1_TLB_INT1_CONFIG_DM_MASK 0x0000000000000700UL
368#define UVH_GR1_TLB_INT1_CONFIG_DESTMODE_SHFT 11
369#define UVH_GR1_TLB_INT1_CONFIG_DESTMODE_MASK 0x0000000000000800UL
370#define UVH_GR1_TLB_INT1_CONFIG_STATUS_SHFT 12
371#define UVH_GR1_TLB_INT1_CONFIG_STATUS_MASK 0x0000000000001000UL
372#define UVH_GR1_TLB_INT1_CONFIG_P_SHFT 13
373#define UVH_GR1_TLB_INT1_CONFIG_P_MASK 0x0000000000002000UL
374#define UVH_GR1_TLB_INT1_CONFIG_T_SHFT 15
375#define UVH_GR1_TLB_INT1_CONFIG_T_MASK 0x0000000000008000UL
376#define UVH_GR1_TLB_INT1_CONFIG_M_SHFT 16
377#define UVH_GR1_TLB_INT1_CONFIG_M_MASK 0x0000000000010000UL
378#define UVH_GR1_TLB_INT1_CONFIG_APIC_ID_SHFT 32
379#define UVH_GR1_TLB_INT1_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
380
381union uvh_gr1_tlb_int1_config_u {
382 unsigned long v;
383 struct uvh_gr1_tlb_int1_config_s {
384 unsigned long vector_ : 8; /* RW */
385 unsigned long dm : 3; /* RW */
386 unsigned long destmode : 1; /* RW */
387 unsigned long status : 1; /* RO */
388 unsigned long p : 1; /* RO */
389 unsigned long rsvd_14 : 1; /* */
390 unsigned long t : 1; /* RO */
391 unsigned long m : 1; /* RW */
392 unsigned long rsvd_17_31: 15; /* */
393 unsigned long apic_id : 32; /* RW */
394 } s;
395};
396
397/* ========================================================================= */
398/* UVH_INT_CMPB */
399/* ========================================================================= */
400#define UVH_INT_CMPB 0x22080UL
401
402#define UVH_INT_CMPB_REAL_TIME_CMPB_SHFT 0
403#define UVH_INT_CMPB_REAL_TIME_CMPB_MASK 0x00ffffffffffffffUL
404
405union uvh_int_cmpb_u {
406 unsigned long v;
407 struct uvh_int_cmpb_s {
408 unsigned long real_time_cmpb : 56; /* RW */
409 unsigned long rsvd_56_63 : 8; /* */
410 } s;
411};
412
413/* ========================================================================= */
414/* UVH_INT_CMPC */
415/* ========================================================================= */
416#define UVH_INT_CMPC 0x22100UL
417
418#define UVH_INT_CMPC_REAL_TIME_CMPC_SHFT 0
419#define UVH_INT_CMPC_REAL_TIME_CMPC_MASK 0x00ffffffffffffffUL
420
421union uvh_int_cmpc_u {
422 unsigned long v;
423 struct uvh_int_cmpc_s {
424 unsigned long real_time_cmpc : 56; /* RW */
425 unsigned long rsvd_56_63 : 8; /* */
426 } s;
427};
428
429/* ========================================================================= */
430/* UVH_INT_CMPD */
431/* ========================================================================= */
432#define UVH_INT_CMPD 0x22180UL
433
434#define UVH_INT_CMPD_REAL_TIME_CMPD_SHFT 0
435#define UVH_INT_CMPD_REAL_TIME_CMPD_MASK 0x00ffffffffffffffUL
436
437union uvh_int_cmpd_u {
438 unsigned long v;
439 struct uvh_int_cmpd_s {
440 unsigned long real_time_cmpd : 56; /* RW */
441 unsigned long rsvd_56_63 : 8; /* */
442 } s;
443};
444
445/* ========================================================================= */
446/* UVH_NODE_ID */
447/* ========================================================================= */
448#define UVH_NODE_ID 0x0UL
449
450#define UVH_NODE_ID_FORCE1_SHFT 0
451#define UVH_NODE_ID_FORCE1_MASK 0x0000000000000001UL
452#define UVH_NODE_ID_MANUFACTURER_SHFT 1
453#define UVH_NODE_ID_MANUFACTURER_MASK 0x0000000000000ffeUL
454#define UVH_NODE_ID_PART_NUMBER_SHFT 12
455#define UVH_NODE_ID_PART_NUMBER_MASK 0x000000000ffff000UL
456#define UVH_NODE_ID_REVISION_SHFT 28
457#define UVH_NODE_ID_REVISION_MASK 0x00000000f0000000UL
458#define UVH_NODE_ID_NODE_ID_SHFT 32
459#define UVH_NODE_ID_NODE_ID_MASK 0x00007fff00000000UL
460#define UVH_NODE_ID_NODES_PER_BIT_SHFT 48
461#define UVH_NODE_ID_NODES_PER_BIT_MASK 0x007f000000000000UL
462#define UVH_NODE_ID_NI_PORT_SHFT 56
463#define UVH_NODE_ID_NI_PORT_MASK 0x0f00000000000000UL
464
465union uvh_node_id_u {
466 unsigned long v;
467 struct uvh_node_id_s {
468 unsigned long force1 : 1; /* RO */
469 unsigned long manufacturer : 11; /* RO */
470 unsigned long part_number : 16; /* RO */
471 unsigned long revision : 4; /* RO */
472 unsigned long node_id : 15; /* RW */
473 unsigned long rsvd_47 : 1; /* */
474 unsigned long nodes_per_bit : 7; /* RW */
475 unsigned long rsvd_55 : 1; /* */
476 unsigned long ni_port : 4; /* RO */
477 unsigned long rsvd_60_63 : 4; /* */
478 } s;
479};
480
481/* ========================================================================= */
482/* UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR */
483/* ========================================================================= */
484#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR 0x16000d0UL
485
486#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_SHFT 24
487#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_0_MMR_DEST_BASE_MASK 0x00003fffff000000UL
488
489union uvh_rh_gam_alias210_redirect_config_0_mmr_u {
490 unsigned long v;
491 struct uvh_rh_gam_alias210_redirect_config_0_mmr_s {
492 unsigned long rsvd_0_23 : 24; /* */
493 unsigned long dest_base : 22; /* RW */
494 unsigned long rsvd_46_63: 18; /* */
495 } s;
496};
497
498/* ========================================================================= */
499/* UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR */
500/* ========================================================================= */
501#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR 0x16000e0UL
502
503#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR_DEST_BASE_SHFT 24
504#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_1_MMR_DEST_BASE_MASK 0x00003fffff000000UL
505
506union uvh_rh_gam_alias210_redirect_config_1_mmr_u {
507 unsigned long v;
508 struct uvh_rh_gam_alias210_redirect_config_1_mmr_s {
509 unsigned long rsvd_0_23 : 24; /* */
510 unsigned long dest_base : 22; /* RW */
511 unsigned long rsvd_46_63: 18; /* */
512 } s;
513};
514
515/* ========================================================================= */
516/* UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR */
517/* ========================================================================= */
518#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR 0x16000f0UL
519
520#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR_DEST_BASE_SHFT 24
521#define UVH_RH_GAM_ALIAS210_REDIRECT_CONFIG_2_MMR_DEST_BASE_MASK 0x00003fffff000000UL
522
523union uvh_rh_gam_alias210_redirect_config_2_mmr_u {
524 unsigned long v;
525 struct uvh_rh_gam_alias210_redirect_config_2_mmr_s {
526 unsigned long rsvd_0_23 : 24; /* */
527 unsigned long dest_base : 22; /* RW */
528 unsigned long rsvd_46_63: 18; /* */
529 } s;
530};
531
532/* ========================================================================= */
533/* UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR */
534/* ========================================================================= */
535#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR 0x1600010UL
536
537#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_SHFT 28
538#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffff0000000UL
539#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_SHFT 48
540#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_GR4_MASK 0x0001000000000000UL
541#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_SHFT 52
542#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_N_GRU_MASK 0x00f0000000000000UL
543#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63
544#define UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL
545
546union uvh_rh_gam_gru_overlay_config_mmr_u {
547 unsigned long v;
548 struct uvh_rh_gam_gru_overlay_config_mmr_s {
549 unsigned long rsvd_0_27: 28; /* */
550 unsigned long base : 18; /* RW */
551 unsigned long rsvd_46_47: 2; /* */
552 unsigned long gr4 : 1; /* RW */
553 unsigned long rsvd_49_51: 3; /* */
554 unsigned long n_gru : 4; /* RW */
555 unsigned long rsvd_56_62: 7; /* */
556 unsigned long enable : 1; /* RW */
557 } s;
558};
559
560/* ========================================================================= */
561/* UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR */
562/* ========================================================================= */
563#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR 0x1600028UL
564
565#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT 26
566#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_MASK 0x00003ffffc000000UL
567#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_SHFT 46
568#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_DUAL_HUB_MASK 0x0000400000000000UL
569#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_SHFT 63
570#define UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_ENABLE_MASK 0x8000000000000000UL
571
572union uvh_rh_gam_mmr_overlay_config_mmr_u {
573 unsigned long v;
574 struct uvh_rh_gam_mmr_overlay_config_mmr_s {
575 unsigned long rsvd_0_25: 26; /* */
576 unsigned long base : 20; /* RW */
577 unsigned long dual_hub : 1; /* RW */
578 unsigned long rsvd_47_62: 16; /* */
579 unsigned long enable : 1; /* RW */
580 } s;
581};
582
583/* ========================================================================= */
584/* UVH_RTC */
585/* ========================================================================= */
586#define UVH_RTC 0x340000UL
587
588#define UVH_RTC_REAL_TIME_CLOCK_SHFT 0
589#define UVH_RTC_REAL_TIME_CLOCK_MASK 0x00ffffffffffffffUL
590
591union uvh_rtc_u {
592 unsigned long v;
593 struct uvh_rtc_s {
594 unsigned long real_time_clock : 56; /* RW */
595 unsigned long rsvd_56_63 : 8; /* */
596 } s;
597};
598
599/* ========================================================================= */
600/* UVH_RTC1_INT_CONFIG */
601/* ========================================================================= */
602#define UVH_RTC1_INT_CONFIG 0x615c0UL
603
604#define UVH_RTC1_INT_CONFIG_VECTOR_SHFT 0
605#define UVH_RTC1_INT_CONFIG_VECTOR_MASK 0x00000000000000ffUL
606#define UVH_RTC1_INT_CONFIG_DM_SHFT 8
607#define UVH_RTC1_INT_CONFIG_DM_MASK 0x0000000000000700UL
608#define UVH_RTC1_INT_CONFIG_DESTMODE_SHFT 11
609#define UVH_RTC1_INT_CONFIG_DESTMODE_MASK 0x0000000000000800UL
610#define UVH_RTC1_INT_CONFIG_STATUS_SHFT 12
611#define UVH_RTC1_INT_CONFIG_STATUS_MASK 0x0000000000001000UL
612#define UVH_RTC1_INT_CONFIG_P_SHFT 13
613#define UVH_RTC1_INT_CONFIG_P_MASK 0x0000000000002000UL
614#define UVH_RTC1_INT_CONFIG_T_SHFT 15
615#define UVH_RTC1_INT_CONFIG_T_MASK 0x0000000000008000UL
616#define UVH_RTC1_INT_CONFIG_M_SHFT 16
617#define UVH_RTC1_INT_CONFIG_M_MASK 0x0000000000010000UL
618#define UVH_RTC1_INT_CONFIG_APIC_ID_SHFT 32
619#define UVH_RTC1_INT_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
620
621union uvh_rtc1_int_config_u {
622 unsigned long v;
623 struct uvh_rtc1_int_config_s {
624 unsigned long vector_ : 8; /* RW */
625 unsigned long dm : 3; /* RW */
626 unsigned long destmode : 1; /* RW */
627 unsigned long status : 1; /* RO */
628 unsigned long p : 1; /* RO */
629 unsigned long rsvd_14 : 1; /* */
630 unsigned long t : 1; /* RO */
631 unsigned long m : 1; /* RW */
632 unsigned long rsvd_17_31: 15; /* */
633 unsigned long apic_id : 32; /* RW */
634 } s;
635};
636
637/* ========================================================================= */
638/* UVH_RTC2_INT_CONFIG */
639/* ========================================================================= */
640#define UVH_RTC2_INT_CONFIG 0x61600UL
641
642#define UVH_RTC2_INT_CONFIG_VECTOR_SHFT 0
643#define UVH_RTC2_INT_CONFIG_VECTOR_MASK 0x00000000000000ffUL
644#define UVH_RTC2_INT_CONFIG_DM_SHFT 8
645#define UVH_RTC2_INT_CONFIG_DM_MASK 0x0000000000000700UL
646#define UVH_RTC2_INT_CONFIG_DESTMODE_SHFT 11
647#define UVH_RTC2_INT_CONFIG_DESTMODE_MASK 0x0000000000000800UL
648#define UVH_RTC2_INT_CONFIG_STATUS_SHFT 12
649#define UVH_RTC2_INT_CONFIG_STATUS_MASK 0x0000000000001000UL
650#define UVH_RTC2_INT_CONFIG_P_SHFT 13
651#define UVH_RTC2_INT_CONFIG_P_MASK 0x0000000000002000UL
652#define UVH_RTC2_INT_CONFIG_T_SHFT 15
653#define UVH_RTC2_INT_CONFIG_T_MASK 0x0000000000008000UL
654#define UVH_RTC2_INT_CONFIG_M_SHFT 16
655#define UVH_RTC2_INT_CONFIG_M_MASK 0x0000000000010000UL
656#define UVH_RTC2_INT_CONFIG_APIC_ID_SHFT 32
657#define UVH_RTC2_INT_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
658
659union uvh_rtc2_int_config_u {
660 unsigned long v;
661 struct uvh_rtc2_int_config_s {
662 unsigned long vector_ : 8; /* RW */
663 unsigned long dm : 3; /* RW */
664 unsigned long destmode : 1; /* RW */
665 unsigned long status : 1; /* RO */
666 unsigned long p : 1; /* RO */
667 unsigned long rsvd_14 : 1; /* */
668 unsigned long t : 1; /* RO */
669 unsigned long m : 1; /* RW */
670 unsigned long rsvd_17_31: 15; /* */
671 unsigned long apic_id : 32; /* RW */
672 } s;
673};
674
675/* ========================================================================= */
676/* UVH_RTC3_INT_CONFIG */
677/* ========================================================================= */
678#define UVH_RTC3_INT_CONFIG 0x61640UL
679
680#define UVH_RTC3_INT_CONFIG_VECTOR_SHFT 0
681#define UVH_RTC3_INT_CONFIG_VECTOR_MASK 0x00000000000000ffUL
682#define UVH_RTC3_INT_CONFIG_DM_SHFT 8
683#define UVH_RTC3_INT_CONFIG_DM_MASK 0x0000000000000700UL
684#define UVH_RTC3_INT_CONFIG_DESTMODE_SHFT 11
685#define UVH_RTC3_INT_CONFIG_DESTMODE_MASK 0x0000000000000800UL
686#define UVH_RTC3_INT_CONFIG_STATUS_SHFT 12
687#define UVH_RTC3_INT_CONFIG_STATUS_MASK 0x0000000000001000UL
688#define UVH_RTC3_INT_CONFIG_P_SHFT 13
689#define UVH_RTC3_INT_CONFIG_P_MASK 0x0000000000002000UL
690#define UVH_RTC3_INT_CONFIG_T_SHFT 15
691#define UVH_RTC3_INT_CONFIG_T_MASK 0x0000000000008000UL
692#define UVH_RTC3_INT_CONFIG_M_SHFT 16
693#define UVH_RTC3_INT_CONFIG_M_MASK 0x0000000000010000UL
694#define UVH_RTC3_INT_CONFIG_APIC_ID_SHFT 32
695#define UVH_RTC3_INT_CONFIG_APIC_ID_MASK 0xffffffff00000000UL
696
697union uvh_rtc3_int_config_u {
698 unsigned long v;
699 struct uvh_rtc3_int_config_s {
700 unsigned long vector_ : 8; /* RW */
701 unsigned long dm : 3; /* RW */
702 unsigned long destmode : 1; /* RW */
703 unsigned long status : 1; /* RO */
704 unsigned long p : 1; /* RO */
705 unsigned long rsvd_14 : 1; /* */
706 unsigned long t : 1; /* RO */
707 unsigned long m : 1; /* RW */
708 unsigned long rsvd_17_31: 15; /* */
709 unsigned long apic_id : 32; /* RW */
710 } s;
711};
712
713/* ========================================================================= */
714/* UVH_RTC_INC_RATIO */
715/* ========================================================================= */
716#define UVH_RTC_INC_RATIO 0x350000UL
717
718#define UVH_RTC_INC_RATIO_FRACTION_SHFT 0
719#define UVH_RTC_INC_RATIO_FRACTION_MASK 0x00000000000fffffUL
720#define UVH_RTC_INC_RATIO_RATIO_SHFT 20
721#define UVH_RTC_INC_RATIO_RATIO_MASK 0x0000000000700000UL
722
723union uvh_rtc_inc_ratio_u {
724 unsigned long v;
725 struct uvh_rtc_inc_ratio_s {
726 unsigned long fraction : 20; /* RW */
727 unsigned long ratio : 3; /* RW */
728 unsigned long rsvd_23_63: 41; /* */
729 } s;
730};
731
732/* ========================================================================= */
733/* UVH_SI_ADDR_MAP_CONFIG */
734/* ========================================================================= */
735#define UVH_SI_ADDR_MAP_CONFIG 0xc80000UL
736
737#define UVH_SI_ADDR_MAP_CONFIG_M_SKT_SHFT 0
738#define UVH_SI_ADDR_MAP_CONFIG_M_SKT_MASK 0x000000000000003fUL
739#define UVH_SI_ADDR_MAP_CONFIG_N_SKT_SHFT 8
740#define UVH_SI_ADDR_MAP_CONFIG_N_SKT_MASK 0x0000000000000f00UL
741
742union uvh_si_addr_map_config_u {
743 unsigned long v;
744 struct uvh_si_addr_map_config_s {
745 unsigned long m_skt : 6; /* RW */
746 unsigned long rsvd_6_7: 2; /* */
747 unsigned long n_skt : 4; /* RW */
748 unsigned long rsvd_12_63: 52; /* */
749 } s;
750};
751
752/* ========================================================================= */
753/* UVH_SI_ALIAS0_OVERLAY_CONFIG */
754/* ========================================================================= */
755#define UVH_SI_ALIAS0_OVERLAY_CONFIG 0xc80008UL
756
757#define UVH_SI_ALIAS0_OVERLAY_CONFIG_BASE_SHFT 24
758#define UVH_SI_ALIAS0_OVERLAY_CONFIG_BASE_MASK 0x00000000ff000000UL
759#define UVH_SI_ALIAS0_OVERLAY_CONFIG_M_ALIAS_SHFT 48
760#define UVH_SI_ALIAS0_OVERLAY_CONFIG_M_ALIAS_MASK 0x001f000000000000UL
761#define UVH_SI_ALIAS0_OVERLAY_CONFIG_ENABLE_SHFT 63
762#define UVH_SI_ALIAS0_OVERLAY_CONFIG_ENABLE_MASK 0x8000000000000000UL
763
764union uvh_si_alias0_overlay_config_u {
765 unsigned long v;
766 struct uvh_si_alias0_overlay_config_s {
767 unsigned long rsvd_0_23: 24; /* */
768 unsigned long base : 8; /* RW */
769 unsigned long rsvd_32_47: 16; /* */
770 unsigned long m_alias : 5; /* RW */
771 unsigned long rsvd_53_62: 10; /* */
772 unsigned long enable : 1; /* RW */
773 } s;
774};
775
776/* ========================================================================= */
777/* UVH_SI_ALIAS1_OVERLAY_CONFIG */
778/* ========================================================================= */
779#define UVH_SI_ALIAS1_OVERLAY_CONFIG 0xc80010UL
780
781#define UVH_SI_ALIAS1_OVERLAY_CONFIG_BASE_SHFT 24
782#define UVH_SI_ALIAS1_OVERLAY_CONFIG_BASE_MASK 0x00000000ff000000UL
783#define UVH_SI_ALIAS1_OVERLAY_CONFIG_M_ALIAS_SHFT 48
784#define UVH_SI_ALIAS1_OVERLAY_CONFIG_M_ALIAS_MASK 0x001f000000000000UL
785#define UVH_SI_ALIAS1_OVERLAY_CONFIG_ENABLE_SHFT 63
786#define UVH_SI_ALIAS1_OVERLAY_CONFIG_ENABLE_MASK 0x8000000000000000UL
787
788union uvh_si_alias1_overlay_config_u {
789 unsigned long v;
790 struct uvh_si_alias1_overlay_config_s {
791 unsigned long rsvd_0_23: 24; /* */
792 unsigned long base : 8; /* RW */
793 unsigned long rsvd_32_47: 16; /* */
794 unsigned long m_alias : 5; /* RW */
795 unsigned long rsvd_53_62: 10; /* */
796 unsigned long enable : 1; /* RW */
797 } s;
798};
799
800/* ========================================================================= */
801/* UVH_SI_ALIAS2_OVERLAY_CONFIG */
802/* ========================================================================= */
803#define UVH_SI_ALIAS2_OVERLAY_CONFIG 0xc80018UL
804
805#define UVH_SI_ALIAS2_OVERLAY_CONFIG_BASE_SHFT 24
806#define UVH_SI_ALIAS2_OVERLAY_CONFIG_BASE_MASK 0x00000000ff000000UL
807#define UVH_SI_ALIAS2_OVERLAY_CONFIG_M_ALIAS_SHFT 48
808#define UVH_SI_ALIAS2_OVERLAY_CONFIG_M_ALIAS_MASK 0x001f000000000000UL
809#define UVH_SI_ALIAS2_OVERLAY_CONFIG_ENABLE_SHFT 63
810#define UVH_SI_ALIAS2_OVERLAY_CONFIG_ENABLE_MASK 0x8000000000000000UL
811
812union uvh_si_alias2_overlay_config_u {
813 unsigned long v;
814 struct uvh_si_alias2_overlay_config_s {
815 unsigned long rsvd_0_23: 24; /* */
816 unsigned long base : 8; /* RW */
817 unsigned long rsvd_32_47: 16; /* */
818 unsigned long m_alias : 5; /* RW */
819 unsigned long rsvd_53_62: 10; /* */
820 unsigned long enable : 1; /* RW */
821 } s;
822};
823
824
825#endif /* _ASM_IA64_UV_UV_MMRS_H */
arch/ia64/include/asm/vermagic.h+0−15
@@ -1,15 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2003 Hewlett-Packard Co
4 * David Mosberger-Tang <davidm@hpl.hp.com>
5 */
6
7#ifndef _ASM_VERMAGIC_H
8#define _ASM_VERMAGIC_H
9
10#include <linux/stringify.h>
11
12#define MODULE_ARCH_VERMAGIC "ia64" \
13 "gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__)
14
15#endif /* _ASM_VERMAGIC_H */
arch/ia64/include/asm/vga.h+0−26
@@ -1,26 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Access to VGA videoram
4 *
5 * (c) 1998 Martin Mares <mj@ucw.cz>
6 * (c) 1999 Asit Mallick <asit.k.mallick@intel.com>
7 * (c) 1999 Don Dugger <don.dugger@intel.com>
8 */
9
10#ifndef __ASM_IA64_VGA_H_
11#define __ASM_IA64_VGA_H_
12
13/*
14 * On the PC, we can just recalculate addresses and then access the
15 * videoram directly without any black magic.
16 */
17
18extern unsigned long vga_console_iobase;
19extern unsigned long vga_console_membase;
20
21#define VGA_MAP_MEM(x,s) ((unsigned long) ioremap(vga_console_membase + (x), s))
22
23#define vga_readb(x) (*(x))
24#define vga_writeb(x,y) (*(y) = (x))
25
26#endif /* __ASM_IA64_VGA_H_ */
arch/ia64/include/asm/vmalloc.h+0−4
@@ -1,4 +0,0 @@
1#ifndef _ASM_IA64_VMALLOC_H
2#define _ASM_IA64_VMALLOC_H
3
4#endif /* _ASM_IA64_VMALLOC_H */
arch/ia64/include/asm/xor.h+0−30
@@ -1,30 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Optimized RAID-5 checksumming functions for IA-64.
4 */
5
6
7extern void xor_ia64_2(unsigned long bytes, unsigned long * __restrict p1,
8 const unsigned long * __restrict p2);
9extern void xor_ia64_3(unsigned long bytes, unsigned long * __restrict p1,
10 const unsigned long * __restrict p2,
11 const unsigned long * __restrict p3);
12extern void xor_ia64_4(unsigned long bytes, unsigned long * __restrict p1,
13 const unsigned long * __restrict p2,
14 const unsigned long * __restrict p3,
15 const unsigned long * __restrict p4);
16extern void xor_ia64_5(unsigned long bytes, unsigned long * __restrict p1,
17 const unsigned long * __restrict p2,
18 const unsigned long * __restrict p3,
19 const unsigned long * __restrict p4,
20 const unsigned long * __restrict p5);
21
22static struct xor_block_template xor_block_ia64 = {
23 .name = "ia64",
24 .do_2 = xor_ia64_2,
25 .do_3 = xor_ia64_3,
26 .do_4 = xor_ia64_4,
27 .do_5 = xor_ia64_5,
28};
29
30#define XOR_TRY_TEMPLATES xor_speed(&xor_block_ia64)
arch/ia64/include/asm/xtp.h+0−46
@@ -1,46 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _ASM_IA64_XTP_H
3#define _ASM_IA64_XTP_H
4
5#include <asm/io.h>
6
7#ifdef CONFIG_SMP
8
9#define XTP_OFFSET 0x1e0008
10
11#define SMP_IRQ_REDIRECTION (1 << 0)
12#define SMP_IPI_REDIRECTION (1 << 1)
13
14extern unsigned char smp_int_redirect;
15
16/*
17 * XTP control functions:
18 * min_xtp : route all interrupts to this CPU
19 * normal_xtp: nominal XTP value
20 * max_xtp : never deliver interrupts to this CPU.
21 */
22
23static inline void
24min_xtp (void)
25{
26 if (smp_int_redirect & SMP_IRQ_REDIRECTION)
27 writeb(0x00, ipi_base_addr + XTP_OFFSET); /* XTP to min */
28}
29
30static inline void
31normal_xtp (void)
32{
33 if (smp_int_redirect & SMP_IRQ_REDIRECTION)
34 writeb(0x08, ipi_base_addr + XTP_OFFSET); /* XTP normal */
35}
36
37static inline void
38max_xtp (void)
39{
40 if (smp_int_redirect & SMP_IRQ_REDIRECTION)
41 writeb(0x0f, ipi_base_addr + XTP_OFFSET); /* Set XTP to max */
42}
43
44#endif /* CONFIG_SMP */
45
46#endif /* _ASM_IA64_XTP_Hy */
arch/ia64/include/uapi/asm/Kbuild+0−2
@@ -1,2 +0,0 @@
1# SPDX-License-Identifier: GPL-2.0
2generated-y += unistd_64.h
arch/ia64/include/uapi/asm/auxvec.h+0−14
@@ -1,14 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _ASM_IA64_AUXVEC_H
3#define _ASM_IA64_AUXVEC_H
4
5/*
6 * Architecture-neutral AT_ values are in the range 0-17. Leave some room for more of
7 * them, start the architecture-specific ones at 32.
8 */
9#define AT_SYSINFO 32
10#define AT_SYSINFO_EHDR 33
11
12#define AT_VECTOR_SIZE_ARCH 2 /* entries in ARCH_DLINFO */
13
14#endif /* _ASM_IA64_AUXVEC_H */
arch/ia64/include/uapi/asm/bitsperlong.h+0−9
@@ -1,9 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef __ASM_IA64_BITSPERLONG_H
3#define __ASM_IA64_BITSPERLONG_H
4
5#define __BITS_PER_LONG 64
6
7#include <asm-generic/bitsperlong.h>
8
9#endif /* __ASM_IA64_BITSPERLONG_H */
arch/ia64/include/uapi/asm/break.h+0−23
@@ -1,23 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _ASM_IA64_BREAK_H
3#define _ASM_IA64_BREAK_H
4
5/*
6 * IA-64 Linux break numbers.
7 *
8 * Copyright (C) 1999 Hewlett-Packard Co
9 * Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com>
10 */
11
12/*
13 * OS-specific debug break numbers:
14 */
15#define __IA64_BREAK_KDB 0x80100
16#define __IA64_BREAK_KPROBE 0x81000 /* .. 0x81fff */
17
18/*
19 * OS-specific break numbers:
20 */
21#define __IA64_BREAK_SYSCALL 0x100000
22
23#endif /* _ASM_IA64_BREAK_H */
arch/ia64/include/uapi/asm/byteorder.h+0−7
@@ -1,7 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _ASM_IA64_BYTEORDER_H
3#define _ASM_IA64_BYTEORDER_H
4
5#include <linux/byteorder/little_endian.h>
6
7#endif /* _ASM_IA64_BYTEORDER_H */
arch/ia64/include/uapi/asm/cmpxchg.h+0−138
@@ -1,138 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _UAPI_ASM_IA64_CMPXCHG_H
3#define _UAPI_ASM_IA64_CMPXCHG_H
4
5/*
6 * Compare/Exchange, forked from asm/intrinsics.h
7 * which was:
8 *
9 * Copyright (C) 2002-2003 Hewlett-Packard Co
10 * David Mosberger-Tang <davidm@hpl.hp.com>
11 */
12
13#ifndef __ASSEMBLY__
14
15#include <linux/types.h>
16/* include compiler specific intrinsics */
17#include <asm/ia64regs.h>
18#include <asm/gcc_intrin.h>
19
20/*
21 * This function doesn't exist, so you'll get a linker error if
22 * something tries to do an invalid xchg().
23 */
24extern void ia64_xchg_called_with_bad_pointer(void);
25
26#define __arch_xchg(x, ptr, size) \
27({ \
28 unsigned long __xchg_result; \
29 \
30 switch (size) { \
31 case 1: \
32 __xchg_result = ia64_xchg1((__u8 __force *)ptr, x); \
33 break; \
34 \
35 case 2: \
36 __xchg_result = ia64_xchg2((__u16 __force *)ptr, x); \
37 break; \
38 \
39 case 4: \
40 __xchg_result = ia64_xchg4((__u32 __force *)ptr, x); \
41 break; \
42 \
43 case 8: \
44 __xchg_result = ia64_xchg8((__u64 __force *)ptr, x); \
45 break; \
46 default: \
47 ia64_xchg_called_with_bad_pointer(); \
48 } \
49 (__typeof__ (*(ptr)) __force) __xchg_result; \
50})
51
52#ifndef __KERNEL__
53#define xchg(ptr, x) \
54({(__typeof__(*(ptr))) __arch_xchg((unsigned long) (x), (ptr), sizeof(*(ptr)));})
55#endif
56
57/*
58 * Atomic compare and exchange. Compare OLD with MEM, if identical,
59 * store NEW in MEM. Return the initial value in MEM. Success is
60 * indicated by comparing RETURN with OLD.
61 */
62
63/*
64 * This function doesn't exist, so you'll get a linker error
65 * if something tries to do an invalid cmpxchg().
66 */
67extern long ia64_cmpxchg_called_with_bad_pointer(void);
68
69#define ia64_cmpxchg(sem, ptr, old, new, size) \
70({ \
71 __u64 _o_, _r_; \
72 \
73 switch (size) { \
74 case 1: \
75 _o_ = (__u8) (long __force) (old); \
76 break; \
77 case 2: \
78 _o_ = (__u16) (long __force) (old); \
79 break; \
80 case 4: \
81 _o_ = (__u32) (long __force) (old); \
82 break; \
83 case 8: \
84 _o_ = (__u64) (long __force) (old); \
85 break; \
86 default: \
87 break; \
88 } \
89 switch (size) { \
90 case 1: \
91 _r_ = ia64_cmpxchg1_##sem((__u8 __force *) ptr, new, _o_); \
92 break; \
93 \
94 case 2: \
95 _r_ = ia64_cmpxchg2_##sem((__u16 __force *) ptr, new, _o_); \
96 break; \
97 \
98 case 4: \
99 _r_ = ia64_cmpxchg4_##sem((__u32 __force *) ptr, new, _o_); \
100 break; \
101 \
102 case 8: \
103 _r_ = ia64_cmpxchg8_##sem((__u64 __force *) ptr, new, _o_); \
104 break; \
105 \
106 default: \
107 _r_ = ia64_cmpxchg_called_with_bad_pointer(); \
108 break; \
109 } \
110 (__typeof__(old) __force) _r_; \
111})
112
113#define cmpxchg_acq(ptr, o, n) \
114 ia64_cmpxchg(acq, (ptr), (o), (n), sizeof(*(ptr)))
115#define cmpxchg_rel(ptr, o, n) \
116 ia64_cmpxchg(rel, (ptr), (o), (n), sizeof(*(ptr)))
117
118/*
119 * Worse still - early processor implementations actually just ignored
120 * the acquire/release and did a full fence all the time. Unfortunately
121 * this meant a lot of badly written code that used .acq when they really
122 * wanted .rel became legacy out in the wild - so when we made a cpu
123 * that strictly did the .acq or .rel ... all that code started breaking - so
124 * we had to back-pedal and keep the "legacy" behavior of a full fence :-(
125 */
126
127#ifndef __KERNEL__
128/* for compatibility with other platforms: */
129#define cmpxchg(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
130#define cmpxchg64(ptr, o, n) cmpxchg_acq((ptr), (o), (n))
131
132#define cmpxchg_local cmpxchg
133#define cmpxchg64_local cmpxchg64
134#endif
135
136#endif /* !__ASSEMBLY__ */
137
138#endif /* _UAPI_ASM_IA64_CMPXCHG_H */
arch/ia64/include/uapi/asm/fcntl.h+0−15
@@ -1,15 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _ASM_IA64_FCNTL_H
3#define _ASM_IA64_FCNTL_H
4/*
5 * Modified 1998-2000
6 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co.
7 */
8
9#define force_o_largefile() \
10 (personality(current->personality) != PER_LINUX32)
11
12#include <linux/personality.h>
13#include <asm-generic/fcntl.h>
14
15#endif /* _ASM_IA64_FCNTL_H */
arch/ia64/include/uapi/asm/fpu.h+0−67
@@ -1,67 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _ASM_IA64_FPU_H
3#define _ASM_IA64_FPU_H
4
5/*
6 * Copyright (C) 1998, 1999, 2002, 2003 Hewlett-Packard Co
7 * David Mosberger-Tang <davidm@hpl.hp.com>
8 */
9
10#include <linux/types.h>
11
12/* floating point status register: */
13#define FPSR_TRAP_VD (1 << 0) /* invalid op trap disabled */
14#define FPSR_TRAP_DD (1 << 1) /* denormal trap disabled */
15#define FPSR_TRAP_ZD (1 << 2) /* zero-divide trap disabled */
16#define FPSR_TRAP_OD (1 << 3) /* overflow trap disabled */
17#define FPSR_TRAP_UD (1 << 4) /* underflow trap disabled */
18#define FPSR_TRAP_ID (1 << 5) /* inexact trap disabled */
19#define FPSR_S0(x) ((x) << 6)
20#define FPSR_S1(x) ((x) << 19)
21#define FPSR_S2(x) (__IA64_UL(x) << 32)
22#define FPSR_S3(x) (__IA64_UL(x) << 45)
23
24/* floating-point status field controls: */
25#define FPSF_FTZ (1 << 0) /* flush-to-zero */
26#define FPSF_WRE (1 << 1) /* widest-range exponent */
27#define FPSF_PC(x) (((x) & 0x3) << 2) /* precision control */
28#define FPSF_RC(x) (((x) & 0x3) << 4) /* rounding control */
29#define FPSF_TD (1 << 6) /* trap disabled */
30
31/* floating-point status field flags: */
32#define FPSF_V (1 << 7) /* invalid operation flag */
33#define FPSF_D (1 << 8) /* denormal/unnormal operand flag */
34#define FPSF_Z (1 << 9) /* zero divide (IEEE) flag */
35#define FPSF_O (1 << 10) /* overflow (IEEE) flag */
36#define FPSF_U (1 << 11) /* underflow (IEEE) flag */
37#define FPSF_I (1 << 12) /* inexact (IEEE) flag) */
38
39/* floating-point rounding control: */
40#define FPRC_NEAREST 0x0
41#define FPRC_NEGINF 0x1
42#define FPRC_POSINF 0x2
43#define FPRC_TRUNC 0x3
44
45#define FPSF_DEFAULT (FPSF_PC (0x3) | FPSF_RC (FPRC_NEAREST))
46
47/* This default value is the same as HP-UX uses. Don't change it
48 without a very good reason. */
49#define FPSR_DEFAULT (FPSR_TRAP_VD | FPSR_TRAP_DD | FPSR_TRAP_ZD \
50 | FPSR_TRAP_OD | FPSR_TRAP_UD | FPSR_TRAP_ID \
51 | FPSR_S0 (FPSF_DEFAULT) \
52 | FPSR_S1 (FPSF_DEFAULT | FPSF_TD | FPSF_WRE) \
53 | FPSR_S2 (FPSF_DEFAULT | FPSF_TD) \
54 | FPSR_S3 (FPSF_DEFAULT | FPSF_TD))
55
56# ifndef __ASSEMBLY__
57
58struct ia64_fpreg {
59 union {
60 unsigned long bits[2];
61 long double __dummy; /* force 16-byte alignment */
62 } u;
63};
64
65# endif /* __ASSEMBLY__ */
66
67#endif /* _ASM_IA64_FPU_H */
arch/ia64/include/uapi/asm/gcc_intrin.h+0−619
@@ -1,619 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2/*
3 *
4 * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
5 * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
6 */
7#ifndef _UAPI_ASM_IA64_GCC_INTRIN_H
8#define _UAPI_ASM_IA64_GCC_INTRIN_H
9
10#include <linux/types.h>
11#include <linux/compiler.h>
12
13/* define this macro to get some asm stmts included in 'c' files */
14#define ASM_SUPPORTED
15
16/* Optimization barrier */
17/* The "volatile" is due to gcc bugs */
18#define ia64_barrier() asm volatile ("":::"memory")
19
20#define ia64_stop() asm volatile (";;"::)
21
22#define ia64_invala_gr(regnum) asm volatile ("invala.e r%0" :: "i"(regnum))
23
24#define ia64_invala_fr(regnum) asm volatile ("invala.e f%0" :: "i"(regnum))
25
26#define ia64_flushrs() asm volatile ("flushrs;;":::"memory")
27
28#define ia64_loadrs() asm volatile ("loadrs;;":::"memory")
29
30extern void ia64_bad_param_for_setreg (void);
31extern void ia64_bad_param_for_getreg (void);
32
33
34#define ia64_setreg(regnum, val) \
35({ \
36 switch (regnum) { \
37 case _IA64_REG_PSR_L: \
38 asm volatile ("mov psr.l=%0" :: "r"(val) : "memory"); \
39 break; \
40 case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC: \
41 asm volatile ("mov ar%0=%1" :: \
42 "i" (regnum - _IA64_REG_AR_KR0), \
43 "r"(val): "memory"); \
44 break; \
45 case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1: \
46 asm volatile ("mov cr%0=%1" :: \
47 "i" (regnum - _IA64_REG_CR_DCR), \
48 "r"(val): "memory" ); \
49 break; \
50 case _IA64_REG_SP: \
51 asm volatile ("mov r12=%0" :: \
52 "r"(val): "memory"); \
53 break; \
54 case _IA64_REG_GP: \
55 asm volatile ("mov gp=%0" :: "r"(val) : "memory"); \
56 break; \
57 default: \
58 ia64_bad_param_for_setreg(); \
59 break; \
60 } \
61})
62
63#define ia64_getreg(regnum) \
64({ \
65 __u64 ia64_intri_res; \
66 \
67 switch (regnum) { \
68 case _IA64_REG_GP: \
69 asm volatile ("mov %0=gp" : "=r"(ia64_intri_res)); \
70 break; \
71 case _IA64_REG_IP: \
72 asm volatile ("mov %0=ip" : "=r"(ia64_intri_res)); \
73 break; \
74 case _IA64_REG_PSR: \
75 asm volatile ("mov %0=psr" : "=r"(ia64_intri_res)); \
76 break; \
77 case _IA64_REG_TP: /* for current() */ \
78 ia64_intri_res = ia64_r13; \
79 break; \
80 case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC: \
81 asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res) \
82 : "i"(regnum - _IA64_REG_AR_KR0)); \
83 break; \
84 case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1: \
85 asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res) \
86 : "i" (regnum - _IA64_REG_CR_DCR)); \
87 break; \
88 case _IA64_REG_SP: \
89 asm volatile ("mov %0=sp" : "=r" (ia64_intri_res)); \
90 break; \
91 default: \
92 ia64_bad_param_for_getreg(); \
93 break; \
94 } \
95 ia64_intri_res; \
96})
97
98#define ia64_hint_pause 0
99
100#define ia64_hint(mode) \
101({ \
102 switch (mode) { \
103 case ia64_hint_pause: \
104 asm volatile ("hint @pause" ::: "memory"); \
105 break; \
106 } \
107})
108
109
110/* Integer values for mux1 instruction */
111#define ia64_mux1_brcst 0
112#define ia64_mux1_mix 8
113#define ia64_mux1_shuf 9
114#define ia64_mux1_alt 10
115#define ia64_mux1_rev 11
116
117#define ia64_mux1(x, mode) \
118({ \
119 __u64 ia64_intri_res; \
120 \
121 switch (mode) { \
122 case ia64_mux1_brcst: \
123 asm ("mux1 %0=%1,@brcst" : "=r" (ia64_intri_res) : "r" (x)); \
124 break; \
125 case ia64_mux1_mix: \
126 asm ("mux1 %0=%1,@mix" : "=r" (ia64_intri_res) : "r" (x)); \
127 break; \
128 case ia64_mux1_shuf: \
129 asm ("mux1 %0=%1,@shuf" : "=r" (ia64_intri_res) : "r" (x)); \
130 break; \
131 case ia64_mux1_alt: \
132 asm ("mux1 %0=%1,@alt" : "=r" (ia64_intri_res) : "r" (x)); \
133 break; \
134 case ia64_mux1_rev: \
135 asm ("mux1 %0=%1,@rev" : "=r" (ia64_intri_res) : "r" (x)); \
136 break; \
137 } \
138 ia64_intri_res; \
139})
140
141#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
142# define ia64_popcnt(x) __builtin_popcountl(x)
143#else
144# define ia64_popcnt(x) \
145 ({ \
146 __u64 ia64_intri_res; \
147 asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x)); \
148 \
149 ia64_intri_res; \
150 })
151#endif
152
153#define ia64_getf_exp(x) \
154({ \
155 long ia64_intri_res; \
156 \
157 asm ("getf.exp %0=%1" : "=r"(ia64_intri_res) : "f"(x)); \
158 \
159 ia64_intri_res; \
160})
161
162#define ia64_shrp(a, b, count) \
163({ \
164 __u64 ia64_intri_res; \
165 asm ("shrp %0=%1,%2,%3" : "=r"(ia64_intri_res) : "r"(a), "r"(b), "i"(count)); \
166 ia64_intri_res; \
167})
168
169#define ia64_ldfs(regnum, x) \
170({ \
171 register double __f__ asm ("f"#regnum); \
172 asm volatile ("ldfs %0=[%1]" :"=f"(__f__): "r"(x)); \
173})
174
175#define ia64_ldfd(regnum, x) \
176({ \
177 register double __f__ asm ("f"#regnum); \
178 asm volatile ("ldfd %0=[%1]" :"=f"(__f__): "r"(x)); \
179})
180
181#define ia64_ldfe(regnum, x) \
182({ \
183 register double __f__ asm ("f"#regnum); \
184 asm volatile ("ldfe %0=[%1]" :"=f"(__f__): "r"(x)); \
185})
186
187#define ia64_ldf8(regnum, x) \
188({ \
189 register double __f__ asm ("f"#regnum); \
190 asm volatile ("ldf8 %0=[%1]" :"=f"(__f__): "r"(x)); \
191})
192
193#define ia64_ldf_fill(regnum, x) \
194({ \
195 register double __f__ asm ("f"#regnum); \
196 asm volatile ("ldf.fill %0=[%1]" :"=f"(__f__): "r"(x)); \
197})
198
199#define ia64_st4_rel_nta(m, val) \
200({ \
201 asm volatile ("st4.rel.nta [%0] = %1\n\t" :: "r"(m), "r"(val)); \
202})
203
204#define ia64_stfs(x, regnum) \
205({ \
206 register double __f__ asm ("f"#regnum); \
207 asm volatile ("stfs [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
208})
209
210#define ia64_stfd(x, regnum) \
211({ \
212 register double __f__ asm ("f"#regnum); \
213 asm volatile ("stfd [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
214})
215
216#define ia64_stfe(x, regnum) \
217({ \
218 register double __f__ asm ("f"#regnum); \
219 asm volatile ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
220})
221
222#define ia64_stf8(x, regnum) \
223({ \
224 register double __f__ asm ("f"#regnum); \
225 asm volatile ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
226})
227
228#define ia64_stf_spill(x, regnum) \
229({ \
230 register double __f__ asm ("f"#regnum); \
231 asm volatile ("stf.spill [%0]=%1" :: "r"(x), "f"(__f__) : "memory"); \
232})
233
234#define ia64_fetchadd4_acq(p, inc) \
235({ \
236 \
237 __u64 ia64_intri_res; \
238 asm volatile ("fetchadd4.acq %0=[%1],%2" \
239 : "=r"(ia64_intri_res) : "r"(p), "i" (inc) \
240 : "memory"); \
241 \
242 ia64_intri_res; \
243})
244
245#define ia64_fetchadd4_rel(p, inc) \
246({ \
247 __u64 ia64_intri_res; \
248 asm volatile ("fetchadd4.rel %0=[%1],%2" \
249 : "=r"(ia64_intri_res) : "r"(p), "i" (inc) \
250 : "memory"); \
251 \
252 ia64_intri_res; \
253})
254
255#define ia64_fetchadd8_acq(p, inc) \
256({ \
257 \
258 __u64 ia64_intri_res; \
259 asm volatile ("fetchadd8.acq %0=[%1],%2" \
260 : "=r"(ia64_intri_res) : "r"(p), "i" (inc) \
261 : "memory"); \
262 \
263 ia64_intri_res; \
264})
265
266#define ia64_fetchadd8_rel(p, inc) \
267({ \
268 __u64 ia64_intri_res; \
269 asm volatile ("fetchadd8.rel %0=[%1],%2" \
270 : "=r"(ia64_intri_res) : "r"(p), "i" (inc) \
271 : "memory"); \
272 \
273 ia64_intri_res; \
274})
275
276#define ia64_xchg1(ptr,x) \
277({ \
278 __u64 ia64_intri_res; \
279 asm volatile ("xchg1 %0=[%1],%2" \
280 : "=r" (ia64_intri_res) : "r" (ptr), "r" (x) : "memory"); \
281 ia64_intri_res; \
282})
283
284#define ia64_xchg2(ptr,x) \
285({ \
286 __u64 ia64_intri_res; \
287 asm volatile ("xchg2 %0=[%1],%2" : "=r" (ia64_intri_res) \
288 : "r" (ptr), "r" (x) : "memory"); \
289 ia64_intri_res; \
290})
291
292#define ia64_xchg4(ptr,x) \
293({ \
294 __u64 ia64_intri_res; \
295 asm volatile ("xchg4 %0=[%1],%2" : "=r" (ia64_intri_res) \
296 : "r" (ptr), "r" (x) : "memory"); \
297 ia64_intri_res; \
298})
299
300#define ia64_xchg8(ptr,x) \
301({ \
302 __u64 ia64_intri_res; \
303 asm volatile ("xchg8 %0=[%1],%2" : "=r" (ia64_intri_res) \
304 : "r" (ptr), "r" (x) : "memory"); \
305 ia64_intri_res; \
306})
307
308#define ia64_cmpxchg1_acq(ptr, new, old) \
309({ \
310 __u64 ia64_intri_res; \
311 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
312 asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv": \
313 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
314 ia64_intri_res; \
315})
316
317#define ia64_cmpxchg1_rel(ptr, new, old) \
318({ \
319 __u64 ia64_intri_res; \
320 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
321 asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv": \
322 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
323 ia64_intri_res; \
324})
325
326#define ia64_cmpxchg2_acq(ptr, new, old) \
327({ \
328 __u64 ia64_intri_res; \
329 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
330 asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv": \
331 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
332 ia64_intri_res; \
333})
334
335#define ia64_cmpxchg2_rel(ptr, new, old) \
336({ \
337 __u64 ia64_intri_res; \
338 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
339 \
340 asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv": \
341 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
342 ia64_intri_res; \
343})
344
345#define ia64_cmpxchg4_acq(ptr, new, old) \
346({ \
347 __u64 ia64_intri_res; \
348 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
349 asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv": \
350 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
351 ia64_intri_res; \
352})
353
354#define ia64_cmpxchg4_rel(ptr, new, old) \
355({ \
356 __u64 ia64_intri_res; \
357 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
358 asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv": \
359 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
360 ia64_intri_res; \
361})
362
363#define ia64_cmpxchg8_acq(ptr, new, old) \
364({ \
365 __u64 ia64_intri_res; \
366 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
367 asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv": \
368 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
369 ia64_intri_res; \
370})
371
372#define ia64_cmpxchg8_rel(ptr, new, old) \
373({ \
374 __u64 ia64_intri_res; \
375 asm volatile ("mov ar.ccv=%0;;" :: "rO"(old)); \
376 \
377 asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv": \
378 "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory"); \
379 ia64_intri_res; \
380})
381
382#define ia64_mf() asm volatile ("mf" ::: "memory")
383#define ia64_mfa() asm volatile ("mf.a" ::: "memory")
384
385#define ia64_invala() asm volatile ("invala" ::: "memory")
386
387#define ia64_thash(addr) \
388({ \
389 unsigned long ia64_intri_res; \
390 asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr)); \
391 ia64_intri_res; \
392})
393
394#define ia64_srlz_i() asm volatile (";; srlz.i ;;" ::: "memory")
395#define ia64_srlz_d() asm volatile (";; srlz.d" ::: "memory");
396
397#ifdef HAVE_SERIALIZE_DIRECTIVE
398# define ia64_dv_serialize_data() asm volatile (".serialize.data");
399# define ia64_dv_serialize_instruction() asm volatile (".serialize.instruction");
400#else
401# define ia64_dv_serialize_data()
402# define ia64_dv_serialize_instruction()
403#endif
404
405#define ia64_nop(x) asm volatile ("nop %0"::"i"(x));
406
407#define ia64_itci(addr) asm volatile ("itc.i %0;;" :: "r"(addr) : "memory")
408
409#define ia64_itcd(addr) asm volatile ("itc.d %0;;" :: "r"(addr) : "memory")
410
411
412#define ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1" \
413 :: "r"(trnum), "r"(addr) : "memory")
414
415#define ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1" \
416 :: "r"(trnum), "r"(addr) : "memory")
417
418#define ia64_tpa(addr) \
419({ \
420 unsigned long ia64_pa; \
421 asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory"); \
422 ia64_pa; \
423})
424
425#define __ia64_set_dbr(index, val) \
426 asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory")
427
428#define ia64_set_ibr(index, val) \
429 asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory")
430
431#define ia64_set_pkr(index, val) \
432 asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory")
433
434#define ia64_set_pmc(index, val) \
435 asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory")
436
437#define ia64_set_pmd(index, val) \
438 asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory")
439
440#define ia64_set_rr(index, val) \
441 asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory");
442
443#define ia64_get_cpuid(index) \
444({ \
445 unsigned long ia64_intri_res; \
446 asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index)); \
447 ia64_intri_res; \
448})
449
450#define __ia64_get_dbr(index) \
451({ \
452 unsigned long ia64_intri_res; \
453 asm volatile ("mov %0=dbr[%1]" : "=r"(ia64_intri_res) : "r"(index)); \
454 ia64_intri_res; \
455})
456
457#define ia64_get_ibr(index) \
458({ \
459 unsigned long ia64_intri_res; \
460 asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index)); \
461 ia64_intri_res; \
462})
463
464#define ia64_get_pkr(index) \
465({ \
466 unsigned long ia64_intri_res; \
467 asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index)); \
468 ia64_intri_res; \
469})
470
471#define ia64_get_pmc(index) \
472({ \
473 unsigned long ia64_intri_res; \
474 asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index)); \
475 ia64_intri_res; \
476})
477
478
479#define ia64_get_pmd(index) \
480({ \
481 unsigned long ia64_intri_res; \
482 asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index)); \
483 ia64_intri_res; \
484})
485
486#define ia64_get_rr(index) \
487({ \
488 unsigned long ia64_intri_res; \
489 asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index)); \
490 ia64_intri_res; \
491})
492
493#define ia64_fc(addr) asm volatile ("fc %0" :: "r"(addr) : "memory")
494
495
496#define ia64_sync_i() asm volatile (";; sync.i" ::: "memory")
497
498#define ia64_ssm(mask) asm volatile ("ssm %0":: "i"((mask)) : "memory")
499#define ia64_rsm(mask) asm volatile ("rsm %0":: "i"((mask)) : "memory")
500#define ia64_sum(mask) asm volatile ("sum %0":: "i"((mask)) : "memory")
501#define ia64_rum(mask) asm volatile ("rum %0":: "i"((mask)) : "memory")
502
503#define ia64_ptce(addr) asm volatile ("ptc.e %0" :: "r"(addr))
504
505#define ia64_ptcga(addr, size) \
506do { \
507 asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory"); \
508 ia64_dv_serialize_data(); \
509} while (0)
510
511#define ia64_ptcl(addr, size) \
512do { \
513 asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory"); \
514 ia64_dv_serialize_data(); \
515} while (0)
516
517#define ia64_ptri(addr, size) \
518 asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory")
519
520#define ia64_ptrd(addr, size) \
521 asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory")
522
523#define ia64_ttag(addr) \
524({ \
525 __u64 ia64_intri_res; \
526 asm volatile ("ttag %0=%1" : "=r"(ia64_intri_res) : "r" (addr)); \
527 ia64_intri_res; \
528})
529
530
531/* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */
532
533#define ia64_lfhint_none 0
534#define ia64_lfhint_nt1 1
535#define ia64_lfhint_nt2 2
536#define ia64_lfhint_nta 3
537
538#define ia64_lfetch(lfhint, y) \
539({ \
540 switch (lfhint) { \
541 case ia64_lfhint_none: \
542 asm volatile ("lfetch [%0]" : : "r"(y)); \
543 break; \
544 case ia64_lfhint_nt1: \
545 asm volatile ("lfetch.nt1 [%0]" : : "r"(y)); \
546 break; \
547 case ia64_lfhint_nt2: \
548 asm volatile ("lfetch.nt2 [%0]" : : "r"(y)); \
549 break; \
550 case ia64_lfhint_nta: \
551 asm volatile ("lfetch.nta [%0]" : : "r"(y)); \
552 break; \
553 } \
554})
555
556#define ia64_lfetch_excl(lfhint, y) \
557({ \
558 switch (lfhint) { \
559 case ia64_lfhint_none: \
560 asm volatile ("lfetch.excl [%0]" :: "r"(y)); \
561 break; \
562 case ia64_lfhint_nt1: \
563 asm volatile ("lfetch.excl.nt1 [%0]" :: "r"(y)); \
564 break; \
565 case ia64_lfhint_nt2: \
566 asm volatile ("lfetch.excl.nt2 [%0]" :: "r"(y)); \
567 break; \
568 case ia64_lfhint_nta: \
569 asm volatile ("lfetch.excl.nta [%0]" :: "r"(y)); \
570 break; \
571 } \
572})
573
574#define ia64_lfetch_fault(lfhint, y) \
575({ \
576 switch (lfhint) { \
577 case ia64_lfhint_none: \
578 asm volatile ("lfetch.fault [%0]" : : "r"(y)); \
579 break; \
580 case ia64_lfhint_nt1: \
581 asm volatile ("lfetch.fault.nt1 [%0]" : : "r"(y)); \
582 break; \
583 case ia64_lfhint_nt2: \
584 asm volatile ("lfetch.fault.nt2 [%0]" : : "r"(y)); \
585 break; \
586 case ia64_lfhint_nta: \
587 asm volatile ("lfetch.fault.nta [%0]" : : "r"(y)); \
588 break; \
589 } \
590})
591
592#define ia64_lfetch_fault_excl(lfhint, y) \
593({ \
594 switch (lfhint) { \
595 case ia64_lfhint_none: \
596 asm volatile ("lfetch.fault.excl [%0]" :: "r"(y)); \
597 break; \
598 case ia64_lfhint_nt1: \
599 asm volatile ("lfetch.fault.excl.nt1 [%0]" :: "r"(y)); \
600 break; \
601 case ia64_lfhint_nt2: \
602 asm volatile ("lfetch.fault.excl.nt2 [%0]" :: "r"(y)); \
603 break; \
604 case ia64_lfhint_nta: \
605 asm volatile ("lfetch.fault.excl.nta [%0]" :: "r"(y)); \
606 break; \
607 } \
608})
609
610#define ia64_intrin_local_irq_restore(x) \
611do { \
612 asm volatile (";; cmp.ne p6,p7=%0,r0;;" \
613 "(p6) ssm psr.i;" \
614 "(p7) rsm psr.i;;" \
615 "(p6) srlz.d" \
616 :: "r"((x)) : "p6", "p7", "memory"); \
617} while (0)
618
619#endif /* _UAPI_ASM_IA64_GCC_INTRIN_H */
arch/ia64/include/uapi/asm/ia64regs.h+0−101
@@ -1,101 +0,0 @@
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2/*
3 * Copyright (C) 2002,2003 Intel Corp.
4 * Jun Nakajima <jun.nakajima@intel.com>
5 * Suresh Siddha <suresh.b.siddha@intel.com>
6 */
7
8#ifndef _ASM_IA64_IA64REGS_H
9#define _ASM_IA64_IA64REGS_H
10
11/*
12 * Register Names for getreg() and setreg().
13 *
14 * The "magic" numbers happen to match the values used by the Intel compiler's
15 * getreg()/setreg() intrinsics.
16 */
17
18/* Special Registers */
19
20#define _IA64_REG_IP 1016 /* getreg only */
21#define _IA64_REG_PSR 1019
22#define _IA64_REG_PSR_L 1019
23
24/* General Integer Registers */
25
26#define _IA64_REG_GP 1025 /* R1 */
27#define _IA64_REG_R8 1032 /* R8 */
28#define _IA64_REG_R9 1033 /* R9 */
29#define _IA64_REG_SP 1036 /* R12 */
30#define _IA64_REG_TP 1037 /* R13 */

71 more lines aren’t shown here.

arch/ia64/include/uapi/asm/intrinsics.h+0−82

This diff is large: its 83 lines aren’t shown here.

arch/ia64/include/uapi/asm/mman.h+0−17

This diff is large: its 18 lines aren’t shown here.

arch/ia64/include/uapi/asm/param.h+0−30

This diff is large: its 31 lines aren’t shown here.

arch/ia64/include/uapi/asm/posix_types.h+0−9

This diff is large: its 10 lines aren’t shown here.

arch/ia64/include/uapi/asm/ptrace.h+0−248

This diff is large: its 249 lines aren’t shown here.

arch/ia64/include/uapi/asm/ptrace_offsets.h+0−269

This diff is large: its 270 lines aren’t shown here.

arch/ia64/include/uapi/asm/resource.h+0−8

This diff is large: its 9 lines aren’t shown here.

arch/ia64/include/uapi/asm/rse.h+0−67

This diff is large: its 68 lines aren’t shown here.

arch/ia64/include/uapi/asm/setup.h+0−25

This diff is large: its 26 lines aren’t shown here.

arch/ia64/include/uapi/asm/sigcontext.h+0−71

This diff is large: its 72 lines aren’t shown here.

arch/ia64/include/uapi/asm/siginfo.h+0−28

This diff is large: its 29 lines aren’t shown here.

arch/ia64/include/uapi/asm/signal.h+0−98

This diff is large: its 99 lines aren’t shown here.

arch/ia64/include/uapi/asm/stat.h+0−52

This diff is large: its 53 lines aren’t shown here.

arch/ia64/include/uapi/asm/statfs.h+0−21

This diff is large: its 22 lines aren’t shown here.

arch/ia64/include/uapi/asm/swab.h+0−35

This diff is large: its 36 lines aren’t shown here.

arch/ia64/include/uapi/asm/types.h+0−32

This diff is large: its 33 lines aren’t shown here.

arch/ia64/include/uapi/asm/ucontext.h+0−13

This diff is large: its 14 lines aren’t shown here.

arch/ia64/include/uapi/asm/unistd.h+0−22

This diff is large: its 23 lines aren’t shown here.

arch/ia64/include/uapi/asm/ustack.h+0−13

This diff is large: its 14 lines aren’t shown here.

arch/ia64/install.sh+0−30

This diff is large: its 31 lines aren’t shown here.

arch/ia64/kernel/.gitignore+0−3

This diff is large: its 4 lines aren’t shown here.

arch/ia64/kernel/Makefile+0−46

This diff is large: its 47 lines aren’t shown here.

arch/ia64/kernel/Makefile.gate+0−29

This diff is large: its 30 lines aren’t shown here.

arch/ia64/kernel/acpi-ext.c+0−101

This diff is large: its 102 lines aren’t shown here.

arch/ia64/kernel/acpi.c+0−909

This diff is large: its 910 lines aren’t shown here.

arch/ia64/kernel/asm-offsets.c+0−289

This diff is large: its 290 lines aren’t shown here.

arch/ia64/kernel/audit.c+0−63

This diff is large: its 64 lines aren’t shown here.

arch/ia64/kernel/brl_emu.c+0−217

This diff is large: its 218 lines aren’t shown here.

arch/ia64/kernel/crash.c+0−257

This diff is large: its 258 lines aren’t shown here.

arch/ia64/kernel/crash_dump.c+0−27

This diff is large: its 28 lines aren’t shown here.

arch/ia64/kernel/cyclone.c+0−125

This diff is large: its 126 lines aren’t shown here.

arch/ia64/kernel/dma-mapping.c+0−9

This diff is large: its 10 lines aren’t shown here.

arch/ia64/kernel/efi.c+0−1360

This diff is large: its 1361 lines aren’t shown here.

arch/ia64/kernel/efi_stub.S+0−87

This diff is large: its 88 lines aren’t shown here.

arch/ia64/kernel/elfcore.c+0−77

This diff is large: its 78 lines aren’t shown here.

arch/ia64/kernel/entry.S+0−1427

This diff is large: its 1428 lines aren’t shown here.

arch/ia64/kernel/entry.h+0−83

This diff is large: its 84 lines aren’t shown here.

arch/ia64/kernel/err_inject.c+0−273

This diff is large: its 274 lines aren’t shown here.

arch/ia64/kernel/esi.c+0−193

This diff is large: its 194 lines aren’t shown here.

arch/ia64/kernel/esi_stub.S+0−99

This diff is large: its 100 lines aren’t shown here.

arch/ia64/kernel/fsys.S+0−837

This diff is large: its 838 lines aren’t shown here.

arch/ia64/kernel/fsyscall_gtod_data.h+0−30

This diff is large: its 31 lines aren’t shown here.

arch/ia64/kernel/ftrace.c+0−196

This diff is large: its 197 lines aren’t shown here.

arch/ia64/kernel/gate-data.S+0−3

This diff is large: its 4 lines aren’t shown here.

arch/ia64/kernel/gate.S+0−380

This diff is large: its 381 lines aren’t shown here.

arch/ia64/kernel/gate.lds.S+0−108

This diff is large: its 109 lines aren’t shown here.

arch/ia64/kernel/head.S+0−1167

This diff is large: its 1168 lines aren’t shown here.

arch/ia64/kernel/iosapic.c+0−1137

This diff is large: its 1138 lines aren’t shown here.

arch/ia64/kernel/irq.c+0−181

This diff is large: its 182 lines aren’t shown here.

arch/ia64/kernel/irq.h+0−3

This diff is large: its 4 lines aren’t shown here.

arch/ia64/kernel/irq_ia64.c+0−645

This diff is large: its 646 lines aren’t shown here.

arch/ia64/kernel/irq_lsapic.c+0−45

This diff is large: its 46 lines aren’t shown here.

arch/ia64/kernel/ivt.S+0−1688

This diff is large: its 1689 lines aren’t shown here.

arch/ia64/kernel/kprobes.c+0−911

This diff is large: its 912 lines aren’t shown here.

arch/ia64/kernel/machine_kexec.c+0−163

This diff is large: its 164 lines aren’t shown here.

arch/ia64/kernel/mca.c+0−2111

This diff is large: its 2112 lines aren’t shown here.

arch/ia64/kernel/mca_asm.S+0−1123

This diff is large: its 1124 lines aren’t shown here.

arch/ia64/kernel/mca_drv.c+0−796

This diff is large: its 797 lines aren’t shown here.

arch/ia64/kernel/mca_drv.h+0−123

This diff is large: its 124 lines aren’t shown here.

arch/ia64/kernel/mca_drv_asm.S+0−56

This diff is large: its 57 lines aren’t shown here.

arch/ia64/kernel/minstate.h+0−251

This diff is large: its 252 lines aren’t shown here.

arch/ia64/kernel/module.c+0−959

This diff is large: its 960 lines aren’t shown here.

arch/ia64/kernel/msi_ia64.c+0−198

This diff is large: its 199 lines aren’t shown here.

arch/ia64/kernel/numa.c+0−73

This diff is large: its 74 lines aren’t shown here.

arch/ia64/kernel/pal.S+0−306

This diff is large: its 307 lines aren’t shown here.

arch/ia64/kernel/palinfo.c+0−942

This diff is large: its 943 lines aren’t shown here.

arch/ia64/kernel/patch.c+0−237

This diff is large: its 238 lines aren’t shown here.

arch/ia64/kernel/pci-dma.c+0−33

This diff is large: its 34 lines aren’t shown here.

arch/ia64/kernel/perfmon_itanium.h+0−116

This diff is large: its 117 lines aren’t shown here.

arch/ia64/kernel/process.c+0−611

This diff is large: its 612 lines aren’t shown here.

arch/ia64/kernel/ptrace.c+0−2012

This diff is large: its 2013 lines aren’t shown here.

arch/ia64/kernel/relocate_kernel.S+0−321

This diff is large: its 322 lines aren’t shown here.

arch/ia64/kernel/sal.c+0−400

This diff is large: its 401 lines aren’t shown here.

arch/ia64/kernel/salinfo.c+0−646

This diff is large: its 647 lines aren’t shown here.

arch/ia64/kernel/setup.c+0−1081

This diff is large: its 1082 lines aren’t shown here.

arch/ia64/kernel/sigframe.h+0−26

This diff is large: its 27 lines aren’t shown here.

arch/ia64/kernel/signal.c+0−412

This diff is large: its 413 lines aren’t shown here.

arch/ia64/kernel/smp.c+0−335

This diff is large: its 336 lines aren’t shown here.

arch/ia64/kernel/smpboot.c+0−839

This diff is large: its 840 lines aren’t shown here.

arch/ia64/kernel/stacktrace.c+0−40

This diff is large: its 41 lines aren’t shown here.

arch/ia64/kernel/sys_ia64.c+0−197

This diff is large: its 198 lines aren’t shown here.

arch/ia64/kernel/syscalls/Makefile+0−32

This diff is large: its 33 lines aren’t shown here.

arch/ia64/kernel/syscalls/syscall.tbl+0−375

This diff is large: its 376 lines aren’t shown here.

arch/ia64/kernel/time.c+0−463

This diff is large: its 464 lines aren’t shown here.

arch/ia64/kernel/topology.c+0−410

This diff is large: its 411 lines aren’t shown here.

arch/ia64/kernel/traps.c+0−612

This diff is large: its 613 lines aren’t shown here.

arch/ia64/kernel/unaligned.c+0−1560

This diff is large: its 1561 lines aren’t shown here.

arch/ia64/kernel/uncached.c+0−273

This diff is large: its 274 lines aren’t shown here.

arch/ia64/kernel/unwind.c+0−2320

This diff is large: its 2321 lines aren’t shown here.

arch/ia64/kernel/unwind_decoder.c+0−460

This diff is large: its 461 lines aren’t shown here.

arch/ia64/kernel/unwind_i.h+0−165

This diff is large: its 166 lines aren’t shown here.

arch/ia64/kernel/vmlinux.lds.S+0−224

This diff is large: its 225 lines aren’t shown here.

arch/ia64/lib/Makefile+0−48

This diff is large: its 49 lines aren’t shown here.

arch/ia64/lib/checksum.c+0−102

This diff is large: its 103 lines aren’t shown here.

arch/ia64/lib/clear_page.S+0−79

This diff is large: its 80 lines aren’t shown here.

arch/ia64/lib/clear_user.S+0−212

This diff is large: its 213 lines aren’t shown here.

arch/ia64/lib/copy_page.S+0−101

This diff is large: its 102 lines aren’t shown here.

arch/ia64/lib/copy_page_mck.S+0−188

This diff is large: its 189 lines aren’t shown here.

arch/ia64/lib/copy_user.S+0−613

This diff is large: its 614 lines aren’t shown here.

arch/ia64/lib/csum_partial_copy.c+0−98

This diff is large: its 99 lines aren’t shown here.

arch/ia64/lib/do_csum.S+0−324

This diff is large: its 325 lines aren’t shown here.

arch/ia64/lib/flush.S+0−119

This diff is large: its 120 lines aren’t shown here.

arch/ia64/lib/idiv32.S+0−86

This diff is large: its 87 lines aren’t shown here.

arch/ia64/lib/idiv64.S+0−83

This diff is large: its 84 lines aren’t shown here.

arch/ia64/lib/io.c+0−51

This diff is large: its 52 lines aren’t shown here.

arch/ia64/lib/ip_fast_csum.S+0−148

This diff is large: its 149 lines aren’t shown here.

arch/ia64/lib/memcpy.S+0−304

This diff is large: its 305 lines aren’t shown here.

arch/ia64/lib/memcpy_mck.S+0−659

This diff is large: its 660 lines aren’t shown here.

arch/ia64/lib/memset.S+0−365

This diff is large: its 366 lines aren’t shown here.

arch/ia64/lib/strlen.S+0−195

This diff is large: its 196 lines aren’t shown here.

arch/ia64/lib/strncpy_from_user.S+0−47

This diff is large: its 48 lines aren’t shown here.

arch/ia64/lib/strnlen_user.S+0−48

This diff is large: its 49 lines aren’t shown here.

arch/ia64/lib/xor.S+0−181

This diff is large: its 182 lines aren’t shown here.

arch/ia64/mm/Makefile+0−11

This diff is large: its 12 lines aren’t shown here.

arch/ia64/mm/contig.c+0−208

This diff is large: its 209 lines aren’t shown here.

arch/ia64/mm/discontig.c+0−635

This diff is large: its 636 lines aren’t shown here.

arch/ia64/mm/extable.c+0−24

This diff is large: its 25 lines aren’t shown here.

arch/ia64/mm/fault.c+0−251

This diff is large: its 252 lines aren’t shown here.

arch/ia64/mm/hugetlbpage.c+0−186

This diff is large: its 187 lines aren’t shown here.

arch/ia64/mm/init.c+0−532

This diff is large: its 533 lines aren’t shown here.

arch/ia64/mm/ioremap.c+0−94

This diff is large: its 95 lines aren’t shown here.

arch/ia64/mm/numa.c+0−80

This diff is large: its 81 lines aren’t shown here.

arch/ia64/mm/tlb.c+0−591

This diff is large: its 592 lines aren’t shown here.

arch/ia64/pci/Makefile+0−5

This diff is large: its 6 lines aren’t shown here.

arch/ia64/pci/fixup.c+0−80

This diff is large: its 81 lines aren’t shown here.

arch/ia64/pci/pci.c+0−576

This diff is large: its 577 lines aren’t shown here.

arch/ia64/scripts/check-gas+0−16

This diff is large: its 17 lines aren’t shown here.

arch/ia64/scripts/check-gas-asm.S+0−2

This diff is large: its 3 lines aren’t shown here.

arch/ia64/scripts/check-model.c+0−1

This diff is large: its 2 lines aren’t shown here.

arch/ia64/scripts/check-segrel.S+0−5

This diff is large: its 6 lines aren’t shown here.

arch/ia64/scripts/check-segrel.lds+0−13

This diff is large: its 14 lines aren’t shown here.

arch/ia64/scripts/check-serialize.S+0−2

This diff is large: its 3 lines aren’t shown here.

arch/ia64/scripts/check-text-align.S+0−7

This diff is large: its 8 lines aren’t shown here.

arch/ia64/scripts/toolchain-flags+0−54

This diff is large: its 55 lines aren’t shown here.

arch/ia64/scripts/unwcheck.py+0−65

This diff is large: its 66 lines aren’t shown here.

arch/ia64/uv/Makefile+0−12

This diff is large: its 13 lines aren’t shown here.

arch/ia64/uv/kernel/Makefile+0−12

This diff is large: its 13 lines aren’t shown here.

arch/ia64/uv/kernel/setup.c+0−120

This diff is large: its 121 lines aren’t shown here.

drivers/acpi/Kconfig+3−3

This diff is large: its 21 lines aren’t shown here.

drivers/acpi/numa/Kconfig+2−2

This diff is large: its 11 lines aren’t shown here.

drivers/acpi/osl.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/char/Kconfig+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/char/Makefile+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/char/agp/Kconfig+1−15

This diff is large: its 30 lines aren’t shown here.

drivers/char/agp/Makefile+0−2

This diff is large: its 10 lines aren’t shown here.

drivers/char/agp/hp-agp.c+0−550

This diff is large: its 551 lines aren’t shown here.

drivers/char/agp/i460-agp.c+0−659

This diff is large: its 660 lines aren’t shown here.

drivers/char/hpet.c+0−30

This diff is large: its 44 lines aren’t shown here.

drivers/char/hw_random/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/char/mem.c+0−12

This diff is large: its 33 lines aren’t shown here.

drivers/char/mspec.c+0−295

This diff is large: its 296 lines aren’t shown here.

drivers/cpufreq/Kconfig+0−11

This diff is large: its 18 lines aren’t shown here.

drivers/cpufreq/Makefile+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/cpufreq/ia64-acpi-cpufreq.c+0−353

This diff is large: its 354 lines aren’t shown here.

drivers/firmware/Kconfig+0−24

This diff is large: its 31 lines aren’t shown here.

drivers/firmware/Makefile+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/firmware/efi/Kconfig+3−3

This diff is large: its 27 lines aren’t shown here.

drivers/firmware/efi/efi.c+1−12

This diff is large: its 48 lines aren’t shown here.

drivers/firmware/pcdp.c+0−135

This diff is large: its 136 lines aren’t shown here.

drivers/firmware/pcdp.h+0−108

This diff is large: its 109 lines aren’t shown here.

drivers/gpu/drm/drm_ioc32.c+2−2

This diff is large: its 14 lines aren’t shown here.

drivers/input/serio/i8042.h+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/iommu/Kconfig+2−2

This diff is large: its 18 lines aren’t shown here.

drivers/iommu/intel/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/media/cec/platform/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/misc/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/misc/sgi-gru/gru.h+1−3

This diff is large: its 11 lines aren’t shown here.

drivers/misc/sgi-gru/gru_instructions.h+1−11

This diff is large: its 19 lines aren’t shown here.

drivers/misc/sgi-gru/grufile.c+0−72

This diff is large: its 95 lines aren’t shown here.

drivers/misc/sgi-gru/gruhandles.c+0−6

This diff is large: its 17 lines aren’t shown here.

drivers/misc/sgi-gru/grumain.c+0−4

This diff is large: its 17 lines aren’t shown here.

drivers/misc/sgi-xp/xp.h+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/misc/sgi-xp/xp_uv.c+0−24

This diff is large: its 45 lines aren’t shown here.

drivers/misc/sgi-xp/xpc_main.c+0−31

This diff is large: its 45 lines aren’t shown here.

drivers/misc/sgi-xp/xpc_uv.c+0−85

This diff is large: its 156 lines aren’t shown here.

drivers/net/ethernet/broadcom/tg3.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/net/ethernet/brocade/bna/bnad.h+0−1

This diff is large: its 8 lines aren’t shown here.

drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c+0−2

This diff is large: its 10 lines aren’t shown here.

drivers/pci/vgaarb.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/tty/serial/8250/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/tty/vt/keyboard.c+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/video/fbdev/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

drivers/watchdog/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

fs/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

fs/afs/main.c+0−2

This diff is large: its 9 lines aren’t shown here.

fs/xfs/xfs_ioctl32.h+1−1

This diff is large: its 9 lines aren’t shown here.

include/linux/acpi.h+1−8

This diff is large: its 25 lines aren’t shown here.

include/linux/efi.h+0−7

This diff is large: its 25 lines aren’t shown here.

include/linux/mm.h+0−2

This diff is large: its 9 lines aren’t shown here.

include/linux/moduleparam.h+1−1

This diff is large: its 9 lines aren’t shown here.

include/linux/raid/pq.h+0−2

This diff is large: its 9 lines aren’t shown here.

include/linux/sched/signal.h+4−13

This diff is large: its 25 lines aren’t shown here.

include/trace/events/mmflags.h+1−1

This diff is large: its 9 lines aren’t shown here.

include/uapi/asm-generic/siginfo.h+0−5

This diff is large: its 12 lines aren’t shown here.

init/Kconfig+1−1

This diff is large: its 9 lines aren’t shown here.

kernel/cpu.c+0−3

This diff is large: its 10 lines aren’t shown here.

kernel/fork.c+1−1

This diff is large: its 9 lines aren’t shown here.

kernel/sched/core.c+3−26

This diff is large: its 44 lines aren’t shown here.

kernel/signal.c+5−20

This diff is large: its 52 lines aren’t shown here.

kernel/sysctl.c+0−9

This diff is large: its 16 lines aren’t shown here.

lib/Kconfig.debug+1−1

This diff is large: its 9 lines aren’t shown here.

lib/decompress_unxz.c+0−3

This diff is large: its 10 lines aren’t shown here.

lib/raid6/Makefile+2−2

This diff is large: its 18 lines aren’t shown here.

lib/raid6/algos.c+0−4

This diff is large: its 11 lines aren’t shown here.

lib/raid6/int.uc+0−9

This diff is large: its 20 lines aren’t shown here.

lib/xz/Kconfig+0−5

This diff is large: its 12 lines aren’t shown here.

mm/mmap.c+3−3

This diff is large: its 21 lines aren’t shown here.

tools/arch/ia64/include/asm/barrier.h+0−59

This diff is large: its 60 lines aren’t shown here.

tools/arch/ia64/include/uapi/asm/bitsperlong.h+0−9

This diff is large: its 10 lines aren’t shown here.

tools/arch/ia64/include/uapi/asm/mman.h+0−7

This diff is large: its 8 lines aren’t shown here.

usr/include/Makefile+0−6

This diff is large: its 13 lines aren’t shown here.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t