1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
|
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# EAPI Version
EAPI="8"
#//------------------------------------------------------------------------------
# Version Data
GENPATCHREV="8" # Tarball revision for patches
# Directories
S="${WORKDIR}/linux-${OKV}"
MIPS_PATCHES="${WORKDIR}/mips-patches"
# Kernel-2 Vars
K_SECURITY_UNSUPPORTED="yes"
K_NOUSENAME="yes"
K_NOSETEXTRAVERSION="yes"
K_NOUSEPR="yes"
K_BASE_VER="5.3"
K_FROM_GIT="yes"
ETYPE="sources"
# Inherit Eclasses
inherit kernel-2
detect_version
# Version Data
F_KV="${PVR}"
BASE_KV="$(ver_cut 1-2)"
[[ "${EXTRAVERSION}" = -rc* ]] && KVE="${EXTRAVERSION}"
# Portage Vars
HOMEPAGE="https://wiki.gentoo.org/wiki/Project:MIPS"
KEYWORDS="-* ~mips"
IUSE="experimental ip27 ip28 ip30 symlink"
# Specify any patches or patch familes to NOT apply here.
# Use only the 4-digit number followed by a '*'.
P_EXCLUDE=""
# Machine Support Control Variables
DO_IP22="test" # If "yes", enable IP22 support (SGI Indy, Indigo2 R4x00)
DO_IP27="yes" # IP27 support (SGI Origin)
DO_IP28="no" # IP28 support (SGI Indigo2 Impact R10000)
DO_IP30="yes" # IP30 support (SGI Octane)
DO_IP32="yes" # IP32 support (SGI O2, R5000/RM5200 Only)
# Machine Stable Version Variables
SV_IP22="" # If set && DO_IP22 == "no", indicates last "good" IP22 version
SV_IP27="" # DO_IP27 == "no", IP27
SV_IP28="4.19.x" # DO_IP28 == "no", IP28
SV_IP30="" # DO_IP30 == "no", IP30
SV_IP32="" # DO_IP32 == "no", IP32
DESCRIPTION="Kernel.org sources for MIPS-based machines"
SRC_URI="${KERNEL_URI}
https://dev.gentoo.org/~kumba/distfiles/${PN}-${BASE_KV}-patches-v${GENPATCHREV}.tar.xz"
#//------------------------------------------------------------------------------
err_disabled_mach() {
# Get args
local m_name="${1}"
local m_abbr="${2}"
local m_use="${3}"
local is_test="${4}"
# Get stable version, if exists
local stable_ver="SV_${m_abbr}"
stable_ver="${!stable_ver}"
# See if this machine needs a USE passed or skip dying
local has_use
[[ "${m_use}" != "skip" ]] \
&& has_use="USE=\"${m_use}\" "
# Print error && (maybe) die
echo -e ""
if [[ "${is_test}" != "test" ]]; then
eerror "${m_name} Support has been disabled in this ebuild"
eerror "revision. If you wish to merge ${m_name} sources, then"
eerror "run ${has_use}emerge =mips-sources-${stable_ver}"
[[ "${m_use}" != "skip" ]] \
&& die "${m_name} Support disabled."
else
ewarn "${m_name} Support has been marked as needing testing in this"
ewarn "ebuild revision. This usually means that any patches to support"
ewarn "${m_name} have been forward ported and maybe even compile-tested,"
ewarn "but not yet booted on real hardware, possibly due to a lack of access"
ewarn "to such hardware. If you happen to boot this kernel and have no"
ewarn "problems at all, then please inform the maintainer. Otherwise, if"
ewarn "experience a bug, an oops/panic, or some other oddity, then please"
ewarn "file a bug at bugs.gentoo.org, and assign it to the mips team."
fi
return 0
}
err_only_one_mach_allowed() {
echo -e ""
eerror "A patchset for a specific machine-type has already been selected."
eerror "No other patches for machines-types are permitted. You will need a"
eerror "separate copy of the kernel sources for each different machine-type"
eerror "you want to build a kernel for."
die "Only one machine-type patchset allowed"
}
fkv_to_machtype() {
# For any machines that use external patches, we rename the source
# tree to match the machine type.
local fkv="${F_KV%-*}"
local v="${fkv}"
for x in {ip27,ip28,ip30}; do
use ${x} && v="${v}.${x}" && break
done
echo "${v}"
}
pkg_postinst() {
if ! use symlink; then
return 0
fi
local kern_sym="/usr/src/linux"
# Check that /usr/src/linux is safe to overwrite
if [[ -e "${kern_sym}" && ! -L "${kern_sym}" ]]; then
die "${kern_sym} already exists, but is not a symbolic link"
fi
# Symlink /usr/src/linux as appropriate
local kern_ver=$(fkv_to_machtype)
ln -snf "linux-${kern_ver}" "${kern_sym}"
}
pkg_setup() {
local arch_is_selected="no"
local m_ip m_enable m_name
# Exclusive machine patchsets
# These are not allowed to be mixed together, thus only one of them may be applied
# to a tree per merge.
for x in \
"ip27 SGI Origin 200/2000" \
"ip28 SGI Indigo2 Impact R10000" \
"ip30 SGI Octane"
do
set -- ${x} # Set positional params
m_ip="${1}" # Grab the first param (HW IP for SGI)
shift # Shift the positions
m_name="${*}" # Get the rest (Name)
if ! use ${m_ip}; then
continue
fi
# Fetch the value indiciating if the machine is enabled or not
m_enable="DO_${m_ip/ip/IP}"
m_enable="${!m_enable}"
# Make sure only one of these exclusive machine patches is selected
[[ "${arch_is_selected}" = "no" ]] \
&& arch_is_selected="yes" \
|| err_only_one_mach_allowed
# Is the machine support disabled or marked as needing testing?
case "${m_enable}" in
"test") err_disabled_mach "${m_name}" "${m_ip/ip/IP}" "${m_ip}" "test" ;;
"no") err_disabled_mach "${m_name}" "${m_ip/ip/IP}" "${m_ip}" ;;
esac
# Show relevant information about the machine
show_${m_ip}_info
done
# All other systems that don't have a USE flag go here
# These systems have base-line support included in linux-mips git, so
# instead of failing, if disabled, we simply warn the user
if [[ "${arch_is_selected}" = "no" ]]; then
[[ "${DO_IP22}" = "no" ]] \
&& err_disabled_mach "SGI Indy/Indigo2 R4x00" "IP22" "skip" \
|| show_ip22_info
[[ "${DO_IP32}" = "no" ]] \
&& err_disabled_mach "SGI O2" "IP32" "skip" \
|| show_ip32_info
fi
}
show_ip22_info() {
echo -e ""
einfo "IP22 systems with an R5000 processor should work with this release."
einfo "The R4x00 series of processors tend to be rather flaky, especially the"
einfo "R4600. If you have to run an R4x00 processor, then try to use an R4400."
einfo ""
einfo "Some Notes:"
einfo "\t- The only supported graphics card right is Newport (XL)."
einfo "\t- There is no driver for Extreme (XZ)."
echo -e ""
}
show_ip27_info() {
echo -e ""
ewarn "IP27 Origin 2k/Onyx2 systems may be prone to sudden hard lockups."
ewarn "The exact trigger is unknown at this time."
echo -e ""
}
show_ip28_info() {
echo -e ""
einfo "Support for the Indigo2 Impact R10000 is now in the mainline kernel. However,"
einfo "due to the R10000 Speculative Execution issue that exists with this machine,"
einfo "nothing is guaranteed to work correctly. Consider enabling ${HILITE}CONFIG_KALLSYMS${NORMAL}"
einfo "in your kernel so that if the machine Oopes, you'll be able to provide valuable"
einfo "feedback that can be used to trace down the crash."
echo -e ""
}
show_ip30_info() {
echo -e ""
eerror "Things that DON'T work:"
eerror "\t- Do not use CONFIG_SLUB, otherwise, you'll get errors when booting"
eerror "\t\040\040regarding duplicate /sys/kernel/slab/* entries in sysfs."
eerror "\t- Impact (MGRAS) Xorg driver no longer functions due to severe bitrot."
eerror "\t- Octane is limited to a maximum of 2GB of memory right now due to a"
eerror "\t\040\040hardware quirk in the BRIDGE PCI chip that limits BRIDGE DMA"
eerror "\t\040\040addresses to 31-bits when converted into physical addresses."
echo -e ""
ewarn "Things that might work, but have problems, or are unknown:"
ewarn "\t- Serial support on the Octane uses a very basic UART driver that drives"
ewarn "\t\040\040the 16550A chip on the IOC3 directly. It does not use interrupts,"
ewarn "\t\040\040only a polling routine on a timer, which makes it slow and CPU-"
ewarn "\t\040\040intensive. The baud rate is limited to no more than 38.4kbps on"
ewarn "\t\040\040this driver. Patches for getting the Altix IOC3 serial driver to"
ewarn "\t\040\040work (which uses DMA and supports faster baud rates) are welcome."
ewarn "\t- MENET boards appear to have the four ethernet ports detected, however"
ewarn "\t\040\040the six serial ports don't appear to get picked up by the IOC3"
ewarn "\t\040\040UART driver. The NIC part number is also not read correctly"
ewarn "\t\040\040from the four Number-In-a-Cans."
ewarn "\t- Other XIO-based devices, like various Impact addons, remain untested"
ewarn "\t\040\040and are not guaranteed to work."
ewarn "\t- Upon rebooting, Octane may not return to the PROM. Holding down the"
ewarn "\t\040\040reset button for up to ten seconds, releasing, then pressing it"
ewarn "\t\040\040again for one or two seconds may trigger the system to return"
ewarn "\t\040\040to the PROM. Please wait at least five seconds after each attempt"
ewarn "\t\040\040to see if the machine responds. As a last resort, unplugging the"
ewarn "\t\040\040power cord for 30 seconds will also work, but be aware the power"
ewarn "\t\040\040supplies on these systems will not appreciate this due to their"
ewarn "\t\040\040relative old age."
echo -e ""
einfo "Things that DO work:"
einfo "\t- SMP support."
einfo "\t- Impact (MGRAS), console only."
einfo "\t- VPro (Odyssey), console only."
einfo "\t- PCI card cages (showbox) should work for many devices, except certain"
einfo "\t\040\040types such as PCI-to-PCI bridges (USB hubs, USB flash card readers)."
einfo "\t- SCSI, RTC, basic PCI, IOC3 Ethernet, keyboard, and mouse. Please"
einfo "\t\040\040report any problems with these devices."
einfo "\t- SGI AceNIC/Tigon II gigabit cards will work in the PCI card cage/shoebox."
echo -e ""
}
show_ip32_info() {
echo -e ""
einfo "IP32 systems function well, however there are some notes:"
einfo "\t- A sound driver now exists for IP32."
einfo "\t- Framebuffer console is limited to 4MB. Anything greater"
einfo "\t\040\040specified when building the kernel will oops or"
einfo "\t\040\040panic the kernel."
echo -e ""
eerror "IP32 Systems may be unstable and prone to lockups under a 5.4.x LTS kernel."
eerror "The cause is unknown at this time."
echo -e ""
einfo "To Build 64bit kernels for SGI O2 (IP32) or SGI Indy/Indigo2 R4x00 (IP22)"
einfo "systems, you need to use the ${GOOD}vmlinux.32${NORMAL} make target."
einfo "Once done, boot the ${GOOD}vmlinux.32${NORMAL} file (NOT vmlinux)."
}
src_unpack() {
# Unpack the kernel sources, update to the latest rev (if needed),
# and apply the latest patch from linux-mips git.
kernel-2_src_unpack
# Unpack the mips-sources patchset to ${WORKDIR}/mips-patches-${BASE_KV}.
echo -e ""
cd "${WORKDIR}"
unpack "${PN}-${BASE_KV}-patches-v${GENPATCHREV}.tar.xz"
# Create a new folder called 'patch-symlinks' and create symlinks to
# all mips-patches in there. If we want to exclude a patch, we'll
# just delete the symlink instead of the actual patch.
mkdir patch-symlinks
cd patch-symlinks
for x in ../mips-patches-${BASE_KV}/*.patch; do
ln -s "${x}" "${x##../mips-patches-*/}"
done
# With symlinks created, setup the variables referencing external
# machine patches and if a machine USE flag is enabled, then unset
# its corresponding variable.
# See 0000_README for the patch numbers and their meanings.
local p_generic="51*"
local p_ip27="52*" p_ip28="53*" p_ip30="54*"
local p_xp="80*"
use ip27 && unset p_generic p_ip27
use ip28 && unset p_ip28
use ip30 && unset p_generic p_ip30
use experimental && unset p_xp
# Remove symlinks for any patches that we don't want applied. We
# do this by looping through all the above variables, and deleting
# matching symlinks that point to the corresponding patches.
# The remaining symlinks will be applied to the kernel source.
#
# $P_EXCLUDE is a new var that can be set in an ebuild to exclude
# specific patches by wildcarding the patch number.
local patchlist="${p_generic} ${p_ip27} ${p_ip28} ${p_ip30} ${p_xp} ${P_EXCLUDE}"
for x in $patchlist;
do rm -f "./${x}"
done
# Rename the source tree, if needed.
local old="${WORKDIR}/linux-${F_KV%-*/_/-}"
local new="${WORKDIR}/linux-$(fkv_to_machtype)"
if [[ "${old}" != "${new}" ]]; then
mv "${old}" "${new}" || die
fi
S="${new}"
# Set the EXTRAVERSION to linux-VERSION-mipsgit-GITDATE
EXTRAVERSION="${EXTRAVERSION}-gentoo-mips"
unpack_set_extraversion
}
src_prepare() {
# Apply patches to the kernel tree.
eapply "${WORKDIR}/patch-symlinks"/
eapply_user
}
|