mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 07:41:42 +01:00
lib: sbi_tlb: Reduce size of struct sbi_tlb_info
Let us reduce the size of struct sbi_tlb_info by doing the following: 1) Change the data type of asid and vmid fields to uint16_t 2) Replace local_fn() function pointer with an enum Based on the above, the size of struct sbi_tlb_info is reduced by 16 bytes on RV64 and 4 bytes on RV32. Signed-off-by: Anup Patel <apatel@ventanamicro.com>
This commit is contained in:
@@ -22,30 +22,33 @@
|
|||||||
|
|
||||||
struct sbi_scratch;
|
struct sbi_scratch;
|
||||||
|
|
||||||
|
enum sbi_tlb_type {
|
||||||
|
SBI_TLB_FENCE_I = 0,
|
||||||
|
SBI_TLB_SFENCE_VMA,
|
||||||
|
SBI_TLB_SFENCE_VMA_ASID,
|
||||||
|
SBI_TLB_HFENCE_GVMA_VMID,
|
||||||
|
SBI_TLB_HFENCE_GVMA,
|
||||||
|
SBI_TLB_HFENCE_VVMA_ASID,
|
||||||
|
SBI_TLB_HFENCE_VVMA,
|
||||||
|
SBI_TLB_TYPE_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
struct sbi_tlb_info {
|
struct sbi_tlb_info {
|
||||||
unsigned long start;
|
unsigned long start;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
unsigned long asid;
|
uint16_t asid;
|
||||||
unsigned long vmid;
|
uint16_t vmid;
|
||||||
void (*local_fn)(struct sbi_tlb_info *tinfo);
|
enum sbi_tlb_type type;
|
||||||
struct sbi_hartmask smask;
|
struct sbi_hartmask smask;
|
||||||
};
|
};
|
||||||
|
|
||||||
void sbi_tlb_local_hfence_vvma(struct sbi_tlb_info *tinfo);
|
#define SBI_TLB_INFO_INIT(__p, __start, __size, __asid, __vmid, __type, __src) \
|
||||||
void sbi_tlb_local_hfence_gvma(struct sbi_tlb_info *tinfo);
|
|
||||||
void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo);
|
|
||||||
void sbi_tlb_local_hfence_vvma_asid(struct sbi_tlb_info *tinfo);
|
|
||||||
void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo);
|
|
||||||
void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo);
|
|
||||||
void sbi_tlb_local_fence_i(struct sbi_tlb_info *tinfo);
|
|
||||||
|
|
||||||
#define SBI_TLB_INFO_INIT(__p, __start, __size, __asid, __vmid, __lfn, __src) \
|
|
||||||
do { \
|
do { \
|
||||||
(__p)->start = (__start); \
|
(__p)->start = (__start); \
|
||||||
(__p)->size = (__size); \
|
(__p)->size = (__size); \
|
||||||
(__p)->asid = (__asid); \
|
(__p)->asid = (__asid); \
|
||||||
(__p)->vmid = (__vmid); \
|
(__p)->vmid = (__vmid); \
|
||||||
(__p)->local_fn = (__lfn); \
|
(__p)->type = (__type); \
|
||||||
SBI_HARTMASK_INIT_EXCEPT(&(__p)->smask, (__src)); \
|
SBI_HARTMASK_INIT_EXCEPT(&(__p)->smask, (__src)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@@ -80,8 +80,7 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
&hmask, out_trap);
|
&hmask, out_trap);
|
||||||
if (ret != SBI_ETRAP) {
|
if (ret != SBI_ETRAP) {
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
|
||||||
sbi_tlb_local_fence_i,
|
SBI_TLB_FENCE_I, source_hart);
|
||||||
source_hart);
|
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -90,8 +89,7 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
&hmask, out_trap);
|
&hmask, out_trap);
|
||||||
if (ret != SBI_ETRAP) {
|
if (ret != SBI_ETRAP) {
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a1, regs->a2, 0, 0,
|
||||||
sbi_tlb_local_sfence_vma,
|
SBI_TLB_SFENCE_VMA, source_hart);
|
||||||
source_hart);
|
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -101,7 +99,7 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid,
|
|||||||
if (ret != SBI_ETRAP) {
|
if (ret != SBI_ETRAP) {
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a1,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a1,
|
||||||
regs->a2, regs->a3, 0,
|
regs->a2, regs->a3, 0,
|
||||||
sbi_tlb_local_sfence_vma_asid,
|
SBI_TLB_SFENCE_VMA_ASID,
|
||||||
source_hart);
|
source_hart);
|
||||||
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
ret = sbi_tlb_request(hmask, 0, &tlb_info);
|
||||||
}
|
}
|
||||||
|
@@ -33,43 +33,41 @@ static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid,
|
|||||||
switch (funcid) {
|
switch (funcid) {
|
||||||
case SBI_EXT_RFENCE_REMOTE_FENCE_I:
|
case SBI_EXT_RFENCE_REMOTE_FENCE_I:
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0,
|
||||||
sbi_tlb_local_fence_i, source_hart);
|
SBI_TLB_FENCE_I, source_hart);
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA:
|
case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA:
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0,
|
||||||
sbi_tlb_local_hfence_gvma, source_hart);
|
SBI_TLB_HFENCE_GVMA, source_hart);
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID:
|
case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID:
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4,
|
||||||
sbi_tlb_local_hfence_gvma_vmid,
|
SBI_TLB_HFENCE_GVMA_VMID, source_hart);
|
||||||
source_hart);
|
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA:
|
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA:
|
||||||
vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK);
|
vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK);
|
||||||
vmid = vmid >> HGATP_VMID_SHIFT;
|
vmid = vmid >> HGATP_VMID_SHIFT;
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid,
|
||||||
sbi_tlb_local_hfence_vvma, source_hart);
|
SBI_TLB_HFENCE_VVMA, source_hart);
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID:
|
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID:
|
||||||
vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK);
|
vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK);
|
||||||
vmid = vmid >> HGATP_VMID_SHIFT;
|
vmid = vmid >> HGATP_VMID_SHIFT;
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4,
|
||||||
vmid, sbi_tlb_local_hfence_vvma_asid,
|
vmid, SBI_TLB_HFENCE_VVMA_ASID, source_hart);
|
||||||
source_hart);
|
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA:
|
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA:
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0,
|
||||||
sbi_tlb_local_sfence_vma, source_hart);
|
SBI_TLB_SFENCE_VMA, source_hart);
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID:
|
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID:
|
||||||
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0,
|
SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0,
|
||||||
sbi_tlb_local_sfence_vma_asid, source_hart);
|
SBI_TLB_SFENCE_VMA_ASID, source_hart);
|
||||||
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -34,7 +34,7 @@ static void tlb_flush_all(void)
|
|||||||
__asm__ __volatile("sfence.vma");
|
__asm__ __volatile("sfence.vma");
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_hfence_vvma(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_hfence_vvma(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
unsigned long start = tinfo->start;
|
unsigned long start = tinfo->start;
|
||||||
unsigned long size = tinfo->size;
|
unsigned long size = tinfo->size;
|
||||||
@@ -59,7 +59,7 @@ done:
|
|||||||
csr_write(CSR_HGATP, hgatp);
|
csr_write(CSR_HGATP, hgatp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_hfence_gvma(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_hfence_gvma(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
unsigned long start = tinfo->start;
|
unsigned long start = tinfo->start;
|
||||||
unsigned long size = tinfo->size;
|
unsigned long size = tinfo->size;
|
||||||
@@ -77,7 +77,7 @@ void sbi_tlb_local_hfence_gvma(struct sbi_tlb_info *tinfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
unsigned long start = tinfo->start;
|
unsigned long start = tinfo->start;
|
||||||
unsigned long size = tinfo->size;
|
unsigned long size = tinfo->size;
|
||||||
@@ -98,7 +98,7 @@ void sbi_tlb_local_sfence_vma(struct sbi_tlb_info *tinfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_hfence_vvma_asid(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_hfence_vvma_asid(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
unsigned long start = tinfo->start;
|
unsigned long start = tinfo->start;
|
||||||
unsigned long size = tinfo->size;
|
unsigned long size = tinfo->size;
|
||||||
@@ -124,7 +124,7 @@ done:
|
|||||||
csr_write(CSR_HGATP, hgatp);
|
csr_write(CSR_HGATP, hgatp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
unsigned long start = tinfo->start;
|
unsigned long start = tinfo->start;
|
||||||
unsigned long size = tinfo->size;
|
unsigned long size = tinfo->size;
|
||||||
@@ -143,7 +143,7 @@ void sbi_tlb_local_hfence_gvma_vmid(struct sbi_tlb_info *tinfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
unsigned long start = tinfo->start;
|
unsigned long start = tinfo->start;
|
||||||
unsigned long size = tinfo->size;
|
unsigned long size = tinfo->size;
|
||||||
@@ -169,32 +169,43 @@ void sbi_tlb_local_sfence_vma_asid(struct sbi_tlb_info *tinfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sbi_tlb_local_fence_i(struct sbi_tlb_info *tinfo)
|
static void sbi_tlb_local_fence_i(struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_FENCE_I_RECVD);
|
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_FENCE_I_RECVD);
|
||||||
|
|
||||||
__asm__ __volatile("fence.i");
|
__asm__ __volatile("fence.i");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tlb_pmu_incr_fw_ctr(struct sbi_tlb_info *data)
|
static void tlb_entry_local_process(struct sbi_tlb_info *data)
|
||||||
{
|
{
|
||||||
if (unlikely(!data))
|
if (unlikely(!data))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (data->local_fn == sbi_tlb_local_fence_i)
|
switch (data->type) {
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_FENCE_I_SENT);
|
case SBI_TLB_FENCE_I:
|
||||||
else if (data->local_fn == sbi_tlb_local_sfence_vma)
|
sbi_tlb_local_fence_i(data);
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_SFENCE_VMA_SENT);
|
break;
|
||||||
else if (data->local_fn == sbi_tlb_local_sfence_vma_asid)
|
case SBI_TLB_SFENCE_VMA:
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_SFENCE_VMA_ASID_SENT);
|
sbi_tlb_local_sfence_vma(data);
|
||||||
else if (data->local_fn == sbi_tlb_local_hfence_gvma)
|
break;
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_GVMA_SENT);
|
case SBI_TLB_SFENCE_VMA_ASID:
|
||||||
else if (data->local_fn == sbi_tlb_local_hfence_gvma_vmid)
|
sbi_tlb_local_sfence_vma_asid(data);
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_GVMA_VMID_SENT);
|
break;
|
||||||
else if (data->local_fn == sbi_tlb_local_hfence_vvma)
|
case SBI_TLB_HFENCE_GVMA_VMID:
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_VVMA_SENT);
|
sbi_tlb_local_hfence_gvma_vmid(data);
|
||||||
else if (data->local_fn == sbi_tlb_local_hfence_vvma_asid)
|
break;
|
||||||
sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_VVMA_ASID_SENT);
|
case SBI_TLB_HFENCE_GVMA:
|
||||||
|
sbi_tlb_local_hfence_gvma(data);
|
||||||
|
break;
|
||||||
|
case SBI_TLB_HFENCE_VVMA_ASID:
|
||||||
|
sbi_tlb_local_hfence_vvma_asid(data);
|
||||||
|
break;
|
||||||
|
case SBI_TLB_HFENCE_VVMA:
|
||||||
|
sbi_tlb_local_hfence_vvma(data);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tlb_entry_process(struct sbi_tlb_info *tinfo)
|
static void tlb_entry_process(struct sbi_tlb_info *tinfo)
|
||||||
@@ -203,7 +214,7 @@ static void tlb_entry_process(struct sbi_tlb_info *tinfo)
|
|||||||
struct sbi_scratch *rscratch = NULL;
|
struct sbi_scratch *rscratch = NULL;
|
||||||
atomic_t *rtlb_sync = NULL;
|
atomic_t *rtlb_sync = NULL;
|
||||||
|
|
||||||
tinfo->local_fn(tinfo);
|
tlb_entry_local_process(tinfo);
|
||||||
|
|
||||||
sbi_hartmask_for_each_hartindex(rindex, &tinfo->smask) {
|
sbi_hartmask_for_each_hartindex(rindex, &tinfo->smask) {
|
||||||
rscratch = sbi_hartindex_to_scratch(rindex);
|
rscratch = sbi_hartindex_to_scratch(rindex);
|
||||||
@@ -305,12 +316,12 @@ static int tlb_update_cb(void *in, void *data)
|
|||||||
curr = (struct sbi_tlb_info *)data;
|
curr = (struct sbi_tlb_info *)data;
|
||||||
next = (struct sbi_tlb_info *)in;
|
next = (struct sbi_tlb_info *)in;
|
||||||
|
|
||||||
if (next->local_fn == sbi_tlb_local_sfence_vma_asid &&
|
if (next->type == SBI_TLB_SFENCE_VMA_ASID &&
|
||||||
curr->local_fn == sbi_tlb_local_sfence_vma_asid) {
|
curr->type == SBI_TLB_SFENCE_VMA_ASID) {
|
||||||
if (next->asid == curr->asid)
|
if (next->asid == curr->asid)
|
||||||
ret = tlb_range_check(curr, next);
|
ret = tlb_range_check(curr, next);
|
||||||
} else if (next->local_fn == sbi_tlb_local_sfence_vma &&
|
} else if (next->type == SBI_TLB_SFENCE_VMA &&
|
||||||
curr->local_fn == sbi_tlb_local_sfence_vma) {
|
curr->type == SBI_TLB_SFENCE_VMA) {
|
||||||
ret = tlb_range_check(curr, next);
|
ret = tlb_range_check(curr, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,7 +343,7 @@ static int tlb_update(struct sbi_scratch *scratch,
|
|||||||
* then just do a local flush and return;
|
* then just do a local flush and return;
|
||||||
*/
|
*/
|
||||||
if (sbi_hartindex_to_hartid(remote_hartindex) == curr_hartid) {
|
if (sbi_hartindex_to_hartid(remote_hartindex) == curr_hartid) {
|
||||||
tinfo->local_fn(tinfo);
|
tlb_entry_local_process(tinfo);
|
||||||
return SBI_IPI_UPDATE_BREAK;
|
return SBI_IPI_UPDATE_BREAK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,9 +381,19 @@ static struct sbi_ipi_event_ops tlb_ops = {
|
|||||||
|
|
||||||
static u32 tlb_event = SBI_IPI_EVENT_MAX;
|
static u32 tlb_event = SBI_IPI_EVENT_MAX;
|
||||||
|
|
||||||
|
static const u32 tlb_type_to_pmu_fw_event[SBI_TLB_TYPE_MAX] = {
|
||||||
|
[SBI_TLB_FENCE_I] = SBI_PMU_FW_FENCE_I_SENT,
|
||||||
|
[SBI_TLB_SFENCE_VMA] = SBI_PMU_FW_SFENCE_VMA_SENT,
|
||||||
|
[SBI_TLB_SFENCE_VMA_ASID] = SBI_PMU_FW_SFENCE_VMA_ASID_SENT,
|
||||||
|
[SBI_TLB_HFENCE_GVMA_VMID] = SBI_PMU_FW_HFENCE_GVMA_VMID_SENT,
|
||||||
|
[SBI_TLB_HFENCE_GVMA] = SBI_PMU_FW_HFENCE_GVMA_SENT,
|
||||||
|
[SBI_TLB_HFENCE_VVMA_ASID] = SBI_PMU_FW_HFENCE_VVMA_ASID_SENT,
|
||||||
|
[SBI_TLB_HFENCE_VVMA] = SBI_PMU_FW_HFENCE_VVMA_SENT,
|
||||||
|
};
|
||||||
|
|
||||||
int sbi_tlb_request(ulong hmask, ulong hbase, struct sbi_tlb_info *tinfo)
|
int sbi_tlb_request(ulong hmask, ulong hbase, struct sbi_tlb_info *tinfo)
|
||||||
{
|
{
|
||||||
if (!tinfo->local_fn)
|
if (tinfo->type < 0 || tinfo->type >= SBI_TLB_TYPE_MAX)
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -385,7 +406,7 @@ int sbi_tlb_request(ulong hmask, ulong hbase, struct sbi_tlb_info *tinfo)
|
|||||||
tinfo->size = SBI_TLB_FLUSH_ALL;
|
tinfo->size = SBI_TLB_FLUSH_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tlb_pmu_incr_fw_ctr(tinfo);
|
sbi_pmu_ctr_incr_fw(tlb_type_to_pmu_fw_event[tinfo->type]);
|
||||||
|
|
||||||
return sbi_ipi_send_many(hmask, hbase, tlb_event, tinfo);
|
return sbi_ipi_send_many(hmask, hbase, tlb_event, tinfo);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user