Skip to content

Commit b53bd16

Browse files
committed
Merge tag 'drm-misc-next-fixes-2019-12-04' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
mgag200- Fix hw with broken 'startadd' support (Thomas) mst- Avoid skipping payloads in payload deletion loop (Wayne) omap- Fix dma_addr refcounting (Tomi) Cc: Wayne Lin <[email protected]> Cc: Tomi Valkeinen <[email protected]> Cc: Thomas Zimmermann <[email protected]> Signed-off-by: Dave Airlie <[email protected]> From: Sean Paul <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/20191204212255.GA256395@art_vandelay
2 parents b7fa0cd + e5a6ca2 commit b53bd16

File tree

6 files changed

+64
-4
lines changed

6 files changed

+64
-4
lines changed

drivers/gpu/drm/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ config DRM_KMS_FB_HELPER
9595

9696
config DRM_DEBUG_DP_MST_TOPOLOGY_REFS
9797
bool "Enable refcount backtrace history in the DP MST helpers"
98+
depends on STACKTRACE_SUPPORT
9899
select STACKDEPOT
99100
depends on DRM_KMS_HELPER
100101
depends on DEBUG_KERNEL

drivers/gpu/drm/drm_dp_mst_topology.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3176,9 +3176,11 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
31763176
drm_dp_mst_topology_put_port(port);
31773177
}
31783178

3179-
for (i = 0; i < mgr->max_payloads; i++) {
3180-
if (mgr->payloads[i].payload_state != DP_PAYLOAD_DELETE_LOCAL)
3179+
for (i = 0; i < mgr->max_payloads; /* do nothing */) {
3180+
if (mgr->payloads[i].payload_state != DP_PAYLOAD_DELETE_LOCAL) {
3181+
i++;
31813182
continue;
3183+
}
31823184

31833185
DRM_DEBUG_KMS("removing payload %d\n", i);
31843186
for (j = i; j < mgr->max_payloads - 1; j++) {

drivers/gpu/drm/mgag200/mgag200_drv.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ module_param_named(modeset, mgag200_modeset, int, 0400);
3030
static struct drm_driver driver;
3131

3232
static const struct pci_device_id pciidlist[] = {
33+
{ PCI_VENDOR_ID_MATROX, 0x522, PCI_VENDOR_ID_SUN, 0x4852, 0, 0,
34+
G200_SE_A | MGAG200_FLAG_HW_BUG_NO_STARTADD},
3335
{ PCI_VENDOR_ID_MATROX, 0x522, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_SE_A },
3436
{ PCI_VENDOR_ID_MATROX, 0x524, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_SE_B },
3537
{ PCI_VENDOR_ID_MATROX, 0x530, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_EV },
@@ -60,6 +62,35 @@ static void mga_pci_remove(struct pci_dev *pdev)
6062

6163
DEFINE_DRM_GEM_FOPS(mgag200_driver_fops);
6264

65+
static bool mgag200_pin_bo_at_0(const struct mga_device *mdev)
66+
{
67+
return mdev->flags & MGAG200_FLAG_HW_BUG_NO_STARTADD;
68+
}
69+
70+
int mgag200_driver_dumb_create(struct drm_file *file,
71+
struct drm_device *dev,
72+
struct drm_mode_create_dumb *args)
73+
{
74+
struct mga_device *mdev = dev->dev_private;
75+
unsigned long pg_align;
76+
77+
if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized"))
78+
return -EINVAL;
79+
80+
pg_align = 0ul;
81+
82+
/*
83+
* Aligning scanout buffers to the size of the video ram forces
84+
* placement at offset 0. Works around a bug where HW does not
85+
* respect 'startadd' field.
86+
*/
87+
if (mgag200_pin_bo_at_0(mdev))
88+
pg_align = PFN_UP(mdev->mc.vram_size);
89+
90+
return drm_gem_vram_fill_create_dumb(file, dev, &dev->vram_mm->bdev,
91+
pg_align, false, args);
92+
}
93+
6394
static struct drm_driver driver = {
6495
.driver_features = DRIVER_GEM | DRIVER_MODESET,
6596
.load = mgag200_driver_load,
@@ -71,7 +102,10 @@ static struct drm_driver driver = {
71102
.major = DRIVER_MAJOR,
72103
.minor = DRIVER_MINOR,
73104
.patchlevel = DRIVER_PATCHLEVEL,
74-
DRM_GEM_VRAM_DRIVER
105+
.debugfs_init = drm_vram_mm_debugfs_init,
106+
.dumb_create = mgag200_driver_dumb_create,
107+
.dumb_map_offset = drm_gem_vram_driver_dumb_mmap_offset,
108+
.gem_prime_mmap = drm_gem_prime_mmap,
75109
};
76110

77111
static struct pci_driver mgag200_pci_driver = {

drivers/gpu/drm/mgag200/mgag200_drv.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ enum mga_type {
150150
G200_EW3,
151151
};
152152

153+
/* HW does not handle 'startadd' field correct. */
154+
#define MGAG200_FLAG_HW_BUG_NO_STARTADD (1ul << 8)
155+
156+
#define MGAG200_TYPE_MASK (0x000000ff)
157+
#define MGAG200_FLAG_MASK (0x00ffff00)
158+
153159
#define IS_G200_SE(mdev) (mdev->type == G200_SE_A || mdev->type == G200_SE_B)
154160

155161
struct mga_device {
@@ -181,6 +187,18 @@ struct mga_device {
181187
u32 unique_rev_id;
182188
};
183189

190+
static inline enum mga_type
191+
mgag200_type_from_driver_data(kernel_ulong_t driver_data)
192+
{
193+
return (enum mga_type)(driver_data & MGAG200_TYPE_MASK);
194+
}
195+
196+
static inline unsigned long
197+
mgag200_flags_from_driver_data(kernel_ulong_t driver_data)
198+
{
199+
return driver_data & MGAG200_FLAG_MASK;
200+
}
201+
184202
/* mgag200_mode.c */
185203
int mgag200_modeset_init(struct mga_device *mdev);
186204
void mgag200_modeset_fini(struct mga_device *mdev);

drivers/gpu/drm/mgag200/mgag200_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ static int mgag200_device_init(struct drm_device *dev,
9494
struct mga_device *mdev = dev->dev_private;
9595
int ret, option;
9696

97-
mdev->type = flags;
97+
mdev->flags = mgag200_flags_from_driver_data(flags);
98+
mdev->type = mgag200_type_from_driver_data(flags);
9899

99100
/* Hardcode the number of CRTCs to 1 */
100101
mdev->num_crtc = 1;

drivers/gpu/drm/omapdrm/omap_gem.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,9 +843,13 @@ int omap_gem_pin(struct drm_gem_object *obj, dma_addr_t *dma_addr)
843843
*/
844844
static void omap_gem_unpin_locked(struct drm_gem_object *obj)
845845
{
846+
struct omap_drm_private *priv = obj->dev->dev_private;
846847
struct omap_gem_object *omap_obj = to_omap_bo(obj);
847848
int ret;
848849

850+
if (omap_gem_is_contiguous(omap_obj) || !priv->has_dmm)
851+
return;
852+
849853
if (refcount_dec_and_test(&omap_obj->dma_addr_cnt)) {
850854
ret = tiler_unpin(omap_obj->block);
851855
if (ret) {

0 commit comments

Comments
 (0)