drm/radeon/cik: add pcie_port indirect register accessors
authorAlex Deucher <alexander.deucher@amd.com>
Wed, 3 Apr 2013 23:28:32 +0000 (19:28 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 26 Jun 2013 20:11:48 +0000 (16:11 -0400)
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/cik.c
drivers/gpu/drm/radeon/cikd.h
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_asic.h

index 445f497c7fc9d73716cecdc43338234122622265..4c8407df175bea5378683f71c900beb6cc3e9c57 100644 (file)
@@ -78,6 +78,27 @@ extern void si_rlc_fini(struct radeon_device *rdev);
 extern int si_rlc_init(struct radeon_device *rdev);
 static void cik_rlc_stop(struct radeon_device *rdev);
 
+/*
+ * Indirect registers accessor
+ */
+u32 cik_pciep_rreg(struct radeon_device *rdev, u32 reg)
+{
+       u32 r;
+
+       WREG32(PCIE_INDEX, reg);
+       (void)RREG32(PCIE_INDEX);
+       r = RREG32(PCIE_DATA);
+       return r;
+}
+
+void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
+{
+       WREG32(PCIE_INDEX, reg);
+       (void)RREG32(PCIE_INDEX);
+       WREG32(PCIE_DATA, v);
+       (void)RREG32(PCIE_DATA);
+}
+
 /**
  * cik_get_xclk - get the xclk
  *
index f00e273134a808673c0f96fb369c270afa3568d1..d23809a557a60febac66e7c9e9744ffed4586f6a 100644 (file)
@@ -35,6 +35,9 @@
 #define CG_CLKPIN_CNTL                                    0xC05001A0
 #       define XTALIN_DIVIDE                              (1 << 1)
 
+#define PCIE_INDEX                                     0x38
+#define PCIE_DATA                                      0x3C
+
 #define VGA_HDP_CONTROL                                0x328
 #define                VGA_MEMORY_DISABLE                              (1 << 4)
 
index a2802b47ee958e230d754f105214070f91ef1f23..717b5373d2b0112e41f5afea863be9f40d174367 100644 (file)
@@ -126,7 +126,11 @@ static void radeon_register_accessor_init(struct radeon_device *rdev)
                rdev->mc_rreg = &rs780_mc_rreg;
                rdev->mc_wreg = &rs780_mc_wreg;
        }
-       if (rdev->family >= CHIP_R600) {
+
+       if (rdev->family >= CHIP_BONAIRE) {
+               rdev->pciep_rreg = &cik_pciep_rreg;
+               rdev->pciep_wreg = &cik_pciep_wreg;
+       } else if (rdev->family >= CHIP_R600) {
                rdev->pciep_rreg = &r600_pciep_rreg;
                rdev->pciep_wreg = &r600_pciep_wreg;
        }
index 05f75f7534686c0a63f04b8941906301b4927ee5..8c19e36462566882aedcaf07e2fb698df2390fc7 100644 (file)
@@ -558,5 +558,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
  */
 uint64_t cik_get_gpu_clock_counter(struct radeon_device *rdev);
 u32 cik_get_xclk(struct radeon_device *rdev);
+uint32_t cik_pciep_rreg(struct radeon_device *rdev, uint32_t reg);
+void cik_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
 
 #endif