Commit afa0f6ee authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'drm-fixes-2023-11-24' of git://anongit.freedesktop.org/drm/drm

Pull drm fixes from Dave Airlie:
 "Back to regular scheduled fixes pull request, mainly a bunch of msm,
  some i915 and otherwise a few scattered, one memory crasher in the
  nouveau GSP paths is helping stabilise that work.

  msm:
   - Fix the VREG_CTRL_1 for 4nm CPHY to match downstream
   - Remove duplicate call to drm_kms_helper_poll_init() in
     msm_drm_init()
   - Fix the safe_lut_tbl[] for sc8280xp to match downstream
   - Don't attach the drm_dp_set_subconnector_property() for eDP
   - Fix to attach drm_dp_set_subconnector_property() for DP. Otherwise
     there is a bootup crash on multiple targets
   - Remove unnecessary NULL check left behind during cleanup

  i915:
   - Fix race between DP MST connectore registration and setup
   - Fix GT memory leak on probe error path

  panel:
   - Fixes for innolux and auo,b101uan08.3 panel.
   - Fix Himax83102-j02 timings.

  ivpu:
   - Fix ivpu MMIO reset.

  ast:
   - AST fix on connetor disconnection.

  nouveau:
   - gsp memory corruption fix

  rockchip:
   - color fix"

* tag 'drm-fixes-2023-11-24' of git://anongit.freedesktop.org/drm/drm:
  nouveau/gsp: allocate enough space for all channel ids.
  drm/panel: boe-tv101wum-nl6: Fine tune Himax83102-j02 panel HFP and HBP
  drm/ast: Disconnect BMC if physical connector is connected
  accel/ivpu/37xx: Fix hangs related to MMIO reset
  drm/rockchip: vop: Fix color for RGB888/BGR888 format on VOP full
  drm/i915: do not clean GT table on error path
  drm/i915/dp_mst: Fix race between connector registration and setup
  drm/panel: simple: Fix Innolux G101ICE-L01 timings
  drm/panel: simple: Fix Innolux G101ICE-L01 bus flags
  drm/msm: remove unnecessary NULL check
  drm/panel: auo,b101uan08.3: Fine tune the panel power sequence
  drm/msm/dp: attach the DP subconnector property
  drm/msm/dp: don't touch DP subconnector property in eDP case
  drm/msm/dpu: Add missing safe_lut_tbl in sc8280xp catalog
  drm/msm: remove exra drm_kms_helper_poll_init() call
  drm/msm/dsi: use the correct VREG_CTRL_1 value for 4nm cphy
parents f1a09972 b3ca8a08
...@@ -502,6 +502,16 @@ static int ivpu_boot_pwr_domain_enable(struct ivpu_device *vdev) ...@@ -502,6 +502,16 @@ static int ivpu_boot_pwr_domain_enable(struct ivpu_device *vdev)
return ret; return ret;
} }
static int ivpu_boot_pwr_domain_disable(struct ivpu_device *vdev)
{
ivpu_boot_dpu_active_drive(vdev, false);
ivpu_boot_pwr_island_isolation_drive(vdev, true);
ivpu_boot_pwr_island_trickle_drive(vdev, false);
ivpu_boot_pwr_island_drive(vdev, false);
return ivpu_boot_wait_for_pwr_island_status(vdev, 0x0);
}
static void ivpu_boot_no_snoop_enable(struct ivpu_device *vdev) static void ivpu_boot_no_snoop_enable(struct ivpu_device *vdev)
{ {
u32 val = REGV_RD32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES); u32 val = REGV_RD32(VPU_37XX_HOST_IF_TCU_PTW_OVERRIDES);
...@@ -600,25 +610,17 @@ static int ivpu_hw_37xx_info_init(struct ivpu_device *vdev) ...@@ -600,25 +610,17 @@ static int ivpu_hw_37xx_info_init(struct ivpu_device *vdev)
static int ivpu_hw_37xx_reset(struct ivpu_device *vdev) static int ivpu_hw_37xx_reset(struct ivpu_device *vdev)
{ {
int ret; int ret = 0;
u32 val;
if (IVPU_WA(punit_disabled))
return 0;
ret = REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_IP_RESET, TRIGGER, 0, TIMEOUT_US); if (ivpu_boot_pwr_domain_disable(vdev)) {
if (ret) { ivpu_err(vdev, "Failed to disable power domain\n");
ivpu_err(vdev, "Timed out waiting for TRIGGER bit\n"); ret = -EIO;
return ret;
} }
val = REGB_RD32(VPU_37XX_BUTTRESS_VPU_IP_RESET); if (ivpu_pll_disable(vdev)) {
val = REG_SET_FLD(VPU_37XX_BUTTRESS_VPU_IP_RESET, TRIGGER, val); ivpu_err(vdev, "Failed to disable PLL\n");
REGB_WR32(VPU_37XX_BUTTRESS_VPU_IP_RESET, val); ret = -EIO;
}
ret = REGB_POLL_FLD(VPU_37XX_BUTTRESS_VPU_IP_RESET, TRIGGER, 0, TIMEOUT_US);
if (ret)
ivpu_err(vdev, "Timed out waiting for RESET completion\n");
return ret; return ret;
} }
...@@ -651,10 +653,6 @@ static int ivpu_hw_37xx_power_up(struct ivpu_device *vdev) ...@@ -651,10 +653,6 @@ static int ivpu_hw_37xx_power_up(struct ivpu_device *vdev)
{ {
int ret; int ret;
ret = ivpu_hw_37xx_reset(vdev);
if (ret)
ivpu_warn(vdev, "Failed to reset HW: %d\n", ret);
ret = ivpu_hw_37xx_d0i3_disable(vdev); ret = ivpu_hw_37xx_d0i3_disable(vdev);
if (ret) if (ret)
ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret); ivpu_warn(vdev, "Failed to disable D0I3: %d\n", ret);
...@@ -722,11 +720,11 @@ static int ivpu_hw_37xx_power_down(struct ivpu_device *vdev) ...@@ -722,11 +720,11 @@ static int ivpu_hw_37xx_power_down(struct ivpu_device *vdev)
{ {
int ret = 0; int ret = 0;
if (!ivpu_hw_37xx_is_idle(vdev) && ivpu_hw_37xx_reset(vdev)) if (!ivpu_hw_37xx_is_idle(vdev))
ivpu_err(vdev, "Failed to reset the VPU\n"); ivpu_warn(vdev, "VPU not idle during power down\n");
if (ivpu_pll_disable(vdev)) { if (ivpu_hw_37xx_reset(vdev)) {
ivpu_err(vdev, "Failed to disable PLL\n"); ivpu_err(vdev, "Failed to reset VPU\n");
ret = -EIO; ret = -EIO;
} }
......
...@@ -174,6 +174,17 @@ to_ast_sil164_connector(struct drm_connector *connector) ...@@ -174,6 +174,17 @@ to_ast_sil164_connector(struct drm_connector *connector)
return container_of(connector, struct ast_sil164_connector, base); return container_of(connector, struct ast_sil164_connector, base);
} }
struct ast_bmc_connector {
struct drm_connector base;
struct drm_connector *physical_connector;
};
static inline struct ast_bmc_connector *
to_ast_bmc_connector(struct drm_connector *connector)
{
return container_of(connector, struct ast_bmc_connector, base);
}
/* /*
* Device * Device
*/ */
...@@ -218,7 +229,7 @@ struct ast_device { ...@@ -218,7 +229,7 @@ struct ast_device {
} astdp; } astdp;
struct { struct {
struct drm_encoder encoder; struct drm_encoder encoder;
struct drm_connector connector; struct ast_bmc_connector bmc_connector;
} bmc; } bmc;
} output; } output;
......
...@@ -1767,6 +1767,30 @@ static const struct drm_encoder_funcs ast_bmc_encoder_funcs = { ...@@ -1767,6 +1767,30 @@ static const struct drm_encoder_funcs ast_bmc_encoder_funcs = {
.destroy = drm_encoder_cleanup, .destroy = drm_encoder_cleanup,
}; };
static int ast_bmc_connector_helper_detect_ctx(struct drm_connector *connector,
struct drm_modeset_acquire_ctx *ctx,
bool force)
{
struct ast_bmc_connector *bmc_connector = to_ast_bmc_connector(connector);
struct drm_connector *physical_connector = bmc_connector->physical_connector;
/*
* Most user-space compositors cannot handle more than one connected
* connector per CRTC. Hence, we only mark the BMC as connected if the
* physical connector is disconnected. If the physical connector's status
* is connected or unknown, the BMC remains disconnected. This has no
* effect on the output of the BMC.
*
* FIXME: Remove this logic once user-space compositors can handle more
* than one connector per CRTC. The BMC should always be connected.
*/
if (physical_connector && physical_connector->status == connector_status_disconnected)
return connector_status_connected;
return connector_status_disconnected;
}
static int ast_bmc_connector_helper_get_modes(struct drm_connector *connector) static int ast_bmc_connector_helper_get_modes(struct drm_connector *connector)
{ {
return drm_add_modes_noedid(connector, 4096, 4096); return drm_add_modes_noedid(connector, 4096, 4096);
...@@ -1774,6 +1798,7 @@ static int ast_bmc_connector_helper_get_modes(struct drm_connector *connector) ...@@ -1774,6 +1798,7 @@ static int ast_bmc_connector_helper_get_modes(struct drm_connector *connector)
static const struct drm_connector_helper_funcs ast_bmc_connector_helper_funcs = { static const struct drm_connector_helper_funcs ast_bmc_connector_helper_funcs = {
.get_modes = ast_bmc_connector_helper_get_modes, .get_modes = ast_bmc_connector_helper_get_modes,
.detect_ctx = ast_bmc_connector_helper_detect_ctx,
}; };
static const struct drm_connector_funcs ast_bmc_connector_funcs = { static const struct drm_connector_funcs ast_bmc_connector_funcs = {
...@@ -1784,12 +1809,33 @@ static const struct drm_connector_funcs ast_bmc_connector_funcs = { ...@@ -1784,12 +1809,33 @@ static const struct drm_connector_funcs ast_bmc_connector_funcs = {
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
}; };
static int ast_bmc_output_init(struct ast_device *ast) static int ast_bmc_connector_init(struct drm_device *dev,
struct ast_bmc_connector *bmc_connector,
struct drm_connector *physical_connector)
{
struct drm_connector *connector = &bmc_connector->base;
int ret;
ret = drm_connector_init(dev, connector, &ast_bmc_connector_funcs,
DRM_MODE_CONNECTOR_VIRTUAL);
if (ret)
return ret;
drm_connector_helper_add(connector, &ast_bmc_connector_helper_funcs);
bmc_connector->physical_connector = physical_connector;
return 0;
}
static int ast_bmc_output_init(struct ast_device *ast,
struct drm_connector *physical_connector)
{ {
struct drm_device *dev = &ast->base; struct drm_device *dev = &ast->base;
struct drm_crtc *crtc = &ast->crtc; struct drm_crtc *crtc = &ast->crtc;
struct drm_encoder *encoder = &ast->output.bmc.encoder; struct drm_encoder *encoder = &ast->output.bmc.encoder;
struct drm_connector *connector = &ast->output.bmc.connector; struct ast_bmc_connector *bmc_connector = &ast->output.bmc.bmc_connector;
struct drm_connector *connector = &bmc_connector->base;
int ret; int ret;
ret = drm_encoder_init(dev, encoder, ret = drm_encoder_init(dev, encoder,
...@@ -1799,13 +1845,10 @@ static int ast_bmc_output_init(struct ast_device *ast) ...@@ -1799,13 +1845,10 @@ static int ast_bmc_output_init(struct ast_device *ast)
return ret; return ret;
encoder->possible_crtcs = drm_crtc_mask(crtc); encoder->possible_crtcs = drm_crtc_mask(crtc);
ret = drm_connector_init(dev, connector, &ast_bmc_connector_funcs, ret = ast_bmc_connector_init(dev, bmc_connector, physical_connector);
DRM_MODE_CONNECTOR_VIRTUAL);
if (ret) if (ret)
return ret; return ret;
drm_connector_helper_add(connector, &ast_bmc_connector_helper_funcs);
ret = drm_connector_attach_encoder(connector, encoder); ret = drm_connector_attach_encoder(connector, encoder);
if (ret) if (ret)
return ret; return ret;
...@@ -1864,6 +1907,7 @@ static const struct drm_mode_config_funcs ast_mode_config_funcs = { ...@@ -1864,6 +1907,7 @@ static const struct drm_mode_config_funcs ast_mode_config_funcs = {
int ast_mode_config_init(struct ast_device *ast) int ast_mode_config_init(struct ast_device *ast)
{ {
struct drm_device *dev = &ast->base; struct drm_device *dev = &ast->base;
struct drm_connector *physical_connector = NULL;
int ret; int ret;
ret = drmm_mode_config_init(dev); ret = drmm_mode_config_init(dev);
...@@ -1904,23 +1948,27 @@ int ast_mode_config_init(struct ast_device *ast) ...@@ -1904,23 +1948,27 @@ int ast_mode_config_init(struct ast_device *ast)
ret = ast_vga_output_init(ast); ret = ast_vga_output_init(ast);
if (ret) if (ret)
return ret; return ret;
physical_connector = &ast->output.vga.vga_connector.base;
} }
if (ast->tx_chip_types & AST_TX_SIL164_BIT) { if (ast->tx_chip_types & AST_TX_SIL164_BIT) {
ret = ast_sil164_output_init(ast); ret = ast_sil164_output_init(ast);
if (ret) if (ret)
return ret; return ret;
physical_connector = &ast->output.sil164.sil164_connector.base;
} }
if (ast->tx_chip_types & AST_TX_DP501_BIT) { if (ast->tx_chip_types & AST_TX_DP501_BIT) {
ret = ast_dp501_output_init(ast); ret = ast_dp501_output_init(ast);
if (ret) if (ret)
return ret; return ret;
physical_connector = &ast->output.dp501.connector;
} }
if (ast->tx_chip_types & AST_TX_ASTDP_BIT) { if (ast->tx_chip_types & AST_TX_ASTDP_BIT) {
ret = ast_astdp_output_init(ast); ret = ast_astdp_output_init(ast);
if (ret) if (ret)
return ret; return ret;
physical_connector = &ast->output.astdp.connector;
} }
ret = ast_bmc_output_init(ast); ret = ast_bmc_output_init(ast, physical_connector);
if (ret) if (ret)
return ret; return ret;
......
...@@ -1161,6 +1161,14 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo ...@@ -1161,6 +1161,14 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
intel_connector->port = port; intel_connector->port = port;
drm_dp_mst_get_port_malloc(port); drm_dp_mst_get_port_malloc(port);
/*
* TODO: set the AUX for the actual MST port decompressing the stream.
* At the moment the driver only supports enabling this globally in the
* first downstream MST branch, via intel_dp's (root port) AUX.
*/
intel_connector->dp.dsc_decompression_aux = &intel_dp->aux;
intel_dp_mst_read_decompression_port_dsc_caps(intel_dp, intel_connector);
connector = &intel_connector->base; connector = &intel_connector->base;
ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs, ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs,
DRM_MODE_CONNECTOR_DisplayPort); DRM_MODE_CONNECTOR_DisplayPort);
...@@ -1172,14 +1180,6 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo ...@@ -1172,14 +1180,6 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs); drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
/*
* TODO: set the AUX for the actual MST port decompressing the stream.
* At the moment the driver only supports enabling this globally in the
* first downstream MST branch, via intel_dp's (root port) AUX.
*/
intel_connector->dp.dsc_decompression_aux = &intel_dp->aux;
intel_dp_mst_read_decompression_port_dsc_caps(intel_dp, intel_connector);
for_each_pipe(dev_priv, pipe) { for_each_pipe(dev_priv, pipe) {
struct drm_encoder *enc = struct drm_encoder *enc =
&intel_dp->mst_encoders[pipe]->base.base; &intel_dp->mst_encoders[pipe]->base.base;
......
...@@ -982,8 +982,6 @@ int intel_gt_probe_all(struct drm_i915_private *i915) ...@@ -982,8 +982,6 @@ int intel_gt_probe_all(struct drm_i915_private *i915)
err: err:
i915_probe_error(i915, "Failed to initialize %s! (%d)\n", gtdef->name, ret); i915_probe_error(i915, "Failed to initialize %s! (%d)\n", gtdef->name, ret);
intel_gt_release_all(i915);
return ret; return ret;
} }
...@@ -1002,15 +1000,6 @@ int intel_gt_tiles_init(struct drm_i915_private *i915) ...@@ -1002,15 +1000,6 @@ int intel_gt_tiles_init(struct drm_i915_private *i915)
return 0; return 0;
} }
void intel_gt_release_all(struct drm_i915_private *i915)
{
struct intel_gt *gt;
unsigned int id;
for_each_gt(gt, i915, id)
i915->gt[id] = NULL;
}
void intel_gt_info_print(const struct intel_gt_info *info, void intel_gt_info_print(const struct intel_gt_info *info,
struct drm_printer *p) struct drm_printer *p)
{ {
......
...@@ -782,7 +782,7 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -782,7 +782,7 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
ret = i915_driver_mmio_probe(i915); ret = i915_driver_mmio_probe(i915);
if (ret < 0) if (ret < 0)
goto out_tiles_cleanup; goto out_runtime_pm_put;
ret = i915_driver_hw_probe(i915); ret = i915_driver_hw_probe(i915);
if (ret < 0) if (ret < 0)
...@@ -842,8 +842,6 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -842,8 +842,6 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
i915_ggtt_driver_late_release(i915); i915_ggtt_driver_late_release(i915);
out_cleanup_mmio: out_cleanup_mmio:
i915_driver_mmio_release(i915); i915_driver_mmio_release(i915);
out_tiles_cleanup:
intel_gt_release_all(i915);
out_runtime_pm_put: out_runtime_pm_put:
enable_rpm_wakeref_asserts(&i915->runtime_pm); enable_rpm_wakeref_asserts(&i915->runtime_pm);
i915_driver_late_release(i915); i915_driver_late_release(i915);
......
...@@ -406,6 +406,7 @@ static const struct dpu_perf_cfg sc8280xp_perf_data = { ...@@ -406,6 +406,7 @@ static const struct dpu_perf_cfg sc8280xp_perf_data = {
.min_llcc_ib = 0, .min_llcc_ib = 0,
.min_dram_ib = 800000, .min_dram_ib = 800000,
.danger_lut_tbl = {0xf, 0xffff, 0x0}, .danger_lut_tbl = {0xf, 0xffff, 0x0},
.safe_lut_tbl = {0xfe00, 0xfe00, 0xffff},
.qos_lut_tbl = { .qos_lut_tbl = {
{.nentry = ARRAY_SIZE(sc8180x_qos_linear), {.nentry = ARRAY_SIZE(sc8180x_qos_linear),
.entries = sc8180x_qos_linear .entries = sc8180x_qos_linear
......
...@@ -844,8 +844,7 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev) ...@@ -844,8 +844,7 @@ static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
return 0; return 0;
fail: fail:
if (mdp5_kms) mdp5_destroy(mdp5_kms);
mdp5_destroy(mdp5_kms);
return ret; return ret;
} }
......
...@@ -365,9 +365,11 @@ static int dp_display_send_hpd_notification(struct dp_display_private *dp, ...@@ -365,9 +365,11 @@ static int dp_display_send_hpd_notification(struct dp_display_private *dp,
/* reset video pattern flag on disconnect */ /* reset video pattern flag on disconnect */
if (!hpd) { if (!hpd) {
dp->panel->video_test = false; dp->panel->video_test = false;
drm_dp_set_subconnector_property(dp->dp_display.connector, if (!dp->dp_display.is_edp)
connector_status_disconnected, drm_dp_set_subconnector_property(dp->dp_display.connector,
dp->panel->dpcd, dp->panel->downstream_ports); connector_status_disconnected,
dp->panel->dpcd,
dp->panel->downstream_ports);
} }
dp->dp_display.is_connected = hpd; dp->dp_display.is_connected = hpd;
...@@ -396,8 +398,11 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) ...@@ -396,8 +398,11 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)
dp_link_process_request(dp->link); dp_link_process_request(dp->link);
drm_dp_set_subconnector_property(dp->dp_display.connector, connector_status_connected, if (!dp->dp_display.is_edp)
dp->panel->dpcd, dp->panel->downstream_ports); drm_dp_set_subconnector_property(dp->dp_display.connector,
connector_status_connected,
dp->panel->dpcd,
dp->panel->downstream_ports);
edid = dp->panel->edid; edid = dp->panel->edid;
......
...@@ -345,6 +345,9 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr ...@@ -345,6 +345,9 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr
if (IS_ERR(connector)) if (IS_ERR(connector))
return connector; return connector;
if (!dp_display->is_edp)
drm_connector_attach_dp_subconnector_property(connector);
drm_connector_attach_encoder(connector, encoder); drm_connector_attach_encoder(connector, encoder);
return connector; return connector;
......
...@@ -918,7 +918,7 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, ...@@ -918,7 +918,7 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy,
if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) { if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2)) {
if (phy->cphy_mode) { if (phy->cphy_mode) {
vreg_ctrl_0 = 0x45; vreg_ctrl_0 = 0x45;
vreg_ctrl_1 = 0x45; vreg_ctrl_1 = 0x41;
glbl_rescode_top_ctrl = 0x00; glbl_rescode_top_ctrl = 0x00;
glbl_rescode_bot_ctrl = 0x00; glbl_rescode_bot_ctrl = 0x00;
} else { } else {
......
...@@ -288,8 +288,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv) ...@@ -288,8 +288,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
if (ret) if (ret)
goto err_msm_uninit; goto err_msm_uninit;
drm_kms_helper_poll_init(ddev);
if (priv->kms_init) { if (priv->kms_init) {
drm_kms_helper_poll_init(ddev); drm_kms_helper_poll_init(ddev);
msm_fbdev_setup(ddev); msm_fbdev_setup(ddev);
......
...@@ -539,7 +539,7 @@ r535_fifo_runl_ctor(struct nvkm_fifo *fifo) ...@@ -539,7 +539,7 @@ r535_fifo_runl_ctor(struct nvkm_fifo *fifo)
struct nvkm_runl *runl; struct nvkm_runl *runl;
struct nvkm_engn *engn; struct nvkm_engn *engn;
u32 cgids = 2048; u32 cgids = 2048;
u32 chids = 2048 / CHID_PER_USERD; u32 chids = 2048;
int ret; int ret;
NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS *ctrl; NV2080_CTRL_FIFO_GET_DEVICE_INFO_TABLE_PARAMS *ctrl;
......
...@@ -1709,6 +1709,7 @@ static const struct panel_desc auo_b101uan08_3_desc = { ...@@ -1709,6 +1709,7 @@ static const struct panel_desc auo_b101uan08_3_desc = {
.mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE | .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
MIPI_DSI_MODE_LPM, MIPI_DSI_MODE_LPM,
.init_cmds = auo_b101uan08_3_init_cmd, .init_cmds = auo_b101uan08_3_init_cmd,
.lp11_before_reset = true,
}; };
static const struct drm_display_mode boe_tv105wum_nw0_default_mode = { static const struct drm_display_mode boe_tv105wum_nw0_default_mode = {
...@@ -1766,11 +1767,11 @@ static const struct panel_desc starry_qfh032011_53g_desc = { ...@@ -1766,11 +1767,11 @@ static const struct panel_desc starry_qfh032011_53g_desc = {
}; };
static const struct drm_display_mode starry_himax83102_j02_default_mode = { static const struct drm_display_mode starry_himax83102_j02_default_mode = {
.clock = 161600, .clock = 162850,
.hdisplay = 1200, .hdisplay = 1200,
.hsync_start = 1200 + 40, .hsync_start = 1200 + 50,
.hsync_end = 1200 + 40 + 20, .hsync_end = 1200 + 50 + 20,
.htotal = 1200 + 40 + 20 + 40, .htotal = 1200 + 50 + 20 + 50,
.vdisplay = 1920, .vdisplay = 1920,
.vsync_start = 1920 + 116, .vsync_start = 1920 + 116,
.vsync_end = 1920 + 116 + 8, .vsync_end = 1920 + 116 + 8,
......
...@@ -2379,13 +2379,13 @@ static const struct panel_desc innolux_g070y2_t02 = { ...@@ -2379,13 +2379,13 @@ static const struct panel_desc innolux_g070y2_t02 = {
static const struct display_timing innolux_g101ice_l01_timing = { static const struct display_timing innolux_g101ice_l01_timing = {
.pixelclock = { 60400000, 71100000, 74700000 }, .pixelclock = { 60400000, 71100000, 74700000 },
.hactive = { 1280, 1280, 1280 }, .hactive = { 1280, 1280, 1280 },
.hfront_porch = { 41, 80, 100 }, .hfront_porch = { 30, 60, 70 },
.hback_porch = { 40, 79, 99 }, .hback_porch = { 30, 60, 70 },
.hsync_len = { 1, 1, 1 }, .hsync_len = { 22, 40, 60 },
.vactive = { 800, 800, 800 }, .vactive = { 800, 800, 800 },
.vfront_porch = { 5, 11, 14 }, .vfront_porch = { 3, 8, 14 },
.vback_porch = { 4, 11, 14 }, .vback_porch = { 3, 8, 14 },
.vsync_len = { 1, 1, 1 }, .vsync_len = { 4, 7, 12 },
.flags = DISPLAY_FLAGS_DE_HIGH, .flags = DISPLAY_FLAGS_DE_HIGH,
}; };
...@@ -2402,6 +2402,7 @@ static const struct panel_desc innolux_g101ice_l01 = { ...@@ -2402,6 +2402,7 @@ static const struct panel_desc innolux_g101ice_l01 = {
.disable = 200, .disable = 200,
}, },
.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, .bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
.bus_flags = DRM_BUS_FLAG_DE_HIGH,
.connector_type = DRM_MODE_CONNECTOR_LVDS, .connector_type = DRM_MODE_CONNECTOR_LVDS,
}; };
......
...@@ -247,14 +247,22 @@ static inline void vop_cfg_done(struct vop *vop) ...@@ -247,14 +247,22 @@ static inline void vop_cfg_done(struct vop *vop)
VOP_REG_SET(vop, common, cfg_done, 1); VOP_REG_SET(vop, common, cfg_done, 1);
} }
static bool has_rb_swapped(uint32_t format) static bool has_rb_swapped(uint32_t version, uint32_t format)
{ {
switch (format) { switch (format) {
case DRM_FORMAT_XBGR8888: case DRM_FORMAT_XBGR8888:
case DRM_FORMAT_ABGR8888: case DRM_FORMAT_ABGR8888:
case DRM_FORMAT_BGR888:
case DRM_FORMAT_BGR565: case DRM_FORMAT_BGR565:
return true; return true;
/*
* full framework (IP version 3.x) only need rb swapped for RGB888 and
* little framework (IP version 2.x) only need rb swapped for BGR888,
* check for 3.x to also only rb swap BGR888 for unknown vop version
*/
case DRM_FORMAT_RGB888:
return VOP_MAJOR(version) == 3;
case DRM_FORMAT_BGR888:
return VOP_MAJOR(version) != 3;
default: default:
return false; return false;
} }
...@@ -1030,7 +1038,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, ...@@ -1030,7 +1038,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
VOP_WIN_SET(vop, win, dsp_info, dsp_info); VOP_WIN_SET(vop, win, dsp_info, dsp_info);
VOP_WIN_SET(vop, win, dsp_st, dsp_st); VOP_WIN_SET(vop, win, dsp_st, dsp_st);
rb_swap = has_rb_swapped(fb->format->format); rb_swap = has_rb_swapped(vop->data->version, fb->format->format);
VOP_WIN_SET(vop, win, rb_swap, rb_swap); VOP_WIN_SET(vop, win, rb_swap, rb_swap);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment