[Mesa-dev] [PATCH 1/4] winsys/amdgpu: initial SI support
Alex Deucher
alexdeucher at gmail.com
Mon Aug 22 15:00:22 UTC 2016
On Fri, Aug 19, 2016 at 5:11 AM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Ronie Salgado <roniesalg at gmail.com>
>
> ---
> src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 18 ++++++++++++++----
> src/gallium/winsys/amdgpu/drm/amdgpu_surface.c | 9 +++++++--
> src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 25 +++++++++++++++++++++++++
> 3 files changed, 46 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> index b171cc5..bf3e306 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> @@ -973,27 +973,37 @@ static int amdgpu_cs_flush(struct radeon_winsys_cs *rcs,
> {
> struct amdgpu_cs *cs = amdgpu_cs(rcs);
> struct amdgpu_winsys *ws = cs->ctx->ws;
> int error_code = 0;
>
> rcs->current.max_dw += amdgpu_cs_epilog_dws(cs->ring_type);
>
> switch (cs->ring_type) {
> case RING_DMA:
> /* pad DMA ring to 8 DWs */
> - while (rcs->current.cdw & 7)
> - OUT_CS(rcs, 0x00000000); /* NOP packet */
> + if (ws->info.chip_class <= SI) {
> + while (rcs->current.cdw & 7)
> + OUT_CS(rcs, 0xf0000000); /* NOP packet */
> + } else {
> + while (rcs->current.cdw & 7)
> + OUT_CS(rcs, 0x00000000); /* NOP packet */
> + }
> break;
> case RING_GFX:
> /* pad GFX ring to 8 DWs to meet CP fetch alignment requirements */
> - while (rcs->current.cdw & 7)
> - OUT_CS(rcs, 0xffff1000); /* type3 nop packet */
> + if (ws->info.gfx_ib_pad_with_type2) {
Do we need gfx_ib_pad_with_type2? Can we just check
ws->info.chip_class <= SI here? That would be cleaner and more
consistent IMHO.
Alex
> + while (rcs->current.cdw & 7)
> + OUT_CS(rcs, 0x80000000); /* type2 nop packet */
> + } else {
> + while (rcs->current.cdw & 7)
> + OUT_CS(rcs, 0xffff1000); /* type3 nop packet */
> + }
>
> /* Also pad the const IB. */
> if (cs->const_ib.ib_mapped)
> while (!cs->const_ib.base.current.cdw || (cs->const_ib.base.current.cdw & 7))
> OUT_CS(&cs->const_ib.base, 0xffff1000); /* type3 nop packet */
>
> if (cs->const_preamble_ib.ib_mapped)
> while (!cs->const_preamble_ib.base.current.cdw || (cs->const_preamble_ib.base.current.cdw & 7))
> OUT_CS(&cs->const_preamble_ib.base, 0xffff1000);
> break;
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c b/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c
> index 615d5a2..60c3cb9 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_surface.c
> @@ -119,22 +119,27 @@ ADDR_HANDLE amdgpu_addr_create(struct amdgpu_winsys *ws)
> addrCreateInput.size = sizeof(ADDR_CREATE_INPUT);
> addrCreateOutput.size = sizeof(ADDR_CREATE_OUTPUT);
>
> regValue.noOfBanks = ws->amdinfo.mc_arb_ramcfg & 0x3;
> regValue.gbAddrConfig = ws->amdinfo.gb_addr_cfg;
> regValue.noOfRanks = (ws->amdinfo.mc_arb_ramcfg & 0x4) >> 2;
>
> regValue.backendDisables = ws->amdinfo.backend_disable[0];
> regValue.pTileConfig = ws->amdinfo.gb_tile_mode;
> regValue.noOfEntries = ARRAY_SIZE(ws->amdinfo.gb_tile_mode);
> - regValue.pMacroTileConfig = ws->amdinfo.gb_macro_tile_mode;
> - regValue.noOfMacroEntries = ARRAY_SIZE(ws->amdinfo.gb_macro_tile_mode);
> + if(ws->info.chip_class == SI) {
> + regValue.pMacroTileConfig = NULL;
> + regValue.noOfMacroEntries = 0;
> + } else {
> + regValue.pMacroTileConfig = ws->amdinfo.gb_macro_tile_mode;
> + regValue.noOfMacroEntries = ARRAY_SIZE(ws->amdinfo.gb_macro_tile_mode);
> + }
>
> createFlags.value = 0;
> createFlags.useTileIndex = 1;
> createFlags.degradeBaseLevel = 1;
>
> addrCreateInput.chipEngine = CIASICIDGFXENGINE_SOUTHERNISLAND;
> addrCreateInput.chipFamily = ws->family;
> addrCreateInput.chipRevision = ws->rev_id;
> addrCreateInput.createFlags = createFlags;
> addrCreateInput.callbacks.allocSysMem = allocSysMem;
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
> index d8aed8b..1aa662c 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
> @@ -208,35 +208,57 @@ static bool do_winsys_init(struct amdgpu_winsys *ws, int fd)
>
> default:
> fprintf(stderr, "amdgpu: Invalid PCI ID.\n");
> goto fail;
> }
>
> if (ws->info.family >= CHIP_TONGA)
> ws->info.chip_class = VI;
> else if (ws->info.family >= CHIP_BONAIRE)
> ws->info.chip_class = CIK;
> + else if(ws->info.family >= CHIP_TAHITI)
> + ws->info.chip_class = SI;
> else {
> fprintf(stderr, "amdgpu: Unknown family.\n");
> goto fail;
> }
>
> /* LLVM 3.6.1 is required for VI. */
> if (ws->info.chip_class >= VI &&
> HAVE_LLVM == 0x0306 && MESA_LLVM_VERSION_PATCH < 1) {
> fprintf(stderr, "amdgpu: LLVM 3.6.1 is required, got LLVM %i.%i.%i\n",
> HAVE_LLVM >> 8, HAVE_LLVM & 255, MESA_LLVM_VERSION_PATCH);
> goto fail;
> }
>
> /* family and rev_id are for addrlib */
> switch (ws->info.family) {
> + case CHIP_TAHITI:
> + ws->family = FAMILY_SI;
> + ws->rev_id = SI_TAHITI_P_A0;
> + break;
> + case CHIP_PITCAIRN:
> + ws->family = FAMILY_SI;
> + ws->rev_id = SI_PITCAIRN_PM_A0;
> + break;
> + case CHIP_VERDE:
> + ws->family = FAMILY_SI;
> + ws->rev_id = SI_CAPEVERDE_M_A0;
> + break;
> + case CHIP_OLAND:
> + ws->family = FAMILY_SI;
> + ws->rev_id = SI_OLAND_M_A0;
> + break;
> + case CHIP_HAINAN:
> + ws->family = FAMILY_SI;
> + ws->rev_id = SI_HAINAN_V_A0;
> + break;
> case CHIP_BONAIRE:
> ws->family = FAMILY_CI;
> ws->rev_id = CI_BONAIRE_M_A0;
> break;
> case CHIP_KAVERI:
> ws->family = FAMILY_KV;
> ws->rev_id = KV_SPECTRE_A0;
> break;
> case CHIP_KABINI:
> ws->family = FAMILY_KV;
> @@ -324,20 +346,23 @@ static bool do_winsys_init(struct amdgpu_winsys *ws, int fd)
>
> memcpy(ws->info.si_tile_mode_array, ws->amdinfo.gb_tile_mode,
> sizeof(ws->amdinfo.gb_tile_mode));
> ws->info.enabled_rb_mask = ws->amdinfo.enabled_rb_pipes_mask;
>
> memcpy(ws->info.cik_macrotile_mode_array, ws->amdinfo.gb_macro_tile_mode,
> sizeof(ws->amdinfo.gb_macro_tile_mode));
>
> ws->info.gart_page_size = alignment_info.size_remote;
>
> + if (ws->info.chip_class == SI)
> + ws->info.gfx_ib_pad_with_type2 = TRUE;
> +
> ws->check_vm = strstr(debug_get_option("R600_DEBUG", ""), "check_vm") != NULL;
>
> return true;
>
> fail:
> if (ws->addrlib)
> AddrDestroy(ws->addrlib);
> amdgpu_device_deinitialize(ws->dev);
> ws->dev = NULL;
> return false;
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list