On Wed, Mar 12, 2014 at 11:20:41AM -0400, Alex Deucher wrote:
> We need to reorder the driver init sequence to better accomodate
> dpm which needs to be loaded earlier in the init sequence. Move
> fw init up so that it's available for dpm init.
>
> This also fixes a bad failure case when firmware is not available.
>
> This is a cherry-pick of the fix from 3.14.
>
> Signed-off-by: Alex Deucher <[email protected]>
> (cherry picked from commit 01ac8794a77192236a4b91c33adf4177ac5a21f0)
Thank you Alex, I'll queue this for the 3.11 kernel.
Cheers,
--
Luís
> ---
> drivers/gpu/drm/radeon/cik.c | 42
> ++++++++++++++++++++------------------
> drivers/gpu/drm/radeon/evergreen.c | 33 ++++++++++++++++--------------
> drivers/gpu/drm/radeon/ni.c | 36 +++++++++++++++++---------------
> drivers/gpu/drm/radeon/r600.c | 16 +++++++--------
> drivers/gpu/drm/radeon/rv770.c | 16 +++++++--------
> drivers/gpu/drm/radeon/si.c | 18 ++++++++--------
> 6 files changed, 84 insertions(+), 77 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index e9cde26..d955c39 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -7498,26 +7498,7 @@ static int cik_startup(struct radeon_device *rdev)
>
> cik_mc_program(rdev);
>
> - if (rdev->flags & RADEON_IS_IGP) {
> - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
> - !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
> - r = cik_init_microcode(rdev);
> - if (r) {
> - DRM_ERROR("Failed to load firmware!\n");
> - return r;
> - }
> - }
> - } else {
> - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
> - !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
> - !rdev->mc_fw) {
> - r = cik_init_microcode(rdev);
> - if (r) {
> - DRM_ERROR("Failed to load firmware!\n");
> - return r;
> - }
> - }
> -
> + if (!(rdev->flags & RADEON_IS_IGP)) {
> r = ci_mc_load_microcode(rdev);
> if (r) {
> DRM_ERROR("Failed to load MC firmware!\n");
> @@ -7830,6 +7811,27 @@ int cik_init(struct radeon_device *rdev)
> if (r)
> return r;
>
> + if (rdev->flags & RADEON_IS_IGP) {
> + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
> + !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
> + r = cik_init_microcode(rdev);
> + if (r) {
> + DRM_ERROR("Failed to load firmware!\n");
> + return r;
> + }
> + }
> + } else {
> + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
> + !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw ||
> + !rdev->mc_fw) {
> + r = cik_init_microcode(rdev);
> + if (r) {
> + DRM_ERROR("Failed to load firmware!\n");
> + return r;
> + }
> + }
> + }
> +
> ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
> ring->ring_obj = NULL;
> r600_ring_init(rdev, ring, 1024 * 1024);
> diff --git a/drivers/gpu/drm/radeon/evergreen.c
> b/drivers/gpu/drm/radeon/evergreen.c
> index 95ffe2a..0d4a56a 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -5110,26 +5110,11 @@ static int evergreen_startup(struct radeon_device
> *rdev)
> evergreen_mc_program(rdev);
>
> if (ASIC_IS_DCE5(rdev)) {
> - 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 MC firmware!\n");
> return r;
> }
> - } else {
> - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
> - r = r600_init_microcode(rdev);
> - if (r) {
> - DRM_ERROR("Failed to load firmware!\n");
> - return r;
> - }
> - }
> }
>
> if (rdev->flags & RADEON_IS_AGP) {
> @@ -5357,6 +5342,24 @@ int evergreen_init(struct radeon_device *rdev)
> if (r)
> return r;
>
> + if (ASIC_IS_DCE5(rdev)) {
> + 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;
> + }
> + }
> + } else {
> + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
> + r = r600_init_microcode(rdev);
> + if (r) {
> + DRM_ERROR("Failed to load firmware!\n");
> + return r;
> + }
> + }
> + }
> +
> rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
> r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 *
> 1024);
>
> diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
> index 9eeb2a9..2443d11 100644
> --- a/drivers/gpu/drm/radeon/ni.c
> +++ b/drivers/gpu/drm/radeon/ni.c
> @@ -1876,23 +1876,7 @@ static int cayman_startup(struct radeon_device *rdev)
>
> evergreen_mc_program(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;
> - }
> - }
> -
> + if (!(rdev->flags & RADEON_IS_IGP)) {
> r = ni_mc_load_microcode(rdev);
> if (r) {
> DRM_ERROR("Failed to load MC firmware!\n");
> @@ -2143,6 +2127,24 @@ int cayman_init(struct radeon_device *rdev)
> if (r)
> return r;
>
> + 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;
> + }
> + }
> + }
> +
> ring->ring_obj = NULL;
> r600_ring_init(rdev, ring, 1024 * 1024);
>
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 51cbb60..2d75542 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2776,14 +2776,6 @@ static int r600_startup(struct radeon_device *rdev)
>
> r600_mc_program(rdev);
>
> - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
> - r = r600_init_microcode(rdev);
> - if (r) {
> - DRM_ERROR("Failed to load firmware!\n");
> - return r;
> - }
> - }
> -
> if (rdev->flags & RADEON_IS_AGP) {
> r600_agp_enable(rdev);
> } else {
> @@ -2971,6 +2963,14 @@ int r600_init(struct radeon_device *rdev)
> if (r)
> return r;
>
> + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
> + r = r600_init_microcode(rdev);
> + if (r) {
> + DRM_ERROR("Failed to load firmware!\n");
> + return r;
> + }
> + }
> +
> rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
> r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 *
> 1024);
>
> diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
> index 9f58467..45774ff 100644
> --- a/drivers/gpu/drm/radeon/rv770.c
> +++ b/drivers/gpu/drm/radeon/rv770.c
> @@ -1665,14 +1665,6 @@ static int rv770_startup(struct radeon_device *rdev)
>
> rv770_mc_program(rdev);
>
> - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
> - r = r600_init_microcode(rdev);
> - if (r) {
> - DRM_ERROR("Failed to load firmware!\n");
> - return r;
> - }
> - }
> -
> if (rdev->flags & RADEON_IS_AGP) {
> rv770_agp_enable(rdev);
> } else {
> @@ -1876,6 +1868,14 @@ int rv770_init(struct radeon_device *rdev)
> if (r)
> return r;
>
> + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
> + r = r600_init_microcode(rdev);
> + if (r) {
> + DRM_ERROR("Failed to load firmware!\n");
> + return r;
> + }
> + }
> +
> rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
> r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 *
> 1024);
>
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index 6ff3f1a..4a2e532 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -6328,15 +6328,6 @@ static int si_startup(struct radeon_device *rdev)
>
> si_mc_program(rdev);
>
> - if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
> - !rdev->rlc_fw || !rdev->mc_fw) {
> - r = si_init_microcode(rdev);
> - if (r) {
> - DRM_ERROR("Failed to load firmware!\n");
> - return r;
> - }
> - }
> -
> r = si_mc_load_microcode(rdev);
> if (r) {
> DRM_ERROR("Failed to load MC firmware!\n");
> @@ -6604,6 +6595,15 @@ int si_init(struct radeon_device *rdev)
> if (r)
> return r;
>
> + if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
> + !rdev->rlc_fw || !rdev->mc_fw) {
> + r = si_init_microcode(rdev);
> + if (r) {
> + DRM_ERROR("Failed to load firmware!\n");
> + return r;
> + }
> + }
> +
> ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
> ring->ring_obj = NULL;
> r600_ring_init(rdev, ring, 1024 * 1024);
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html