Skip to content

Commit ed038f5

Browse files
Merge pull request #3369 from SUSE/amd-gpu
Add AMD driver image (jsc#PED-14049)
2 parents d7655ae + 426ab24 commit ed038f5

2 files changed

Lines changed: 255 additions & 0 deletions

File tree

src/bci_build/package/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,7 @@ def generate_disk_size_constraints(size_gb: int) -> str:
14781478
"""
14791479

14801480

1481+
from .amd import AMD_CONTAINERS # noqa: E402
14811482
from .apache_tomcat import TOMCAT_CONTAINERS # noqa: E402
14821483
from .appcontainers import ALERTMANAGER_CONTAINERS # noqa: E402
14831484
from .appcontainers import BLACKBOX_EXPORTER_CONTAINERS # noqa: E402
@@ -1551,6 +1552,7 @@ def generate_disk_size_constraints(size_gb: int) -> str:
15511552
*BCI_CI_CONTAINERS,
15521553
*THREE_EIGHT_NINE_DS_CONTAINERS,
15531554
*NGINX_CONTAINERS,
1555+
*AMD_CONTAINERS,
15541556
*DOTNET_CONTAINERS,
15551557
*PCP_CONTAINERS,
15561558
*REGISTRY_CONTAINERS,

src/bci_build/package/amd.py

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
from jinja2 import Template
2+
3+
from bci_build.container_attributes import Arch
4+
from bci_build.container_attributes import PackageType
5+
from bci_build.container_attributes import ReleaseStage
6+
from bci_build.container_attributes import SupportLevel
7+
from bci_build.containercrate import ContainerCrate
8+
from bci_build.os_version import OsVersion
9+
from bci_build.package import DOCKERFILE_RUN
10+
from bci_build.package import _RELEASE_PLACEHOLDER
11+
from bci_build.package import DevelopmentContainer
12+
from bci_build.package import Package
13+
from bci_build.package import generate_disk_size_constraints
14+
from bci_build.package.helpers import generate_from_image_tag
15+
from bci_build.package.thirdparty import ThirdPartyRepo
16+
from bci_build.package.thirdparty import ThirdPartyRepoMixin
17+
from bci_build.repomdparser import RpmPackage
18+
19+
AMD_REPOS = [
20+
ThirdPartyRepo(
21+
name="radeon-sles15sp7-x86_64",
22+
arch=Arch.X86_64,
23+
url="https://repo.radeon.com/amdgpu/7.0.3/sle/15.7/main/x86_64/",
24+
key_url="https://repo.radeon.com/rocm/rocm.gpg.key",
25+
),
26+
]
27+
28+
29+
CUSTOM_END_TEMPLATE = Template(
30+
"""
31+
# decompress modules for getKmodsToSign (kmmmodule.go) since it expects uncompressed files
32+
{{ DOCKERFILE_RUN }} \\
33+
find /lib/modules/{{ kernel_ga }} -name "*.ko.zst" -exec zstd -d --rm {} \\;; \\
34+
depmod {{ kernel_ga }}
35+
36+
# copy modules to /opt since getKmodsToSign (kmmmodule.go) expects it there
37+
{{ DOCKERFILE_RUN }} \\
38+
mkdir -p /target/opt/lib/modules/{{ kernel_ga }}/updates/dkms; \\
39+
cp /lib/modules/{{ kernel_ga }}/updates/amd* /target/opt/lib/modules/{{ kernel_ga }}/updates/dkms; \\
40+
cp /lib/modules/{{ kernel_ga }}/modules.* /target/opt/lib/modules/{{ kernel_ga }}/; \\
41+
cp -r /lib/modules/{{ kernel_ga }}/kernel /target/opt/lib/modules/{{ kernel_ga }}/kernel; \\
42+
depmod -b /target/opt {{ kernel_ga }}
43+
44+
# copy firmware to /firmwareDir
45+
{{ DOCKERFILE_RUN }} \\
46+
mkdir -p /target/firmwareDir/updates/amdgpu; \\
47+
cp -r /lib/firmware/updates/amdgpu /target/firmwareDir/updates/amdgpu
48+
"""
49+
)
50+
51+
52+
class AMDDriverBCI(ThirdPartyRepoMixin, DevelopmentContainer):
53+
def __init__(self, **kwargs):
54+
super().__init__(**kwargs)
55+
56+
self.extra_files.update(
57+
{
58+
"_constraints": generate_disk_size_constraints(4),
59+
}
60+
)
61+
62+
@property
63+
def labelprefix(self) -> str:
64+
labelprefix = "com.suse"
65+
if self.os_version.is_tumbleweed:
66+
labelprefix = "org.opensuse"
67+
return f"{labelprefix}.third-party.{(self.custom_labelprefix_end or self.name)}"
68+
69+
@property
70+
def release_stage(self) -> ReleaseStage:
71+
# TODO: Remove once the image is completed with all driver versions
72+
return ReleaseStage.BETA
73+
74+
@property
75+
def registry_prefix(self):
76+
return "third-party"
77+
78+
@property
79+
def build_tags(self) -> list[str]:
80+
# addition tags should match sles-15.7-6.4.0-150700.51-default-7.0.3
81+
return [
82+
f"{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}-{_RELEASE_PLACEHOLDER}",
83+
f"{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}",
84+
] + [
85+
f"{self.registry_prefix}/amd/amdgpu-driver:sles-{self.os_version.os_version}-{v}-default-{self.tag_version}"
86+
for v in self.additional_versions
87+
]
88+
89+
@property
90+
def image_ref_name(self) -> str:
91+
return f"sles-%OS_VERSION_ID_SP%-{self.tag_version}"
92+
93+
@property
94+
def build_name(self) -> str:
95+
return f"{self.name}-{self.tag_version}"
96+
97+
@property
98+
def build_version(self) -> str:
99+
return f"{self.os_version.os_version}.{self.version}"
100+
101+
@property
102+
def reference(self) -> str:
103+
return f"{self.registry}/{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}-{_RELEASE_PLACEHOLDER}"
104+
105+
@property
106+
def pretty_reference(self) -> str:
107+
return f"{self.registry}/{self.registry_prefix}/amd/amdgpu-driver:{self.image_ref_name}"
108+
109+
def fetch_rpm_packages(self) -> list[RpmPackage]:
110+
"""Fetches all the required packages from the repository.
111+
112+
Returns:
113+
list of :py:class:`RpmPackage` representing the downloaded rpms
114+
"""
115+
if self._rpms:
116+
return self._rpms
117+
118+
super().fetch_rpm_packages()
119+
120+
project = "SUSE:SLE-15-SP7:GA"
121+
repo = "pool"
122+
version = "6.4.0"
123+
release = "150700.51.1"
124+
arches = self.exclusive_arch
125+
subpackages = [
126+
{
127+
"name": "kernel-default",
128+
"package": "kernel-default",
129+
},
130+
{
131+
"name": "kernel-default-devel",
132+
"package": "kernel-default",
133+
},
134+
{
135+
"name": "kernel-syms",
136+
"package": "kernel-syms",
137+
},
138+
{
139+
"name": "kernel-devel",
140+
"package": "kernel-source",
141+
"no_arch": True,
142+
},
143+
{
144+
"name": "kernel-macros",
145+
"package": "kernel-source",
146+
"no_arch": True,
147+
},
148+
]
149+
150+
for subpkg in subpackages:
151+
name = subpkg["name"]
152+
package = subpkg["package"]
153+
no_arch = subpkg.get("no_arch", False)
154+
155+
for arch in arches:
156+
filename_in_image = f"{name}-{version}-{release}.{arch}.rpm"
157+
158+
if no_arch:
159+
filename_in_repo = f"{name}-{version}-{release}.noarch.rpm"
160+
else:
161+
filename_in_repo = f"{name}-{version}-{release}.{arch}.rpm"
162+
163+
self._rpms.append(
164+
RpmPackage(
165+
name=name,
166+
arch=str(arch),
167+
evr=("", version, release),
168+
filename=filename_in_image,
169+
url=f"https://api.opensuse.org/public/build/{project}/{repo}/{arch}/{package}/{filename_in_repo}",
170+
)
171+
)
172+
173+
return self._rpms
174+
175+
def prepare_template(self) -> None:
176+
super().prepare_template()
177+
178+
self.build_stage_custom_end += "\n" + CUSTOM_END_TEMPLATE.render(
179+
image=self,
180+
DOCKERFILE_RUN=DOCKERFILE_RUN,
181+
kernel_ga="6.4.0-150700.51-default",
182+
)
183+
184+
185+
_AMD_DRIVER_VERSIONS: list[str] = ["7.0.3"]
186+
187+
AMD_CONTAINERS: list[AMDDriverBCI] = []
188+
189+
for os_version in (OsVersion.SP7,):
190+
for ver in _AMD_DRIVER_VERSIONS:
191+
AMD_CONTAINERS.append(
192+
AMDDriverBCI(
193+
os_version=os_version,
194+
version=ver,
195+
tag_version=ver,
196+
additional_versions=["6.4.0-150700.51"],
197+
version_in_uid=True,
198+
use_build_flavor_in_tag=False,
199+
name="amd-driver",
200+
pretty_name="AMD GPU Driver",
201+
license="GPL-2.0 WITH Linux-syscall-note",
202+
is_latest=False,
203+
from_image=generate_from_image_tag(os_version, "bci-base"),
204+
from_target_image=generate_from_image_tag(os_version, "bci-micro"),
205+
support_level=SupportLevel.TECHPREVIEW,
206+
supported_until="",
207+
exclusive_arch=[Arch.X86_64],
208+
package_list=[
209+
(
210+
Package("rpm-ndb", PackageType.IMAGE)
211+
if os_version.is_sle15
212+
else Package("rpm", PackageType.IMAGE)
213+
),
214+
# needed by kernel GA packages
215+
# since kernel GA packages are using RemoteAssetUrl a few dependencies
216+
# are not solved by zypper automatically
217+
Package("awk", PackageType.BOOTSTRAP),
218+
Package("dwarves", PackageType.BOOTSTRAP),
219+
Package("elfutils", PackageType.BOOTSTRAP),
220+
Package("gcc", PackageType.BOOTSTRAP),
221+
Package("libelf-devel", PackageType.BOOTSTRAP),
222+
Package("pesign-obs-integration", PackageType.BOOTSTRAP),
223+
Package("zstd", PackageType.BOOTSTRAP),
224+
# build requirements for amdgpu-dkms
225+
Package("autoconf", PackageType.BOOTSTRAP),
226+
Package("automake", PackageType.BOOTSTRAP),
227+
Package("bc", PackageType.BOOTSTRAP),
228+
Package("bison", PackageType.BOOTSTRAP),
229+
Package("dracut", PackageType.BOOTSTRAP),
230+
Package("flex", PackageType.BOOTSTRAP),
231+
Package("gawk", PackageType.BOOTSTRAP),
232+
Package("libzstd-devel", PackageType.BOOTSTRAP),
233+
Package("make", PackageType.BOOTSTRAP),
234+
Package("mokutil", PackageType.BOOTSTRAP),
235+
Package("perl", PackageType.BOOTSTRAP),
236+
Package("perl-Bootloader", PackageType.BOOTSTRAP),
237+
Package("python3", PackageType.BOOTSTRAP),
238+
Package("python3-setuptools", PackageType.BOOTSTRAP),
239+
Package("python3-wheel", PackageType.BOOTSTRAP),
240+
# runtime requirement to load amdgpu-dkms
241+
Package("kmod", PackageType.IMAGE),
242+
*os_version.release_package_names,
243+
],
244+
third_party_repos=AMD_REPOS,
245+
third_party_package_list=[
246+
"amdgpu-dkms",
247+
"amdgpu-dkms-firmware",
248+
"dkms",
249+
],
250+
)
251+
)
252+
253+
AMD_CRATE = ContainerCrate(AMD_CONTAINERS)

0 commit comments

Comments
 (0)