On Wed, Jul 31, 2013 at 11:50 AM, Rafał Miłecki <zajec5@xxxxxxxxx> wrote: > > Signed-off-by: Rafał Miłecki <zajec5@xxxxxxxxx> > --- > Dave/Alex: please decide who picks this patch :) I think it might be easier to just assume 6 afmt blocks on all DCE4+ hardware (DCE6 too). It's makes the logic simpler in the driver. The afmt block is tied to the dig encoder so the correct one will always get selected even if a particular asic has more allocated than it has physically. Alex > --- > drivers/gpu/drm/radeon/radeon_display.c | 53 ++++++++++++++----------------- > 1 file changed, 23 insertions(+), 30 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c > index c2b67b4..31d9fbe 100644 > --- a/drivers/gpu/drm/radeon/radeon_display.c > +++ b/drivers/gpu/drm/radeon/radeon_display.c > @@ -1257,38 +1257,31 @@ static void radeon_afmt_init(struct radeon_device *rdev) > if (ASIC_IS_DCE6(rdev)) { > /* todo */ > } else if (ASIC_IS_DCE4(rdev)) { > + static uint32_t eg_offsets[] = { > + EVERGREEN_CRTC0_REGISTER_OFFSET, > + EVERGREEN_CRTC1_REGISTER_OFFSET, > + EVERGREEN_CRTC2_REGISTER_OFFSET, > + EVERGREEN_CRTC3_REGISTER_OFFSET, > + EVERGREEN_CRTC4_REGISTER_OFFSET, > + EVERGREEN_CRTC5_REGISTER_OFFSET, > + }; > + int num_afmt; > + > /* DCE4/5 has 6 audio blocks tied to DIG encoders */ > /* DCE4.1 has 2 audio blocks tied to DIG encoders */ > - rdev->mode_info.afmt[0] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > - if (rdev->mode_info.afmt[0]) { > - rdev->mode_info.afmt[0]->offset = EVERGREEN_CRTC0_REGISTER_OFFSET; > - rdev->mode_info.afmt[0]->id = 0; > - } > - rdev->mode_info.afmt[1] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > - if (rdev->mode_info.afmt[1]) { > - rdev->mode_info.afmt[1]->offset = EVERGREEN_CRTC1_REGISTER_OFFSET; > - rdev->mode_info.afmt[1]->id = 1; > - } > - if (!ASIC_IS_DCE41(rdev)) { > - rdev->mode_info.afmt[2] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > - if (rdev->mode_info.afmt[2]) { > - rdev->mode_info.afmt[2]->offset = EVERGREEN_CRTC2_REGISTER_OFFSET; > - rdev->mode_info.afmt[2]->id = 2; > - } > - rdev->mode_info.afmt[3] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > - if (rdev->mode_info.afmt[3]) { > - rdev->mode_info.afmt[3]->offset = EVERGREEN_CRTC3_REGISTER_OFFSET; > - rdev->mode_info.afmt[3]->id = 3; > - } > - rdev->mode_info.afmt[4] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > - if (rdev->mode_info.afmt[4]) { > - rdev->mode_info.afmt[4]->offset = EVERGREEN_CRTC4_REGISTER_OFFSET; > - rdev->mode_info.afmt[4]->id = 4; > - } > - rdev->mode_info.afmt[5] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > - if (rdev->mode_info.afmt[5]) { > - rdev->mode_info.afmt[5]->offset = EVERGREEN_CRTC5_REGISTER_OFFSET; > - rdev->mode_info.afmt[5]->id = 5; > + if (ASIC_IS_DCE5(rdev)) > + num_afmt = 6; > + else if (ASIC_IS_DCE41(rdev)) > + num_afmt = 2; > + else /* DCE4 */ > + num_afmt = 6; > + > + BUG_ON(num_afmt > ARRAY_SIZE(eg_offsets)); > + for (i = 0; i < num_afmt; i++) { > + rdev->mode_info.afmt[i] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); > + if (rdev->mode_info.afmt[i]) { > + rdev->mode_info.afmt[i]->offset = eg_offsets[i]; > + rdev->mode_info.afmt[i]->id = i; > } > } > } else if (ASIC_IS_DCE3(rdev)) { > -- > 1.7.10.4 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel