Group: Hardware/Components/GPUs/radeon

From LibrePlanet
< Group:Hardware‎ | Components‎ | GPUs
Revision as of 10:09, 20 October 2019 by GNUtoo (talk | contribs) (How to help)
Jump to: navigation, search

Introduction

The Radeon GPUs have many freedom issues that are referenced on the table below.

Nonfree software Effects without the nonfree software or workarounds Workaround Workaround consequences Fix Existing projects that could be leveraged to fix the problem
Radeon firmwares/microcodes

The Radeon driver doesn't load and Linux falls back on another driver like VESA or efifb:

  • Native resolutions might be missing
  • No multi-display
Patch the radeon driver in linux-libre to enable it to load and work without the nonfree firwares

The radeon driver loads:

  • Native resolutions become available
  • Multi display is available
  • 3D acceleration is still missing
Write free replacement for the firmwares
  • The nouveau project generates free firwmare in the Linux driver. While it's not meant to support non-nvidia GPUs, it could be a good idea to use a similar software architecture.
AtomBIOS bytecode: This bytecode is part of the Video BIOS and is parsed and executed by the Linux driver
  • The radeon driver doesn't load
  • The boot software (BIOS, UEFI) may not be able to initialize the display. Untested.
? Replace the nonfree bytecode by a free one.
  • The RadeonHD driver did that, however it wasn't chosen as the main Radeon driver because it didn't match ATI's Interest.
  • Other? TODO: Look if the video BIOS replacements also deal with the AtomBIOS bytecode.
The Video BIOS Use Libreboot or Coreboot with SeaBIOS, put the Video BIOS in memory but don't execute it The display is initialized very late, when the Radeon driver loads, if the AtomBIOS tables are in the right memory area. Implement a free Video BIOS replacement either as standalone replacement or in Coreboot and Libreboot.
  • There is a free Video BIOS replacement in Coreboot for many Intel GPUs. While its meant to support Intel GPUs, it may be a good idea to leverage some of the code and architecture. It may also be a good idea to instead implement it as a standalone Video BIOS replacement, as standalone Radeon GPUs do exist, whereas standalone Intel GPU don't at the time of writing.
  • TODO: List Vide BIOS Replacement projects and their freedom issues (check if the compiler is free)

How to help

  • Help completing the table in the linux-libre status section by helping to add information on the files/GPUs below:
    • ni_dpm.c
    • si.c
    • si_dpm.c
    • cik.c
    • radeon_uvd.c
    • radeon_vce.c
    • btc_dpm.c
    • ci_dpm.c
    • cik.c
    • cik_sdma.c
  • Help completing the table in the introduction section
  • Add support for a GPU you can test on by following this HOWTO
  • Migrate the information in ReverseEngineering#Desktops_and_laptops_GPUs here and make theses section point to this article for Radeon GPUs

Status in linux-libre

The radeon driver has code like that for many GPU families:

if (!rdev->me_fw) {
        r = r100_cp_init_microcode(rdev);
        if (r) {
                DRM_ERROR("Failed to load firmware!\n");
                return r;
        }
}

The result of that is that without the nonfree firmware, the radeon driver doesn't load.

Being able to use that driver, even if the 3D acceleration doesn't work without the nonfree firmware is very interesting:

  • it can enable native resolution
  • It supports multi-displays
family file commit introducing the driver .remove() code linux-libre status
r100 r100.c
70967ab9c0c9 radeon: Use request_firmware()
if (!rdev->me_fw) {
        r = r100_cp_init_microcode(rdev);
        if (r) {
                DRM_ERROR("Failed to load firmware!\n");
                return r;
        }
}
Patch not enabled
r600 (KMS) r600.c Always there:
3ce0a23d2d25 drm/radeon/kms: add r600 KMS support
if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
        r = r600_init_microcode(rdev);
        if (r) {
                DRM_ERROR("Failed to load firmware!\n");
                return r;
        }
}
Working:
clean_sed '
/r = r600_init_microcode(rdev);/,/}/ s,return r;,/*(DEBLOBBED)*/,
' drivers/gpu/drm/radeon/r600.c 'enable blobless activation'
r600 (UMS) r600_cp.c
70967ab9c0c9 radeon: Use request_firmware()
UMS support has been removed in:
8333f607a631 drm/radeon: remove UMS support
Evergreen evergreen.c Working:
clean_sed '
/r = r600_init_microcode(rdev);/,/}/ s,return r;,/*(DEBLOBBED)*/,
' drivers/gpu/drm/radeon/evergreen.c 'enable blobless activation'
rv770 rv770.c Working:
clean_sed '
/r = r600_init_microcode(rdev);/,/}/ s,return r;,/*(DEBLOBBED)*/,
' drivers/gpu/drm/radeon/rv770.c 'enable blobless activation'
Northern Islands ni.c Maybe this commit or before (not clear):
0af62b016804 drm/radeon/kms: add ucode loader for NI
if (rdev->flags & RADEON_IS_IGP) {
        if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
                r = ni_init_microcode(rdev);
                if (r) {
                        DRM_ERROR("Failed to load firmware!\n");
                        return r;
                }
        }
} else {
        if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
                r = ni_init_microcode(rdev);
                if (r) {
                        DRM_ERROR("Failed to load firmware!\n");
                        return r;
                }
        }
}
Patch sent to linux-libre, doesn't appear yet in mailman archives

Status in the Xorg radeon driver

family distribution and version information configuration files status
Northern Islands Parabola, TODO TODO TODO

External links