From: alexdeucher@gmail.com
To: airlied@gmail.com, dri-devel@lists.freedesktop.org
Cc: Alex Deucher <alexander.deucher@amd.com>
Subject: [PATCH 45/48] drm/radeon/kms: add support for ucode loading on trinity (v2)
Date: Tue, 20 Mar 2012 17:18:39 -0400 [thread overview]
Message-ID: <1332278322-12875-46-git-send-email-alexdeucher@gmail.com> (raw)
In-Reply-To: <1332278322-12875-1-git-send-email-alexdeucher@gmail.com>
From: Alex Deucher <alexander.deucher@amd.com>
v2: fix check for MC ucode from Tom.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
drivers/gpu/drm/radeon/ni.c | 82 +++++++++++++++++++++++++++++++---------
drivers/gpu/drm/radeon/r600.c | 21 ++++++++--
drivers/gpu/drm/radeon/r600d.h | 4 ++
drivers/gpu/drm/radeon/si.c | 4 +-
4 files changed, 87 insertions(+), 24 deletions(-)
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index bae3ec3..a48ca53 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -42,6 +42,8 @@ extern void evergreen_irq_suspend(struct radeon_device *rdev);
extern int evergreen_mc_init(struct radeon_device *rdev);
extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
+extern void si_rlc_fini(struct radeon_device *rdev);
+extern int si_rlc_init(struct radeon_device *rdev);
#define EVERGREEN_PFP_UCODE_SIZE 1120
#define EVERGREEN_PM4_UCODE_SIZE 1376
@@ -53,6 +55,8 @@ extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
#define CAYMAN_RLC_UCODE_SIZE 1024
#define CAYMAN_MC_UCODE_SIZE 6037
+#define ARUBA_RLC_UCODE_SIZE 1536
+
/* Firmware Names */
MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
MODULE_FIRMWARE("radeon/BARTS_me.bin");
@@ -68,6 +72,9 @@ MODULE_FIRMWARE("radeon/CAYMAN_pfp.bin");
MODULE_FIRMWARE("radeon/CAYMAN_me.bin");
MODULE_FIRMWARE("radeon/CAYMAN_mc.bin");
MODULE_FIRMWARE("radeon/CAYMAN_rlc.bin");
+MODULE_FIRMWARE("radeon/ARUBA_pfp.bin");
+MODULE_FIRMWARE("radeon/ARUBA_me.bin");
+MODULE_FIRMWARE("radeon/ARUBA_rlc.bin");
#define BTC_IO_MC_REGS_SIZE 29
@@ -326,6 +333,15 @@ int ni_init_microcode(struct radeon_device *rdev)
rlc_req_size = CAYMAN_RLC_UCODE_SIZE * 4;
mc_req_size = CAYMAN_MC_UCODE_SIZE * 4;
break;
+ case CHIP_ARUBA:
+ chip_name = "ARUBA";
+ rlc_chip_name = "ARUBA";
+ /* pfp/me same size as CAYMAN */
+ pfp_req_size = CAYMAN_PFP_UCODE_SIZE * 4;
+ me_req_size = CAYMAN_PM4_UCODE_SIZE * 4;
+ rlc_req_size = ARUBA_RLC_UCODE_SIZE * 4;
+ mc_req_size = 0;
+ break;
default: BUG();
}
@@ -365,15 +381,18 @@ int ni_init_microcode(struct radeon_device *rdev)
err = -EINVAL;
}
- snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
- err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
- if (err)
- goto out;
- if (rdev->mc_fw->size != mc_req_size) {
- printk(KERN_ERR
- "ni_mc: Bogus length %zu in firmware \"%s\"\n",
- rdev->mc_fw->size, fw_name);
- err = -EINVAL;
+ /* no MC ucode on TN */
+ if (!(rdev->flags & RADEON_IS_IGP)) {
+ snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+ err = request_firmware(&rdev->mc_fw, fw_name, &pdev->dev);
+ if (err)
+ goto out;
+ if (rdev->mc_fw->size != mc_req_size) {
+ printk(KERN_ERR
+ "ni_mc: Bogus length %zu in firmware \"%s\"\n",
+ rdev->mc_fw->size, fw_name);
+ err = -EINVAL;
+ }
}
out:
platform_device_unregister(pdev);
@@ -1484,18 +1503,29 @@ static int cayman_startup(struct radeon_device *rdev)
/* enable pcie gen2 link */
evergreen_pcie_gen2_enable(rdev);
- if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
- r = ni_init_microcode(rdev);
+ 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;
+ }
+ }
+
+ r = ni_mc_load_microcode(rdev);
if (r) {
- DRM_ERROR("Failed to load firmware!\n");
+ DRM_ERROR("Failed to load MC firmware!\n");
return r;
}
}
- r = ni_mc_load_microcode(rdev);
- if (r) {
- DRM_ERROR("Failed to load MC firmware!\n");
- return r;
- }
r = r600_vram_scratch_init(rdev);
if (r)
@@ -1514,6 +1544,15 @@ static int cayman_startup(struct radeon_device *rdev)
dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
}
+ /* allocate rlc buffers */
+ if (rdev->flags & RADEON_IS_IGP) {
+ r = si_rlc_init(rdev);
+ if (r) {
+ DRM_ERROR("Failed to init rlc BOs!\n");
+ return r;
+ }
+ }
+
/* allocate wb buffer */
r = radeon_wb_init(rdev);
if (r)
@@ -1698,6 +1737,8 @@ int cayman_init(struct radeon_device *rdev)
dev_err(rdev->dev, "disabling GPU acceleration\n");
cayman_cp_fini(rdev);
r600_irq_fini(rdev);
+ if (rdev->flags & RADEON_IS_IGP)
+ si_rlc_fini(rdev);
radeon_wb_fini(rdev);
r100_ib_fini(rdev);
radeon_vm_manager_fini(rdev);
@@ -1709,8 +1750,11 @@ int cayman_init(struct radeon_device *rdev)
/* Don't start up if the MC ucode is missing.
* The default clocks and voltages before the MC ucode
* is loaded are not suffient for advanced operations.
+ *
+ * We can skip this check for TN, because there is no MC
+ * ucode.
*/
- if (!rdev->mc_fw) {
+ if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
DRM_ERROR("radeon: MC ucode required for NI+.\n");
return -EINVAL;
}
@@ -1723,6 +1767,8 @@ void cayman_fini(struct radeon_device *rdev)
r600_blit_fini(rdev);
cayman_cp_fini(rdev);
r600_irq_fini(rdev);
+ if (rdev->flags & RADEON_IS_IGP)
+ si_rlc_fini(rdev);
radeon_wb_fini(rdev);
radeon_vm_manager_fini(rdev);
r100_ib_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 924b687..391bd26 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -49,6 +49,7 @@
#define EVERGREEN_PM4_UCODE_SIZE 1376
#define EVERGREEN_RLC_UCODE_SIZE 768
#define CAYMAN_RLC_UCODE_SIZE 1024
+#define ARUBA_RLC_UCODE_SIZE 1536
/* Firmware Names */
MODULE_FIRMWARE("radeon/R600_pfp.bin");
@@ -2861,10 +2862,17 @@ static int r600_rlc_init(struct radeon_device *rdev)
r600_rlc_stop(rdev);
- WREG32(RLC_HB_BASE, 0);
WREG32(RLC_HB_CNTL, 0);
- WREG32(RLC_HB_RPTR, 0);
- WREG32(RLC_HB_WPTR, 0);
+
+ if (rdev->family == CHIP_ARUBA) {
+ WREG32(TN_RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
+ WREG32(TN_RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
+ }
+ if (rdev->family <= CHIP_CAYMAN) {
+ WREG32(RLC_HB_BASE, 0);
+ WREG32(RLC_HB_RPTR, 0);
+ WREG32(RLC_HB_WPTR, 0);
+ }
if (rdev->family <= CHIP_CAICOS) {
WREG32(RLC_HB_WPTR_LSB_ADDR, 0);
WREG32(RLC_HB_WPTR_MSB_ADDR, 0);
@@ -2873,7 +2881,12 @@ static int r600_rlc_init(struct radeon_device *rdev)
WREG32(RLC_UCODE_CNTL, 0);
fw_data = (const __be32 *)rdev->rlc_fw->data;
- if (rdev->family >= CHIP_CAYMAN) {
+ if (rdev->family >= CHIP_ARUBA) {
+ for (i = 0; i < ARUBA_RLC_UCODE_SIZE; i++) {
+ WREG32(RLC_UCODE_ADDR, i);
+ WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
+ }
+ } else if (rdev->family >= CHIP_CAYMAN) {
for (i = 0; i < CAYMAN_RLC_UCODE_SIZE; i++) {
WREG32(RLC_UCODE_ADDR, i);
WREG32(RLC_UCODE_DATA, be32_to_cpup(fw_data++));
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
index 8ae328f..3568a2e 100644
--- a/drivers/gpu/drm/radeon/r600d.h
+++ b/drivers/gpu/drm/radeon/r600d.h
@@ -593,6 +593,10 @@
#define RLC_UCODE_ADDR 0x3f2c
#define RLC_UCODE_DATA 0x3f30
+/* new for TN */
+#define TN_RLC_SAVE_AND_RESTORE_BASE 0x3f10
+#define TN_RLC_CLEAR_STATE_RESTORE_BASE 0x3f20
+
#define SRBM_SOFT_RESET 0xe60
# define SOFT_RESET_RLC (1 << 13)
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index d773ea9..ac7a199 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -2949,7 +2949,7 @@ void si_vm_tlb_flush(struct radeon_device *rdev, struct radeon_vm *vm)
/*
* RLC
*/
-static void si_rlc_fini(struct radeon_device *rdev)
+void si_rlc_fini(struct radeon_device *rdev)
{
int r;
@@ -2978,7 +2978,7 @@ static void si_rlc_fini(struct radeon_device *rdev)
}
}
-static int si_rlc_init(struct radeon_device *rdev)
+int si_rlc_init(struct radeon_device *rdev)
{
int r;
--
1.7.7.5
next prev parent reply other threads:[~2012-03-20 21:19 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-20 21:17 [PATCH 00/48] Add SI, TN support alexdeucher
2012-03-20 21:17 ` [PATCH 01/48] drm/radeon/kms: add info query for max pipes alexdeucher
2012-03-20 21:17 ` [PATCH 02/48] drm/radeon/kms: Upstream ObjectID.h updates alexdeucher
2012-03-20 21:17 ` [PATCH 03/48] drm/radeon/kms: upstream atombios.h updates alexdeucher
2012-03-20 21:17 ` [PATCH 04/48] drm/radeon/kms: upstream power table updates alexdeucher
2012-03-20 21:17 ` [PATCH 05/48] drm/radeon/kms: add SI chip families alexdeucher
2012-03-20 21:18 ` [PATCH 06/48] drm/radeon/kms: add initial DCE6 display watermark support alexdeucher
2012-03-20 23:18 ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 07/48] drm/radeon/kms: fix up atom HPD gpio parsing for DCE6 alexdeucher
2012-03-20 21:18 ` [PATCH 08/48] drm/radeon/kms/atom: DCE6 no longer has crtcmemreq bits alexdeucher
2012-03-20 21:18 ` [PATCH 09/48] drm/radeon/kms/atom: add support for crtc power gating alexdeucher
2012-03-20 21:18 ` [PATCH 10/48] drm/radeon/kms: DCE6 disp eng pll updates alexdeucher
2012-03-20 21:18 ` [PATCH 11/48] drm/radeon/kms/atom: add support for DCE6.x dig transmitters alexdeucher
2012-03-20 21:18 ` [PATCH 12/48] drm/radeon/kms: DP aux updates for DCE6 alexdeucher
2012-03-20 21:18 ` [PATCH 13/48] drm/radeon/kms: update comments about dig encoders/transmitters alexdeucher
2012-03-20 21:18 ` [PATCH 14/48] drm/radeon/kms/atom: add support for SI SetVoltage table alexdeucher
2012-03-20 21:18 ` [PATCH 15/48] drm/radeon/kms: update power table parsing for SI alexdeucher
2012-03-20 21:18 ` [PATCH 16/48] drm/radeon/kms: add support for internal thermal sensor on SI alexdeucher
2012-03-20 21:18 ` [PATCH 17/48] drm/radeon/kms: add gpu init support for SI alexdeucher
2012-03-20 23:16 ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 18/48] drm/radeon/kms: Add support for SI GPU reset alexdeucher
2012-03-20 21:18 ` [PATCH 19/48] drm/radeon/kms: add support for MC/VM setup on SI alexdeucher
2012-03-20 23:20 ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 20/48] drm/radeon/kms: add support for the CONST IB to the CS ioctl alexdeucher
2012-03-20 21:18 ` [PATCH 21/48] drm/radeon/kms: add VM CS checker for SI alexdeucher
2012-03-20 21:18 ` [PATCH 22/48] drm/radeon/kms: Only VM CS ioctl is supported on SI (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 23/48] drm/radeon/kms: add ucode loading for SI alexdeucher
2012-03-20 21:18 ` [PATCH 24/48] drm/radeon/kms: add support for MC ucode loading on SI alexdeucher
2012-03-20 21:18 ` [PATCH 25/48] drm/radeon/kms: add support for CP setup " alexdeucher
2012-03-20 21:18 ` [PATCH 26/48] drm/radeon/kms: add IB and fence dispatch functions for SI alexdeucher
2012-03-20 21:18 ` [PATCH 27/48] drm/radeon/kms: Add support for RLC init on SI alexdeucher
2012-03-20 21:18 ` [PATCH 28/48] drm/radeon/kms: add support for interrupts " alexdeucher
2012-03-20 21:18 ` [PATCH 29/48] drm/radeon/kms: fill in startup/shutdown callbacks for SI alexdeucher
2012-03-20 21:18 ` [PATCH 30/48] drm/radeon/kms: add support for compute rings in CS ioctl on SI alexdeucher
2012-03-20 21:18 ` [PATCH 31/48] drm/radeon/kms: add radeon_asic struct for SI alexdeucher
2012-03-20 21:18 ` [PATCH 32/48] drm/radeon: Update radeon_info_ioctl for SI. (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 33/48] drm/radeon/kms: Add SI pci ids alexdeucher
2012-03-20 21:18 ` [PATCH 34/48] drm/radeon/kms: add trinity (TN) chip family alexdeucher
2012-03-20 21:18 ` [PATCH 35/48] drm/radeon/kms: no support for internal thermal sensor on TN yet alexdeucher
2012-03-20 21:18 ` [PATCH 36/48] drm/radeon/kms: DCE6.1 watermark updates for TN alexdeucher
2012-03-20 21:18 ` [PATCH 37/48] drm/radeon/kms: DCE6.1 disp eng pll updates alexdeucher
2012-03-20 21:18 ` [PATCH 38/48] drm/radeon/kms: Adjust pll picker for DCE6.1 alexdeucher
2012-03-20 21:18 ` [PATCH 39/48] drm/radeon/kms: disable PPLL0 on DCE6.1 when not in use alexdeucher
2012-03-20 21:18 ` [PATCH 40/48] drm/radeon/kms/DCE6.1: ss is not supported on the internal pplls alexdeucher
2012-03-20 21:18 ` [PATCH 41/48] drm/radeon/kms: Add checks for TN in the DP bridge code alexdeucher
2012-03-20 21:18 ` [PATCH 42/48] drm/radeon/kms: cayman gpu init updates for trinity alexdeucher
2012-03-20 21:18 ` [PATCH 43/48] drm/radeon/kms: Update evergreen functions " alexdeucher
2012-03-20 21:18 ` [PATCH 44/48] drm/radeon/kms/vm: set vram base offset properly for TN alexdeucher
2012-03-20 21:18 ` alexdeucher [this message]
2012-03-20 21:18 ` [PATCH 46/48] drm/radeon/kms: add radeon_asic struct for trinity alexdeucher
2012-03-20 21:18 ` [PATCH 47/48] drm/radeon/kms: add trinity pci ids alexdeucher
2012-03-20 21:18 ` [PATCH 48/48] drm/radeon/kms: update duallink checks for DCE6 alexdeucher
2012-03-20 23:17 ` [PATCH 00/48] Add SI, TN support Jerome Glisse
2012-03-21 11:18 ` Christian König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1332278322-12875-46-git-send-email-alexdeucher@gmail.com \
--to=alexdeucher@gmail.com \
--cc=airlied@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=dri-devel@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.