mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-18 18:23:53 +08:00
drm fixes for 5.6.0-rc4
amdgpu: - Drop DRIVER_USE_AGP - Fix memory leak in GPU reset - Resume fix for raven radeon: - Drop DRIVER_USE_AGP i915: - downgrade gen7 back to aliasing-ppgtt to avoid GPU hangs - shrinker fix - pmu leak and double free fixes - gvt user after free and virtual display reset fixes - randconfig build fix -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJeWJ+uAAoJEAx081l5xIa+SW4P/3UNXTw6SaJbuIv0ffU6PpR6 GqynyKseoogfZ6xDNRSEYcamIkKaniRLli+TPvEFqjAbpEzu0bbaXlQDcoG3uPqm jGxufQ4GvxIidbIbzoJA/TLl8UOGLJ+x6fx4EhtAS0VzE3dugI5yPZOyE+cboR2D 0DtvqB1Bmx580TMSIJlzw92Nfgh4n1K29h51lW5MpY+lEvnqOjk0aliunPeOi2wB 8tbABzB+pY6UTPNickb/SBWmwcem7ceA/xxX6YyKE89mhREQo1PLZI6Tt5YTdlQ4 mizHFEZT3H/JF/X67DmaAEADTM+BDMkpRXHLQlIetPdzAg4K85HeBcDQfHTPKKSg qtibd4VtxYXV31Mt/UWOh4EtpYHRZtbC8D42jBqF2DFBRXiTImli6PQ/G3c9xZdg sYPMWGVjh3HWNxnejO5Bi7na5jkWaY/ujzT/ERlF+EKmX8meKQb5SgVndcZkjATx yMh7lszuSxmw//qIq741bAbQk3e8/AdNm6iDISSCN3X+JCZI6bMOYP3xW8FzlQSe q69v/ckYlZoVqGwO/Qp5kmfMmZ6GaqHOkLTHQucJbgx5C6nhfF9jtjg+G5hhAO+l OcKvZo4eTPjayQbBoogxWhO+PW+0NaZ/KsU6k16a27txCeEjPRGmYDbbX5M6GHOw NaO7zx1LL/2j4o7fvkq8 =5C0g -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2020-02-28' of git://anongit.freedesktop.org/drm/drm Pull drm fixes from Dave Airlie: "Just some fixes for this week: amdgpu, radeon and i915. The main i915 one is a regression Gen7 (Ivybridge/Haswell), this moves them back from trying to use the full-ppgtt support to the aliasing version it used to use due to gpu hangs. Otherwise it's pretty quiet. amdgpu: - Drop DRIVER_USE_AGP - Fix memory leak in GPU reset - Resume fix for raven radeon: - Drop DRIVER_USE_AGP i915: - downgrade gen7 back to aliasing-ppgtt to avoid GPU hangs - shrinker fix - pmu leak and double free fixes - gvt user after free and virtual display reset fixes - randconfig build fix" * tag 'drm-fixes-2020-02-28' of git://anongit.freedesktop.org/drm/drm: drm/radeon: Inline drm_get_pci_dev drm/amdgpu: Drop DRIVER_USE_AGP drm/i915: Avoid recursing onto active vma from the shrinker drm/i915/pmu: Avoid using globals for PMU events drm/i915/pmu: Avoid using globals for CPU hotplug state drm/i915/gtt: Downgrade gen7 (ivb, byt, hsw) back to aliasing-ppgtt drm/i915: fix header test with GCOV amdgpu/gmc_v9: save/restore sdpif regs during S3 drm/amdgpu: fix memory leak during TDR test(v2) drm/i915/gvt: Fix orphan vgpu dmabuf_objs' lifetime drm/i915/gvt: Separate display reset from ALL_ENGINES reset
This commit is contained in:
commit
45d0b75b98
@ -1389,7 +1389,7 @@ amdgpu_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe,
|
|||||||
|
|
||||||
static struct drm_driver kms_driver = {
|
static struct drm_driver kms_driver = {
|
||||||
.driver_features =
|
.driver_features =
|
||||||
DRIVER_USE_AGP | DRIVER_ATOMIC |
|
DRIVER_ATOMIC |
|
||||||
DRIVER_GEM |
|
DRIVER_GEM |
|
||||||
DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ |
|
DRIVER_RENDER | DRIVER_MODESET | DRIVER_SYNCOBJ |
|
||||||
DRIVER_SYNCOBJ_TIMELINE,
|
DRIVER_SYNCOBJ_TIMELINE,
|
||||||
|
@ -195,6 +195,7 @@ struct amdgpu_gmc {
|
|||||||
uint32_t srbm_soft_reset;
|
uint32_t srbm_soft_reset;
|
||||||
bool prt_warning;
|
bool prt_warning;
|
||||||
uint64_t stolen_size;
|
uint64_t stolen_size;
|
||||||
|
uint32_t sdpif_register;
|
||||||
/* apertures */
|
/* apertures */
|
||||||
u64 shared_aperture_start;
|
u64 shared_aperture_start;
|
||||||
u64 shared_aperture_end;
|
u64 shared_aperture_end;
|
||||||
|
@ -1271,6 +1271,19 @@ static void gmc_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gmc_v9_0_restore_registers - restores regs
|
||||||
|
*
|
||||||
|
* @adev: amdgpu_device pointer
|
||||||
|
*
|
||||||
|
* This restores register values, saved at suspend.
|
||||||
|
*/
|
||||||
|
static void gmc_v9_0_restore_registers(struct amdgpu_device *adev)
|
||||||
|
{
|
||||||
|
if (adev->asic_type == CHIP_RAVEN)
|
||||||
|
WREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0, adev->gmc.sdpif_register);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gmc_v9_0_gart_enable - gart enable
|
* gmc_v9_0_gart_enable - gart enable
|
||||||
*
|
*
|
||||||
@ -1376,6 +1389,20 @@ static int gmc_v9_0_hw_init(void *handle)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gmc_v9_0_save_registers - saves regs
|
||||||
|
*
|
||||||
|
* @adev: amdgpu_device pointer
|
||||||
|
*
|
||||||
|
* This saves potential register values that should be
|
||||||
|
* restored upon resume
|
||||||
|
*/
|
||||||
|
static void gmc_v9_0_save_registers(struct amdgpu_device *adev)
|
||||||
|
{
|
||||||
|
if (adev->asic_type == CHIP_RAVEN)
|
||||||
|
adev->gmc.sdpif_register = RREG32(mmDCHUBBUB_SDPIF_MMIO_CNTRL_0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gmc_v9_0_gart_disable - gart disable
|
* gmc_v9_0_gart_disable - gart disable
|
||||||
*
|
*
|
||||||
@ -1412,9 +1439,16 @@ static int gmc_v9_0_hw_fini(void *handle)
|
|||||||
|
|
||||||
static int gmc_v9_0_suspend(void *handle)
|
static int gmc_v9_0_suspend(void *handle)
|
||||||
{
|
{
|
||||||
|
int r;
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||||
|
|
||||||
return gmc_v9_0_hw_fini(adev);
|
r = gmc_v9_0_hw_fini(adev);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
gmc_v9_0_save_registers(adev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gmc_v9_0_resume(void *handle)
|
static int gmc_v9_0_resume(void *handle)
|
||||||
@ -1422,6 +1456,7 @@ static int gmc_v9_0_resume(void *handle)
|
|||||||
int r;
|
int r;
|
||||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||||
|
|
||||||
|
gmc_v9_0_restore_registers(adev);
|
||||||
r = gmc_v9_0_hw_init(adev);
|
r = gmc_v9_0_hw_init(adev);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
@ -7376,6 +7376,8 @@
|
|||||||
#define mmCRTC4_CRTC_DRR_CONTROL 0x0f3e
|
#define mmCRTC4_CRTC_DRR_CONTROL 0x0f3e
|
||||||
#define mmCRTC4_CRTC_DRR_CONTROL_BASE_IDX 2
|
#define mmCRTC4_CRTC_DRR_CONTROL_BASE_IDX 2
|
||||||
|
|
||||||
|
#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0 0x395d
|
||||||
|
#define mmDCHUBBUB_SDPIF_MMIO_CNTRL_0_BASE_IDX 2
|
||||||
|
|
||||||
// addressBlock: dce_dc_fmt4_dispdec
|
// addressBlock: dce_dc_fmt4_dispdec
|
||||||
// base address: 0x2000
|
// base address: 0x2000
|
||||||
|
@ -978,8 +978,12 @@ int smu_v11_0_init_max_sustainable_clocks(struct smu_context *smu)
|
|||||||
struct smu_11_0_max_sustainable_clocks *max_sustainable_clocks;
|
struct smu_11_0_max_sustainable_clocks *max_sustainable_clocks;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!smu->smu_table.max_sustainable_clocks)
|
||||||
max_sustainable_clocks = kzalloc(sizeof(struct smu_11_0_max_sustainable_clocks),
|
max_sustainable_clocks = kzalloc(sizeof(struct smu_11_0_max_sustainable_clocks),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
else
|
||||||
|
max_sustainable_clocks = smu->smu_table.max_sustainable_clocks;
|
||||||
|
|
||||||
smu->smu_table.max_sustainable_clocks = (void *)max_sustainable_clocks;
|
smu->smu_table.max_sustainable_clocks = (void *)max_sustainable_clocks;
|
||||||
|
|
||||||
max_sustainable_clocks->uclock = smu->smu_table.boot_values.uclk / 100;
|
max_sustainable_clocks->uclock = smu->smu_table.boot_values.uclk / 100;
|
||||||
|
@ -294,7 +294,7 @@ extra-$(CONFIG_DRM_I915_WERROR) += \
|
|||||||
$(shell cd $(srctree)/$(src) && find * -name '*.h')))
|
$(shell cd $(srctree)/$(src) && find * -name '*.h')))
|
||||||
|
|
||||||
quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@)
|
quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@)
|
||||||
cmd_hdrtest = $(CC) $(c_flags) -S -o /dev/null -x c /dev/null -include $<; touch $@
|
cmd_hdrtest = $(CC) $(filter-out $(CFLAGS_GCOV), $(c_flags)) -S -o /dev/null -x c /dev/null -include $<; touch $@
|
||||||
|
|
||||||
$(obj)/%.hdrtest: $(src)/%.h FORCE
|
$(obj)/%.hdrtest: $(src)/%.h FORCE
|
||||||
$(call if_changed_dep,hdrtest)
|
$(call if_changed_dep,hdrtest)
|
||||||
|
@ -256,8 +256,7 @@ unsigned long i915_gem_shrink_all(struct drm_i915_private *i915)
|
|||||||
with_intel_runtime_pm(&i915->runtime_pm, wakeref) {
|
with_intel_runtime_pm(&i915->runtime_pm, wakeref) {
|
||||||
freed = i915_gem_shrink(i915, -1UL, NULL,
|
freed = i915_gem_shrink(i915, -1UL, NULL,
|
||||||
I915_SHRINK_BOUND |
|
I915_SHRINK_BOUND |
|
||||||
I915_SHRINK_UNBOUND |
|
I915_SHRINK_UNBOUND);
|
||||||
I915_SHRINK_ACTIVE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return freed;
|
return freed;
|
||||||
@ -336,7 +335,6 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
|
|||||||
freed_pages = 0;
|
freed_pages = 0;
|
||||||
with_intel_runtime_pm(&i915->runtime_pm, wakeref)
|
with_intel_runtime_pm(&i915->runtime_pm, wakeref)
|
||||||
freed_pages += i915_gem_shrink(i915, -1UL, NULL,
|
freed_pages += i915_gem_shrink(i915, -1UL, NULL,
|
||||||
I915_SHRINK_ACTIVE |
|
|
||||||
I915_SHRINK_BOUND |
|
I915_SHRINK_BOUND |
|
||||||
I915_SHRINK_UNBOUND |
|
I915_SHRINK_UNBOUND |
|
||||||
I915_SHRINK_WRITEBACK);
|
I915_SHRINK_WRITEBACK);
|
||||||
|
@ -151,12 +151,12 @@ static void dmabuf_gem_object_free(struct kref *kref)
|
|||||||
dmabuf_obj = container_of(pos,
|
dmabuf_obj = container_of(pos,
|
||||||
struct intel_vgpu_dmabuf_obj, list);
|
struct intel_vgpu_dmabuf_obj, list);
|
||||||
if (dmabuf_obj == obj) {
|
if (dmabuf_obj == obj) {
|
||||||
|
list_del(pos);
|
||||||
intel_gvt_hypervisor_put_vfio_device(vgpu);
|
intel_gvt_hypervisor_put_vfio_device(vgpu);
|
||||||
idr_remove(&vgpu->object_idr,
|
idr_remove(&vgpu->object_idr,
|
||||||
dmabuf_obj->dmabuf_id);
|
dmabuf_obj->dmabuf_id);
|
||||||
kfree(dmabuf_obj->info);
|
kfree(dmabuf_obj->info);
|
||||||
kfree(dmabuf_obj);
|
kfree(dmabuf_obj);
|
||||||
list_del(pos);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -560,9 +560,9 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr,
|
|||||||
|
|
||||||
intel_vgpu_reset_mmio(vgpu, dmlr);
|
intel_vgpu_reset_mmio(vgpu, dmlr);
|
||||||
populate_pvinfo_page(vgpu);
|
populate_pvinfo_page(vgpu);
|
||||||
intel_vgpu_reset_display(vgpu);
|
|
||||||
|
|
||||||
if (dmlr) {
|
if (dmlr) {
|
||||||
|
intel_vgpu_reset_display(vgpu);
|
||||||
intel_vgpu_reset_cfg_space(vgpu);
|
intel_vgpu_reset_cfg_space(vgpu);
|
||||||
/* only reset the failsafe mode when dmlr reset */
|
/* only reset the failsafe mode when dmlr reset */
|
||||||
vgpu->failsafe = false;
|
vgpu->failsafe = false;
|
||||||
|
@ -437,7 +437,7 @@ static const struct intel_device_info snb_m_gt2_info = {
|
|||||||
.has_rc6 = 1, \
|
.has_rc6 = 1, \
|
||||||
.has_rc6p = 1, \
|
.has_rc6p = 1, \
|
||||||
.has_rps = true, \
|
.has_rps = true, \
|
||||||
.ppgtt_type = INTEL_PPGTT_FULL, \
|
.ppgtt_type = INTEL_PPGTT_ALIASING, \
|
||||||
.ppgtt_size = 31, \
|
.ppgtt_size = 31, \
|
||||||
IVB_PIPE_OFFSETS, \
|
IVB_PIPE_OFFSETS, \
|
||||||
IVB_CURSOR_OFFSETS, \
|
IVB_CURSOR_OFFSETS, \
|
||||||
@ -494,7 +494,7 @@ static const struct intel_device_info vlv_info = {
|
|||||||
.has_rps = true,
|
.has_rps = true,
|
||||||
.display.has_gmch = 1,
|
.display.has_gmch = 1,
|
||||||
.display.has_hotplug = 1,
|
.display.has_hotplug = 1,
|
||||||
.ppgtt_type = INTEL_PPGTT_FULL,
|
.ppgtt_type = INTEL_PPGTT_ALIASING,
|
||||||
.ppgtt_size = 31,
|
.ppgtt_size = 31,
|
||||||
.has_snoop = true,
|
.has_snoop = true,
|
||||||
.has_coherent_ggtt = false,
|
.has_coherent_ggtt = false,
|
||||||
|
@ -822,11 +822,6 @@ static ssize_t i915_pmu_event_show(struct device *dev,
|
|||||||
return sprintf(buf, "config=0x%lx\n", eattr->val);
|
return sprintf(buf, "config=0x%lx\n", eattr->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct attribute_group i915_pmu_events_attr_group = {
|
|
||||||
.name = "events",
|
|
||||||
/* Patch in attrs at runtime. */
|
|
||||||
};
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
i915_pmu_get_attr_cpumask(struct device *dev,
|
i915_pmu_get_attr_cpumask(struct device *dev,
|
||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
@ -846,13 +841,6 @@ static const struct attribute_group i915_pmu_cpumask_attr_group = {
|
|||||||
.attrs = i915_cpumask_attrs,
|
.attrs = i915_cpumask_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct attribute_group *i915_pmu_attr_groups[] = {
|
|
||||||
&i915_pmu_format_attr_group,
|
|
||||||
&i915_pmu_events_attr_group,
|
|
||||||
&i915_pmu_cpumask_attr_group,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
#define __event(__config, __name, __unit) \
|
#define __event(__config, __name, __unit) \
|
||||||
{ \
|
{ \
|
||||||
.config = (__config), \
|
.config = (__config), \
|
||||||
@ -1026,23 +1014,23 @@ err_alloc:
|
|||||||
|
|
||||||
static void free_event_attributes(struct i915_pmu *pmu)
|
static void free_event_attributes(struct i915_pmu *pmu)
|
||||||
{
|
{
|
||||||
struct attribute **attr_iter = i915_pmu_events_attr_group.attrs;
|
struct attribute **attr_iter = pmu->events_attr_group.attrs;
|
||||||
|
|
||||||
for (; *attr_iter; attr_iter++)
|
for (; *attr_iter; attr_iter++)
|
||||||
kfree((*attr_iter)->name);
|
kfree((*attr_iter)->name);
|
||||||
|
|
||||||
kfree(i915_pmu_events_attr_group.attrs);
|
kfree(pmu->events_attr_group.attrs);
|
||||||
kfree(pmu->i915_attr);
|
kfree(pmu->i915_attr);
|
||||||
kfree(pmu->pmu_attr);
|
kfree(pmu->pmu_attr);
|
||||||
|
|
||||||
i915_pmu_events_attr_group.attrs = NULL;
|
pmu->events_attr_group.attrs = NULL;
|
||||||
pmu->i915_attr = NULL;
|
pmu->i915_attr = NULL;
|
||||||
pmu->pmu_attr = NULL;
|
pmu->pmu_attr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int i915_pmu_cpu_online(unsigned int cpu, struct hlist_node *node)
|
static int i915_pmu_cpu_online(unsigned int cpu, struct hlist_node *node)
|
||||||
{
|
{
|
||||||
struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), node);
|
struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), cpuhp.node);
|
||||||
|
|
||||||
GEM_BUG_ON(!pmu->base.event_init);
|
GEM_BUG_ON(!pmu->base.event_init);
|
||||||
|
|
||||||
@ -1055,7 +1043,7 @@ static int i915_pmu_cpu_online(unsigned int cpu, struct hlist_node *node)
|
|||||||
|
|
||||||
static int i915_pmu_cpu_offline(unsigned int cpu, struct hlist_node *node)
|
static int i915_pmu_cpu_offline(unsigned int cpu, struct hlist_node *node)
|
||||||
{
|
{
|
||||||
struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), node);
|
struct i915_pmu *pmu = hlist_entry_safe(node, typeof(*pmu), cpuhp.node);
|
||||||
unsigned int target;
|
unsigned int target;
|
||||||
|
|
||||||
GEM_BUG_ON(!pmu->base.event_init);
|
GEM_BUG_ON(!pmu->base.event_init);
|
||||||
@ -1072,8 +1060,6 @@ static int i915_pmu_cpu_offline(unsigned int cpu, struct hlist_node *node)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum cpuhp_state cpuhp_slot = CPUHP_INVALID;
|
|
||||||
|
|
||||||
static int i915_pmu_register_cpuhp_state(struct i915_pmu *pmu)
|
static int i915_pmu_register_cpuhp_state(struct i915_pmu *pmu)
|
||||||
{
|
{
|
||||||
enum cpuhp_state slot;
|
enum cpuhp_state slot;
|
||||||
@ -1087,21 +1073,22 @@ static int i915_pmu_register_cpuhp_state(struct i915_pmu *pmu)
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
slot = ret;
|
slot = ret;
|
||||||
ret = cpuhp_state_add_instance(slot, &pmu->node);
|
ret = cpuhp_state_add_instance(slot, &pmu->cpuhp.node);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
cpuhp_remove_multi_state(slot);
|
cpuhp_remove_multi_state(slot);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpuhp_slot = slot;
|
pmu->cpuhp.slot = slot;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void i915_pmu_unregister_cpuhp_state(struct i915_pmu *pmu)
|
static void i915_pmu_unregister_cpuhp_state(struct i915_pmu *pmu)
|
||||||
{
|
{
|
||||||
WARN_ON(cpuhp_slot == CPUHP_INVALID);
|
WARN_ON(pmu->cpuhp.slot == CPUHP_INVALID);
|
||||||
WARN_ON(cpuhp_state_remove_instance(cpuhp_slot, &pmu->node));
|
WARN_ON(cpuhp_state_remove_instance(pmu->cpuhp.slot, &pmu->cpuhp.node));
|
||||||
cpuhp_remove_multi_state(cpuhp_slot);
|
cpuhp_remove_multi_state(pmu->cpuhp.slot);
|
||||||
|
pmu->cpuhp.slot = CPUHP_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_igp(struct drm_i915_private *i915)
|
static bool is_igp(struct drm_i915_private *i915)
|
||||||
@ -1118,6 +1105,13 @@ static bool is_igp(struct drm_i915_private *i915)
|
|||||||
void i915_pmu_register(struct drm_i915_private *i915)
|
void i915_pmu_register(struct drm_i915_private *i915)
|
||||||
{
|
{
|
||||||
struct i915_pmu *pmu = &i915->pmu;
|
struct i915_pmu *pmu = &i915->pmu;
|
||||||
|
const struct attribute_group *attr_groups[] = {
|
||||||
|
&i915_pmu_format_attr_group,
|
||||||
|
&pmu->events_attr_group,
|
||||||
|
&i915_pmu_cpumask_attr_group,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
int ret = -ENOMEM;
|
int ret = -ENOMEM;
|
||||||
|
|
||||||
if (INTEL_GEN(i915) <= 2) {
|
if (INTEL_GEN(i915) <= 2) {
|
||||||
@ -1128,6 +1122,7 @@ void i915_pmu_register(struct drm_i915_private *i915)
|
|||||||
spin_lock_init(&pmu->lock);
|
spin_lock_init(&pmu->lock);
|
||||||
hrtimer_init(&pmu->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
hrtimer_init(&pmu->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||||
pmu->timer.function = i915_sample;
|
pmu->timer.function = i915_sample;
|
||||||
|
pmu->cpuhp.slot = CPUHP_INVALID;
|
||||||
|
|
||||||
if (!is_igp(i915)) {
|
if (!is_igp(i915)) {
|
||||||
pmu->name = kasprintf(GFP_KERNEL,
|
pmu->name = kasprintf(GFP_KERNEL,
|
||||||
@ -1143,11 +1138,16 @@ void i915_pmu_register(struct drm_i915_private *i915)
|
|||||||
if (!pmu->name)
|
if (!pmu->name)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
i915_pmu_events_attr_group.attrs = create_event_attributes(pmu);
|
pmu->events_attr_group.name = "events";
|
||||||
if (!i915_pmu_events_attr_group.attrs)
|
pmu->events_attr_group.attrs = create_event_attributes(pmu);
|
||||||
|
if (!pmu->events_attr_group.attrs)
|
||||||
goto err_name;
|
goto err_name;
|
||||||
|
|
||||||
pmu->base.attr_groups = i915_pmu_attr_groups;
|
pmu->base.attr_groups = kmemdup(attr_groups, sizeof(attr_groups),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!pmu->base.attr_groups)
|
||||||
|
goto err_attr;
|
||||||
|
|
||||||
pmu->base.task_ctx_nr = perf_invalid_context;
|
pmu->base.task_ctx_nr = perf_invalid_context;
|
||||||
pmu->base.event_init = i915_pmu_event_init;
|
pmu->base.event_init = i915_pmu_event_init;
|
||||||
pmu->base.add = i915_pmu_event_add;
|
pmu->base.add = i915_pmu_event_add;
|
||||||
@ -1159,7 +1159,7 @@ void i915_pmu_register(struct drm_i915_private *i915)
|
|||||||
|
|
||||||
ret = perf_pmu_register(&pmu->base, pmu->name, -1);
|
ret = perf_pmu_register(&pmu->base, pmu->name, -1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_attr;
|
goto err_groups;
|
||||||
|
|
||||||
ret = i915_pmu_register_cpuhp_state(pmu);
|
ret = i915_pmu_register_cpuhp_state(pmu);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -1169,6 +1169,8 @@ void i915_pmu_register(struct drm_i915_private *i915)
|
|||||||
|
|
||||||
err_unreg:
|
err_unreg:
|
||||||
perf_pmu_unregister(&pmu->base);
|
perf_pmu_unregister(&pmu->base);
|
||||||
|
err_groups:
|
||||||
|
kfree(pmu->base.attr_groups);
|
||||||
err_attr:
|
err_attr:
|
||||||
pmu->base.event_init = NULL;
|
pmu->base.event_init = NULL;
|
||||||
free_event_attributes(pmu);
|
free_event_attributes(pmu);
|
||||||
@ -1194,6 +1196,7 @@ void i915_pmu_unregister(struct drm_i915_private *i915)
|
|||||||
|
|
||||||
perf_pmu_unregister(&pmu->base);
|
perf_pmu_unregister(&pmu->base);
|
||||||
pmu->base.event_init = NULL;
|
pmu->base.event_init = NULL;
|
||||||
|
kfree(pmu->base.attr_groups);
|
||||||
if (!is_igp(i915))
|
if (!is_igp(i915))
|
||||||
kfree(pmu->name);
|
kfree(pmu->name);
|
||||||
free_event_attributes(pmu);
|
free_event_attributes(pmu);
|
||||||
|
@ -39,9 +39,12 @@ struct i915_pmu_sample {
|
|||||||
|
|
||||||
struct i915_pmu {
|
struct i915_pmu {
|
||||||
/**
|
/**
|
||||||
* @node: List node for CPU hotplug handling.
|
* @cpuhp: Struct used for CPU hotplug handling.
|
||||||
*/
|
*/
|
||||||
|
struct {
|
||||||
struct hlist_node node;
|
struct hlist_node node;
|
||||||
|
enum cpuhp_state slot;
|
||||||
|
} cpuhp;
|
||||||
/**
|
/**
|
||||||
* @base: PMU base.
|
* @base: PMU base.
|
||||||
*/
|
*/
|
||||||
@ -104,6 +107,10 @@ struct i915_pmu {
|
|||||||
* @sleep_last: Last time GT parked for RC6 estimation.
|
* @sleep_last: Last time GT parked for RC6 estimation.
|
||||||
*/
|
*/
|
||||||
ktime_t sleep_last;
|
ktime_t sleep_last;
|
||||||
|
/**
|
||||||
|
* @events_attr_group: Device events attribute group.
|
||||||
|
*/
|
||||||
|
struct attribute_group events_attr_group;
|
||||||
/**
|
/**
|
||||||
* @i915_attr: Memory block holding device attributes.
|
* @i915_attr: Memory block holding device attributes.
|
||||||
*/
|
*/
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include <linux/vga_switcheroo.h>
|
#include <linux/vga_switcheroo.h>
|
||||||
#include <linux/mmu_notifier.h>
|
#include <linux/mmu_notifier.h>
|
||||||
|
|
||||||
|
#include <drm/drm_agpsupport.h>
|
||||||
#include <drm/drm_crtc_helper.h>
|
#include <drm/drm_crtc_helper.h>
|
||||||
#include <drm/drm_drv.h>
|
#include <drm/drm_drv.h>
|
||||||
#include <drm/drm_fb_helper.h>
|
#include <drm/drm_fb_helper.h>
|
||||||
@ -325,6 +326,7 @@ static int radeon_pci_probe(struct pci_dev *pdev,
|
|||||||
const struct pci_device_id *ent)
|
const struct pci_device_id *ent)
|
||||||
{
|
{
|
||||||
unsigned long flags = 0;
|
unsigned long flags = 0;
|
||||||
|
struct drm_device *dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!ent)
|
if (!ent)
|
||||||
@ -365,7 +367,44 @@ static int radeon_pci_probe(struct pci_dev *pdev,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return drm_get_pci_dev(pdev, ent, &kms_driver);
|
dev = drm_dev_alloc(&kms_driver, &pdev->dev);
|
||||||
|
if (IS_ERR(dev))
|
||||||
|
return PTR_ERR(dev);
|
||||||
|
|
||||||
|
ret = pci_enable_device(pdev);
|
||||||
|
if (ret)
|
||||||
|
goto err_free;
|
||||||
|
|
||||||
|
dev->pdev = pdev;
|
||||||
|
#ifdef __alpha__
|
||||||
|
dev->hose = pdev->sysdata;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pci_set_drvdata(pdev, dev);
|
||||||
|
|
||||||
|
if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP))
|
||||||
|
dev->agp = drm_agp_init(dev);
|
||||||
|
if (dev->agp) {
|
||||||
|
dev->agp->agp_mtrr = arch_phys_wc_add(
|
||||||
|
dev->agp->agp_info.aper_base,
|
||||||
|
dev->agp->agp_info.aper_size *
|
||||||
|
1024 * 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = drm_dev_register(dev, ent->driver_data);
|
||||||
|
if (ret)
|
||||||
|
goto err_agp;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_agp:
|
||||||
|
if (dev->agp)
|
||||||
|
arch_phys_wc_del(dev->agp->agp_mtrr);
|
||||||
|
kfree(dev->agp);
|
||||||
|
pci_disable_device(pdev);
|
||||||
|
err_free:
|
||||||
|
drm_dev_put(dev);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -575,7 +614,7 @@ radeon_get_crtc_scanout_position(struct drm_device *dev, unsigned int pipe,
|
|||||||
|
|
||||||
static struct drm_driver kms_driver = {
|
static struct drm_driver kms_driver = {
|
||||||
.driver_features =
|
.driver_features =
|
||||||
DRIVER_USE_AGP | DRIVER_GEM | DRIVER_RENDER,
|
DRIVER_GEM | DRIVER_RENDER,
|
||||||
.load = radeon_driver_load_kms,
|
.load = radeon_driver_load_kms,
|
||||||
.open = radeon_driver_open_kms,
|
.open = radeon_driver_open_kms,
|
||||||
.postclose = radeon_driver_postclose_kms,
|
.postclose = radeon_driver_postclose_kms,
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/vga_switcheroo.h>
|
#include <linux/vga_switcheroo.h>
|
||||||
|
|
||||||
|
#include <drm/drm_agpsupport.h>
|
||||||
#include <drm/drm_fb_helper.h>
|
#include <drm/drm_fb_helper.h>
|
||||||
#include <drm/drm_file.h>
|
#include <drm/drm_file.h>
|
||||||
#include <drm/drm_ioctl.h>
|
#include <drm/drm_ioctl.h>
|
||||||
@ -77,6 +78,11 @@ void radeon_driver_unload_kms(struct drm_device *dev)
|
|||||||
radeon_modeset_fini(rdev);
|
radeon_modeset_fini(rdev);
|
||||||
radeon_device_fini(rdev);
|
radeon_device_fini(rdev);
|
||||||
|
|
||||||
|
if (dev->agp)
|
||||||
|
arch_phys_wc_del(dev->agp->agp_mtrr);
|
||||||
|
kfree(dev->agp);
|
||||||
|
dev->agp = NULL;
|
||||||
|
|
||||||
done_free:
|
done_free:
|
||||||
kfree(rdev);
|
kfree(rdev);
|
||||||
dev->dev_private = NULL;
|
dev->dev_private = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user