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

Commit 35838b47 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-next-2016-11-21' of git://anongit.freedesktop.org/git/drm-intel into drm-next

Final 4.10 updates:

- fine-tune fb flushing and tracking (Chris Wilson)
- refactor state check dumper code for more conciseness (Tvrtko)
- roll out dev_priv all over the place (Tvrkto)
- finally remove __i915__ magic macro (Tvrtko)
- more gvt bugfixes (Zhenyu&team)
- better opregion CADL handling (Jani)
- refactor/clean up wm programming (Maarten)
- gpu scheduler + priority boosting for flips as first user (Chris
  Wilson)
- make fbc use more atomic (Paulo)
- initial kvm-gvt framework, but not yet complete (Zhenyu&team)

* tag 'drm-intel-next-2016-11-21' of git://anongit.freedesktop.org/git/drm-intel: (127 commits)
  drm/i915: Update DRIVER_DATE to 20161121
  drm/i915: Skip final clflush if LLC is coherent
  drm/i915: Always flush the dirty CPU cache when pinning the scanout
  drm/i915: Don't touch NULL sg on i915_gem_object_get_pages_gtt() error
  drm/i915: Check that each request phase is completed before retiring
  drm/i915: i915_pages_create_for_stolen should return err ptr
  drm/i915: Enable support for nonblocking modeset
  drm/i915: Be more careful to drop the GT wakeref
  drm/i915: Move frontbuffer CS write tracking from ggtt vma to object
  drm/i915: Only dump dp_m2_n2 configuration when drrs is used
  drm/i915: don't leak global_timeline
  drm/i915: add i915_address_space_fini
  drm/i915: Add a few more sanity checks for stolen handling
  drm/i915: Waterproof verification of gen9 forcewake table ranges
  drm/i915: Introduce enableddisabled helper
  drm/i915: Only dump possible panel fitter config for the platform
  drm/i915: Only dump scaler config where supported
  drm/i915: Compact a few pipe config debug lines
  drm/i915: Don't log pipe config kernel pointer and duplicated pipe name
  drm/i915: Dump FDI config only where applicable
  ...
parents 63207455 e9cbc4bd
Loading
Loading
Loading
Loading
+13 −1
Original line number Original line Diff line number Diff line
@@ -29,9 +29,20 @@ struct kvm_page_track_notifier_node {
	 * @gpa: the physical address written by guest.
	 * @gpa: the physical address written by guest.
	 * @new: the data was written to the address.
	 * @new: the data was written to the address.
	 * @bytes: the written length.
	 * @bytes: the written length.
	 * @node: this node
	 */
	 */
	void (*track_write)(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
	void (*track_write)(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
			    int bytes);
			    int bytes, struct kvm_page_track_notifier_node *node);
	/*
	 * It is called when memory slot is being moved or removed
	 * users can drop write-protection for the pages in that memory slot
	 *
	 * @kvm: the kvm where memory slot being moved or removed
	 * @slot: the memory slot being moved or removed
	 * @node: this node
	 */
	void (*track_flush_slot)(struct kvm *kvm, struct kvm_memory_slot *slot,
			    struct kvm_page_track_notifier_node *node);
};
};


void kvm_page_track_init(struct kvm *kvm);
void kvm_page_track_init(struct kvm *kvm);
@@ -58,4 +69,5 @@ kvm_page_track_unregister_notifier(struct kvm *kvm,
				   struct kvm_page_track_notifier_node *n);
				   struct kvm_page_track_notifier_node *n);
void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
			  int bytes);
			  int bytes);
void kvm_page_track_flush_slot(struct kvm *kvm, struct kvm_memory_slot *slot);
#endif
#endif
+10 −1
Original line number Original line Diff line number Diff line
@@ -4405,7 +4405,8 @@ static u64 *get_written_sptes(struct kvm_mmu_page *sp, gpa_t gpa, int *nspte)
}
}


static void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
static void kvm_mmu_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa,
			      const u8 *new, int bytes)
			      const u8 *new, int bytes,
			      struct kvm_page_track_notifier_node *node)
{
{
	gfn_t gfn = gpa >> PAGE_SHIFT;
	gfn_t gfn = gpa >> PAGE_SHIFT;
	struct kvm_mmu_page *sp;
	struct kvm_mmu_page *sp;
@@ -4617,11 +4618,19 @@ void kvm_mmu_setup(struct kvm_vcpu *vcpu)
	init_kvm_mmu(vcpu);
	init_kvm_mmu(vcpu);
}
}


static void kvm_mmu_invalidate_zap_pages_in_memslot(struct kvm *kvm,
			struct kvm_memory_slot *slot,
			struct kvm_page_track_notifier_node *node)
{
	kvm_mmu_invalidate_zap_all_pages(kvm);
}

void kvm_mmu_init_vm(struct kvm *kvm)
void kvm_mmu_init_vm(struct kvm *kvm)
{
{
	struct kvm_page_track_notifier_node *node = &kvm->arch.mmu_sp_tracker;
	struct kvm_page_track_notifier_node *node = &kvm->arch.mmu_sp_tracker;


	node->track_write = kvm_mmu_pte_write;
	node->track_write = kvm_mmu_pte_write;
	node->track_flush_slot = kvm_mmu_invalidate_zap_pages_in_memslot;
	kvm_page_track_register_notifier(kvm, node);
	kvm_page_track_register_notifier(kvm, node);
}
}


+30 −1
Original line number Original line Diff line number Diff line
@@ -106,6 +106,7 @@ void kvm_slot_page_track_add_page(struct kvm *kvm,
		if (kvm_mmu_slot_gfn_write_protect(kvm, slot, gfn))
		if (kvm_mmu_slot_gfn_write_protect(kvm, slot, gfn))
			kvm_flush_remote_tlbs(kvm);
			kvm_flush_remote_tlbs(kvm);
}
}
EXPORT_SYMBOL_GPL(kvm_slot_page_track_add_page);


/*
/*
 * remove the guest page from the tracking pool which stops the interception
 * remove the guest page from the tracking pool which stops the interception
@@ -135,6 +136,7 @@ void kvm_slot_page_track_remove_page(struct kvm *kvm,
	 */
	 */
	kvm_mmu_gfn_allow_lpage(slot, gfn);
	kvm_mmu_gfn_allow_lpage(slot, gfn);
}
}
EXPORT_SYMBOL_GPL(kvm_slot_page_track_remove_page);


/*
/*
 * check if the corresponding access on the specified guest page is tracked.
 * check if the corresponding access on the specified guest page is tracked.
@@ -181,6 +183,7 @@ kvm_page_track_register_notifier(struct kvm *kvm,
	hlist_add_head_rcu(&n->node, &head->track_notifier_list);
	hlist_add_head_rcu(&n->node, &head->track_notifier_list);
	spin_unlock(&kvm->mmu_lock);
	spin_unlock(&kvm->mmu_lock);
}
}
EXPORT_SYMBOL_GPL(kvm_page_track_register_notifier);


/*
/*
 * stop receiving the event interception. It is the opposed operation of
 * stop receiving the event interception. It is the opposed operation of
@@ -199,6 +202,7 @@ kvm_page_track_unregister_notifier(struct kvm *kvm,
	spin_unlock(&kvm->mmu_lock);
	spin_unlock(&kvm->mmu_lock);
	synchronize_srcu(&head->track_srcu);
	synchronize_srcu(&head->track_srcu);
}
}
EXPORT_SYMBOL_GPL(kvm_page_track_unregister_notifier);


/*
/*
 * Notify the node that write access is intercepted and write emulation is
 * Notify the node that write access is intercepted and write emulation is
@@ -222,6 +226,31 @@ void kvm_page_track_write(struct kvm_vcpu *vcpu, gpa_t gpa, const u8 *new,
	idx = srcu_read_lock(&head->track_srcu);
	idx = srcu_read_lock(&head->track_srcu);
	hlist_for_each_entry_rcu(n, &head->track_notifier_list, node)
	hlist_for_each_entry_rcu(n, &head->track_notifier_list, node)
		if (n->track_write)
		if (n->track_write)
			n->track_write(vcpu, gpa, new, bytes);
			n->track_write(vcpu, gpa, new, bytes, n);
	srcu_read_unlock(&head->track_srcu, idx);
}

/*
 * Notify the node that memory slot is being removed or moved so that it can
 * drop write-protection for the pages in the memory slot.
 *
 * The node should figure out it has any write-protected pages in this slot
 * by itself.
 */
void kvm_page_track_flush_slot(struct kvm *kvm, struct kvm_memory_slot *slot)
{
	struct kvm_page_track_notifier_head *head;
	struct kvm_page_track_notifier_node *n;
	int idx;

	head = &kvm->arch.track_notifier_head;

	if (hlist_empty(&head->track_notifier_list))
		return;

	idx = srcu_read_lock(&head->track_srcu);
	hlist_for_each_entry_rcu(n, &head->track_notifier_list, node)
		if (n->track_flush_slot)
			n->track_flush_slot(kvm, slot, n);
	srcu_read_unlock(&head->track_srcu, idx);
	srcu_read_unlock(&head->track_srcu, idx);
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -8155,7 +8155,7 @@ void kvm_arch_flush_shadow_all(struct kvm *kvm)
void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
				   struct kvm_memory_slot *slot)
				   struct kvm_memory_slot *slot)
{
{
	kvm_mmu_invalidate_zap_all_pages(kvm);
	kvm_page_track_flush_slot(kvm, slot);
}
}


static inline bool kvm_vcpu_has_events(struct kvm_vcpu *vcpu)
static inline bool kvm_vcpu_has_events(struct kvm_vcpu *vcpu)
+0 −26
Original line number Original line Diff line number Diff line
@@ -3610,32 +3610,6 @@ int drm_av_sync_delay(struct drm_connector *connector,
}
}
EXPORT_SYMBOL(drm_av_sync_delay);
EXPORT_SYMBOL(drm_av_sync_delay);


/**
 * drm_select_eld - select one ELD from multiple HDMI/DP sinks
 * @encoder: the encoder just changed display mode
 *
 * It's possible for one encoder to be associated with multiple HDMI/DP sinks.
 * The policy is now hard coded to simply use the first HDMI/DP sink's ELD.
 *
 * Return: The connector associated with the first HDMI/DP sink that has ELD
 * attached to it.
 */
struct drm_connector *drm_select_eld(struct drm_encoder *encoder)
{
	struct drm_connector *connector;
	struct drm_device *dev = encoder->dev;

	WARN_ON(!mutex_is_locked(&dev->mode_config.mutex));
	WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));

	drm_for_each_connector(connector, dev)
		if (connector->encoder == encoder && connector->eld[0])
			return connector;

	return NULL;
}
EXPORT_SYMBOL(drm_select_eld);

/**
/**
 * drm_detect_hdmi_monitor - detect whether monitor is HDMI
 * drm_detect_hdmi_monitor - detect whether monitor is HDMI
 * @edid: monitor EDID information
 * @edid: monitor EDID information
Loading