Re: [Mesa-dev] [PATCH 2/2] gallium/radeon: pipe AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS into gallium HUD
On 05/17/2017 10:45 PM, Marek Olšák wrote: On Wed, May 17, 2017 at 9:19 PM, Samuel Pitoisetwrote: On 05/17/2017 09:15 PM, Marek Olšák wrote: From: Marek Olšák --- src/gallium/drivers/radeon/r600_query.c | 8 ++-- src/gallium/drivers/radeon/r600_query.h | 1 + src/gallium/drivers/radeon/radeon_winsys.h| 1 + src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 7 +++ src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 0d960bc..7edbb15 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -66,20 +66,21 @@ static enum radeon_value_id winsys_id_from_type(unsigned type) case R600_QUERY_REQUESTED_VRAM: return RADEON_REQUESTED_VRAM_MEMORY; case R600_QUERY_REQUESTED_GTT: return RADEON_REQUESTED_GTT_MEMORY; case R600_QUERY_MAPPED_VRAM: return RADEON_MAPPED_VRAM; case R600_QUERY_MAPPED_GTT: return RADEON_MAPPED_GTT; case R600_QUERY_BUFFER_WAIT_TIME: return RADEON_BUFFER_WAIT_TIME_NS; case R600_QUERY_NUM_MAPPED_BUFFERS: return RADEON_NUM_MAPPED_BUFFERS; case R600_QUERY_NUM_GFX_IBS: return RADEON_NUM_GFX_IBS; case R600_QUERY_NUM_SDMA_IBS: return RADEON_NUM_SDMA_IBS; case R600_QUERY_NUM_BYTES_MOVED: return RADEON_NUM_BYTES_MOVED; case R600_QUERY_NUM_EVICTIONS: return RADEON_NUM_EVICTIONS; + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: return RADEON_NUM_VRAM_CPU_PAGE_FAULTS; case R600_QUERY_VRAM_USAGE: return RADEON_VRAM_USAGE; case R600_QUERY_VRAM_VIS_USAGE: return RADEON_VRAM_VIS_USAGE; case R600_QUERY_GTT_USAGE: return RADEON_GTT_USAGE; case R600_QUERY_GPU_TEMPERATURE: return RADEON_GPU_TEMPERATURE; case R600_QUERY_CURRENT_GPU_SCLK: return RADEON_CURRENT_SCLK; case R600_QUERY_CURRENT_GPU_MCLK: return RADEON_CURRENT_MCLK; case R600_QUERY_CS_THREAD_BUSY: return RADEON_CS_THREAD_TIME; default: unreachable("query type does not correspond to winsys id"); } } @@ -153,21 +154,22 @@ static bool r600_query_sw_begin(struct r600_common_context *rctx, case R600_QUERY_CURRENT_GPU_SCLK: case R600_QUERY_CURRENT_GPU_MCLK: case R600_QUERY_BACK_BUFFER_PS_DRAW_RATIO: case R600_QUERY_NUM_MAPPED_BUFFERS: query->begin_result = 0; break; case R600_QUERY_BUFFER_WAIT_TIME: case R600_QUERY_NUM_GFX_IBS: case R600_QUERY_NUM_SDMA_IBS: case R600_QUERY_NUM_BYTES_MOVED: - case R600_QUERY_NUM_EVICTIONS: { + case R600_QUERY_NUM_EVICTIONS: + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { enum radeon_value_id ws_id = winsys_id_from_type(query->b.type); query->begin_result = rctx->ws->query_value(rctx->ws, ws_id); break; } case R600_QUERY_CS_THREAD_BUSY: ws_id = winsys_id_from_type(query->b.type); query->begin_result = rctx->ws->query_value(rctx->ws, ws_id); query->begin_time = os_time_get_nano(); break; case R600_QUERY_GALLIUM_THREAD_BUSY: @@ -291,21 +293,22 @@ static bool r600_query_sw_end(struct r600_common_context *rctx, case R600_QUERY_VRAM_VIS_USAGE: case R600_QUERY_GTT_USAGE: case R600_QUERY_GPU_TEMPERATURE: case R600_QUERY_CURRENT_GPU_SCLK: case R600_QUERY_CURRENT_GPU_MCLK: case R600_QUERY_BUFFER_WAIT_TIME: case R600_QUERY_NUM_MAPPED_BUFFERS: case R600_QUERY_NUM_GFX_IBS: case R600_QUERY_NUM_SDMA_IBS: case R600_QUERY_NUM_BYTES_MOVED: - case R600_QUERY_NUM_EVICTIONS: { + case R600_QUERY_NUM_EVICTIONS: + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { enum radeon_value_id ws_id = winsys_id_from_type(query->b.type); query->end_result = rctx->ws->query_value(rctx->ws, ws_id); break; } case R600_QUERY_CS_THREAD_BUSY: ws_id = winsys_id_from_type(query->b.type); query->end_result = rctx->ws->query_value(rctx->ws, ws_id); query->end_time = os_time_get_nano(); break; case R600_QUERY_GALLIUM_THREAD_BUSY: @@ -1839,20 +1842,21 @@ static struct pipe_driver_query_info r600_driver_query_list[] = { X("requested-VRAM", REQUESTED_VRAM, BYTES, AVERAGE), X("requested-GTT", REQUESTED_GTT, BYTES, AVERAGE), X("mapped-VRAM",MAPPED_VRAM,BYTES, AVERAGE), X("mapped-GTT", MAPPED_GTT, BYTES, AVERAGE), X("buffer-wait-time",
Re: [Mesa-dev] [PATCH 2/2] gallium/radeon: pipe AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS into gallium HUD
On Wed, May 17, 2017 at 9:19 PM, Samuel Pitoisetwrote: > > > On 05/17/2017 09:15 PM, Marek Olšák wrote: >> >> From: Marek Olšák >> >> --- >> src/gallium/drivers/radeon/r600_query.c | 8 ++-- >> src/gallium/drivers/radeon/r600_query.h | 1 + >> src/gallium/drivers/radeon/radeon_winsys.h| 1 + >> src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 7 +++ >> src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 1 + >> 5 files changed, 16 insertions(+), 2 deletions(-) >> >> diff --git a/src/gallium/drivers/radeon/r600_query.c >> b/src/gallium/drivers/radeon/r600_query.c >> index 0d960bc..7edbb15 100644 >> --- a/src/gallium/drivers/radeon/r600_query.c >> +++ b/src/gallium/drivers/radeon/r600_query.c >> @@ -66,20 +66,21 @@ static enum radeon_value_id >> winsys_id_from_type(unsigned type) >> case R600_QUERY_REQUESTED_VRAM: return >> RADEON_REQUESTED_VRAM_MEMORY; >> case R600_QUERY_REQUESTED_GTT: return RADEON_REQUESTED_GTT_MEMORY; >> case R600_QUERY_MAPPED_VRAM: return RADEON_MAPPED_VRAM; >> case R600_QUERY_MAPPED_GTT: return RADEON_MAPPED_GTT; >> case R600_QUERY_BUFFER_WAIT_TIME: return >> RADEON_BUFFER_WAIT_TIME_NS; >> case R600_QUERY_NUM_MAPPED_BUFFERS: return >> RADEON_NUM_MAPPED_BUFFERS; >> case R600_QUERY_NUM_GFX_IBS: return RADEON_NUM_GFX_IBS; >> case R600_QUERY_NUM_SDMA_IBS: return RADEON_NUM_SDMA_IBS; >> case R600_QUERY_NUM_BYTES_MOVED: return RADEON_NUM_BYTES_MOVED; >> case R600_QUERY_NUM_EVICTIONS: return RADEON_NUM_EVICTIONS; >> + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: return >> RADEON_NUM_VRAM_CPU_PAGE_FAULTS; >> case R600_QUERY_VRAM_USAGE: return RADEON_VRAM_USAGE; >> case R600_QUERY_VRAM_VIS_USAGE: return RADEON_VRAM_VIS_USAGE; >> case R600_QUERY_GTT_USAGE: return RADEON_GTT_USAGE; >> case R600_QUERY_GPU_TEMPERATURE: return RADEON_GPU_TEMPERATURE; >> case R600_QUERY_CURRENT_GPU_SCLK: return RADEON_CURRENT_SCLK; >> case R600_QUERY_CURRENT_GPU_MCLK: return RADEON_CURRENT_MCLK; >> case R600_QUERY_CS_THREAD_BUSY: return RADEON_CS_THREAD_TIME; >> default: unreachable("query type does not correspond to winsys >> id"); >> } >> } >> @@ -153,21 +154,22 @@ static bool r600_query_sw_begin(struct >> r600_common_context *rctx, >> case R600_QUERY_CURRENT_GPU_SCLK: >> case R600_QUERY_CURRENT_GPU_MCLK: >> case R600_QUERY_BACK_BUFFER_PS_DRAW_RATIO: >> case R600_QUERY_NUM_MAPPED_BUFFERS: >> query->begin_result = 0; >> break; >> case R600_QUERY_BUFFER_WAIT_TIME: >> case R600_QUERY_NUM_GFX_IBS: >> case R600_QUERY_NUM_SDMA_IBS: >> case R600_QUERY_NUM_BYTES_MOVED: >> - case R600_QUERY_NUM_EVICTIONS: { >> + case R600_QUERY_NUM_EVICTIONS: >> + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { >> enum radeon_value_id ws_id = >> winsys_id_from_type(query->b.type); >> query->begin_result = rctx->ws->query_value(rctx->ws, >> ws_id); >> break; >> } >> case R600_QUERY_CS_THREAD_BUSY: >> ws_id = winsys_id_from_type(query->b.type); >> query->begin_result = rctx->ws->query_value(rctx->ws, >> ws_id); >> query->begin_time = os_time_get_nano(); >> break; >> case R600_QUERY_GALLIUM_THREAD_BUSY: >> @@ -291,21 +293,22 @@ static bool r600_query_sw_end(struct >> r600_common_context *rctx, >> case R600_QUERY_VRAM_VIS_USAGE: >> case R600_QUERY_GTT_USAGE: >> case R600_QUERY_GPU_TEMPERATURE: >> case R600_QUERY_CURRENT_GPU_SCLK: >> case R600_QUERY_CURRENT_GPU_MCLK: >> case R600_QUERY_BUFFER_WAIT_TIME: >> case R600_QUERY_NUM_MAPPED_BUFFERS: >> case R600_QUERY_NUM_GFX_IBS: >> case R600_QUERY_NUM_SDMA_IBS: >> case R600_QUERY_NUM_BYTES_MOVED: >> - case R600_QUERY_NUM_EVICTIONS: { >> + case R600_QUERY_NUM_EVICTIONS: >> + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { >> enum radeon_value_id ws_id = >> winsys_id_from_type(query->b.type); >> query->end_result = rctx->ws->query_value(rctx->ws, >> ws_id); >> break; >> } >> case R600_QUERY_CS_THREAD_BUSY: >> ws_id = winsys_id_from_type(query->b.type); >> query->end_result = rctx->ws->query_value(rctx->ws, >> ws_id); >> query->end_time = os_time_get_nano(); >> break; >> case R600_QUERY_GALLIUM_THREAD_BUSY: >> @@ -1839,20 +1842,21 @@ static struct pipe_driver_query_info >> r600_driver_query_list[] = { >> X("requested-VRAM", REQUESTED_VRAM, BYTES, >> AVERAGE), >> X("requested-GTT", REQUESTED_GTT, BYTES, >> AVERAGE), >>
Re: [Mesa-dev] [PATCH 2/2] gallium/radeon: pipe AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS into gallium HUD
On 05/17/2017 09:15 PM, Marek Olšák wrote: From: Marek Olšák--- src/gallium/drivers/radeon/r600_query.c | 8 ++-- src/gallium/drivers/radeon/r600_query.h | 1 + src/gallium/drivers/radeon/radeon_winsys.h| 1 + src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 7 +++ src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 0d960bc..7edbb15 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -66,20 +66,21 @@ static enum radeon_value_id winsys_id_from_type(unsigned type) case R600_QUERY_REQUESTED_VRAM: return RADEON_REQUESTED_VRAM_MEMORY; case R600_QUERY_REQUESTED_GTT: return RADEON_REQUESTED_GTT_MEMORY; case R600_QUERY_MAPPED_VRAM: return RADEON_MAPPED_VRAM; case R600_QUERY_MAPPED_GTT: return RADEON_MAPPED_GTT; case R600_QUERY_BUFFER_WAIT_TIME: return RADEON_BUFFER_WAIT_TIME_NS; case R600_QUERY_NUM_MAPPED_BUFFERS: return RADEON_NUM_MAPPED_BUFFERS; case R600_QUERY_NUM_GFX_IBS: return RADEON_NUM_GFX_IBS; case R600_QUERY_NUM_SDMA_IBS: return RADEON_NUM_SDMA_IBS; case R600_QUERY_NUM_BYTES_MOVED: return RADEON_NUM_BYTES_MOVED; case R600_QUERY_NUM_EVICTIONS: return RADEON_NUM_EVICTIONS; + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: return RADEON_NUM_VRAM_CPU_PAGE_FAULTS; case R600_QUERY_VRAM_USAGE: return RADEON_VRAM_USAGE; case R600_QUERY_VRAM_VIS_USAGE: return RADEON_VRAM_VIS_USAGE; case R600_QUERY_GTT_USAGE: return RADEON_GTT_USAGE; case R600_QUERY_GPU_TEMPERATURE: return RADEON_GPU_TEMPERATURE; case R600_QUERY_CURRENT_GPU_SCLK: return RADEON_CURRENT_SCLK; case R600_QUERY_CURRENT_GPU_MCLK: return RADEON_CURRENT_MCLK; case R600_QUERY_CS_THREAD_BUSY: return RADEON_CS_THREAD_TIME; default: unreachable("query type does not correspond to winsys id"); } } @@ -153,21 +154,22 @@ static bool r600_query_sw_begin(struct r600_common_context *rctx, case R600_QUERY_CURRENT_GPU_SCLK: case R600_QUERY_CURRENT_GPU_MCLK: case R600_QUERY_BACK_BUFFER_PS_DRAW_RATIO: case R600_QUERY_NUM_MAPPED_BUFFERS: query->begin_result = 0; break; case R600_QUERY_BUFFER_WAIT_TIME: case R600_QUERY_NUM_GFX_IBS: case R600_QUERY_NUM_SDMA_IBS: case R600_QUERY_NUM_BYTES_MOVED: - case R600_QUERY_NUM_EVICTIONS: { + case R600_QUERY_NUM_EVICTIONS: + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { enum radeon_value_id ws_id = winsys_id_from_type(query->b.type); query->begin_result = rctx->ws->query_value(rctx->ws, ws_id); break; } case R600_QUERY_CS_THREAD_BUSY: ws_id = winsys_id_from_type(query->b.type); query->begin_result = rctx->ws->query_value(rctx->ws, ws_id); query->begin_time = os_time_get_nano(); break; case R600_QUERY_GALLIUM_THREAD_BUSY: @@ -291,21 +293,22 @@ static bool r600_query_sw_end(struct r600_common_context *rctx, case R600_QUERY_VRAM_VIS_USAGE: case R600_QUERY_GTT_USAGE: case R600_QUERY_GPU_TEMPERATURE: case R600_QUERY_CURRENT_GPU_SCLK: case R600_QUERY_CURRENT_GPU_MCLK: case R600_QUERY_BUFFER_WAIT_TIME: case R600_QUERY_NUM_MAPPED_BUFFERS: case R600_QUERY_NUM_GFX_IBS: case R600_QUERY_NUM_SDMA_IBS: case R600_QUERY_NUM_BYTES_MOVED: - case R600_QUERY_NUM_EVICTIONS: { + case R600_QUERY_NUM_EVICTIONS: + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { enum radeon_value_id ws_id = winsys_id_from_type(query->b.type); query->end_result = rctx->ws->query_value(rctx->ws, ws_id); break; } case R600_QUERY_CS_THREAD_BUSY: ws_id = winsys_id_from_type(query->b.type); query->end_result = rctx->ws->query_value(rctx->ws, ws_id); query->end_time = os_time_get_nano(); break; case R600_QUERY_GALLIUM_THREAD_BUSY: @@ -1839,20 +1842,21 @@ static struct pipe_driver_query_info r600_driver_query_list[] = { X("requested-VRAM", REQUESTED_VRAM, BYTES, AVERAGE), X("requested-GTT",REQUESTED_GTT, BYTES, AVERAGE), X("mapped-VRAM", MAPPED_VRAM,BYTES, AVERAGE), X("mapped-GTT", MAPPED_GTT, BYTES, AVERAGE), X("buffer-wait-time", BUFFER_WAIT_TIME, MICROSECONDS, CUMULATIVE), X("num-mapped-buffers", NUM_MAPPED_BUFFERS, UINT64, AVERAGE), X("num-GFX-IBs", NUM_GFX_IBS,UINT64,
[Mesa-dev] [PATCH 2/2] gallium/radeon: pipe AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS into gallium HUD
From: Marek Olšák--- src/gallium/drivers/radeon/r600_query.c | 8 ++-- src/gallium/drivers/radeon/r600_query.h | 1 + src/gallium/drivers/radeon/radeon_winsys.h| 1 + src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 7 +++ src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 1 + 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 0d960bc..7edbb15 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -66,20 +66,21 @@ static enum radeon_value_id winsys_id_from_type(unsigned type) case R600_QUERY_REQUESTED_VRAM: return RADEON_REQUESTED_VRAM_MEMORY; case R600_QUERY_REQUESTED_GTT: return RADEON_REQUESTED_GTT_MEMORY; case R600_QUERY_MAPPED_VRAM: return RADEON_MAPPED_VRAM; case R600_QUERY_MAPPED_GTT: return RADEON_MAPPED_GTT; case R600_QUERY_BUFFER_WAIT_TIME: return RADEON_BUFFER_WAIT_TIME_NS; case R600_QUERY_NUM_MAPPED_BUFFERS: return RADEON_NUM_MAPPED_BUFFERS; case R600_QUERY_NUM_GFX_IBS: return RADEON_NUM_GFX_IBS; case R600_QUERY_NUM_SDMA_IBS: return RADEON_NUM_SDMA_IBS; case R600_QUERY_NUM_BYTES_MOVED: return RADEON_NUM_BYTES_MOVED; case R600_QUERY_NUM_EVICTIONS: return RADEON_NUM_EVICTIONS; + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: return RADEON_NUM_VRAM_CPU_PAGE_FAULTS; case R600_QUERY_VRAM_USAGE: return RADEON_VRAM_USAGE; case R600_QUERY_VRAM_VIS_USAGE: return RADEON_VRAM_VIS_USAGE; case R600_QUERY_GTT_USAGE: return RADEON_GTT_USAGE; case R600_QUERY_GPU_TEMPERATURE: return RADEON_GPU_TEMPERATURE; case R600_QUERY_CURRENT_GPU_SCLK: return RADEON_CURRENT_SCLK; case R600_QUERY_CURRENT_GPU_MCLK: return RADEON_CURRENT_MCLK; case R600_QUERY_CS_THREAD_BUSY: return RADEON_CS_THREAD_TIME; default: unreachable("query type does not correspond to winsys id"); } } @@ -153,21 +154,22 @@ static bool r600_query_sw_begin(struct r600_common_context *rctx, case R600_QUERY_CURRENT_GPU_SCLK: case R600_QUERY_CURRENT_GPU_MCLK: case R600_QUERY_BACK_BUFFER_PS_DRAW_RATIO: case R600_QUERY_NUM_MAPPED_BUFFERS: query->begin_result = 0; break; case R600_QUERY_BUFFER_WAIT_TIME: case R600_QUERY_NUM_GFX_IBS: case R600_QUERY_NUM_SDMA_IBS: case R600_QUERY_NUM_BYTES_MOVED: - case R600_QUERY_NUM_EVICTIONS: { + case R600_QUERY_NUM_EVICTIONS: + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { enum radeon_value_id ws_id = winsys_id_from_type(query->b.type); query->begin_result = rctx->ws->query_value(rctx->ws, ws_id); break; } case R600_QUERY_CS_THREAD_BUSY: ws_id = winsys_id_from_type(query->b.type); query->begin_result = rctx->ws->query_value(rctx->ws, ws_id); query->begin_time = os_time_get_nano(); break; case R600_QUERY_GALLIUM_THREAD_BUSY: @@ -291,21 +293,22 @@ static bool r600_query_sw_end(struct r600_common_context *rctx, case R600_QUERY_VRAM_VIS_USAGE: case R600_QUERY_GTT_USAGE: case R600_QUERY_GPU_TEMPERATURE: case R600_QUERY_CURRENT_GPU_SCLK: case R600_QUERY_CURRENT_GPU_MCLK: case R600_QUERY_BUFFER_WAIT_TIME: case R600_QUERY_NUM_MAPPED_BUFFERS: case R600_QUERY_NUM_GFX_IBS: case R600_QUERY_NUM_SDMA_IBS: case R600_QUERY_NUM_BYTES_MOVED: - case R600_QUERY_NUM_EVICTIONS: { + case R600_QUERY_NUM_EVICTIONS: + case R600_QUERY_NUM_VRAM_CPU_PAGE_FAULTS: { enum radeon_value_id ws_id = winsys_id_from_type(query->b.type); query->end_result = rctx->ws->query_value(rctx->ws, ws_id); break; } case R600_QUERY_CS_THREAD_BUSY: ws_id = winsys_id_from_type(query->b.type); query->end_result = rctx->ws->query_value(rctx->ws, ws_id); query->end_time = os_time_get_nano(); break; case R600_QUERY_GALLIUM_THREAD_BUSY: @@ -1839,20 +1842,21 @@ static struct pipe_driver_query_info r600_driver_query_list[] = { X("requested-VRAM", REQUESTED_VRAM, BYTES, AVERAGE), X("requested-GTT", REQUESTED_GTT, BYTES, AVERAGE), X("mapped-VRAM",MAPPED_VRAM,BYTES, AVERAGE), X("mapped-GTT", MAPPED_GTT, BYTES, AVERAGE), X("buffer-wait-time", BUFFER_WAIT_TIME, MICROSECONDS, CUMULATIVE), X("num-mapped-buffers", NUM_MAPPED_BUFFERS, UINT64, AVERAGE), X("num-GFX-IBs",NUM_GFX_IBS,UINT64, AVERAGE), X("num-SDMA-IBs",