diff options
Diffstat (limited to 'drivers/gpu/drm')
22 files changed, 146 insertions, 109 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 792c3e3795c..dd64a06dc5b 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -2326,7 +2326,6 @@ int drm_mode_addfb(struct drm_device *dev,  	fb = dev->mode_config.funcs->fb_create(dev, file_priv, &r);  	if (IS_ERR(fb)) {  		DRM_DEBUG_KMS("could not create framebuffer\n"); -		drm_modeset_unlock_all(dev);  		return PTR_ERR(fb);  	} @@ -2506,7 +2505,6 @@ int drm_mode_addfb2(struct drm_device *dev,  	fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);  	if (IS_ERR(fb)) {  		DRM_DEBUG_KMS("could not create framebuffer\n"); -		drm_modeset_unlock_all(dev);  		return PTR_ERR(fb);  	} diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 59d6b9bf204..892ff9f9597 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1544,10 +1544,10 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)  	if (!fb_helper->fb)  		return 0; -	drm_modeset_lock_all(dev); +	mutex_lock(&fb_helper->dev->mode_config.mutex);  	if (!drm_fb_helper_is_bound(fb_helper)) {  		fb_helper->delayed_hotplug = true; -		drm_modeset_unlock_all(dev); +		mutex_unlock(&fb_helper->dev->mode_config.mutex);  		return 0;  	}  	DRM_DEBUG_KMS("\n"); @@ -1558,9 +1558,11 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)  	count = drm_fb_helper_probe_connector_modes(fb_helper, max_width,  						    max_height); +	mutex_unlock(&fb_helper->dev->mode_config.mutex); + +	drm_modeset_lock_all(dev);  	drm_setup_crtcs(fb_helper);  	drm_modeset_unlock_all(dev); -  	drm_fb_helper_set_par(fb_helper->fbdev);  	return 0; diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index 13fdcd10a60..429e07d0b0f 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c @@ -123,6 +123,7 @@ int drm_open(struct inode *inode, struct file *filp)  	int retcode = 0;  	int need_setup = 0;  	struct address_space *old_mapping; +	struct address_space *old_imapping;  	minor = idr_find(&drm_minors_idr, minor_id);  	if (!minor) @@ -137,6 +138,7 @@ int drm_open(struct inode *inode, struct file *filp)  	if (!dev->open_count++)  		need_setup = 1;  	mutex_lock(&dev->struct_mutex); +	old_imapping = inode->i_mapping;  	old_mapping = dev->dev_mapping;  	if (old_mapping == NULL)  		dev->dev_mapping = &inode->i_data; @@ -159,8 +161,8 @@ int drm_open(struct inode *inode, struct file *filp)  err_undo:  	mutex_lock(&dev->struct_mutex); -	filp->f_mapping = old_mapping; -	inode->i_mapping = old_mapping; +	filp->f_mapping = old_imapping; +	inode->i_mapping = old_imapping;  	iput(container_of(dev->dev_mapping, struct inode, i_data));  	dev->dev_mapping = old_mapping;  	mutex_unlock(&dev->struct_mutex); diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 04fa6f1808d..f83f0719922 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c @@ -506,7 +506,7 @@ drm_gtf_mode(struct drm_device *dev, int hdisplay, int vdisplay, int vrefresh,  }  EXPORT_SYMBOL(drm_gtf_mode); -#if IS_ENABLED(CONFIG_VIDEOMODE) +#ifdef CONFIG_VIDEOMODE_HELPERS  int drm_display_mode_from_videomode(const struct videomode *vm,  				    struct drm_display_mode *dmode)  { @@ -523,26 +523,25 @@ int drm_display_mode_from_videomode(const struct videomode *vm,  	dmode->clock = vm->pixelclock / 1000;  	dmode->flags = 0; -	if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH) +	if (vm->flags & DISPLAY_FLAGS_HSYNC_HIGH)  		dmode->flags |= DRM_MODE_FLAG_PHSYNC; -	else if (vm->dmt_flags & VESA_DMT_HSYNC_LOW) +	else if (vm->flags & DISPLAY_FLAGS_HSYNC_LOW)  		dmode->flags |= DRM_MODE_FLAG_NHSYNC; -	if (vm->dmt_flags & VESA_DMT_VSYNC_HIGH) +	if (vm->flags & DISPLAY_FLAGS_VSYNC_HIGH)  		dmode->flags |= DRM_MODE_FLAG_PVSYNC; -	else if (vm->dmt_flags & VESA_DMT_VSYNC_LOW) +	else if (vm->flags & DISPLAY_FLAGS_VSYNC_LOW)  		dmode->flags |= DRM_MODE_FLAG_NVSYNC; -	if (vm->data_flags & DISPLAY_FLAGS_INTERLACED) +	if (vm->flags & DISPLAY_FLAGS_INTERLACED)  		dmode->flags |= DRM_MODE_FLAG_INTERLACE; -	if (vm->data_flags & DISPLAY_FLAGS_DOUBLESCAN) +	if (vm->flags & DISPLAY_FLAGS_DOUBLESCAN)  		dmode->flags |= DRM_MODE_FLAG_DBLSCAN;  	drm_mode_set_name(dmode);  	return 0;  }  EXPORT_SYMBOL_GPL(drm_display_mode_from_videomode); -#endif -#if IS_ENABLED(CONFIG_OF_VIDEOMODE) +#ifdef CONFIG_OF  /**   * of_get_drm_display_mode - get a drm_display_mode from devicetree   * @np: device_node with the timing specification @@ -572,7 +571,8 @@ int of_get_drm_display_mode(struct device_node *np,  	return 0;  }  EXPORT_SYMBOL_GPL(of_get_drm_display_mode); -#endif +#endif /* CONFIG_OF */ +#endif /* CONFIG_VIDEOMODE_HELPERS */  /**   * drm_mode_set_name - set the name on a mode diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c index ff5456b7df7..d7f2324b4fb 100644 --- a/drivers/gpu/drm/drm_proc.c +++ b/drivers/gpu/drm/drm_proc.c @@ -49,7 +49,7 @@  /**   * Proc file list.   */ -static struct drm_info_list drm_proc_list[] = { +static const struct drm_info_list drm_proc_list[] = {  	{"name", drm_name_info, 0},  	{"vm", drm_vm_info, 0},  	{"clients", drm_clients_info, 0}, @@ -63,7 +63,7 @@ static struct drm_info_list drm_proc_list[] = {  static int drm_proc_open(struct inode *inode, struct file *file)  { -	struct drm_info_node* node = PDE(inode)->data; +	struct drm_info_node* node = PDE_DATA(inode);  	return single_open(file, node->info_ent->show, node);  } @@ -89,13 +89,13 @@ static const struct file_operations drm_proc_fops = {   * Create a given set of proc files represented by an array of   * gdm_proc_lists in the given root directory.   */ -static int drm_proc_create_files(struct drm_info_list *files, int count, +static int drm_proc_create_files(const struct drm_info_list *files, int count,  			  struct proc_dir_entry *root, struct drm_minor *minor)  {  	struct drm_device *dev = minor->dev;  	struct proc_dir_entry *ent;  	struct drm_info_node *tmp; -	int i, ret; +	int i;  	for (i = 0; i < count; i++) {  		u32 features = files[i].driver_features; @@ -105,10 +105,9 @@ static int drm_proc_create_files(struct drm_info_list *files, int count,  			continue;  		tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL); -		if (tmp == NULL) { -			ret = -1; -			goto fail; -		} +		if (!tmp) +			return -1; +  		tmp->minor = minor;  		tmp->info_ent = &files[i];  		list_add(&tmp->list, &minor->proc_nodes.list); @@ -116,28 +115,20 @@ static int drm_proc_create_files(struct drm_info_list *files, int count,  		ent = proc_create_data(files[i].name, S_IRUGO, root,  				       &drm_proc_fops, tmp);  		if (!ent) { -			DRM_ERROR("Cannot create /proc/dri/%s/%s\n", -				  root->name, files[i].name); +			DRM_ERROR("Cannot create /proc/dri/%u/%s\n", +				  minor->index, files[i].name);  			list_del(&tmp->list);  			kfree(tmp); -			ret = -1; -			goto fail; +			return -1;  		} -  	}  	return 0; - -fail: -	for (i = 0; i < count; i++) -		remove_proc_entry(drm_proc_list[i].name, minor->proc_root); -	return ret;  }  /**   * Initialize the DRI proc filesystem for a device   *   * \param dev DRM device - * \param minor device minor number   * \param root DRI proc dir entry.   * \param dev_root resulting DRI device proc dir entry.   * \return root entry pointer on success, or NULL on failure. @@ -146,14 +137,13 @@ fail:   * "/proc/dri/%minor%/", and each entry in proc_list as   * "/proc/dri/%minor%/%name%".   */ -int drm_proc_init(struct drm_minor *minor, int minor_id, -		  struct proc_dir_entry *root) +int drm_proc_init(struct drm_minor *minor, struct proc_dir_entry *root)  { -	char name[64]; +	char name[12];  	int ret;  	INIT_LIST_HEAD(&minor->proc_nodes.list); -	sprintf(name, "%d", minor_id); +	sprintf(name, "%u", minor->index);  	minor->proc_root = proc_mkdir(name, root);  	if (!minor->proc_root) {  		DRM_ERROR("Cannot create /proc/dri/%s\n", name); @@ -163,7 +153,7 @@ int drm_proc_init(struct drm_minor *minor, int minor_id,  	ret = drm_proc_create_files(drm_proc_list, DRM_PROC_ENTRIES,  				    minor->proc_root, minor);  	if (ret) { -		remove_proc_entry(name, root); +		remove_proc_subtree(name, root);  		minor->proc_root = NULL;  		DRM_ERROR("Failed to create core drm proc files\n");  		return ret; @@ -172,7 +162,7 @@ int drm_proc_init(struct drm_minor *minor, int minor_id,  	return 0;  } -static int drm_proc_remove_files(struct drm_info_list *files, int count, +static int drm_proc_remove_files(const struct drm_info_list *files, int count,  			  struct drm_minor *minor)  {  	struct list_head *pos, *q; @@ -213,8 +203,7 @@ int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root)  	drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor);  	sprintf(name, "%d", minor->index); -	remove_proc_entry(name, root); - +	remove_proc_subtree(name, root);  	return 0;  } diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 7d30802a018..16f3ec579b3 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -352,7 +352,7 @@ int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type)  	idr_replace(&drm_minors_idr, new_minor, minor_id);  	if (type == DRM_MINOR_LEGACY) { -		ret = drm_proc_init(new_minor, minor_id, drm_proc_root); +		ret = drm_proc_init(new_minor, drm_proc_root);  		if (ret) {  			DRM_ERROR("DRM: Failed to initialize /proc/dri.\n");  			goto err_mem; diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 3b11ab0fbc9..9a48e1a2d41 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -57,7 +57,7 @@ eb_create(struct drm_i915_gem_execbuffer2 *args)  	if (eb == NULL) {  		int size = args->buffer_count;  		int count = PAGE_SIZE / sizeof(struct hlist_head) / 2; -		BUILD_BUG_ON(!is_power_of_2(PAGE_SIZE / sizeof(struct hlist_head))); +		BUILD_BUG_ON_NOT_POWER_OF_2(PAGE_SIZE / sizeof(struct hlist_head));  		while (count > 2*size)  			count >>= 1;  		eb = kzalloc(count*sizeof(struct hlist_head) + diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 32a3693905e..1ce45a0a2d3 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -45,6 +45,9 @@  struct intel_crt {  	struct intel_encoder base; +	/* DPMS state is stored in the connector, which we need in the +	 * encoder's enable/disable callbacks */ +	struct intel_connector *connector;  	bool force_hotplug_required;  	u32 adpa_reg;  }; @@ -81,29 +84,6 @@ static bool intel_crt_get_hw_state(struct intel_encoder *encoder,  	return true;  } -static void intel_disable_crt(struct intel_encoder *encoder) -{ -	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; -	struct intel_crt *crt = intel_encoder_to_crt(encoder); -	u32 temp; - -	temp = I915_READ(crt->adpa_reg); -	temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE; -	temp &= ~ADPA_DAC_ENABLE; -	I915_WRITE(crt->adpa_reg, temp); -} - -static void intel_enable_crt(struct intel_encoder *encoder) -{ -	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; -	struct intel_crt *crt = intel_encoder_to_crt(encoder); -	u32 temp; - -	temp = I915_READ(crt->adpa_reg); -	temp |= ADPA_DAC_ENABLE; -	I915_WRITE(crt->adpa_reg, temp); -} -  /* Note: The caller is required to filter out dpms modes not supported by the   * platform. */  static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode) @@ -135,6 +115,19 @@ static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode)  	I915_WRITE(crt->adpa_reg, temp);  } +static void intel_disable_crt(struct intel_encoder *encoder) +{ +	intel_crt_set_dpms(encoder, DRM_MODE_DPMS_OFF); +} + +static void intel_enable_crt(struct intel_encoder *encoder) +{ +	struct intel_crt *crt = intel_encoder_to_crt(encoder); + +	intel_crt_set_dpms(encoder, crt->connector->base.dpms); +} + +  static void intel_crt_dpms(struct drm_connector *connector, int mode)  {  	struct drm_device *dev = connector->dev; @@ -746,6 +739,7 @@ void intel_crt_init(struct drm_device *dev)  	}  	connector = &intel_connector->base; +	crt->connector = intel_connector;  	drm_connector_init(dev, &intel_connector->base,  			   &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA); diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index d7d4afe0134..c3f5bd8a507 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -2028,7 +2028,7 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp)  	}  	if (channel_eq) -		DRM_DEBUG_KMS("Channel EQ done. DP Training successfull\n"); +		DRM_DEBUG_KMS("Channel EQ done. DP Training successful\n");  	intel_dp_set_link_train(intel_dp, DP, DP_TRAINING_PATTERN_DISABLE);  } @@ -2559,12 +2559,15 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)  {  	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);  	struct intel_dp *intel_dp = &intel_dig_port->dp; +	struct drm_device *dev = intel_dp_to_dev(intel_dp);  	i2c_del_adapter(&intel_dp->adapter);  	drm_encoder_cleanup(encoder);  	if (is_edp(intel_dp)) {  		cancel_delayed_work_sync(&intel_dp->panel_vdd_work); +		mutex_lock(&dev->mode_config.mutex);  		ironlake_panel_vdd_off_sync(intel_dp); +		mutex_unlock(&dev->mode_config.mutex);  	}  	kfree(intel_dig_port);  } diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index 4d338740f2c..a8117e61400 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c @@ -350,11 +350,11 @@ static void intel_didl_outputs(struct drm_device *dev)  	if (!handle || acpi_bus_get_device(handle, &acpi_dev))  		return; -	if (acpi_is_video_device(acpi_dev)) +	if (acpi_is_video_device(handle))  		acpi_video_bus = acpi_dev;  	else {  		list_for_each_entry(acpi_cdev, &acpi_dev->children, node) { -			if (acpi_is_video_device(acpi_cdev)) { +			if (acpi_is_video_device(acpi_cdev->handle)) {  				acpi_video_bus = acpi_cdev;  				break;  			} diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d07a8cdf998..78413ec623c 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -451,7 +451,7 @@ static bool intel_sdvo_write_cmd(struct intel_sdvo *intel_sdvo, u8 cmd,  	int i, ret = true;          /* Would be simpler to allocate both in one go ? */         -	buf = (u8 *)kzalloc(args_len * 2 + 2, GFP_KERNEL); +	buf = kzalloc(args_len * 2 + 2, GFP_KERNEL);  	if (!buf)  		return false; diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index fe22bb780e1..78d8e919509 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -751,8 +751,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  	int i;  	unsigned char misc = 0;  	unsigned char ext_vga[6]; -	unsigned char ext_vga_index24; -	unsigned char dac_index90 = 0;  	u8 bppshift;  	static unsigned char dacvalue[] = { @@ -803,7 +801,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  		option2 = 0x0000b000;  		break;  	case G200_ER: -		dac_index90 = 0;  		break;  	} @@ -852,10 +849,8 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  		WREG_DAC(i, dacvalue[i]);  	} -	if (mdev->type == G200_ER) { -		WREG_DAC(0x90, dac_index90); -	} - +	if (mdev->type == G200_ER) +		WREG_DAC(0x90, 0);  	if (option)  		pci_write_config_dword(dev->pdev, PCI_MGA_OPTION, option); @@ -952,8 +947,6 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  	if (mdev->type == G200_WB)  		ext_vga[1] |= 0x88; -	ext_vga_index24 = 0x05; -  	/* Set pixel clocks */  	misc = 0x2d;  	WREG8(MGA_MISC_OUT, misc); @@ -965,7 +958,7 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  	}  	if (mdev->type == G200_ER) -		WREG_ECRT(24, ext_vga_index24); +		WREG_ECRT(0x24, 0x5);  	if (mdev->type == G200_EV) {  		WREG_ECRT(6, 0); diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c index e816f06637a..0e2c1a4f165 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c @@ -248,6 +248,22 @@ nouveau_bios_shadow_pci(struct nouveau_bios *bios)  	}  } +static void +nouveau_bios_shadow_platform(struct nouveau_bios *bios) +{ +	struct pci_dev *pdev = nv_device(bios)->pdev; +	size_t size; + +	void __iomem *rom = pci_platform_rom(pdev, &size); +	if (rom && size) { +		bios->data = kmalloc(size, GFP_KERNEL); +		if (bios->data) { +			memcpy_fromio(bios->data, rom, size); +			bios->size = size; +		} +	} +} +  static int  nouveau_bios_score(struct nouveau_bios *bios, const bool writeable)  { @@ -288,6 +304,7 @@ nouveau_bios_shadow(struct nouveau_bios *bios)  		{ "PROM", nouveau_bios_shadow_prom, false, 0, 0, NULL },  		{ "ACPI", nouveau_bios_shadow_acpi, true, 0, 0, NULL },  		{ "PCIROM", nouveau_bios_shadow_pci, true, 0, 0, NULL }, +		{ "PLATFORM", nouveau_bios_shadow_platform, true, 0, 0, NULL },  		{}  	};  	struct methods *mthd, *best; diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c index 3b6dc883e15..5eb3e0da7c6 100644 --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c @@ -391,7 +391,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)  	struct nouveau_drm *drm = nouveau_drm(dev);  	struct nouveau_device *device = nv_device(drm->device);  	struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); -	struct nouveau_abi16_chan *chan, *temp; +	struct nouveau_abi16_chan *chan = NULL, *temp;  	struct nouveau_abi16_ntfy *ntfy;  	struct nouveau_object *object;  	struct nv_dma_class args = {}; @@ -404,10 +404,11 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)  	if (unlikely(nv_device(abi16->device)->card_type >= NV_C0))  		return nouveau_abi16_put(abi16, -EINVAL); -	list_for_each_entry_safe(chan, temp, &abi16->channels, head) { -		if (chan->chan->handle == (NVDRM_CHAN | info->channel)) +	list_for_each_entry(temp, &abi16->channels, head) { +		if (temp->chan->handle == (NVDRM_CHAN | info->channel)) { +			chan = temp;  			break; -		chan = NULL; +		}  	}  	if (!chan) @@ -459,17 +460,18 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS)  {  	struct drm_nouveau_gpuobj_free *fini = data;  	struct nouveau_abi16 *abi16 = nouveau_abi16_get(file_priv, dev); -	struct nouveau_abi16_chan *chan, *temp; +	struct nouveau_abi16_chan *chan = NULL, *temp;  	struct nouveau_abi16_ntfy *ntfy;  	int ret;  	if (unlikely(!abi16))  		return -ENOMEM; -	list_for_each_entry_safe(chan, temp, &abi16->channels, head) { -		if (chan->chan->handle == (NVDRM_CHAN | fini->channel)) +	list_for_each_entry(temp, &abi16->channels, head) { +		if (temp->chan->handle == (NVDRM_CHAN | fini->channel)) { +			chan = temp;  			break; -		chan = NULL; +		}  	}  	if (!chan) diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index d1099365bfc..c95decf543e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c @@ -72,11 +72,25 @@ module_param_named(modeset, nouveau_modeset, int, 0400);  static struct drm_driver driver;  static int +nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head) +{ +	struct nouveau_drm *drm = +		container_of(event, struct nouveau_drm, vblank[head]); +	drm_handle_vblank(drm->dev, head); +	return NVKM_EVENT_KEEP; +} + +static int  nouveau_drm_vblank_enable(struct drm_device *dev, int head)  {  	struct nouveau_drm *drm = nouveau_drm(dev);  	struct nouveau_disp *pdisp = nouveau_disp(drm->device); -	nouveau_event_get(pdisp->vblank, head, &drm->vblank); + +	if (WARN_ON_ONCE(head > ARRAY_SIZE(drm->vblank))) +		return -EIO; +	WARN_ON_ONCE(drm->vblank[head].func); +	drm->vblank[head].func = nouveau_drm_vblank_handler; +	nouveau_event_get(pdisp->vblank, head, &drm->vblank[head]);  	return 0;  } @@ -85,16 +99,11 @@ nouveau_drm_vblank_disable(struct drm_device *dev, int head)  {  	struct nouveau_drm *drm = nouveau_drm(dev);  	struct nouveau_disp *pdisp = nouveau_disp(drm->device); -	nouveau_event_put(pdisp->vblank, head, &drm->vblank); -} - -static int -nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head) -{ -	struct nouveau_drm *drm = -		container_of(event, struct nouveau_drm, vblank); -	drm_handle_vblank(drm->dev, head); -	return NVKM_EVENT_KEEP; +	if (drm->vblank[head].func) +		nouveau_event_put(pdisp->vblank, head, &drm->vblank[head]); +	else +		WARN_ON_ONCE(1); +	drm->vblank[head].func = NULL;  }  static u64 @@ -292,7 +301,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)  	dev->dev_private = drm;  	drm->dev = dev; -	drm->vblank.func = nouveau_drm_vblank_handler;  	INIT_LIST_HEAD(&drm->clients);  	spin_lock_init(&drm->tile.lock); diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.h b/drivers/gpu/drm/nouveau/nouveau_drm.h index b25df374c90..9c39bafbef2 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.h +++ b/drivers/gpu/drm/nouveau/nouveau_drm.h @@ -113,7 +113,7 @@ struct nouveau_drm {  	struct nvbios vbios;  	struct nouveau_display *display;  	struct backlight_device *backlight; -	struct nouveau_eventh vblank; +	struct nouveau_eventh vblank[4];  	/* power management */  	struct nouveau_pm *pm; diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 7f0e6c3f37d..1ddc03e51bf 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c @@ -479,7 +479,7 @@ nv50_display_flip_wait(void *data)  {  	struct nv50_display_flip *flip = data;  	if (nouveau_bo_rd32(flip->disp->sync, flip->chan->addr / 4) == -					      flip->chan->data); +					      flip->chan->data)  		return true;  	usleep_range(1, 2);  	return false; diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index b8015913d38..fa3c56fba29 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c @@ -99,6 +99,29 @@ static bool radeon_read_bios(struct radeon_device *rdev)  	return true;  } +static bool radeon_read_platform_bios(struct radeon_device *rdev) +{ +	uint8_t __iomem *bios; +	size_t size; + +	rdev->bios = NULL; + +	bios = pci_platform_rom(rdev->pdev, &size); +	if (!bios) { +		return false; +	} + +	if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) { +		return false; +	} +	rdev->bios = kmemdup(bios, size, GFP_KERNEL); +	if (rdev->bios == NULL) { +		return false; +	} + +	return true; +} +  #ifdef CONFIG_ACPI  /* ATRM is used to get the BIOS on the discrete cards in   * dual-gpu systems. @@ -620,6 +643,9 @@ bool radeon_get_bios(struct radeon_device *rdev)  	if (r == false) {  		r = radeon_read_disabled_bios(rdev);  	} +	if (r == false) { +		r = radeon_read_platform_bios(rdev); +	}  	if (r == false || rdev->bios == NULL) {  		DRM_ERROR("Unable to locate a BIOS ROM\n");  		rdev->bios = NULL; diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index 48f80cd42d8..5a99d433fc3 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c @@ -270,7 +270,7 @@ int radeon_irq_kms_init(struct radeon_device *rdev)  }  /** - * radeon_irq_kms_fini - tear down driver interrrupt info + * radeon_irq_kms_fini - tear down driver interrupt info   *   * @rdev: radeon device pointer   * diff --git a/drivers/gpu/drm/tilcdc/Kconfig b/drivers/gpu/drm/tilcdc/Kconfig index d24d0401347..e461e997245 100644 --- a/drivers/gpu/drm/tilcdc/Kconfig +++ b/drivers/gpu/drm/tilcdc/Kconfig @@ -4,8 +4,7 @@ config DRM_TILCDC  	select DRM_KMS_HELPER  	select DRM_KMS_CMA_HELPER  	select DRM_GEM_CMA_HELPER -	select OF_VIDEOMODE -	select OF_DISPLAY_TIMING +	select VIDEOMODE_HELPERS  	select BACKLIGHT_CLASS_DEVICE  	help  	  Choose this option if you have an TI SoC with LCDC display diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index 580b74e2022..90ee4978637 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c @@ -173,7 +173,7 @@ static int panel_connector_get_modes(struct drm_connector *connector)  		struct drm_display_mode *mode = drm_mode_create(dev);  		struct videomode vm; -		if (videomode_from_timing(timings, &vm, i)) +		if (videomode_from_timings(timings, &vm, i))  			break;  		drm_display_mode_from_videomode(&vm, mode); diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c index fe5cdbcf263..b44d548c56f 100644 --- a/drivers/gpu/drm/udl/udl_connector.c +++ b/drivers/gpu/drm/udl/udl_connector.c @@ -61,6 +61,10 @@ static int udl_get_modes(struct drm_connector *connector)  	int ret;  	edid = (struct edid *)udl_get_edid(udl); +	if (!edid) { +		drm_mode_connector_update_edid_property(connector, NULL); +		return 0; +	}  	/*  	 * We only read the main block, but if the monitor reports extension  | 
