[RFC PATCH v3 1/5] lib: sbi: Rename map_range/unmap_range functions
Rahul Pathak <[email protected]>
| Newsgroups | org.infradead.lists.opensbi |
|---|---|
| Message-ID | <[email protected]> |
*_map_range and *_unmap_range functions are required in M-Mode to get the temporary access to S-Mode and U-Mode regions. Thse functions only operate using the TYPE_MEMORY memory protection mechanisms. Rename them to reflect the actual usage of these functions and let generic map/unmap_range names to implement generic functions Signed-off-by: Rahul Pathak <[email protected]> --- include/sbi/sbi_hart_protection.h | 27 ++++++++++++++++----------- lib/sbi/sbi_dbtr.c | 26 +++++++++++++------------- lib/sbi/sbi_ecall_dbcn.c | 4 ++-- lib/sbi/sbi_hart_pmp.c | 10 +++++----- lib/sbi/sbi_hart_protection.c | 12 ++++++------ lib/sbi/sbi_mpxy.c | 24 ++++++++++++------------ lib/sbi/sbi_pmu.c | 4 ++-- lib/sbi/sbi_sse.c | 8 ++++---- 8 files changed, 60 insertions(+), 55 deletions(-) diff --git a/include/sbi/sbi_hart_protection.h b/include/sbi/sbi_hart_protection.h index cafe6ee7..bdcad008 100644 --- a/include/sbi/sbi_hart_protection.h +++ b/include/sbi/sbi_hart_protection.h @@ -40,13 +40,17 @@ struct sbi_hart_protection { /** Unconfigure protection for current HART (Optional) */ void (*unconfigure)(struct sbi_scratch *scratch, struct sbi_domain *dom); - /** Create temporary mapping to access address range on current HART (Optional) */ - int (*map_range)(struct sbi_scratch *scratch, - unsigned long base, unsigned long size); - - /** Destroy temporary mapping on current HART (Optional) */ - int (*unmap_range)(struct sbi_scratch *scratch, - unsigned long base, unsigned long size); + /** + * Give temporary M-mode access to an S/U-mode address range on current + * HART (Optional). Only applicable for the TYPE_MEMORY and the TYPE_ID + * mechanisms are not invoked. + */ + int (*temp_map_range)(struct sbi_scratch *scratch, + unsigned long base, unsigned long size); + + /** Remove the temporary M-mode access on the current HART (Optional) */ + int (*temp_unmap_range)(struct sbi_scratch *scratch, + unsigned long base, unsigned long size); }; /** @@ -111,23 +115,24 @@ int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch, struct sbi_domain *next_dom); /** - * Create temporary mapping to access address range on current HART + * Give temporary M-mode access to an S/U-mode address range on the + * current HART. Only valid for TYPE_MEMORY. * * @param base base address of the temporary mapping * @param size size of the temporary mapping * * @return 0 on success and negative error code on failure */ -int sbi_hart_protection_map_range(unsigned long base, unsigned long size); +int sbi_hart_protection_temp_map_range(unsigned long base, unsigned long size); /** - * Destroy temporary mapping to access address range on current HART + * Remove the temporary M-mode access on the current HART * * @param base base address of the temporary mapping * @param size size of the temporary mapping * * @return 0 on success and negative error code on failure */ -int sbi_hart_protection_unmap_range(unsigned long base, unsigned long size); +int sbi_hart_protection_temp_unmap_range(unsigned long base, unsigned long size); #endif /* __SBI_HART_PROTECTION_H__ */ diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c index 01047969..afa8232f 100644 --- a/lib/sbi/sbi_dbtr.c +++ b/lib/sbi/sbi_dbtr.c @@ -580,7 +580,7 @@ int sbi_dbtr_read_trig(unsigned long smode, shmem_base = hart_shmem_base(hs); - sbi_hart_protection_map_range((unsigned long)shmem_base, + sbi_hart_protection_temp_map_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) { xmit = &entry->data; @@ -594,7 +594,7 @@ int sbi_dbtr_read_trig(unsigned long smode, xmit->tdata2 = cpu_to_lle(trig->tdata2); xmit->tdata3 = cpu_to_lle(trig->tdata3); } - sbi_hart_protection_unmap_range((unsigned long)shmem_base, + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); return SBI_SUCCESS; @@ -620,7 +620,7 @@ int sbi_dbtr_install_trig(unsigned long smode, return SBI_ERR_NO_SHMEM; shmem_base = hart_shmem_base(hs); - sbi_hart_protection_map_range((unsigned long)shmem_base, + sbi_hart_protection_temp_map_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); /* @@ -639,14 +639,14 @@ int sbi_dbtr_install_trig(unsigned long smode, if (!dbtr_trigger_supported(TDATA1_GET_TYPE(ctrl))) { *out = _idx; - sbi_hart_protection_unmap_range((unsigned long)shmem_base, + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); return SBI_ERR_FAILED; } if (!dbtr_trigger_valid(TDATA1_GET_TYPE(ctrl), ctrl)) { *out = _idx; - sbi_hart_protection_unmap_range((unsigned long)shmem_base, + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); return SBI_ERR_FAILED; } @@ -654,7 +654,7 @@ int sbi_dbtr_install_trig(unsigned long smode, if ((recv->tdata2 && !tdata2_impl) || (recv->tdata3 && !tdata3_impl)) { *out = _idx; - sbi_hart_protection_unmap_range((unsigned long)shmem_base, + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); return SBI_ERR_NOT_SUPPORTED; } @@ -662,7 +662,7 @@ int sbi_dbtr_install_trig(unsigned long smode, if (hs->available_trigs < trig_count) { *out = hs->available_trigs; - sbi_hart_protection_unmap_range((unsigned long)shmem_base, + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); return SBI_ERR_FAILED; } @@ -684,7 +684,7 @@ int sbi_dbtr_install_trig(unsigned long smode, } - sbi_hart_protection_unmap_range((unsigned long)shmem_base, + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, trig_count * sizeof(*entry)); return SBI_SUCCESS; @@ -768,29 +768,29 @@ int sbi_dbtr_update_trig(unsigned long smode, tdata3_impl = tdata_implemented(CSR_TDATA3); for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) { - sbi_hart_protection_map_range((unsigned long)entry, sizeof(*entry)); + sbi_hart_protection_temp_map_range((unsigned long)entry, sizeof(*entry)); trig_idx = entry->id.idx; if (trig_idx >= hs->total_trigs) { - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry)); + sbi_hart_protection_temp_unmap_range((unsigned long)entry, sizeof(*entry)); return SBI_ERR_INVALID_PARAM; } trig = INDEX_TO_TRIGGER(trig_idx); if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) { - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry)); + sbi_hart_protection_temp_unmap_range((unsigned long)entry, sizeof(*entry)); return SBI_ERR_FAILED; } if ((entry->data.tdata2 && !tdata2_impl) || (entry->data.tdata3 && !tdata3_impl)) { - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry)); + sbi_hart_protection_temp_unmap_range((unsigned long)entry, sizeof(*entry)); return SBI_ERR_NOT_SUPPORTED; } dbtr_trigger_setup(trig, &entry->data); - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry)); + sbi_hart_protection_temp_unmap_range((unsigned long)entry, sizeof(*entry)); dbtr_trigger_enable(trig); } diff --git a/lib/sbi/sbi_ecall_dbcn.c b/lib/sbi/sbi_ecall_dbcn.c index 75c8455d..76837737 100644 --- a/lib/sbi/sbi_ecall_dbcn.c +++ b/lib/sbi/sbi_ecall_dbcn.c @@ -46,12 +46,12 @@ static int sbi_ecall_dbcn_handler(unsigned long extid, unsigned long funcid, regs->a1, regs->a0, smode, SBI_DOMAIN_READ|SBI_DOMAIN_WRITE)) return SBI_ERR_INVALID_PARAM; - sbi_hart_protection_map_range(regs->a1, regs->a0); + sbi_hart_protection_temp_map_range(regs->a1, regs->a0); if (funcid == SBI_EXT_DBCN_CONSOLE_WRITE) out->value = sbi_nputs((const char *)regs->a1, regs->a0); else out->value = sbi_ngets((char *)regs->a1, regs->a0); - sbi_hart_protection_unmap_range(regs->a1, regs->a0); + sbi_hart_protection_temp_unmap_range(regs->a1, regs->a0); return 0; case SBI_EXT_DBCN_CONSOLE_WRITE_BYTE: sbi_putc(regs->a0); diff --git a/lib/sbi/sbi_hart_pmp.c b/lib/sbi/sbi_hart_pmp.c index c0a4ce1b..c530739f 100644 --- a/lib/sbi/sbi_hart_pmp.c +++ b/lib/sbi/sbi_hart_pmp.c @@ -135,7 +135,7 @@ int sbi_hart_pmp_get(unsigned int n, unsigned long *prot_out, unsigned long *add * When shared memory access is required, the physical address * should be programmed into the first PMP entry with R/W * permissions to the M-mode. Once the work is done, it should be - * unmapped. sbi_hart_protection_map_range/sbi_hart_protection_unmap_range + * unmapped. sbi_hart_protection_temp_map_range/sbi_hart_protection_temp_unmap_range * function pair should be used to map/unmap the shared memory. */ #define SBI_SMEPMP_RESV_ENTRY 0 @@ -327,7 +327,7 @@ static int sbi_hart_smepmp_configure(struct sbi_scratch *scratch, return 0; } -static int sbi_hart_smepmp_map_range(struct sbi_scratch *scratch, +static int sbi_hart_smepmp_temp_map_range(struct sbi_scratch *scratch, unsigned long addr, unsigned long size) { /* shared R/W access for M and S/U mode */ @@ -359,7 +359,7 @@ static int sbi_hart_smepmp_map_range(struct sbi_scratch *scratch, return SBI_OK; } -static int sbi_hart_smepmp_unmap_range(struct sbi_scratch *scratch, +static int sbi_hart_smepmp_temp_unmap_range(struct sbi_scratch *scratch, unsigned long addr, unsigned long size) { sbi_platform_pmp_disable(sbi_platform_ptr(scratch), SBI_SMEPMP_RESV_ENTRY); @@ -436,8 +436,8 @@ static struct sbi_hart_protection epmp_protection = { .type = SBI_HART_PROTECTION_TYPE_MEMORY, .configure = sbi_hart_smepmp_configure, .unconfigure = sbi_hart_pmp_unconfigure, - .map_range = sbi_hart_smepmp_map_range, - .unmap_range = sbi_hart_smepmp_unmap_range, + .temp_map_range = sbi_hart_smepmp_temp_map_range, + .temp_unmap_range = sbi_hart_smepmp_temp_unmap_range, }; int sbi_hart_pmp_init(struct sbi_scratch *scratch) diff --git a/lib/sbi/sbi_hart_protection.c b/lib/sbi/sbi_hart_protection.c index c4c149c8..ee4d4beb 100644 --- a/lib/sbi/sbi_hart_protection.c +++ b/lib/sbi/sbi_hart_protection.c @@ -196,22 +196,22 @@ int sbi_hart_protection_reconfigure(struct sbi_scratch *scratch, return 0; } -int sbi_hart_protection_map_range(unsigned long base, unsigned long size) +int sbi_hart_protection_temp_map_range(unsigned long base, unsigned long size) { struct sbi_hart_protection *hprot = __hart_memory_protection_best(); - if (!hprot || !hprot->map_range) + if (!hprot || !hprot->temp_map_range) return 0; - return hprot->map_range(sbi_scratch_thishart_ptr(), base, size); + return hprot->temp_map_range(sbi_scratch_thishart_ptr(), base, size); } -int sbi_hart_protection_unmap_range(unsigned long base, unsigned long size) +int sbi_hart_protection_temp_unmap_range(unsigned long base, unsigned long size) { struct sbi_hart_protection *hprot = __hart_memory_protection_best(); - if (!hprot || !hprot->unmap_range) + if (!hprot || !hprot->temp_unmap_range) return 0; - return hprot->unmap_range(sbi_scratch_thishart_ptr(), base, size); + return hprot->temp_unmap_range(sbi_scratch_thishart_ptr(), base, size); } diff --git a/lib/sbi/sbi_mpxy.c b/lib/sbi/sbi_mpxy.c index 19f59f3a..41fea0ae 100644 --- a/lib/sbi/sbi_mpxy.c +++ b/lib/sbi/sbi_mpxy.c @@ -401,10 +401,10 @@ int sbi_mpxy_set_shmem(unsigned long shmem_phys_lo, if (flags == SBI_EXT_MPXY_SHMEM_FLAG_OVERWRITE_RETURN) { ret_buf = (unsigned long *)(ulong)SHMEM_PHYS_ADDR(shmem_phys_hi, shmem_phys_lo); - sbi_hart_protection_map_range((unsigned long)ret_buf, mpxy_shmem_size); + sbi_hart_protection_temp_map_range((unsigned long)ret_buf, mpxy_shmem_size); ret_buf[0] = cpu_to_lle(ms->shmem.shmem_addr_lo); ret_buf[1] = cpu_to_lle(ms->shmem.shmem_addr_hi); - sbi_hart_protection_unmap_range((unsigned long)ret_buf, mpxy_shmem_size); + sbi_hart_protection_temp_unmap_range((unsigned long)ret_buf, mpxy_shmem_size); } /** Setup the new shared memory */ @@ -436,7 +436,7 @@ int sbi_mpxy_get_channel_ids(u32 start_index) return SBI_ERR_INVALID_PARAM; shmem_base = hart_shmem_base(ms); - sbi_hart_protection_map_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); + sbi_hart_protection_temp_map_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); /** number of channel ids which can be stored in shmem adjusting * for remaining and returned fields */ @@ -466,7 +466,7 @@ int sbi_mpxy_get_channel_ids(u32 start_index) shmem_base[0] = cpu_to_le32(remaining); shmem_base[1] = cpu_to_le32(returned); - sbi_hart_protection_unmap_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); + sbi_hart_protection_temp_unmap_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); return SBI_SUCCESS; } @@ -498,7 +498,7 @@ int sbi_mpxy_read_attrs(u32 channel_id, u32 base_attr_id, u32 attr_count) shmem_base = hart_shmem_base(ms); end_id = base_attr_id + attr_count - 1; - sbi_hart_protection_map_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); + sbi_hart_protection_temp_map_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); /* Standard attributes range check */ if (mpxy_is_std_attr(base_attr_id)) { @@ -537,7 +537,7 @@ int sbi_mpxy_read_attrs(u32 channel_id, u32 base_attr_id, u32 attr_count) base_attr_id, attr_count); } out: - sbi_hart_protection_unmap_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); + sbi_hart_protection_temp_unmap_range((unsigned long)hart_shmem_base(ms), mpxy_shmem_size); return ret; } @@ -650,7 +650,7 @@ int sbi_mpxy_write_attrs(u32 channel_id, u32 base_attr_id, u32 attr_count) shmem_base = hart_shmem_base(ms); end_id = base_attr_id + attr_count - 1; - sbi_hart_protection_map_range((unsigned long)shmem_base, mpxy_shmem_size); + sbi_hart_protection_temp_map_range((unsigned long)shmem_base, mpxy_shmem_size); mem_ptr = (u32 *)shmem_base; @@ -707,7 +707,7 @@ int sbi_mpxy_write_attrs(u32 channel_id, u32 base_attr_id, u32 attr_count) base_attr_id, attr_count); } out: - sbi_hart_protection_unmap_range((unsigned long)shmem_base, mpxy_shmem_size); + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, mpxy_shmem_size); return ret; } @@ -740,7 +740,7 @@ int sbi_mpxy_send_message(u32 channel_id, u8 msg_id, return SBI_ERR_INVALID_PARAM; shmem_base = hart_shmem_base(ms); - sbi_hart_protection_map_range((unsigned long)shmem_base, mpxy_shmem_size); + sbi_hart_protection_temp_map_range((unsigned long)shmem_base, mpxy_shmem_size); if (resp_data_len) { resp_buf = shmem_base; @@ -757,7 +757,7 @@ int sbi_mpxy_send_message(u32 channel_id, u8 msg_id, msg_data_len); } - sbi_hart_protection_unmap_range((unsigned long)shmem_base, mpxy_shmem_size); + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, mpxy_shmem_size); if (ret == SBI_ERR_TIMEOUT || ret == SBI_ERR_IO) return ret; @@ -788,12 +788,12 @@ int sbi_mpxy_get_notification_events(u32 channel_id, unsigned long *events_len) return SBI_ERR_NOT_SUPPORTED; shmem_base = hart_shmem_base(ms); - sbi_hart_protection_map_range((unsigned long)shmem_base, mpxy_shmem_size); + sbi_hart_protection_temp_map_range((unsigned long)shmem_base, mpxy_shmem_size); eventsbuf = shmem_base; ret = channel->get_notification_events(channel, eventsbuf, mpxy_shmem_size, events_len); - sbi_hart_protection_unmap_range((unsigned long)shmem_base, mpxy_shmem_size); + sbi_hart_protection_temp_unmap_range((unsigned long)shmem_base, mpxy_shmem_size); if (ret) return ret; diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c index a0f6d2fa..aac6adb6 100644 --- a/lib/sbi/sbi_pmu.c +++ b/lib/sbi/sbi_pmu.c @@ -1093,7 +1093,7 @@ int sbi_pmu_event_get_info(unsigned long shmem_phys_lo, unsigned long shmem_phys SBI_DOMAIN_READ | SBI_DOMAIN_WRITE)) return SBI_ERR_INVALID_ADDRESS; - sbi_hart_protection_map_range(shmem_phys_lo, shmem_size); + sbi_hart_protection_temp_map_range(shmem_phys_lo, shmem_size); einfo = (struct sbi_pmu_event_info *)(shmem_phys_lo); for (i = 0; i < num_events; i++) { @@ -1127,7 +1127,7 @@ int sbi_pmu_event_get_info(unsigned long shmem_phys_lo, unsigned long shmem_phys } } - sbi_hart_protection_unmap_range(shmem_phys_lo, shmem_size); + sbi_hart_protection_temp_unmap_range(shmem_phys_lo, shmem_size); return 0; } diff --git a/lib/sbi/sbi_sse.c b/lib/sbi/sbi_sse.c index 818afb87..ad9e6a06 100644 --- a/lib/sbi/sbi_sse.c +++ b/lib/sbi/sbi_sse.c @@ -1037,7 +1037,7 @@ int sbi_sse_read_attrs(uint32_t event_id, uint32_t base_attr_id, if (ret) return ret; - sbi_hart_protection_map_range(output_phys_lo, sizeof(unsigned long) * attr_count); + sbi_hart_protection_temp_map_range(output_phys_lo, sizeof(unsigned long) * attr_count); /* * Copy all attributes at once since struct sse_event_attrs is matching @@ -1050,7 +1050,7 @@ int sbi_sse_read_attrs(uint32_t event_id, uint32_t base_attr_id, attrs = (unsigned long *)output_phys_lo; copy_attrs(attrs, &e_attrs[base_attr_id], attr_count); - sbi_hart_protection_unmap_range(output_phys_lo, sizeof(unsigned long) * attr_count); + sbi_hart_protection_temp_unmap_range(output_phys_lo, sizeof(unsigned long) * attr_count); sse_event_put(e); @@ -1065,7 +1065,7 @@ static int sse_write_attrs(struct sbi_sse_event *e, uint32_t base_attr_id, uint32_t id, end_id = base_attr_id + attr_count; unsigned long *attrs = (unsigned long *)input_phys; - sbi_hart_protection_map_range(input_phys, sizeof(unsigned long) * attr_count); + sbi_hart_protection_temp_map_range(input_phys, sizeof(unsigned long) * attr_count); for (id = base_attr_id; id < end_id; id++) { val = attrs[attr++]; @@ -1081,7 +1081,7 @@ static int sse_write_attrs(struct sbi_sse_event *e, uint32_t base_attr_id, } out: - sbi_hart_protection_unmap_range(input_phys, sizeof(unsigned long) * attr_count); + sbi_hart_protection_temp_unmap_range(input_phys, sizeof(unsigned long) * attr_count); return ret; } -- 2.51.0 -- opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi