vmwgfx, exynos, i915, amdgpu, nouveau, host1x and displayport fixes
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZeqVnAAoJEAx081l5xIa+zqEP/Rg03pOhZv3SDPdFEgZnRkso Fp1RxfgHAfUW9bqgKcNC3xzhUHE6OvNQqNFd3VWqDZp6gtlp7fAyS4dVLiUa5DbD ie9/mGFUL4C1Ls3mgVQTrTcUnWTdZjekO0L/5BD7O+N7Pw3lHhYpgrYfPQv5BfOt 5JpEP3ZDoMx8kyErA7ahfopHSDesBaWpZz5jjjm5FKjGdqEWMhnaPFsQxdmqmB9h twP/KBk9E2dippRNwokd110ANM4ROx3l4hBKticAhXrI85J2tthjHaIY3V8o98pT BVNg2AL2ar/TVaM6Kij9Y8NdKHUmyFHa6pB34Pdvg21OkLm74otFtB2NplueYLOv 3Ry7vuc+x77qKP7ino4CL3ZT7lkhRu4949VqsiEbrT6oyvdInYYhct3PyrbZoMVp BvOoz4j0pM84Mz/XCicJ9jGVTILWnND9oRZMNPGYecCUL2Uc53dN62Scz9uxUk2X KmO4vhjzmdtRE4v7oWJYEbu6l7zGF4c/NrlrnxypErLdizi/sHmUaAaj13VISqWZ eLEb5e1MK9CMjplD6tqMDm/e8qBNuukVfyhizZQ+6pqSEyPfX9ZgtPEoxRKjEXZd mPOBCEXJqVP9f6erLaTpqsUg+IeDiwhkK0lWZ+oUAQWlb4w/Px9XawJSaEK7d1pO 5A24+oqlLCDIoh7xA09r =WLqQ -----END PGP SIGNATURE----- Merge tag 'drm-fixes-for-v4.13-rc3' of git://people.freedesktop.org/~airlied/linux Pull drm fixes from Dave Airlie: "These iare the fixes for 4.13-rc3: vmwgfx, exynos, i915, amdgpu, nouveau, host1x and displayport fixes. As expected people woke up this week, i915 didn't do an -rc2 pull so got a bumper -rc3 pull, and Ben resurfaced on nouveau and fixed a bunch of major crashers seen on Fedora 26, and there are a few vmwgfx fixes as well. Otherwise exynos had some regression fixes/cleanups, and amdgpu has an rcu locking regression fix and a couple of minor fixes" * tag 'drm-fixes-for-v4.13-rc3' of git://people.freedesktop.org/~airlied/linux: (44 commits) drm/i915: Fix bad comparison in skl_compute_plane_wm. drm/i915: Force CPU synchronisation even if userspace requests ASYNC drm/i915: Only skip updating execobject.offset after error drm/i915: Only mark the execobject as pinned on success drm/i915: Remove assertion from raw __i915_vma_unpin() drm/i915/cnl: Fix loadgen select programming on ddi vswing sequence drm/i915: Fix scaler init during CRTC HW state readout drm/i915/selftests: Fix an error handling path in 'mock_gem_device()' drm/i915: Unbreak gpu reset vs. modeset locking gpu: host1x: Free the IOMMU domain when there is no device to attach drm/i915: Fix cursor updates on some platforms drm/i915: Fix user ptr check size in eb_relocate_vma() drm: exynos: mark pm functions as __maybe_unused drm/exynos: select CEC_CORE if CEC_NOTIFIER drm/exynos/hdmi: fix disable sequence drm/exynos: mic: add a bridge at probe drm/exynos/dsi: Remove error handling for bridge_node DT parsing drm/exynos: dsi: do not try to find bridge drm: exynos: hdmi: make of_device_ids const. drm: exynos: constify mixer_match_types and *_mxr_drv_data. ...
This commit is contained in:
commit
0b5477d9da
@ -198,12 +198,16 @@ amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id)
|
||||
result = idr_find(&fpriv->bo_list_handles, id);
|
||||
|
||||
if (result) {
|
||||
if (kref_get_unless_zero(&result->refcount))
|
||||
if (kref_get_unless_zero(&result->refcount)) {
|
||||
rcu_read_unlock();
|
||||
mutex_lock(&result->lock);
|
||||
else
|
||||
} else {
|
||||
rcu_read_unlock();
|
||||
result = NULL;
|
||||
}
|
||||
} else {
|
||||
rcu_read_unlock();
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -1475,21 +1475,23 @@ static void gfx_v9_0_tiling_mode_table_init(struct amdgpu_device *adev)
|
||||
|
||||
static void gfx_v9_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num, u32 instance)
|
||||
{
|
||||
u32 data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1);
|
||||
u32 data;
|
||||
|
||||
if ((se_num == 0xffffffff) && (sh_num == 0xffffffff)) {
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
|
||||
if (instance == 0xffffffff)
|
||||
data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES, 1);
|
||||
else
|
||||
data = REG_SET_FIELD(0, GRBM_GFX_INDEX, INSTANCE_INDEX, instance);
|
||||
|
||||
if (se_num == 0xffffffff)
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1);
|
||||
} else if (se_num == 0xffffffff) {
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_BROADCAST_WRITES, 1);
|
||||
} else if (sh_num == 0xffffffff) {
|
||||
else
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
|
||||
|
||||
if (sh_num == 0xffffffff)
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_BROADCAST_WRITES, 1);
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
|
||||
} else {
|
||||
else
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SH_INDEX, sh_num);
|
||||
data = REG_SET_FIELD(data, GRBM_GFX_INDEX, SE_INDEX, se_num);
|
||||
}
|
||||
|
||||
WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, data);
|
||||
}
|
||||
|
||||
|
@ -2128,15 +2128,9 @@ static int vega10_populate_avfs_parameters(struct pp_hwmgr *hwmgr)
|
||||
pp_table->AvfsGbCksOff.m2_shift = 12;
|
||||
pp_table->AvfsGbCksOff.b_shift = 0;
|
||||
|
||||
for (i = 0; i < dep_table->count; i++) {
|
||||
if (dep_table->entries[i].sclk_offset == 0)
|
||||
pp_table->StaticVoltageOffsetVid[i] = 248;
|
||||
else
|
||||
pp_table->StaticVoltageOffsetVid[i] =
|
||||
(uint8_t)(dep_table->entries[i].sclk_offset *
|
||||
VOLTAGE_VID_OFFSET_SCALE2 /
|
||||
VOLTAGE_VID_OFFSET_SCALE1);
|
||||
}
|
||||
for (i = 0; i < dep_table->count; i++)
|
||||
pp_table->StaticVoltageOffsetVid[i] =
|
||||
convert_to_vid((uint8_t)(dep_table->entries[i].sclk_offset));
|
||||
|
||||
if ((PPREGKEY_VEGA10QUADRATICEQUATION_DFLT !=
|
||||
data->disp_clk_quad_eqn_a) &&
|
||||
|
@ -544,7 +544,7 @@ void drm_dp_downstream_debug(struct seq_file *m,
|
||||
DP_DETAILED_CAP_INFO_AVAILABLE;
|
||||
int clk;
|
||||
int bpc;
|
||||
char id[6];
|
||||
char id[7];
|
||||
int len;
|
||||
uint8_t rev[2];
|
||||
int type = port_cap[0] & DP_DS_PORT_TYPE_MASK;
|
||||
@ -583,6 +583,7 @@ void drm_dp_downstream_debug(struct seq_file *m,
|
||||
seq_puts(m, "\t\tType: N/A\n");
|
||||
}
|
||||
|
||||
memset(id, 0, sizeof(id));
|
||||
drm_dp_downstream_id(aux, id);
|
||||
seq_printf(m, "\t\tID: %s\n", id);
|
||||
|
||||
@ -591,7 +592,7 @@ void drm_dp_downstream_debug(struct seq_file *m,
|
||||
seq_printf(m, "\t\tHW: %d.%d\n",
|
||||
(rev[0] & 0xf0) >> 4, rev[0] & 0xf);
|
||||
|
||||
len = drm_dp_dpcd_read(aux, DP_BRANCH_SW_REV, &rev, 2);
|
||||
len = drm_dp_dpcd_read(aux, DP_BRANCH_SW_REV, rev, 2);
|
||||
if (len > 0)
|
||||
seq_printf(m, "\t\tSW: %d.%d\n", rev[0], rev[1]);
|
||||
|
||||
|
@ -75,6 +75,7 @@ config DRM_EXYNOS_DP
|
||||
config DRM_EXYNOS_HDMI
|
||||
bool "HDMI"
|
||||
depends on DRM_EXYNOS_MIXER || DRM_EXYNOS5433_DECON
|
||||
select CEC_CORE if CEC_NOTIFIER
|
||||
help
|
||||
Choose this option if you want to use Exynos HDMI for DRM.
|
||||
|
||||
|
@ -453,7 +453,6 @@ static int exynos_drm_platform_probe(struct platform_device *pdev)
|
||||
struct component_match *match;
|
||||
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
exynos_drm_driver.num_ioctls = ARRAY_SIZE(exynos_ioctls);
|
||||
|
||||
match = exynos_drm_match_add(&pdev->dev);
|
||||
if (IS_ERR(match))
|
||||
|
@ -1651,8 +1651,6 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
|
||||
return ret;
|
||||
|
||||
dsi->bridge_node = of_graph_get_remote_node(node, DSI_PORT_IN, 0);
|
||||
if (!dsi->bridge_node)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1687,9 +1685,11 @@ static int exynos_dsi_bind(struct device *dev, struct device *master,
|
||||
return ret;
|
||||
}
|
||||
|
||||
bridge = of_drm_find_bridge(dsi->bridge_node);
|
||||
if (bridge)
|
||||
drm_bridge_attach(encoder, bridge, NULL);
|
||||
if (dsi->bridge_node) {
|
||||
bridge = of_drm_find_bridge(dsi->bridge_node);
|
||||
if (bridge)
|
||||
drm_bridge_attach(encoder, bridge, NULL);
|
||||
}
|
||||
|
||||
return mipi_dsi_host_register(&dsi->dsi_host);
|
||||
}
|
||||
|
@ -340,16 +340,10 @@ static int exynos_mic_bind(struct device *dev, struct device *master,
|
||||
void *data)
|
||||
{
|
||||
struct exynos_mic *mic = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
mic->bridge.funcs = &mic_bridge_funcs;
|
||||
mic->bridge.of_node = dev->of_node;
|
||||
mic->bridge.driver_private = mic;
|
||||
ret = drm_bridge_add(&mic->bridge);
|
||||
if (ret)
|
||||
DRM_ERROR("mic: Failed to add MIC to the global bridge list\n");
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void exynos_mic_unbind(struct device *dev, struct device *master,
|
||||
@ -365,8 +359,6 @@ static void exynos_mic_unbind(struct device *dev, struct device *master,
|
||||
|
||||
already_disabled:
|
||||
mutex_unlock(&mic_mutex);
|
||||
|
||||
drm_bridge_remove(&mic->bridge);
|
||||
}
|
||||
|
||||
static const struct component_ops exynos_mic_component_ops = {
|
||||
@ -461,6 +453,15 @@ static int exynos_mic_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, mic);
|
||||
|
||||
mic->bridge.funcs = &mic_bridge_funcs;
|
||||
mic->bridge.of_node = dev->of_node;
|
||||
|
||||
ret = drm_bridge_add(&mic->bridge);
|
||||
if (ret) {
|
||||
DRM_ERROR("mic: Failed to add MIC to the global bridge list\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
ret = component_add(dev, &exynos_mic_component_ops);
|
||||
@ -479,8 +480,13 @@ err:
|
||||
|
||||
static int exynos_mic_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct exynos_mic *mic = platform_get_drvdata(pdev);
|
||||
|
||||
component_del(&pdev->dev, &exynos_mic_component_ops);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
drm_bridge_remove(&mic->bridge);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1501,8 +1501,6 @@ static void hdmi_disable(struct drm_encoder *encoder)
|
||||
*/
|
||||
cancel_delayed_work(&hdata->hotplug_work);
|
||||
cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
|
||||
|
||||
hdmiphy_disable(hdata);
|
||||
}
|
||||
|
||||
static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
|
||||
@ -1676,7 +1674,7 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
|
||||
return hdmi_bridge_init(hdata);
|
||||
}
|
||||
|
||||
static struct of_device_id hdmi_match_types[] = {
|
||||
static const struct of_device_id hdmi_match_types[] = {
|
||||
{
|
||||
.compatible = "samsung,exynos4210-hdmi",
|
||||
.data = &exynos4210_hdmi_driver_data,
|
||||
@ -1934,8 +1932,7 @@ static int hdmi_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int exynos_hdmi_suspend(struct device *dev)
|
||||
static int __maybe_unused exynos_hdmi_suspend(struct device *dev)
|
||||
{
|
||||
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
||||
|
||||
@ -1944,7 +1941,7 @@ static int exynos_hdmi_suspend(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int exynos_hdmi_resume(struct device *dev)
|
||||
static int __maybe_unused exynos_hdmi_resume(struct device *dev)
|
||||
{
|
||||
struct hdmi_context *hdata = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
@ -1955,7 +1952,6 @@ static int exynos_hdmi_resume(struct device *dev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops exynos_hdmi_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(exynos_hdmi_suspend, exynos_hdmi_resume, NULL)
|
||||
|
@ -1094,28 +1094,28 @@ static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
|
||||
.atomic_check = mixer_atomic_check,
|
||||
};
|
||||
|
||||
static struct mixer_drv_data exynos5420_mxr_drv_data = {
|
||||
static const struct mixer_drv_data exynos5420_mxr_drv_data = {
|
||||
.version = MXR_VER_128_0_0_184,
|
||||
.is_vp_enabled = 0,
|
||||
};
|
||||
|
||||
static struct mixer_drv_data exynos5250_mxr_drv_data = {
|
||||
static const struct mixer_drv_data exynos5250_mxr_drv_data = {
|
||||
.version = MXR_VER_16_0_33_0,
|
||||
.is_vp_enabled = 0,
|
||||
};
|
||||
|
||||
static struct mixer_drv_data exynos4212_mxr_drv_data = {
|
||||
static const struct mixer_drv_data exynos4212_mxr_drv_data = {
|
||||
.version = MXR_VER_0_0_0_16,
|
||||
.is_vp_enabled = 1,
|
||||
};
|
||||
|
||||
static struct mixer_drv_data exynos4210_mxr_drv_data = {
|
||||
static const struct mixer_drv_data exynos4210_mxr_drv_data = {
|
||||
.version = MXR_VER_0_0_0_16,
|
||||
.is_vp_enabled = 1,
|
||||
.has_sclk = 1,
|
||||
};
|
||||
|
||||
static struct of_device_id mixer_match_types[] = {
|
||||
static const struct of_device_id mixer_match_types[] = {
|
||||
{
|
||||
.compatible = "samsung,exynos4210-mixer",
|
||||
.data = &exynos4210_mxr_drv_data,
|
||||
|
@ -323,27 +323,27 @@ void intel_gvt_check_vblank_emulation(struct intel_gvt *gvt)
|
||||
{
|
||||
struct intel_gvt_irq *irq = &gvt->irq;
|
||||
struct intel_vgpu *vgpu;
|
||||
bool have_enabled_pipe = false;
|
||||
int pipe, id;
|
||||
|
||||
if (WARN_ON(!mutex_is_locked(&gvt->lock)))
|
||||
return;
|
||||
|
||||
hrtimer_cancel(&irq->vblank_timer.timer);
|
||||
|
||||
for_each_active_vgpu(gvt, vgpu, id) {
|
||||
for (pipe = 0; pipe < I915_MAX_PIPES; pipe++) {
|
||||
have_enabled_pipe =
|
||||
pipe_is_enabled(vgpu, pipe);
|
||||
if (have_enabled_pipe)
|
||||
break;
|
||||
if (pipe_is_enabled(vgpu, pipe))
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (have_enabled_pipe)
|
||||
hrtimer_start(&irq->vblank_timer.timer,
|
||||
ktime_add_ns(ktime_get(), irq->vblank_timer.period),
|
||||
HRTIMER_MODE_ABS);
|
||||
/* all the pipes are disabled */
|
||||
hrtimer_cancel(&irq->vblank_timer.timer);
|
||||
return;
|
||||
|
||||
out:
|
||||
hrtimer_start(&irq->vblank_timer.timer,
|
||||
ktime_add_ns(ktime_get(), irq->vblank_timer.period),
|
||||
HRTIMER_MODE_ABS);
|
||||
|
||||
}
|
||||
|
||||
static void emulate_vblank_on_pipe(struct intel_vgpu *vgpu, int pipe)
|
||||
|
@ -114,7 +114,7 @@ i915_clflush_notify(struct i915_sw_fence *fence,
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
void i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
bool i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct clflush *clflush;
|
||||
@ -128,7 +128,7 @@ void i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
*/
|
||||
if (!i915_gem_object_has_struct_page(obj)) {
|
||||
obj->cache_dirty = false;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* If the GPU is snooping the contents of the CPU cache,
|
||||
@ -140,7 +140,7 @@ void i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
* tracking.
|
||||
*/
|
||||
if (!(flags & I915_CLFLUSH_FORCE) && obj->cache_coherent)
|
||||
return;
|
||||
return false;
|
||||
|
||||
trace_i915_gem_object_clflush(obj);
|
||||
|
||||
@ -179,4 +179,5 @@ void i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
}
|
||||
|
||||
obj->cache_dirty = false;
|
||||
return true;
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
struct drm_i915_private;
|
||||
struct drm_i915_gem_object;
|
||||
|
||||
void i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
bool i915_gem_clflush_object(struct drm_i915_gem_object *obj,
|
||||
unsigned int flags);
|
||||
#define I915_CLFLUSH_FORCE BIT(0)
|
||||
#define I915_CLFLUSH_SYNC BIT(1)
|
||||
|
@ -560,9 +560,6 @@ static int eb_reserve_vma(const struct i915_execbuffer *eb,
|
||||
eb->args->flags |= __EXEC_HAS_RELOC;
|
||||
}
|
||||
|
||||
entry->flags |= __EXEC_OBJECT_HAS_PIN;
|
||||
GEM_BUG_ON(eb_vma_misplaced(entry, vma));
|
||||
|
||||
if (unlikely(entry->flags & EXEC_OBJECT_NEEDS_FENCE)) {
|
||||
err = i915_vma_get_fence(vma);
|
||||
if (unlikely(err)) {
|
||||
@ -574,6 +571,9 @@ static int eb_reserve_vma(const struct i915_execbuffer *eb,
|
||||
entry->flags |= __EXEC_OBJECT_HAS_FENCE;
|
||||
}
|
||||
|
||||
entry->flags |= __EXEC_OBJECT_HAS_PIN;
|
||||
GEM_BUG_ON(eb_vma_misplaced(entry, vma));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1458,7 +1458,7 @@ static int eb_relocate_vma(struct i915_execbuffer *eb, struct i915_vma *vma)
|
||||
* to read. However, if the array is not writable the user loses
|
||||
* the updated relocation values.
|
||||
*/
|
||||
if (unlikely(!access_ok(VERIFY_READ, urelocs, remain*sizeof(urelocs))))
|
||||
if (unlikely(!access_ok(VERIFY_READ, urelocs, remain*sizeof(*urelocs))))
|
||||
return -EFAULT;
|
||||
|
||||
do {
|
||||
@ -1775,7 +1775,7 @@ out:
|
||||
}
|
||||
}
|
||||
|
||||
return err ?: have_copy;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int eb_relocate(struct i915_execbuffer *eb)
|
||||
@ -1825,7 +1825,7 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)
|
||||
int err;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const struct drm_i915_gem_exec_object2 *entry = &eb->exec[i];
|
||||
struct drm_i915_gem_exec_object2 *entry = &eb->exec[i];
|
||||
struct i915_vma *vma = exec_to_vma(entry);
|
||||
struct drm_i915_gem_object *obj = vma->obj;
|
||||
|
||||
@ -1841,12 +1841,14 @@ static int eb_move_to_gpu(struct i915_execbuffer *eb)
|
||||
eb->request->capture_list = capture;
|
||||
}
|
||||
|
||||
if (unlikely(obj->cache_dirty && !obj->cache_coherent)) {
|
||||
if (i915_gem_clflush_object(obj, 0))
|
||||
entry->flags &= ~EXEC_OBJECT_ASYNC;
|
||||
}
|
||||
|
||||
if (entry->flags & EXEC_OBJECT_ASYNC)
|
||||
goto skip_flushes;
|
||||
|
||||
if (unlikely(obj->cache_dirty && !obj->cache_coherent))
|
||||
i915_gem_clflush_object(obj, 0);
|
||||
|
||||
err = i915_gem_request_await_object
|
||||
(eb->request, obj, entry->flags & EXEC_OBJECT_WRITE);
|
||||
if (err)
|
||||
@ -2209,7 +2211,7 @@ i915_gem_do_execbuffer(struct drm_device *dev,
|
||||
goto err_unlock;
|
||||
|
||||
err = eb_relocate(&eb);
|
||||
if (err)
|
||||
if (err) {
|
||||
/*
|
||||
* If the user expects the execobject.offset and
|
||||
* reloc.presumed_offset to be an exact match,
|
||||
@ -2218,8 +2220,8 @@ i915_gem_do_execbuffer(struct drm_device *dev,
|
||||
* relocation.
|
||||
*/
|
||||
args->flags &= ~__EXEC_HAS_RELOC;
|
||||
if (err < 0)
|
||||
goto err_vma;
|
||||
}
|
||||
|
||||
if (unlikely(eb.batch->exec_entry->flags & EXEC_OBJECT_WRITE)) {
|
||||
DRM_DEBUG("Attempting to use self-modifying batch buffer\n");
|
||||
|
@ -284,12 +284,12 @@ static inline void __i915_vma_pin(struct i915_vma *vma)
|
||||
|
||||
static inline void __i915_vma_unpin(struct i915_vma *vma)
|
||||
{
|
||||
GEM_BUG_ON(!i915_vma_is_pinned(vma));
|
||||
vma->flags--;
|
||||
}
|
||||
|
||||
static inline void i915_vma_unpin(struct i915_vma *vma)
|
||||
{
|
||||
GEM_BUG_ON(!i915_vma_is_pinned(vma));
|
||||
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
|
||||
__i915_vma_unpin(vma);
|
||||
}
|
||||
|
@ -1896,8 +1896,8 @@ static void cnl_ddi_vswing_sequence(struct intel_encoder *encoder, u32 level)
|
||||
val = I915_READ(CNL_PORT_TX_DW4_LN(port, ln));
|
||||
val &= ~LOADGEN_SELECT;
|
||||
|
||||
if (((rate < 600000) && (width == 4) && (ln >= 1)) ||
|
||||
((rate < 600000) && (width < 4) && ((ln == 1) || (ln == 2)))) {
|
||||
if ((rate <= 600000 && width == 4 && ln >= 1) ||
|
||||
(rate <= 600000 && width < 4 && (ln == 1 || ln == 2))) {
|
||||
val |= LOADGEN_SELECT;
|
||||
}
|
||||
I915_WRITE(CNL_PORT_TX_DW4_LN(port, ln), val);
|
||||
|
@ -3427,26 +3427,6 @@ static void intel_complete_page_flips(struct drm_i915_private *dev_priv)
|
||||
intel_finish_page_flip_cs(dev_priv, crtc->pipe);
|
||||
}
|
||||
|
||||
static void intel_update_primary_planes(struct drm_device *dev)
|
||||
{
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
for_each_crtc(dev, crtc) {
|
||||
struct intel_plane *plane = to_intel_plane(crtc->primary);
|
||||
struct intel_plane_state *plane_state =
|
||||
to_intel_plane_state(plane->base.state);
|
||||
|
||||
if (plane_state->base.visible) {
|
||||
trace_intel_update_plane(&plane->base,
|
||||
to_intel_crtc(crtc));
|
||||
|
||||
plane->update_plane(plane,
|
||||
to_intel_crtc_state(crtc->state),
|
||||
plane_state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
__intel_display_resume(struct drm_device *dev,
|
||||
struct drm_atomic_state *state,
|
||||
@ -3499,6 +3479,12 @@ void intel_prepare_reset(struct drm_i915_private *dev_priv)
|
||||
struct drm_atomic_state *state;
|
||||
int ret;
|
||||
|
||||
|
||||
/* reset doesn't touch the display */
|
||||
if (!i915.force_reset_modeset_test &&
|
||||
!gpu_reset_clobbers_display(dev_priv))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Need mode_config.mutex so that we don't
|
||||
* trample ongoing ->detect() and whatnot.
|
||||
@ -3512,12 +3498,6 @@ void intel_prepare_reset(struct drm_i915_private *dev_priv)
|
||||
|
||||
drm_modeset_backoff(ctx);
|
||||
}
|
||||
|
||||
/* reset doesn't touch the display, but flips might get nuked anyway, */
|
||||
if (!i915.force_reset_modeset_test &&
|
||||
!gpu_reset_clobbers_display(dev_priv))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Disabling the crtcs gracefully seems nicer. Also the
|
||||
* g33 docs say we should at least disable all the planes.
|
||||
@ -3547,6 +3527,14 @@ void intel_finish_reset(struct drm_i915_private *dev_priv)
|
||||
struct drm_atomic_state *state = dev_priv->modeset_restore_state;
|
||||
int ret;
|
||||
|
||||
/* reset doesn't touch the display */
|
||||
if (!i915.force_reset_modeset_test &&
|
||||
!gpu_reset_clobbers_display(dev_priv))
|
||||
return;
|
||||
|
||||
if (!state)
|
||||
goto unlock;
|
||||
|
||||
/*
|
||||
* Flips in the rings will be nuked by the reset,
|
||||
* so complete all pending flips so that user space
|
||||
@ -3558,22 +3546,10 @@ void intel_finish_reset(struct drm_i915_private *dev_priv)
|
||||
|
||||
/* reset doesn't touch the display */
|
||||
if (!gpu_reset_clobbers_display(dev_priv)) {
|
||||
if (!state) {
|
||||
/*
|
||||
* Flips in the rings have been nuked by the reset,
|
||||
* so update the base address of all primary
|
||||
* planes to the the last fb to make sure we're
|
||||
* showing the correct fb after a reset.
|
||||
*
|
||||
* FIXME: Atomic will make this obsolete since we won't schedule
|
||||
* CS-based flips (which might get lost in gpu resets) any more.
|
||||
*/
|
||||
intel_update_primary_planes(dev);
|
||||
} else {
|
||||
ret = __intel_display_resume(dev, state, ctx);
|
||||
/* for testing only restore the display */
|
||||
ret = __intel_display_resume(dev, state, ctx);
|
||||
if (ret)
|
||||
DRM_ERROR("Restoring old state failed with %i\n", ret);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* The display has been reset as well,
|
||||
@ -3597,8 +3573,8 @@ void intel_finish_reset(struct drm_i915_private *dev_priv)
|
||||
intel_hpd_init(dev_priv);
|
||||
}
|
||||
|
||||
if (state)
|
||||
drm_atomic_state_put(state);
|
||||
drm_atomic_state_put(state);
|
||||
unlock:
|
||||
drm_modeset_drop_locks(ctx);
|
||||
drm_modeset_acquire_fini(ctx);
|
||||
mutex_unlock(&dev->mode_config.mutex);
|
||||
@ -9117,6 +9093,13 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
|
||||
u64 power_domain_mask;
|
||||
bool active;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
intel_crtc_init_scalers(crtc, pipe_config);
|
||||
|
||||
pipe_config->scaler_state.scaler_id = -1;
|
||||
pipe_config->scaler_state.scaler_users &= ~(1 << SKL_CRTC_INDEX);
|
||||
}
|
||||
|
||||
power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
|
||||
if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
|
||||
return false;
|
||||
@ -9145,13 +9128,6 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
|
||||
pipe_config->gamma_mode =
|
||||
I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
intel_crtc_init_scalers(crtc, pipe_config);
|
||||
|
||||
pipe_config->scaler_state.scaler_id = -1;
|
||||
pipe_config->scaler_state.scaler_users &= ~(1 << SKL_CRTC_INDEX);
|
||||
}
|
||||
|
||||
power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
|
||||
if (intel_display_power_get_if_enabled(dev_priv, power_domain)) {
|
||||
power_domain_mask |= BIT_ULL(power_domain);
|
||||
@ -9540,7 +9516,16 @@ static void i9xx_update_cursor(struct intel_plane *plane,
|
||||
* On some platforms writing CURCNTR first will also
|
||||
* cause CURPOS to be armed by the CURBASE write.
|
||||
* Without the CURCNTR write the CURPOS write would
|
||||
* arm itself.
|
||||
* arm itself. Thus we always start the full update
|
||||
* with a CURCNTR write.
|
||||
*
|
||||
* On other platforms CURPOS always requires the
|
||||
* CURBASE write to arm the update. Additonally
|
||||
* a write to any of the cursor register will cancel
|
||||
* an already armed cursor update. Thus leaving out
|
||||
* the CURBASE write after CURPOS could lead to a
|
||||
* cursor that doesn't appear to move, or even change
|
||||
* shape. Thus we always write CURBASE.
|
||||
*
|
||||
* CURCNTR and CUR_FBC_CTL are always
|
||||
* armed by the CURBASE write only.
|
||||
@ -9559,6 +9544,7 @@ static void i9xx_update_cursor(struct intel_plane *plane,
|
||||
plane->cursor.cntl = cntl;
|
||||
} else {
|
||||
I915_WRITE_FW(CURPOS(pipe), pos);
|
||||
I915_WRITE_FW(CURBASE(pipe), base);
|
||||
}
|
||||
|
||||
POSTING_READ_FW(CURBASE(pipe));
|
||||
|
@ -45,7 +45,7 @@ static bool is_supported_device(struct drm_i915_private *dev_priv)
|
||||
return true;
|
||||
if (IS_SKYLAKE(dev_priv))
|
||||
return true;
|
||||
if (IS_KABYLAKE(dev_priv) && INTEL_DEVID(dev_priv) == 0x591D)
|
||||
if (IS_KABYLAKE(dev_priv))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
@ -4463,8 +4463,8 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
|
||||
if ((cpp * cstate->base.adjusted_mode.crtc_htotal / 512 < 1) &&
|
||||
(plane_bytes_per_line / 512 < 1))
|
||||
selected_result = method2;
|
||||
else if ((ddb_allocation && ddb_allocation /
|
||||
fixed_16_16_to_u32_round_up(plane_blocks_per_line)) >= 1)
|
||||
else if (ddb_allocation >=
|
||||
fixed_16_16_to_u32_round_up(plane_blocks_per_line))
|
||||
selected_result = min_fixed_16_16(method1, method2);
|
||||
else if (latency >= linetime_us)
|
||||
selected_result = min_fixed_16_16(method1, method2);
|
||||
|
@ -206,7 +206,7 @@ struct drm_i915_private *mock_gem_device(void)
|
||||
mkwrite_device_info(i915)->ring_mask = BIT(0);
|
||||
i915->engine[RCS] = mock_engine(i915, "mock");
|
||||
if (!i915->engine[RCS])
|
||||
goto err_dependencies;
|
||||
goto err_priorities;
|
||||
|
||||
i915->kernel_context = mock_context(i915, NULL);
|
||||
if (!i915->kernel_context)
|
||||
|
@ -1158,8 +1158,6 @@ nouveau_connector_aux_xfer(struct drm_dp_aux *obj, struct drm_dp_aux_msg *msg)
|
||||
return -ENODEV;
|
||||
if (WARN_ON(msg->size > 16))
|
||||
return -E2BIG;
|
||||
if (msg->size == 0)
|
||||
return msg->size;
|
||||
|
||||
ret = nvkm_i2c_aux_acquire(aux);
|
||||
if (ret)
|
||||
|
@ -409,7 +409,6 @@ nouveau_display_fini(struct drm_device *dev, bool suspend)
|
||||
struct nouveau_display *disp = nouveau_display(dev);
|
||||
struct nouveau_drm *drm = nouveau_drm(dev);
|
||||
struct drm_connector *connector;
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
if (!suspend) {
|
||||
if (drm_drv_uses_atomic_modeset(dev))
|
||||
@ -418,10 +417,6 @@ nouveau_display_fini(struct drm_device *dev, bool suspend)
|
||||
drm_crtc_force_disable_all(dev);
|
||||
}
|
||||
|
||||
/* Make sure that drm and hw vblank irqs get properly disabled. */
|
||||
drm_for_each_crtc(crtc, dev)
|
||||
drm_crtc_vblank_off(crtc);
|
||||
|
||||
/* disable flip completion events */
|
||||
nvif_notify_put(&drm->flip);
|
||||
|
||||
|
@ -3674,15 +3674,24 @@ nv50_sor_create(struct drm_connector *connector, struct dcb_output *dcbe)
|
||||
drm_mode_connector_attach_encoder(connector, encoder);
|
||||
|
||||
if (dcbe->type == DCB_OUTPUT_DP) {
|
||||
struct nv50_disp *disp = nv50_disp(encoder->dev);
|
||||
struct nvkm_i2c_aux *aux =
|
||||
nvkm_i2c_aux_find(i2c, dcbe->i2c_index);
|
||||
if (aux) {
|
||||
nv_encoder->i2c = &nv_connector->aux.ddc;
|
||||
if (disp->disp->oclass < GF110_DISP) {
|
||||
/* HW has no support for address-only
|
||||
* transactions, so we're required to
|
||||
* use custom I2C-over-AUX code.
|
||||
*/
|
||||
nv_encoder->i2c = &aux->i2c;
|
||||
} else {
|
||||
nv_encoder->i2c = &nv_connector->aux.ddc;
|
||||
}
|
||||
nv_encoder->aux = aux;
|
||||
}
|
||||
|
||||
/*TODO: Use DP Info Table to check for support. */
|
||||
if (nv50_disp(encoder->dev)->disp->oclass >= GF110_DISP) {
|
||||
if (disp->disp->oclass >= GF110_DISP) {
|
||||
ret = nv50_mstm_new(nv_encoder, &nv_connector->aux, 16,
|
||||
nv_connector->base.base.id,
|
||||
&nv_encoder->dp.mstm);
|
||||
@ -3931,6 +3940,8 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
|
||||
NV_ATOMIC(drm, "%s: clr %04x (set %04x)\n", crtc->name,
|
||||
asyh->clr.mask, asyh->set.mask);
|
||||
if (crtc_state->active && !asyh->state.active)
|
||||
drm_crtc_vblank_off(crtc);
|
||||
|
||||
if (asyh->clr.mask) {
|
||||
nv50_head_flush_clr(head, asyh, atom->flush_disable);
|
||||
@ -4016,11 +4027,13 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
nv50_head_flush_set(head, asyh);
|
||||
interlock_core = 1;
|
||||
}
|
||||
}
|
||||
|
||||
for_each_crtc_in_state(state, crtc, crtc_state, i) {
|
||||
if (crtc->state->event)
|
||||
drm_crtc_vblank_get(crtc);
|
||||
if (asyh->state.active) {
|
||||
if (!crtc_state->active)
|
||||
drm_crtc_vblank_on(crtc);
|
||||
if (asyh->state.event)
|
||||
drm_crtc_vblank_get(crtc);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update plane(s). */
|
||||
@ -4067,12 +4080,14 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
if (crtc->state->event) {
|
||||
unsigned long flags;
|
||||
/* Get correct count/ts if racing with vblank irq */
|
||||
drm_accurate_vblank_count(crtc);
|
||||
if (crtc->state->active)
|
||||
drm_accurate_vblank_count(crtc);
|
||||
spin_lock_irqsave(&crtc->dev->event_lock, flags);
|
||||
drm_crtc_send_vblank_event(crtc, crtc->state->event);
|
||||
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
||||
crtc->state->event = NULL;
|
||||
drm_crtc_vblank_put(crtc);
|
||||
if (crtc->state->active)
|
||||
drm_crtc_vblank_put(crtc);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,7 @@ struct nvkm_ior {
|
||||
unsigned proto_evo:4;
|
||||
enum nvkm_ior_proto {
|
||||
CRT,
|
||||
TV,
|
||||
TMDS,
|
||||
LVDS,
|
||||
DP,
|
||||
|
@ -22,7 +22,7 @@ struct nv50_disp {
|
||||
u8 type[3];
|
||||
} pior;
|
||||
|
||||
struct nv50_disp_chan *chan[17];
|
||||
struct nv50_disp_chan *chan[21];
|
||||
};
|
||||
|
||||
void nv50_disp_super_1(struct nv50_disp *);
|
||||
|
@ -62,6 +62,7 @@ nvkm_outp_xlat(struct nvkm_outp *outp, enum nvkm_ior_type *type)
|
||||
case 0:
|
||||
switch (outp->info.type) {
|
||||
case DCB_OUTPUT_ANALOG: *type = DAC; return CRT;
|
||||
case DCB_OUTPUT_TV : *type = DAC; return TV;
|
||||
case DCB_OUTPUT_TMDS : *type = SOR; return TMDS;
|
||||
case DCB_OUTPUT_LVDS : *type = SOR; return LVDS;
|
||||
case DCB_OUTPUT_DP : *type = SOR; return DP;
|
||||
|
@ -129,7 +129,7 @@ gf100_bar_init(struct nvkm_bar *base)
|
||||
|
||||
if (bar->bar[0].mem) {
|
||||
addr = nvkm_memory_addr(bar->bar[0].mem) >> 12;
|
||||
nvkm_wr32(device, 0x001714, 0xc0000000 | addr);
|
||||
nvkm_wr32(device, 0x001714, 0x80000000 | addr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -25,6 +25,7 @@ nvkm-y += nvkm/subdev/i2c/bit.o
|
||||
|
||||
nvkm-y += nvkm/subdev/i2c/aux.o
|
||||
nvkm-y += nvkm/subdev/i2c/auxg94.o
|
||||
nvkm-y += nvkm/subdev/i2c/auxgf119.o
|
||||
nvkm-y += nvkm/subdev/i2c/auxgm200.o
|
||||
|
||||
nvkm-y += nvkm/subdev/i2c/anx9805.o
|
||||
|
@ -117,6 +117,10 @@ int
|
||||
nvkm_i2c_aux_xfer(struct nvkm_i2c_aux *aux, bool retry, u8 type,
|
||||
u32 addr, u8 *data, u8 *size)
|
||||
{
|
||||
if (!*size && !aux->func->address_only) {
|
||||
AUX_ERR(aux, "address-only transaction dropped");
|
||||
return -ENOSYS;
|
||||
}
|
||||
return aux->func->xfer(aux, retry, type, addr, data, size);
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "pad.h"
|
||||
|
||||
struct nvkm_i2c_aux_func {
|
||||
bool address_only;
|
||||
int (*xfer)(struct nvkm_i2c_aux *, bool retry, u8 type,
|
||||
u32 addr, u8 *data, u8 *size);
|
||||
int (*lnk_ctl)(struct nvkm_i2c_aux *, int link_nr, int link_bw,
|
||||
@ -17,7 +18,12 @@ void nvkm_i2c_aux_del(struct nvkm_i2c_aux **);
|
||||
int nvkm_i2c_aux_xfer(struct nvkm_i2c_aux *, bool retry, u8 type,
|
||||
u32 addr, u8 *data, u8 *size);
|
||||
|
||||
int g94_i2c_aux_new_(const struct nvkm_i2c_aux_func *, struct nvkm_i2c_pad *,
|
||||
int, u8, struct nvkm_i2c_aux **);
|
||||
|
||||
int g94_i2c_aux_new(struct nvkm_i2c_pad *, int, u8, struct nvkm_i2c_aux **);
|
||||
int g94_i2c_aux_xfer(struct nvkm_i2c_aux *, bool, u8, u32, u8 *, u8 *);
|
||||
int gf119_i2c_aux_new(struct nvkm_i2c_pad *, int, u8, struct nvkm_i2c_aux **);
|
||||
int gm200_i2c_aux_new(struct nvkm_i2c_pad *, int, u8, struct nvkm_i2c_aux **);
|
||||
|
||||
#define AUX_MSG(b,l,f,a...) do { \
|
||||
|
@ -72,7 +72,7 @@ g94_i2c_aux_init(struct g94_i2c_aux *aux)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
g94_i2c_aux_xfer(struct nvkm_i2c_aux *obj, bool retry,
|
||||
u8 type, u32 addr, u8 *data, u8 *size)
|
||||
{
|
||||
@ -105,9 +105,9 @@ g94_i2c_aux_xfer(struct nvkm_i2c_aux *obj, bool retry,
|
||||
}
|
||||
|
||||
ctrl = nvkm_rd32(device, 0x00e4e4 + base);
|
||||
ctrl &= ~0x0001f0ff;
|
||||
ctrl &= ~0x0001f1ff;
|
||||
ctrl |= type << 12;
|
||||
ctrl |= *size - 1;
|
||||
ctrl |= (*size ? (*size - 1) : 0x00000100);
|
||||
nvkm_wr32(device, 0x00e4e0 + base, addr);
|
||||
|
||||
/* (maybe) retry transaction a number of times on failure... */
|
||||
@ -160,14 +160,10 @@ out:
|
||||
return ret < 0 ? ret : (stat & 0x000f0000) >> 16;
|
||||
}
|
||||
|
||||
static const struct nvkm_i2c_aux_func
|
||||
g94_i2c_aux_func = {
|
||||
.xfer = g94_i2c_aux_xfer,
|
||||
};
|
||||
|
||||
int
|
||||
g94_i2c_aux_new(struct nvkm_i2c_pad *pad, int index, u8 drive,
|
||||
struct nvkm_i2c_aux **paux)
|
||||
g94_i2c_aux_new_(const struct nvkm_i2c_aux_func *func,
|
||||
struct nvkm_i2c_pad *pad, int index, u8 drive,
|
||||
struct nvkm_i2c_aux **paux)
|
||||
{
|
||||
struct g94_i2c_aux *aux;
|
||||
|
||||
@ -175,8 +171,20 @@ g94_i2c_aux_new(struct nvkm_i2c_pad *pad, int index, u8 drive,
|
||||
return -ENOMEM;
|
||||
*paux = &aux->base;
|
||||
|
||||
nvkm_i2c_aux_ctor(&g94_i2c_aux_func, pad, index, &aux->base);
|
||||
nvkm_i2c_aux_ctor(func, pad, index, &aux->base);
|
||||
aux->ch = drive;
|
||||
aux->base.intr = 1 << aux->ch;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct nvkm_i2c_aux_func
|
||||
g94_i2c_aux = {
|
||||
.xfer = g94_i2c_aux_xfer,
|
||||
};
|
||||
|
||||
int
|
||||
g94_i2c_aux_new(struct nvkm_i2c_pad *pad, int index, u8 drive,
|
||||
struct nvkm_i2c_aux **paux)
|
||||
{
|
||||
return g94_i2c_aux_new_(&g94_i2c_aux, pad, index, drive, paux);
|
||||
}
|
||||
|
35
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgf119.c
Normal file
35
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgf119.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright 2017 Red Hat Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#include "aux.h"
|
||||
|
||||
static const struct nvkm_i2c_aux_func
|
||||
gf119_i2c_aux = {
|
||||
.address_only = true,
|
||||
.xfer = g94_i2c_aux_xfer,
|
||||
};
|
||||
|
||||
int
|
||||
gf119_i2c_aux_new(struct nvkm_i2c_pad *pad, int index, u8 drive,
|
||||
struct nvkm_i2c_aux **paux)
|
||||
{
|
||||
return g94_i2c_aux_new_(&gf119_i2c_aux, pad, index, drive, paux);
|
||||
}
|
@ -105,9 +105,9 @@ gm200_i2c_aux_xfer(struct nvkm_i2c_aux *obj, bool retry,
|
||||
}
|
||||
|
||||
ctrl = nvkm_rd32(device, 0x00d954 + base);
|
||||
ctrl &= ~0x0001f0ff;
|
||||
ctrl &= ~0x0001f1ff;
|
||||
ctrl |= type << 12;
|
||||
ctrl |= *size - 1;
|
||||
ctrl |= (*size ? (*size - 1) : 0x00000100);
|
||||
nvkm_wr32(device, 0x00d950 + base, addr);
|
||||
|
||||
/* (maybe) retry transaction a number of times on failure... */
|
||||
@ -162,6 +162,7 @@ out:
|
||||
|
||||
static const struct nvkm_i2c_aux_func
|
||||
gm200_i2c_aux_func = {
|
||||
.address_only = true,
|
||||
.xfer = gm200_i2c_aux_xfer,
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
static const struct nvkm_i2c_pad_func
|
||||
gf119_i2c_pad_s_func = {
|
||||
.bus_new_4 = gf119_i2c_bus_new,
|
||||
.aux_new_6 = g94_i2c_aux_new,
|
||||
.aux_new_6 = gf119_i2c_aux_new,
|
||||
.mode = g94_i2c_pad_mode,
|
||||
};
|
||||
|
||||
@ -41,7 +41,7 @@ gf119_i2c_pad_s_new(struct nvkm_i2c *i2c, int id, struct nvkm_i2c_pad **ppad)
|
||||
static const struct nvkm_i2c_pad_func
|
||||
gf119_i2c_pad_x_func = {
|
||||
.bus_new_4 = gf119_i2c_bus_new,
|
||||
.aux_new_6 = g94_i2c_aux_new,
|
||||
.aux_new_6 = gf119_i2c_aux_new,
|
||||
};
|
||||
|
||||
int
|
||||
|
@ -5,6 +5,10 @@ config DRM_ROCKCHIP
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_PANEL
|
||||
select VIDEOMODE_HELPERS
|
||||
select DRM_ANALOGIX_DP if ROCKCHIP_ANALOGIX_DP
|
||||
select DRM_DW_HDMI if ROCKCHIP_DW_HDMI
|
||||
select DRM_MIPI_DSI if ROCKCHIP_DW_MIPI_DSI
|
||||
select SND_SOC_HDMI_CODEC if ROCKCHIP_CDN_DP && SND_SOC
|
||||
help
|
||||
Choose this option if you have a Rockchip soc chipset.
|
||||
This driver provides kernel mode setting and buffer
|
||||
@ -12,10 +16,10 @@ config DRM_ROCKCHIP
|
||||
2D or 3D acceleration; acceleration is performed by other
|
||||
IP found on the SoC.
|
||||
|
||||
if DRM_ROCKCHIP
|
||||
|
||||
config ROCKCHIP_ANALOGIX_DP
|
||||
bool "Rockchip specific extensions for Analogix DP driver"
|
||||
depends on DRM_ROCKCHIP
|
||||
select DRM_ANALOGIX_DP
|
||||
help
|
||||
This selects support for Rockchip SoC specific extensions
|
||||
for the Analogix Core DP driver. If you want to enable DP
|
||||
@ -23,9 +27,7 @@ config ROCKCHIP_ANALOGIX_DP
|
||||
|
||||
config ROCKCHIP_CDN_DP
|
||||
bool "Rockchip cdn DP"
|
||||
depends on DRM_ROCKCHIP
|
||||
depends on EXTCON
|
||||
select SND_SOC_HDMI_CODEC if SND_SOC
|
||||
depends on EXTCON=y || (EXTCON=m && DRM_ROCKCHIP=m)
|
||||
help
|
||||
This selects support for Rockchip SoC specific extensions
|
||||
for the cdn DP driver. If you want to enable Dp on
|
||||
@ -34,8 +36,6 @@ config ROCKCHIP_CDN_DP
|
||||
|
||||
config ROCKCHIP_DW_HDMI
|
||||
bool "Rockchip specific extensions for Synopsys DW HDMI"
|
||||
depends on DRM_ROCKCHIP
|
||||
select DRM_DW_HDMI
|
||||
help
|
||||
This selects support for Rockchip SoC specific extensions
|
||||
for the Synopsys DesignWare HDMI driver. If you want to
|
||||
@ -44,8 +44,6 @@ config ROCKCHIP_DW_HDMI
|
||||
|
||||
config ROCKCHIP_DW_MIPI_DSI
|
||||
bool "Rockchip specific extensions for Synopsys DW MIPI DSI"
|
||||
depends on DRM_ROCKCHIP
|
||||
select DRM_MIPI_DSI
|
||||
help
|
||||
This selects support for Rockchip SoC specific extensions
|
||||
for the Synopsys DesignWare HDMI driver. If you want to
|
||||
@ -54,8 +52,9 @@ config ROCKCHIP_DW_MIPI_DSI
|
||||
|
||||
config ROCKCHIP_INNO_HDMI
|
||||
bool "Rockchip specific extensions for Innosilicon HDMI"
|
||||
depends on DRM_ROCKCHIP
|
||||
help
|
||||
This selects support for Rockchip SoC specific extensions
|
||||
for the Innosilicon HDMI driver. If you want to enable
|
||||
HDMI on RK3036 based SoC, you should select this option.
|
||||
|
||||
endif
|
||||
|
@ -30,49 +30,49 @@
|
||||
#include <drm/ttm/ttm_placement.h>
|
||||
#include <drm/ttm/ttm_page_alloc.h>
|
||||
|
||||
static struct ttm_place vram_placement_flags = {
|
||||
static const struct ttm_place vram_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static struct ttm_place vram_ne_placement_flags = {
|
||||
static const struct ttm_place vram_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
static struct ttm_place sys_placement_flags = {
|
||||
static const struct ttm_place sys_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static struct ttm_place sys_ne_placement_flags = {
|
||||
static const struct ttm_place sys_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
static struct ttm_place gmr_placement_flags = {
|
||||
static const struct ttm_place gmr_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static struct ttm_place gmr_ne_placement_flags = {
|
||||
static const struct ttm_place gmr_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
};
|
||||
|
||||
static struct ttm_place mob_placement_flags = {
|
||||
static const struct ttm_place mob_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
|
||||
};
|
||||
|
||||
static struct ttm_place mob_ne_placement_flags = {
|
||||
static const struct ttm_place mob_ne_placement_flags = {
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
.flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
|
||||
@ -85,7 +85,7 @@ struct ttm_placement vmw_vram_placement = {
|
||||
.busy_placement = &vram_placement_flags
|
||||
};
|
||||
|
||||
static struct ttm_place vram_gmr_placement_flags[] = {
|
||||
static const struct ttm_place vram_gmr_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
@ -97,7 +97,7 @@ static struct ttm_place vram_gmr_placement_flags[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct ttm_place gmr_vram_placement_flags[] = {
|
||||
static const struct ttm_place gmr_vram_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
@ -116,7 +116,7 @@ struct ttm_placement vmw_vram_gmr_placement = {
|
||||
.busy_placement = &gmr_placement_flags
|
||||
};
|
||||
|
||||
static struct ttm_place vram_gmr_ne_placement_flags[] = {
|
||||
static const struct ttm_place vram_gmr_ne_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
@ -165,7 +165,7 @@ struct ttm_placement vmw_sys_ne_placement = {
|
||||
.busy_placement = &sys_ne_placement_flags
|
||||
};
|
||||
|
||||
static struct ttm_place evictable_placement_flags[] = {
|
||||
static const struct ttm_place evictable_placement_flags[] = {
|
||||
{
|
||||
.fpfn = 0,
|
||||
.lpfn = 0,
|
||||
|
@ -779,8 +779,8 @@ static int vmw_cmdbuf_space_pool(struct vmw_cmdbuf_man *man,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
header->cb_header = dma_pool_alloc(man->headers, GFP_KERNEL,
|
||||
&header->handle);
|
||||
header->cb_header = dma_pool_zalloc(man->headers, GFP_KERNEL,
|
||||
&header->handle);
|
||||
if (!header->cb_header) {
|
||||
ret = -ENOMEM;
|
||||
goto out_no_cb_header;
|
||||
@ -790,7 +790,6 @@ static int vmw_cmdbuf_space_pool(struct vmw_cmdbuf_man *man,
|
||||
cb_hdr = header->cb_header;
|
||||
offset = header->node.start << PAGE_SHIFT;
|
||||
header->cmd = man->map + offset;
|
||||
memset(cb_hdr, 0, sizeof(*cb_hdr));
|
||||
if (man->using_mob) {
|
||||
cb_hdr->flags = SVGA_CB_FLAG_MOB;
|
||||
cb_hdr->ptr.mob.mobid = man->cmd_space->mem.start;
|
||||
@ -827,8 +826,8 @@ static int vmw_cmdbuf_space_inline(struct vmw_cmdbuf_man *man,
|
||||
if (WARN_ON_ONCE(size > VMW_CMDBUF_INLINE_SIZE))
|
||||
return -ENOMEM;
|
||||
|
||||
dheader = dma_pool_alloc(man->dheaders, GFP_KERNEL,
|
||||
&header->handle);
|
||||
dheader = dma_pool_zalloc(man->dheaders, GFP_KERNEL,
|
||||
&header->handle);
|
||||
if (!dheader)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -837,7 +836,6 @@ static int vmw_cmdbuf_space_inline(struct vmw_cmdbuf_man *man,
|
||||
cb_hdr = &dheader->cb_header;
|
||||
header->cb_header = cb_hdr;
|
||||
header->cmd = dheader->cmd;
|
||||
memset(dheader, 0, sizeof(*dheader));
|
||||
cb_hdr->status = SVGA_CB_STATUS_NONE;
|
||||
cb_hdr->flags = SVGA_CB_FLAG_NONE;
|
||||
cb_hdr->ptr.pa = (u64)header->handle +
|
||||
|
@ -205,7 +205,7 @@ int vmw_cmdbuf_res_add(struct vmw_cmdbuf_res_manager *man,
|
||||
int ret;
|
||||
|
||||
cres = kzalloc(sizeof(*cres), GFP_KERNEL);
|
||||
if (unlikely(cres == NULL))
|
||||
if (unlikely(!cres))
|
||||
return -ENOMEM;
|
||||
|
||||
cres->hash.key = user_key | (res_type << 24);
|
||||
@ -291,7 +291,7 @@ vmw_cmdbuf_res_man_create(struct vmw_private *dev_priv)
|
||||
int ret;
|
||||
|
||||
man = kzalloc(sizeof(*man), GFP_KERNEL);
|
||||
if (man == NULL)
|
||||
if (!man)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
man->dev_priv = dev_priv;
|
||||
|
@ -210,8 +210,8 @@ static int vmw_gb_context_init(struct vmw_private *dev_priv,
|
||||
for (i = 0; i < SVGA_COTABLE_DX10_MAX; ++i) {
|
||||
uctx->cotables[i] = vmw_cotable_alloc(dev_priv,
|
||||
&uctx->res, i);
|
||||
if (unlikely(uctx->cotables[i] == NULL)) {
|
||||
ret = -ENOMEM;
|
||||
if (unlikely(IS_ERR(uctx->cotables[i]))) {
|
||||
ret = PTR_ERR(uctx->cotables[i]);
|
||||
goto out_cotables;
|
||||
}
|
||||
}
|
||||
@ -777,7 +777,7 @@ static int vmw_context_define(struct drm_device *dev, void *data,
|
||||
}
|
||||
|
||||
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
||||
if (unlikely(ctx == NULL)) {
|
||||
if (unlikely(!ctx)) {
|
||||
ttm_mem_global_free(vmw_mem_glob(dev_priv),
|
||||
vmw_user_context_size);
|
||||
ret = -ENOMEM;
|
||||
|
@ -584,7 +584,7 @@ struct vmw_resource *vmw_cotable_alloc(struct vmw_private *dev_priv,
|
||||
return ERR_PTR(ret);
|
||||
|
||||
vcotbl = kzalloc(sizeof(*vcotbl), GFP_KERNEL);
|
||||
if (unlikely(vcotbl == NULL)) {
|
||||
if (unlikely(!vcotbl)) {
|
||||
ret = -ENOMEM;
|
||||
goto out_no_alloc;
|
||||
}
|
||||
|
@ -227,7 +227,7 @@ static const struct drm_ioctl_desc vmw_ioctls[] = {
|
||||
DRM_AUTH | DRM_RENDER_ALLOW),
|
||||
};
|
||||
|
||||
static struct pci_device_id vmw_pci_id_list[] = {
|
||||
static const struct pci_device_id vmw_pci_id_list[] = {
|
||||
{0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII},
|
||||
{0, 0, 0}
|
||||
};
|
||||
@ -630,7 +630,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
|
||||
char host_log[100] = {0};
|
||||
|
||||
dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
|
||||
if (unlikely(dev_priv == NULL)) {
|
||||
if (unlikely(!dev_priv)) {
|
||||
DRM_ERROR("Failed allocating a device private struct.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -1035,7 +1035,7 @@ static int vmw_driver_open(struct drm_device *dev, struct drm_file *file_priv)
|
||||
int ret = -ENOMEM;
|
||||
|
||||
vmw_fp = kzalloc(sizeof(*vmw_fp), GFP_KERNEL);
|
||||
if (unlikely(vmw_fp == NULL))
|
||||
if (unlikely(!vmw_fp))
|
||||
return ret;
|
||||
|
||||
vmw_fp->tfile = ttm_object_file_init(dev_priv->tdev, 10);
|
||||
@ -1196,7 +1196,7 @@ static int vmw_master_create(struct drm_device *dev,
|
||||
struct vmw_master *vmaster;
|
||||
|
||||
vmaster = kzalloc(sizeof(*vmaster), GFP_KERNEL);
|
||||
if (unlikely(vmaster == NULL))
|
||||
if (unlikely(!vmaster))
|
||||
return -ENOMEM;
|
||||
|
||||
vmw_master_init(vmaster);
|
||||
|
@ -264,7 +264,7 @@ static int vmw_resource_val_add(struct vmw_sw_context *sw_context,
|
||||
}
|
||||
|
||||
node = kzalloc(sizeof(*node), GFP_KERNEL);
|
||||
if (unlikely(node == NULL)) {
|
||||
if (unlikely(!node)) {
|
||||
DRM_ERROR("Failed to allocate a resource validation "
|
||||
"entry.\n");
|
||||
return -ENOMEM;
|
||||
@ -452,7 +452,7 @@ static int vmw_resource_relocation_add(struct list_head *list,
|
||||
struct vmw_resource_relocation *rel;
|
||||
|
||||
rel = kmalloc(sizeof(*rel), GFP_KERNEL);
|
||||
if (unlikely(rel == NULL)) {
|
||||
if (unlikely(!rel)) {
|
||||
DRM_ERROR("Failed to allocate a resource relocation.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -519,7 +519,7 @@ static int vmw_cmd_invalid(struct vmw_private *dev_priv,
|
||||
struct vmw_sw_context *sw_context,
|
||||
SVGA3dCmdHeader *header)
|
||||
{
|
||||
return capable(CAP_SYS_ADMIN) ? : -EINVAL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int vmw_cmd_ok(struct vmw_private *dev_priv,
|
||||
@ -2584,7 +2584,7 @@ static int vmw_cmd_dx_set_vertex_buffers(struct vmw_private *dev_priv,
|
||||
|
||||
/**
|
||||
* vmw_cmd_dx_ia_set_vertex_buffers - Validate an
|
||||
* SVGA_3D_CMD_DX_IA_SET_VERTEX_BUFFERS command.
|
||||
* SVGA_3D_CMD_DX_IA_SET_INDEX_BUFFER command.
|
||||
*
|
||||
* @dev_priv: Pointer to a device private struct.
|
||||
* @sw_context: The software context being used for this batch.
|
||||
|
@ -284,7 +284,7 @@ struct vmw_fence_manager *vmw_fence_manager_init(struct vmw_private *dev_priv)
|
||||
{
|
||||
struct vmw_fence_manager *fman = kzalloc(sizeof(*fman), GFP_KERNEL);
|
||||
|
||||
if (unlikely(fman == NULL))
|
||||
if (unlikely(!fman))
|
||||
return NULL;
|
||||
|
||||
fman->dev_priv = dev_priv;
|
||||
@ -541,7 +541,7 @@ int vmw_fence_create(struct vmw_fence_manager *fman,
|
||||
int ret;
|
||||
|
||||
fence = kzalloc(sizeof(*fence), GFP_KERNEL);
|
||||
if (unlikely(fence == NULL))
|
||||
if (unlikely(!fence))
|
||||
return -ENOMEM;
|
||||
|
||||
ret = vmw_fence_obj_init(fman, fence, seqno,
|
||||
@ -606,7 +606,7 @@ int vmw_user_fence_create(struct drm_file *file_priv,
|
||||
return ret;
|
||||
|
||||
ufence = kzalloc(sizeof(*ufence), GFP_KERNEL);
|
||||
if (unlikely(ufence == NULL)) {
|
||||
if (unlikely(!ufence)) {
|
||||
ret = -ENOMEM;
|
||||
goto out_no_object;
|
||||
}
|
||||
@ -966,7 +966,7 @@ int vmw_event_fence_action_queue(struct drm_file *file_priv,
|
||||
struct vmw_fence_manager *fman = fman_from_fence(fence);
|
||||
|
||||
eaction = kzalloc(sizeof(*eaction), GFP_KERNEL);
|
||||
if (unlikely(eaction == NULL))
|
||||
if (unlikely(!eaction))
|
||||
return -ENOMEM;
|
||||
|
||||
eaction->event = event;
|
||||
@ -1002,7 +1002,7 @@ static int vmw_event_fence_action_create(struct drm_file *file_priv,
|
||||
int ret;
|
||||
|
||||
event = kzalloc(sizeof(*event), GFP_KERNEL);
|
||||
if (unlikely(event == NULL)) {
|
||||
if (unlikely(!event)) {
|
||||
DRM_ERROR("Failed to allocate an event.\n");
|
||||
ret = -ENOMEM;
|
||||
goto out_no_space;
|
||||
|
@ -121,7 +121,7 @@ static int vmw_gmrid_man_init(struct ttm_mem_type_manager *man,
|
||||
struct vmwgfx_gmrid_man *gman =
|
||||
kzalloc(sizeof(*gman), GFP_KERNEL);
|
||||
|
||||
if (unlikely(gman == NULL))
|
||||
if (unlikely(!gman))
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&gman->lock);
|
||||
|
@ -384,6 +384,12 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
|
||||
|
||||
hotspot_x = du->hotspot_x;
|
||||
hotspot_y = du->hotspot_y;
|
||||
|
||||
if (plane->fb) {
|
||||
hotspot_x += plane->fb->hot_x;
|
||||
hotspot_y += plane->fb->hot_y;
|
||||
}
|
||||
|
||||
du->cursor_surface = vps->surf;
|
||||
du->cursor_dmabuf = vps->dmabuf;
|
||||
|
||||
@ -411,6 +417,9 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
|
||||
vmw_cursor_update_position(dev_priv, true,
|
||||
du->cursor_x + hotspot_x,
|
||||
du->cursor_y + hotspot_y);
|
||||
|
||||
du->core_hotspot_x = hotspot_x - du->hotspot_x;
|
||||
du->core_hotspot_y = hotspot_y - du->hotspot_y;
|
||||
} else {
|
||||
DRM_ERROR("Failed to update cursor image\n");
|
||||
}
|
||||
|
@ -320,14 +320,14 @@ int vmw_otables_setup(struct vmw_private *dev_priv)
|
||||
|
||||
if (dev_priv->has_dx) {
|
||||
*otables = kmemdup(dx_tables, sizeof(dx_tables), GFP_KERNEL);
|
||||
if (*otables == NULL)
|
||||
if (!(*otables))
|
||||
return -ENOMEM;
|
||||
|
||||
dev_priv->otable_batch.num_otables = ARRAY_SIZE(dx_tables);
|
||||
} else {
|
||||
*otables = kmemdup(pre_dx_tables, sizeof(pre_dx_tables),
|
||||
GFP_KERNEL);
|
||||
if (*otables == NULL)
|
||||
if (!(*otables))
|
||||
return -ENOMEM;
|
||||
|
||||
dev_priv->otable_batch.num_otables = ARRAY_SIZE(pre_dx_tables);
|
||||
@ -407,7 +407,7 @@ struct vmw_mob *vmw_mob_create(unsigned long data_pages)
|
||||
{
|
||||
struct vmw_mob *mob = kzalloc(sizeof(*mob), GFP_KERNEL);
|
||||
|
||||
if (unlikely(mob == NULL))
|
||||
if (unlikely(!mob))
|
||||
return NULL;
|
||||
|
||||
mob->num_pages = vmw_mob_calculate_pt_pages(data_pages);
|
||||
|
@ -244,7 +244,7 @@ static int vmw_recv_msg(struct rpc_channel *channel, void **msg,
|
||||
|
||||
reply_len = ebx;
|
||||
reply = kzalloc(reply_len + 1, GFP_KERNEL);
|
||||
if (reply == NULL) {
|
||||
if (!reply) {
|
||||
DRM_ERROR("Cannot allocate memory for reply\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -340,7 +340,7 @@ int vmw_host_get_guestinfo(const char *guest_info_param,
|
||||
|
||||
msg_len = strlen(guest_info_param) + strlen("info-get ") + 1;
|
||||
msg = kzalloc(msg_len, GFP_KERNEL);
|
||||
if (msg == NULL) {
|
||||
if (!msg) {
|
||||
DRM_ERROR("Cannot allocate memory to get %s", guest_info_param);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -400,7 +400,7 @@ int vmw_host_log(const char *log)
|
||||
|
||||
msg_len = strlen(log) + strlen("log ") + 1;
|
||||
msg = kzalloc(msg_len, GFP_KERNEL);
|
||||
if (msg == NULL) {
|
||||
if (!msg) {
|
||||
DRM_ERROR("Cannot allocate memory for log message\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -446,7 +446,7 @@ int vmw_user_dmabuf_alloc(struct vmw_private *dev_priv,
|
||||
int ret;
|
||||
|
||||
user_bo = kzalloc(sizeof(*user_bo), GFP_KERNEL);
|
||||
if (unlikely(user_bo == NULL)) {
|
||||
if (unlikely(!user_bo)) {
|
||||
DRM_ERROR("Failed to allocate a buffer.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -836,7 +836,7 @@ static int vmw_resource_buf_alloc(struct vmw_resource *res,
|
||||
}
|
||||
|
||||
backup = kzalloc(sizeof(*backup), GFP_KERNEL);
|
||||
if (unlikely(backup == NULL))
|
||||
if (unlikely(!backup))
|
||||
return -ENOMEM;
|
||||
|
||||
ret = vmw_dmabuf_init(res->dev_priv, backup, res->backup_size,
|
||||
|
@ -751,7 +751,7 @@ static int vmw_user_shader_alloc(struct vmw_private *dev_priv,
|
||||
}
|
||||
|
||||
ushader = kzalloc(sizeof(*ushader), GFP_KERNEL);
|
||||
if (unlikely(ushader == NULL)) {
|
||||
if (unlikely(!ushader)) {
|
||||
ttm_mem_global_free(vmw_mem_glob(dev_priv),
|
||||
vmw_user_shader_size);
|
||||
ret = -ENOMEM;
|
||||
@ -821,7 +821,7 @@ static struct vmw_resource *vmw_shader_alloc(struct vmw_private *dev_priv,
|
||||
}
|
||||
|
||||
shader = kzalloc(sizeof(*shader), GFP_KERNEL);
|
||||
if (unlikely(shader == NULL)) {
|
||||
if (unlikely(!shader)) {
|
||||
ttm_mem_global_free(vmw_mem_glob(dev_priv),
|
||||
vmw_shader_size);
|
||||
ret = -ENOMEM;
|
||||
@ -981,7 +981,7 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
|
||||
|
||||
/* Allocate and pin a DMA buffer */
|
||||
buf = kzalloc(sizeof(*buf), GFP_KERNEL);
|
||||
if (unlikely(buf == NULL))
|
||||
if (unlikely(!buf))
|
||||
return -ENOMEM;
|
||||
|
||||
ret = vmw_dmabuf_init(dev_priv, buf, size, &vmw_sys_ne_placement,
|
||||
|
@ -1640,8 +1640,8 @@ int vmw_kms_stdu_init_display(struct vmw_private *dev_priv)
|
||||
* something arbitrarily large and we will reject any layout
|
||||
* that doesn't fit prim_bb_mem later
|
||||
*/
|
||||
dev->mode_config.max_width = 16384;
|
||||
dev->mode_config.max_height = 16384;
|
||||
dev->mode_config.max_width = 8192;
|
||||
dev->mode_config.max_height = 8192;
|
||||
}
|
||||
|
||||
vmw_kms_create_implicit_placement_property(dev_priv, false);
|
||||
|
@ -186,8 +186,13 @@ static int host1x_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
err = iommu_attach_device(host->domain, &pdev->dev);
|
||||
if (err)
|
||||
if (err == -ENODEV) {
|
||||
iommu_domain_free(host->domain);
|
||||
host->domain = NULL;
|
||||
goto skip_iommu;
|
||||
} else if (err) {
|
||||
goto fail_free_domain;
|
||||
}
|
||||
|
||||
geometry = &host->domain->geometry;
|
||||
|
||||
@ -198,6 +203,7 @@ static int host1x_probe(struct platform_device *pdev)
|
||||
host->iova_end = geometry->aperture_end;
|
||||
}
|
||||
|
||||
skip_iommu:
|
||||
err = host1x_channel_list_init(&host->channel_list,
|
||||
host->info->nb_channels);
|
||||
if (err) {
|
||||
|
Loading…
Reference in New Issue
Block a user