[PATCH] radeon: Fix surface register on r100
Alex Deucher
alexdeucher at gmail.com
Fri Jul 5 07:11:18 PDT 2013
On Wed, Jul 3, 2013 at 6:40 PM, Mark Kettenis <mark.kettenis at xs4all.nl> wrote:
> Working on KMS support on OpenBSD/sparc64, I ended up with the initial
> framebuffer on a Sun XVR-100 card (Radeon 7000/VE, RV100 with
> OpenFirmware) being tiled when none of the tiling flags were set.
> Tracked it down to an issue with r100_set_surface_reg(). The tiling
> bits on these older chips are a bit different than the later ones.
> There is no real flag for macro tiled buffer;
> RADEON_SURF_TILE_COLOR_MACRO is 0. So if we aren't actually tiling,
> we can't actually indicate that by not setting that bit. Instead we
> should make sure that we set the size of tiles to 0. The diff below
> reorganizes the code handling these variants a bit to do that. It
> also seems that you can't have a buffer that's only micro tiled. The
> diff turns that into a BUG(), but perhaps that isn't such a good idea
> since I believe that userland can actually request such a tiling and
> the ioctl code doesn't check this. So perhaps it should just fall
> through into the no-tiling case.
It's a little bit funny on r1xx compared to newer asics:
SURFACE0_INFO - RW - 32 bits - [MMReg:0xB0C]
Field Name Bits Default
Description
SURF0_PITCHSEL 9:0 0x0 Pitch in octawords (16
bytes) of Surface 0. A value of 0
disables tiling in Surface 0.
SURF0_TILE_MODE 17:16 0x0 Mode of tiling for Surface 0. Set
SURF0_PITCHSEL to 0 to
disable tiling surface 0.
0=Disable MicroTiling
1=Enable MicroTiling
2=32 bit Z tiling
3=16 bit Z tiling
Does the attached patch fix it?
Alex
>
> With this fixed, I'm pretty sure the special RN50 handling can go.
> The extra /= 16 was probably enough to make the pitch small enough to
> keep the hardware from tiling.
>
> Signed-off-by: Mark Kettenis <kettenis at openbsd.org>
>
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index d0314ec..84d832a 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -3072,11 +3072,20 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg,
> int flags = 0;
>
> if (rdev->family <= CHIP_RS200) {
> - if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO))
> - == (RADEON_TILING_MACRO|RADEON_TILING_MICRO))
> + switch (tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) {
> + case RADEON_TILING_MACRO|RADEON_TILING_MICRO:
> flags |= RADEON_SURF_TILE_COLOR_BOTH;
> - if (tiling_flags & RADEON_TILING_MACRO)
> + break;
> + case RADEON_TILING_MACRO:
> flags |= RADEON_SURF_TILE_COLOR_MACRO;
> + break;
> + case RADEON_TILING_MICRO:
> + BUG();
> + break;
> + case 0:
> + pitch = 0;
> + break;
> + }
> } else if (rdev->family <= CHIP_RV280) {
> if (tiling_flags & (RADEON_TILING_MACRO))
> flags |= R200_SURF_TILE_COLOR_MACRO;
> @@ -3094,13 +3103,6 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg,
> if (tiling_flags & RADEON_TILING_SWAP_32BIT)
> flags |= RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP;
>
> - /* when we aren't tiling the pitch seems to needs to be furtherdivided down. - tested on power5 + rn50 server */
> - if (tiling_flags & (RADEON_TILING_SWAP_16BIT | RADEON_TILING_SWAP_32BIT)) {
> - if (!(tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO)))
> - if (ASIC_IS_RN50(rdev))
> - pitch /= 16;
> - }
> -
> /* r100/r200 divide by 16 */
> if (rdev->family < CHIP_R300)
> flags |= pitch / 16;
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-drm-radeon-fix-surface-setup-on-r1xx.patch
Type: text/x-patch
Size: 1956 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/dri-devel/attachments/20130705/7b559e23/attachment.bin>
More information about the dri-devel
mailing list