mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-17 13:58:46 +00:00
Merge branch 'for-linux-next-fixes' of https://gitlab.freedesktop.org/drm/misc/kernel.git
This commit is contained in:
commit
b43d279135
@ -845,8 +845,8 @@ static int it6263_probe(struct i2c_client *client)
|
||||
it->lvds_i2c = devm_i2c_new_dummy_device(dev, client->adapter,
|
||||
LVDS_INPUT_CTRL_I2C_ADDR);
|
||||
if (IS_ERR(it->lvds_i2c))
|
||||
dev_err_probe(it->dev, PTR_ERR(it->lvds_i2c),
|
||||
"failed to allocate I2C device for LVDS\n");
|
||||
return dev_err_probe(it->dev, PTR_ERR(it->lvds_i2c),
|
||||
"failed to allocate I2C device for LVDS\n");
|
||||
|
||||
it->lvds_regmap = devm_regmap_init_i2c(it->lvds_i2c,
|
||||
&it6263_lvds_regmap_config);
|
||||
|
@ -459,7 +459,10 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
|
||||
if (connector_type == DRM_MODE_CONNECTOR_Unknown)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (bridge_connector->bridge_hdmi)
|
||||
if (bridge_connector->bridge_hdmi) {
|
||||
if (!connector->ycbcr_420_allowed)
|
||||
supported_formats &= ~BIT(HDMI_COLORSPACE_YUV420);
|
||||
|
||||
ret = drmm_connector_hdmi_init(drm, connector,
|
||||
bridge_connector->bridge_hdmi->vendor,
|
||||
bridge_connector->bridge_hdmi->product,
|
||||
@ -468,10 +471,11 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm,
|
||||
connector_type, ddc,
|
||||
supported_formats,
|
||||
max_bpc);
|
||||
else
|
||||
} else {
|
||||
ret = drmm_connector_init(drm, connector,
|
||||
&drm_bridge_connector_funcs,
|
||||
connector_type, ddc);
|
||||
}
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
|
@ -207,6 +207,10 @@ void drm_bridge_add(struct drm_bridge *bridge)
|
||||
{
|
||||
mutex_init(&bridge->hpd_mutex);
|
||||
|
||||
if (bridge->ops & DRM_BRIDGE_OP_HDMI)
|
||||
bridge->ycbcr_420_allowed = !!(bridge->supported_formats &
|
||||
BIT(HDMI_COLORSPACE_YUV420));
|
||||
|
||||
mutex_lock(&bridge_lock);
|
||||
list_add_tail(&bridge->list, &bridge_list);
|
||||
mutex_unlock(&bridge_lock);
|
||||
|
@ -507,6 +507,9 @@ int drmm_connector_hdmi_init(struct drm_device *dev,
|
||||
if (!supported_formats || !(supported_formats & BIT(HDMI_COLORSPACE_RGB)))
|
||||
return -EINVAL;
|
||||
|
||||
if (connector->ycbcr_420_allowed != !!(supported_formats & BIT(HDMI_COLORSPACE_YUV420)))
|
||||
return -EINVAL;
|
||||
|
||||
if (!(max_bpc == 8 || max_bpc == 10 || max_bpc == 12))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -387,11 +387,13 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan,
|
||||
if (f) {
|
||||
struct nouveau_channel *prev;
|
||||
bool must_wait = true;
|
||||
bool local;
|
||||
|
||||
rcu_read_lock();
|
||||
prev = rcu_dereference(f->channel);
|
||||
if (prev && (prev == chan ||
|
||||
fctx->sync(f, prev, chan) == 0))
|
||||
local = prev && prev->cli->drm == chan->cli->drm;
|
||||
if (local && (prev == chan ||
|
||||
fctx->sync(f, prev, chan) == 0))
|
||||
must_wait = false;
|
||||
rcu_read_unlock();
|
||||
if (!must_wait)
|
||||
|
@ -31,6 +31,7 @@ mcp77_sor = {
|
||||
.state = g94_sor_state,
|
||||
.power = nv50_sor_power,
|
||||
.clock = nv50_sor_clock,
|
||||
.bl = &nv50_sor_bl,
|
||||
.hdmi = &g84_sor_hdmi,
|
||||
.dp = &g94_sor_dp,
|
||||
};
|
||||
|
@ -635,6 +635,64 @@ static void drm_test_connector_hdmi_init_formats_no_rgb(struct kunit *test)
|
||||
KUNIT_EXPECT_LT(test, ret, 0);
|
||||
}
|
||||
|
||||
struct drm_connector_hdmi_init_formats_yuv420_allowed_test {
|
||||
unsigned long supported_formats;
|
||||
bool yuv420_allowed;
|
||||
int expected_result;
|
||||
};
|
||||
|
||||
#define YUV420_ALLOWED_TEST(_formats, _allowed, _result) \
|
||||
{ \
|
||||
.supported_formats = BIT(HDMI_COLORSPACE_RGB) | (_formats), \
|
||||
.yuv420_allowed = _allowed, \
|
||||
.expected_result = _result, \
|
||||
}
|
||||
|
||||
static const struct drm_connector_hdmi_init_formats_yuv420_allowed_test
|
||||
drm_connector_hdmi_init_formats_yuv420_allowed_tests[] = {
|
||||
YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV420), true, 0),
|
||||
YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV420), false, -EINVAL),
|
||||
YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV422), true, -EINVAL),
|
||||
YUV420_ALLOWED_TEST(BIT(HDMI_COLORSPACE_YUV422), false, 0),
|
||||
};
|
||||
|
||||
static void
|
||||
drm_connector_hdmi_init_formats_yuv420_allowed_desc(const struct drm_connector_hdmi_init_formats_yuv420_allowed_test *t,
|
||||
char *desc)
|
||||
{
|
||||
sprintf(desc, "supported_formats=0x%lx yuv420_allowed=%d",
|
||||
t->supported_formats, t->yuv420_allowed);
|
||||
}
|
||||
|
||||
KUNIT_ARRAY_PARAM(drm_connector_hdmi_init_formats_yuv420_allowed,
|
||||
drm_connector_hdmi_init_formats_yuv420_allowed_tests,
|
||||
drm_connector_hdmi_init_formats_yuv420_allowed_desc);
|
||||
|
||||
/*
|
||||
* Test that the registration of an HDMI connector succeeds only when
|
||||
* the presence of YUV420 in the supported formats matches the value
|
||||
* of the ycbcr_420_allowed flag.
|
||||
*/
|
||||
static void drm_test_connector_hdmi_init_formats_yuv420_allowed(struct kunit *test)
|
||||
{
|
||||
const struct drm_connector_hdmi_init_formats_yuv420_allowed_test *params;
|
||||
struct drm_connector_init_priv *priv = test->priv;
|
||||
int ret;
|
||||
|
||||
params = test->param_value;
|
||||
priv->connector.ycbcr_420_allowed = params->yuv420_allowed;
|
||||
|
||||
ret = drmm_connector_hdmi_init(&priv->drm, &priv->connector,
|
||||
"Vendor", "Product",
|
||||
&dummy_funcs,
|
||||
&dummy_hdmi_funcs,
|
||||
DRM_MODE_CONNECTOR_HDMIA,
|
||||
&priv->ddc,
|
||||
params->supported_formats,
|
||||
8);
|
||||
KUNIT_EXPECT_EQ(test, ret, params->expected_result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test that the registration of an HDMI connector with an HDMI
|
||||
* connector type succeeds.
|
||||
@ -726,6 +784,8 @@ static struct kunit_case drmm_connector_hdmi_init_tests[] = {
|
||||
KUNIT_CASE(drm_test_connector_hdmi_init_bpc_null),
|
||||
KUNIT_CASE(drm_test_connector_hdmi_init_formats_empty),
|
||||
KUNIT_CASE(drm_test_connector_hdmi_init_formats_no_rgb),
|
||||
KUNIT_CASE_PARAM(drm_test_connector_hdmi_init_formats_yuv420_allowed,
|
||||
drm_connector_hdmi_init_formats_yuv420_allowed_gen_params),
|
||||
KUNIT_CASE(drm_test_connector_hdmi_init_null_ddc),
|
||||
KUNIT_CASE(drm_test_connector_hdmi_init_null_product),
|
||||
KUNIT_CASE(drm_test_connector_hdmi_init_null_vendor),
|
||||
|
@ -320,8 +320,7 @@ static void kunit_action_drm_mode_destroy(void *ptr)
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC
|
||||
for a KUnit test
|
||||
* drm_kunit_display_mode_from_cea_vic() - return a mode for CEA VIC for a KUnit test
|
||||
* @test: The test context object
|
||||
* @dev: DRM device
|
||||
* @video_code: CEA VIC of the mode
|
||||
|
@ -108,6 +108,7 @@ v3d_irq(int irq, void *arg)
|
||||
v3d_job_update_stats(&v3d->bin_job->base, V3D_BIN);
|
||||
trace_v3d_bcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
v3d->bin_job = NULL;
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -118,6 +119,7 @@ v3d_irq(int irq, void *arg)
|
||||
v3d_job_update_stats(&v3d->render_job->base, V3D_RENDER);
|
||||
trace_v3d_rcl_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
v3d->render_job = NULL;
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -128,6 +130,7 @@ v3d_irq(int irq, void *arg)
|
||||
v3d_job_update_stats(&v3d->csd_job->base, V3D_CSD);
|
||||
trace_v3d_csd_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
v3d->csd_job = NULL;
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -165,6 +168,7 @@ v3d_hub_irq(int irq, void *arg)
|
||||
v3d_job_update_stats(&v3d->tfu_job->base, V3D_TFU);
|
||||
trace_v3d_tfu_irq(&v3d->drm, fence->seqno);
|
||||
dma_fence_signal(&fence->base);
|
||||
v3d->tfu_job = NULL;
|
||||
status = IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -228,7 +228,6 @@ int vmw_bo_pin_in_start_of_vram(struct vmw_private *dev_priv,
|
||||
VMW_BO_DOMAIN_VRAM,
|
||||
VMW_BO_DOMAIN_VRAM);
|
||||
buf->places[0].lpfn = PFN_UP(bo->resource->size);
|
||||
buf->busy_places[0].lpfn = PFN_UP(bo->resource->size);
|
||||
ret = ttm_bo_validate(bo, &buf->placement, &ctx);
|
||||
|
||||
/* For some reason we didn't end up at the start of vram */
|
||||
@ -443,7 +442,8 @@ static int vmw_bo_init(struct vmw_private *dev_priv,
|
||||
|
||||
if (params->pin)
|
||||
ttm_bo_pin(&vmw_bo->tbo);
|
||||
ttm_bo_unreserve(&vmw_bo->tbo);
|
||||
if (!params->keep_resv)
|
||||
ttm_bo_unreserve(&vmw_bo->tbo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -56,8 +56,9 @@ struct vmw_bo_params {
|
||||
u32 domain;
|
||||
u32 busy_domain;
|
||||
enum ttm_bo_type bo_type;
|
||||
size_t size;
|
||||
bool pin;
|
||||
bool keep_resv;
|
||||
size_t size;
|
||||
struct dma_resv *resv;
|
||||
struct sg_table *sg;
|
||||
};
|
||||
@ -83,7 +84,6 @@ struct vmw_bo {
|
||||
|
||||
struct ttm_placement placement;
|
||||
struct ttm_place places[5];
|
||||
struct ttm_place busy_places[5];
|
||||
|
||||
/* Protected by reservation */
|
||||
struct ttm_bo_kmap_obj map;
|
||||
|
@ -403,7 +403,8 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
|
||||
.busy_domain = VMW_BO_DOMAIN_SYS,
|
||||
.bo_type = ttm_bo_type_kernel,
|
||||
.size = PAGE_SIZE,
|
||||
.pin = true
|
||||
.pin = true,
|
||||
.keep_resv = true,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -415,10 +416,6 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
|
||||
if (unlikely(ret != 0))
|
||||
return ret;
|
||||
|
||||
ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL);
|
||||
BUG_ON(ret != 0);
|
||||
vmw_bo_pin_reserved(vbo, true);
|
||||
|
||||
ret = ttm_bo_kmap(&vbo->tbo, 0, 1, &map);
|
||||
if (likely(ret == 0)) {
|
||||
result = ttm_kmap_obj_virtual(&map, &dummy);
|
||||
|
@ -206,6 +206,7 @@ struct drm_gem_object *vmw_prime_import_sg_table(struct drm_device *dev,
|
||||
.bo_type = ttm_bo_type_sg,
|
||||
.size = attach->dmabuf->size,
|
||||
.pin = false,
|
||||
.keep_resv = true,
|
||||
.resv = attach->dmabuf->resv,
|
||||
.sg = table,
|
||||
|
||||
|
@ -750,6 +750,7 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
|
||||
struct vmw_plane_state *old_vps = vmw_plane_state_to_vps(old_state);
|
||||
struct vmw_bo *old_bo = NULL;
|
||||
struct vmw_bo *new_bo = NULL;
|
||||
struct ww_acquire_ctx ctx;
|
||||
s32 hotspot_x, hotspot_y;
|
||||
int ret;
|
||||
|
||||
@ -769,9 +770,11 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
|
||||
if (du->cursor_surface)
|
||||
du->cursor_age = du->cursor_surface->snooper.age;
|
||||
|
||||
ww_acquire_init(&ctx, &reservation_ww_class);
|
||||
|
||||
if (!vmw_user_object_is_null(&old_vps->uo)) {
|
||||
old_bo = vmw_user_object_buffer(&old_vps->uo);
|
||||
ret = ttm_bo_reserve(&old_bo->tbo, false, false, NULL);
|
||||
ret = ttm_bo_reserve(&old_bo->tbo, false, false, &ctx);
|
||||
if (ret != 0)
|
||||
return;
|
||||
}
|
||||
@ -779,9 +782,14 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
|
||||
if (!vmw_user_object_is_null(&vps->uo)) {
|
||||
new_bo = vmw_user_object_buffer(&vps->uo);
|
||||
if (old_bo != new_bo) {
|
||||
ret = ttm_bo_reserve(&new_bo->tbo, false, false, NULL);
|
||||
if (ret != 0)
|
||||
ret = ttm_bo_reserve(&new_bo->tbo, false, false, &ctx);
|
||||
if (ret != 0) {
|
||||
if (old_bo) {
|
||||
ttm_bo_unreserve(&old_bo->tbo);
|
||||
ww_acquire_fini(&ctx);
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
new_bo = NULL;
|
||||
}
|
||||
@ -803,10 +811,12 @@ vmw_du_cursor_plane_atomic_update(struct drm_plane *plane,
|
||||
hotspot_x, hotspot_y);
|
||||
}
|
||||
|
||||
if (old_bo)
|
||||
ttm_bo_unreserve(&old_bo->tbo);
|
||||
if (new_bo)
|
||||
ttm_bo_unreserve(&new_bo->tbo);
|
||||
if (old_bo)
|
||||
ttm_bo_unreserve(&old_bo->tbo);
|
||||
|
||||
ww_acquire_fini(&ctx);
|
||||
|
||||
du->cursor_x = new_state->crtc_x + du->set_gui_x;
|
||||
du->cursor_y = new_state->crtc_y + du->set_gui_y;
|
||||
|
@ -896,7 +896,8 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
|
||||
.busy_domain = VMW_BO_DOMAIN_SYS,
|
||||
.bo_type = ttm_bo_type_device,
|
||||
.size = size,
|
||||
.pin = true
|
||||
.pin = true,
|
||||
.keep_resv = true,
|
||||
};
|
||||
|
||||
if (!vmw_shader_id_ok(user_key, shader_type))
|
||||
@ -906,10 +907,6 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
|
||||
if (unlikely(ret != 0))
|
||||
goto out;
|
||||
|
||||
ret = ttm_bo_reserve(&buf->tbo, false, true, NULL);
|
||||
if (unlikely(ret != 0))
|
||||
goto no_reserve;
|
||||
|
||||
/* Map and copy shader bytecode. */
|
||||
ret = ttm_bo_kmap(&buf->tbo, 0, PFN_UP(size), &map);
|
||||
if (unlikely(ret != 0)) {
|
||||
|
@ -572,15 +572,14 @@ int vmw_bo_create_and_populate(struct vmw_private *dev_priv,
|
||||
.busy_domain = domain,
|
||||
.bo_type = ttm_bo_type_kernel,
|
||||
.size = bo_size,
|
||||
.pin = true
|
||||
.pin = true,
|
||||
.keep_resv = true,
|
||||
};
|
||||
|
||||
ret = vmw_bo_create(dev_priv, &bo_params, &vbo);
|
||||
if (unlikely(ret != 0))
|
||||
return ret;
|
||||
|
||||
ret = ttm_bo_reserve(&vbo->tbo, false, true, NULL);
|
||||
BUG_ON(ret != 0);
|
||||
ret = vmw_ttm_populate(vbo->tbo.bdev, vbo->tbo.ttm, &ctx);
|
||||
if (likely(ret == 0)) {
|
||||
struct vmw_ttm_tt *vmw_tt =
|
||||
|
Loading…
x
Reference in New Issue
Block a user