Hi, I'd like to find a way to integrate some way to patch the radeon driver in the deblob scripts. This way most 100% free distributions could integrate it easily after.
The Issue:
----------
With recent kernels, the radeon driver doesn't load anymore, with most
cards (it can still work without patches on really really old cards).
That started to be very visible when people switched from Trisquel 6 to
Trisquel 7:
In Trisquel 6 such cards worked well but without 3D acceleration, while
in Trisquel 7 the radeon driver stopped working.
In that case drivers like VESA or similar still provided a way to use
the display. But with VESA, some laptops become unusable: some netbooks
have a native resolution of 1024x600, which the radeon driver handles.
Sometimes the native display resolution is not available with VESA.
The VGA option ROM(also known as video BIOS) is what provides VESA:
On desktop mainboards, the BIOS has no way of knowing how to enable
graphics with an external GPU (Like the ones you buy separately and plug
into the pcie16x slot), so the external GPU has a "driver" for it in a
flash chip, then the BIOS loads and run this code so the display is
enabled.
So the best way to handle the issue is to make the radeon driver work
again.
Test with a very old card:
--------------------------
With such card, it was possible to use the radeon driver on Trisquel 7
default kernel by making the radeon driver load with the "dpm=0"
parameter:
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc.
[AMD/ATI] RV350/M10 [Mobility Radeon 9600 PRO Turbo]
Test with a more recent card (R600):
------------------------------------
With this card, dpm=0 was necessary but not sufficient, I had to patch
the kernel. I've attached the (quick and dirty) patch to make it load.
It applies on a Linux 4.1 tree("b953c0d Linux 4.1").
00:01.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc.
[AMD/ATI] Wrestler [Radeon HD 6290] [1002:9807]
Integration:
------------
So if integrating a way to do that automatically in linux-libre is
desirable, how would I have to do it:
-> Trough sed/awk scripts that would break easily between releases ?
-> Trough semantic patching with coccinelle/spatch ?
Denis.
From 38f1756ea29a4eaf9d8fe84258c485b6081e87d9 Mon Sep 17 00:00:00 2001 From: Denis 'GNUtoo' Carikli <[email protected]> Date: Sun, 5 Jul 2015 23:25:04 +0200 Subject: [PATCH] drm/radeon: Make the driver load without the firmwares. Signed-off-by: Denis 'GNUtoo' Carikli <[email protected]> --- drivers/gpu/drm/radeon/r600.c | 55 +++------------------------------------- drivers/gpu/drm/radeon/r600_cp.c | 28 +++----------------- 2 files changed, 8 insertions(+), 75 deletions(-) diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 8f6d862..ee79424 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -41,56 +41,6 @@ #include "radeon_ucode.h" /* Firmware Names */ -MODULE_FIRMWARE("radeon/R600_pfp.bin"); -MODULE_FIRMWARE("radeon/R600_me.bin"); -MODULE_FIRMWARE("radeon/RV610_pfp.bin"); -MODULE_FIRMWARE("radeon/RV610_me.bin"); -MODULE_FIRMWARE("radeon/RV630_pfp.bin"); -MODULE_FIRMWARE("radeon/RV630_me.bin"); -MODULE_FIRMWARE("radeon/RV620_pfp.bin"); -MODULE_FIRMWARE("radeon/RV620_me.bin"); -MODULE_FIRMWARE("radeon/RV635_pfp.bin"); -MODULE_FIRMWARE("radeon/RV635_me.bin"); -MODULE_FIRMWARE("radeon/RV670_pfp.bin"); -MODULE_FIRMWARE("radeon/RV670_me.bin"); -MODULE_FIRMWARE("radeon/RS780_pfp.bin"); -MODULE_FIRMWARE("radeon/RS780_me.bin"); -MODULE_FIRMWARE("radeon/RV770_pfp.bin"); -MODULE_FIRMWARE("radeon/RV770_me.bin"); -MODULE_FIRMWARE("radeon/RV770_smc.bin"); -MODULE_FIRMWARE("radeon/RV730_pfp.bin"); -MODULE_FIRMWARE("radeon/RV730_me.bin"); -MODULE_FIRMWARE("radeon/RV730_smc.bin"); -MODULE_FIRMWARE("radeon/RV740_smc.bin"); -MODULE_FIRMWARE("radeon/RV710_pfp.bin"); -MODULE_FIRMWARE("radeon/RV710_me.bin"); -MODULE_FIRMWARE("radeon/RV710_smc.bin"); -MODULE_FIRMWARE("radeon/R600_rlc.bin"); -MODULE_FIRMWARE("radeon/R700_rlc.bin"); -MODULE_FIRMWARE("radeon/CEDAR_pfp.bin"); -MODULE_FIRMWARE("radeon/CEDAR_me.bin"); -MODULE_FIRMWARE("radeon/CEDAR_rlc.bin"); -MODULE_FIRMWARE("radeon/CEDAR_smc.bin"); -MODULE_FIRMWARE("radeon/REDWOOD_pfp.bin"); -MODULE_FIRMWARE("radeon/REDWOOD_me.bin"); -MODULE_FIRMWARE("radeon/REDWOOD_rlc.bin"); -MODULE_FIRMWARE("radeon/REDWOOD_smc.bin"); -MODULE_FIRMWARE("radeon/JUNIPER_pfp.bin"); -MODULE_FIRMWARE("radeon/JUNIPER_me.bin"); -MODULE_FIRMWARE("radeon/JUNIPER_rlc.bin"); -MODULE_FIRMWARE("radeon/JUNIPER_smc.bin"); -MODULE_FIRMWARE("radeon/CYPRESS_pfp.bin"); -MODULE_FIRMWARE("radeon/CYPRESS_me.bin"); -MODULE_FIRMWARE("radeon/CYPRESS_rlc.bin"); -MODULE_FIRMWARE("radeon/CYPRESS_smc.bin"); -MODULE_FIRMWARE("radeon/PALM_pfp.bin"); -MODULE_FIRMWARE("radeon/PALM_me.bin"); -MODULE_FIRMWARE("radeon/SUMO_rlc.bin"); -MODULE_FIRMWARE("radeon/SUMO_pfp.bin"); -MODULE_FIRMWARE("radeon/SUMO_me.bin"); -MODULE_FIRMWARE("radeon/SUMO2_pfp.bin"); -MODULE_FIRMWARE("radeon/SUMO2_me.bin"); - static const u32 crtc_offsets[2] = { 0, @@ -2490,7 +2440,7 @@ int r600_init_microcode(struct radeon_device *rdev) } DRM_INFO("Loading %s Microcode\n", chip_name); - +#if 0 snprintf(fw_name, sizeof(fw_name), "radeon/%s_pfp.bin", chip_name); err = request_firmware(&rdev->pfp_fw, fw_name, rdev->dev); if (err) @@ -2542,6 +2492,7 @@ int r600_init_microcode(struct radeon_device *rdev) err = -EINVAL; } } +#endif out: if (err) { @@ -3203,6 +3154,7 @@ int r600_init(struct radeon_device *rdev) if (r) return r; +#if 0 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { r = r600_init_microcode(rdev); if (r) { @@ -3210,6 +3162,7 @@ int r600_init(struct radeon_device *rdev) return r; } } +#endif /* Initialize power management */ radeon_pm_init(rdev); diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c index 09e3f39..9919470 100644 --- a/drivers/gpu/drm/radeon/r600_cp.c +++ b/drivers/gpu/drm/radeon/r600_cp.c @@ -39,29 +39,6 @@ #define R700_PFP_UCODE_SIZE 848 #define R700_PM4_UCODE_SIZE 1360 -/* Firmware Names */ -MODULE_FIRMWARE("radeon/R600_pfp.bin"); -MODULE_FIRMWARE("radeon/R600_me.bin"); -MODULE_FIRMWARE("radeon/RV610_pfp.bin"); -MODULE_FIRMWARE("radeon/RV610_me.bin"); -MODULE_FIRMWARE("radeon/RV630_pfp.bin"); -MODULE_FIRMWARE("radeon/RV630_me.bin"); -MODULE_FIRMWARE("radeon/RV620_pfp.bin"); -MODULE_FIRMWARE("radeon/RV620_me.bin"); -MODULE_FIRMWARE("radeon/RV635_pfp.bin"); -MODULE_FIRMWARE("radeon/RV635_me.bin"); -MODULE_FIRMWARE("radeon/RV670_pfp.bin"); -MODULE_FIRMWARE("radeon/RV670_me.bin"); -MODULE_FIRMWARE("radeon/RS780_pfp.bin"); -MODULE_FIRMWARE("radeon/RS780_me.bin"); -MODULE_FIRMWARE("radeon/RV770_pfp.bin"); -MODULE_FIRMWARE("radeon/RV770_me.bin"); -MODULE_FIRMWARE("radeon/RV730_pfp.bin"); -MODULE_FIRMWARE("radeon/RV730_me.bin"); -MODULE_FIRMWARE("radeon/RV710_pfp.bin"); -MODULE_FIRMWARE("radeon/RV710_me.bin"); - - int r600_cs_legacy(struct drm_device *dev, void *data, struct drm_file *filp, unsigned family, u32 *ib, int *l); void r600_cs_legacy_init(void); @@ -2260,7 +2237,7 @@ int r600_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init, else r600_vm_init(dev); } - +#if 0 if (!dev_priv->me_fw || !dev_priv->pfp_fw) { int err = r600_cp_init_microcode(dev_priv); if (err) { @@ -2269,6 +2246,9 @@ int r600_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init, return err; } } +#endif + printk("Skipping firmware loading\n"); +#endif if (((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)) r700_cp_load_microcode(dev_priv); else -- 2.4.5
pgpWxxYSnrKCX.pgp
Description: OpenPGP digital signature
_______________________________________________ linux-libre mailing list [email protected] http://www.fsfla.org/cgi-bin/mailman/listinfo/linux-libre
