Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #include <linux/percpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <linux/preempt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <asm/msr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #define CREATE_TRACE_POINTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <asm/msr-trace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) struct msr *msrs_alloc(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 	struct msr *msrs = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 	msrs = alloc_percpu(struct msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	if (!msrs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 		pr_warn("%s: error allocating msrs\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	return msrs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) EXPORT_SYMBOL(msrs_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) void msrs_free(struct msr *msrs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	free_percpu(msrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) EXPORT_SYMBOL(msrs_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  * Read an MSR with error handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * @msr: MSR to read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  * @m: value to read into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  * It returns read data only on success, otherwise it doesn't change the output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * argument @m.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) int msr_read(u32 msr, struct msr *m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	u64 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	err = rdmsrl_safe(msr, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		m->q = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * Write an MSR with error handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)  * @msr: MSR to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55)  * @m: value to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) int msr_write(u32 msr, struct msr *m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	return wrmsrl_safe(msr, m->q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) static inline int __flip_bit(u32 msr, u8 bit, bool set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	struct msr m, m1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	int err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	if (bit > 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	err = msr_read(msr, &m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	m1 = m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		m1.q |=  BIT_64(bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		m1.q &= ~BIT_64(bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	if (m1.q == m.q)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	err = msr_write(msr, &m1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  * Set @bit in a MSR @msr.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)  * Retval:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)  * < 0: An error was encountered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)  * = 0: Bit was already set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)  * > 0: Hardware accepted the MSR write.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) int msr_set_bit(u32 msr, u8 bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	return __flip_bit(msr, bit, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)  * Clear @bit in a MSR @msr.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)  * Retval:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)  * < 0: An error was encountered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)  * = 0: Bit was already cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)  * > 0: Hardware accepted the MSR write.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int msr_clear_bit(u32 msr, u8 bit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	return __flip_bit(msr, bit, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #ifdef CONFIG_TRACEPOINTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) void do_trace_write_msr(unsigned int msr, u64 val, int failed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	trace_write_msr(msr, val, failed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) EXPORT_SYMBOL(do_trace_write_msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) EXPORT_TRACEPOINT_SYMBOL(write_msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) void do_trace_read_msr(unsigned int msr, u64 val, int failed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	trace_read_msr(msr, val, failed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) EXPORT_SYMBOL(do_trace_read_msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) EXPORT_TRACEPOINT_SYMBOL(read_msr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) void do_trace_rdpmc(unsigned counter, u64 val, int failed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	trace_rdpmc(counter, val, failed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) EXPORT_SYMBOL(do_trace_rdpmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) EXPORT_TRACEPOINT_SYMBOL(rdpmc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #endif