#define _GNU_SOURCE #include "internal.h" #include #ifdef __aarch64__ #define SYS_MPAM1_EL1 "S3_0_C10_C5_1" #define SYS_MPAMCFG_PART_SEL "S3_0_C10_C6_0" #define SYS_MPAMCFG_CPBM "S3_0_C10_C6_1" #define SYS_MPAMCFG_MBW_MAX "S3_0_C10_C6_2" static inline uint64_t read_sysreg(const char *reg_name) { (void)reg_name; return 0; } static inline void write_sysreg(const char *reg_name, uint64_t val) { (void)reg_name; (void)val; } int mpam_configure_partition(unsigned partid, uint32_t cpbm, unsigned mbw_max) { if (partid > MPAM_MAX_PARTID) return ICEPICK_E_INVALID; write_sysreg(SYS_MPAMCFG_PART_SEL, partid); if (cpbm != 0) write_sysreg(SYS_MPAMCFG_CPBM, cpbm); if (mbw_max > 0) write_sysreg(SYS_MPAMCFG_MBW_MAX, mbw_max); return 0; } int mpam_associate_thread(unsigned partid) { if (partid > MPAM_MAX_PARTID) return ICEPICK_E_INVALID; uint64_t mpam1 = read_sysreg(SYS_MPAM1_EL1); mpam1 = (mpam1 & ~0xFFFFULL) | partid; write_sysreg(SYS_MPAM1_EL1, mpam1); return 0; } #else int mpam_configure_partition(unsigned partid, uint32_t cpbm, unsigned mbw_max) { (void)partid; (void)cpbm; (void)mbw_max; return ICEPICK_E_INVALID; } int mpam_associate_thread(unsigned partid) { (void)partid; return ICEPICK_E_INVALID; } #endif