On 24/12/2013 16:44, Robert Millan wrote: > 2- The radeonkms module still enables the sysctls even if firmware load > failed. > > My proposal was to disable #1 (i.e. remove the module). However if the > module is still useful there are many ways in which #2 can be changed to > adhere to our needs. > > For example, we could disable the sysctls every time firmware load failed,
How about this? What do you think? It's a gross hack, but it should work in preventing regressions. The proper fix (running the actual initialization before sysctl_init) is not so easy, as the codepaths are too separate (and this separation is even exposed to userland). -- Robert Millan
If the firmware is not found, abort advertising modesetting via sysctl. --- a/sys/dev/drm2/radeon/radeon_drv.c +++ b/sys/dev/drm2/radeon/radeon_drv.c @@ -40,6 +40,7 @@ #include "radeon_irq_kms.h" #include <dev/drm2/drm_pciids.h> +#include <sys/firmware.h> #include "fb_if.h" @@ -342,6 +343,101 @@ static int radeon_sysctl_init(struct drm_device *dev, struct sysctl_ctx_list *ctx, struct sysctl_oid *top) { + if (!firmware_get("radeonkmsfw_ARUBA_me")) return 0; + if (!firmware_get("radeonkmsfw_ARUBA_pfp")) return 0; + if (!firmware_get("radeonkmsfw_ARUBA_rlc")) return 0; + if (!firmware_get("radeonkmsfw_BARTS_mc")) return 0; + if (!firmware_get("radeonkmsfw_BARTS_me")) return 0; + if (!firmware_get("radeonkmsfw_BARTS_pfp")) return 0; + if (!firmware_get("radeonkmsfw_BTC_rlc")) return 0; + if (!firmware_get("radeonkmsfw_CAICOS_mc")) return 0; + if (!firmware_get("radeonkmsfw_CAICOS_me")) return 0; + if (!firmware_get("radeonkmsfw_CAICOS_pfp")) return 0; + if (!firmware_get("radeonkmsfw_CAYMAN_mc")) return 0; + if (!firmware_get("radeonkmsfw_CAYMAN_me")) return 0; + if (!firmware_get("radeonkmsfw_CAYMAN_pfp")) return 0; + if (!firmware_get("radeonkmsfw_CAYMAN_rlc")) return 0; + if (!firmware_get("radeonkmsfw_CEDAR_me")) return 0; + if (!firmware_get("radeonkmsfw_CEDAR_pfp")) return 0; + if (!firmware_get("radeonkmsfw_CEDAR_rlc")) return 0; + if (!firmware_get("radeonkmsfw_CYPRESS_me")) return 0; + if (!firmware_get("radeonkmsfw_CYPRESS_pfp")) return 0; + if (!firmware_get("radeonkmsfw_CYPRESS_rlc")) return 0; + if (!firmware_get("radeonkmsfw_CYPRESS_uvd")) return 0; + if (!firmware_get("radeonkmsfw_HAINAN_ce")) return 0; + if (!firmware_get("radeonkmsfw_HAINAN_mc")) return 0; + if (!firmware_get("radeonkmsfw_HAINAN_me")) return 0; + if (!firmware_get("radeonkmsfw_HAINAN_pfp")) return 0; + if (!firmware_get("radeonkmsfw_HAINAN_rlc")) return 0; + if (!firmware_get("radeonkmsfw_JUNIPER_me")) return 0; + if (!firmware_get("radeonkmsfw_JUNIPER_pfp")) return 0; + if (!firmware_get("radeonkmsfw_JUNIPER_rlc")) return 0; + if (!firmware_get("radeonkmsfw_OLAND_ce")) return 0; + if (!firmware_get("radeonkmsfw_OLAND_mc")) return 0; + if (!firmware_get("radeonkmsfw_OLAND_me")) return 0; + if (!firmware_get("radeonkmsfw_OLAND_pfp")) return 0; + if (!firmware_get("radeonkmsfw_OLAND_rlc")) return 0; + if (!firmware_get("radeonkmsfw_PALM_me")) return 0; + if (!firmware_get("radeonkmsfw_PALM_pfp")) return 0; + if (!firmware_get("radeonkmsfw_PITCAIRN_ce")) return 0; + if (!firmware_get("radeonkmsfw_PITCAIRN_mc")) return 0; + if (!firmware_get("radeonkmsfw_PITCAIRN_me")) return 0; + if (!firmware_get("radeonkmsfw_PITCAIRN_pfp")) return 0; + if (!firmware_get("radeonkmsfw_PITCAIRN_rlc")) return 0; + if (!firmware_get("radeonkmsfw_R100_cp")) return 0; + if (!firmware_get("radeonkmsfw_R200_cp")) return 0; + if (!firmware_get("radeonkmsfw_R300_cp")) return 0; + if (!firmware_get("radeonkmsfw_R420_cp")) return 0; + if (!firmware_get("radeonkmsfw_R520_cp")) return 0; + if (!firmware_get("radeonkmsfw_R600_me")) return 0; + if (!firmware_get("radeonkmsfw_R600_pfp")) return 0; + if (!firmware_get("radeonkmsfw_R600_rlc")) return 0; + if (!firmware_get("radeonkmsfw_R700_rlc")) return 0; + if (!firmware_get("radeonkmsfw_REDWOOD_me")) return 0; + if (!firmware_get("radeonkmsfw_REDWOOD_pfp")) return 0; + if (!firmware_get("radeonkmsfw_REDWOOD_rlc")) return 0; + if (!firmware_get("radeonkmsfw_RS600_cp")) return 0; + if (!firmware_get("radeonkmsfw_RS690_cp")) return 0; + if (!firmware_get("radeonkmsfw_RS780_me")) return 0; + if (!firmware_get("radeonkmsfw_RS780_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV610_me")) return 0; + if (!firmware_get("radeonkmsfw_RV610_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV620_me")) return 0; + if (!firmware_get("radeonkmsfw_RV620_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV630_me")) return 0; + if (!firmware_get("radeonkmsfw_RV630_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV635_me")) return 0; + if (!firmware_get("radeonkmsfw_RV635_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV670_me")) return 0; + if (!firmware_get("radeonkmsfw_RV670_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV710_me")) return 0; + if (!firmware_get("radeonkmsfw_RV710_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV710_uvd")) return 0; + if (!firmware_get("radeonkmsfw_RV730_me")) return 0; + if (!firmware_get("radeonkmsfw_RV730_pfp")) return 0; + if (!firmware_get("radeonkmsfw_RV770_me")) return 0; + if (!firmware_get("radeonkmsfw_RV770_pfp")) return 0; + if (!firmware_get("radeonkmsfw_SUMO2_me")) return 0; + if (!firmware_get("radeonkmsfw_SUMO2_pfp")) return 0; + if (!firmware_get("radeonkmsfw_SUMO_me")) return 0; + if (!firmware_get("radeonkmsfw_SUMO_pfp")) return 0; + if (!firmware_get("radeonkmsfw_SUMO_rlc")) return 0; + if (!firmware_get("radeonkmsfw_SUMO_uvd")) return 0; + if (!firmware_get("radeonkmsfw_TAHITI_ce")) return 0; + if (!firmware_get("radeonkmsfw_TAHITI_mc")) return 0; + if (!firmware_get("radeonkmsfw_TAHITI_me")) return 0; + if (!firmware_get("radeonkmsfw_TAHITI_pfp")) return 0; + if (!firmware_get("radeonkmsfw_TAHITI_rlc")) return 0; + if (!firmware_get("radeonkmsfw_TAHITI_uvd")) return 0; + if (!firmware_get("radeonkmsfw_TURKS_mc")) return 0; + if (!firmware_get("radeonkmsfw_TURKS_me")) return 0; + if (!firmware_get("radeonkmsfw_TURKS_pfp")) return 0; + if (!firmware_get("radeonkmsfw_VERDE_ce")) return 0; + if (!firmware_get("radeonkmsfw_VERDE_mc")) return 0; + if (!firmware_get("radeonkmsfw_VERDE_me")) return 0; + if (!firmware_get("radeonkmsfw_VERDE_pfp")) return 0; + if (!firmware_get("radeonkmsfw_VERDE_rlc")) return 0; + return drm_add_busid_modesetting(dev, ctx, top); }