Fix tegra nouveau module load, PowerPC Little Endian ToC fix
This commit is contained in:
parent
1f3ef36b87
commit
3ce62e18dd
@ -1,103 +0,0 @@
|
||||
From b66e7caab9e6634dadce2aced6e174c095e1ca0e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Tue, 9 Feb 2016 15:00:02 +0000
|
||||
Subject: [PATCH] Revert "powerpc: Simplify module TOC handling"
|
||||
|
||||
This reverts commit c153693d7eb9eeb28478aa2deaaf0b4e7b5ff5e9.
|
||||
---
|
||||
arch/powerpc/kernel/misc_64.S | 28 ++++++++++++++++++++++++++++
|
||||
arch/powerpc/kernel/module_64.c | 12 +++---------
|
||||
scripts/mod/modpost.c | 3 +--
|
||||
3 files changed, 32 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
|
||||
index f28754c..db475d4 100644
|
||||
--- a/arch/powerpc/kernel/misc_64.S
|
||||
+++ b/arch/powerpc/kernel/misc_64.S
|
||||
@@ -701,3 +701,31 @@ _GLOBAL(kexec_sequence)
|
||||
li r5,0
|
||||
blr /* image->start(physid, image->start, 0); */
|
||||
#endif /* CONFIG_KEXEC */
|
||||
+
|
||||
+#ifdef CONFIG_MODULES
|
||||
+#if defined(_CALL_ELF) && _CALL_ELF == 2
|
||||
+
|
||||
+#ifdef CONFIG_MODVERSIONS
|
||||
+.weak __crc_TOC.
|
||||
+.section "___kcrctab+TOC.","a"
|
||||
+.globl __kcrctab_TOC.
|
||||
+__kcrctab_TOC.:
|
||||
+ .llong __crc_TOC.
|
||||
+#endif
|
||||
+
|
||||
+/*
|
||||
+ * Export a fake .TOC. since both modpost and depmod will complain otherwise.
|
||||
+ * Both modpost and depmod strip the leading . so we do the same here.
|
||||
+ */
|
||||
+.section "__ksymtab_strings","a"
|
||||
+__kstrtab_TOC.:
|
||||
+ .asciz "TOC."
|
||||
+
|
||||
+.section "___ksymtab+TOC.","a"
|
||||
+/* This symbol name is important: it's used by modpost to find exported syms */
|
||||
+.globl __ksymtab_TOC.
|
||||
+__ksymtab_TOC.:
|
||||
+ .llong 0 /* .value */
|
||||
+ .llong __kstrtab_TOC.
|
||||
+#endif /* ELFv2 */
|
||||
+#endif /* MODULES */
|
||||
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c
|
||||
index ac64ffd..59663af 100644
|
||||
--- a/arch/powerpc/kernel/module_64.c
|
||||
+++ b/arch/powerpc/kernel/module_64.c
|
||||
@@ -326,10 +326,7 @@ static void dedotify_versions(struct modversion_info *vers,
|
||||
}
|
||||
}
|
||||
|
||||
-/*
|
||||
- * Undefined symbols which refer to .funcname, hack to funcname. Make .TOC.
|
||||
- * seem to be defined (value set later).
|
||||
- */
|
||||
+/* Undefined symbols which refer to .funcname, hack to funcname (or .TOC.) */
|
||||
static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -337,11 +334,8 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
|
||||
for (i = 1; i < numsyms; i++) {
|
||||
if (syms[i].st_shndx == SHN_UNDEF) {
|
||||
char *name = strtab + syms[i].st_name;
|
||||
- if (name[0] == '.') {
|
||||
- if (strcmp(name+1, "TOC.") == 0)
|
||||
- syms[i].st_shndx = SHN_ABS;
|
||||
+ if (name[0] == '.')
|
||||
memmove(name, name+1, strlen(name));
|
||||
- }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -357,7 +351,7 @@ static Elf64_Sym *find_dot_toc(Elf64_Shdr *sechdrs,
|
||||
numsyms = sechdrs[symindex].sh_size / sizeof(Elf64_Sym);
|
||||
|
||||
for (i = 1; i < numsyms; i++) {
|
||||
- if (syms[i].st_shndx == SHN_ABS
|
||||
+ if (syms[i].st_shndx == SHN_UNDEF
|
||||
&& strcmp(strtab + syms[i].st_name, "TOC.") == 0)
|
||||
return &syms[i];
|
||||
}
|
||||
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
|
||||
index 48958d3..e080746 100644
|
||||
--- a/scripts/mod/modpost.c
|
||||
+++ b/scripts/mod/modpost.c
|
||||
@@ -594,8 +594,7 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
|
||||
if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
|
||||
strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
|
||||
strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
|
||||
- strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0 ||
|
||||
- strcmp(symname, ".TOC.") == 0)
|
||||
+ strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
|
||||
return 1;
|
||||
/* Do not ignore this symbol */
|
||||
return 0;
|
||||
--
|
||||
2.5.0
|
||||
|
116
drm-nouveau-platform-Fix-deferred-probe.patch
Normal file
116
drm-nouveau-platform-Fix-deferred-probe.patch
Normal file
@ -0,0 +1,116 @@
|
||||
From patchwork Wed Feb 24 17:34:43 2016
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: drm/nouveau: platform: Fix deferred probe
|
||||
From: Thierry Reding <thierry.reding@gmail.com>
|
||||
X-Patchwork-Id: 587554
|
||||
Message-Id: <1456335283-22097-1-git-send-email-thierry.reding@gmail.com>
|
||||
To: Ben Skeggs <bskeggs@redhat.com>
|
||||
Cc: Alexandre Courbot <gnurou@gmail.com>, Nicolas Chauvet <kwizart@gmail.com>,
|
||||
dri-devel@lists.freedesktop.org, linux-tegra@vger.kernel.org
|
||||
Date: Wed, 24 Feb 2016 18:34:43 +0100
|
||||
|
||||
From: Thierry Reding <treding@nvidia.com>
|
||||
|
||||
The error cleanup paths aren't quite correct and will crash upon
|
||||
deferred probe.
|
||||
|
||||
Cc: stable@vger.kernel.org # v4.3+
|
||||
Signed-off-by: Thierry Reding <treding@nvidia.com>
|
||||
Reviewed-by: Ben Skeggs <bskeggs@redhat.com>
|
||||
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
|
||||
---
|
||||
drivers/gpu/drm/nouveau/nouveau_platform.c | 2 +-
|
||||
drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c | 40 ++++++++++++++++------
|
||||
2 files changed, 30 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_platform.c b/drivers/gpu/drm/nouveau/nouveau_platform.c
|
||||
index 8a70cec59bcd..2dfe58af12e4 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_platform.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_platform.c
|
||||
@@ -24,7 +24,7 @@
|
||||
static int nouveau_platform_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct nvkm_device_tegra_func *func;
|
||||
- struct nvkm_device *device;
|
||||
+ struct nvkm_device *device = NULL;
|
||||
struct drm_device *drm;
|
||||
int ret;
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
|
||||
index 7f8a42721eb2..e7e581d6a8ff 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
|
||||
@@ -252,32 +252,40 @@ nvkm_device_tegra_new(const struct nvkm_device_tegra_func *func,
|
||||
|
||||
if (!(tdev = kzalloc(sizeof(*tdev), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
- *pdevice = &tdev->device;
|
||||
+
|
||||
tdev->func = func;
|
||||
tdev->pdev = pdev;
|
||||
tdev->irq = -1;
|
||||
|
||||
tdev->vdd = devm_regulator_get(&pdev->dev, "vdd");
|
||||
- if (IS_ERR(tdev->vdd))
|
||||
- return PTR_ERR(tdev->vdd);
|
||||
+ if (IS_ERR(tdev->vdd)) {
|
||||
+ ret = PTR_ERR(tdev->vdd);
|
||||
+ goto free;
|
||||
+ }
|
||||
|
||||
tdev->rst = devm_reset_control_get(&pdev->dev, "gpu");
|
||||
- if (IS_ERR(tdev->rst))
|
||||
- return PTR_ERR(tdev->rst);
|
||||
+ if (IS_ERR(tdev->rst)) {
|
||||
+ ret = PTR_ERR(tdev->rst);
|
||||
+ goto free;
|
||||
+ }
|
||||
|
||||
tdev->clk = devm_clk_get(&pdev->dev, "gpu");
|
||||
- if (IS_ERR(tdev->clk))
|
||||
- return PTR_ERR(tdev->clk);
|
||||
+ if (IS_ERR(tdev->clk)) {
|
||||
+ ret = PTR_ERR(tdev->clk);
|
||||
+ goto free;
|
||||
+ }
|
||||
|
||||
tdev->clk_pwr = devm_clk_get(&pdev->dev, "pwr");
|
||||
- if (IS_ERR(tdev->clk_pwr))
|
||||
- return PTR_ERR(tdev->clk_pwr);
|
||||
+ if (IS_ERR(tdev->clk_pwr)) {
|
||||
+ ret = PTR_ERR(tdev->clk_pwr);
|
||||
+ goto free;
|
||||
+ }
|
||||
|
||||
nvkm_device_tegra_probe_iommu(tdev);
|
||||
|
||||
ret = nvkm_device_tegra_power_up(tdev);
|
||||
if (ret)
|
||||
- return ret;
|
||||
+ goto remove;
|
||||
|
||||
tdev->gpu_speedo = tegra_sku_info.gpu_speedo_value;
|
||||
ret = nvkm_device_ctor(&nvkm_device_tegra_func, NULL, &pdev->dev,
|
||||
@@ -285,9 +293,19 @@ nvkm_device_tegra_new(const struct nvkm_device_tegra_func *func,
|
||||
cfg, dbg, detect, mmio, subdev_mask,
|
||||
&tdev->device);
|
||||
if (ret)
|
||||
- return ret;
|
||||
+ goto powerdown;
|
||||
+
|
||||
+ *pdevice = &tdev->device;
|
||||
|
||||
return 0;
|
||||
+
|
||||
+powerdown:
|
||||
+ nvkm_device_tegra_power_down(tdev);
|
||||
+remove:
|
||||
+ nvkm_device_tegra_remove_iommu(tdev);
|
||||
+free:
|
||||
+ kfree(tdev);
|
||||
+ return ret;
|
||||
}
|
||||
#else
|
||||
int
|
11
kernel.spec
11
kernel.spec
@ -40,7 +40,7 @@ Summary: The Linux kernel
|
||||
# For non-released -rc kernels, this will be appended after the rcX and
|
||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||
#
|
||||
%global baserelease 1
|
||||
%global baserelease 2
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
@ -503,8 +503,11 @@ Patch454: arm64-avoid-needing-console-to-enable-serial-console.patch
|
||||
|
||||
Patch456: arm64-acpi-drop-expert-patch.patch
|
||||
|
||||
# http://patchwork.ozlabs.org/patch/587554/
|
||||
Patch457: ARM-tegra-usb-no-reset.patch
|
||||
|
||||
Patch458: drm-nouveau-platform-Fix-deferred-probe.patch
|
||||
|
||||
Patch463: arm-i.MX6-Utilite-device-dtb.patch
|
||||
|
||||
Patch466: input-kill-stupid-messages.patch
|
||||
@ -583,8 +586,6 @@ Patch502: firmware-Drop-WARN-from-usermodehelper_read_trylock-.patch
|
||||
|
||||
Patch508: kexec-uefi-copy-secure_boot-flag-in-boot-params.patch
|
||||
|
||||
# Patch510: 0001-Revert-powerpc-Simplify-module-TOC-handling.patch
|
||||
|
||||
#rhbz 1286293
|
||||
Patch571: ideapad-laptop-Add-Lenovo-ideapad-Y700-17ISK-to-no_h.patch
|
||||
|
||||
@ -2123,6 +2124,10 @@ fi
|
||||
#
|
||||
#
|
||||
%changelog
|
||||
* Thu Feb 25 2016 Peter Robinson <pbrobinson@fedoraproject.org> 4.5.0-0.rc5.git0.2
|
||||
- Fix tegra nouveau module load (thank kwizart for reference)
|
||||
- PowerPC Little Endian ToC fix
|
||||
|
||||
* Sun Feb 21 2016 Justin M. Forbes <jforbes@fedoraproject.org> - 4.5.0-0.rc5.git0.1
|
||||
- Disable debugging options.
|
||||
- Linux v4.5-rc5
|
||||
|
Loading…
Reference in New Issue
Block a user