mirror of https://gitee.com/openkylin/linux.git
drm: i915, amdgpu, sun4i, exynos and etnaviv fixes
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJb5yW/AAoJEAx081l5xIa+UNgQAJeOCWyi87JD02yEbU1Ok0sD IirzTRZrA0Yz3KQt3W3piHgtTVD9VBbP3pU3U/3xXdMiHuPFTAowaom8dUCKExbH XuTnfdswqSCjBTMgNseCqBP5sTnLx/uNaw9x6KpaYIkpe9c0hCQ9ND8HWk339eLs UEgHGWvC6NTJ3vjG/iKmoamp4Pbw3v5ELEz4rzs/GHmUAdU2+vDh4UPf4KnVwxGe Dk4kjI6ijCB/xXS5Zzpj6m4SMPILyMs4CsSNXrW31o2+WkTWaMpgJgMWzufVF3Va 0r6KSbXPkaJSNnIqRiTdnRR048/fx1FgVbHJsYkzKRSh9WTYjlxsjoGJNiu5TNIi ibkDeBG6Ve3XFt6spSQJCQE0vFGNKoJuXnI8n97/OH4d6VoXKm96vwy+rP5w3jhg Jv0/V+8qRf7rqOXwQoX+2OJdwvxX+tzKwdTqxFgCm5W4/UjCp6junJxyXyOU9CrL OPYWYq2Ooqn2aeuUBTf5TdtbpaReTbBtQ0OQZM4fFpCdl2Qnfx5mwMgTzXLWos1x kWdzUkFKAS8w3p7oZDiLvGc0lU7GTxOOc8EAfoeNJPud6ONinIVwj+6EC2AKPldG NuX+HZSemF0iE4dN44+646qBP0fubVlrquF2pn/QJQ729d3tL5kHG/8paxzZzNmB 1hMpHKHoYOsghKbQ8xz/ =2/8D -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2018-11-11' of git://anongit.freedesktop.org/drm/drm Pull drm fixes from Dave Airlie: "drm: i915, amdgpu, sun4i, exynos and etnaviv fixes: - amdgpu has some display fixes, KFD ioctl fixes and a Vega20 bios interaction fix. - sun4i has some NULL checks added - i915 has a 32-bit system fix, LPE audio oops, and HDMI2.0 clock fixes. - Exynos has a 3 regression fixes (one frame counter, fbdev missing, dsi->panel check) - Etnaviv has a single fencing fix for GPU recovery" * tag 'drm-fixes-2018-11-11' of git://anongit.freedesktop.org/drm/drm: (39 commits) drm/amd/amdgpu/dm: Fix dm_dp_create_fake_mst_encoder() drm/amd/display: Drop reusing drm connector for MST drm/amd/display: Cleanup MST non-atomic code workaround drm/amd/powerplay: always use fast UCLK switching when UCLK DPM enabled drm/amd/powerplay: set a default fclk/gfxclk ratio drm/amdgpu/display/dce11: only enable FBC when selected drm/amdgpu/display/dm: handle FBC dc feature parameter drm/amdgpu/display/dc: add FBC to dc_config drm/amdgpu: add DC feature mask module parameter drm/amdgpu/display: check if fbc is available in set_static_screen_control (v2) drm/amdgpu/vega20: add CLK base offset drm/amd/display: Stop leaking planes drm/amd/display: Fix misleading buffer information Revert "drm/amd/display: set backlight level limit to 1" drm/amd: Update atom_smu_info_v3_3 structure drm/i915: Fix ilk+ watermarks when disabling pipes drm/sun4i: tcon: prevent tcon->panel dereference if NULL drm/sun4i: tcon: fix check of tcon->panel null pointer drm/i915: Don't oops during modeset shutdown after lpe audio deinit drm/i915: Mark pin flags as u64 ...
This commit is contained in:
commit
20ef6d06ef
|
@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe;
|
|||
extern int amdgpu_gpu_recovery;
|
||||
extern int amdgpu_emu_mode;
|
||||
extern uint amdgpu_smu_memory_pool_size;
|
||||
extern uint amdgpu_dc_feature_mask;
|
||||
extern struct amdgpu_mgpu_info mgpu_info;
|
||||
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
|
|
|
@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1;
|
|||
int amdgpu_gpu_recovery = -1; /* auto */
|
||||
int amdgpu_emu_mode = 0;
|
||||
uint amdgpu_smu_memory_pool_size = 0;
|
||||
/* FBC (bit 0) disabled by default*/
|
||||
uint amdgpu_dc_feature_mask = 0;
|
||||
|
||||
struct amdgpu_mgpu_info mgpu_info = {
|
||||
.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
|
||||
};
|
||||
|
@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644);
|
|||
MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
|
||||
#endif
|
||||
|
||||
/**
|
||||
* DOC: dcfeaturemask (uint)
|
||||
* Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
|
||||
* The default is the current set of stable display features.
|
||||
*/
|
||||
MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");
|
||||
module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);
|
||||
|
||||
static const struct pci_device_id pciidlist[] = {
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
|
|
|
@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev)
|
|||
adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));
|
||||
adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i]));
|
||||
adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i]));
|
||||
adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i]));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -429,6 +429,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
|||
adev->asic_type < CHIP_RAVEN)
|
||||
init_data.flags.gpu_vm_support = true;
|
||||
|
||||
if (amdgpu_dc_feature_mask & DC_FBC_MASK)
|
||||
init_data.flags.fbc_support = true;
|
||||
|
||||
/* Display Core create. */
|
||||
adev->dm.dc = dc_create(&init_data);
|
||||
|
||||
|
@ -1524,13 +1527,6 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
|
|||
{
|
||||
struct amdgpu_display_manager *dm = bl_get_data(bd);
|
||||
|
||||
/*
|
||||
* PWM interperts 0 as 100% rather than 0% because of HW
|
||||
* limitation for level 0.So limiting minimum brightness level
|
||||
* to 1.
|
||||
*/
|
||||
if (bd->props.brightness < 1)
|
||||
return 1;
|
||||
if (dc_link_set_backlight_level(dm->backlight_link,
|
||||
bd->props.brightness, 0, 0))
|
||||
return 0;
|
||||
|
@ -2707,18 +2703,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
|||
drm_connector = &aconnector->base;
|
||||
|
||||
if (!aconnector->dc_sink) {
|
||||
/*
|
||||
* Create dc_sink when necessary to MST
|
||||
* Don't apply fake_sink to MST
|
||||
*/
|
||||
if (aconnector->mst_port) {
|
||||
dm_dp_mst_dc_sink_create(drm_connector);
|
||||
return stream;
|
||||
if (!aconnector->mst_port) {
|
||||
sink = create_fake_sink(aconnector);
|
||||
if (!sink)
|
||||
return stream;
|
||||
}
|
||||
|
||||
sink = create_fake_sink(aconnector);
|
||||
if (!sink)
|
||||
return stream;
|
||||
} else {
|
||||
sink = aconnector->dc_sink;
|
||||
}
|
||||
|
@ -3308,7 +3297,7 @@ void dm_drm_plane_destroy_state(struct drm_plane *plane,
|
|||
static const struct drm_plane_funcs dm_plane_funcs = {
|
||||
.update_plane = drm_atomic_helper_update_plane,
|
||||
.disable_plane = drm_atomic_helper_disable_plane,
|
||||
.destroy = drm_plane_cleanup,
|
||||
.destroy = drm_primary_helper_destroy,
|
||||
.reset = dm_drm_plane_reset,
|
||||
.atomic_duplicate_state = dm_drm_plane_duplicate_state,
|
||||
.atomic_destroy_state = dm_drm_plane_destroy_state,
|
||||
|
|
|
@ -160,8 +160,6 @@ struct amdgpu_dm_connector {
|
|||
struct mutex hpd_lock;
|
||||
|
||||
bool fake_enable;
|
||||
|
||||
bool mst_connected;
|
||||
};
|
||||
|
||||
#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
|
||||
|
|
|
@ -205,40 +205,6 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
|
|||
.atomic_get_property = amdgpu_dm_connector_atomic_get_property
|
||||
};
|
||||
|
||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
struct dc_sink *dc_sink;
|
||||
struct dc_sink_init_data init_params = {
|
||||
.link = aconnector->dc_link,
|
||||
.sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST };
|
||||
|
||||
/* FIXME none of this is safe. we shouldn't touch aconnector here in
|
||||
* atomic_check
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO: Need to further figure out why ddc.algo is NULL while MST port exists
|
||||
*/
|
||||
if (!aconnector->port || !aconnector->port->aux.ddc.algo)
|
||||
return;
|
||||
|
||||
ASSERT(aconnector->edid);
|
||||
|
||||
dc_sink = dc_link_add_remote_sink(
|
||||
aconnector->dc_link,
|
||||
(uint8_t *)aconnector->edid,
|
||||
(aconnector->edid->extensions + 1) * EDID_LENGTH,
|
||||
&init_params);
|
||||
|
||||
dc_sink->priv = aconnector;
|
||||
aconnector->dc_sink = dc_sink;
|
||||
|
||||
if (aconnector->dc_sink)
|
||||
amdgpu_dm_update_freesync_caps(
|
||||
connector, aconnector->edid);
|
||||
}
|
||||
|
||||
static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
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)
|
|||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_encoder *amdgpu_encoder;
|
||||
struct drm_encoder *encoder;
|
||||
const struct drm_connector_helper_funcs *connector_funcs =
|
||||
connector->base.helper_private;
|
||||
struct drm_encoder *enc_master =
|
||||
connector_funcs->best_encoder(&connector->base);
|
||||
|
||||
DRM_DEBUG_KMS("enc master is %p\n", enc_master);
|
||||
amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL);
|
||||
if (!amdgpu_encoder)
|
||||
return NULL;
|
||||
|
@ -354,25 +315,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
|||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
aconnector = to_amdgpu_dm_connector(connector);
|
||||
if (aconnector->mst_port == master
|
||||
&& !aconnector->port) {
|
||||
DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n",
|
||||
aconnector, connector->base.id, aconnector->mst_port);
|
||||
|
||||
aconnector->port = port;
|
||||
drm_connector_set_path_property(connector, pathprop);
|
||||
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
aconnector->mst_connected = true;
|
||||
return &aconnector->base;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
|
||||
if (!aconnector)
|
||||
|
@ -421,8 +363,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
|||
*/
|
||||
amdgpu_dm_connector_funcs_reset(connector);
|
||||
|
||||
aconnector->mst_connected = true;
|
||||
|
||||
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
|
||||
aconnector, connector->base.id, aconnector->mst_port);
|
||||
|
||||
|
@ -434,6 +374,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
|||
static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr);
|
||||
struct drm_device *dev = master->base.dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
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,
|
|||
aconnector->dc_sink = NULL;
|
||||
}
|
||||
|
||||
aconnector->mst_connected = false;
|
||||
drm_connector_unregister(connector);
|
||||
if (adev->mode_info.rfbdev)
|
||||
drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector);
|
||||
drm_connector_put(connector);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
|
||||
|
@ -458,18 +404,10 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
|
|||
drm_kms_helper_hotplug_event(dev);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_link_status_reset(struct drm_connector *connector)
|
||||
{
|
||||
mutex_lock(&connector->dev->mode_config.mutex);
|
||||
drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD);
|
||||
mutex_unlock(&connector->dev->mode_config.mutex);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
if (adev->mode_info.rfbdev)
|
||||
drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
|
||||
|
@ -477,9 +415,6 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
|||
DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
|
||||
|
||||
drm_connector_register(connector);
|
||||
|
||||
if (aconnector->mst_connected)
|
||||
dm_dp_mst_link_status_reset(connector);
|
||||
}
|
||||
|
||||
static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {
|
||||
|
|
|
@ -31,6 +31,5 @@ struct amdgpu_dm_connector;
|
|||
|
||||
void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
|
||||
struct amdgpu_dm_connector *aconnector);
|
||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1722,7 +1722,7 @@ static void write_i2c_retimer_setting(
|
|||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||
buffer, sizeof(buffer));
|
||||
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
|
||||
offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n",
|
||||
offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
|
||||
slave_address, buffer[0], buffer[1], i2c_success?1:0);
|
||||
if (!i2c_success)
|
||||
/* Write failure */
|
||||
|
@ -1734,7 +1734,7 @@ static void write_i2c_retimer_setting(
|
|||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||
buffer, sizeof(buffer));
|
||||
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
|
||||
offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n",
|
||||
offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
|
||||
slave_address, buffer[0], buffer[1], i2c_success?1:0);
|
||||
if (!i2c_success)
|
||||
/* Write failure */
|
||||
|
|
|
@ -169,6 +169,7 @@ struct link_training_settings;
|
|||
struct dc_config {
|
||||
bool gpu_vm_support;
|
||||
bool disable_disp_pll_sharing;
|
||||
bool fbc_support;
|
||||
};
|
||||
|
||||
enum visual_confirm {
|
||||
|
|
|
@ -1736,7 +1736,12 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx,
|
|||
if (events->force_trigger)
|
||||
value |= 0x1;
|
||||
|
||||
value |= 0x84;
|
||||
if (num_pipes) {
|
||||
struct dc *dc = pipe_ctx[0]->stream->ctx->dc;
|
||||
|
||||
if (dc->fbc_compressor)
|
||||
value |= 0x84;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_pipes; i++)
|
||||
pipe_ctx[i]->stream_res.tg->funcs->
|
||||
|
|
|
@ -1362,7 +1362,8 @@ static bool construct(
|
|||
pool->base.sw_i2cs[i] = NULL;
|
||||
}
|
||||
|
||||
dc->fbc_compressor = dce110_compressor_create(ctx);
|
||||
if (dc->config.fbc_support)
|
||||
dc->fbc_compressor = dce110_compressor_create(ctx);
|
||||
|
||||
if (!underlay_create(ctx, &pool->base))
|
||||
goto res_create_fail;
|
||||
|
|
|
@ -133,6 +133,10 @@ enum PP_FEATURE_MASK {
|
|||
PP_AVFS_MASK = 0x40000,
|
||||
};
|
||||
|
||||
enum DC_FEATURE_MASK {
|
||||
DC_FBC_MASK = 0x1,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks
|
||||
*/
|
||||
|
|
|
@ -1325,7 +1325,7 @@ struct atom_smu_info_v3_3 {
|
|||
struct atom_common_table_header table_header;
|
||||
uint8_t smuip_min_ver;
|
||||
uint8_t smuip_max_ver;
|
||||
uint8_t smu_rsd1;
|
||||
uint8_t waflclk_ss_mode;
|
||||
uint8_t gpuclk_ss_mode;
|
||||
uint16_t sclk_ss_percentage;
|
||||
uint16_t sclk_ss_rate_10hz;
|
||||
|
@ -1355,7 +1355,10 @@ struct atom_smu_info_v3_3 {
|
|||
uint32_t syspll3_1_vco_freq_10khz;
|
||||
uint32_t bootup_fclk_10khz;
|
||||
uint32_t bootup_waflclk_10khz;
|
||||
uint32_t reserved[3];
|
||||
uint32_t smu_info_caps;
|
||||
uint16_t waflclk_ss_percentage; // in unit of 0.001%
|
||||
uint16_t smuinitoffset;
|
||||
uint32_t reserved;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -120,6 +120,7 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr)
|
|||
data->registry_data.disable_auto_wattman = 1;
|
||||
data->registry_data.auto_wattman_debug = 0;
|
||||
data->registry_data.auto_wattman_sample_period = 100;
|
||||
data->registry_data.fclk_gfxclk_ratio = 0x3F6CCCCD;
|
||||
data->registry_data.auto_wattman_threshold = 50;
|
||||
data->registry_data.gfxoff_controlled_by_driver = 1;
|
||||
data->gfxoff_allowed = false;
|
||||
|
@ -829,6 +830,28 @@ static int vega20_enable_all_smu_features(struct pp_hwmgr *hwmgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DPM_UCLK].enabled)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetUclkFastSwitch,
|
||||
1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega20_send_clock_ratio(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data =
|
||||
(struct vega20_hwmgr *)(hwmgr->backend);
|
||||
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFclkGfxClkRatio,
|
||||
data->registry_data.fclk_gfxclk_ratio);
|
||||
}
|
||||
|
||||
static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data =
|
||||
|
@ -1532,6 +1555,16 @@ static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
|||
"[EnableDPMTasks] Failed to enable all smu features!",
|
||||
return result);
|
||||
|
||||
result = vega20_notify_smc_display_change(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"[EnableDPMTasks] Failed to notify smc display change!",
|
||||
return result);
|
||||
|
||||
result = vega20_send_clock_ratio(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"[EnableDPMTasks] Failed to send clock ratio!",
|
||||
return result);
|
||||
|
||||
/* Initialize UVD/VCE powergating state */
|
||||
vega20_init_powergate_state(hwmgr);
|
||||
|
||||
|
@ -1972,19 +2005,6 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr,
|
||||
bool has_disp)
|
||||
{
|
||||
struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DPM_UCLK].enabled)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetUclkFastSwitch,
|
||||
has_disp ? 1 : 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
|
||||
struct pp_display_clock_request *clock_req)
|
||||
{
|
||||
|
@ -2044,13 +2064,6 @@ static int vega20_notify_smc_display_config_after_ps_adjustment(
|
|||
struct pp_display_clock_request clock_req;
|
||||
int ret = 0;
|
||||
|
||||
if ((hwmgr->display_config->num_display > 1) &&
|
||||
!hwmgr->display_config->multi_monitor_in_sync &&
|
||||
!hwmgr->display_config->nb_pstate_switch_disable)
|
||||
vega20_notify_smc_display_change(hwmgr, false);
|
||||
else
|
||||
vega20_notify_smc_display_change(hwmgr, true);
|
||||
|
||||
min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk;
|
||||
min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk;
|
||||
min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock;
|
||||
|
|
|
@ -328,6 +328,7 @@ struct vega20_registry_data {
|
|||
uint8_t disable_auto_wattman;
|
||||
uint32_t auto_wattman_debug;
|
||||
uint32_t auto_wattman_sample_period;
|
||||
uint32_t fclk_gfxclk_ratio;
|
||||
uint8_t auto_wattman_threshold;
|
||||
uint8_t log_avfs_param;
|
||||
uint8_t enable_enginess;
|
||||
|
|
|
@ -105,7 +105,8 @@
|
|||
#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B
|
||||
#define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C
|
||||
#define PPSMC_MSG_WaflTest 0x4D
|
||||
// Unused ID 0x4E to 0x50
|
||||
#define PPSMC_MSG_SetFclkGfxClkRatio 0x4E
|
||||
// Unused ID 0x4F to 0x50
|
||||
#define PPSMC_MSG_AllowGfxOff 0x51
|
||||
#define PPSMC_MSG_DisallowGfxOff 0x52
|
||||
#define PPSMC_MSG_GetPptLimit 0x53
|
||||
|
|
|
@ -93,7 +93,7 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job)
|
|||
* If the GPU managed to complete this jobs fence, the timout is
|
||||
* spurious. Bail out.
|
||||
*/
|
||||
if (fence_completed(gpu, submit->out_fence->seqno))
|
||||
if (dma_fence_is_signaled(submit->out_fence))
|
||||
return;
|
||||
|
||||
/*
|
||||
|
|
|
@ -164,13 +164,6 @@ static u32 decon_get_frame_count(struct decon_context *ctx, bool end)
|
|||
return frm;
|
||||
}
|
||||
|
||||
static u32 decon_get_vblank_counter(struct exynos_drm_crtc *crtc)
|
||||
{
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
|
||||
return decon_get_frame_count(ctx, false);
|
||||
}
|
||||
|
||||
static void decon_setup_trigger(struct decon_context *ctx)
|
||||
{
|
||||
if (!ctx->crtc->i80_mode && !(ctx->out_type & I80_HW_TRG))
|
||||
|
@ -536,7 +529,6 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
|
|||
.disable = decon_disable,
|
||||
.enable_vblank = decon_enable_vblank,
|
||||
.disable_vblank = decon_disable_vblank,
|
||||
.get_vblank_counter = decon_get_vblank_counter,
|
||||
.atomic_begin = decon_atomic_begin,
|
||||
.update_plane = decon_update_plane,
|
||||
.disable_plane = decon_disable_plane,
|
||||
|
@ -554,7 +546,6 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
|
|||
int ret;
|
||||
|
||||
ctx->drm_dev = drm_dev;
|
||||
drm_dev->max_vblank_count = 0xffffffff;
|
||||
|
||||
for (win = ctx->first_win; win < WINDOWS_NR; win++) {
|
||||
ctx->configs[win].pixel_formats = decon_formats;
|
||||
|
|
|
@ -162,16 +162,6 @@ static void exynos_drm_crtc_disable_vblank(struct drm_crtc *crtc)
|
|||
exynos_crtc->ops->disable_vblank(exynos_crtc);
|
||||
}
|
||||
|
||||
static u32 exynos_drm_crtc_get_vblank_counter(struct drm_crtc *crtc)
|
||||
{
|
||||
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
|
||||
|
||||
if (exynos_crtc->ops->get_vblank_counter)
|
||||
return exynos_crtc->ops->get_vblank_counter(exynos_crtc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_crtc_funcs exynos_crtc_funcs = {
|
||||
.set_config = drm_atomic_helper_set_config,
|
||||
.page_flip = drm_atomic_helper_page_flip,
|
||||
|
@ -181,7 +171,6 @@ static const struct drm_crtc_funcs exynos_crtc_funcs = {
|
|||
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
|
||||
.enable_vblank = exynos_drm_crtc_enable_vblank,
|
||||
.disable_vblank = exynos_drm_crtc_disable_vblank,
|
||||
.get_vblank_counter = exynos_drm_crtc_get_vblank_counter,
|
||||
};
|
||||
|
||||
struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
|
||||
|
|
|
@ -135,7 +135,6 @@ struct exynos_drm_crtc_ops {
|
|||
void (*disable)(struct exynos_drm_crtc *crtc);
|
||||
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
|
||||
void (*disable_vblank)(struct exynos_drm_crtc *crtc);
|
||||
u32 (*get_vblank_counter)(struct exynos_drm_crtc *crtc);
|
||||
enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode);
|
||||
bool (*mode_fixup)(struct exynos_drm_crtc *crtc,
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_mipi_dsi.h>
|
||||
#include <drm/drm_panel.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
|
@ -1474,12 +1475,12 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder)
|
|||
{
|
||||
struct exynos_dsi *dsi = encoder_to_dsi(encoder);
|
||||
struct drm_connector *connector = &dsi->connector;
|
||||
struct drm_device *drm = encoder->dev;
|
||||
int ret;
|
||||
|
||||
connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||
|
||||
ret = drm_connector_init(encoder->dev, connector,
|
||||
&exynos_dsi_connector_funcs,
|
||||
ret = drm_connector_init(drm, connector, &exynos_dsi_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to initialize connector with drm\n");
|
||||
|
@ -1489,7 +1490,12 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder)
|
|||
connector->status = connector_status_disconnected;
|
||||
drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
|
||||
drm_connector_attach_encoder(connector, encoder);
|
||||
if (!drm->registered)
|
||||
return 0;
|
||||
|
||||
connector->funcs->reset(connector);
|
||||
drm_fb_helper_add_one_connector(drm->fb_helper, connector);
|
||||
drm_connector_register(connector);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1527,7 +1533,9 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
}
|
||||
|
||||
dsi->panel = of_drm_find_panel(device->dev.of_node);
|
||||
if (dsi->panel) {
|
||||
if (IS_ERR(dsi->panel)) {
|
||||
dsi->panel = NULL;
|
||||
} else {
|
||||
drm_panel_attach(dsi->panel, &dsi->connector);
|
||||
dsi->connector.status = connector_status_connected;
|
||||
}
|
||||
|
|
|
@ -192,7 +192,7 @@ int exynos_drm_fbdev_init(struct drm_device *dev)
|
|||
struct drm_fb_helper *helper;
|
||||
int ret;
|
||||
|
||||
if (!dev->mode_config.num_crtc || !dev->mode_config.num_connector)
|
||||
if (!dev->mode_config.num_crtc)
|
||||
return 0;
|
||||
|
||||
fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
|
||||
|
|
|
@ -1905,7 +1905,6 @@ static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu)
|
|||
vgpu_free_mm(mm);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
mm->ggtt_mm.last_partial_off = -1UL;
|
||||
|
||||
return mm;
|
||||
}
|
||||
|
@ -1930,7 +1929,6 @@ void _intel_vgpu_mm_release(struct kref *mm_ref)
|
|||
invalidate_ppgtt_mm(mm);
|
||||
} else {
|
||||
vfree(mm->ggtt_mm.virtual_ggtt);
|
||||
mm->ggtt_mm.last_partial_off = -1UL;
|
||||
}
|
||||
|
||||
vgpu_free_mm(mm);
|
||||
|
@ -2168,6 +2166,8 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
|
|||
struct intel_gvt_gtt_entry e, m;
|
||||
dma_addr_t dma_addr;
|
||||
int ret;
|
||||
struct intel_gvt_partial_pte *partial_pte, *pos, *n;
|
||||
bool partial_update = false;
|
||||
|
||||
if (bytes != 4 && bytes != 8)
|
||||
return -EINVAL;
|
||||
|
@ -2178,68 +2178,57 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
|
|||
if (!vgpu_gmadr_is_valid(vgpu, gma))
|
||||
return 0;
|
||||
|
||||
ggtt_get_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
|
||||
e.type = GTT_TYPE_GGTT_PTE;
|
||||
memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
|
||||
bytes);
|
||||
|
||||
/* If ggtt entry size is 8 bytes, and it's split into two 4 bytes
|
||||
* write, we assume the two 4 bytes writes are consecutive.
|
||||
* Otherwise, we abort and report error
|
||||
* write, save the first 4 bytes in a list and update virtual
|
||||
* PTE. Only update shadow PTE when the second 4 bytes comes.
|
||||
*/
|
||||
if (bytes < info->gtt_entry_size) {
|
||||
if (ggtt_mm->ggtt_mm.last_partial_off == -1UL) {
|
||||
/* the first partial part*/
|
||||
ggtt_mm->ggtt_mm.last_partial_off = off;
|
||||
ggtt_mm->ggtt_mm.last_partial_data = e.val64;
|
||||
return 0;
|
||||
} else if ((g_gtt_index ==
|
||||
(ggtt_mm->ggtt_mm.last_partial_off >>
|
||||
info->gtt_entry_size_shift)) &&
|
||||
(off != ggtt_mm->ggtt_mm.last_partial_off)) {
|
||||
/* the second partial part */
|
||||
bool found = false;
|
||||
|
||||
int last_off = ggtt_mm->ggtt_mm.last_partial_off &
|
||||
(info->gtt_entry_size - 1);
|
||||
list_for_each_entry_safe(pos, n,
|
||||
&ggtt_mm->ggtt_mm.partial_pte_list, list) {
|
||||
if (g_gtt_index == pos->offset >>
|
||||
info->gtt_entry_size_shift) {
|
||||
if (off != pos->offset) {
|
||||
/* the second partial part*/
|
||||
int last_off = pos->offset &
|
||||
(info->gtt_entry_size - 1);
|
||||
|
||||
memcpy((void *)&e.val64 + last_off,
|
||||
(void *)&ggtt_mm->ggtt_mm.last_partial_data +
|
||||
last_off, bytes);
|
||||
memcpy((void *)&e.val64 + last_off,
|
||||
(void *)&pos->data + last_off,
|
||||
bytes);
|
||||
|
||||
ggtt_mm->ggtt_mm.last_partial_off = -1UL;
|
||||
} else {
|
||||
int last_offset;
|
||||
list_del(&pos->list);
|
||||
kfree(pos);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
gvt_vgpu_err("failed to populate guest ggtt entry: abnormal ggtt entry write sequence, last_partial_off=%lx, offset=%x, bytes=%d, ggtt entry size=%d\n",
|
||||
ggtt_mm->ggtt_mm.last_partial_off, off,
|
||||
bytes, info->gtt_entry_size);
|
||||
/* update of the first partial part */
|
||||
pos->data = e.val64;
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* set host ggtt entry to scratch page and clear
|
||||
* virtual ggtt entry as not present for last
|
||||
* partially write offset
|
||||
*/
|
||||
last_offset = ggtt_mm->ggtt_mm.last_partial_off &
|
||||
(~(info->gtt_entry_size - 1));
|
||||
|
||||
ggtt_get_host_entry(ggtt_mm, &m, last_offset);
|
||||
ggtt_invalidate_pte(vgpu, &m);
|
||||
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
|
||||
ops->clear_present(&m);
|
||||
ggtt_set_host_entry(ggtt_mm, &m, last_offset);
|
||||
ggtt_invalidate(gvt->dev_priv);
|
||||
|
||||
ggtt_get_guest_entry(ggtt_mm, &e, last_offset);
|
||||
ops->clear_present(&e);
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, last_offset);
|
||||
|
||||
ggtt_mm->ggtt_mm.last_partial_off = off;
|
||||
ggtt_mm->ggtt_mm.last_partial_data = e.val64;
|
||||
|
||||
return 0;
|
||||
if (!found) {
|
||||
/* the first partial part */
|
||||
partial_pte = kzalloc(sizeof(*partial_pte), GFP_KERNEL);
|
||||
if (!partial_pte)
|
||||
return -ENOMEM;
|
||||
partial_pte->offset = off;
|
||||
partial_pte->data = e.val64;
|
||||
list_add_tail(&partial_pte->list,
|
||||
&ggtt_mm->ggtt_mm.partial_pte_list);
|
||||
partial_update = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (ops->test_present(&e)) {
|
||||
if (!partial_update && (ops->test_present(&e))) {
|
||||
gfn = ops->get_pfn(&e);
|
||||
m = e;
|
||||
|
||||
|
@ -2263,16 +2252,18 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
|
|||
} else
|
||||
ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
|
||||
} else {
|
||||
ggtt_get_host_entry(ggtt_mm, &m, g_gtt_index);
|
||||
ggtt_invalidate_pte(vgpu, &m);
|
||||
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
|
||||
ops->clear_present(&m);
|
||||
}
|
||||
|
||||
out:
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
|
||||
ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
|
||||
ggtt_invalidate_pte(vgpu, &e);
|
||||
|
||||
ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
|
||||
ggtt_invalidate(gvt->dev_priv);
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2430,6 +2421,8 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
|
|||
|
||||
intel_vgpu_reset_ggtt(vgpu, false);
|
||||
|
||||
INIT_LIST_HEAD(>t->ggtt_mm->ggtt_mm.partial_pte_list);
|
||||
|
||||
return create_scratch_page_tree(vgpu);
|
||||
}
|
||||
|
||||
|
@ -2454,6 +2447,14 @@ static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
|
|||
|
||||
static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct intel_gvt_partial_pte *pos;
|
||||
|
||||
list_for_each_entry(pos,
|
||||
&vgpu->gtt.ggtt_mm->ggtt_mm.partial_pte_list, list) {
|
||||
gvt_dbg_mm("partial PTE update on hold 0x%lx : 0x%llx\n",
|
||||
pos->offset, pos->data);
|
||||
kfree(pos);
|
||||
}
|
||||
intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm);
|
||||
vgpu->gtt.ggtt_mm = NULL;
|
||||
}
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#define _GVT_GTT_H_
|
||||
|
||||
#define I915_GTT_PAGE_SHIFT 12
|
||||
#define I915_GTT_PAGE_MASK (~(I915_GTT_PAGE_SIZE - 1))
|
||||
|
||||
struct intel_vgpu_mm;
|
||||
|
||||
|
@ -133,6 +132,12 @@ enum intel_gvt_mm_type {
|
|||
|
||||
#define GVT_RING_CTX_NR_PDPS GEN8_3LVL_PDPES
|
||||
|
||||
struct intel_gvt_partial_pte {
|
||||
unsigned long offset;
|
||||
u64 data;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
struct intel_vgpu_mm {
|
||||
enum intel_gvt_mm_type type;
|
||||
struct intel_vgpu *vgpu;
|
||||
|
@ -157,8 +162,7 @@ struct intel_vgpu_mm {
|
|||
} ppgtt_mm;
|
||||
struct {
|
||||
void *virtual_ggtt;
|
||||
unsigned long last_partial_off;
|
||||
u64 last_partial_data;
|
||||
struct list_head partial_pte_list;
|
||||
} ggtt_mm;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1609,7 +1609,7 @@ static int bxt_gt_disp_pwron_write(struct intel_vgpu *vgpu,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int bxt_edp_psr_imr_iir_write(struct intel_vgpu *vgpu,
|
||||
static int edp_psr_imr_iir_write(struct intel_vgpu *vgpu,
|
||||
unsigned int offset, void *p_data, unsigned int bytes)
|
||||
{
|
||||
vgpu_vreg(vgpu, offset) = 0;
|
||||
|
@ -2607,6 +2607,9 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
|
|||
MMIO_DFH(_MMIO(0x1a178), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x1a17c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x2217c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
|
||||
MMIO_DH(EDP_PSR_IMR, D_BDW_PLUS, NULL, edp_psr_imr_iir_write);
|
||||
MMIO_DH(EDP_PSR_IIR, D_BDW_PLUS, NULL, edp_psr_imr_iir_write);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3205,9 +3208,6 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)
|
|||
MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_B), D_BXT);
|
||||
MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_C), D_BXT);
|
||||
|
||||
MMIO_DH(EDP_PSR_IMR, D_BXT, NULL, bxt_edp_psr_imr_iir_write);
|
||||
MMIO_DH(EDP_PSR_IIR, D_BXT, NULL, bxt_edp_psr_imr_iir_write);
|
||||
|
||||
MMIO_D(RC6_CTX_BASE, D_BXT);
|
||||
|
||||
MMIO_D(GEN8_PUSHBUS_CONTROL, D_BXT);
|
||||
|
|
|
@ -131,7 +131,7 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = {
|
|||
{RCS, GAMT_CHKN_BIT_REG, 0x0, false}, /* 0x4ab8 */
|
||||
|
||||
{RCS, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */
|
||||
{RCS, GEN9_CSFE_CHICKEN1_RCS, 0x0, false}, /* 0x20d4 */
|
||||
{RCS, GEN9_CSFE_CHICKEN1_RCS, 0xffff, false}, /* 0x20d4 */
|
||||
|
||||
{RCS, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */
|
||||
{RCS, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */
|
||||
|
|
|
@ -1175,8 +1175,6 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
dram_info->valid_dimm = true;
|
||||
|
||||
/*
|
||||
* If any of the channel is single rank channel, worst case output
|
||||
* will be same as if single rank memory, so consider single rank
|
||||
|
@ -1193,8 +1191,7 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ch0.is_16gb_dimm || ch1.is_16gb_dimm)
|
||||
dram_info->is_16gb_dimm = true;
|
||||
dram_info->is_16gb_dimm = ch0.is_16gb_dimm || ch1.is_16gb_dimm;
|
||||
|
||||
dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0,
|
||||
val_ch1,
|
||||
|
@ -1314,7 +1311,6 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
dram_info->valid_dimm = true;
|
||||
dram_info->valid = true;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1327,12 +1323,17 @@ intel_get_dram_info(struct drm_i915_private *dev_priv)
|
|||
int ret;
|
||||
|
||||
dram_info->valid = false;
|
||||
dram_info->valid_dimm = false;
|
||||
dram_info->is_16gb_dimm = false;
|
||||
dram_info->rank = I915_DRAM_RANK_INVALID;
|
||||
dram_info->bandwidth_kbps = 0;
|
||||
dram_info->num_channels = 0;
|
||||
|
||||
/*
|
||||
* Assume 16Gb DIMMs are present until proven otherwise.
|
||||
* This is only used for the level 0 watermark latency
|
||||
* w/a which does not apply to bxt/glk.
|
||||
*/
|
||||
dram_info->is_16gb_dimm = !IS_GEN9_LP(dev_priv);
|
||||
|
||||
if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv))
|
||||
return;
|
||||
|
||||
|
|
|
@ -1948,7 +1948,6 @@ struct drm_i915_private {
|
|||
|
||||
struct dram_info {
|
||||
bool valid;
|
||||
bool valid_dimm;
|
||||
bool is_16gb_dimm;
|
||||
u8 num_channels;
|
||||
enum dram_rank {
|
||||
|
|
|
@ -460,7 +460,7 @@ eb_validate_vma(struct i915_execbuffer *eb,
|
|||
* any non-page-aligned or non-canonical addresses.
|
||||
*/
|
||||
if (unlikely(entry->flags & EXEC_OBJECT_PINNED &&
|
||||
entry->offset != gen8_canonical_addr(entry->offset & PAGE_MASK)))
|
||||
entry->offset != gen8_canonical_addr(entry->offset & I915_GTT_PAGE_MASK)))
|
||||
return -EINVAL;
|
||||
|
||||
/* pad_to_size was once a reserved field, so sanitize it */
|
||||
|
|
|
@ -1757,7 +1757,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m)
|
|||
if (i == 4)
|
||||
continue;
|
||||
|
||||
seq_printf(m, "\t\t(%03d, %04d) %08lx: ",
|
||||
seq_printf(m, "\t\t(%03d, %04d) %08llx: ",
|
||||
pde, pte,
|
||||
(pde * GEN6_PTES + pte) * I915_GTT_PAGE_SIZE);
|
||||
for (i = 0; i < 4; i++) {
|
||||
|
|
|
@ -42,13 +42,15 @@
|
|||
#include "i915_selftest.h"
|
||||
#include "i915_timeline.h"
|
||||
|
||||
#define I915_GTT_PAGE_SIZE_4K BIT(12)
|
||||
#define I915_GTT_PAGE_SIZE_64K BIT(16)
|
||||
#define I915_GTT_PAGE_SIZE_2M BIT(21)
|
||||
#define I915_GTT_PAGE_SIZE_4K BIT_ULL(12)
|
||||
#define I915_GTT_PAGE_SIZE_64K BIT_ULL(16)
|
||||
#define I915_GTT_PAGE_SIZE_2M BIT_ULL(21)
|
||||
|
||||
#define I915_GTT_PAGE_SIZE I915_GTT_PAGE_SIZE_4K
|
||||
#define I915_GTT_MAX_PAGE_SIZE I915_GTT_PAGE_SIZE_2M
|
||||
|
||||
#define I915_GTT_PAGE_MASK -I915_GTT_PAGE_SIZE
|
||||
|
||||
#define I915_GTT_MIN_ALIGNMENT I915_GTT_PAGE_SIZE
|
||||
|
||||
#define I915_FENCE_REG_NONE -1
|
||||
|
@ -659,20 +661,20 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
|
|||
u64 start, u64 end, unsigned int flags);
|
||||
|
||||
/* Flags used by pin/bind&friends. */
|
||||
#define PIN_NONBLOCK BIT(0)
|
||||
#define PIN_MAPPABLE BIT(1)
|
||||
#define PIN_ZONE_4G BIT(2)
|
||||
#define PIN_NONFAULT BIT(3)
|
||||
#define PIN_NOEVICT BIT(4)
|
||||
#define PIN_NONBLOCK BIT_ULL(0)
|
||||
#define PIN_MAPPABLE BIT_ULL(1)
|
||||
#define PIN_ZONE_4G BIT_ULL(2)
|
||||
#define PIN_NONFAULT BIT_ULL(3)
|
||||
#define PIN_NOEVICT BIT_ULL(4)
|
||||
|
||||
#define PIN_MBZ BIT(5) /* I915_VMA_PIN_OVERFLOW */
|
||||
#define PIN_GLOBAL BIT(6) /* I915_VMA_GLOBAL_BIND */
|
||||
#define PIN_USER BIT(7) /* I915_VMA_LOCAL_BIND */
|
||||
#define PIN_UPDATE BIT(8)
|
||||
#define PIN_MBZ BIT_ULL(5) /* I915_VMA_PIN_OVERFLOW */
|
||||
#define PIN_GLOBAL BIT_ULL(6) /* I915_VMA_GLOBAL_BIND */
|
||||
#define PIN_USER BIT_ULL(7) /* I915_VMA_LOCAL_BIND */
|
||||
#define PIN_UPDATE BIT_ULL(8)
|
||||
|
||||
#define PIN_HIGH BIT(9)
|
||||
#define PIN_OFFSET_BIAS BIT(10)
|
||||
#define PIN_OFFSET_FIXED BIT(11)
|
||||
#define PIN_HIGH BIT_ULL(9)
|
||||
#define PIN_OFFSET_BIAS BIT_ULL(10)
|
||||
#define PIN_OFFSET_FIXED BIT_ULL(11)
|
||||
#define PIN_OFFSET_MASK (-I915_GTT_PAGE_SIZE)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -2095,8 +2095,12 @@ enum i915_power_well_id {
|
|||
|
||||
/* ICL PHY DFLEX registers */
|
||||
#define PORT_TX_DFLEXDPMLE1 _MMIO(0x1638C0)
|
||||
#define DFLEXDPMLE1_DPMLETC_MASK(n) (0xf << (4 * (n)))
|
||||
#define DFLEXDPMLE1_DPMLETC(n, x) ((x) << (4 * (n)))
|
||||
#define DFLEXDPMLE1_DPMLETC_MASK(tc_port) (0xf << (4 * (tc_port)))
|
||||
#define DFLEXDPMLE1_DPMLETC_ML0(tc_port) (1 << (4 * (tc_port)))
|
||||
#define DFLEXDPMLE1_DPMLETC_ML1_0(tc_port) (3 << (4 * (tc_port)))
|
||||
#define DFLEXDPMLE1_DPMLETC_ML3(tc_port) (8 << (4 * (tc_port)))
|
||||
#define DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) (12 << (4 * (tc_port)))
|
||||
#define DFLEXDPMLE1_DPMLETC_ML3_0(tc_port) (15 << (4 * (tc_port)))
|
||||
|
||||
/* BXT PHY Ref registers */
|
||||
#define _PORT_REF_DW3_A 0x16218C
|
||||
|
@ -4593,12 +4597,12 @@ enum {
|
|||
|
||||
#define DRM_DIP_ENABLE (1 << 28)
|
||||
#define PSR_VSC_BIT_7_SET (1 << 27)
|
||||
#define VSC_SELECT_MASK (0x3 << 26)
|
||||
#define VSC_SELECT_SHIFT 26
|
||||
#define VSC_DIP_HW_HEA_DATA (0 << 26)
|
||||
#define VSC_DIP_HW_HEA_SW_DATA (1 << 26)
|
||||
#define VSC_DIP_HW_DATA_SW_HEA (2 << 26)
|
||||
#define VSC_DIP_SW_HEA_DATA (3 << 26)
|
||||
#define VSC_SELECT_MASK (0x3 << 25)
|
||||
#define VSC_SELECT_SHIFT 25
|
||||
#define VSC_DIP_HW_HEA_DATA (0 << 25)
|
||||
#define VSC_DIP_HW_HEA_SW_DATA (1 << 25)
|
||||
#define VSC_DIP_HW_DATA_SW_HEA (2 << 25)
|
||||
#define VSC_DIP_SW_HEA_DATA (3 << 25)
|
||||
#define VDIP_ENABLE_PPS (1 << 24)
|
||||
|
||||
/* Panel power sequencing */
|
||||
|
|
|
@ -144,6 +144,9 @@ static const struct {
|
|||
/* HDMI N/CTS table */
|
||||
#define TMDS_297M 297000
|
||||
#define TMDS_296M 296703
|
||||
#define TMDS_594M 594000
|
||||
#define TMDS_593M 593407
|
||||
|
||||
static const struct {
|
||||
int sample_rate;
|
||||
int clock;
|
||||
|
@ -164,6 +167,20 @@ static const struct {
|
|||
{ 176400, TMDS_297M, 18816, 247500 },
|
||||
{ 192000, TMDS_296M, 23296, 281250 },
|
||||
{ 192000, TMDS_297M, 20480, 247500 },
|
||||
{ 44100, TMDS_593M, 8918, 937500 },
|
||||
{ 44100, TMDS_594M, 9408, 990000 },
|
||||
{ 48000, TMDS_593M, 5824, 562500 },
|
||||
{ 48000, TMDS_594M, 6144, 594000 },
|
||||
{ 32000, TMDS_593M, 5824, 843750 },
|
||||
{ 32000, TMDS_594M, 3072, 445500 },
|
||||
{ 88200, TMDS_593M, 17836, 937500 },
|
||||
{ 88200, TMDS_594M, 18816, 990000 },
|
||||
{ 96000, TMDS_593M, 11648, 562500 },
|
||||
{ 96000, TMDS_594M, 12288, 594000 },
|
||||
{ 176400, TMDS_593M, 35672, 937500 },
|
||||
{ 176400, TMDS_594M, 37632, 990000 },
|
||||
{ 192000, TMDS_593M, 23296, 562500 },
|
||||
{ 192000, TMDS_594M, 24576, 594000 },
|
||||
};
|
||||
|
||||
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
|
||||
|
|
|
@ -2138,16 +2138,8 @@ void intel_set_cdclk(struct drm_i915_private *dev_priv,
|
|||
static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
|
||||
int pixel_rate)
|
||||
{
|
||||
if (INTEL_GEN(dev_priv) >= 10)
|
||||
if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
|
||||
return DIV_ROUND_UP(pixel_rate, 2);
|
||||
else if (IS_GEMINILAKE(dev_priv))
|
||||
/*
|
||||
* FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
|
||||
* as a temporary workaround. Use a higher cdclk instead. (Note that
|
||||
* intel_compute_max_dotclk() limits the max pixel clock to 99% of max
|
||||
* cdclk.)
|
||||
*/
|
||||
return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
|
||||
else if (IS_GEN9(dev_priv) ||
|
||||
IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
|
||||
return pixel_rate;
|
||||
|
@ -2543,14 +2535,8 @@ static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
|
|||
{
|
||||
int max_cdclk_freq = dev_priv->max_cdclk_freq;
|
||||
|
||||
if (INTEL_GEN(dev_priv) >= 10)
|
||||
if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
|
||||
return 2 * max_cdclk_freq;
|
||||
else if (IS_GEMINILAKE(dev_priv))
|
||||
/*
|
||||
* FIXME: Limiting to 99% as a temporary workaround. See
|
||||
* intel_min_cdclk() for details.
|
||||
*/
|
||||
return 2 * max_cdclk_freq * 99 / 100;
|
||||
else if (IS_GEN9(dev_priv) ||
|
||||
IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
|
||||
return max_cdclk_freq;
|
||||
|
|
|
@ -12768,17 +12768,12 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
|
|||
intel_check_cpu_fifo_underruns(dev_priv);
|
||||
intel_check_pch_fifo_underruns(dev_priv);
|
||||
|
||||
if (!new_crtc_state->active) {
|
||||
/*
|
||||
* Make sure we don't call initial_watermarks
|
||||
* for ILK-style watermark updates.
|
||||
*
|
||||
* No clue what this is supposed to achieve.
|
||||
*/
|
||||
if (INTEL_GEN(dev_priv) >= 9)
|
||||
dev_priv->display.initial_watermarks(intel_state,
|
||||
to_intel_crtc_state(new_crtc_state));
|
||||
}
|
||||
/* FIXME unify this for all platforms */
|
||||
if (!new_crtc_state->active &&
|
||||
!HAS_GMCH_DISPLAY(dev_priv) &&
|
||||
dev_priv->display.initial_watermarks)
|
||||
dev_priv->display.initial_watermarks(intel_state,
|
||||
to_intel_crtc_state(new_crtc_state));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -14646,7 +14641,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
|
|||
fb->height < SKL_MIN_YUV_420_SRC_H ||
|
||||
(fb->width % 4) != 0 || (fb->height % 4) != 0)) {
|
||||
DRM_DEBUG_KMS("src dimensions not correct for NV12\n");
|
||||
return -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (i = 0; i < fb->format->num_planes; i++) {
|
||||
|
|
|
@ -297,8 +297,10 @@ void intel_lpe_audio_teardown(struct drm_i915_private *dev_priv)
|
|||
lpe_audio_platdev_destroy(dev_priv);
|
||||
|
||||
irq_free_desc(dev_priv->lpe_audio.irq);
|
||||
}
|
||||
|
||||
dev_priv->lpe_audio.irq = -1;
|
||||
dev_priv->lpe_audio.platdev = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_lpe_audio_notify() - notify lpe audio event
|
||||
|
|
|
@ -2881,8 +2881,7 @@ static void intel_read_wm_latency(struct drm_i915_private *dev_priv,
|
|||
* any underrun. If not able to get Dimm info assume 16GB dimm
|
||||
* to avoid any underrun.
|
||||
*/
|
||||
if (!dev_priv->dram_info.valid_dimm ||
|
||||
dev_priv->dram_info.is_16gb_dimm)
|
||||
if (dev_priv->dram_info.is_16gb_dimm)
|
||||
wm[0] += 1;
|
||||
|
||||
} else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
|
||||
|
|
|
@ -551,7 +551,7 @@ static int igt_mock_ppgtt_misaligned_dma(void *arg)
|
|||
err = igt_check_page_sizes(vma);
|
||||
|
||||
if (vma->page_sizes.gtt != I915_GTT_PAGE_SIZE_4K) {
|
||||
pr_err("page_sizes.gtt=%u, expected %lu\n",
|
||||
pr_err("page_sizes.gtt=%u, expected %llu\n",
|
||||
vma->page_sizes.gtt, I915_GTT_PAGE_SIZE_4K);
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
|
|
@ -1337,7 +1337,7 @@ static int igt_gtt_reserve(void *arg)
|
|||
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
|
||||
if (vma->node.start != total ||
|
||||
vma->node.size != 2*I915_GTT_PAGE_SIZE) {
|
||||
pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %lx)\n",
|
||||
pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
|
||||
vma->node.start, vma->node.size,
|
||||
total, 2*I915_GTT_PAGE_SIZE);
|
||||
err = -EINVAL;
|
||||
|
@ -1386,7 +1386,7 @@ static int igt_gtt_reserve(void *arg)
|
|||
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
|
||||
if (vma->node.start != total ||
|
||||
vma->node.size != 2*I915_GTT_PAGE_SIZE) {
|
||||
pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %lx)\n",
|
||||
pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
|
||||
vma->node.start, vma->node.size,
|
||||
total, 2*I915_GTT_PAGE_SIZE);
|
||||
err = -EINVAL;
|
||||
|
@ -1430,7 +1430,7 @@ static int igt_gtt_reserve(void *arg)
|
|||
GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
|
||||
if (vma->node.start != offset ||
|
||||
vma->node.size != 2*I915_GTT_PAGE_SIZE) {
|
||||
pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %lx)\n",
|
||||
pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
|
||||
vma->node.start, vma->node.size,
|
||||
offset, 2*I915_GTT_PAGE_SIZE);
|
||||
err = -EINVAL;
|
||||
|
|
|
@ -75,7 +75,7 @@ static void sun4i_lvds_encoder_enable(struct drm_encoder *encoder)
|
|||
|
||||
DRM_DEBUG_DRIVER("Enabling LVDS output\n");
|
||||
|
||||
if (!IS_ERR(tcon->panel)) {
|
||||
if (tcon->panel) {
|
||||
drm_panel_prepare(tcon->panel);
|
||||
drm_panel_enable(tcon->panel);
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ static void sun4i_lvds_encoder_disable(struct drm_encoder *encoder)
|
|||
|
||||
DRM_DEBUG_DRIVER("Disabling LVDS output\n");
|
||||
|
||||
if (!IS_ERR(tcon->panel)) {
|
||||
if (tcon->panel) {
|
||||
drm_panel_disable(tcon->panel);
|
||||
drm_panel_unprepare(tcon->panel);
|
||||
}
|
||||
|
|
|
@ -135,7 +135,7 @@ static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
|
|||
|
||||
DRM_DEBUG_DRIVER("Enabling RGB output\n");
|
||||
|
||||
if (!IS_ERR(tcon->panel)) {
|
||||
if (tcon->panel) {
|
||||
drm_panel_prepare(tcon->panel);
|
||||
drm_panel_enable(tcon->panel);
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
|
|||
|
||||
DRM_DEBUG_DRIVER("Disabling RGB output\n");
|
||||
|
||||
if (!IS_ERR(tcon->panel)) {
|
||||
if (tcon->panel) {
|
||||
drm_panel_disable(tcon->panel);
|
||||
drm_panel_unprepare(tcon->panel);
|
||||
}
|
||||
|
|
|
@ -491,7 +491,8 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
|
|||
sun4i_tcon0_mode_set_common(tcon, mode);
|
||||
|
||||
/* Set dithering if needed */
|
||||
sun4i_tcon0_mode_set_dithering(tcon, tcon->panel->connector);
|
||||
if (tcon->panel)
|
||||
sun4i_tcon0_mode_set_dithering(tcon, tcon->panel->connector);
|
||||
|
||||
/* Adjust clock delay */
|
||||
clk_delay = sun4i_tcon_get_clk_delay(mode, 0);
|
||||
|
@ -555,7 +556,7 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon,
|
|||
* Following code is a way to avoid quirks all around TCON
|
||||
* and DOTCLOCK drivers.
|
||||
*/
|
||||
if (!IS_ERR(tcon->panel)) {
|
||||
if (tcon->panel) {
|
||||
struct drm_panel *panel = tcon->panel;
|
||||
struct drm_connector *connector = panel->connector;
|
||||
struct drm_display_info display_info = connector->display_info;
|
||||
|
|
|
@ -83,11 +83,11 @@ struct kfd_ioctl_set_cu_mask_args {
|
|||
};
|
||||
|
||||
struct kfd_ioctl_get_queue_wave_state_args {
|
||||
uint64_t ctl_stack_address; /* to KFD */
|
||||
uint32_t ctl_stack_used_size; /* from KFD */
|
||||
uint32_t save_area_used_size; /* from KFD */
|
||||
uint32_t queue_id; /* to KFD */
|
||||
uint32_t pad;
|
||||
__u64 ctl_stack_address; /* to KFD */
|
||||
__u32 ctl_stack_used_size; /* from KFD */
|
||||
__u32 save_area_used_size; /* from KFD */
|
||||
__u32 queue_id; /* to KFD */
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
/* For kfd_ioctl_set_memory_policy_args.default_policy and alternate_policy */
|
||||
|
@ -255,10 +255,10 @@ struct kfd_hsa_memory_exception_data {
|
|||
|
||||
/* hw exception data */
|
||||
struct kfd_hsa_hw_exception_data {
|
||||
uint32_t reset_type;
|
||||
uint32_t reset_cause;
|
||||
uint32_t memory_lost;
|
||||
uint32_t gpu_id;
|
||||
__u32 reset_type;
|
||||
__u32 reset_cause;
|
||||
__u32 memory_lost;
|
||||
__u32 gpu_id;
|
||||
};
|
||||
|
||||
/* Event data */
|
||||
|
|
Loading…
Reference in New Issue