hw/cxl/component: Add utils for interleave parameter encoding/decoding
Both registers and the CFMWS entries in CDAT use simple encodings for the number of interleave ways and the interleave granularity. Introduce simple conversion functions to/from the unencoded number / size. So far the iw decode has not been needed so is it not implemented. Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20220429144110.25167-27-Jonathan.Cameron@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
3d6a69b6eb
commit
829de299d1
@ -9,6 +9,7 @@
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
@ -329,3 +330,36 @@ void cxl_component_create_dvsec(CXLComponentState *cxl,
|
||||
range_init_nofail(&cxl->dvsecs[type], cxl->dvsec_offset, length);
|
||||
cxl->dvsec_offset += length;
|
||||
}
|
||||
|
||||
uint8_t cxl_interleave_ways_enc(int iw, Error **errp)
|
||||
{
|
||||
switch (iw) {
|
||||
case 1: return 0x0;
|
||||
case 2: return 0x1;
|
||||
case 4: return 0x2;
|
||||
case 8: return 0x3;
|
||||
case 16: return 0x4;
|
||||
case 3: return 0x8;
|
||||
case 6: return 0x9;
|
||||
case 12: return 0xa;
|
||||
default:
|
||||
error_setg(errp, "Interleave ways: %d not supported", iw);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t cxl_interleave_granularity_enc(uint64_t gran, Error **errp)
|
||||
{
|
||||
switch (gran) {
|
||||
case 256: return 0;
|
||||
case 512: return 1;
|
||||
case 1024: return 2;
|
||||
case 2048: return 3;
|
||||
case 4096: return 4;
|
||||
case 8192: return 5;
|
||||
case 16384: return 6;
|
||||
default:
|
||||
error_setg(errp, "Interleave granularity: %" PRIu64 " invalid", gran);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -210,4 +210,12 @@ static inline int cxl_decoder_count_enc(int count)
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t cxl_interleave_ways_enc(int iw, Error **errp);
|
||||
uint8_t cxl_interleave_granularity_enc(uint64_t gran, Error **errp);
|
||||
|
||||
static inline hwaddr cxl_decode_ig(int ig)
|
||||
{
|
||||
return 1 << (ig + 8);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user