diff --git a/drivers/gpu/drm/tiny/cirrus-qemu.c b/drivers/gpu/drm/tiny/cirrus-qemu.c index 075221b43..f66e33f18 100644 --- a/drivers/gpu/drm/tiny/cirrus-qemu.c +++ b/drivers/gpu/drm/tiny/cirrus-qemu.c @@ -68,6 +68,7 @@ struct cirrus_device { /* HW resources */ void __iomem *vram; + resource_size_t vram_size; void __iomem *mmio; }; @@ -298,6 +299,7 @@ static const uint64_t cirrus_primary_plane_format_modifiers[] = { static int cirrus_primary_plane_helper_atomic_check(struct drm_plane *plane, struct drm_atomic_commit *state) { + struct cirrus_device *cirrus = to_cirrus(plane->dev); struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, plane); struct drm_framebuffer *fb = new_plane_state->fb; struct drm_crtc *new_crtc = new_plane_state->crtc; @@ -319,7 +321,7 @@ static int cirrus_primary_plane_helper_atomic_check(struct drm_plane *plane, /* validate size constraints */ if (fb->pitches[0] > CIRRUS_MAX_PITCH) return -EINVAL; - else if (fb->pitches[0] > CIRRUS_VRAM_SIZE / fb->height) + else if (fb->pitches[0] > cirrus->vram_size / fb->height) return -EINVAL; return 0; @@ -514,6 +516,7 @@ static int cirrus_pipe_init(struct cirrus_device *cirrus) static enum drm_mode_status cirrus_mode_config_mode_valid(struct drm_device *dev, const struct drm_display_mode *mode) { + struct cirrus_device *cirrus = to_cirrus(dev); const struct drm_format_info *format = drm_format_info(DRM_FORMAT_XRGB8888); u64 pitch; @@ -525,7 +528,7 @@ static enum drm_mode_status cirrus_mode_config_mode_valid(struct drm_device *dev return MODE_BAD_WIDTH; if (pitch > CIRRUS_MAX_PITCH) return MODE_BAD_WIDTH; /* maximum programmable pitch */ - if (pitch > CIRRUS_VRAM_SIZE / mode->vdisplay) + if (pitch > cirrus->vram_size / mode->vdisplay) return MODE_MEM; return MODE_OK; @@ -602,8 +605,10 @@ static int cirrus_pci_probe(struct pci_dev *pdev, dev = &cirrus->dev; + cirrus->vram_size = min_t(resource_size_t, pci_resource_len(pdev, 0), + CIRRUS_VRAM_SIZE); cirrus->vram = devm_ioremap(&pdev->dev, pci_resource_start(pdev, 0), - pci_resource_len(pdev, 0)); + cirrus->vram_size); if (cirrus->vram == NULL) return -ENOMEM;