Initial commit
This commit is contained in:
parent
482892f005
commit
238f7d1116
28
.github/workflows/build.yml
vendored
Normal file
28
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
name: PikaOS Kernel Build Only
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: self-hosted
|
||||||
|
container:
|
||||||
|
image: ubuntu:latest
|
||||||
|
volumes:
|
||||||
|
- /proc:/proc
|
||||||
|
options: --privileged -it
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install needed packages
|
||||||
|
run: apt update && apt install bc bison build-essential ccache cpio fakeroot flex git kmod libelf-dev libncurses5-dev libssl-dev lz4 qtbase5-dev rsync schedtool wget zstd tar -y
|
||||||
|
|
||||||
|
- name: Build Kernel
|
||||||
|
run: ./main.sh
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: PikaOS Kernel
|
||||||
|
path: builds/
|
25
.github/workflows/release.yml
vendored
Normal file
25
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
name: PikaOS Kernel Build And Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: self-hosted
|
||||||
|
container:
|
||||||
|
image: ubuntu:latest
|
||||||
|
volumes:
|
||||||
|
- /proc:/proc
|
||||||
|
options: --privileged -it
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install needed packages
|
||||||
|
run: apt update && apt install bc bison build-essential ccache cpio fakeroot flex git kmod libelf-dev libncurses5-dev libssl-dev lz4 qtbase5-dev rsync schedtool wget zstd tar -y
|
||||||
|
|
||||||
|
- name: Build Kernel
|
||||||
|
run: ./main.sh
|
||||||
|
|
||||||
|
- name: Release Kernel
|
||||||
|
run: ./scripts/release.sh
|
9
main.sh
Normal file
9
main.sh
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
bash ./scripts/source.sh
|
||||||
|
bash ./scripts/patch.sh
|
||||||
|
bash ./scripts/config.sh
|
||||||
|
bash ./scripts/build.sh
|
||||||
|
bash ./scripts/output.sh
|
||||||
|
|
||||||
|
|
45207
patches/0001-cachy-all.patch
Normal file
45207
patches/0001-cachy-all.patch
Normal file
File diff suppressed because it is too large
Load Diff
1029
patches/0002-cfs-nice.patch
Normal file
1029
patches/0002-cfs-nice.patch
Normal file
File diff suppressed because it is too large
Load Diff
388
patches/0003-bore.patch
Normal file
388
patches/0003-bore.patch
Normal file
@ -0,0 +1,388 @@
|
|||||||
|
From f169eabeb1ba8f339ab9bebec8d503c70c5f5879 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Jung <admin@ptr1337.dev>
|
||||||
|
Date: Fri, 17 Feb 2023 15:39:23 +0100
|
||||||
|
Subject: [PATCH] bore-cachy
|
||||||
|
|
||||||
|
Signed-off-by: Peter Jung <admin@ptr1337.dev>
|
||||||
|
---
|
||||||
|
include/linux/sched.h | 5 ++
|
||||||
|
init/Kconfig | 20 ++++++
|
||||||
|
kernel/sched/core.c | 29 +++++++++
|
||||||
|
kernel/sched/debug.c | 3 +
|
||||||
|
kernel/sched/fair.c | 132 +++++++++++++++++++++++++++++++++++++++-
|
||||||
|
kernel/sched/features.h | 4 ++
|
||||||
|
6 files changed, 190 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||||
|
index df219c7cd6aa..a3538eacb095 100644
|
||||||
|
--- a/include/linux/sched.h
|
||||||
|
+++ b/include/linux/sched.h
|
||||||
|
@@ -556,6 +556,11 @@ struct sched_entity {
|
||||||
|
u64 sum_exec_runtime;
|
||||||
|
u64 vruntime;
|
||||||
|
u64 prev_sum_exec_runtime;
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ u64 prev_burst_time;
|
||||||
|
+ u64 burst_time;
|
||||||
|
+ u8 burst_score;
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
|
||||||
|
u64 nr_migrations;
|
||||||
|
u64 prev_sleep_sum_runtime;
|
||||||
|
diff --git a/init/Kconfig b/init/Kconfig
|
||||||
|
index 85a602dba878..bc69f062ca76 100644
|
||||||
|
--- a/init/Kconfig
|
||||||
|
+++ b/init/Kconfig
|
||||||
|
@@ -1318,6 +1318,26 @@ config CHECKPOINT_RESTORE
|
||||||
|
|
||||||
|
If unsure, say N here.
|
||||||
|
|
||||||
|
+config SCHED_BORE
|
||||||
|
+ bool "Burst-Oriented Response Enhancer"
|
||||||
|
+ default y
|
||||||
|
+ help
|
||||||
|
+ In Desktop and Mobile computing, one might prefer interactive
|
||||||
|
+ tasks to keep responsive no matter what they run in the background.
|
||||||
|
+
|
||||||
|
+ Enabling this kernel feature modifies the scheduler to discriminate
|
||||||
|
+ tasks by their burst time (runtime since it last went sleeping or
|
||||||
|
+ yielding state) and prioritize those that run less bursty.
|
||||||
|
+ Such tasks usually include window compositor, widgets backend,
|
||||||
|
+ terminal emulator, video playback, games and so on.
|
||||||
|
+ With a little impact to scheduling fairness, it may improve
|
||||||
|
+ responsiveness especially under heavy background workload.
|
||||||
|
+
|
||||||
|
+ You can turn it off by setting the sysctl kernel.sched_bore = 0.
|
||||||
|
+ Enabling this feature implies NO_GENTLE_FAIR_SLEEPERS by default.
|
||||||
|
+
|
||||||
|
+ If unsure say Y here.
|
||||||
|
+
|
||||||
|
config SCHED_AUTOGROUP
|
||||||
|
bool "Automatic process group scheduling"
|
||||||
|
select CGROUPS
|
||||||
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
||||||
|
index 919edb034108..fd52870a002f 100644
|
||||||
|
--- a/kernel/sched/core.c
|
||||||
|
+++ b/kernel/sched/core.c
|
||||||
|
@@ -4420,6 +4420,21 @@ int wake_up_state(struct task_struct *p, unsigned int state)
|
||||||
|
return try_to_wake_up(p, state, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+static inline void sched_fork_update_prev_burst(struct task_struct *p)
|
||||||
|
+{
|
||||||
|
+ struct task_struct *sib;
|
||||||
|
+ u32 cnt = 0;
|
||||||
|
+ u64 sum = 0, avg = 0;
|
||||||
|
+ list_for_each_entry(sib, &p->sibling, sibling) {
|
||||||
|
+ cnt++;
|
||||||
|
+ sum += sib->se.prev_burst_time >> 8;
|
||||||
|
+ }
|
||||||
|
+ if (cnt) avg = div_u64(sum, cnt) << 8;
|
||||||
|
+ if (p->se.prev_burst_time < avg) p->se.prev_burst_time = avg;
|
||||||
|
+}
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Perform scheduler related setup for a newly forked process p.
|
||||||
|
* p is forked by current.
|
||||||
|
@@ -4438,6 +4453,9 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p)
|
||||||
|
p->se.vruntime = 0;
|
||||||
|
p->se.dur_avg = 0;
|
||||||
|
p->se.prev_sleep_sum_runtime = 0;
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ p->se.burst_time = 0;
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
INIT_LIST_HEAD(&p->se.group_node);
|
||||||
|
RB_CLEAR_NODE(&p->se.latency_node);
|
||||||
|
|
||||||
|
@@ -4664,6 +4682,10 @@ late_initcall(sched_core_sysctl_init);
|
||||||
|
int sched_fork(unsigned long clone_flags, struct task_struct *p)
|
||||||
|
{
|
||||||
|
__sched_fork(clone_flags, p);
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ sched_fork_update_prev_burst(p);
|
||||||
|
+ p->se.burst_time = 0;
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
/*
|
||||||
|
* We mark the process as NEW here. This guarantees that
|
||||||
|
* nobody will actually run it, and a signal or other external
|
||||||
|
@@ -9154,6 +9176,9 @@ void __init init_idle(struct task_struct *idle, int cpu)
|
||||||
|
|
||||||
|
idle->__state = TASK_RUNNING;
|
||||||
|
idle->se.exec_start = sched_clock();
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ idle->se.prev_burst_time = 0;
|
||||||
|
+#endif //CONFIG_SCHED_BORE
|
||||||
|
/*
|
||||||
|
* PF_KTHREAD should already be set at this point; regardless, make it
|
||||||
|
* look like a proper per-CPU kthread.
|
||||||
|
@@ -9821,6 +9846,10 @@ void __init sched_init(void)
|
||||||
|
BUG_ON(&dl_sched_class != &stop_sched_class + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ printk(KERN_INFO "BORE (Burst-Oriented Response Enhancer) CPU Scheduler modification 1.7.10 by Masahito Suzuki");
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
+
|
||||||
|
wait_bit_init();
|
||||||
|
|
||||||
|
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||||
|
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
|
||||||
|
index 177934290ec4..2f40a238cdad 100644
|
||||||
|
--- a/kernel/sched/debug.c
|
||||||
|
+++ b/kernel/sched/debug.c
|
||||||
|
@@ -547,6 +547,9 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p)
|
||||||
|
SPLIT_NS(schedstat_val_or_zero(p->stats.sum_sleep_runtime)),
|
||||||
|
SPLIT_NS(schedstat_val_or_zero(p->stats.sum_block_runtime)));
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ SEQ_printf(m, " %2d", p->se.burst_score);
|
||||||
|
+#endif
|
||||||
|
#ifdef CONFIG_NUMA_BALANCING
|
||||||
|
SEQ_printf(m, " %d %d", task_node(p), task_numa_group_id(p));
|
||||||
|
#endif
|
||||||
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
||||||
|
index 5ef893ce5734..590adb9a3e37 100644
|
||||||
|
--- a/kernel/sched/fair.c
|
||||||
|
+++ b/kernel/sched/fair.c
|
||||||
|
@@ -19,6 +19,9 @@
|
||||||
|
*
|
||||||
|
* Adaptive scheduling granularity, math enhancements by Peter Zijlstra
|
||||||
|
* Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra
|
||||||
|
+ *
|
||||||
|
+ * Burst-Oriented Response Enhancer (BORE) CPU Scheduler
|
||||||
|
+ * Copyright (C) 2021 Masahito Suzuki <firelzrd@gmail.com>
|
||||||
|
*/
|
||||||
|
#include <linux/energy_model.h>
|
||||||
|
#include <linux/mmap_lock.h>
|
||||||
|
@@ -140,6 +143,16 @@ static unsigned int normalized_sysctl_sched_wakeup_granularity = 1000000UL;
|
||||||
|
|
||||||
|
const_debug unsigned int sysctl_sched_migration_cost = 500000UL;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+unsigned int __read_mostly sched_bore = 1;
|
||||||
|
+unsigned int __read_mostly sched_burst_penalty_scale = 1280;
|
||||||
|
+unsigned int __read_mostly sched_burst_granularity = 12;
|
||||||
|
+unsigned int __read_mostly sched_burst_smoothness = 2;
|
||||||
|
+static int three = 3;
|
||||||
|
+static int sixty_four = 64;
|
||||||
|
+static int maxval_12_bits = 4095;
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
+
|
||||||
|
int sched_thermal_decay_shift;
|
||||||
|
static int __init setup_sched_thermal_decay_shift(char *str)
|
||||||
|
{
|
||||||
|
@@ -203,6 +216,44 @@ static unsigned int sysctl_numa_balancing_promote_rate_limit = 65536;
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYSCTL
|
||||||
|
static struct ctl_table sched_fair_sysctls[] = {
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ {
|
||||||
|
+ .procname = "sched_bore",
|
||||||
|
+ .data = &sched_bore,
|
||||||
|
+ .maxlen = sizeof(unsigned int),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec_minmax,
|
||||||
|
+ .extra1 = SYSCTL_ZERO,
|
||||||
|
+ .extra2 = &three,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .procname = "sched_burst_penalty_scale",
|
||||||
|
+ .data = &sched_burst_penalty_scale,
|
||||||
|
+ .maxlen = sizeof(unsigned int),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec_minmax,
|
||||||
|
+ .extra1 = SYSCTL_ZERO,
|
||||||
|
+ .extra2 = &maxval_12_bits,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .procname = "sched_burst_granularity",
|
||||||
|
+ .data = &sched_burst_granularity,
|
||||||
|
+ .maxlen = sizeof(unsigned int),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec_minmax,
|
||||||
|
+ .extra1 = SYSCTL_ZERO,
|
||||||
|
+ .extra2 = &sixty_four,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ .procname = "sched_burst_smoothness",
|
||||||
|
+ .data = &sched_burst_smoothness,
|
||||||
|
+ .maxlen = sizeof(unsigned int),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = &proc_dointvec_minmax,
|
||||||
|
+ .extra1 = SYSCTL_ZERO,
|
||||||
|
+ .extra2 = &three,
|
||||||
|
+ },
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
{
|
||||||
|
.procname = "sched_child_runs_first",
|
||||||
|
.data = &sysctl_sched_child_runs_first,
|
||||||
|
@@ -978,6 +1029,39 @@ static void update_tg_load_avg(struct cfs_rq *cfs_rq)
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+static inline void update_burst_score(struct sched_entity *se) {
|
||||||
|
+ u64 burst_time;
|
||||||
|
+ s32 bits;
|
||||||
|
+ u32 intgr, fdigs, dec10;
|
||||||
|
+
|
||||||
|
+ burst_time = max(se->burst_time, se->prev_burst_time);
|
||||||
|
+ bits = fls64(burst_time);
|
||||||
|
+ intgr = max((u32)bits, sched_burst_granularity) - sched_burst_granularity;
|
||||||
|
+ fdigs = max(bits - 1, (s32)sched_burst_granularity);
|
||||||
|
+ dec10 = (intgr << 10) | (burst_time << (64 - fdigs) >> 54);
|
||||||
|
+ se->burst_score = min((u32)39, dec10 * sched_burst_penalty_scale >> 20);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static u64 burst_scale(u64 delta, struct sched_entity *se) {
|
||||||
|
+ return mul_u64_u32_shr(delta, sched_prio_to_wmult[se->burst_score], 22);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static u64 calc_delta_fair_bscale(u64 delta, struct sched_entity *se) {
|
||||||
|
+ return burst_scale(calc_delta_fair(delta, se), se);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline u64 binary_smooth(u64 old, u64 new, unsigned int smoothness) {
|
||||||
|
+ return (new + old * ((1 << smoothness) - 1)) >> smoothness;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void reset_burst(struct sched_entity *se) {
|
||||||
|
+ se->prev_burst_time = binary_smooth(
|
||||||
|
+ se->prev_burst_time, se->burst_time, sched_burst_smoothness);
|
||||||
|
+ se->burst_time = 0;
|
||||||
|
+}
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Update the current task's runtime statistics.
|
||||||
|
*/
|
||||||
|
@@ -1007,6 +1091,13 @@ static void update_curr(struct cfs_rq *cfs_rq)
|
||||||
|
curr->sum_exec_runtime += delta_exec;
|
||||||
|
schedstat_add(cfs_rq->exec_clock, delta_exec);
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ curr->burst_time += delta_exec;
|
||||||
|
+ update_burst_score(curr);
|
||||||
|
+ if (sched_bore & 1)
|
||||||
|
+ curr->vruntime += calc_delta_fair_bscale(delta_exec, curr);
|
||||||
|
+ else
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
curr->vruntime += calc_delta_fair(delta_exec, curr);
|
||||||
|
update_min_vruntime(cfs_rq);
|
||||||
|
|
||||||
|
@@ -5057,6 +5148,11 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)
|
||||||
|
se->prev_sum_exec_runtime = se->sum_exec_runtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+static int
|
||||||
|
+wakeup_preempt_entity_bscale(struct sched_entity *curr,
|
||||||
|
+ struct sched_entity *se, bool do_scale);
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
static int
|
||||||
|
wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se);
|
||||||
|
|
||||||
|
@@ -5101,7 +5197,13 @@ pick_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *curr)
|
||||||
|
se = second;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) {
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ if (cfs_rq->next && wakeup_preempt_entity_bscale(
|
||||||
|
+ cfs_rq->next, left, sched_bore & 2) < 1)
|
||||||
|
+#else // CONFIG_SCHED_BORE
|
||||||
|
+ if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
+ {
|
||||||
|
/*
|
||||||
|
* Someone really wants this to run. If it's not unfair, run it.
|
||||||
|
*/
|
||||||
|
@@ -6394,6 +6496,9 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
|
||||||
|
util_est_dequeue(&rq->cfs, p);
|
||||||
|
|
||||||
|
for_each_sched_entity(se) {
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ if (task_sleep) reset_burst(se);
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
cfs_rq = cfs_rq_of(se);
|
||||||
|
dequeue_entity(cfs_rq, se, flags);
|
||||||
|
|
||||||
|
@@ -7856,7 +7961,12 @@ static unsigned long wakeup_gran(struct sched_entity *se)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+wakeup_preempt_entity_bscale(struct sched_entity *curr,
|
||||||
|
+ struct sched_entity *se, bool do_scale)
|
||||||
|
+#else // CONFIG_SCHED_BORE
|
||||||
|
wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se)
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
{
|
||||||
|
s64 gran, vdiff = curr->vruntime - se->vruntime;
|
||||||
|
s64 offset = wakeup_latency_gran(curr, se);
|
||||||
|
@@ -7876,12 +7986,20 @@ wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se)
|
||||||
|
* chance to preempt current.
|
||||||
|
*/
|
||||||
|
gran = min_t(s64, gran, get_latency_max());
|
||||||
|
-
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ if (do_scale) gran = burst_scale(gran, se);
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
if (vdiff > gran)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+static int wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se)
|
||||||
|
+{
|
||||||
|
+ return wakeup_preempt_entity_bscale(curr, se, false);
|
||||||
|
+}
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
|
||||||
|
static void set_last_buddy(struct sched_entity *se)
|
||||||
|
{
|
||||||
|
@@ -7981,7 +8099,12 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_
|
||||||
|
return;
|
||||||
|
|
||||||
|
update_curr(cfs_rq_of(se));
|
||||||
|
- if (wakeup_preempt_entity(se, pse) == 1) {
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ if (wakeup_preempt_entity_bscale(se, pse, sched_bore & 2) == 1)
|
||||||
|
+#else // CONFIG_SCHED_BORE
|
||||||
|
+ if (wakeup_preempt_entity(se, pse) == 1)
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
+ {
|
||||||
|
/*
|
||||||
|
* Bias pick_next to pick the sched entity that is
|
||||||
|
* triggering this preemption.
|
||||||
|
@@ -8217,6 +8340,9 @@ static void yield_task_fair(struct rq *rq)
|
||||||
|
struct task_struct *curr = rq->curr;
|
||||||
|
struct cfs_rq *cfs_rq = task_cfs_rq(curr);
|
||||||
|
struct sched_entity *se = &curr->se;
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+ reset_burst(se);
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Are we the only task in the tree?
|
||||||
|
diff --git a/kernel/sched/features.h b/kernel/sched/features.h
|
||||||
|
index efdc29c42161..0f28637ce1aa 100644
|
||||||
|
--- a/kernel/sched/features.h
|
||||||
|
+++ b/kernel/sched/features.h
|
||||||
|
@@ -4,7 +4,11 @@
|
||||||
|
* them to run sooner, but does not allow tons of sleepers to
|
||||||
|
* rip the spread apart.
|
||||||
|
*/
|
||||||
|
+#ifdef CONFIG_SCHED_BORE
|
||||||
|
+SCHED_FEAT(GENTLE_FAIR_SLEEPERS, false)
|
||||||
|
+#else // CONFIG_SCHED_BORE
|
||||||
|
SCHED_FEAT(GENTLE_FAIR_SLEEPERS, true)
|
||||||
|
+#endif // CONFIG_SCHED_BORE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Place new tasks ahead so that they do not starve already running
|
||||||
|
--
|
||||||
|
2.39.2
|
912
patches/0004-hdr.patch
Normal file
912
patches/0004-hdr.patch
Normal file
@ -0,0 +1,912 @@
|
|||||||
|
From 9cab14aa7f6828572f808d1bea60def5f883522c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Jung <admin@ptr1337.dev>
|
||||||
|
Date: Sun, 22 Jan 2023 23:10:03 +0100
|
||||||
|
Subject: [PATCH 08/16] hdr
|
||||||
|
|
||||||
|
Signed-off-by: Peter Jung <admin@ptr1337.dev>
|
||||||
|
---
|
||||||
|
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 110 ++++++++---
|
||||||
|
.../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 57 ++++++
|
||||||
|
.../gpu/drm/amd/display/dc/core/dc_resource.c | 100 ++++------
|
||||||
|
drivers/gpu/drm/amd/display/dc/dc_stream.h | 2 +-
|
||||||
|
drivers/gpu/drm/amd/display/dc/dc_types.h | 14 --
|
||||||
|
drivers/gpu/drm/display/drm_hdmi_helper.c | 8 +-
|
||||||
|
drivers/gpu/drm/drm_atomic.c | 2 +
|
||||||
|
drivers/gpu/drm/drm_connector.c | 181 ++++++++++--------
|
||||||
|
.../gpu/drm/i915/display/intel_connector.c | 4 +-
|
||||||
|
drivers/gpu/drm/vc4/vc4_hdmi.c | 2 +-
|
||||||
|
include/drm/display/drm_dp.h | 2 +-
|
||||||
|
include/drm/drm_connector.h | 57 +++---
|
||||||
|
12 files changed, 327 insertions(+), 212 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
||||||
|
index 93dee3d1a483..b5eb33a97590 100644
|
||||||
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
||||||
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
||||||
|
@@ -5172,21 +5172,46 @@ get_aspect_ratio(const struct drm_display_mode *mode_in)
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum dc_color_space
|
||||||
|
-get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
|
||||||
|
+get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
|
||||||
|
+ const struct drm_connector_state *connector_state)
|
||||||
|
{
|
||||||
|
enum dc_color_space color_space = COLOR_SPACE_SRGB;
|
||||||
|
|
||||||
|
- switch (dc_crtc_timing->pixel_encoding) {
|
||||||
|
- case PIXEL_ENCODING_YCBCR422:
|
||||||
|
- case PIXEL_ENCODING_YCBCR444:
|
||||||
|
- case PIXEL_ENCODING_YCBCR420:
|
||||||
|
- {
|
||||||
|
+ switch (connector_state->colorspace) {
|
||||||
|
+ case DRM_MODE_COLORIMETRY_BT601_YCC:
|
||||||
|
+ if (dc_crtc_timing->flags.Y_ONLY)
|
||||||
|
+ color_space = COLOR_SPACE_YCBCR601_LIMITED;
|
||||||
|
+ else
|
||||||
|
+ color_space = COLOR_SPACE_YCBCR601;
|
||||||
|
+ break;
|
||||||
|
+ case DRM_MODE_COLORIMETRY_BT709_YCC:
|
||||||
|
+ if (dc_crtc_timing->flags.Y_ONLY)
|
||||||
|
+ color_space = COLOR_SPACE_YCBCR709_LIMITED;
|
||||||
|
+ else
|
||||||
|
+ color_space = COLOR_SPACE_YCBCR709;
|
||||||
|
+ break;
|
||||||
|
+ case DRM_MODE_COLORIMETRY_OPRGB:
|
||||||
|
+ color_space = COLOR_SPACE_ADOBERGB;
|
||||||
|
+ break;
|
||||||
|
+ case DRM_MODE_COLORIMETRY_BT2020_RGB:
|
||||||
|
+ if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB)
|
||||||
|
+ color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
|
||||||
|
+ else
|
||||||
|
+ color_space = COLOR_SPACE_2020_YCBCR;
|
||||||
|
+ break;
|
||||||
|
+ case DRM_MODE_COLORIMETRY_BT2020_YCC:
|
||||||
|
+ color_space = COLOR_SPACE_2020_YCBCR;
|
||||||
|
+ break;
|
||||||
|
+ case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601
|
||||||
|
+ default:
|
||||||
|
+ if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) {
|
||||||
|
+ color_space = COLOR_SPACE_SRGB;
|
||||||
|
/*
|
||||||
|
* 27030khz is the separation point between HDTV and SDTV
|
||||||
|
* according to HDMI spec, we use YCbCr709 and YCbCr601
|
||||||
|
* respectively
|
||||||
|
*/
|
||||||
|
- if (dc_crtc_timing->pix_clk_100hz > 270300) {
|
||||||
|
+ } else if (dc_crtc_timing->pix_clk_100hz > 270300) {
|
||||||
|
if (dc_crtc_timing->flags.Y_ONLY)
|
||||||
|
color_space =
|
||||||
|
COLOR_SPACE_YCBCR709_LIMITED;
|
||||||
|
@@ -5199,21 +5224,30 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing)
|
||||||
|
else
|
||||||
|
color_space = COLOR_SPACE_YCBCR601;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
- case PIXEL_ENCODING_RGB:
|
||||||
|
- color_space = COLOR_SPACE_SRGB;
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
- default:
|
||||||
|
- WARN_ON(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return color_space;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static enum display_content_type
|
||||||
|
+get_output_content_type(const struct drm_connector_state *connector_state)
|
||||||
|
+{
|
||||||
|
+ switch (connector_state->content_type) {
|
||||||
|
+ default:
|
||||||
|
+ case DRM_MODE_CONTENT_TYPE_NO_DATA:
|
||||||
|
+ return DISPLAY_CONTENT_TYPE_NO_DATA;
|
||||||
|
+ case DRM_MODE_CONTENT_TYPE_GRAPHICS:
|
||||||
|
+ return DISPLAY_CONTENT_TYPE_GRAPHICS;
|
||||||
|
+ case DRM_MODE_CONTENT_TYPE_PHOTO:
|
||||||
|
+ return DISPLAY_CONTENT_TYPE_PHOTO;
|
||||||
|
+ case DRM_MODE_CONTENT_TYPE_CINEMA:
|
||||||
|
+ return DISPLAY_CONTENT_TYPE_CINEMA;
|
||||||
|
+ case DRM_MODE_CONTENT_TYPE_GAME:
|
||||||
|
+ return DISPLAY_CONTENT_TYPE_GAME;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static bool adjust_colour_depth_from_display_info(
|
||||||
|
struct dc_crtc_timing *timing_out,
|
||||||
|
const struct drm_display_info *info)
|
||||||
|
@@ -5307,6 +5341,7 @@ static void fill_stream_properties_from_drm_display_mode(
|
||||||
|
if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A) {
|
||||||
|
drm_hdmi_avi_infoframe_from_display_mode(&avi_frame, (struct drm_connector *)connector, mode_in);
|
||||||
|
timing_out->vic = avi_frame.video_code;
|
||||||
|
+ drm_hdmi_avi_infoframe_colorimetry(&avi_frame, connector_state);
|
||||||
|
drm_hdmi_vendor_infoframe_from_display_mode(&hv_frame, (struct drm_connector *)connector, mode_in);
|
||||||
|
timing_out->hdmi_vic = hv_frame.vic;
|
||||||
|
}
|
||||||
|
@@ -5346,7 +5381,8 @@ static void fill_stream_properties_from_drm_display_mode(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- stream->output_color_space = get_output_color_space(timing_out);
|
||||||
|
+ stream->output_color_space = get_output_color_space(timing_out, connector_state);
|
||||||
|
+ stream->content_type = get_output_content_type(connector_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fill_audio_info(struct audio_info *audio_info,
|
||||||
|
@@ -5786,15 +5822,14 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||||
|
{
|
||||||
|
struct drm_display_mode *preferred_mode = NULL;
|
||||||
|
struct drm_connector *drm_connector;
|
||||||
|
- const struct drm_connector_state *con_state =
|
||||||
|
- dm_state ? &dm_state->base : NULL;
|
||||||
|
+ const struct drm_connector_state *con_state = &dm_state->base;
|
||||||
|
struct dc_stream_state *stream = NULL;
|
||||||
|
struct drm_display_mode mode;
|
||||||
|
struct drm_display_mode saved_mode;
|
||||||
|
struct drm_display_mode *freesync_mode = NULL;
|
||||||
|
bool native_mode_found = false;
|
||||||
|
bool recalculate_timing = false;
|
||||||
|
- bool scale = dm_state ? (dm_state->scaling != RMX_OFF) : false;
|
||||||
|
+ bool scale = dm_state->scaling != RMX_OFF;
|
||||||
|
int mode_refresh;
|
||||||
|
int preferred_refresh = 0;
|
||||||
|
enum color_transfer_func tf = TRANSFER_FUNC_UNKNOWN;
|
||||||
|
@@ -5875,7 +5910,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||||
|
|
||||||
|
if (recalculate_timing)
|
||||||
|
drm_mode_set_crtcinfo(&saved_mode, 0);
|
||||||
|
- else if (!dm_state)
|
||||||
|
+ else
|
||||||
|
drm_mode_set_crtcinfo(&mode, 0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -6404,7 +6439,9 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
- stream = create_validate_stream_for_sink(aconnector, mode, NULL, NULL);
|
||||||
|
+ stream = create_validate_stream_for_sink(aconnector, mode,
|
||||||
|
+ to_dm_connector_state(connector->state),
|
||||||
|
+ NULL);
|
||||||
|
if (stream) {
|
||||||
|
dc_stream_release(stream);
|
||||||
|
result = MODE_OK;
|
||||||
|
@@ -6498,6 +6535,14 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn,
|
||||||
|
if (!crtc)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ if (new_con_state->colorspace != old_con_state->colorspace) {
|
||||||
|
+ new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||||
|
+ if (IS_ERR(new_crtc_state))
|
||||||
|
+ return PTR_ERR(new_crtc_state);
|
||||||
|
+
|
||||||
|
+ new_crtc_state->mode_changed = true;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state)) {
|
||||||
|
struct dc_info_packet hdr_infopacket;
|
||||||
|
|
||||||
|
@@ -6520,7 +6565,7 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn,
|
||||||
|
* set is permissible, however. So only force a
|
||||||
|
* modeset if we're entering or exiting HDR.
|
||||||
|
*/
|
||||||
|
- new_crtc_state->mode_changed =
|
||||||
|
+ new_crtc_state->mode_changed = new_crtc_state->mode_changed ||
|
||||||
|
!old_con_state->hdr_output_metadata ||
|
||||||
|
!new_con_state->hdr_output_metadata;
|
||||||
|
}
|
||||||
|
@@ -7041,6 +7086,12 @@ static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
|
||||||
|
return amdgpu_dm_connector->num_modes;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const u32 supported_colorspaces =
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT709_YCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_OPRGB) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_YCC);
|
||||||
|
+
|
||||||
|
void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
|
||||||
|
struct amdgpu_dm_connector *aconnector,
|
||||||
|
int connector_type,
|
||||||
|
@@ -7109,7 +7160,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
|
||||||
|
drm_connector_attach_max_bpc_property(&aconnector->base, 8, 16);
|
||||||
|
|
||||||
|
/* This defaults to the max in the range, but we want 8bpc for non-edp. */
|
||||||
|
- aconnector->base.state->max_bpc = (connector_type == DRM_MODE_CONNECTOR_eDP) ? 16 : 8;
|
||||||
|
+ aconnector->base.state->max_bpc = 16;
|
||||||
|
aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc;
|
||||||
|
|
||||||
|
if (connector_type == DRM_MODE_CONNECTOR_eDP &&
|
||||||
|
@@ -7118,6 +7169,17 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
|
||||||
|
adev->mode_info.abm_level_property, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ drm_connector_attach_content_type_property(&aconnector->base);
|
||||||
|
+
|
||||||
|
+ if (connector_type == DRM_MODE_CONNECTOR_HDMIA) {
|
||||||
|
+ if (!drm_mode_create_hdmi_colorspace_property(&aconnector->base, supported_colorspaces))
|
||||||
|
+ drm_connector_attach_colorspace_property(&aconnector->base);
|
||||||
|
+ } else if (connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||||
|
+ connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||||
|
+ if (!drm_mode_create_dp_colorspace_property(&aconnector->base, supported_colorspaces))
|
||||||
|
+ drm_connector_attach_colorspace_property(&aconnector->base);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (connector_type == DRM_MODE_CONNECTOR_HDMIA ||
|
||||||
|
connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
|
||||||
|
connector_type == DRM_MODE_CONNECTOR_eDP) {
|
||||||
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
|
||||||
|
index 461037a3dd75..d95d1c9f4805 100644
|
||||||
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
|
||||||
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
|
||||||
|
@@ -935,6 +935,61 @@ static int amdgpu_current_bpc_show(struct seq_file *m, void *data)
|
||||||
|
}
|
||||||
|
DEFINE_SHOW_ATTRIBUTE(amdgpu_current_bpc);
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Returns the current bpc for the crtc.
|
||||||
|
+ * Example usage: cat /sys/kernel/debug/dri/0/crtc-0/amdgpu_current_colorspace
|
||||||
|
+ */
|
||||||
|
+static int amdgpu_current_colorspace_show(struct seq_file *m, void *data)
|
||||||
|
+{
|
||||||
|
+ struct drm_crtc *crtc = m->private;
|
||||||
|
+ struct drm_device *dev = crtc->dev;
|
||||||
|
+ struct dm_crtc_state *dm_crtc_state = NULL;
|
||||||
|
+ int res = -ENODEV;
|
||||||
|
+
|
||||||
|
+ mutex_lock(&dev->mode_config.mutex);
|
||||||
|
+ drm_modeset_lock(&crtc->mutex, NULL);
|
||||||
|
+ if (crtc->state == NULL)
|
||||||
|
+ goto unlock;
|
||||||
|
+
|
||||||
|
+ dm_crtc_state = to_dm_crtc_state(crtc->state);
|
||||||
|
+ if (dm_crtc_state->stream == NULL)
|
||||||
|
+ goto unlock;
|
||||||
|
+
|
||||||
|
+ switch (dm_crtc_state->stream->output_color_space) {
|
||||||
|
+ case COLOR_SPACE_SRGB:
|
||||||
|
+ seq_printf(m, "RGB");
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_YCBCR601:
|
||||||
|
+ case COLOR_SPACE_YCBCR601_LIMITED:
|
||||||
|
+ seq_printf(m, "BT601_YCC");
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_YCBCR709:
|
||||||
|
+ case COLOR_SPACE_YCBCR709_LIMITED:
|
||||||
|
+ seq_printf(m, "BT709_YCC");
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_ADOBERGB:
|
||||||
|
+ seq_printf(m, "opRGB");
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||||
|
+ seq_printf(m, "BT2020_RGB");
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_2020_YCBCR:
|
||||||
|
+ seq_printf(m, "BT2020_YCC");
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ goto unlock;
|
||||||
|
+ }
|
||||||
|
+ res = 0;
|
||||||
|
+
|
||||||
|
+unlock:
|
||||||
|
+ drm_modeset_unlock(&crtc->mutex);
|
||||||
|
+ mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
+
|
||||||
|
+ return res;
|
||||||
|
+}
|
||||||
|
+DEFINE_SHOW_ATTRIBUTE(amdgpu_current_colorspace);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Example usage:
|
||||||
|
* Disable dsc passthrough, i.e.,: have dsc decoding at converver, not external RX
|
||||||
|
@@ -3326,6 +3381,8 @@ void crtc_debugfs_init(struct drm_crtc *crtc)
|
||||||
|
#endif
|
||||||
|
debugfs_create_file("amdgpu_current_bpc", 0644, crtc->debugfs_entry,
|
||||||
|
crtc, &amdgpu_current_bpc_fops);
|
||||||
|
+ debugfs_create_file("amdgpu_current_colorspace", 0644, crtc->debugfs_entry,
|
||||||
|
+ crtc, &amdgpu_current_colorspace_fops);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
|
||||||
|
index da164685547d..e00fadf9d0ff 100644
|
||||||
|
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
|
||||||
|
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
|
||||||
|
@@ -2943,14 +2943,9 @@ static void set_avi_info_frame(
|
||||||
|
uint32_t pixel_encoding = 0;
|
||||||
|
enum scanning_type scan_type = SCANNING_TYPE_NODATA;
|
||||||
|
enum dc_aspect_ratio aspect = ASPECT_RATIO_NO_DATA;
|
||||||
|
- bool itc = false;
|
||||||
|
- uint8_t itc_value = 0;
|
||||||
|
- uint8_t cn0_cn1 = 0;
|
||||||
|
- unsigned int cn0_cn1_value = 0;
|
||||||
|
uint8_t *check_sum = NULL;
|
||||||
|
uint8_t byte_index = 0;
|
||||||
|
union hdmi_info_packet hdmi_info;
|
||||||
|
- union display_content_support support = {0};
|
||||||
|
unsigned int vic = pipe_ctx->stream->timing.vic;
|
||||||
|
unsigned int rid = pipe_ctx->stream->timing.rid;
|
||||||
|
unsigned int fr_ind = pipe_ctx->stream->timing.fr_index;
|
||||||
|
@@ -3010,23 +3005,32 @@ static void set_avi_info_frame(
|
||||||
|
hdmi_info.bits.S0_S1 = scan_type;
|
||||||
|
|
||||||
|
/* C0, C1 : Colorimetry */
|
||||||
|
- if (color_space == COLOR_SPACE_YCBCR709 ||
|
||||||
|
- color_space == COLOR_SPACE_YCBCR709_LIMITED)
|
||||||
|
+ switch (color_space) {
|
||||||
|
+ case COLOR_SPACE_YCBCR709:
|
||||||
|
+ case COLOR_SPACE_YCBCR709_LIMITED:
|
||||||
|
hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
|
||||||
|
- else if (color_space == COLOR_SPACE_YCBCR601 ||
|
||||||
|
- color_space == COLOR_SPACE_YCBCR601_LIMITED)
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_YCBCR601:
|
||||||
|
+ case COLOR_SPACE_YCBCR601_LIMITED:
|
||||||
|
hdmi_info.bits.C0_C1 = COLORIMETRY_ITU601;
|
||||||
|
- else {
|
||||||
|
- hdmi_info.bits.C0_C1 = COLORIMETRY_NO_DATA;
|
||||||
|
- }
|
||||||
|
- if (color_space == COLOR_SPACE_2020_RGB_FULLRANGE ||
|
||||||
|
- color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE ||
|
||||||
|
- color_space == COLOR_SPACE_2020_YCBCR) {
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||||
|
+ case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
|
||||||
|
hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR;
|
||||||
|
hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED;
|
||||||
|
- } else if (color_space == COLOR_SPACE_ADOBERGB) {
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_2020_YCBCR:
|
||||||
|
+ hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020YCC;
|
||||||
|
+ hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED;
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_ADOBERGB:
|
||||||
|
hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_ADOBERGB;
|
||||||
|
hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED;
|
||||||
|
+ break;
|
||||||
|
+ case COLOR_SPACE_SRGB:
|
||||||
|
+ default:
|
||||||
|
+ hdmi_info.bits.C0_C1 = COLORIMETRY_NO_DATA;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR &&
|
||||||
|
@@ -3054,49 +3058,27 @@ static void set_avi_info_frame(
|
||||||
|
/* Active Format Aspect ratio - same as Picture Aspect Ratio. */
|
||||||
|
hdmi_info.bits.R0_R3 = ACTIVE_FORMAT_ASPECT_RATIO_SAME_AS_PICTURE;
|
||||||
|
|
||||||
|
- /* TODO: un-hardcode cn0_cn1 and itc */
|
||||||
|
-
|
||||||
|
- cn0_cn1 = 0;
|
||||||
|
- cn0_cn1_value = 0;
|
||||||
|
-
|
||||||
|
- itc = true;
|
||||||
|
- itc_value = 1;
|
||||||
|
-
|
||||||
|
- support = stream->content_support;
|
||||||
|
-
|
||||||
|
- if (itc) {
|
||||||
|
- if (!support.bits.valid_content_type) {
|
||||||
|
- cn0_cn1_value = 0;
|
||||||
|
- } else {
|
||||||
|
- if (cn0_cn1 == DISPLAY_CONTENT_TYPE_GRAPHICS) {
|
||||||
|
- if (support.bits.graphics_content == 1) {
|
||||||
|
- cn0_cn1_value = 0;
|
||||||
|
- }
|
||||||
|
- } else if (cn0_cn1 == DISPLAY_CONTENT_TYPE_PHOTO) {
|
||||||
|
- if (support.bits.photo_content == 1) {
|
||||||
|
- cn0_cn1_value = 1;
|
||||||
|
- } else {
|
||||||
|
- cn0_cn1_value = 0;
|
||||||
|
- itc_value = 0;
|
||||||
|
- }
|
||||||
|
- } else if (cn0_cn1 == DISPLAY_CONTENT_TYPE_CINEMA) {
|
||||||
|
- if (support.bits.cinema_content == 1) {
|
||||||
|
- cn0_cn1_value = 2;
|
||||||
|
- } else {
|
||||||
|
- cn0_cn1_value = 0;
|
||||||
|
- itc_value = 0;
|
||||||
|
- }
|
||||||
|
- } else if (cn0_cn1 == DISPLAY_CONTENT_TYPE_GAME) {
|
||||||
|
- if (support.bits.game_content == 1) {
|
||||||
|
- cn0_cn1_value = 3;
|
||||||
|
- } else {
|
||||||
|
- cn0_cn1_value = 0;
|
||||||
|
- itc_value = 0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- hdmi_info.bits.CN0_CN1 = cn0_cn1_value;
|
||||||
|
- hdmi_info.bits.ITC = itc_value;
|
||||||
|
+ switch (stream->content_type) {
|
||||||
|
+ case DISPLAY_CONTENT_TYPE_NO_DATA:
|
||||||
|
+ hdmi_info.bits.CN0_CN1 = 0;
|
||||||
|
+ hdmi_info.bits.ITC = 0;
|
||||||
|
+ break;
|
||||||
|
+ case DISPLAY_CONTENT_TYPE_GRAPHICS:
|
||||||
|
+ hdmi_info.bits.CN0_CN1 = 0;
|
||||||
|
+ hdmi_info.bits.ITC = 1;
|
||||||
|
+ break;
|
||||||
|
+ case DISPLAY_CONTENT_TYPE_PHOTO:
|
||||||
|
+ hdmi_info.bits.CN0_CN1 = 1;
|
||||||
|
+ hdmi_info.bits.ITC = 1;
|
||||||
|
+ break;
|
||||||
|
+ case DISPLAY_CONTENT_TYPE_CINEMA:
|
||||||
|
+ hdmi_info.bits.CN0_CN1 = 2;
|
||||||
|
+ hdmi_info.bits.ITC = 1;
|
||||||
|
+ break;
|
||||||
|
+ case DISPLAY_CONTENT_TYPE_GAME:
|
||||||
|
+ hdmi_info.bits.CN0_CN1 = 3;
|
||||||
|
+ hdmi_info.bits.ITC = 1;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream->qs_bit == 1) {
|
||||||
|
diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h
|
||||||
|
index dfd3df1d2f7e..f78d49e33a6e 100644
|
||||||
|
--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h
|
||||||
|
+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h
|
||||||
|
@@ -182,7 +182,6 @@ struct dc_stream_state {
|
||||||
|
*/
|
||||||
|
struct link_encoder *link_enc;
|
||||||
|
struct dc_panel_patch sink_patches;
|
||||||
|
- union display_content_support content_support;
|
||||||
|
struct dc_crtc_timing timing;
|
||||||
|
struct dc_crtc_timing_adjust adjust;
|
||||||
|
struct dc_info_packet vrr_infopacket;
|
||||||
|
@@ -205,6 +204,7 @@ struct dc_stream_state {
|
||||||
|
struct dc_csc_transform csc_color_matrix;
|
||||||
|
|
||||||
|
enum dc_color_space output_color_space;
|
||||||
|
+ enum display_content_type content_type;
|
||||||
|
enum dc_dither_option dither_option;
|
||||||
|
|
||||||
|
enum view_3d_format view_format;
|
||||||
|
diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h b/drivers/gpu/drm/amd/display/dc/dc_types.h
|
||||||
|
index dc78e2404b48..fdf58a2e3a75 100644
|
||||||
|
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
|
||||||
|
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
|
||||||
|
@@ -174,18 +174,6 @@ struct dc_edid {
|
||||||
|
|
||||||
|
#define AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS 20
|
||||||
|
|
||||||
|
-union display_content_support {
|
||||||
|
- unsigned int raw;
|
||||||
|
- struct {
|
||||||
|
- unsigned int valid_content_type :1;
|
||||||
|
- unsigned int game_content :1;
|
||||||
|
- unsigned int cinema_content :1;
|
||||||
|
- unsigned int photo_content :1;
|
||||||
|
- unsigned int graphics_content :1;
|
||||||
|
- unsigned int reserved :27;
|
||||||
|
- } bits;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
struct dc_panel_patch {
|
||||||
|
unsigned int dppowerup_delay;
|
||||||
|
unsigned int extra_t12_ms;
|
||||||
|
@@ -218,8 +206,6 @@ struct dc_edid_caps {
|
||||||
|
uint32_t audio_latency;
|
||||||
|
uint32_t video_latency;
|
||||||
|
|
||||||
|
- union display_content_support content_support;
|
||||||
|
-
|
||||||
|
uint8_t qs_bit;
|
||||||
|
uint8_t qy_bit;
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/display/drm_hdmi_helper.c b/drivers/gpu/drm/display/drm_hdmi_helper.c
|
||||||
|
index 0264abe55278..c1e6851b2606 100644
|
||||||
|
--- a/drivers/gpu/drm/display/drm_hdmi_helper.c
|
||||||
|
+++ b/drivers/gpu/drm/display/drm_hdmi_helper.c
|
||||||
|
@@ -44,10 +44,8 @@ int drm_hdmi_infoframe_set_hdr_metadata(struct hdmi_drm_infoframe *frame,
|
||||||
|
|
||||||
|
/* Sink EOTF is Bit map while infoframe is absolute values */
|
||||||
|
if (!is_eotf_supported(hdr_metadata->hdmi_metadata_type1.eotf,
|
||||||
|
- connector->hdr_sink_metadata.hdmi_type1.eotf)) {
|
||||||
|
- DRM_DEBUG_KMS("EOTF Not Supported\n");
|
||||||
|
- return -EINVAL;
|
||||||
|
- }
|
||||||
|
+ connector->hdr_sink_metadata.hdmi_type1.eotf))
|
||||||
|
+ DRM_DEBUG_KMS("Unknown EOTF %d\n", hdr_metadata->hdmi_metadata_type1.eotf);
|
||||||
|
|
||||||
|
err = hdmi_drm_infoframe_init(frame);
|
||||||
|
if (err < 0)
|
||||||
|
@@ -105,7 +103,7 @@ EXPORT_SYMBOL(drm_hdmi_infoframe_set_hdr_metadata);
|
||||||
|
#define HDMI_COLORIMETRY_DCI_P3_RGB_THEATER (C(3) | EC(7) | ACE(1))
|
||||||
|
|
||||||
|
static const u32 hdmi_colorimetry_val[] = {
|
||||||
|
- [DRM_MODE_COLORIMETRY_NO_DATA] = HDMI_COLORIMETRY_NO_DATA,
|
||||||
|
+ [DRM_MODE_COLORIMETRY_DEFAULT] = HDMI_COLORIMETRY_NO_DATA,
|
||||||
|
[DRM_MODE_COLORIMETRY_SMPTE_170M_YCC] = HDMI_COLORIMETRY_SMPTE_170M_YCC,
|
||||||
|
[DRM_MODE_COLORIMETRY_BT709_YCC] = HDMI_COLORIMETRY_BT709_YCC,
|
||||||
|
[DRM_MODE_COLORIMETRY_XVYCC_601] = HDMI_COLORIMETRY_XVYCC_601,
|
||||||
|
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
|
||||||
|
index f197f59f6d99..d6d04c4ccfc0 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_atomic.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_atomic.c
|
||||||
|
@@ -1070,6 +1070,8 @@ static void drm_atomic_connector_print_state(struct drm_printer *p,
|
||||||
|
drm_printf(p, "connector[%u]: %s\n", connector->base.id, connector->name);
|
||||||
|
drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)");
|
||||||
|
drm_printf(p, "\tself_refresh_aware=%d\n", state->self_refresh_aware);
|
||||||
|
+ drm_printf(p, "\tmax_requested_bpc=%d\n", state->max_requested_bpc);
|
||||||
|
+ drm_printf(p, "\tcolorspace=%s\n", drm_get_colorspace_name(state->colorspace));
|
||||||
|
|
||||||
|
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
|
||||||
|
if (state->writeback_job && state->writeback_job->fb)
|
||||||
|
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
|
||||||
|
index 547356e00341..e99d397cd228 100644
|
||||||
|
--- a/drivers/gpu/drm/drm_connector.c
|
||||||
|
+++ b/drivers/gpu/drm/drm_connector.c
|
||||||
|
@@ -1016,64 +1016,72 @@ static const struct drm_prop_enum_list drm_dp_subconnector_enum_list[] = {
|
||||||
|
DRM_ENUM_NAME_FN(drm_get_dp_subconnector_name,
|
||||||
|
drm_dp_subconnector_enum_list)
|
||||||
|
|
||||||
|
-static const struct drm_prop_enum_list hdmi_colorspaces[] = {
|
||||||
|
- /* For Default case, driver will set the colorspace */
|
||||||
|
- { DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
|
||||||
|
- /* Standard Definition Colorimetry based on CEA 861 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_SMPTE_170M_YCC, "SMPTE_170M_YCC" },
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT709_YCC, "BT709_YCC" },
|
||||||
|
- /* Standard Definition Colorimetry based on IEC 61966-2-4 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_XVYCC_601, "XVYCC_601" },
|
||||||
|
- /* High Definition Colorimetry based on IEC 61966-2-4 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_XVYCC_709, "XVYCC_709" },
|
||||||
|
- /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_SYCC_601, "SYCC_601" },
|
||||||
|
- /* Colorimetry based on IEC 61966-2-5 [33] */
|
||||||
|
- { DRM_MODE_COLORIMETRY_OPYCC_601, "opYCC_601" },
|
||||||
|
- /* Colorimetry based on IEC 61966-2-5 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_OPRGB, "opRGB" },
|
||||||
|
- /* Colorimetry based on ITU-R BT.2020 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT2020_CYCC, "BT2020_CYCC" },
|
||||||
|
- /* Colorimetry based on ITU-R BT.2020 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT2020_RGB, "BT2020_RGB" },
|
||||||
|
- /* Colorimetry based on ITU-R BT.2020 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT2020_YCC, "BT2020_YCC" },
|
||||||
|
- /* Added as part of Additional Colorimetry Extension in 861.G */
|
||||||
|
- { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
|
||||||
|
- { DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER, "DCI-P3_RGB_Theater" },
|
||||||
|
+static const char * const colorspace_names[] = {
|
||||||
|
+ [DRM_MODE_COLORIMETRY_DEFAULT] = "Default",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_SMPTE_170M_YCC] = "SMPTE_170M_YCC",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_BT709_YCC] = "BT709_YCC",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_XVYCC_601] = "XVYCC_601",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_XVYCC_709] = "XVYCC_709",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_SYCC_601] = "SYCC_601",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_OPYCC_601] = "opYCC_601",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_OPRGB] = "opRGB",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_BT2020_CYCC] = "BT2020_CYCC",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_BT2020_RGB] = "BT2020_RGB",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_BT2020_YCC] = "BT2020_YCC",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65] = "P3_RGB_D65",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER] = "P3_RGB_Theater",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED] = "RGB_WIDE_FIXED",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT] = "RGB_WIDE_FLOAT",
|
||||||
|
+ [DRM_MODE_COLORIMETRY_BT601_YCC] = "BT601_YCC",
|
||||||
|
};
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * drm_get_color_encoding_name - return a string for color encoding
|
||||||
|
+ * @encoding: color encoding to compute name of
|
||||||
|
+ *
|
||||||
|
+ * In contrast to the other drm_get_*_name functions this one here returns a
|
||||||
|
+ * const pointer and hence is threadsafe.
|
||||||
|
+ */
|
||||||
|
+const char *drm_get_colorspace_name(enum drm_colorspace colorspace)
|
||||||
|
+{
|
||||||
|
+ if (WARN_ON(colorspace >= ARRAY_SIZE(colorspace_names)))
|
||||||
|
+ return "unknown";
|
||||||
|
+
|
||||||
|
+ return colorspace_names[colorspace];
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const u32 hdmi_colorspaces =
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_SMPTE_170M_YCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT709_YCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_XVYCC_601) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_XVYCC_709) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_SYCC_601) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_OPYCC_601) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_OPRGB) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_CYCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_YCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER);
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* As per DP 1.4a spec, 2.2.5.7.5 VSC SDP Payload for Pixel Encoding/Colorimetry
|
||||||
|
* Format Table 2-120
|
||||||
|
*/
|
||||||
|
-static const struct drm_prop_enum_list dp_colorspaces[] = {
|
||||||
|
- /* For Default case, driver will set the colorspace */
|
||||||
|
- { DRM_MODE_COLORIMETRY_DEFAULT, "Default" },
|
||||||
|
- { DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED, "RGB_Wide_Gamut_Fixed_Point" },
|
||||||
|
- /* Colorimetry based on scRGB (IEC 61966-2-2) */
|
||||||
|
- { DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT, "RGB_Wide_Gamut_Floating_Point" },
|
||||||
|
- /* Colorimetry based on IEC 61966-2-5 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_OPRGB, "opRGB" },
|
||||||
|
- /* Colorimetry based on SMPTE RP 431-2 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65, "DCI-P3_RGB_D65" },
|
||||||
|
- /* Colorimetry based on ITU-R BT.2020 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT2020_RGB, "BT2020_RGB" },
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT601_YCC, "BT601_YCC" },
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT709_YCC, "BT709_YCC" },
|
||||||
|
- /* Standard Definition Colorimetry based on IEC 61966-2-4 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_XVYCC_601, "XVYCC_601" },
|
||||||
|
- /* High Definition Colorimetry based on IEC 61966-2-4 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_XVYCC_709, "XVYCC_709" },
|
||||||
|
- /* Colorimetry based on IEC 61966-2-1/Amendment 1 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_SYCC_601, "SYCC_601" },
|
||||||
|
- /* Colorimetry based on IEC 61966-2-5 [33] */
|
||||||
|
- { DRM_MODE_COLORIMETRY_OPYCC_601, "opYCC_601" },
|
||||||
|
- /* Colorimetry based on ITU-R BT.2020 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT2020_CYCC, "BT2020_CYCC" },
|
||||||
|
- /* Colorimetry based on ITU-R BT.2020 */
|
||||||
|
- { DRM_MODE_COLORIMETRY_BT2020_YCC, "BT2020_YCC" },
|
||||||
|
-};
|
||||||
|
+static const u32 dp_colorspaces =
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_OPRGB) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT601_YCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT709_YCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_XVYCC_601) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_XVYCC_709) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_SYCC_601) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_OPYCC_601) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_CYCC) |
|
||||||
|
+ BIT(DRM_MODE_COLORIMETRY_BT2020_YCC);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DOC: standard connector properties
|
||||||
|
@@ -1975,33 +1983,58 @@ EXPORT_SYMBOL(drm_mode_create_aspect_ratio_property);
|
||||||
|
* drm_mode_create_dp_colorspace_property() is used for DP connector.
|
||||||
|
*/
|
||||||
|
|
||||||
|
-/**
|
||||||
|
- * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
|
||||||
|
- * @connector: connector to create the Colorspace property on.
|
||||||
|
- *
|
||||||
|
- * Called by a driver the first time it's needed, must be attached to desired
|
||||||
|
- * HDMI connectors.
|
||||||
|
- *
|
||||||
|
- * Returns:
|
||||||
|
- * Zero on success, negative errno on failure.
|
||||||
|
- */
|
||||||
|
-int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector)
|
||||||
|
+static int drm_mode_create_colorspace_property(struct drm_connector *connector,
|
||||||
|
+ u32 supported_colorspaces)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = connector->dev;
|
||||||
|
+ u32 colorspaces = supported_colorspaces | BIT(DRM_MODE_COLORIMETRY_DEFAULT);
|
||||||
|
+ struct drm_prop_enum_list enum_list[DRM_MODE_COLORIMETRY_MAX];
|
||||||
|
+ int i, len;
|
||||||
|
|
||||||
|
if (connector->colorspace_property)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
+ if (WARN_ON(supported_colorspaces == 0 ||
|
||||||
|
+ (supported_colorspaces & -BIT(DRM_MODE_COLORIMETRY_MAX)) != 0))
|
||||||
|
+ return -EINVAL;
|
||||||
|
+
|
||||||
|
+ len = 0;
|
||||||
|
+ for (i = 0; i < DRM_MODE_COLORIMETRY_MAX; i++) {
|
||||||
|
+ if ((colorspaces & BIT(i)) == 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ enum_list[len].type = i;
|
||||||
|
+ enum_list[len].name = colorspace_names[i];
|
||||||
|
+ len++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
connector->colorspace_property =
|
||||||
|
drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "Colorspace",
|
||||||
|
- hdmi_colorspaces,
|
||||||
|
- ARRAY_SIZE(hdmi_colorspaces));
|
||||||
|
+ enum_list,
|
||||||
|
+ len);
|
||||||
|
|
||||||
|
if (!connector->colorspace_property)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+/**
|
||||||
|
+ * drm_mode_create_hdmi_colorspace_property - create hdmi colorspace property
|
||||||
|
+ * @connector: connector to create the Colorspace property on.
|
||||||
|
+ *
|
||||||
|
+ * Called by a driver the first time it's needed, must be attached to desired
|
||||||
|
+ * HDMI connectors.
|
||||||
|
+ *
|
||||||
|
+ * Returns:
|
||||||
|
+ * Zero on success, negative errno on failure.
|
||||||
|
+ */
|
||||||
|
+int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector,
|
||||||
|
+ u32 supported_colorspaces)
|
||||||
|
+{
|
||||||
|
+ u32 colorspaces = supported_colorspaces & hdmi_colorspaces;
|
||||||
|
+
|
||||||
|
+ return drm_mode_create_colorspace_property(connector, colorspaces);
|
||||||
|
+}
|
||||||
|
EXPORT_SYMBOL(drm_mode_create_hdmi_colorspace_property);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -2014,22 +2047,12 @@ EXPORT_SYMBOL(drm_mode_create_hdmi_colorspace_property);
|
||||||
|
* Returns:
|
||||||
|
* Zero on success, negative errno on failure.
|
||||||
|
*/
|
||||||
|
-int drm_mode_create_dp_colorspace_property(struct drm_connector *connector)
|
||||||
|
+int drm_mode_create_dp_colorspace_property(struct drm_connector *connector,
|
||||||
|
+ u32 supported_colorspaces)
|
||||||
|
{
|
||||||
|
- struct drm_device *dev = connector->dev;
|
||||||
|
+ u32 colorspaces = supported_colorspaces & dp_colorspaces;
|
||||||
|
|
||||||
|
- if (connector->colorspace_property)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- connector->colorspace_property =
|
||||||
|
- drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, "Colorspace",
|
||||||
|
- dp_colorspaces,
|
||||||
|
- ARRAY_SIZE(dp_colorspaces));
|
||||||
|
-
|
||||||
|
- if (!connector->colorspace_property)
|
||||||
|
- return -ENOMEM;
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
+ return drm_mode_create_colorspace_property(connector, colorspaces);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_mode_create_dp_colorspace_property);
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c
|
||||||
|
index 6205ddd3ded0..843a669afd59 100644
|
||||||
|
--- a/drivers/gpu/drm/i915/display/intel_connector.c
|
||||||
|
+++ b/drivers/gpu/drm/i915/display/intel_connector.c
|
||||||
|
@@ -283,14 +283,14 @@ intel_attach_aspect_ratio_property(struct drm_connector *connector)
|
||||||
|
void
|
||||||
|
intel_attach_hdmi_colorspace_property(struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
- if (!drm_mode_create_hdmi_colorspace_property(connector))
|
||||||
|
+ if (!drm_mode_create_hdmi_colorspace_property(connector, 0xffffffff))
|
||||||
|
drm_connector_attach_colorspace_property(connector);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
intel_attach_dp_colorspace_property(struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
- if (!drm_mode_create_dp_colorspace_property(connector))
|
||||||
|
+ if (!drm_mode_create_dp_colorspace_property(connector, 0xffffffff))
|
||||||
|
drm_connector_attach_colorspace_property(connector);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
|
||||||
|
index 55744216392b..280d11648712 100644
|
||||||
|
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
|
||||||
|
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
|
||||||
|
@@ -618,7 +618,7 @@ static int vc4_hdmi_connector_init(struct drm_device *dev,
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
- ret = drm_mode_create_hdmi_colorspace_property(connector);
|
||||||
|
+ ret = drm_mode_create_hdmi_colorspace_property(connector, 0xffffffff);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
diff --git a/include/drm/display/drm_dp.h b/include/drm/display/drm_dp.h
|
||||||
|
index e934aab357be..4fc5120392e3 100644
|
||||||
|
--- a/include/drm/display/drm_dp.h
|
||||||
|
+++ b/include/drm/display/drm_dp.h
|
||||||
|
@@ -1617,7 +1617,7 @@ enum dp_pixelformat {
|
||||||
|
*
|
||||||
|
* This enum is used to indicate DP VSC SDP Colorimetry formats.
|
||||||
|
* It is based on DP 1.4 spec [Table 2-117: VSC SDP Payload for DB16 through
|
||||||
|
- * DB18] and a name of enum member follows DRM_MODE_COLORIMETRY definition.
|
||||||
|
+ * DB18] and a name of enum member follows &enum drm_colorimetry definition.
|
||||||
|
*
|
||||||
|
* @DP_COLORIMETRY_DEFAULT: sRGB (IEC 61966-2-1) or
|
||||||
|
* ITU-R BT.601 colorimetry format
|
||||||
|
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
|
||||||
|
index 565cf9d3c550..68f26a3ebb99 100644
|
||||||
|
--- a/include/drm/drm_connector.h
|
||||||
|
+++ b/include/drm/drm_connector.h
|
||||||
|
@@ -30,6 +30,7 @@
|
||||||
|
#include <linux/notifier.h>
|
||||||
|
#include <drm/drm_mode_object.h>
|
||||||
|
#include <drm/drm_util.h>
|
||||||
|
+#include <drm/drm_property.h>
|
||||||
|
|
||||||
|
#include <uapi/drm/drm_mode.h>
|
||||||
|
|
||||||
|
@@ -371,29 +372,30 @@ enum drm_privacy_screen_status {
|
||||||
|
* a colorspace property which will be created and exposed to
|
||||||
|
* userspace.
|
||||||
|
*/
|
||||||
|
-
|
||||||
|
-/* For Default case, driver will set the colorspace */
|
||||||
|
-#define DRM_MODE_COLORIMETRY_DEFAULT 0
|
||||||
|
-/* CEA 861 Normal Colorimetry options */
|
||||||
|
-#define DRM_MODE_COLORIMETRY_NO_DATA 0
|
||||||
|
-#define DRM_MODE_COLORIMETRY_SMPTE_170M_YCC 1
|
||||||
|
-#define DRM_MODE_COLORIMETRY_BT709_YCC 2
|
||||||
|
-/* CEA 861 Extended Colorimetry Options */
|
||||||
|
-#define DRM_MODE_COLORIMETRY_XVYCC_601 3
|
||||||
|
-#define DRM_MODE_COLORIMETRY_XVYCC_709 4
|
||||||
|
-#define DRM_MODE_COLORIMETRY_SYCC_601 5
|
||||||
|
-#define DRM_MODE_COLORIMETRY_OPYCC_601 6
|
||||||
|
-#define DRM_MODE_COLORIMETRY_OPRGB 7
|
||||||
|
-#define DRM_MODE_COLORIMETRY_BT2020_CYCC 8
|
||||||
|
-#define DRM_MODE_COLORIMETRY_BT2020_RGB 9
|
||||||
|
-#define DRM_MODE_COLORIMETRY_BT2020_YCC 10
|
||||||
|
-/* Additional Colorimetry extension added as part of CTA 861.G */
|
||||||
|
-#define DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 11
|
||||||
|
-#define DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER 12
|
||||||
|
-/* Additional Colorimetry Options added for DP 1.4a VSC Colorimetry Format */
|
||||||
|
-#define DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED 13
|
||||||
|
-#define DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT 14
|
||||||
|
-#define DRM_MODE_COLORIMETRY_BT601_YCC 15
|
||||||
|
+enum drm_colorspace {
|
||||||
|
+ /* For Default case, driver will set the colorspace */
|
||||||
|
+ DRM_MODE_COLORIMETRY_DEFAULT,
|
||||||
|
+ /* CEA 861 Normal Colorimetry options */
|
||||||
|
+ DRM_MODE_COLORIMETRY_SMPTE_170M_YCC,
|
||||||
|
+ DRM_MODE_COLORIMETRY_BT709_YCC,
|
||||||
|
+ /* CEA 861 Extended Colorimetry Options */
|
||||||
|
+ DRM_MODE_COLORIMETRY_XVYCC_601,
|
||||||
|
+ DRM_MODE_COLORIMETRY_XVYCC_709,
|
||||||
|
+ DRM_MODE_COLORIMETRY_SYCC_601,
|
||||||
|
+ DRM_MODE_COLORIMETRY_OPYCC_601,
|
||||||
|
+ DRM_MODE_COLORIMETRY_OPRGB,
|
||||||
|
+ DRM_MODE_COLORIMETRY_BT2020_CYCC,
|
||||||
|
+ DRM_MODE_COLORIMETRY_BT2020_RGB,
|
||||||
|
+ DRM_MODE_COLORIMETRY_BT2020_YCC,
|
||||||
|
+ /* Additional Colorimetry extension added as part of CTA 861.G */
|
||||||
|
+ DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65,
|
||||||
|
+ DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER,
|
||||||
|
+ /* Additional Colorimetry Options added for DP 1.4a VSC Colorimetry Format */
|
||||||
|
+ DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED,
|
||||||
|
+ DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT,
|
||||||
|
+ DRM_MODE_COLORIMETRY_BT601_YCC,
|
||||||
|
+ DRM_MODE_COLORIMETRY_MAX
|
||||||
|
+};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum drm_bus_flags - bus_flags info for &drm_display_info
|
||||||
|
@@ -828,7 +830,7 @@ struct drm_connector_state {
|
||||||
|
* colorspace change on Sink. This is most commonly used to switch
|
||||||
|
* to wider color gamuts like BT2020.
|
||||||
|
*/
|
||||||
|
- u32 colorspace;
|
||||||
|
+ enum drm_colorspace colorspace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @writeback_job: Writeback job for writeback connectors
|
||||||
|
@@ -1835,8 +1837,10 @@ int drm_connector_attach_hdr_output_metadata_property(struct drm_connector *conn
|
||||||
|
bool drm_connector_atomic_hdr_metadata_equal(struct drm_connector_state *old_state,
|
||||||
|
struct drm_connector_state *new_state);
|
||||||
|
int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
|
||||||
|
-int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector);
|
||||||
|
-int drm_mode_create_dp_colorspace_property(struct drm_connector *connector);
|
||||||
|
+int drm_mode_create_hdmi_colorspace_property(struct drm_connector *connector,
|
||||||
|
+ u32 supported_colorspaces);
|
||||||
|
+int drm_mode_create_dp_colorspace_property(struct drm_connector *connector,
|
||||||
|
+ u32 supported_colorspaces);
|
||||||
|
int drm_mode_create_content_type_property(struct drm_device *dev);
|
||||||
|
int drm_mode_create_suggested_offset_properties(struct drm_device *dev);
|
||||||
|
|
||||||
|
@@ -1919,6 +1923,7 @@ void drm_connector_list_iter_end(struct drm_connector_list_iter *iter);
|
||||||
|
|
||||||
|
bool drm_connector_has_possible_encoder(struct drm_connector *connector,
|
||||||
|
struct drm_encoder *encoder);
|
||||||
|
+const char *drm_get_colorspace_name(enum drm_colorspace colorspace);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_for_each_connector_iter - connector_list iterator macro
|
||||||
|
--
|
||||||
|
2.39.2
|
5
scripts/build.sh
Normal file
5
scripts/build.sh
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Pika Kernel - Building"
|
||||||
|
|
||||||
|
make -j`nproc` bindeb-pkg LOCALVERSION=-pikaos
|
59
scripts/config.sh
Normal file
59
scripts/config.sh
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Pika Kernel - Applying configuration"
|
||||||
|
|
||||||
|
cp ../config .config
|
||||||
|
|
||||||
|
scripts/config -k -e CONFIG_GENERIC_CPU
|
||||||
|
scripts/config -e CACHY
|
||||||
|
scripts/config -e SCHED_BORE
|
||||||
|
|
||||||
|
scripts/config -e HZ_300 --set-val HZ 1000
|
||||||
|
scripts/config -d HZ_PERIODIC -d NO_HZ_FULL -e NO_HZ_IDLE -e NO_HZ -e NO_HZ_COMMON
|
||||||
|
scripts/config -e PREEMPT_BUILD -d PREEMPT_NONE -d PREEMPT_VOLUNTARY -e PREEMPT -e PREEMPT_COUNT -e PREEMPTION -e PREEMPT_DYNAMIC
|
||||||
|
|
||||||
|
scripts/config -d CC_OPTIMIZE_FOR_PERFORMANCE \
|
||||||
|
-e CC_OPTIMIZE_FOR_PERFORMANCE_O3
|
||||||
|
|
||||||
|
scripts/config -m TCP_CONG_CUBIC \
|
||||||
|
-d DEFAULT_CUBIC \
|
||||||
|
-e TCP_CONG_BBR2 \
|
||||||
|
-e DEFAULT_BBR2 \
|
||||||
|
--set-str DEFAULT_TCP_CONG bbr2
|
||||||
|
|
||||||
|
scripts/config -e LRU_GEN -e LRU_GEN_ENABLED -d LRU_GEN_STATS
|
||||||
|
|
||||||
|
scripts/config -d TRANSPARENT_HUGEPAGE_ALWAYS -e TRANSPARENT_HUGEPAGE_MADVISE
|
||||||
|
|
||||||
|
scripts/config -e DAMON \
|
||||||
|
-e DAMON_VADDR \
|
||||||
|
-e DAMON_DBGFS \
|
||||||
|
-e DAMON_SYSFS \
|
||||||
|
-e DAMON_PADDR \
|
||||||
|
-e DAMON_RECLAIM \
|
||||||
|
-e DAMON_LRU_SORT
|
||||||
|
|
||||||
|
scripts/config -d ZRAM_DEF_COMP_LZORLE \
|
||||||
|
-e ZRAM_DEF_COMP_ZSTD \
|
||||||
|
--set-str ZRAM_DEF_COMP zstd \
|
||||||
|
-d ZSWAP_COMPRESSOR_DEFAULT_LZ4 \
|
||||||
|
-e ZSWAP_COMPRESSOR_DEFAULT_ZSTD \
|
||||||
|
--set-str ZSWAP_COMPRESSOR_DEFAULT zstd
|
||||||
|
|
||||||
|
scripts/config --set-val MODULE_COMPRESS_ZSTD_LEVEL 19 -e MODULE_COMPRESS_ZSTD_ULTRA --set-val MODULE_COMPRESS_ZSTD_LEVEL_ULTRA 22 --set-val ZSTD_COMP_VAL 22
|
||||||
|
|
||||||
|
scripts/config -e USER_NS
|
||||||
|
|
||||||
|
scripts/config -d DEBUG_INFO \
|
||||||
|
-d DEBUG_INFO_DWARF4 \
|
||||||
|
-d DEBUG_INFO_DWARF5 \
|
||||||
|
-d SLUB_DEBUG \
|
||||||
|
-d PM_DEBUG \
|
||||||
|
-d PM_ADVANCED_DEBUG \
|
||||||
|
-d PM_SLEEP_DEBUG \
|
||||||
|
-d ACPI_DEBUG \
|
||||||
|
-d SCHED_DEBUG \
|
||||||
|
-d LATENCYTOP \
|
||||||
|
-d DEBUG_PREEMPT
|
||||||
|
|
||||||
|
make prepare
|
8
scripts/output.sh
Normal file
8
scripts/output.sh
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Pika Kernel - Copying Output"
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
mkdir ./output
|
||||||
|
rm ./linux-libc*.deb
|
||||||
|
cp ./*.deb ./output/
|
13
scripts/patch.sh
Normal file
13
scripts/patch.sh
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Pika Kernel - Applying patches"
|
||||||
|
|
||||||
|
# Cachy patches are here: https://github.com/CachyOS/kernel-patches/
|
||||||
|
# orig patch from cachy - 0001-cachyos-base-all.patch
|
||||||
|
patch -Np1 < "../patches/0001-cachy-all.patch"
|
||||||
|
# orig patch from cachy - 0001-Add-latency-priority-for-CFS-class.patch
|
||||||
|
patch -Np1 < "../patches/0002-cfs-nice.patch"
|
||||||
|
# orig patch from cachy - 0001-bore-cachy.patch
|
||||||
|
patch -Np1 < "../patches/0003-bore.patch"
|
||||||
|
# HDR patch - from cachy (but they deleted it)
|
||||||
|
patch -Np1 < "../patches/0004-hdr.patch"
|
3
scripts/release.sh
Normal file
3
scripts/release.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Pika Kernel - Releasing Kernel"
|
8
scripts/source.sh
Normal file
8
scripts/source.sh
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "Pika Kernel - Getting source"
|
||||||
|
|
||||||
|
wget -nv https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.2.tar.gz
|
||||||
|
tar -zxf ./linux-6.2.tar.gz
|
||||||
|
|
||||||
|
cd linux-6.2
|
Loading…
Reference in New Issue
Block a user