From: Jerome Glisse <j.glisse@gmail.com>
To: alexdeucher@gmail.com
Cc: Alex Deucher <alexander.deucher@amd.com>,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 19/48] drm/radeon/kms: add support for MC/VM setup on SI
Date: Tue, 20 Mar 2012 19:20:32 -0400 [thread overview]
Message-ID: <1332285632.1654.6.camel@localhost.localdomain> (raw)
In-Reply-To: <1332278322-12875-20-git-send-email-alexdeucher@gmail.com>
On Tue, 2012-03-20 at 17:18 -0400, alexdeucher@gmail.com wrote:
> From: Alex Deucher <alexander.deucher@amd.com>
>
> Sets up the VM and adds support for the new VM ioctls.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/radeon/si.c | 328 ++++++++++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/radeon/sid.h | 219 ++++++++++++++++++++++++++++
> 2 files changed, 547 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index 58ad900..ad91c5f 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -1608,3 +1608,331 @@ int si_asic_reset(struct radeon_device *rdev)
> return si_gpu_soft_reset(rdev);
> }
>
> +/* MC */
> +static void si_mc_program(struct radeon_device *rdev)
> +{
> + struct evergreen_mc_save save;
> + u32 tmp;
> + int i, j;
> +
> + /* Initialize HDP */
> + for (i = 0, j = 0; i < 32; i++, j += 0x18) {
> + WREG32((0x2c14 + j), 0x00000000);
> + WREG32((0x2c18 + j), 0x00000000);
> + WREG32((0x2c1c + j), 0x00000000);
> + WREG32((0x2c20 + j), 0x00000000);
> + WREG32((0x2c24 + j), 0x00000000);
> + }
> + WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
> +
> + evergreen_mc_stop(rdev, &save);
> + if (radeon_mc_wait_for_idle(rdev)) {
> + dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
> + }
> + /* Lockout access through VGA aperture*/
> + WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
> + /* Update configuration */
> + WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
> + rdev->mc.vram_start >> 12);
> + WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
> + rdev->mc.vram_end >> 12);
> + WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
> + rdev->vram_scratch.gpu_addr >> 12);
> + tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
> + tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
> + WREG32(MC_VM_FB_LOCATION, tmp);
> + /* XXX double check these! */
> + WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
> + WREG32(HDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
> + WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF);
> + WREG32(MC_VM_AGP_BASE, 0);
> + WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
> + WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
> + if (radeon_mc_wait_for_idle(rdev)) {
> + dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
> + }
> + evergreen_mc_resume(rdev, &save);
> + /* we need to own VRAM, so turn off the VGA renderer here
> + * to stop it overwriting our objects */
> + rv515_vga_render_disable(rdev);
> +}
> +
> +/* SI MC address space is 40 bits */
> +static void si_vram_location(struct radeon_device *rdev,
> + struct radeon_mc *mc, u64 base)
> +{
> + mc->vram_start = base;
> + if (mc->mc_vram_size > (0xFFFFFFFFFFULL - base + 1)) {
Why not ((1ULL << 40ULL) - 1ULL) so i don't have to count the number
of F in 0xFFFFFFFFFFULL ;)
> + dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
> + mc->real_vram_size = mc->aper_size;
> + mc->mc_vram_size = mc->aper_size;
> + }
> + mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
> + dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
> + mc->mc_vram_size >> 20, mc->vram_start,
> + mc->vram_end, mc->real_vram_size >> 20);
> +}
> +
> +static void si_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
> +{
> + u64 size_af, size_bf;
> +
> + size_af = ((0xFFFFFFFFFFULL - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
> + size_bf = mc->vram_start & ~mc->gtt_base_align;
> + if (size_bf > size_af) {
> + if (mc->gtt_size > size_bf) {
> + dev_warn(rdev->dev, "limiting GTT\n");
> + mc->gtt_size = size_bf;
> + }
> + mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size;
> + } else {
> + if (mc->gtt_size > size_af) {
> + dev_warn(rdev->dev, "limiting GTT\n");
> + mc->gtt_size = size_af;
> + }
> + mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
> + }
> + mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
> + dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
> + mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
> +}
> +
> +static void si_vram_gtt_location(struct radeon_device *rdev,
> + struct radeon_mc *mc)
> +{
> + if (mc->mc_vram_size > 0xFFC0000000ULL) {
> + /* leave room for at least 1024M GTT */
> + dev_warn(rdev->dev, "limiting VRAM\n");
> + mc->real_vram_size = 0xFFC0000000ULL;
> + mc->mc_vram_size = 0xFFC0000000ULL;
> + }
> + si_vram_location(rdev, &rdev->mc, 0);
> + rdev->mc.gtt_base_align = 0;
> + si_gtt_location(rdev, mc);
> +}
> +
> +static int si_mc_init(struct radeon_device *rdev)
> +{
> + u32 tmp;
> + int chansize, numchan;
> +
> + /* Get VRAM informations */
> + rdev->mc.vram_is_ddr = true;
> + tmp = RREG32(MC_ARB_RAMCFG);
> + if (tmp & CHANSIZE_OVERRIDE) {
> + chansize = 16;
> + } else if (tmp & CHANSIZE_MASK) {
> + chansize = 64;
> + } else {
> + chansize = 32;
> + }
> + tmp = RREG32(MC_SHARED_CHMAP);
> + switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) {
> + case 0:
> + default:
> + numchan = 1;
> + break;
> + case 1:
> + numchan = 2;
> + break;
> + case 2:
> + numchan = 4;
> + break;
> + case 3:
> + numchan = 8;
> + break;
> + case 4:
> + numchan = 3;
> + break;
> + case 5:
> + numchan = 6;
> + break;
> + case 6:
> + numchan = 10;
> + break;
> + case 7:
> + numchan = 12;
> + break;
> + case 8:
> + numchan = 16;
> + break;
> + }
> + rdev->mc.vram_width = numchan * chansize;
> + /* Could aper size report 0 ? */
> + rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
> + rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
> + /* size in MB on si */
> + rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
> + rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
> + rdev->mc.visible_vram_size = rdev->mc.aper_size;
> + si_vram_gtt_location(rdev, &rdev->mc);
> + radeon_update_bandwidth_info(rdev);
> +
> + return 0;
> +}
> +
> +/*
> + * GART
> + */
> +void si_pcie_gart_tlb_flush(struct radeon_device *rdev)
> +{
> + /* flush hdp cache */
> + WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> +
> + /* bits 0-15 are the VM contexts0-15 */
> + WREG32(VM_INVALIDATE_REQUEST, 1);
> +}
> +
> +int si_pcie_gart_enable(struct radeon_device *rdev)
> +{
> + int r, i;
> +
> + if (rdev->gart.robj == NULL) {
> + dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
> + return -EINVAL;
> + }
> + r = radeon_gart_table_vram_pin(rdev);
> + if (r)
> + return r;
> + radeon_gart_restore(rdev);
> + /* Setup TLB control */
> + WREG32(MC_VM_MX_L1_TLB_CNTL,
> + (0xA << 7) |
> + ENABLE_L1_TLB |
> + SYSTEM_ACCESS_MODE_NOT_IN_SYS |
> + ENABLE_ADVANCED_DRIVER_MODEL |
> + SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
> + /* Setup L2 cache */
> + WREG32(VM_L2_CNTL, ENABLE_L2_CACHE |
> + ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
> + ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
> + EFFECTIVE_L2_QUEUE_SIZE(7) |
> + CONTEXT1_IDENTITY_ACCESS_MODE(1));
> + WREG32(VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS | INVALIDATE_L2_CACHE);
> + WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
> + L2_CACHE_BIGK_FRAGMENT_SIZE(0));
> + /* setup context0 */
> + WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
> + WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
> + WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
> + WREG32(VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
> + (u32)(rdev->dummy_page.addr >> 12));
> + WREG32(VM_CONTEXT0_CNTL2, 0);
> + WREG32(VM_CONTEXT0_CNTL, (ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
> + RANGE_PROTECTION_FAULT_ENABLE_DEFAULT));
> +
> + WREG32(0x15D4, 0);
> + WREG32(0x15D8, 0);
> + WREG32(0x15DC, 0);
> +
> + /* empty context1-15 */
> + /* FIXME start with 1G, once using 2 level pt switch to full
> + * vm size space
> + */
> + /* set vm size, must be a multiple of 4 */
> + WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0);
> + WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, (1 << 30) / RADEON_GPU_PAGE_SIZE);
> + for (i = 1; i < 16; i++) {
> + if (i < 8)
> + WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2),
> + rdev->gart.table_addr >> 12);
> + else
> + WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2),
> + rdev->gart.table_addr >> 12);
> + }
> +
> + /* enable context1-15 */
> + WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR,
> + (u32)(rdev->dummy_page.addr >> 12));
> + WREG32(VM_CONTEXT1_CNTL2, 0);
> + WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
> + RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
> +
> + si_pcie_gart_tlb_flush(rdev);
> + DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
> + (unsigned)(rdev->mc.gtt_size >> 20),
> + (unsigned long long)rdev->gart.table_addr);
> + rdev->gart.ready = true;
> + return 0;
> +}
> +
> +void si_pcie_gart_disable(struct radeon_device *rdev)
> +{
> + /* Disable all tables */
> + WREG32(VM_CONTEXT0_CNTL, 0);
> + WREG32(VM_CONTEXT1_CNTL, 0);
> + /* Setup TLB control */
> + WREG32(MC_VM_MX_L1_TLB_CNTL, SYSTEM_ACCESS_MODE_NOT_IN_SYS |
> + SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU);
> + /* Setup L2 cache */
> + WREG32(VM_L2_CNTL, ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
> + ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE |
> + EFFECTIVE_L2_QUEUE_SIZE(7) |
> + CONTEXT1_IDENTITY_ACCESS_MODE(1));
> + WREG32(VM_L2_CNTL2, 0);
> + WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
> + L2_CACHE_BIGK_FRAGMENT_SIZE(0));
> + radeon_gart_table_vram_unpin(rdev);
> +}
> +
> +void si_pcie_gart_fini(struct radeon_device *rdev)
> +{
> + si_pcie_gart_disable(rdev);
> + radeon_gart_table_vram_free(rdev);
> + radeon_gart_fini(rdev);
> +}
> +
> +/*
> + * vm
> + */
> +int si_vm_init(struct radeon_device *rdev)
> +{
> + /* number of VMs */
> + rdev->vm_manager.nvm = 16;
> + /* base offset of vram pages */
> + rdev->vm_manager.vram_base_offset = 0;
> +
> + return 0;
> +}
> +
> +void si_vm_fini(struct radeon_device *rdev)
> +{
> +}
> +
> +int si_vm_bind(struct radeon_device *rdev, struct radeon_vm *vm, int id)
> +{
> + if (id < 8)
> + WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (id << 2), vm->pt_gpu_addr >> 12);
> + else
> + WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((id - 8) << 2),
> + vm->pt_gpu_addr >> 12);
> + /* flush hdp cache */
> + WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> + /* bits 0-15 are the VM contexts0-15 */
> + WREG32(VM_INVALIDATE_REQUEST, 1 << id);
> + return 0;
> +}
> +
> +void si_vm_unbind(struct radeon_device *rdev, struct radeon_vm *vm)
> +{
> + if (vm->id < 8)
> + WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2), 0);
> + else
> + WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2), 0);
> + /* flush hdp cache */
> + WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> + /* bits 0-15 are the VM contexts0-15 */
> + WREG32(VM_INVALIDATE_REQUEST, 1 << vm->id);
> +}
> +
> +void si_vm_tlb_flush(struct radeon_device *rdev, struct radeon_vm *vm)
> +{
> + if (vm->id == -1)
> + return;
> +
> + /* flush hdp cache */
> + WREG32(HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
> + /* bits 0-15 are the VM contexts0-15 */
> + WREG32(VM_INVALIDATE_REQUEST, 1 << vm->id);
> +}
> +
> diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h
> index 4c6ff1c..4d9cdc8 100644
> --- a/drivers/gpu/drm/radeon/sid.h
> +++ b/drivers/gpu/drm/radeon/sid.h
> @@ -50,6 +50,9 @@
> #define SI_MAX_TCC 16
> #define SI_MAX_TCC_MASK 0xFFFF
>
> +#define VGA_HDP_CONTROL 0x328
> +#define VGA_MEMORY_DISABLE (1 << 4)
> +
> #define DMIF_ADDR_CONFIG 0xBD4
>
> #define SRBM_STATUS 0xE50
> @@ -57,11 +60,88 @@
> #define CC_SYS_RB_BACKEND_DISABLE 0xe80
> #define GC_USER_SYS_RB_BACKEND_DISABLE 0xe84
>
> +#define VM_L2_CNTL 0x1400
> +#define ENABLE_L2_CACHE (1 << 0)
> +#define ENABLE_L2_FRAGMENT_PROCESSING (1 << 1)
> +#define L2_CACHE_PTE_ENDIAN_SWAP_MODE(x) ((x) << 2)
> +#define L2_CACHE_PDE_ENDIAN_SWAP_MODE(x) ((x) << 4)
> +#define ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE (1 << 9)
> +#define ENABLE_L2_PDE0_CACHE_LRU_UPDATE_BY_WRITE (1 << 10)
> +#define EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 7) << 15)
> +#define CONTEXT1_IDENTITY_ACCESS_MODE(x) (((x) & 3) << 19)
> +#define VM_L2_CNTL2 0x1404
> +#define INVALIDATE_ALL_L1_TLBS (1 << 0)
> +#define INVALIDATE_L2_CACHE (1 << 1)
> +#define INVALIDATE_CACHE_MODE(x) ((x) << 26)
> +#define INVALIDATE_PTE_AND_PDE_CACHES 0
> +#define INVALIDATE_ONLY_PTE_CACHES 1
> +#define INVALIDATE_ONLY_PDE_CACHES 2
> +#define VM_L2_CNTL3 0x1408
> +#define BANK_SELECT(x) ((x) << 0)
> +#define L2_CACHE_UPDATE_MODE(x) ((x) << 6)
> +#define L2_CACHE_BIGK_FRAGMENT_SIZE(x) ((x) << 15)
> +#define L2_CACHE_BIGK_ASSOCIATIVITY (1 << 20)
> +#define VM_L2_STATUS 0x140C
> +#define L2_BUSY (1 << 0)
> +#define VM_CONTEXT0_CNTL 0x1410
> +#define ENABLE_CONTEXT (1 << 0)
> +#define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1)
> +#define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4)
> +#define VM_CONTEXT1_CNTL 0x1414
> +#define VM_CONTEXT0_CNTL2 0x1430
> +#define VM_CONTEXT1_CNTL2 0x1434
> +#define VM_CONTEXT8_PAGE_TABLE_BASE_ADDR 0x1438
> +#define VM_CONTEXT9_PAGE_TABLE_BASE_ADDR 0x143c
> +#define VM_CONTEXT10_PAGE_TABLE_BASE_ADDR 0x1440
> +#define VM_CONTEXT11_PAGE_TABLE_BASE_ADDR 0x1444
> +#define VM_CONTEXT12_PAGE_TABLE_BASE_ADDR 0x1448
> +#define VM_CONTEXT13_PAGE_TABLE_BASE_ADDR 0x144c
> +#define VM_CONTEXT14_PAGE_TABLE_BASE_ADDR 0x1450
> +#define VM_CONTEXT15_PAGE_TABLE_BASE_ADDR 0x1454
> +
> +#define VM_INVALIDATE_REQUEST 0x1478
> +#define VM_INVALIDATE_RESPONSE 0x147c
> +
> +#define VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR 0x1518
> +#define VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR 0x151c
> +
> +#define VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x153c
> +#define VM_CONTEXT1_PAGE_TABLE_BASE_ADDR 0x1540
> +#define VM_CONTEXT2_PAGE_TABLE_BASE_ADDR 0x1544
> +#define VM_CONTEXT3_PAGE_TABLE_BASE_ADDR 0x1548
> +#define VM_CONTEXT4_PAGE_TABLE_BASE_ADDR 0x154c
> +#define VM_CONTEXT5_PAGE_TABLE_BASE_ADDR 0x1550
> +#define VM_CONTEXT6_PAGE_TABLE_BASE_ADDR 0x1554
> +#define VM_CONTEXT7_PAGE_TABLE_BASE_ADDR 0x1558
> +#define VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x155c
> +#define VM_CONTEXT1_PAGE_TABLE_START_ADDR 0x1560
> +
> +#define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C
> +#define VM_CONTEXT1_PAGE_TABLE_END_ADDR 0x1580
> +
> #define MC_SHARED_CHMAP 0x2004
> #define NOOFCHAN_SHIFT 12
> #define NOOFCHAN_MASK 0x0000f000
> #define MC_SHARED_CHREMAP 0x2008
>
> +#define MC_VM_FB_LOCATION 0x2024
> +#define MC_VM_AGP_TOP 0x2028
> +#define MC_VM_AGP_BOT 0x202C
> +#define MC_VM_AGP_BASE 0x2030
> +#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
> +#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
> +#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
> +
> +#define MC_VM_MX_L1_TLB_CNTL 0x2064
> +#define ENABLE_L1_TLB (1 << 0)
> +#define ENABLE_L1_FRAGMENT_PROCESSING (1 << 1)
> +#define SYSTEM_ACCESS_MODE_PA_ONLY (0 << 3)
> +#define SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 3)
> +#define SYSTEM_ACCESS_MODE_IN_SYS (2 << 3)
> +#define SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 3)
> +#define SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU (0 << 5)
> +#define ENABLE_ADVANCED_DRIVER_MODEL (1 << 6)
> +
> #define MC_ARB_RAMCFG 0x2760
> #define NOOFBANK_SHIFT 0
> #define NOOFBANK_MASK 0x00000003
> @@ -73,19 +153,29 @@
> #define NOOFCOLS_MASK 0x000000C0
> #define CHANSIZE_SHIFT 8
> #define CHANSIZE_MASK 0x00000100
> +#define CHANSIZE_OVERRIDE (1 << 11)
> #define NOOFGROUPS_SHIFT 12
> #define NOOFGROUPS_MASK 0x00001000
>
> #define HDP_HOST_PATH_CNTL 0x2C00
> +#define HDP_NONSURFACE_BASE 0x2C04
> +#define HDP_NONSURFACE_INFO 0x2C08
> +#define HDP_NONSURFACE_SIZE 0x2C0C
>
> #define HDP_ADDR_CONFIG 0x2F48
> #define HDP_MISC_CNTL 0x2F4C
> #define HDP_FLUSH_INVALIDATE_CACHE (1 << 0)
>
> +#define CONFIG_MEMSIZE 0x5428
> +
> +#define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480
> +
> #define BIF_FB_EN 0x5490
> #define FB_READ_EN (1 << 0)
> #define FB_WRITE_EN (1 << 1)
>
> +#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
> +
> #define DC_LB_MEMORY_SPLIT 0x6b0c
> #define DC_LB_MEMORY_CONFIG(x) ((x) << 20)
>
> @@ -321,5 +411,134 @@
> #define TCP_CHAN_STEER_LO 0xac0c
> #define TCP_CHAN_STEER_HI 0xac10
>
> +/*
> + * PM4
> + */
> +#define PACKET_TYPE0 0
> +#define PACKET_TYPE1 1
> +#define PACKET_TYPE2 2
> +#define PACKET_TYPE3 3
> +
> +#define CP_PACKET_GET_TYPE(h) (((h) >> 30) & 3)
> +#define CP_PACKET_GET_COUNT(h) (((h) >> 16) & 0x3FFF)
> +#define CP_PACKET0_GET_REG(h) (((h) & 0xFFFF) << 2)
> +#define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF)
> +#define PACKET0(reg, n) ((PACKET_TYPE0 << 30) | \
> + (((reg) >> 2) & 0xFFFF) | \
> + ((n) & 0x3FFF) << 16)
> +#define CP_PACKET2 0x80000000
> +#define PACKET2_PAD_SHIFT 0
> +#define PACKET2_PAD_MASK (0x3fffffff << 0)
> +
> +#define PACKET2(v) (CP_PACKET2 | REG_SET(PACKET2_PAD, (v)))
> +
> +#define PACKET3(op, n) ((PACKET_TYPE3 << 30) | \
> + (((op) & 0xFF) << 8) | \
> + ((n) & 0x3FFF) << 16)
> +
> +/* Packet 3 types */
> +#define PACKET3_NOP 0x10
> +#define PACKET3_SET_BASE 0x11
> +#define PACKET3_BASE_INDEX(x) ((x) << 0)
> +#define GDS_PARTITION_BASE 2
> +#define CE_PARTITION_BASE 3
> +#define PACKET3_CLEAR_STATE 0x12
> +#define PACKET3_INDEX_BUFFER_SIZE 0x13
> +#define PACKET3_DISPATCH_DIRECT 0x15
> +#define PACKET3_DISPATCH_INDIRECT 0x16
> +#define PACKET3_ALLOC_GDS 0x1B
> +#define PACKET3_WRITE_GDS_RAM 0x1C
> +#define PACKET3_ATOMIC_GDS 0x1D
> +#define PACKET3_ATOMIC 0x1E
> +#define PACKET3_OCCLUSION_QUERY 0x1F
> +#define PACKET3_SET_PREDICATION 0x20
> +#define PACKET3_REG_RMW 0x21
> +#define PACKET3_COND_EXEC 0x22
> +#define PACKET3_PRED_EXEC 0x23
> +#define PACKET3_DRAW_INDIRECT 0x24
> +#define PACKET3_DRAW_INDEX_INDIRECT 0x25
> +#define PACKET3_INDEX_BASE 0x26
> +#define PACKET3_DRAW_INDEX_2 0x27
> +#define PACKET3_CONTEXT_CONTROL 0x28
> +#define PACKET3_INDEX_TYPE 0x2A
> +#define PACKET3_DRAW_INDIRECT_MULTI 0x2C
> +#define PACKET3_DRAW_INDEX_AUTO 0x2D
> +#define PACKET3_DRAW_INDEX_IMMD 0x2E
> +#define PACKET3_NUM_INSTANCES 0x2F
> +#define PACKET3_DRAW_INDEX_MULTI_AUTO 0x30
> +#define PACKET3_INDIRECT_BUFFER_CONST 0x31
> +#define PACKET3_INDIRECT_BUFFER 0x32
> +#define PACKET3_STRMOUT_BUFFER_UPDATE 0x34
> +#define PACKET3_DRAW_INDEX_OFFSET_2 0x35
> +#define PACKET3_DRAW_INDEX_MULTI_ELEMENT 0x36
> +#define PACKET3_WRITE_DATA 0x37
> +#define PACKET3_DRAW_INDEX_INDIRECT_MULTI 0x38
> +#define PACKET3_MEM_SEMAPHORE 0x39
> +#define PACKET3_MPEG_INDEX 0x3A
> +#define PACKET3_COPY_DW 0x3B
> +#define PACKET3_WAIT_REG_MEM 0x3C
> +#define PACKET3_MEM_WRITE 0x3D
> +#define PACKET3_COPY_DATA 0x40
> +#define PACKET3_PFP_SYNC_ME 0x42
> +#define PACKET3_SURFACE_SYNC 0x43
> +# define PACKET3_DEST_BASE_0_ENA (1 << 0)
> +# define PACKET3_DEST_BASE_1_ENA (1 << 1)
> +# define PACKET3_CB0_DEST_BASE_ENA (1 << 6)
> +# define PACKET3_CB1_DEST_BASE_ENA (1 << 7)
> +# define PACKET3_CB2_DEST_BASE_ENA (1 << 8)
> +# define PACKET3_CB3_DEST_BASE_ENA (1 << 9)
> +# define PACKET3_CB4_DEST_BASE_ENA (1 << 10)
> +# define PACKET3_CB5_DEST_BASE_ENA (1 << 11)
> +# define PACKET3_CB6_DEST_BASE_ENA (1 << 12)
> +# define PACKET3_CB7_DEST_BASE_ENA (1 << 13)
> +# define PACKET3_DB_DEST_BASE_ENA (1 << 14)
> +# define PACKET3_DEST_BASE_2_ENA (1 << 19)
> +# define PACKET3_DEST_BASE_3_ENA (1 << 21)
> +# define PACKET3_TCL1_ACTION_ENA (1 << 22)
> +# define PACKET3_TC_ACTION_ENA (1 << 23)
> +# define PACKET3_CB_ACTION_ENA (1 << 25)
> +# define PACKET3_DB_ACTION_ENA (1 << 26)
> +# define PACKET3_SH_KCACHE_ACTION_ENA (1 << 27)
> +# define PACKET3_SH_ICACHE_ACTION_ENA (1 << 29)
> +#define PACKET3_ME_INITIALIZE 0x44
> +#define PACKET3_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
> +#define PACKET3_COND_WRITE 0x45
> +#define PACKET3_EVENT_WRITE 0x46
> +#define PACKET3_EVENT_WRITE_EOP 0x47
> +#define PACKET3_EVENT_WRITE_EOS 0x48
> +#define PACKET3_PREAMBLE_CNTL 0x4A
> +# define PACKET3_PREAMBLE_BEGIN_CLEAR_STATE (2 << 28)
> +# define PACKET3_PREAMBLE_END_CLEAR_STATE (3 << 28)
> +#define PACKET3_ONE_REG_WRITE 0x57
> +#define PACKET3_LOAD_CONFIG_REG 0x5F
> +#define PACKET3_LOAD_CONTEXT_REG 0x60
> +#define PACKET3_LOAD_SH_REG 0x61
> +#define PACKET3_SET_CONFIG_REG 0x68
> +#define PACKET3_SET_CONFIG_REG_START 0x00008000
> +#define PACKET3_SET_CONFIG_REG_END 0x0000b000
> +#define PACKET3_SET_CONTEXT_REG 0x69
> +#define PACKET3_SET_CONTEXT_REG_START 0x00028000
> +#define PACKET3_SET_CONTEXT_REG_END 0x00029000
> +#define PACKET3_SET_CONTEXT_REG_INDIRECT 0x73
> +#define PACKET3_SET_RESOURCE_INDIRECT 0x74
> +#define PACKET3_SET_SH_REG 0x76
> +#define PACKET3_SET_SH_REG_START 0x0000b000
> +#define PACKET3_SET_SH_REG_END 0x0000c000
> +#define PACKET3_SET_SH_REG_OFFSET 0x77
> +#define PACKET3_ME_WRITE 0x7A
> +#define PACKET3_SCRATCH_RAM_WRITE 0x7D
> +#define PACKET3_SCRATCH_RAM_READ 0x7E
> +#define PACKET3_CE_WRITE 0x7F
> +#define PACKET3_LOAD_CONST_RAM 0x80
> +#define PACKET3_WRITE_CONST_RAM 0x81
> +#define PACKET3_WRITE_CONST_RAM_OFFSET 0x82
> +#define PACKET3_DUMP_CONST_RAM 0x83
> +#define PACKET3_INCREMENT_CE_COUNTER 0x84
> +#define PACKET3_INCREMENT_DE_COUNTER 0x85
> +#define PACKET3_WAIT_ON_CE_COUNTER 0x86
> +#define PACKET3_WAIT_ON_DE_COUNTER 0x87
> +#define PACKET3_WAIT_ON_DE_COUNTER_DIFF 0x88
> +#define PACKET3_SET_CE_DE_COUNTERS 0x89
> +#define PACKET3_WAIT_ON_AVAIL_BUFFER 0x8A
>
> #endif
Good as is
Cheers,
Jerome
next prev parent reply other threads:[~2012-03-20 23:20 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-20 21:17 [PATCH 00/48] Add SI, TN support alexdeucher
2012-03-20 21:17 ` [PATCH 01/48] drm/radeon/kms: add info query for max pipes alexdeucher
2012-03-20 21:17 ` [PATCH 02/48] drm/radeon/kms: Upstream ObjectID.h updates alexdeucher
2012-03-20 21:17 ` [PATCH 03/48] drm/radeon/kms: upstream atombios.h updates alexdeucher
2012-03-20 21:17 ` [PATCH 04/48] drm/radeon/kms: upstream power table updates alexdeucher
2012-03-20 21:17 ` [PATCH 05/48] drm/radeon/kms: add SI chip families alexdeucher
2012-03-20 21:18 ` [PATCH 06/48] drm/radeon/kms: add initial DCE6 display watermark support alexdeucher
2012-03-20 23:18 ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 07/48] drm/radeon/kms: fix up atom HPD gpio parsing for DCE6 alexdeucher
2012-03-20 21:18 ` [PATCH 08/48] drm/radeon/kms/atom: DCE6 no longer has crtcmemreq bits alexdeucher
2012-03-20 21:18 ` [PATCH 09/48] drm/radeon/kms/atom: add support for crtc power gating alexdeucher
2012-03-20 21:18 ` [PATCH 10/48] drm/radeon/kms: DCE6 disp eng pll updates alexdeucher
2012-03-20 21:18 ` [PATCH 11/48] drm/radeon/kms/atom: add support for DCE6.x dig transmitters alexdeucher
2012-03-20 21:18 ` [PATCH 12/48] drm/radeon/kms: DP aux updates for DCE6 alexdeucher
2012-03-20 21:18 ` [PATCH 13/48] drm/radeon/kms: update comments about dig encoders/transmitters alexdeucher
2012-03-20 21:18 ` [PATCH 14/48] drm/radeon/kms/atom: add support for SI SetVoltage table alexdeucher
2012-03-20 21:18 ` [PATCH 15/48] drm/radeon/kms: update power table parsing for SI alexdeucher
2012-03-20 21:18 ` [PATCH 16/48] drm/radeon/kms: add support for internal thermal sensor on SI alexdeucher
2012-03-20 21:18 ` [PATCH 17/48] drm/radeon/kms: add gpu init support for SI alexdeucher
2012-03-20 23:16 ` Jerome Glisse
2012-03-20 21:18 ` [PATCH 18/48] drm/radeon/kms: Add support for SI GPU reset alexdeucher
2012-03-20 21:18 ` [PATCH 19/48] drm/radeon/kms: add support for MC/VM setup on SI alexdeucher
2012-03-20 23:20 ` Jerome Glisse [this message]
2012-03-20 21:18 ` [PATCH 20/48] drm/radeon/kms: add support for the CONST IB to the CS ioctl alexdeucher
2012-03-20 21:18 ` [PATCH 21/48] drm/radeon/kms: add VM CS checker for SI alexdeucher
2012-03-20 21:18 ` [PATCH 22/48] drm/radeon/kms: Only VM CS ioctl is supported on SI (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 23/48] drm/radeon/kms: add ucode loading for SI alexdeucher
2012-03-20 21:18 ` [PATCH 24/48] drm/radeon/kms: add support for MC ucode loading on SI alexdeucher
2012-03-20 21:18 ` [PATCH 25/48] drm/radeon/kms: add support for CP setup " alexdeucher
2012-03-20 21:18 ` [PATCH 26/48] drm/radeon/kms: add IB and fence dispatch functions for SI alexdeucher
2012-03-20 21:18 ` [PATCH 27/48] drm/radeon/kms: Add support for RLC init on SI alexdeucher
2012-03-20 21:18 ` [PATCH 28/48] drm/radeon/kms: add support for interrupts " alexdeucher
2012-03-20 21:18 ` [PATCH 29/48] drm/radeon/kms: fill in startup/shutdown callbacks for SI alexdeucher
2012-03-20 21:18 ` [PATCH 30/48] drm/radeon/kms: add support for compute rings in CS ioctl on SI alexdeucher
2012-03-20 21:18 ` [PATCH 31/48] drm/radeon/kms: add radeon_asic struct for SI alexdeucher
2012-03-20 21:18 ` [PATCH 32/48] drm/radeon: Update radeon_info_ioctl for SI. (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 33/48] drm/radeon/kms: Add SI pci ids alexdeucher
2012-03-20 21:18 ` [PATCH 34/48] drm/radeon/kms: add trinity (TN) chip family alexdeucher
2012-03-20 21:18 ` [PATCH 35/48] drm/radeon/kms: no support for internal thermal sensor on TN yet alexdeucher
2012-03-20 21:18 ` [PATCH 36/48] drm/radeon/kms: DCE6.1 watermark updates for TN alexdeucher
2012-03-20 21:18 ` [PATCH 37/48] drm/radeon/kms: DCE6.1 disp eng pll updates alexdeucher
2012-03-20 21:18 ` [PATCH 38/48] drm/radeon/kms: Adjust pll picker for DCE6.1 alexdeucher
2012-03-20 21:18 ` [PATCH 39/48] drm/radeon/kms: disable PPLL0 on DCE6.1 when not in use alexdeucher
2012-03-20 21:18 ` [PATCH 40/48] drm/radeon/kms/DCE6.1: ss is not supported on the internal pplls alexdeucher
2012-03-20 21:18 ` [PATCH 41/48] drm/radeon/kms: Add checks for TN in the DP bridge code alexdeucher
2012-03-20 21:18 ` [PATCH 42/48] drm/radeon/kms: cayman gpu init updates for trinity alexdeucher
2012-03-20 21:18 ` [PATCH 43/48] drm/radeon/kms: Update evergreen functions " alexdeucher
2012-03-20 21:18 ` [PATCH 44/48] drm/radeon/kms/vm: set vram base offset properly for TN alexdeucher
2012-03-20 21:18 ` [PATCH 45/48] drm/radeon/kms: add support for ucode loading on trinity (v2) alexdeucher
2012-03-20 21:18 ` [PATCH 46/48] drm/radeon/kms: add radeon_asic struct for trinity alexdeucher
2012-03-20 21:18 ` [PATCH 47/48] drm/radeon/kms: add trinity pci ids alexdeucher
2012-03-20 21:18 ` [PATCH 48/48] drm/radeon/kms: update duallink checks for DCE6 alexdeucher
2012-03-20 23:17 ` [PATCH 00/48] Add SI, TN support Jerome Glisse
2012-03-21 11:18 ` Christian König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1332285632.1654.6.camel@localhost.localdomain \
--to=j.glisse@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=alexdeucher@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.