Skip to content

Commit 3da2b0d

Browse files
bibo-maochenhuacai
authored andcommitted
LoongArch: KVM: Access mailbox directly in mail_send()
With function mail_send(), it is to write mailbox of other VCPUs. Existing simple APIs read_mailbox()/write_mailbox() can be used directly rather than send command on IOCSR address. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
1 parent 1cf7b28 commit 3da2b0d

1 file changed

Lines changed: 28 additions & 17 deletions

File tree

  • arch/loongarch/kvm/intc

arch/loongarch/kvm/intc/ipi.c

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,34 @@ static void write_mailbox(struct kvm_vcpu *vcpu, int offset, uint64_t data, int
101101
spin_unlock(&vcpu->arch.ipi_state.lock);
102102
}
103103

104+
static int mail_send(struct kvm *kvm, uint64_t data)
105+
{
106+
int i, cpu, mailbox, offset;
107+
uint32_t val = 0, mask = 0;
108+
struct kvm_vcpu *vcpu;
109+
110+
cpu = ((data & 0xffffffff) >> 16) & 0x3ff;
111+
vcpu = kvm_get_vcpu_by_cpuid(kvm, cpu);
112+
if (unlikely(vcpu == NULL)) {
113+
kvm_err("%s: invalid target cpu: %d\n", __func__, cpu);
114+
return -EINVAL;
115+
}
116+
mailbox = ((data & 0xffffffff) >> 2) & 0x7;
117+
offset = IOCSR_IPI_BUF_20 + mailbox * 4;
118+
if ((data >> 27) & 0xf) {
119+
val = read_mailbox(vcpu, offset, 4);
120+
for (i = 0; i < 4; i++)
121+
if (data & (BIT(27 + i)))
122+
mask |= (0xff << (i * 8));
123+
val &= mask;
124+
}
125+
126+
val |= ((uint32_t)(data >> 32) & ~mask);
127+
write_mailbox(vcpu, offset, val, 4);
128+
129+
return 0;
130+
}
131+
104132
static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data)
105133
{
106134
int i, idx, ret;
@@ -137,23 +165,6 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data)
137165
return ret;
138166
}
139167

140-
static int mail_send(struct kvm *kvm, uint64_t data)
141-
{
142-
int cpu, mailbox, offset;
143-
struct kvm_vcpu *vcpu;
144-
145-
cpu = ((data & 0xffffffff) >> 16) & 0x3ff;
146-
vcpu = kvm_get_vcpu_by_cpuid(kvm, cpu);
147-
if (unlikely(vcpu == NULL)) {
148-
kvm_err("%s: invalid target cpu: %d\n", __func__, cpu);
149-
return -EINVAL;
150-
}
151-
mailbox = ((data & 0xffffffff) >> 2) & 0x7;
152-
offset = IOCSR_IPI_BASE + IOCSR_IPI_BUF_20 + mailbox * 4;
153-
154-
return send_ipi_data(vcpu, offset, data);
155-
}
156-
157168
static int any_send(struct kvm *kvm, uint64_t data)
158169
{
159170
int cpu, offset;

0 commit comments

Comments
 (0)