radeon modeset crashes on A4-3400 HD6410D

Mikko Tiihonen mikko.tiihonen at iki.fi
Tue Jan 29 10:09:55 PST 2013


Hi,

I have a A4-3400 CPU that I bought half a year ago. I've tried once month,
but  Fedora has never succeeded in booting in graphical mode.

Some time ago a finally built some custom kernels to figure out why. I
created a bug to Fedora
bug<https://bugzilla.redhat.com/show_bug.cgi?id=892233>,
but it has not progressed.

Analysis:
The radeon module startup fails with division by zero in
r6xx_remap_render_backend because the first RB is not enabled and the code
assuming that enabled RBs must be all the first ones of the valid range.


Longer version:

In r600.c:r6xx_remap_render_backend

The function contains only one divide:

u32 r6xx_remap_render_backend(struct radeon_device *rdev,
                              u32 tiling_pipe_num,
                              u32 max_rb_num,
                              u32 total_max_rb_num,
                              u32 disabled_rb_mask)
{
        u32 rendering_pipe_num, rb_num_width, req_rb_num;
...
        /* mask out the RBs that don't exist on that asic */
        disabled_rb_mask |= (0xff << max_rb_num) & 0xff;

        rendering_pipe_num = 1 << tiling_pipe_num;
        req_rb_num = total_max_rb_num - r600_count_pipe_bits(disabled_rb_mask);
        BUG_ON(rendering_pipe_num < req_rb_num);

        pipe_rb_ratio = rendering_pipe_num / req_rb_num;

I added a printk to see what actual parameters are passed in:

tiling_pipe_num=2, max_rb_num=1, total_max_rb_num=8, disabled_rb_mask=253

Using those to calculate the divide by zero comes from:
disabled_rb_mask |= 254; -> 255
req_rb_num = 8 - 8;


Quick fix for stable kernel series:

The attached fix activates only in the division by zero case and instead of
failing uses the given disabled_rb_mask. This is guaranteed to be
regression free and actually allows me to load the radeon driver
successfully. It does help with cards that currently work, but for which
some usable RBs are disabled due to the eager masking.


Proper fix would propably be to find out think why the disabled_rb_mask is
masked the way it is, were there bugs in other places for which it is a
workaround. I can see two possible modifictions:
1) only mask bits exceeding total_max_rb_num instead of the
max_rb_numsince the one enabled RB on A4-3400 can propably be any one
of the 8
possible values.
2) or activate the current code only if there are more than max_rb_num zero
bits in the given disabled_rb_mask


-Mikko
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20130129/c1a632a1/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: r600-division-by-zero.patch
Type: application/octet-stream
Size: 831 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20130129/c1a632a1/attachment-0001.obj>


More information about the dri-devel mailing list