Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61b576db authored by Michel Dänzer's avatar Michel Dänzer Committed by Dave Airlie
Browse files

drm/radeon: Endianness fixes for radeondrmfb.



For now handle it via r/g/b offsets and disallow 16 bpp modes on big endian
machines.

Signed-off-by: default avatarMichel Dänzer <daenzer@vmware.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 77bd36f0
Loading
Loading
Loading
Loading
+50 −3
Original line number Original line Diff line number Diff line
@@ -101,9 +101,10 @@ static int radeonfb_setcolreg(unsigned regno,
				break;
				break;
			case 24:
			case 24:
			case 32:
			case 32:
				fb->pseudo_palette[regno] = ((red & 0xff00) << 8) |
				fb->pseudo_palette[regno] =
					(green & 0xff00) |
					(((red >> 8) & 0xff) << info->var.red.offset) |
					((blue  & 0xff00) >> 8);
					(((green >> 8) & 0xff) << info->var.green.offset) |
					(((blue >> 8) & 0xff) << info->var.blue.offset);
				break;
				break;
			}
			}
		}
		}
@@ -154,6 +155,7 @@ static int radeonfb_check_var(struct fb_var_screeninfo *var,
		var->transp.length = 0;
		var->transp.length = 0;
		var->transp.offset = 0;
		var->transp.offset = 0;
		break;
		break;
#ifdef __LITTLE_ENDIAN
	case 15:
	case 15:
		var->red.offset = 10;
		var->red.offset = 10;
		var->green.offset = 5;
		var->green.offset = 5;
@@ -194,6 +196,28 @@ static int radeonfb_check_var(struct fb_var_screeninfo *var,
		var->transp.length = 8;
		var->transp.length = 8;
		var->transp.offset = 24;
		var->transp.offset = 24;
		break;
		break;
#else
	case 24:
		var->red.offset = 8;
		var->green.offset = 16;
		var->blue.offset = 24;
		var->red.length = 8;
		var->green.length = 8;
		var->blue.length = 8;
		var->transp.length = 0;
		var->transp.offset = 0;
		break;
	case 32:
		var->red.offset = 8;
		var->green.offset = 16;
		var->blue.offset = 24;
		var->red.length = 8;
		var->green.length = 8;
		var->blue.length = 8;
		var->transp.length = 8;
		var->transp.offset = 0;
		break;
#endif
	default:
	default:
		return -EINVAL;
		return -EINVAL;
	}
	}
@@ -600,6 +624,7 @@ int radeonfb_create(struct radeon_device *rdev,
		info->var.transp.offset = 0;
		info->var.transp.offset = 0;
		info->var.transp.length = 0;
		info->var.transp.length = 0;
		break;
		break;
#ifdef __LITTLE_ENDIAN
	case 15:
	case 15:
		info->var.red.offset = 10;
		info->var.red.offset = 10;
		info->var.green.offset = 5;
		info->var.green.offset = 5;
@@ -639,7 +664,29 @@ int radeonfb_create(struct radeon_device *rdev,
		info->var.transp.offset = 24;
		info->var.transp.offset = 24;
		info->var.transp.length = 8;
		info->var.transp.length = 8;
		break;
		break;
#else
	case 24:
		info->var.red.offset = 8;
		info->var.green.offset = 16;
		info->var.blue.offset = 24;
		info->var.red.length = 8;
		info->var.green.length = 8;
		info->var.blue.length = 8;
		info->var.transp.offset = 0;
		info->var.transp.length = 0;
		break;
	case 32:
		info->var.red.offset = 8;
		info->var.green.offset = 16;
		info->var.blue.offset = 24;
		info->var.red.length = 8;
		info->var.green.length = 8;
		info->var.blue.length = 8;
		info->var.transp.offset = 0;
		info->var.transp.length = 8;
		break;
	default:
	default:
#endif
		break;
		break;
	}
	}