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

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

Merge remote branch 'korg/drm-radeon-next' into drm-linus

* korg/drm-radeon-next:
  drm/radeon/kms: rs600: use correct mask for SW interrupt
  gpu/drm/radeon/radeon_irq.c: move a dereference below a NULL test
  drm/radeon/radeon_device.c: move a dereference below a NULL test
  drm/radeon/radeon_fence.c: move a dereference below the NULL test
  drm/radeon/radeon_connectors.c: add a NULL test before dereference
  drm/radeon/kms: fix memory leak
  drm/radeon/kms: add missing breaks in i2c and ss lookups
  drm/radeon/kms: add primary dac adj values table
  drm/radeon/kms: fallback to default connector table
parents 90520b78 43b19f16
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -114,6 +114,7 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_dev
			i2c.i2c_id = gpio->sucI2cId.ucAccess;
			i2c.i2c_id = gpio->sucI2cId.ucAccess;


			i2c.valid = true;
			i2c.valid = true;
			break;
		}
		}
	}
	}


@@ -1026,6 +1027,7 @@ static struct radeon_atom_ss *radeon_atombios_get_ss_info(struct
				ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
				ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
				ss->range = ss_info->asSS_Info[i].ucSS_Range;
				ss->range = ss_info->asSS_Info[i].ucSS_Range;
				ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
				ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
				break;
			}
			}
		}
		}
	}
	}
+41 −9
Original line number Original line Diff line number Diff line
@@ -595,6 +595,34 @@ bool radeon_combios_get_clock_info(struct drm_device *dev)
	return false;
	return false;
}
}


static const uint32_t default_primarydac_adj[CHIP_LAST] = {
	0x00000808,		/* r100  */
	0x00000808,		/* rv100 */
	0x00000808,		/* rs100 */
	0x00000808,		/* rv200 */
	0x00000808,		/* rs200 */
	0x00000808,		/* r200  */
	0x00000808,		/* rv250 */
	0x00000000,		/* rs300 */
	0x00000808,		/* rv280 */
	0x00000808,		/* r300  */
	0x00000808,		/* r350  */
	0x00000808,		/* rv350 */
	0x00000808,		/* rv380 */
	0x00000808,		/* r420  */
	0x00000808,		/* r423  */
	0x00000808,		/* rv410 */
	0x00000000,		/* rs400 */
	0x00000000,		/* rs480 */
};

static void radeon_legacy_get_primary_dac_info_from_table(struct radeon_device *rdev,
							  struct radeon_encoder_primary_dac *p_dac)
{
	p_dac->ps2_pdac_adj = default_primarydac_adj[rdev->family];
	return;
}

struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
								       radeon_encoder
								       radeon_encoder
								       *encoder)
								       *encoder)
@@ -604,20 +632,20 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
	uint16_t dac_info;
	uint16_t dac_info;
	uint8_t rev, bg, dac;
	uint8_t rev, bg, dac;
	struct radeon_encoder_primary_dac *p_dac = NULL;
	struct radeon_encoder_primary_dac *p_dac = NULL;
	int found = 0;


	if (rdev->bios == NULL)
	p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac),
		return NULL;

	/* check CRT table */
	dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
	if (dac_info) {
		p_dac =
		    kzalloc(sizeof(struct radeon_encoder_primary_dac),
			GFP_KERNEL);
			GFP_KERNEL);


	if (!p_dac)
	if (!p_dac)
		return NULL;
		return NULL;


	if (rdev->bios == NULL)
		goto out;

	/* check CRT table */
	dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
	if (dac_info) {
		rev = RBIOS8(dac_info) & 0x3;
		rev = RBIOS8(dac_info) & 0x3;
		if (rev < 2) {
		if (rev < 2) {
			bg = RBIOS8(dac_info + 0x2) & 0xf;
			bg = RBIOS8(dac_info + 0x2) & 0xf;
@@ -628,9 +656,13 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
			dac = RBIOS8(dac_info + 0x3) & 0xf;
			dac = RBIOS8(dac_info + 0x3) & 0xf;
			p_dac->ps2_pdac_adj = (bg << 8) | (dac);
			p_dac->ps2_pdac_adj = (bg << 8) | (dac);
		}
		}

		found = 1;
	}
	}


out:
	if (!found) /* fallback to defaults */
		radeon_legacy_get_primary_dac_info_from_table(rdev, p_dac);

	return p_dac;
	return p_dac;
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -615,7 +615,7 @@ static enum drm_connector_status radeon_vga_detect(struct drm_connector *connect
				ret = connector_status_connected;
				ret = connector_status_connected;
		}
		}
	} else {
	} else {
		if (radeon_connector->dac_load_detect) {
		if (radeon_connector->dac_load_detect && encoder) {
			encoder_funcs = encoder->helper_private;
			encoder_funcs = encoder->helper_private;
			ret = encoder_funcs->detect(encoder, connector);
			ret = encoder_funcs->detect(encoder, connector);
		}
		}
+1 −0
Original line number Original line Diff line number Diff line
@@ -2145,6 +2145,7 @@ int radeon_master_create(struct drm_device *dev, struct drm_master *master)
			 &master_priv->sarea);
			 &master_priv->sarea);
	if (ret) {
	if (ret) {
		DRM_ERROR("SAREA setup failed\n");
		DRM_ERROR("SAREA setup failed\n");
		kfree(master_priv);
		return ret;
		return ret;
	}
	}
	master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea);
	master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea);
+4 −2
Original line number Original line Diff line number Diff line
@@ -733,16 +733,18 @@ void radeon_device_fini(struct radeon_device *rdev)
 */
 */
int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
{
{
	struct radeon_device *rdev = dev->dev_private;
	struct radeon_device *rdev;
	struct drm_crtc *crtc;
	struct drm_crtc *crtc;
	int r;
	int r;


	if (dev == NULL || rdev == NULL) {
	if (dev == NULL || dev->dev_private == NULL) {
		return -ENODEV;
		return -ENODEV;
	}
	}
	if (state.event == PM_EVENT_PRETHAW) {
	if (state.event == PM_EVENT_PRETHAW) {
		return 0;
		return 0;
	}
	}
	rdev = dev->dev_private;

	/* unpin the front buffers */
	/* unpin the front buffers */
	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
		struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->fb);
		struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->fb);
Loading