[PATCH] drm/radeon Make CIK support optional

Mike Lothian mike at fireburn.co.uk
Mon Feb 8 02:45:24 UTC 2016


This will allow us to disable CIK support in the radeon driver, so both 
radeon and amdgpu can be around at the same time without conflicting

Signed-of-by: Mike Lothian <mike at fireburn.co.uk>
---

I've tested this on my Kabini system radeon doesn't initalise when compiled in but
I do get these messages in my dmesg:

[drm] radeon kernel modesetting enabled.
[drm] initializing kernel modesetting (KABINI 0x1002:0x9832 0x1025:0x0800).
radeon 0000:00:01.0: Fatal error during GPU init
radeon: probe of 0000:00:01.0 failed with error -22

Am I going down the right route with this?

 drivers/gpu/drm/amd/amdgpu/Kconfig         |  1 +
 drivers/gpu/drm/radeon/Kconfig             | 11 +++++++++++
 drivers/gpu/drm/radeon/Makefile            | 11 +++++++----
 drivers/gpu/drm/radeon/atombios_encoders.c |  5 +++++
 drivers/gpu/drm/radeon/evergreen.c         | 24 ++++++++++++++++++++++++
 drivers/gpu/drm/radeon/radeon_asic.c       | 13 +++++++++++++
 6 files changed, 61 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index b30fcfa..bb58f17 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -1,6 +1,7 @@
 config DRM_AMDGPU_CIK
 	bool "Enable amdgpu support for CIK parts"
 	depends on DRM_AMDGPU
+	depends on !DRM_RADEON_CIK
 	help
 	  Choose this option if you want to enable experimental support
 	  for CIK asics.
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig
index 9909f5c..32bc77e 100644
--- a/drivers/gpu/drm/radeon/Kconfig
+++ b/drivers/gpu/drm/radeon/Kconfig
@@ -1,3 +1,14 @@
+config DRM_RADEON_CIK
+	bool "Enable radeon support for CIK parts"
+	depends on DRM_RADEON
+	default y
+	help
+	  Choose this option if you want to enable support for CIK
+	  asics.
+
+	  Consider disabling this option if you wish to enable CIK
+	  in the amdgpu driver.
+
 config DRM_RADEON_USERPTR
 	bool "Always enable userptr support"
 	depends on DRM_RADEON
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
index 08bd17d..6c43901 100644
--- a/drivers/gpu/drm/radeon/Makefile
+++ b/drivers/gpu/drm/radeon/Makefile
@@ -72,13 +72,15 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
 	evergreen.o evergreen_cs.o evergreen_blit_shaders.o \
 	evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \
 	atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \
-	si_blit_shaders.o radeon_prime.o cik.o cik_blit_shaders.o \
+	si_blit_shaders.o radeon_prime.o \
 	r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
 	rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
-	trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
-	ci_dpm.o dce6_afmt.o radeon_vm.o radeon_ucode.o radeon_ib.o \
+	trinity_smc.o ni_dpm.o si_smc.o si_dpm.o \
+	dce6_afmt.o radeon_vm.o radeon_ucode.o radeon_ib.o \
 	radeon_sync.o radeon_audio.o radeon_dp_auxch.o radeon_dp_mst.o
 
+radeon-$(CONFIG_DRM_RADEON_CIK) += cik.o cik_blit_shaders.o kv_smc.o kv_dpm.o ci_smc.o ci_dpm.o
+
 radeon-$(CONFIG_MMU_NOTIFIER) += radeon_mn.o
 
 # add async DMA block
@@ -88,7 +90,8 @@ radeon-y += \
 	evergreen_dma.o \
 	ni_dma.o \
 	si_dma.o \
-	cik_sdma.o \
+
+radeon-$(CONFIG_DRM_RADEON_CIK) += cik_sdma.o
 
 # add UVD block
 radeon-y += \
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index 01b20e1..2bb81d2 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -2506,10 +2506,15 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
 	/* this is needed for the pll/ss setup to work correctly in some cases */
 	atombios_set_encoder_crtc_source(encoder);
 	/* set up the FMT blocks */
+#ifdef CONFIG_DRM_RADEON_CIK
 	if (ASIC_IS_DCE8(rdev))
 		dce8_program_fmt(encoder);
 	else if (ASIC_IS_DCE4(rdev))
 		dce4_program_fmt(encoder);
+#else
+	if (ASIC_IS_DCE4(rdev))
+		dce4_program_fmt(encoder);
+#endif
 	else if (ASIC_IS_DCE3(rdev))
 		dce3_program_fmt(encoder);
 	else if (ASIC_IS_AVIVO(rdev))
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 2ad4628..f431946 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -209,12 +209,19 @@ extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
 				     int ring, u32 cp_int_cntl);
 extern void cayman_vm_decode_fault(struct radeon_device *rdev,
 				   u32 status, u32 addr);
+
+#ifdef CONFIG_DRM_RADEON_CIK
 void cik_init_cp_pg_table(struct radeon_device *rdev);
+#endif
 
 extern u32 si_get_csb_size(struct radeon_device *rdev);
 extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
+
+#ifdef CONFIG_DRM_RADEON_CIK
 extern u32 cik_get_csb_size(struct radeon_device *rdev);
 extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
+#endif
+
 extern void rv770_set_clk_bypass_mode(struct radeon_device *rdev);
 
 static const u32 evergreen_golden_registers[] =
@@ -4160,11 +4167,17 @@ int sumo_rlc_init(struct radeon_device *rdev)
 
 	if (cs_data) {
 		/* clear state block */
+#ifdef CONFIG_DRM_RADEON_CIK
 		if (rdev->family >= CHIP_BONAIRE) {
 			rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
 		} else if (rdev->family >= CHIP_TAHITI) {
 			rdev->rlc.clear_state_size = si_get_csb_size(rdev);
 			dws = rdev->rlc.clear_state_size + (256 / 4);
+#else
+		if (rdev->family >= CHIP_TAHITI) {
+			rdev->rlc.clear_state_size = si_get_csb_size(rdev);
+			dws = rdev->rlc.clear_state_size + (256 / 4);
+#endif
 		} else {
 			reg_list_num = 0;
 			dws = 0;
@@ -4211,6 +4224,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
 		}
 		/* set up the cs buffer */
 		dst_ptr = rdev->rlc.cs_ptr;
+#ifdef CONFIG_DRM_RADEON_CIK
 		if (rdev->family >= CHIP_BONAIRE) {
 			cik_get_csb_buffer(rdev, dst_ptr);
 		} else if (rdev->family >= CHIP_TAHITI) {
@@ -4219,6 +4233,14 @@ int sumo_rlc_init(struct radeon_device *rdev)
 			dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
 			dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
 			si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
+#else
+		if (rdev->family >= CHIP_TAHITI) {
+		        reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
+			dst_ptr[0] = cpu_to_le32(upper_32_bits(reg_list_mc_addr));
+			dst_ptr[1] = cpu_to_le32(lower_32_bits(reg_list_mc_addr));
+			dst_ptr[2] = cpu_to_le32(rdev->rlc.clear_state_size);
+			si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
+#endif
 		} else {
 			reg_list_hdr_blk_index = 0;
 			reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
@@ -4288,7 +4310,9 @@ int sumo_rlc_init(struct radeon_device *rdev)
 			return r;
 		}
 
+#ifdef CONFIG_DRM_RADEON_CIK
 		cik_init_cp_pg_table(rdev);
+#endif
 
 		radeon_bo_kunmap(rdev->rlc.cp_table_obj);
 		radeon_bo_unreserve(rdev->rlc.cp_table_obj);
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index 7d5a36d..2f4beff 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -126,6 +126,7 @@ static void radeon_register_accessor_init(struct radeon_device *rdev)
 		rdev->mc_wreg = &rs780_mc_wreg;
 	}
 
+#ifdef CONFIG_DRM_RADEON_CIK
 	if (rdev->family >= CHIP_BONAIRE) {
 		rdev->pciep_rreg = &cik_pciep_rreg;
 		rdev->pciep_wreg = &cik_pciep_wreg;
@@ -133,6 +134,12 @@ static void radeon_register_accessor_init(struct radeon_device *rdev)
 		rdev->pciep_rreg = &r600_pciep_rreg;
 		rdev->pciep_wreg = &r600_pciep_wreg;
 	}
+#else
+	if (rdev->family >= CHIP_R600) {
+		rdev->pciep_rreg = &r600_pciep_rreg;
+		rdev->pciep_wreg = &r600_pciep_wreg;
+	}
+#endif
 }
 
 static int radeon_invalid_get_allowed_info_register(struct radeon_device *rdev,
@@ -2023,6 +2030,8 @@ static struct radeon_asic si_asic = {
 	},
 };
 
+#ifdef CONFIG_DRM_RADEON_CIK
+
 static const struct radeon_asic_ring ci_gfx_ring = {
 	.ib_execute = &cik_ring_ib_execute,
 	.ib_parse = &cik_ib_parse,
@@ -2303,6 +2312,8 @@ static struct radeon_asic kv_asic = {
 	},
 };
 
+#endif
+
 /**
  * radeon_asic_init - register asic specific callbacks
  *
@@ -2573,6 +2584,7 @@ int radeon_asic_init(struct radeon_device *rdev)
 			break;
 		}
 		break;
+#ifdef CONFIG_DRM_RADEON_CIK
 	case CHIP_BONAIRE:
 	case CHIP_HAWAII:
 		rdev->asic = &ci_asic;
@@ -2679,6 +2691,7 @@ int radeon_asic_init(struct radeon_device *rdev)
 		}
 		rdev->has_uvd = true;
 		break;
+#endif
 	default:
 		/* FIXME: not supported yet */
 		return -EINVAL;
-- 
2.7.1



More information about the dri-devel mailing list