xref: /OK3568_Linux_fs/kernel/scripts/atomic/gen-atomic-fallback.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593SmuzhiyunATOMICDIR=$(dirname $0)
5*4882a593SmuzhiyunARCH=$2
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun. ${ATOMICDIR}/atomic-tbl.sh
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun#gen_template_fallback(template, meta, pfx, name, sfx, order, arch, atomic, int, args...)
10*4882a593Smuzhiyungen_template_fallback()
11*4882a593Smuzhiyun{
12*4882a593Smuzhiyun	local template="$1"; shift
13*4882a593Smuzhiyun	local meta="$1"; shift
14*4882a593Smuzhiyun	local pfx="$1"; shift
15*4882a593Smuzhiyun	local name="$1"; shift
16*4882a593Smuzhiyun	local sfx="$1"; shift
17*4882a593Smuzhiyun	local order="$1"; shift
18*4882a593Smuzhiyun	local arch="$1"; shift
19*4882a593Smuzhiyun	local atomic="$1"; shift
20*4882a593Smuzhiyun	local int="$1"; shift
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun	local atomicname="${arch}${atomic}_${pfx}${name}${sfx}${order}"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun	local ret="$(gen_ret_type "${meta}" "${int}")"
25*4882a593Smuzhiyun	local retstmt="$(gen_ret_stmt "${meta}")"
26*4882a593Smuzhiyun	local params="$(gen_params "${int}" "${atomic}" "$@")"
27*4882a593Smuzhiyun	local args="$(gen_args "$@")"
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun	if [ ! -z "${template}" ]; then
30*4882a593Smuzhiyun		printf "#ifndef ${atomicname}\n"
31*4882a593Smuzhiyun		. ${template}
32*4882a593Smuzhiyun		printf "#define ${atomicname} ${atomicname}\n"
33*4882a593Smuzhiyun		printf "#endif\n\n"
34*4882a593Smuzhiyun	fi
35*4882a593Smuzhiyun}
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun#gen_proto_fallback(meta, pfx, name, sfx, order, arch, atomic, int, args...)
38*4882a593Smuzhiyungen_proto_fallback()
39*4882a593Smuzhiyun{
40*4882a593Smuzhiyun	local meta="$1"; shift
41*4882a593Smuzhiyun	local pfx="$1"; shift
42*4882a593Smuzhiyun	local name="$1"; shift
43*4882a593Smuzhiyun	local sfx="$1"; shift
44*4882a593Smuzhiyun	local order="$1"; shift
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun	local tmpl="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")"
47*4882a593Smuzhiyun	gen_template_fallback "${tmpl}" "${meta}" "${pfx}" "${name}" "${sfx}" "${order}" "$@"
48*4882a593Smuzhiyun}
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun#gen_basic_fallbacks(basename)
51*4882a593Smuzhiyungen_basic_fallbacks()
52*4882a593Smuzhiyun{
53*4882a593Smuzhiyun	local basename="$1"; shift
54*4882a593Smuzhiyuncat << EOF
55*4882a593Smuzhiyun#define ${basename}_acquire ${basename}
56*4882a593Smuzhiyun#define ${basename}_release ${basename}
57*4882a593Smuzhiyun#define ${basename}_relaxed ${basename}
58*4882a593SmuzhiyunEOF
59*4882a593Smuzhiyun}
60*4882a593Smuzhiyun
61*4882a593Smuzhiyungen_proto_order_variant()
62*4882a593Smuzhiyun{
63*4882a593Smuzhiyun	local meta="$1"; shift
64*4882a593Smuzhiyun	local pfx="$1"; shift
65*4882a593Smuzhiyun	local name="$1"; shift
66*4882a593Smuzhiyun	local sfx="$1"; shift
67*4882a593Smuzhiyun	local order="$1"; shift
68*4882a593Smuzhiyun	local arch="$1"
69*4882a593Smuzhiyun	local atomic="$2"
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun	local basename="${arch}${atomic}_${pfx}${name}${sfx}"
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun	printf "#define arch_${basename}${order} ${basename}${order}\n"
74*4882a593Smuzhiyun}
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun#gen_proto_order_variants(meta, pfx, name, sfx, arch, atomic, int, args...)
77*4882a593Smuzhiyungen_proto_order_variants()
78*4882a593Smuzhiyun{
79*4882a593Smuzhiyun	local meta="$1"; shift
80*4882a593Smuzhiyun	local pfx="$1"; shift
81*4882a593Smuzhiyun	local name="$1"; shift
82*4882a593Smuzhiyun	local sfx="$1"; shift
83*4882a593Smuzhiyun	local arch="$1"
84*4882a593Smuzhiyun	local atomic="$2"
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun	local basename="${arch}${atomic}_${pfx}${name}${sfx}"
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun	local template="$(find_fallback_template "${pfx}" "${name}" "${sfx}" "${order}")"
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun	if [ -z "$arch" ]; then
91*4882a593Smuzhiyun		gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun		if meta_has_acquire "${meta}"; then
94*4882a593Smuzhiyun			gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
95*4882a593Smuzhiyun		fi
96*4882a593Smuzhiyun		if meta_has_release "${meta}"; then
97*4882a593Smuzhiyun			gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
98*4882a593Smuzhiyun		fi
99*4882a593Smuzhiyun		if meta_has_relaxed "${meta}"; then
100*4882a593Smuzhiyun			gen_proto_order_variant "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@"
101*4882a593Smuzhiyun		fi
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun		echo ""
104*4882a593Smuzhiyun	fi
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun	# If we don't have relaxed atomics, then we don't bother with ordering fallbacks
107*4882a593Smuzhiyun	# read_acquire and set_release need to be templated, though
108*4882a593Smuzhiyun	if ! meta_has_relaxed "${meta}"; then
109*4882a593Smuzhiyun		gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun		if meta_has_acquire "${meta}"; then
112*4882a593Smuzhiyun			gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
113*4882a593Smuzhiyun		fi
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun		if meta_has_release "${meta}"; then
116*4882a593Smuzhiyun			gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
117*4882a593Smuzhiyun		fi
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun		return
120*4882a593Smuzhiyun	fi
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun	printf "#ifndef ${basename}_relaxed\n"
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun	if [ ! -z "${template}" ]; then
125*4882a593Smuzhiyun		printf "#ifdef ${basename}\n"
126*4882a593Smuzhiyun	fi
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	gen_basic_fallbacks "${basename}"
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun	if [ ! -z "${template}" ]; then
131*4882a593Smuzhiyun		printf "#endif /* ${arch}${atomic}_${pfx}${name}${sfx} */\n\n"
132*4882a593Smuzhiyun		gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
133*4882a593Smuzhiyun		gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
134*4882a593Smuzhiyun		gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
135*4882a593Smuzhiyun		gen_proto_fallback "${meta}" "${pfx}" "${name}" "${sfx}" "_relaxed" "$@"
136*4882a593Smuzhiyun	fi
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun	printf "#else /* ${basename}_relaxed */\n\n"
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun	gen_template_fallback "${ATOMICDIR}/fallbacks/acquire"  "${meta}" "${pfx}" "${name}" "${sfx}" "_acquire" "$@"
141*4882a593Smuzhiyun	gen_template_fallback "${ATOMICDIR}/fallbacks/release"  "${meta}" "${pfx}" "${name}" "${sfx}" "_release" "$@"
142*4882a593Smuzhiyun	gen_template_fallback "${ATOMICDIR}/fallbacks/fence"  "${meta}" "${pfx}" "${name}" "${sfx}" "" "$@"
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun	printf "#endif /* ${basename}_relaxed */\n\n"
145*4882a593Smuzhiyun}
146*4882a593Smuzhiyun
147*4882a593Smuzhiyungen_xchg_fallbacks()
148*4882a593Smuzhiyun{
149*4882a593Smuzhiyun	local xchg="$1"; shift
150*4882a593Smuzhiyuncat <<EOF
151*4882a593Smuzhiyun#ifndef ${xchg}_relaxed
152*4882a593Smuzhiyun#define ${xchg}_relaxed		${xchg}
153*4882a593Smuzhiyun#define ${xchg}_acquire		${xchg}
154*4882a593Smuzhiyun#define ${xchg}_release		${xchg}
155*4882a593Smuzhiyun#else /* ${xchg}_relaxed */
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun#ifndef ${xchg}_acquire
158*4882a593Smuzhiyun#define ${xchg}_acquire(...) \\
159*4882a593Smuzhiyun	__atomic_op_acquire(${xchg}, __VA_ARGS__)
160*4882a593Smuzhiyun#endif
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun#ifndef ${xchg}_release
163*4882a593Smuzhiyun#define ${xchg}_release(...) \\
164*4882a593Smuzhiyun	__atomic_op_release(${xchg}, __VA_ARGS__)
165*4882a593Smuzhiyun#endif
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun#ifndef ${xchg}
168*4882a593Smuzhiyun#define ${xchg}(...) \\
169*4882a593Smuzhiyun	__atomic_op_fence(${xchg}, __VA_ARGS__)
170*4882a593Smuzhiyun#endif
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun#endif /* ${xchg}_relaxed */
173*4882a593Smuzhiyun
174*4882a593SmuzhiyunEOF
175*4882a593Smuzhiyun}
176*4882a593Smuzhiyun
177*4882a593Smuzhiyuncat << EOF
178*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun// Generated by $0
181*4882a593Smuzhiyun// DO NOT MODIFY THIS FILE DIRECTLY
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun#ifndef _LINUX_ATOMIC_FALLBACK_H
184*4882a593Smuzhiyun#define _LINUX_ATOMIC_FALLBACK_H
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun#include <linux/compiler.h>
187*4882a593Smuzhiyun
188*4882a593SmuzhiyunEOF
189*4882a593Smuzhiyun
190*4882a593Smuzhiyunfor xchg in "${ARCH}xchg" "${ARCH}cmpxchg" "${ARCH}cmpxchg64"; do
191*4882a593Smuzhiyun	gen_xchg_fallbacks "${xchg}"
192*4882a593Smuzhiyundone
193*4882a593Smuzhiyun
194*4882a593Smuzhiyungrep '^[a-z]' "$1" | while read name meta args; do
195*4882a593Smuzhiyun	gen_proto "${meta}" "${name}" "${ARCH}" "atomic" "int" ${args}
196*4882a593Smuzhiyundone
197*4882a593Smuzhiyun
198*4882a593Smuzhiyuncat <<EOF
199*4882a593Smuzhiyun#ifdef CONFIG_GENERIC_ATOMIC64
200*4882a593Smuzhiyun#include <asm-generic/atomic64.h>
201*4882a593Smuzhiyun#endif
202*4882a593Smuzhiyun
203*4882a593SmuzhiyunEOF
204*4882a593Smuzhiyun
205*4882a593Smuzhiyungrep '^[a-z]' "$1" | while read name meta args; do
206*4882a593Smuzhiyun	gen_proto "${meta}" "${name}" "${ARCH}" "atomic64" "s64" ${args}
207*4882a593Smuzhiyundone
208*4882a593Smuzhiyun
209*4882a593Smuzhiyuncat <<EOF
210*4882a593Smuzhiyun#endif /* _LINUX_ATOMIC_FALLBACK_H */
211*4882a593SmuzhiyunEOF
212