mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
Merge 6bc6ee3111 ("dm-verity FEC: Fix RS FEC repair for roots unaligned to block size (take 2)") into android14-6.1-lts
Steps on the way to 6.1.125 Change-Id: Ieccad61be056146864583697928272b44736e432 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
int show_unhandled_signals = 1;
|
int show_unhandled_signals = 1;
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(die_lock);
|
static DEFINE_RAW_SPINLOCK(die_lock);
|
||||||
|
|
||||||
void die(struct pt_regs *regs, const char *str)
|
void die(struct pt_regs *regs, const char *str)
|
||||||
{
|
{
|
||||||
@@ -38,7 +38,7 @@ void die(struct pt_regs *regs, const char *str)
|
|||||||
|
|
||||||
oops_enter();
|
oops_enter();
|
||||||
|
|
||||||
spin_lock_irqsave(&die_lock, flags);
|
raw_spin_lock_irqsave(&die_lock, flags);
|
||||||
console_verbose();
|
console_verbose();
|
||||||
bust_spinlocks(1);
|
bust_spinlocks(1);
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ void die(struct pt_regs *regs, const char *str)
|
|||||||
|
|
||||||
bust_spinlocks(0);
|
bust_spinlocks(0);
|
||||||
add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
|
add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
|
||||||
spin_unlock_irqrestore(&die_lock, flags);
|
raw_spin_unlock_irqrestore(&die_lock, flags);
|
||||||
oops_exit();
|
oops_exit();
|
||||||
|
|
||||||
if (in_interrupt())
|
if (in_interrupt())
|
||||||
|
|||||||
@@ -439,6 +439,13 @@ static const struct dmi_system_id asus_laptop[] = {
|
|||||||
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
|
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Asus Vivobook X1504VAP */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "X1504VAP"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
/* Asus Vivobook X1704VAP */
|
/* Asus Vivobook X1704VAP */
|
||||||
.matches = {
|
.matches = {
|
||||||
@@ -615,6 +622,17 @@ static const struct dmi_system_id lg_laptop[] = {
|
|||||||
DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
|
DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* TongFang GM5HG0A in case of the SKIKK Vanaheim relabel the
|
||||||
|
* board-name is changed, so check OEM strings instead. Note
|
||||||
|
* OEM string matches are always exact matches.
|
||||||
|
* https://bugzilla.kernel.org/show_bug.cgi?id=219614
|
||||||
|
*/
|
||||||
|
.matches = {
|
||||||
|
DMI_EXACT_MATCH(DMI_OEM_STRING, "GM5HG0A"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ struct dmub_notification;
|
|||||||
|
|
||||||
#define DC_VER "3.2.207"
|
#define DC_VER "3.2.207"
|
||||||
|
|
||||||
#define MAX_SURFACES 3
|
#define MAX_SURFACES 4
|
||||||
#define MAX_PLANES 6
|
#define MAX_PLANES 6
|
||||||
#define MAX_STREAMS 6
|
#define MAX_STREAMS 6
|
||||||
#define MAX_SINKS_PER_LINK 4
|
#define MAX_SINKS_PER_LINK 4
|
||||||
|
|||||||
@@ -66,11 +66,15 @@ static inline double dml_max5(double a, double b, double c, double d, double e)
|
|||||||
|
|
||||||
static inline double dml_ceil(double a, double granularity)
|
static inline double dml_ceil(double a, double granularity)
|
||||||
{
|
{
|
||||||
|
if (granularity == 0)
|
||||||
|
return 0;
|
||||||
return (double) dcn_bw_ceil2(a, granularity);
|
return (double) dcn_bw_ceil2(a, granularity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline double dml_floor(double a, double granularity)
|
static inline double dml_floor(double a, double granularity)
|
||||||
{
|
{
|
||||||
|
if (granularity == 0)
|
||||||
|
return 0;
|
||||||
return (double) dcn_bw_floor2(a, granularity);
|
return (double) dcn_bw_floor2(a, granularity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,11 +118,15 @@ static inline double dml_ceil_2(double f)
|
|||||||
|
|
||||||
static inline double dml_ceil_ex(double x, double granularity)
|
static inline double dml_ceil_ex(double x, double granularity)
|
||||||
{
|
{
|
||||||
|
if (granularity == 0)
|
||||||
|
return 0;
|
||||||
return (double) dcn_bw_ceil2(x, granularity);
|
return (double) dcn_bw_ceil2(x, granularity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline double dml_floor_ex(double x, double granularity)
|
static inline double dml_floor_ex(double x, double granularity)
|
||||||
{
|
{
|
||||||
|
if (granularity == 0)
|
||||||
|
return 0;
|
||||||
return (double) dcn_bw_floor2(x, granularity);
|
return (double) dcn_bw_floor2(x, granularity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,14 +60,19 @@ static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio,
|
|||||||
* to the data block. Caller is responsible for releasing buf.
|
* to the data block. Caller is responsible for releasing buf.
|
||||||
*/
|
*/
|
||||||
static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index,
|
static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index,
|
||||||
unsigned int *offset, struct dm_buffer **buf)
|
unsigned int *offset, unsigned int par_buf_offset,
|
||||||
|
struct dm_buffer **buf)
|
||||||
{
|
{
|
||||||
u64 position, block, rem;
|
u64 position, block, rem;
|
||||||
u8 *res;
|
u8 *res;
|
||||||
|
|
||||||
|
/* We have already part of parity bytes read, skip to the next block */
|
||||||
|
if (par_buf_offset)
|
||||||
|
index++;
|
||||||
|
|
||||||
position = (index + rsb) * v->fec->roots;
|
position = (index + rsb) * v->fec->roots;
|
||||||
block = div64_u64_rem(position, v->fec->io_size, &rem);
|
block = div64_u64_rem(position, v->fec->io_size, &rem);
|
||||||
*offset = (unsigned int)rem;
|
*offset = par_buf_offset ? 0 : (unsigned int)rem;
|
||||||
|
|
||||||
res = dm_bufio_read(v->fec->bufio, block, buf);
|
res = dm_bufio_read(v->fec->bufio, block, buf);
|
||||||
if (IS_ERR(res)) {
|
if (IS_ERR(res)) {
|
||||||
@@ -127,10 +132,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio,
|
|||||||
{
|
{
|
||||||
int r, corrected = 0, res;
|
int r, corrected = 0, res;
|
||||||
struct dm_buffer *buf;
|
struct dm_buffer *buf;
|
||||||
unsigned int n, i, offset;
|
unsigned int n, i, offset, par_buf_offset = 0;
|
||||||
u8 *par, *block;
|
u8 *par, *block, par_buf[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
|
||||||
|
|
||||||
par = fec_read_parity(v, rsb, block_offset, &offset, &buf);
|
par = fec_read_parity(v, rsb, block_offset, &offset,
|
||||||
|
par_buf_offset, &buf);
|
||||||
if (IS_ERR(par))
|
if (IS_ERR(par))
|
||||||
return PTR_ERR(par);
|
return PTR_ERR(par);
|
||||||
|
|
||||||
@@ -140,7 +146,8 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio,
|
|||||||
*/
|
*/
|
||||||
fec_for_each_buffer_rs_block(fio, n, i) {
|
fec_for_each_buffer_rs_block(fio, n, i) {
|
||||||
block = fec_buffer_rs_block(v, fio, n, i);
|
block = fec_buffer_rs_block(v, fio, n, i);
|
||||||
res = fec_decode_rs8(v, fio, block, &par[offset], neras);
|
memcpy(&par_buf[par_buf_offset], &par[offset], v->fec->roots - par_buf_offset);
|
||||||
|
res = fec_decode_rs8(v, fio, block, par_buf, neras);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
r = res;
|
r = res;
|
||||||
goto error;
|
goto error;
|
||||||
@@ -153,12 +160,21 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio,
|
|||||||
if (block_offset >= 1 << v->data_dev_block_bits)
|
if (block_offset >= 1 << v->data_dev_block_bits)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* read the next block when we run out of parity bytes */
|
/* Read the next block when we run out of parity bytes */
|
||||||
offset += v->fec->roots;
|
offset += (v->fec->roots - par_buf_offset);
|
||||||
|
/* Check if parity bytes are split between blocks */
|
||||||
|
if (offset < v->fec->io_size && (offset + v->fec->roots) > v->fec->io_size) {
|
||||||
|
par_buf_offset = v->fec->io_size - offset;
|
||||||
|
memcpy(par_buf, &par[offset], par_buf_offset);
|
||||||
|
offset += par_buf_offset;
|
||||||
|
} else
|
||||||
|
par_buf_offset = 0;
|
||||||
|
|
||||||
if (offset >= v->fec->io_size) {
|
if (offset >= v->fec->io_size) {
|
||||||
dm_bufio_release(buf);
|
dm_bufio_release(buf);
|
||||||
|
|
||||||
par = fec_read_parity(v, rsb, block_offset, &offset, &buf);
|
par = fec_read_parity(v, rsb, block_offset, &offset,
|
||||||
|
par_buf_offset, &buf);
|
||||||
if (IS_ERR(par))
|
if (IS_ERR(par))
|
||||||
return PTR_ERR(par);
|
return PTR_ERR(par);
|
||||||
}
|
}
|
||||||
@@ -743,10 +759,7 @@ int verity_fec_ctr(struct dm_verity *v)
|
|||||||
return -E2BIG;
|
return -E2BIG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((f->roots << SECTOR_SHIFT) & ((1 << v->data_dev_block_bits) - 1))
|
f->io_size = 1 << v->data_dev_block_bits;
|
||||||
f->io_size = 1 << v->data_dev_block_bits;
|
|
||||||
else
|
|
||||||
f->io_size = v->fec->roots << SECTOR_SHIFT;
|
|
||||||
|
|
||||||
f->bufio = dm_bufio_client_create(f->dev->bdev,
|
f->bufio = dm_bufio_client_create(f->dev->bdev,
|
||||||
f->io_size,
|
f->io_size,
|
||||||
|
|||||||
@@ -315,6 +315,7 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
of_node_put(sensor_specs.np);
|
||||||
if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ?
|
if ((sensor == sensor_specs.np) && id == (sensor_specs.args_count ?
|
||||||
sensor_specs.args[0] : 0)) {
|
sensor_specs.args[0] : 0)) {
|
||||||
pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, child);
|
pr_debug("sensor %pOFn id=%d belongs to %pOFn\n", sensor, id, child);
|
||||||
|
|||||||
@@ -380,7 +380,8 @@ static struct ctl_table sctp_net_table[] = {
|
|||||||
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
|
static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
|
||||||
void *buffer, size_t *lenp, loff_t *ppos)
|
void *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = container_of(ctl->data, struct net,
|
||||||
|
sctp.sctp_hmac_alg);
|
||||||
struct ctl_table tbl;
|
struct ctl_table tbl;
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
char *none = "none";
|
char *none = "none";
|
||||||
@@ -425,7 +426,7 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl, int write,
|
|||||||
static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
|
static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
|
||||||
void *buffer, size_t *lenp, loff_t *ppos)
|
void *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = container_of(ctl->data, struct net, sctp.rto_min);
|
||||||
unsigned int min = *(unsigned int *) ctl->extra1;
|
unsigned int min = *(unsigned int *) ctl->extra1;
|
||||||
unsigned int max = *(unsigned int *) ctl->extra2;
|
unsigned int max = *(unsigned int *) ctl->extra2;
|
||||||
struct ctl_table tbl;
|
struct ctl_table tbl;
|
||||||
@@ -453,7 +454,7 @@ static int proc_sctp_do_rto_min(struct ctl_table *ctl, int write,
|
|||||||
static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
|
static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
|
||||||
void *buffer, size_t *lenp, loff_t *ppos)
|
void *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = container_of(ctl->data, struct net, sctp.rto_max);
|
||||||
unsigned int min = *(unsigned int *) ctl->extra1;
|
unsigned int min = *(unsigned int *) ctl->extra1;
|
||||||
unsigned int max = *(unsigned int *) ctl->extra2;
|
unsigned int max = *(unsigned int *) ctl->extra2;
|
||||||
struct ctl_table tbl;
|
struct ctl_table tbl;
|
||||||
@@ -491,7 +492,7 @@ static int proc_sctp_do_alpha_beta(struct ctl_table *ctl, int write,
|
|||||||
static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
|
static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
|
||||||
void *buffer, size_t *lenp, loff_t *ppos)
|
void *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = container_of(ctl->data, struct net, sctp.auth_enable);
|
||||||
struct ctl_table tbl;
|
struct ctl_table tbl;
|
||||||
int new_value, ret;
|
int new_value, ret;
|
||||||
|
|
||||||
@@ -520,7 +521,7 @@ static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
|
|||||||
static int proc_sctp_do_udp_port(struct ctl_table *ctl, int write,
|
static int proc_sctp_do_udp_port(struct ctl_table *ctl, int write,
|
||||||
void *buffer, size_t *lenp, loff_t *ppos)
|
void *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = container_of(ctl->data, struct net, sctp.udp_port);
|
||||||
unsigned int min = *(unsigned int *)ctl->extra1;
|
unsigned int min = *(unsigned int *)ctl->extra1;
|
||||||
unsigned int max = *(unsigned int *)ctl->extra2;
|
unsigned int max = *(unsigned int *)ctl->extra2;
|
||||||
struct ctl_table tbl;
|
struct ctl_table tbl;
|
||||||
@@ -561,7 +562,8 @@ static int proc_sctp_do_udp_port(struct ctl_table *ctl, int write,
|
|||||||
static int proc_sctp_do_probe_interval(struct ctl_table *ctl, int write,
|
static int proc_sctp_do_probe_interval(struct ctl_table *ctl, int write,
|
||||||
void *buffer, size_t *lenp, loff_t *ppos)
|
void *buffer, size_t *lenp, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = container_of(ctl->data, struct net,
|
||||||
|
sctp.probe_interval);
|
||||||
struct ctl_table tbl;
|
struct ctl_table tbl;
|
||||||
int ret, new_value;
|
int ret, new_value;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user