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

Commit c1176d6f authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'drm-next' of ../drm-next into drm-linus

conflict in radeon since new init path merged with vga arb code.

Conflicts:
	drivers/gpu/drm/radeon/radeon.h
	drivers/gpu/drm/radeon/radeon_asic.h
	drivers/gpu/drm/radeon/radeon_device.c
parents 0eca52a9 d4ac6a05
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -1556,8 +1556,6 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;
	int ret = 0;
	int ret = 0;


	DRM_DEBUG_KMS("\n");

	if (!req->flags) {
	if (!req->flags) {
		DRM_ERROR("no operation set\n");
		DRM_ERROR("no operation set\n");
		return -EINVAL;
		return -EINVAL;
+106 −32
Original line number Original line Diff line number Diff line
@@ -454,6 +454,96 @@ int drm_fb_helper_init_crtc_count(struct drm_fb_helper *helper, int crtc_count,
}
}
EXPORT_SYMBOL(drm_fb_helper_init_crtc_count);
EXPORT_SYMBOL(drm_fb_helper_init_crtc_count);


static void setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
		     u16 blue, u16 regno, struct fb_info *info)
{
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_framebuffer *fb = fb_helper->fb;
	int pindex;

	pindex = regno;

	if (fb->bits_per_pixel == 16) {
		pindex = regno << 3;

		if (fb->depth == 16 && regno > 63)
			return;
		if (fb->depth == 15 && regno > 31)
			return;

		if (fb->depth == 16) {
			u16 r, g, b;
			int i;
			if (regno < 32) {
				for (i = 0; i < 8; i++)
					fb_helper->funcs->gamma_set(crtc, red,
						green, blue, pindex + i);
			}

			fb_helper->funcs->gamma_get(crtc, &r,
						    &g, &b,
						    pindex >> 1);

			for (i = 0; i < 4; i++)
				fb_helper->funcs->gamma_set(crtc, r,
							    green, b,
							    (pindex >> 1) + i);
		}
	}

	if (fb->depth != 16)
		fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex);

	if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
		((u32 *) fb->pseudo_palette)[regno] =
			(regno << info->var.red.offset) |
			(regno << info->var.green.offset) |
			(regno << info->var.blue.offset);
	}
}

int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
{
	struct drm_fb_helper *fb_helper = info->par;
	struct drm_device *dev = fb_helper->dev;
	u16 *red, *green, *blue, *transp;
	struct drm_crtc *crtc;
	int i, rc = 0;
	int start;

	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
		for (i = 0; i < fb_helper->crtc_count; i++) {
			if (crtc->base.id == fb_helper->crtc_info[i].crtc_id)
				break;
		}
		if (i == fb_helper->crtc_count)
			continue;

		red = cmap->red;
		green = cmap->green;
		blue = cmap->blue;
		transp = cmap->transp;
		start = cmap->start;

		for (i = 0; i < cmap->len; i++) {
			u16 hred, hgreen, hblue, htransp = 0xffff;

			hred = *red++;
			hgreen = *green++;
			hblue = *blue++;

			if (transp)
				htransp = *transp++;

			setcolreg(crtc, hred, hgreen, hblue, start++, info);
		}
		crtc_funcs->load_lut(crtc);
	}
	return rc;
}
EXPORT_SYMBOL(drm_fb_helper_setcmap);

int drm_fb_helper_setcolreg(unsigned regno,
int drm_fb_helper_setcolreg(unsigned regno,
			    unsigned red,
			    unsigned red,
			    unsigned green,
			    unsigned green,
@@ -466,9 +556,11 @@ int drm_fb_helper_setcolreg(unsigned regno,
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;
	int i;
	int i;


	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
	if (regno > 255)
		struct drm_framebuffer *fb = fb_helper->fb;
		return 1;


	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
		for (i = 0; i < fb_helper->crtc_count; i++) {
		for (i = 0; i < fb_helper->crtc_count; i++) {
			if (crtc->base.id == fb_helper->crtc_info[i].crtc_id)
			if (crtc->base.id == fb_helper->crtc_info[i].crtc_id)
				break;
				break;
@@ -476,35 +568,9 @@ int drm_fb_helper_setcolreg(unsigned regno,
		if (i == fb_helper->crtc_count)
		if (i == fb_helper->crtc_count)
			continue;
			continue;


		if (regno > 255)
			return 1;


		if (fb->depth == 8) {
		setcolreg(crtc, red, green, blue, regno, info);
			fb_helper->funcs->gamma_set(crtc, red, green, blue, regno);
		crtc_funcs->load_lut(crtc);
			return 0;
		}

		if (regno < 16) {
			switch (fb->depth) {
			case 15:
				fb->pseudo_palette[regno] = ((red & 0xf800) >> 1) |
					((green & 0xf800) >>  6) |
					((blue & 0xf800) >> 11);
				break;
			case 16:
				fb->pseudo_palette[regno] = (red & 0xf800) |
					((green & 0xfc00) >>  5) |
					((blue  & 0xf800) >> 11);
				break;
			case 24:
			case 32:
				fb->pseudo_palette[regno] =
					(((red >> 8) & 0xff) << info->var.red.offset) |
					(((green >> 8) & 0xff) << info->var.green.offset) |
					(((blue >> 8) & 0xff) << info->var.blue.offset);
				break;
			}
		}
	}
	}
	return 0;
	return 0;
}
}
@@ -674,6 +740,7 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
EXPORT_SYMBOL(drm_fb_helper_pan_display);
EXPORT_SYMBOL(drm_fb_helper_pan_display);


int drm_fb_helper_single_fb_probe(struct drm_device *dev,
int drm_fb_helper_single_fb_probe(struct drm_device *dev,
				  int preferred_bpp,
				  int (*fb_create)(struct drm_device *dev,
				  int (*fb_create)(struct drm_device *dev,
						   uint32_t fb_width,
						   uint32_t fb_width,
						   uint32_t fb_height,
						   uint32_t fb_height,
@@ -696,6 +763,11 @@ int drm_fb_helper_single_fb_probe(struct drm_device *dev,
	struct drm_fb_helper *fb_helper;
	struct drm_fb_helper *fb_helper;
	uint32_t surface_depth = 24, surface_bpp = 32;
	uint32_t surface_depth = 24, surface_bpp = 32;


	/* if driver picks 8 or 16 by default use that
	   for both depth/bpp */
	if (preferred_bpp != surface_bpp) {
		surface_depth = surface_bpp = preferred_bpp;
	}
	/* first up get a count of crtcs now in use and new min/maxes width/heights */
	/* first up get a count of crtcs now in use and new min/maxes width/heights */
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
		struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
		struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
@@ -851,10 +923,12 @@ void drm_fb_helper_free(struct drm_fb_helper *helper)
}
}
EXPORT_SYMBOL(drm_fb_helper_free);
EXPORT_SYMBOL(drm_fb_helper_free);


void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch)
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
			    uint32_t depth)
{
{
	info->fix.type = FB_TYPE_PACKED_PIXELS;
	info->fix.type = FB_TYPE_PACKED_PIXELS;
	info->fix.visual = FB_VISUAL_TRUECOLOR;
	info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR :
		FB_VISUAL_DIRECTCOLOR;
	info->fix.type_aux = 0;
	info->fix.type_aux = 0;
	info->fix.xpanstep = 1; /* doing it in hw */
	info->fix.xpanstep = 1; /* doing it in hw */
	info->fix.ypanstep = 1; /* doing it in hw */
	info->fix.ypanstep = 1; /* doing it in hw */
+11 −0
Original line number Original line Diff line number Diff line
@@ -3244,6 +3244,16 @@ void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
	intel_crtc->lut_b[regno] = blue >> 8;
	intel_crtc->lut_b[regno] = blue >> 8;
}
}


void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
			     u16 *blue, int regno)
{
	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);

	*red = intel_crtc->lut_r[regno] << 8;
	*green = intel_crtc->lut_g[regno] << 8;
	*blue = intel_crtc->lut_b[regno] << 8;
}

static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
				 u16 *blue, uint32_t size)
				 u16 *blue, uint32_t size)
{
{
@@ -3835,6 +3845,7 @@ static const struct drm_crtc_helper_funcs intel_helper_funcs = {
	.mode_set_base = intel_pipe_set_base,
	.mode_set_base = intel_pipe_set_base,
	.prepare = intel_crtc_prepare,
	.prepare = intel_crtc_prepare,
	.commit = intel_crtc_commit,
	.commit = intel_crtc_commit,
	.load_lut = intel_crtc_load_lut,
};
};


static const struct drm_crtc_funcs intel_crtc_funcs = {
static const struct drm_crtc_funcs intel_crtc_funcs = {
+2 −0
Original line number Original line Diff line number Diff line
@@ -175,6 +175,8 @@ extern int intelfb_resize(struct drm_device *dev, struct drm_crtc *crtc);
extern void intelfb_restore(void);
extern void intelfb_restore(void);
extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
				    u16 blue, int regno);
				    u16 blue, int regno);
extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
				    u16 *blue, int regno);


extern int intel_framebuffer_create(struct drm_device *dev,
extern int intel_framebuffer_create(struct drm_device *dev,
				    struct drm_mode_fb_cmd *mode_cmd,
				    struct drm_mode_fb_cmd *mode_cmd,
+8 −2
Original line number Original line Diff line number Diff line
@@ -60,10 +60,12 @@ static struct fb_ops intelfb_ops = {
	.fb_imageblit = cfb_imageblit,
	.fb_imageblit = cfb_imageblit,
	.fb_pan_display = drm_fb_helper_pan_display,
	.fb_pan_display = drm_fb_helper_pan_display,
	.fb_blank = drm_fb_helper_blank,
	.fb_blank = drm_fb_helper_blank,
	.fb_setcmap = drm_fb_helper_setcmap,
};
};


static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
	.gamma_set = intel_crtc_fb_gamma_set,
	.gamma_set = intel_crtc_fb_gamma_set,
	.gamma_get = intel_crtc_fb_gamma_get,
};
};




@@ -123,6 +125,10 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width,
	struct device *device = &dev->pdev->dev;
	struct device *device = &dev->pdev->dev;
	int size, ret, mmio_bar = IS_I9XX(dev) ? 0 : 1;
	int size, ret, mmio_bar = IS_I9XX(dev) ? 0 : 1;


	/* we don't do packed 24bpp */
	if (surface_bpp == 24)
		surface_bpp = 32;

	mode_cmd.width = surface_width;
	mode_cmd.width = surface_width;
	mode_cmd.height = surface_height;
	mode_cmd.height = surface_height;


@@ -206,7 +212,7 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width,


//	memset(info->screen_base, 0, size);
//	memset(info->screen_base, 0, size);


	drm_fb_helper_fill_fix(info, fb->pitch);
	drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
	drm_fb_helper_fill_var(info, fb, fb_width, fb_height);
	drm_fb_helper_fill_var(info, fb, fb_width, fb_height);


	/* FIXME: we really shouldn't expose mmio space at all */
	/* FIXME: we really shouldn't expose mmio space at all */
@@ -244,7 +250,7 @@ int intelfb_probe(struct drm_device *dev)
	int ret;
	int ret;


	DRM_DEBUG("\n");
	DRM_DEBUG("\n");
	ret = drm_fb_helper_single_fb_probe(dev, intelfb_create);
	ret = drm_fb_helper_single_fb_probe(dev, 32, intelfb_create);
	return ret;
	return ret;
}
}
EXPORT_SYMBOL(intelfb_probe);
EXPORT_SYMBOL(intelfb_probe);
Loading