Skip to content

Commit 217efe4

Browse files
jannaumarcan
authored andcommitted
drm/apple: Support color transformation matrices
kwin 5.27.3 adds support for "Night Color" via drm "CTM" properties. Wire CTM support up via the "set_matrix" iomfb call. Link: https://bugs.kde.org/show_bug.cgi?id=455720 Signed-off-by: Janne Grunau <[email protected]>
1 parent 93e7a0a commit 217efe4

5 files changed

Lines changed: 36 additions & 1 deletion

File tree

drivers/gpu/drm/apple/apple_drv.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ static int apple_probe_per_dcp(struct device *dev,
334334
return ret;
335335

336336
drm_crtc_helper_add(&crtc->base, &apple_crtc_helper_funcs);
337+
drm_crtc_enable_color_mgmt(&crtc->base, 0, true, 0);
337338

338339
enc = drmm_simple_encoder_alloc(drm, struct apple_encoder, base,
339340
DRM_MODE_ENCODER_TMDS);

drivers/gpu/drm/apple/iomfb.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ enum dcpep_method {
160160
iomfbep_a358_vi_set_temperature_hint,
161161
iomfbep_get_color_remap_mode,
162162
iomfbep_last_client_close,
163+
iomfbep_set_matrix,
163164
dcpep_num_methods
164165
};
165166

@@ -350,4 +351,17 @@ struct iomfb_last_client_close_resp {
350351
u32 unkint;
351352
} __packed;
352353

354+
struct iomfb_set_matrix_req {
355+
u32 unk_u32; // maybe length?
356+
u64 r[3];
357+
u64 g[3];
358+
u64 b[3];
359+
u8 matrix_null;
360+
u8 padding[3];
361+
} __packed;
362+
363+
struct iomfb_set_matrix_resp {
364+
u32 ret;
365+
} __packed;
366+
353367
#endif

drivers/gpu/drm/apple/iomfb_template.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ DCP_THUNK_OUT(iomfb_a131_pmu_service_matched, iomfbep_a131_pmu_service_matched,
5555
DCP_THUNK_OUT(iomfb_a132_backlight_service_matched, iomfbep_a132_backlight_service_matched, u32);
5656
DCP_THUNK_OUT(iomfb_a358_vi_set_temperature_hint, iomfbep_a358_vi_set_temperature_hint, u32);
5757

58+
IOMFB_THUNK_INOUT(set_matrix);
5859
IOMFB_THUNK_INOUT(get_color_remap_mode);
5960
IOMFB_THUNK_INOUT(last_client_close);
6061

@@ -1285,7 +1286,24 @@ void DCP_FW_NAME(iomfb_flush)(struct apple_dcp *dcp, struct drm_crtc *crtc, stru
12851286
dcp->brightness.update = false;
12861287
}
12871288

1288-
do_swap(dcp, NULL, NULL);
1289+
if (crtc_state->color_mgmt_changed && crtc_state->ctm) {
1290+
struct iomfb_set_matrix_req mat;
1291+
struct drm_color_ctm *ctm = (struct drm_color_ctm *)crtc_state->ctm->data;
1292+
1293+
mat.unk_u32 = 9;
1294+
mat.r[0] = ctm->matrix[0];
1295+
mat.r[1] = ctm->matrix[1];
1296+
mat.r[2] = ctm->matrix[2];
1297+
mat.g[0] = ctm->matrix[3];
1298+
mat.g[1] = ctm->matrix[4];
1299+
mat.g[2] = ctm->matrix[5];
1300+
mat.b[0] = ctm->matrix[6];
1301+
mat.b[1] = ctm->matrix[7];
1302+
mat.b[2] = ctm->matrix[8];
1303+
1304+
iomfb_set_matrix(dcp, false, &mat, do_swap, NULL);
1305+
} else
1306+
do_swap(dcp, NULL, NULL);
12891307
}
12901308

12911309
static void res_is_main_display(struct apple_dcp *dcp, void *out, void *cookie)

drivers/gpu/drm/apple/iomfb_v12_3.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ static const struct dcp_method_entry dcp_methods[dcpep_num_methods] = {
1818
IOMFB_METHOD("A410", dcpep_set_display_device),
1919
IOMFB_METHOD("A411", dcpep_is_main_display),
2020
IOMFB_METHOD("A412", dcpep_set_digital_out_mode),
21+
IOMFB_METHOD("A422", iomfbep_set_matrix),
2122
IOMFB_METHOD("A426", iomfbep_get_color_remap_mode),
2223
IOMFB_METHOD("A439", dcpep_set_parameter_dcp),
2324
IOMFB_METHOD("A443", dcpep_create_default_fb),

drivers/gpu/drm/apple/iomfb_v13_2.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ static const struct dcp_method_entry dcp_methods[dcpep_num_methods] = {
1818
IOMFB_METHOD("A410", dcpep_set_display_device),
1919
IOMFB_METHOD("A411", dcpep_is_main_display),
2020
IOMFB_METHOD("A412", dcpep_set_digital_out_mode),
21+
IOMFB_METHOD("A422", iomfbep_set_matrix),
2122
IOMFB_METHOD("A426", iomfbep_get_color_remap_mode),
2223
IOMFB_METHOD("A441", dcpep_set_parameter_dcp),
2324
IOMFB_METHOD("A445", dcpep_create_default_fb),

0 commit comments

Comments
 (0)