Skip to content

Commit 864204e

Browse files
committed
Merge tag 'drm-xe-next-fixes-2024-07-11' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-next
UAPI Changes: - Rename xe perf layer as xe observation layer (Ashutosh) Driver Changes: - Drop trace_xe_hw_fence_free (Brost) Signed-off-by: Dave Airlie <[email protected]> From: Rodrigo Vivi <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 38e7300 + 26d2891 commit 864204e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1063
-584
lines changed

drivers/gpu/drm/drm_atomic.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,6 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
608608
unsigned int fb_width, fb_height;
609609
struct drm_mode_rect *clips;
610610
uint32_t num_clips;
611-
int ret;
612611

613612
/* either *both* CRTC and FB must be set, or neither */
614613
if (crtc && !fb) {
@@ -635,14 +634,12 @@ static int drm_atomic_plane_check(const struct drm_plane_state *old_plane_state,
635634
}
636635

637636
/* Check whether this plane supports the fb pixel format. */
638-
ret = drm_plane_check_pixel_format(plane, fb->format->format,
639-
fb->modifier);
640-
if (ret) {
637+
if (!drm_plane_has_format(plane, fb->format->format, fb->modifier)) {
641638
drm_dbg_atomic(plane->dev,
642639
"[PLANE:%d:%s] invalid pixel format %p4cc, modifier 0x%llx\n",
643640
plane->base.id, plane->name,
644641
&fb->format->format, fb->modifier);
645-
return ret;
642+
return -EINVAL;
646643
}
647644

648645
/* Give drivers some help against integer overflows */

drivers/gpu/drm/drm_crtc.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -789,12 +789,10 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
789789
* case.
790790
*/
791791
if (!plane->format_default) {
792-
ret = drm_plane_check_pixel_format(plane,
793-
fb->format->format,
794-
fb->modifier);
795-
if (ret) {
792+
if (!drm_plane_has_format(plane, fb->format->format, fb->modifier)) {
796793
drm_dbg_kms(dev, "Invalid pixel format %p4cc, modifier 0x%llx\n",
797794
&fb->format->format, fb->modifier);
795+
ret = -EINVAL;
798796
goto out;
799797
}
800798
}

drivers/gpu/drm/drm_crtc_internal.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,6 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
272272
/* drm_plane.c */
273273
int drm_plane_register_all(struct drm_device *dev);
274274
void drm_plane_unregister_all(struct drm_device *dev);
275-
int drm_plane_check_pixel_format(struct drm_plane *plane,
276-
u32 format, u64 modifier);
277275
struct drm_mode_rect *
278276
__drm_plane_get_damage_clips(const struct drm_plane_state *state);
279277

drivers/gpu/drm/drm_plane.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -877,8 +877,17 @@ int drm_mode_getplane(struct drm_device *dev, void *data,
877877
return 0;
878878
}
879879

880-
int drm_plane_check_pixel_format(struct drm_plane *plane,
881-
u32 format, u64 modifier)
880+
/**
881+
* drm_plane_has_format - Check whether the plane supports this format and modifier combination
882+
* @plane: drm plane
883+
* @format: pixel format (DRM_FORMAT_*)
884+
* @modifier: data layout modifier
885+
*
886+
* Returns:
887+
* Whether the plane supports the specified format and modifier combination.
888+
*/
889+
bool drm_plane_has_format(struct drm_plane *plane,
890+
u32 format, u64 modifier)
882891
{
883892
unsigned int i;
884893

@@ -887,25 +896,26 @@ int drm_plane_check_pixel_format(struct drm_plane *plane,
887896
break;
888897
}
889898
if (i == plane->format_count)
890-
return -EINVAL;
899+
return false;
891900

892901
if (plane->funcs->format_mod_supported) {
893902
if (!plane->funcs->format_mod_supported(plane, format, modifier))
894-
return -EINVAL;
903+
return false;
895904
} else {
896905
if (!plane->modifier_count)
897-
return 0;
906+
return true;
898907

899908
for (i = 0; i < plane->modifier_count; i++) {
900909
if (modifier == plane->modifiers[i])
901910
break;
902911
}
903912
if (i == plane->modifier_count)
904-
return -EINVAL;
913+
return false;
905914
}
906915

907-
return 0;
916+
return true;
908917
}
918+
EXPORT_SYMBOL(drm_plane_has_format);
909919

910920
static int __setplane_check(struct drm_plane *plane,
911921
struct drm_crtc *crtc,
@@ -924,12 +934,10 @@ static int __setplane_check(struct drm_plane *plane,
924934
}
925935

926936
/* Check whether this plane supports the fb pixel format. */
927-
ret = drm_plane_check_pixel_format(plane, fb->format->format,
928-
fb->modifier);
929-
if (ret) {
937+
if (!drm_plane_has_format(plane, fb->format->format, fb->modifier)) {
930938
DRM_DEBUG_KMS("Invalid pixel format %p4cc, modifier 0x%llx\n",
931939
&fb->format->format, fb->modifier);
932-
return ret;
940+
return -EINVAL;
933941
}
934942

935943
/* Give drivers some help against integer overflows */
@@ -964,7 +972,7 @@ bool drm_any_plane_has_format(struct drm_device *dev,
964972
struct drm_plane *plane;
965973

966974
drm_for_each_plane(plane, dev) {
967-
if (drm_plane_check_pixel_format(plane, format, modifier) == 0)
975+
if (drm_plane_has_format(plane, format, modifier))
968976
return true;
969977
}
970978

drivers/gpu/drm/drm_vblank_work.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,28 @@ void drm_vblank_work_flush(struct drm_vblank_work *work)
232232
}
233233
EXPORT_SYMBOL(drm_vblank_work_flush);
234234

235+
/**
236+
* drm_vblank_work_flush_all - flush all currently pending vblank work on crtc.
237+
* @crtc: crtc for which vblank work to flush
238+
*
239+
* Wait until all currently queued vblank work on @crtc
240+
* has finished executing once.
241+
*/
242+
void drm_vblank_work_flush_all(struct drm_crtc *crtc)
243+
{
244+
struct drm_device *dev = crtc->dev;
245+
struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(crtc)];
246+
247+
spin_lock_irq(&dev->event_lock);
248+
wait_event_lock_irq(vblank->work_wait_queue,
249+
list_empty(&vblank->pending_work),
250+
dev->event_lock);
251+
spin_unlock_irq(&dev->event_lock);
252+
253+
kthread_flush_worker(vblank->worker);
254+
}
255+
EXPORT_SYMBOL(drm_vblank_work_flush_all);
256+
235257
/**
236258
* drm_vblank_work_init - initialize a vblank work item
237259
* @work: vblank work item

drivers/gpu/drm/i915/display/i9xx_plane.c

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@ static u32 i9xx_plane_ctl(const struct intel_crtc_state *crtc_state,
225225

226226
int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
227227
{
228-
struct drm_i915_private *dev_priv =
229-
to_i915(plane_state->uapi.plane->dev);
228+
struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
229+
struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
230230
const struct drm_framebuffer *fb = plane_state->hw.fb;
231231
int src_x, src_y, src_w;
232232
u32 offset;
@@ -267,7 +267,7 @@ int i9xx_check_plane_surface(struct intel_plane_state *plane_state)
267267
* despite them not using the linear offset anymore.
268268
*/
269269
if (DISPLAY_VER(dev_priv) >= 4 && fb->modifier == I915_FORMAT_MOD_X_TILED) {
270-
unsigned int alignment = intel_surf_alignment(fb, 0);
270+
unsigned int alignment = plane->min_alignment(plane, fb, 0);
271271
int cpp = fb->format->cpp[0];
272272

273273
while ((src_x + src_w) * cpp > plane_state->view.color_plane[0].mapping_stride) {
@@ -764,6 +764,66 @@ i8xx_plane_max_stride(struct intel_plane *plane,
764764
return 8 * 1024;
765765
}
766766

767+
static unsigned int vlv_primary_min_alignment(struct intel_plane *plane,
768+
const struct drm_framebuffer *fb,
769+
int color_plane)
770+
{
771+
struct drm_i915_private *i915 = to_i915(plane->base.dev);
772+
773+
switch (fb->modifier) {
774+
case I915_FORMAT_MOD_X_TILED:
775+
if (HAS_ASYNC_FLIPS(i915))
776+
return 256 * 1024;
777+
return 4 * 1024;
778+
case DRM_FORMAT_MOD_LINEAR:
779+
return 128 * 1024;
780+
default:
781+
MISSING_CASE(fb->modifier);
782+
return 0;
783+
}
784+
}
785+
786+
static unsigned int g4x_primary_min_alignment(struct intel_plane *plane,
787+
const struct drm_framebuffer *fb,
788+
int color_plane)
789+
{
790+
struct drm_i915_private *i915 = to_i915(plane->base.dev);
791+
792+
switch (fb->modifier) {
793+
case I915_FORMAT_MOD_X_TILED:
794+
if (HAS_ASYNC_FLIPS(i915))
795+
return 256 * 1024;
796+
return 4 * 1024;
797+
case DRM_FORMAT_MOD_LINEAR:
798+
return 4 * 1024;
799+
default:
800+
MISSING_CASE(fb->modifier);
801+
return 0;
802+
}
803+
}
804+
805+
static unsigned int i965_plane_min_alignment(struct intel_plane *plane,
806+
const struct drm_framebuffer *fb,
807+
int color_plane)
808+
{
809+
switch (fb->modifier) {
810+
case I915_FORMAT_MOD_X_TILED:
811+
return 4 * 1024;
812+
case DRM_FORMAT_MOD_LINEAR:
813+
return 128 * 1024;
814+
default:
815+
MISSING_CASE(fb->modifier);
816+
return 0;
817+
}
818+
}
819+
820+
static unsigned int i9xx_plane_min_alignment(struct intel_plane *plane,
821+
const struct drm_framebuffer *fb,
822+
int color_plane)
823+
{
824+
return 0;
825+
}
826+
767827
static const struct drm_plane_funcs i965_plane_funcs = {
768828
.update_plane = drm_atomic_helper_update_plane,
769829
.disable_plane = drm_atomic_helper_disable_plane,
@@ -869,6 +929,15 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
869929
plane->max_stride = ilk_primary_max_stride;
870930
}
871931

932+
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
933+
plane->min_alignment = vlv_primary_min_alignment;
934+
else if (DISPLAY_VER(dev_priv) >= 5 || IS_G4X(dev_priv))
935+
plane->min_alignment = g4x_primary_min_alignment;
936+
else if (DISPLAY_VER(dev_priv) == 4)
937+
plane->min_alignment = i965_plane_min_alignment;
938+
else
939+
plane->min_alignment = i9xx_plane_min_alignment;
940+
872941
if (IS_I830(dev_priv) || IS_I845G(dev_priv)) {
873942
plane->update_arm = i830_plane_update_arm;
874943
} else {

drivers/gpu/drm/i915/display/intel_alpm.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ static int _lnl_compute_aux_less_wake_time(int port_clock)
135135
t1 + tcds, 1000);
136136
}
137137

138-
static int _lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
139-
struct intel_crtc_state *crtc_state)
138+
static int
139+
_lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
140+
const struct intel_crtc_state *crtc_state)
140141
{
141142
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
142143
int aux_less_wake_time, aux_less_wake_lines, silence_period,
@@ -168,7 +169,7 @@ static int _lnl_compute_aux_less_alpm_params(struct intel_dp *intel_dp,
168169
}
169170

170171
static bool _lnl_compute_alpm_params(struct intel_dp *intel_dp,
171-
struct intel_crtc_state *crtc_state)
172+
const struct intel_crtc_state *crtc_state)
172173
{
173174
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
174175
int check_entry_lines;
@@ -220,7 +221,7 @@ static int io_buffer_wake_time(const struct intel_crtc_state *crtc_state)
220221
}
221222

222223
bool intel_alpm_compute_params(struct intel_dp *intel_dp,
223-
struct intel_crtc_state *crtc_state)
224+
const struct intel_crtc_state *crtc_state)
224225
{
225226
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
226227
int io_wake_lines, io_wake_time, fast_wake_lines, fast_wake_time;

drivers/gpu/drm/i915/display/intel_alpm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct intel_connector;
1515

1616
void intel_alpm_init_dpcd(struct intel_dp *intel_dp);
1717
bool intel_alpm_compute_params(struct intel_dp *intel_dp,
18-
struct intel_crtc_state *crtc_state);
18+
const struct intel_crtc_state *crtc_state);
1919
void intel_alpm_lobf_compute_config(struct intel_dp *intel_dp,
2020
struct intel_crtc_state *crtc_state,
2121
struct drm_connector_state *conn_state);

drivers/gpu/drm/i915/display/intel_atomic_plane.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "i9xx_plane_regs.h"
4444
#include "intel_atomic_plane.h"
4545
#include "intel_cdclk.h"
46+
#include "intel_cursor.h"
4647
#include "intel_display_rps.h"
4748
#include "intel_display_trace.h"
4849
#include "intel_display_types.h"
@@ -801,18 +802,30 @@ void intel_plane_update_noarm(struct intel_plane *plane,
801802
plane->update_noarm(plane, crtc_state, plane_state);
802803
}
803804

805+
void intel_plane_async_flip(struct intel_plane *plane,
806+
const struct intel_crtc_state *crtc_state,
807+
const struct intel_plane_state *plane_state,
808+
bool async_flip)
809+
{
810+
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
811+
812+
trace_intel_plane_async_flip(plane, crtc, async_flip);
813+
plane->async_flip(plane, crtc_state, plane_state, async_flip);
814+
}
815+
804816
void intel_plane_update_arm(struct intel_plane *plane,
805817
const struct intel_crtc_state *crtc_state,
806818
const struct intel_plane_state *plane_state)
807819
{
808820
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
809821

810-
trace_intel_plane_update_arm(plane, crtc);
822+
if (crtc_state->do_async_flip && plane->async_flip) {
823+
intel_plane_async_flip(plane, crtc_state, plane_state, true);
824+
return;
825+
}
811826

812-
if (crtc_state->do_async_flip && plane->async_flip)
813-
plane->async_flip(plane, crtc_state, plane_state, true);
814-
else
815-
plane->update_arm(plane, crtc_state, plane_state);
827+
trace_intel_plane_update_arm(plane, crtc);
828+
plane->update_arm(plane, crtc_state, plane_state);
816829
}
817830

818831
void intel_plane_disable_arm(struct intel_plane *plane,
@@ -1189,7 +1202,6 @@ intel_cleanup_plane_fb(struct drm_plane *plane,
11891202

11901203
intel_display_rps_mark_interactive(dev_priv, state, false);
11911204

1192-
/* Should only be called after a successful intel_prepare_plane_fb()! */
11931205
intel_plane_unpin_fb(old_plane_state);
11941206
}
11951207

@@ -1202,3 +1214,14 @@ void intel_plane_helper_add(struct intel_plane *plane)
12021214
{
12031215
drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
12041216
}
1217+
1218+
void intel_plane_init_cursor_vblank_work(struct intel_plane_state *old_plane_state,
1219+
struct intel_plane_state *new_plane_state)
1220+
{
1221+
if (!old_plane_state->ggtt_vma ||
1222+
old_plane_state->ggtt_vma == new_plane_state->ggtt_vma)
1223+
return;
1224+
1225+
drm_vblank_work_init(&old_plane_state->unpin_work, old_plane_state->uapi.crtc,
1226+
intel_cursor_unpin_work);
1227+
}

drivers/gpu/drm/i915/display/intel_atomic_plane.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ void intel_plane_copy_uapi_to_hw_state(struct intel_plane_state *plane_state,
3232
struct intel_crtc *crtc);
3333
void intel_plane_copy_hw_state(struct intel_plane_state *plane_state,
3434
const struct intel_plane_state *from_plane_state);
35+
void intel_plane_async_flip(struct intel_plane *plane,
36+
const struct intel_crtc_state *crtc_state,
37+
const struct intel_plane_state *plane_state,
38+
bool async_flip);
3539
void intel_plane_update_noarm(struct intel_plane *plane,
3640
const struct intel_crtc_state *crtc_state,
3741
const struct intel_plane_state *plane_state);
@@ -67,5 +71,7 @@ void intel_plane_set_invisible(struct intel_crtc_state *crtc_state,
6771
struct intel_plane_state *plane_state);
6872
void intel_plane_helper_add(struct intel_plane *plane);
6973
bool intel_plane_needs_physical(struct intel_plane *plane);
74+
void intel_plane_init_cursor_vblank_work(struct intel_plane_state *old_plane_state,
75+
struct intel_plane_state *new_plane_state);
7076

7177
#endif /* __INTEL_ATOMIC_PLANE_H__ */

0 commit comments

Comments
 (0)