Commit 87d9862b authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2022-09-15' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Short summary of fixes pull:

 * gma500: Locking and IRQ fixes
 * meson: OSD1 display fixes
 * panel-edp: Fix Innolux timings
 * rockchip: DP/HDMI fixes
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/YyMUpP1w21CPXq+I@linux-uq9g
parents e2111ae2 b0b9408f
...@@ -581,11 +581,9 @@ static const struct psb_offset cdv_regmap[2] = { ...@@ -581,11 +581,9 @@ static const struct psb_offset cdv_regmap[2] = {
static int cdv_chip_setup(struct drm_device *dev) static int cdv_chip_setup(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev);
INIT_WORK(&dev_priv->hotplug_work, cdv_hotplug_work_func); INIT_WORK(&dev_priv->hotplug_work, cdv_hotplug_work_func);
if (pci_enable_msi(pdev)) dev_priv->use_msi = true;
dev_warn(dev->dev, "Enabling MSI failed!\n");
dev_priv->regmap = cdv_regmap; dev_priv->regmap = cdv_regmap;
gma_get_core_freq(dev); gma_get_core_freq(dev);
psb_intel_opregion_init(dev); psb_intel_opregion_init(dev);
......
...@@ -112,12 +112,12 @@ static void psb_gem_free_object(struct drm_gem_object *obj) ...@@ -112,12 +112,12 @@ static void psb_gem_free_object(struct drm_gem_object *obj)
{ {
struct psb_gem_object *pobj = to_psb_gem_object(obj); struct psb_gem_object *pobj = to_psb_gem_object(obj);
drm_gem_object_release(obj);
/* Undo the mmap pin if we are destroying the object */ /* Undo the mmap pin if we are destroying the object */
if (pobj->mmapping) if (pobj->mmapping)
psb_gem_unpin(pobj); psb_gem_unpin(pobj);
drm_gem_object_release(obj);
WARN_ON(pobj->in_gart && !pobj->stolen); WARN_ON(pobj->in_gart && !pobj->stolen);
release_resource(&pobj->resource); release_resource(&pobj->resource);
......
...@@ -532,15 +532,18 @@ int gma_crtc_page_flip(struct drm_crtc *crtc, ...@@ -532,15 +532,18 @@ int gma_crtc_page_flip(struct drm_crtc *crtc,
WARN_ON(drm_crtc_vblank_get(crtc) != 0); WARN_ON(drm_crtc_vblank_get(crtc) != 0);
gma_crtc->page_flip_event = event; gma_crtc->page_flip_event = event;
spin_unlock_irqrestore(&dev->event_lock, flags);
/* Call this locked if we want an event at vblank interrupt. */ /* Call this locked if we want an event at vblank interrupt. */
ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb); ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb);
if (ret) { if (ret) {
spin_lock_irqsave(&dev->event_lock, flags);
if (gma_crtc->page_flip_event) {
gma_crtc->page_flip_event = NULL; gma_crtc->page_flip_event = NULL;
drm_crtc_vblank_put(crtc); drm_crtc_vblank_put(crtc);
} }
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
}
} else { } else {
ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb); ret = crtc_funcs->mode_set_base(crtc, crtc->x, crtc->y, old_fb);
} }
......
...@@ -501,12 +501,9 @@ static const struct psb_offset oaktrail_regmap[2] = { ...@@ -501,12 +501,9 @@ static const struct psb_offset oaktrail_regmap[2] = {
static int oaktrail_chip_setup(struct drm_device *dev) static int oaktrail_chip_setup(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev);
int ret; int ret;
if (pci_enable_msi(pdev)) dev_priv->use_msi = true;
dev_warn(dev->dev, "Enabling MSI failed!\n");
dev_priv->regmap = oaktrail_regmap; dev_priv->regmap = oaktrail_regmap;
ret = mid_chip_setup(dev); ret = mid_chip_setup(dev);
......
...@@ -139,8 +139,6 @@ static void gma_suspend_pci(struct pci_dev *pdev) ...@@ -139,8 +139,6 @@ static void gma_suspend_pci(struct pci_dev *pdev)
dev_priv->regs.saveBSM = bsm; dev_priv->regs.saveBSM = bsm;
pci_read_config_dword(pdev, 0xFC, &vbt); pci_read_config_dword(pdev, 0xFC, &vbt);
dev_priv->regs.saveVBT = vbt; dev_priv->regs.saveVBT = vbt;
pci_read_config_dword(pdev, PSB_PCIx_MSI_ADDR_LOC, &dev_priv->msi_addr);
pci_read_config_dword(pdev, PSB_PCIx_MSI_DATA_LOC, &dev_priv->msi_data);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_set_power_state(pdev, PCI_D3hot); pci_set_power_state(pdev, PCI_D3hot);
...@@ -168,9 +166,6 @@ static bool gma_resume_pci(struct pci_dev *pdev) ...@@ -168,9 +166,6 @@ static bool gma_resume_pci(struct pci_dev *pdev)
pci_restore_state(pdev); pci_restore_state(pdev);
pci_write_config_dword(pdev, 0x5c, dev_priv->regs.saveBSM); pci_write_config_dword(pdev, 0x5c, dev_priv->regs.saveBSM);
pci_write_config_dword(pdev, 0xFC, dev_priv->regs.saveVBT); pci_write_config_dword(pdev, 0xFC, dev_priv->regs.saveVBT);
/* restoring MSI address and data in PCIx space */
pci_write_config_dword(pdev, PSB_PCIx_MSI_ADDR_LOC, dev_priv->msi_addr);
pci_write_config_dword(pdev, PSB_PCIx_MSI_DATA_LOC, dev_priv->msi_data);
ret = pci_enable_device(pdev); ret = pci_enable_device(pdev);
if (ret != 0) if (ret != 0)
...@@ -223,8 +218,7 @@ int gma_power_resume(struct device *_dev) ...@@ -223,8 +218,7 @@ int gma_power_resume(struct device *_dev)
mutex_lock(&power_mutex); mutex_lock(&power_mutex);
gma_resume_pci(pdev); gma_resume_pci(pdev);
gma_resume_display(pdev); gma_resume_display(pdev);
gma_irq_preinstall(dev); gma_irq_install(dev);
gma_irq_postinstall(dev);
mutex_unlock(&power_mutex); mutex_unlock(&power_mutex);
return 0; return 0;
} }
......
...@@ -383,7 +383,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -383,7 +383,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
PSB_WVDC32(0xFFFFFFFF, PSB_INT_MASK_R); PSB_WVDC32(0xFFFFFFFF, PSB_INT_MASK_R);
spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags); spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
gma_irq_install(dev, pdev->irq); gma_irq_install(dev);
dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */ dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
......
...@@ -490,6 +490,7 @@ struct drm_psb_private { ...@@ -490,6 +490,7 @@ struct drm_psb_private {
int rpm_enabled; int rpm_enabled;
/* MID specific */ /* MID specific */
bool use_msi;
bool has_gct; bool has_gct;
struct oaktrail_gct_data gct_data; struct oaktrail_gct_data gct_data;
...@@ -499,10 +500,6 @@ struct drm_psb_private { ...@@ -499,10 +500,6 @@ struct drm_psb_private {
/* Register state */ /* Register state */
struct psb_save_area regs; struct psb_save_area regs;
/* MSI reg save */
uint32_t msi_addr;
uint32_t msi_data;
/* Hotplug handling */ /* Hotplug handling */
struct work_struct hotplug_work; struct work_struct hotplug_work;
......
...@@ -316,17 +316,24 @@ void gma_irq_postinstall(struct drm_device *dev) ...@@ -316,17 +316,24 @@ void gma_irq_postinstall(struct drm_device *dev)
spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags); spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
} }
int gma_irq_install(struct drm_device *dev, unsigned int irq) int gma_irq_install(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev);
int ret; int ret;
if (irq == IRQ_NOTCONNECTED) if (dev_priv->use_msi && pci_enable_msi(pdev)) {
dev_warn(dev->dev, "Enabling MSI failed!\n");
dev_priv->use_msi = false;
}
if (pdev->irq == IRQ_NOTCONNECTED)
return -ENOTCONN; return -ENOTCONN;
gma_irq_preinstall(dev); gma_irq_preinstall(dev);
/* PCI devices require shared interrupts. */ /* PCI devices require shared interrupts. */
ret = request_irq(irq, gma_irq_handler, IRQF_SHARED, dev->driver->name, dev); ret = request_irq(pdev->irq, gma_irq_handler, IRQF_SHARED, dev->driver->name, dev);
if (ret) if (ret)
return ret; return ret;
...@@ -369,6 +376,8 @@ void gma_irq_uninstall(struct drm_device *dev) ...@@ -369,6 +376,8 @@ void gma_irq_uninstall(struct drm_device *dev)
spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags); spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
free_irq(pdev->irq, dev); free_irq(pdev->irq, dev);
if (dev_priv->use_msi)
pci_disable_msi(pdev);
} }
int gma_crtc_enable_vblank(struct drm_crtc *crtc) int gma_crtc_enable_vblank(struct drm_crtc *crtc)
......
...@@ -17,7 +17,7 @@ struct drm_device; ...@@ -17,7 +17,7 @@ struct drm_device;
void gma_irq_preinstall(struct drm_device *dev); void gma_irq_preinstall(struct drm_device *dev);
void gma_irq_postinstall(struct drm_device *dev); void gma_irq_postinstall(struct drm_device *dev);
int gma_irq_install(struct drm_device *dev, unsigned int irq); int gma_irq_install(struct drm_device *dev);
void gma_irq_uninstall(struct drm_device *dev); void gma_irq_uninstall(struct drm_device *dev);
int gma_crtc_enable_vblank(struct drm_crtc *crtc); int gma_crtc_enable_vblank(struct drm_crtc *crtc);
......
...@@ -170,7 +170,7 @@ static void meson_plane_atomic_update(struct drm_plane *plane, ...@@ -170,7 +170,7 @@ static void meson_plane_atomic_update(struct drm_plane *plane,
/* Enable OSD and BLK0, set max global alpha */ /* Enable OSD and BLK0, set max global alpha */
priv->viu.osd1_ctrl_stat = OSD_ENABLE | priv->viu.osd1_ctrl_stat = OSD_ENABLE |
(0xFF << OSD_GLOBAL_ALPHA_SHIFT) | (0x100 << OSD_GLOBAL_ALPHA_SHIFT) |
OSD_BLK0_ENABLE; OSD_BLK0_ENABLE;
priv->viu.osd1_ctrl_stat2 = readl(priv->io_base + priv->viu.osd1_ctrl_stat2 = readl(priv->io_base +
......
...@@ -94,7 +94,7 @@ static void meson_viu_set_g12a_osd1_matrix(struct meson_drm *priv, ...@@ -94,7 +94,7 @@ static void meson_viu_set_g12a_osd1_matrix(struct meson_drm *priv,
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF11_12)); priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF11_12));
writel(((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff), writel(((m[9] & 0x1fff) << 16) | (m[10] & 0x1fff),
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF20_21)); priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF20_21));
writel((m[11] & 0x1fff) << 16, writel((m[11] & 0x1fff),
priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF22)); priv->io_base + _REG(VPP_WRAP_OSD1_MATRIX_COEF22));
writel(((m[18] & 0xfff) << 16) | (m[19] & 0xfff), writel(((m[18] & 0xfff) << 16) | (m[19] & 0xfff),
......
...@@ -1295,7 +1295,8 @@ static const struct panel_desc innolux_n116bca_ea1 = { ...@@ -1295,7 +1295,8 @@ static const struct panel_desc innolux_n116bca_ea1 = {
}, },
.delay = { .delay = {
.hpd_absent = 200, .hpd_absent = 200,
.prepare_to_enable = 80, .enable = 80,
.disable = 50,
.unprepare = 500, .unprepare = 500,
}, },
}; };
......
...@@ -283,7 +283,8 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector) ...@@ -283,7 +283,8 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector)
return ret; return ret;
} }
static int cdn_dp_connector_mode_valid(struct drm_connector *connector, static enum drm_mode_status
cdn_dp_connector_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode) struct drm_display_mode *mode)
{ {
struct cdn_dp_device *dp = connector_to_dp(connector); struct cdn_dp_device *dp = connector_to_dp(connector);
......
...@@ -1439,11 +1439,15 @@ static void rk3568_set_intf_mux(struct vop2_video_port *vp, int id, ...@@ -1439,11 +1439,15 @@ static void rk3568_set_intf_mux(struct vop2_video_port *vp, int id,
die &= ~RK3568_SYS_DSP_INFACE_EN_HDMI_MUX; die &= ~RK3568_SYS_DSP_INFACE_EN_HDMI_MUX;
die |= RK3568_SYS_DSP_INFACE_EN_HDMI | die |= RK3568_SYS_DSP_INFACE_EN_HDMI |
FIELD_PREP(RK3568_SYS_DSP_INFACE_EN_HDMI_MUX, vp->id); FIELD_PREP(RK3568_SYS_DSP_INFACE_EN_HDMI_MUX, vp->id);
dip &= ~RK3568_DSP_IF_POL__HDMI_PIN_POL;
dip |= FIELD_PREP(RK3568_DSP_IF_POL__HDMI_PIN_POL, polflags);
break; break;
case ROCKCHIP_VOP2_EP_EDP0: case ROCKCHIP_VOP2_EP_EDP0:
die &= ~RK3568_SYS_DSP_INFACE_EN_EDP_MUX; die &= ~RK3568_SYS_DSP_INFACE_EN_EDP_MUX;
die |= RK3568_SYS_DSP_INFACE_EN_EDP | die |= RK3568_SYS_DSP_INFACE_EN_EDP |
FIELD_PREP(RK3568_SYS_DSP_INFACE_EN_EDP_MUX, vp->id); FIELD_PREP(RK3568_SYS_DSP_INFACE_EN_EDP_MUX, vp->id);
dip &= ~RK3568_DSP_IF_POL__EDP_PIN_POL;
dip |= FIELD_PREP(RK3568_DSP_IF_POL__EDP_PIN_POL, polflags);
break; break;
case ROCKCHIP_VOP2_EP_MIPI0: case ROCKCHIP_VOP2_EP_MIPI0:
die &= ~RK3568_SYS_DSP_INFACE_EN_MIPI0_MUX; die &= ~RK3568_SYS_DSP_INFACE_EN_MIPI0_MUX;
......
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