|
@@ -217,6 +217,20 @@ static uint64_t pnv_xive2_vst_addr_indirect(PnvXive2 *xive, uint32_t type,
|
|
return pnv_xive2_vst_addr_direct(xive, type, vsd, (idx % vst_per_page));
|
|
return pnv_xive2_vst_addr_direct(xive, type, vsd, (idx % vst_per_page));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static uint8_t pnv_xive2_nvc_table_compress_shift(PnvXive2 *xive)
|
|
|
|
+{
|
|
|
|
+ uint8_t shift = GETFIELD(PC_NXC_PROC_CONFIG_NVC_TABLE_COMPRESS,
|
|
|
|
+ xive->pc_regs[PC_NXC_PROC_CONFIG >> 3]);
|
|
|
|
+ return shift > 8 ? 0 : shift;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static uint8_t pnv_xive2_nvg_table_compress_shift(PnvXive2 *xive)
|
|
|
|
+{
|
|
|
|
+ uint8_t shift = GETFIELD(PC_NXC_PROC_CONFIG_NVG_TABLE_COMPRESS,
|
|
|
|
+ xive->pc_regs[PC_NXC_PROC_CONFIG >> 3]);
|
|
|
|
+ return shift > 8 ? 0 : shift;
|
|
|
|
+}
|
|
|
|
+
|
|
static uint64_t pnv_xive2_vst_addr(PnvXive2 *xive, uint32_t type, uint8_t blk,
|
|
static uint64_t pnv_xive2_vst_addr(PnvXive2 *xive, uint32_t type, uint8_t blk,
|
|
uint32_t idx)
|
|
uint32_t idx)
|
|
{
|
|
{
|
|
@@ -238,6 +252,12 @@ static uint64_t pnv_xive2_vst_addr(PnvXive2 *xive, uint32_t type, uint8_t blk,
|
|
return xive ? pnv_xive2_vst_addr(xive, type, blk, idx) : 0;
|
|
return xive ? pnv_xive2_vst_addr(xive, type, blk, idx) : 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (type == VST_NVG) {
|
|
|
|
+ idx >>= pnv_xive2_nvg_table_compress_shift(xive);
|
|
|
|
+ } else if (type == VST_NVC) {
|
|
|
|
+ idx >>= pnv_xive2_nvc_table_compress_shift(xive);
|
|
|
|
+ }
|
|
|
|
+
|
|
if (VSD_INDIRECT & vsd) {
|
|
if (VSD_INDIRECT & vsd) {
|
|
return pnv_xive2_vst_addr_indirect(xive, type, vsd, idx);
|
|
return pnv_xive2_vst_addr_indirect(xive, type, vsd, idx);
|
|
}
|
|
}
|