[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#732692: loading radeonkms results in unusable screen



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);
 }
 

Reply to: