Skip to content

Commit 73b6f96

Browse files
committed
Merge branch 'drm-fixes-4.20' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
Fixes for 4.20: - DC MST fixes - DC FBC fix - Vega20 updates to support the latest vbios - KFD type fixes for ioctl headers Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181108035551.2904-1-alexander.deucher@amd.com
2 parents d10cf6d + 63237f8 commit 73b6f96

File tree

17 files changed

+93
-130
lines changed

17 files changed

+93
-130
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe;
151151
extern int amdgpu_gpu_recovery;
152152
extern int amdgpu_emu_mode;
153153
extern uint amdgpu_smu_memory_pool_size;
154+
extern uint amdgpu_dc_feature_mask;
154155
extern struct amdgpu_mgpu_info mgpu_info;
155156

156157
#ifdef CONFIG_DRM_AMDGPU_SI

drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1;
127127
int amdgpu_gpu_recovery = -1; /* auto */
128128
int amdgpu_emu_mode = 0;
129129
uint amdgpu_smu_memory_pool_size = 0;
130+
/* FBC (bit 0) disabled by default*/
131+
uint amdgpu_dc_feature_mask = 0;
132+
130133
struct amdgpu_mgpu_info mgpu_info = {
131134
.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
132135
};
@@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644);
631634
MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
632635
#endif
633636

637+
/**
638+
* DOC: dcfeaturemask (uint)
639+
* Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
640+
* The default is the current set of stable display features.
641+
*/
642+
MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");
643+
module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);
644+
634645
static const struct pci_device_id pciidlist[] = {
635646
#ifdef CONFIG_DRM_AMDGPU_SI
636647
{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},

drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev)
4949
adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));
5050
adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i]));
5151
adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i]));
52+
adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i]));
5253
}
5354
return 0;
5455
}

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
429429
adev->asic_type < CHIP_RAVEN)
430430
init_data.flags.gpu_vm_support = true;
431431

432+
if (amdgpu_dc_feature_mask & DC_FBC_MASK)
433+
init_data.flags.fbc_support = true;
434+
432435
/* Display Core create. */
433436
adev->dm.dc = dc_create(&init_data);
434437

@@ -1524,13 +1527,6 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
15241527
{
15251528
struct amdgpu_display_manager *dm = bl_get_data(bd);
15261529

1527-
/*
1528-
* PWM interperts 0 as 100% rather than 0% because of HW
1529-
* limitation for level 0.So limiting minimum brightness level
1530-
* to 1.
1531-
*/
1532-
if (bd->props.brightness < 1)
1533-
return 1;
15341530
if (dc_link_set_backlight_level(dm->backlight_link,
15351531
bd->props.brightness, 0, 0))
15361532
return 0;
@@ -2707,18 +2703,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
27072703
drm_connector = &aconnector->base;
27082704

27092705
if (!aconnector->dc_sink) {
2710-
/*
2711-
* Create dc_sink when necessary to MST
2712-
* Don't apply fake_sink to MST
2713-
*/
2714-
if (aconnector->mst_port) {
2715-
dm_dp_mst_dc_sink_create(drm_connector);
2716-
return stream;
2706+
if (!aconnector->mst_port) {
2707+
sink = create_fake_sink(aconnector);
2708+
if (!sink)
2709+
return stream;
27172710
}
2718-
2719-
sink = create_fake_sink(aconnector);
2720-
if (!sink)
2721-
return stream;
27222711
} else {
27232712
sink = aconnector->dc_sink;
27242713
}
@@ -3308,7 +3297,7 @@ void dm_drm_plane_destroy_state(struct drm_plane *plane,
33083297
static const struct drm_plane_funcs dm_plane_funcs = {
33093298
.update_plane = drm_atomic_helper_update_plane,
33103299
.disable_plane = drm_atomic_helper_disable_plane,
3311-
.destroy = drm_plane_cleanup,
3300+
.destroy = drm_primary_helper_destroy,
33123301
.reset = dm_drm_plane_reset,
33133302
.atomic_duplicate_state = dm_drm_plane_duplicate_state,
33143303
.atomic_destroy_state = dm_drm_plane_destroy_state,

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,6 @@ struct amdgpu_dm_connector {
160160
struct mutex hpd_lock;
161161

162162
bool fake_enable;
163-
164-
bool mst_connected;
165163
};
166164

167165
#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 7 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -205,40 +205,6 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
205205
.atomic_get_property = amdgpu_dm_connector_atomic_get_property
206206
};
207207

208-
void dm_dp_mst_dc_sink_create(struct drm_connector *connector)
209-
{
210-
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
211-
struct dc_sink *dc_sink;
212-
struct dc_sink_init_data init_params = {
213-
.link = aconnector->dc_link,
214-
.sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST };
215-
216-
/* FIXME none of this is safe. we shouldn't touch aconnector here in
217-
* atomic_check
218-
*/
219-
220-
/*
221-
* TODO: Need to further figure out why ddc.algo is NULL while MST port exists
222-
*/
223-
if (!aconnector->port || !aconnector->port->aux.ddc.algo)
224-
return;
225-
226-
ASSERT(aconnector->edid);
227-
228-
dc_sink = dc_link_add_remote_sink(
229-
aconnector->dc_link,
230-
(uint8_t *)aconnector->edid,
231-
(aconnector->edid->extensions + 1) * EDID_LENGTH,
232-
&init_params);
233-
234-
dc_sink->priv = aconnector;
235-
aconnector->dc_sink = dc_sink;
236-
237-
if (aconnector->dc_sink)
238-
amdgpu_dm_update_freesync_caps(
239-
connector, aconnector->edid);
240-
}
241-
242208
static int dm_dp_mst_get_modes(struct drm_connector *connector)
243209
{
244210
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
@@ -319,12 +285,7 @@ dm_dp_create_fake_mst_encoder(struct amdgpu_dm_connector *connector)
319285
struct amdgpu_device *adev = dev->dev_private;
320286
struct amdgpu_encoder *amdgpu_encoder;
321287
struct drm_encoder *encoder;
322-
const struct drm_connector_helper_funcs *connector_funcs =
323-
connector->base.helper_private;
324-
struct drm_encoder *enc_master =
325-
connector_funcs->best_encoder(&connector->base);
326288

327-
DRM_DEBUG_KMS("enc master is %p\n", enc_master);
328289
amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL);
329290
if (!amdgpu_encoder)
330291
return NULL;
@@ -354,25 +315,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
354315
struct amdgpu_device *adev = dev->dev_private;
355316
struct amdgpu_dm_connector *aconnector;
356317
struct drm_connector *connector;
357-
struct drm_connector_list_iter conn_iter;
358-
359-
drm_connector_list_iter_begin(dev, &conn_iter);
360-
drm_for_each_connector_iter(connector, &conn_iter) {
361-
aconnector = to_amdgpu_dm_connector(connector);
362-
if (aconnector->mst_port == master
363-
&& !aconnector->port) {
364-
DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n",
365-
aconnector, connector->base.id, aconnector->mst_port);
366-
367-
aconnector->port = port;
368-
drm_connector_set_path_property(connector, pathprop);
369-
370-
drm_connector_list_iter_end(&conn_iter);
371-
aconnector->mst_connected = true;
372-
return &aconnector->base;
373-
}
374-
}
375-
drm_connector_list_iter_end(&conn_iter);
376318

377319
aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
378320
if (!aconnector)
@@ -421,8 +363,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
421363
*/
422364
amdgpu_dm_connector_funcs_reset(connector);
423365

424-
aconnector->mst_connected = true;
425-
426366
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
427367
aconnector, connector->base.id, aconnector->mst_port);
428368

@@ -434,6 +374,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
434374
static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
435375
struct drm_connector *connector)
436376
{
377+
struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr);
378+
struct drm_device *dev = master->base.dev;
379+
struct amdgpu_device *adev = dev->dev_private;
437380
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
438381

439382
DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
@@ -447,7 +390,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
447390
aconnector->dc_sink = NULL;
448391
}
449392

450-
aconnector->mst_connected = false;
393+
drm_connector_unregister(connector);
394+
if (adev->mode_info.rfbdev)
395+
drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector);
396+
drm_connector_put(connector);
451397
}
452398

453399
static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
@@ -458,28 +404,17 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
458404
drm_kms_helper_hotplug_event(dev);
459405
}
460406

461-
static void dm_dp_mst_link_status_reset(struct drm_connector *connector)
462-
{
463-
mutex_lock(&connector->dev->mode_config.mutex);
464-
drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD);
465-
mutex_unlock(&connector->dev->mode_config.mutex);
466-
}
467-
468407
static void dm_dp_mst_register_connector(struct drm_connector *connector)
469408
{
470409
struct drm_device *dev = connector->dev;
471410
struct amdgpu_device *adev = dev->dev_private;
472-
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
473411

474412
if (adev->mode_info.rfbdev)
475413
drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
476414
else
477415
DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
478416

479417
drm_connector_register(connector);
480-
481-
if (aconnector->mst_connected)
482-
dm_dp_mst_link_status_reset(connector);
483418
}
484419

485420
static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,5 @@ struct amdgpu_dm_connector;
3131

3232
void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
3333
struct amdgpu_dm_connector *aconnector);
34-
void dm_dp_mst_dc_sink_create(struct drm_connector *connector);
3534

3635
#endif

drivers/gpu/drm/amd/display/dc/core/dc_link.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,7 +1722,7 @@ static void write_i2c_retimer_setting(
17221722
i2c_success = i2c_write(pipe_ctx, slave_address,
17231723
buffer, sizeof(buffer));
17241724
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
1725-
offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n",
1725+
offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
17261726
slave_address, buffer[0], buffer[1], i2c_success?1:0);
17271727
if (!i2c_success)
17281728
/* Write failure */
@@ -1734,7 +1734,7 @@ static void write_i2c_retimer_setting(
17341734
i2c_success = i2c_write(pipe_ctx, slave_address,
17351735
buffer, sizeof(buffer));
17361736
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
1737-
offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n",
1737+
offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
17381738
slave_address, buffer[0], buffer[1], i2c_success?1:0);
17391739
if (!i2c_success)
17401740
/* Write failure */

drivers/gpu/drm/amd/display/dc/dc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ struct link_training_settings;
169169
struct dc_config {
170170
bool gpu_vm_support;
171171
bool disable_disp_pll_sharing;
172+
bool fbc_support;
172173
};
173174

174175
enum visual_confirm {

drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1736,7 +1736,12 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx,
17361736
if (events->force_trigger)
17371737
value |= 0x1;
17381738

1739-
value |= 0x84;
1739+
if (num_pipes) {
1740+
struct dc *dc = pipe_ctx[0]->stream->ctx->dc;
1741+
1742+
if (dc->fbc_compressor)
1743+
value |= 0x84;
1744+
}
17401745

17411746
for (i = 0; i < num_pipes; i++)
17421747
pipe_ctx[i]->stream_res.tg->funcs->

drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1362,7 +1362,8 @@ static bool construct(
13621362
pool->base.sw_i2cs[i] = NULL;
13631363
}
13641364

1365-
dc->fbc_compressor = dce110_compressor_create(ctx);
1365+
if (dc->config.fbc_support)
1366+
dc->fbc_compressor = dce110_compressor_create(ctx);
13661367

13671368
if (!underlay_create(ctx, &pool->base))
13681369
goto res_create_fail;

drivers/gpu/drm/amd/include/amd_shared.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ enum PP_FEATURE_MASK {
133133
PP_AVFS_MASK = 0x40000,
134134
};
135135

136+
enum DC_FEATURE_MASK {
137+
DC_FBC_MASK = 0x1,
138+
};
139+
136140
/**
137141
* struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks
138142
*/

drivers/gpu/drm/amd/include/atomfirmware.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,7 +1325,7 @@ struct atom_smu_info_v3_3 {
13251325
struct atom_common_table_header table_header;
13261326
uint8_t smuip_min_ver;
13271327
uint8_t smuip_max_ver;
1328-
uint8_t smu_rsd1;
1328+
uint8_t waflclk_ss_mode;
13291329
uint8_t gpuclk_ss_mode;
13301330
uint16_t sclk_ss_percentage;
13311331
uint16_t sclk_ss_rate_10hz;
@@ -1355,7 +1355,10 @@ struct atom_smu_info_v3_3 {
13551355
uint32_t syspll3_1_vco_freq_10khz;
13561356
uint32_t bootup_fclk_10khz;
13571357
uint32_t bootup_waflclk_10khz;
1358-
uint32_t reserved[3];
1358+
uint32_t smu_info_caps;
1359+
uint16_t waflclk_ss_percentage; // in unit of 0.001%
1360+
uint16_t smuinitoffset;
1361+
uint32_t reserved;
13591362
};
13601363

13611364
/*

0 commit comments

Comments
 (0)