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

Reply via email to