Skip to content

Commit 2603342

Browse files
committed
Merge tag 'drm-misc-fixes-2024-06-07' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
drm-misc-fixes for v6.10-rc3: - Robustness fixes for vmwgfx. - Error check for of_drm_get_panel_orientation failing in sitronix-st7789v. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/d5645d00-a8cf-47d9-a2a0-4ff55842fc7d@linux.intel.com
2 parents 2d42183 + 5703fc0 commit 2603342

File tree

6 files changed

+74
-44
lines changed

6 files changed

+74
-44
lines changed

drivers/gpu/drm/panel/panel-sitronix-st7789v.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,9 @@ static int st7789v_probe(struct spi_device *spi)
643643
if (ret)
644644
return dev_err_probe(dev, ret, "Failed to get backlight\n");
645645

646-
of_drm_get_panel_orientation(spi->dev.of_node, &ctx->orientation);
646+
ret = of_drm_get_panel_orientation(spi->dev.of_node, &ctx->orientation);
647+
if (ret)
648+
return dev_err_probe(&spi->dev, ret, "Failed to get orientation\n");
647649

648650
drm_panel_add(&ctx->panel);
649651

drivers/gpu/drm/vmwgfx/vmwgfx_drv.c

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ static int vmw_setup_pci_resources(struct vmw_private *dev,
746746
dev->vram_size = pci_resource_len(pdev, 2);
747747

748748
drm_info(&dev->drm,
749-
"Register MMIO at 0x%pa size is %llu kiB\n",
749+
"Register MMIO at 0x%pa size is %llu KiB\n",
750750
&rmmio_start, (uint64_t)rmmio_size / 1024);
751751
dev->rmmio = devm_ioremap(dev->drm.dev,
752752
rmmio_start,
@@ -765,7 +765,7 @@ static int vmw_setup_pci_resources(struct vmw_private *dev,
765765
fifo_size = pci_resource_len(pdev, 2);
766766

767767
drm_info(&dev->drm,
768-
"FIFO at %pa size is %llu kiB\n",
768+
"FIFO at %pa size is %llu KiB\n",
769769
&fifo_start, (uint64_t)fifo_size / 1024);
770770
dev->fifo_mem = devm_memremap(dev->drm.dev,
771771
fifo_start,
@@ -790,7 +790,7 @@ static int vmw_setup_pci_resources(struct vmw_private *dev,
790790
* SVGA_REG_VRAM_SIZE.
791791
*/
792792
drm_info(&dev->drm,
793-
"VRAM at %pa size is %llu kiB\n",
793+
"VRAM at %pa size is %llu KiB\n",
794794
&dev->vram_start, (uint64_t)dev->vram_size / 1024);
795795

796796
return 0;
@@ -960,13 +960,6 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
960960
vmw_read(dev_priv,
961961
SVGA_REG_SUGGESTED_GBOBJECT_MEM_SIZE_KB);
962962

963-
/*
964-
* Workaround for low memory 2D VMs to compensate for the
965-
* allocation taken by fbdev
966-
*/
967-
if (!(dev_priv->capabilities & SVGA_CAP_3D))
968-
mem_size *= 3;
969-
970963
dev_priv->max_mob_pages = mem_size * 1024 / PAGE_SIZE;
971964
dev_priv->max_primary_mem =
972965
vmw_read(dev_priv, SVGA_REG_MAX_PRIMARY_MEM);
@@ -991,13 +984,13 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
991984
dev_priv->max_primary_mem = dev_priv->vram_size;
992985
}
993986
drm_info(&dev_priv->drm,
994-
"Legacy memory limits: VRAM = %llu kB, FIFO = %llu kB, surface = %u kB\n",
987+
"Legacy memory limits: VRAM = %llu KiB, FIFO = %llu KiB, surface = %u KiB\n",
995988
(u64)dev_priv->vram_size / 1024,
996989
(u64)dev_priv->fifo_mem_size / 1024,
997990
dev_priv->memory_size / 1024);
998991

999992
drm_info(&dev_priv->drm,
1000-
"MOB limits: max mob size = %u kB, max mob pages = %u\n",
993+
"MOB limits: max mob size = %u KiB, max mob pages = %u\n",
1001994
dev_priv->max_mob_size / 1024, dev_priv->max_mob_pages);
1002995

1003996
ret = vmw_dma_masks(dev_priv);
@@ -1015,7 +1008,7 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
10151008
(unsigned)dev_priv->max_gmr_pages);
10161009
}
10171010
drm_info(&dev_priv->drm,
1018-
"Maximum display memory size is %llu kiB\n",
1011+
"Maximum display memory size is %llu KiB\n",
10191012
(uint64_t)dev_priv->max_primary_mem / 1024);
10201013

10211014
/* Need mmio memory to check for fifo pitchlock cap. */

drivers/gpu/drm/vmwgfx/vmwgfx_drv.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,9 +1043,6 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
10431043
int vmw_kms_write_svga(struct vmw_private *vmw_priv,
10441044
unsigned width, unsigned height, unsigned pitch,
10451045
unsigned bpp, unsigned depth);
1046-
bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
1047-
uint32_t pitch,
1048-
uint32_t height);
10491046
int vmw_kms_present(struct vmw_private *dev_priv,
10501047
struct drm_file *file_priv,
10511048
struct vmw_framebuffer *vfb,

drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,14 @@ static int vmw_gmrid_man_get_node(struct ttm_resource_manager *man,
9494
} else
9595
new_max_pages = gman->max_gmr_pages * 2;
9696
if (new_max_pages > gman->max_gmr_pages && new_max_pages >= gman->used_gmr_pages) {
97-
DRM_WARN("vmwgfx: increasing guest mob limits to %u kB.\n",
97+
DRM_WARN("vmwgfx: increasing guest mob limits to %u KiB.\n",
9898
((new_max_pages) << (PAGE_SHIFT - 10)));
9999

100100
gman->max_gmr_pages = new_max_pages;
101101
} else {
102102
char buf[256];
103103
snprintf(buf, sizeof(buf),
104-
"vmwgfx, error: guest graphics is out of memory (mob limit at: %ukB).\n",
104+
"vmwgfx, error: guest graphics is out of memory (mob limit at: %u KiB).\n",
105105
((gman->max_gmr_pages) << (PAGE_SHIFT - 10)));
106106
vmw_host_printf(buf);
107107
DRM_WARN("%s", buf);

drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ static bool vmw_du_cursor_plane_has_changed(struct vmw_plane_state *old_vps,
224224
new_image = vmw_du_cursor_plane_acquire_image(new_vps);
225225

226226
changed = false;
227-
if (old_image && new_image)
227+
if (old_image && new_image && old_image != new_image)
228228
changed = memcmp(old_image, new_image, size) != 0;
229229

230230
return changed;
@@ -2171,13 +2171,12 @@ int vmw_kms_write_svga(struct vmw_private *vmw_priv,
21712171
return 0;
21722172
}
21732173

2174+
static
21742175
bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv,
2175-
uint32_t pitch,
2176-
uint32_t height)
2176+
u64 pitch,
2177+
u64 height)
21772178
{
2178-
return ((u64) pitch * (u64) height) < (u64)
2179-
((dev_priv->active_display_unit == vmw_du_screen_target) ?
2180-
dev_priv->max_primary_mem : dev_priv->vram_size);
2179+
return (pitch * height) < (u64)dev_priv->vram_size;
21812180
}
21822181

21832182
/**
@@ -2873,25 +2872,18 @@ int vmw_du_helper_plane_update(struct vmw_du_update_plane *update)
28732872
enum drm_mode_status vmw_connector_mode_valid(struct drm_connector *connector,
28742873
struct drm_display_mode *mode)
28752874
{
2875+
enum drm_mode_status ret;
28762876
struct drm_device *dev = connector->dev;
28772877
struct vmw_private *dev_priv = vmw_priv(dev);
2878-
u32 max_width = dev_priv->texture_max_width;
2879-
u32 max_height = dev_priv->texture_max_height;
28802878
u32 assumed_cpp = 4;
28812879

28822880
if (dev_priv->assume_16bpp)
28832881
assumed_cpp = 2;
28842882

2885-
if (dev_priv->active_display_unit == vmw_du_screen_target) {
2886-
max_width = min(dev_priv->stdu_max_width, max_width);
2887-
max_height = min(dev_priv->stdu_max_height, max_height);
2888-
}
2889-
2890-
if (max_width < mode->hdisplay)
2891-
return MODE_BAD_HVALUE;
2892-
2893-
if (max_height < mode->vdisplay)
2894-
return MODE_BAD_VVALUE;
2883+
ret = drm_mode_validate_size(mode, dev_priv->texture_max_width,
2884+
dev_priv->texture_max_height);
2885+
if (ret != MODE_OK)
2886+
return ret;
28952887

28962888
if (!vmw_kms_validate_mode_vram(dev_priv,
28972889
mode->hdisplay * assumed_cpp,

drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,14 @@
4343
#define vmw_connector_to_stdu(x) \
4444
container_of(x, struct vmw_screen_target_display_unit, base.connector)
4545

46-
46+
/*
47+
* Some renderers such as llvmpipe will align the width and height of their
48+
* buffers to match their tile size. We need to keep this in mind when exposing
49+
* modes to userspace so that this possible over-allocation will not exceed
50+
* graphics memory. 64x64 pixels seems to be a reasonable upper bound for the
51+
* tile size of current renderers.
52+
*/
53+
#define GPU_TILE_SIZE 64
4754

4855
enum stdu_content_type {
4956
SAME_AS_DISPLAY = 0,
@@ -85,11 +92,6 @@ struct vmw_stdu_update {
8592
SVGA3dCmdUpdateGBScreenTarget body;
8693
};
8794

88-
struct vmw_stdu_dma {
89-
SVGA3dCmdHeader header;
90-
SVGA3dCmdSurfaceDMA body;
91-
};
92-
9395
struct vmw_stdu_surface_copy {
9496
SVGA3dCmdHeader header;
9597
SVGA3dCmdSurfaceCopy body;
@@ -414,6 +416,7 @@ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
414416
{
415417
struct vmw_private *dev_priv;
416418
struct vmw_screen_target_display_unit *stdu;
419+
struct drm_crtc_state *new_crtc_state;
417420
int ret;
418421

419422
if (!crtc) {
@@ -423,6 +426,7 @@ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
423426

424427
stdu = vmw_crtc_to_stdu(crtc);
425428
dev_priv = vmw_priv(crtc->dev);
429+
new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
426430

427431
if (dev_priv->vkms_enabled)
428432
drm_crtc_vblank_off(crtc);
@@ -434,6 +438,14 @@ static void vmw_stdu_crtc_atomic_disable(struct drm_crtc *crtc,
434438

435439
(void) vmw_stdu_update_st(dev_priv, stdu);
436440

441+
/* Don't destroy the Screen Target if we are only setting the
442+
* display as inactive
443+
*/
444+
if (new_crtc_state->enable &&
445+
!new_crtc_state->active &&
446+
!new_crtc_state->mode_changed)
447+
return;
448+
437449
ret = vmw_stdu_destroy_st(dev_priv, stdu);
438450
if (ret)
439451
DRM_ERROR("Failed to destroy Screen Target\n");
@@ -829,7 +841,41 @@ static void vmw_stdu_connector_destroy(struct drm_connector *connector)
829841
vmw_stdu_destroy(vmw_connector_to_stdu(connector));
830842
}
831843

844+
static enum drm_mode_status
845+
vmw_stdu_connector_mode_valid(struct drm_connector *connector,
846+
struct drm_display_mode *mode)
847+
{
848+
enum drm_mode_status ret;
849+
struct drm_device *dev = connector->dev;
850+
struct vmw_private *dev_priv = vmw_priv(dev);
851+
u64 assumed_cpp = dev_priv->assume_16bpp ? 2 : 4;
852+
/* Align width and height to account for GPU tile over-alignment */
853+
u64 required_mem = ALIGN(mode->hdisplay, GPU_TILE_SIZE) *
854+
ALIGN(mode->vdisplay, GPU_TILE_SIZE) *
855+
assumed_cpp;
856+
required_mem = ALIGN(required_mem, PAGE_SIZE);
857+
858+
ret = drm_mode_validate_size(mode, dev_priv->stdu_max_width,
859+
dev_priv->stdu_max_height);
860+
if (ret != MODE_OK)
861+
return ret;
862+
863+
ret = drm_mode_validate_size(mode, dev_priv->texture_max_width,
864+
dev_priv->texture_max_height);
865+
if (ret != MODE_OK)
866+
return ret;
832867

868+
if (required_mem > dev_priv->max_primary_mem)
869+
return MODE_MEM;
870+
871+
if (required_mem > dev_priv->max_mob_pages * PAGE_SIZE)
872+
return MODE_MEM;
873+
874+
if (required_mem > dev_priv->max_mob_size)
875+
return MODE_MEM;
876+
877+
return MODE_OK;
878+
}
833879

834880
static const struct drm_connector_funcs vmw_stdu_connector_funcs = {
835881
.dpms = vmw_du_connector_dpms,
@@ -845,7 +891,7 @@ static const struct drm_connector_funcs vmw_stdu_connector_funcs = {
845891
static const struct
846892
drm_connector_helper_funcs vmw_stdu_connector_helper_funcs = {
847893
.get_modes = vmw_connector_get_modes,
848-
.mode_valid = vmw_connector_mode_valid
894+
.mode_valid = vmw_stdu_connector_mode_valid
849895
};
850896

851897

0 commit comments

Comments
 (0)