Merge branch 'drm-next-4.16' of git://people.freedesktop.org/~agd5f/linux into drm-next
* 'drm-next-4.16' of git://people.freedesktop.org/~agd5f/linux: (171 commits) drm/amdgpu: fix test for shadow page tables drm/amd/display: Expose dpp1_set_cursor_attributes drm/amd/display: Update FMT and OPPBUF functions drm/amd/display: check for null before calling is_blanked drm/amd/display: dal 3.1.27 drm/amd/display: Fix unused variable warnings. drm/amd/display: Only blank DCN when we have set_blank implementation drm/amd/display: Put dcn_mi_registers with other structs drm/amd/display: hubp refactor drm/amd/display: integrating optc pseudocode drm/amd/display: Call validate_fbc should_enable_fbc drm/amd/display: Clean up DCN cursor code drm/amd/display: fix 180 full screen pipe split drm/amd/display: reprogram surface config on scaling change drm/amd/display: Remove dwbc from pipe_ctx drm/amd/display: Use the maximum link setting which EDP reported. drm/amd/display: Add hdr_supported flag drm/amd/display: fix global sync param retrieval when not pipe splitting drm/amd/display: Update HUBP drm/amd/display: fix rotated surface scaling ...
This commit is contained in:
commit
df2869abd9
@ -4811,6 +4811,15 @@ S: Maintained
|
||||
F: drivers/gpu/drm/tinydrm/
|
||||
F: include/drm/tinydrm/
|
||||
|
||||
DRM TTM SUBSYSTEM
|
||||
M: Christian Koenig <christian.koenig@amd.com>
|
||||
M: Roger He <Hongbo.He@amd.com>
|
||||
T: git git://people.freedesktop.org/~agd5f/linux
|
||||
S: Maintained
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
F: include/drm/ttm/
|
||||
F: drivers/gpu/drm/ttm/
|
||||
|
||||
DSBR100 USB FM RADIO DRIVER
|
||||
M: Alexey Klimov <klimov.linux@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
@ -154,6 +154,10 @@ config DRM_VM
|
||||
bool
|
||||
depends on DRM && MMU
|
||||
|
||||
config DRM_SCHED
|
||||
tristate
|
||||
depends on DRM
|
||||
|
||||
source "drivers/gpu/drm/i2c/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/arm/Kconfig"
|
||||
@ -183,6 +187,7 @@ config DRM_AMDGPU
|
||||
depends on DRM && PCI && MMU
|
||||
select FW_LOADER
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_SCHED
|
||||
select DRM_TTM
|
||||
select POWER_SUPPLY
|
||||
select HWMON
|
||||
|
@ -102,3 +102,4 @@ obj-$(CONFIG_DRM_MXSFB) += mxsfb/
|
||||
obj-$(CONFIG_DRM_TINYDRM) += tinydrm/
|
||||
obj-$(CONFIG_DRM_PL111) += pl111/
|
||||
obj-$(CONFIG_DRM_TVE200) += tve200/
|
||||
obj-$(CONFIG_DRM_SCHED) += scheduler/
|
||||
|
@ -52,7 +52,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \
|
||||
amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \
|
||||
amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \
|
||||
amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o amdgpu_atomfirmware.o \
|
||||
amdgpu_queue_mgr.o amdgpu_vf_error.o amdgpu_sched.o
|
||||
amdgpu_queue_mgr.o amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o
|
||||
|
||||
# add asic specific block
|
||||
amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \
|
||||
@ -62,7 +62,7 @@ amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \
|
||||
amdgpu-$(CONFIG_DRM_AMDGPU_SI)+= si.o gmc_v6_0.o gfx_v6_0.o si_ih.o si_dma.o dce_v6_0.o si_dpm.o si_smc.o
|
||||
|
||||
amdgpu-y += \
|
||||
vi.o mxgpu_vi.o nbio_v6_1.o soc15.o mxgpu_ai.o nbio_v7_0.o
|
||||
vi.o mxgpu_vi.o nbio_v6_1.o soc15.o mxgpu_ai.o nbio_v7_0.o vega10_reg_init.o
|
||||
|
||||
# add GMC block
|
||||
amdgpu-y += \
|
||||
@ -135,10 +135,7 @@ amdgpu-y += \
|
||||
amdgpu-y += amdgpu_cgs.o
|
||||
|
||||
# GPU scheduler
|
||||
amdgpu-y += \
|
||||
../scheduler/gpu_scheduler.o \
|
||||
../scheduler/sched_fence.o \
|
||||
amdgpu_job.o
|
||||
amdgpu-y += amdgpu_job.o
|
||||
|
||||
# ACP componet
|
||||
ifneq ($(CONFIG_DRM_AMD_ACP),)
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/amdgpu_drm.h>
|
||||
#include <drm/gpu_scheduler.h>
|
||||
|
||||
#include <kgd_kfd_interface.h>
|
||||
#include "dm_pp_interface.h"
|
||||
@ -68,10 +69,9 @@
|
||||
#include "amdgpu_vcn.h"
|
||||
#include "amdgpu_mn.h"
|
||||
#include "amdgpu_dm.h"
|
||||
#include "gpu_scheduler.h"
|
||||
#include "amdgpu_virt.h"
|
||||
#include "amdgpu_gart.h"
|
||||
|
||||
#include "amdgpu_debugfs.h"
|
||||
|
||||
/*
|
||||
* Modules parameters.
|
||||
@ -126,6 +126,7 @@ extern int amdgpu_param_buf_per_se;
|
||||
extern int amdgpu_job_hang_limit;
|
||||
extern int amdgpu_lbpw;
|
||||
extern int amdgpu_compute_multipipe;
|
||||
extern int amdgpu_gpu_recovery;
|
||||
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
extern int amdgpu_si_support;
|
||||
@ -223,17 +224,18 @@ enum amdgpu_kiq_irq {
|
||||
AMDGPU_CP_KIQ_IRQ_LAST
|
||||
};
|
||||
|
||||
int amdgpu_set_clockgating_state(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type,
|
||||
enum amd_clockgating_state state);
|
||||
int amdgpu_set_powergating_state(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type,
|
||||
enum amd_powergating_state state);
|
||||
void amdgpu_get_clockgating_state(struct amdgpu_device *adev, u32 *flags);
|
||||
int amdgpu_wait_for_idle(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
bool amdgpu_is_idle(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
int amdgpu_device_ip_set_clockgating_state(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type,
|
||||
enum amd_clockgating_state state);
|
||||
int amdgpu_device_ip_set_powergating_state(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type,
|
||||
enum amd_powergating_state state);
|
||||
void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
|
||||
u32 *flags);
|
||||
int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
bool amdgpu_device_ip_is_idle(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type block_type);
|
||||
|
||||
#define AMDGPU_MAX_IP_NUM 16
|
||||
|
||||
@ -258,15 +260,16 @@ struct amdgpu_ip_block {
|
||||
const struct amdgpu_ip_block_version *version;
|
||||
};
|
||||
|
||||
int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type type,
|
||||
u32 major, u32 minor);
|
||||
int amdgpu_device_ip_block_version_cmp(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type type,
|
||||
u32 major, u32 minor);
|
||||
|
||||
struct amdgpu_ip_block * amdgpu_get_ip_block(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type type);
|
||||
struct amdgpu_ip_block *
|
||||
amdgpu_device_ip_get_ip_block(struct amdgpu_device *adev,
|
||||
enum amd_ip_block_type type);
|
||||
|
||||
int amdgpu_ip_block_add(struct amdgpu_device *adev,
|
||||
const struct amdgpu_ip_block_version *ip_block_version);
|
||||
int amdgpu_device_ip_block_add(struct amdgpu_device *adev,
|
||||
const struct amdgpu_ip_block_version *ip_block_version);
|
||||
|
||||
/* provided by hw blocks that can move/clear data. e.g., gfx or sdma */
|
||||
struct amdgpu_buffer_funcs {
|
||||
@ -346,7 +349,8 @@ struct amdgpu_gart_funcs {
|
||||
uint64_t (*get_vm_pte_flags)(struct amdgpu_device *adev,
|
||||
uint32_t flags);
|
||||
/* get the pde for a given mc addr */
|
||||
u64 (*get_vm_pde)(struct amdgpu_device *adev, u64 addr);
|
||||
void (*get_vm_pde)(struct amdgpu_device *adev, int level,
|
||||
u64 *dst, u64 *flags);
|
||||
uint32_t (*get_invalidate_req)(unsigned int vm_id);
|
||||
};
|
||||
|
||||
@ -373,9 +377,6 @@ struct amdgpu_dummy_page {
|
||||
struct page *page;
|
||||
dma_addr_t addr;
|
||||
};
|
||||
int amdgpu_dummy_page_init(struct amdgpu_device *adev);
|
||||
void amdgpu_dummy_page_fini(struct amdgpu_device *adev);
|
||||
|
||||
|
||||
/*
|
||||
* Clocks
|
||||
@ -423,7 +424,6 @@ struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *);
|
||||
void *amdgpu_gem_prime_vmap(struct drm_gem_object *obj);
|
||||
void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
|
||||
int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
|
||||
int amdgpu_gem_debugfs_init(struct amdgpu_device *adev);
|
||||
|
||||
/* sub-allocation manager, it has to be protected by another lock.
|
||||
* By conception this is an helper for other part of the driver
|
||||
@ -540,6 +540,7 @@ struct amdgpu_mc {
|
||||
u64 private_aperture_end;
|
||||
/* protects concurrent invalidation */
|
||||
spinlock_t invalidate_lock;
|
||||
bool translate_further;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -650,12 +651,6 @@ typedef enum _AMDGPU_DOORBELL64_ASSIGNMENT
|
||||
AMDGPU_DOORBELL64_INVALID = 0xFFFF
|
||||
} AMDGPU_DOORBELL64_ASSIGNMENT;
|
||||
|
||||
|
||||
void amdgpu_doorbell_get_kfd_info(struct amdgpu_device *adev,
|
||||
phys_addr_t *aperture_base,
|
||||
size_t *aperture_size,
|
||||
size_t *start_offset);
|
||||
|
||||
/*
|
||||
* IRQS.
|
||||
*/
|
||||
@ -689,7 +684,7 @@ struct amdgpu_ib {
|
||||
uint32_t flags;
|
||||
};
|
||||
|
||||
extern const struct amd_sched_backend_ops amdgpu_sched_ops;
|
||||
extern const struct drm_sched_backend_ops amdgpu_sched_ops;
|
||||
|
||||
int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
|
||||
struct amdgpu_job **job, struct amdgpu_vm *vm);
|
||||
@ -699,7 +694,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
|
||||
void amdgpu_job_free_resources(struct amdgpu_job *job);
|
||||
void amdgpu_job_free(struct amdgpu_job *job);
|
||||
int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
|
||||
struct amd_sched_entity *entity, void *owner,
|
||||
struct drm_sched_entity *entity, void *owner,
|
||||
struct dma_fence **f);
|
||||
|
||||
/*
|
||||
@ -732,7 +727,7 @@ int amdgpu_queue_mgr_map(struct amdgpu_device *adev,
|
||||
struct amdgpu_ctx_ring {
|
||||
uint64_t sequence;
|
||||
struct dma_fence **fences;
|
||||
struct amd_sched_entity entity;
|
||||
struct drm_sched_entity entity;
|
||||
};
|
||||
|
||||
struct amdgpu_ctx {
|
||||
@ -746,8 +741,8 @@ struct amdgpu_ctx {
|
||||
struct dma_fence **fences;
|
||||
struct amdgpu_ctx_ring rings[AMDGPU_MAX_RINGS];
|
||||
bool preamble_presented;
|
||||
enum amd_sched_priority init_priority;
|
||||
enum amd_sched_priority override_priority;
|
||||
enum drm_sched_priority init_priority;
|
||||
enum drm_sched_priority override_priority;
|
||||
struct mutex lock;
|
||||
atomic_t guilty;
|
||||
};
|
||||
@ -767,7 +762,7 @@ int amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring,
|
||||
struct dma_fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
|
||||
struct amdgpu_ring *ring, uint64_t seq);
|
||||
void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx,
|
||||
enum amd_sched_priority priority);
|
||||
enum drm_sched_priority priority);
|
||||
|
||||
int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *filp);
|
||||
@ -1116,7 +1111,7 @@ struct amdgpu_cs_parser {
|
||||
#define AMDGPU_HAVE_CTX_SWITCH (1 << 2) /* bit set means context switch occured */
|
||||
|
||||
struct amdgpu_job {
|
||||
struct amd_sched_job base;
|
||||
struct drm_sched_job base;
|
||||
struct amdgpu_device *adev;
|
||||
struct amdgpu_vm *vm;
|
||||
struct amdgpu_ring *ring;
|
||||
@ -1170,10 +1165,10 @@ struct amdgpu_wb {
|
||||
unsigned long used[DIV_ROUND_UP(AMDGPU_MAX_WB, BITS_PER_LONG)];
|
||||
};
|
||||
|
||||
int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb);
|
||||
void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb);
|
||||
int amdgpu_device_wb_get(struct amdgpu_device *adev, u32 *wb);
|
||||
void amdgpu_device_wb_free(struct amdgpu_device *adev, u32 wb);
|
||||
|
||||
void amdgpu_get_pcie_info(struct amdgpu_device *adev);
|
||||
void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);
|
||||
|
||||
/*
|
||||
* SDMA
|
||||
@ -1238,24 +1233,6 @@ void amdgpu_benchmark(struct amdgpu_device *adev, int test_number);
|
||||
*/
|
||||
void amdgpu_test_moves(struct amdgpu_device *adev);
|
||||
|
||||
/*
|
||||
* Debugfs
|
||||
*/
|
||||
struct amdgpu_debugfs {
|
||||
const struct drm_info_list *files;
|
||||
unsigned num_files;
|
||||
};
|
||||
|
||||
int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
|
||||
const struct drm_info_list *files,
|
||||
unsigned nfiles);
|
||||
int amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
int amdgpu_debugfs_init(struct drm_minor *minor);
|
||||
#endif
|
||||
|
||||
int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
|
||||
|
||||
/*
|
||||
* amdgpu smumgr functions
|
||||
@ -1410,9 +1387,6 @@ struct amdgpu_fw_vram_usage {
|
||||
void *va;
|
||||
};
|
||||
|
||||
int amdgpu_fw_reserve_vram_init(struct amdgpu_device *adev);
|
||||
void amdgpu_fw_reserve_vram_fini(struct amdgpu_device *adev);
|
||||
|
||||
/*
|
||||
* CGS
|
||||
*/
|
||||
@ -1428,6 +1402,80 @@ typedef void (*amdgpu_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t);
|
||||
typedef uint32_t (*amdgpu_block_rreg_t)(struct amdgpu_device*, uint32_t, uint32_t);
|
||||
typedef void (*amdgpu_block_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t, uint32_t);
|
||||
|
||||
|
||||
/*
|
||||
* amdgpu nbio functions
|
||||
*
|
||||
*/
|
||||
struct nbio_hdp_flush_reg {
|
||||
u32 ref_and_mask_cp0;
|
||||
u32 ref_and_mask_cp1;
|
||||
u32 ref_and_mask_cp2;
|
||||
u32 ref_and_mask_cp3;
|
||||
u32 ref_and_mask_cp4;
|
||||
u32 ref_and_mask_cp5;
|
||||
u32 ref_and_mask_cp6;
|
||||
u32 ref_and_mask_cp7;
|
||||
u32 ref_and_mask_cp8;
|
||||
u32 ref_and_mask_cp9;
|
||||
u32 ref_and_mask_sdma0;
|
||||
u32 ref_and_mask_sdma1;
|
||||
};
|
||||
|
||||
struct amdgpu_nbio_funcs {
|
||||
const struct nbio_hdp_flush_reg *hdp_flush_reg;
|
||||
u32 (*get_hdp_flush_req_offset)(struct amdgpu_device *adev);
|
||||
u32 (*get_hdp_flush_done_offset)(struct amdgpu_device *adev);
|
||||
u32 (*get_pcie_index_offset)(struct amdgpu_device *adev);
|
||||
u32 (*get_pcie_data_offset)(struct amdgpu_device *adev);
|
||||
u32 (*get_rev_id)(struct amdgpu_device *adev);
|
||||
void (*mc_access_enable)(struct amdgpu_device *adev, bool enable);
|
||||
void (*hdp_flush)(struct amdgpu_device *adev);
|
||||
u32 (*get_memsize)(struct amdgpu_device *adev);
|
||||
void (*sdma_doorbell_range)(struct amdgpu_device *adev, int instance,
|
||||
bool use_doorbell, int doorbell_index);
|
||||
void (*enable_doorbell_aperture)(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void (*enable_doorbell_selfring_aperture)(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void (*ih_doorbell_range)(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index);
|
||||
void (*update_medium_grain_clock_gating)(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void (*update_medium_grain_light_sleep)(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void (*get_clockgating_state)(struct amdgpu_device *adev,
|
||||
u32 *flags);
|
||||
void (*ih_control)(struct amdgpu_device *adev);
|
||||
void (*init_registers)(struct amdgpu_device *adev);
|
||||
void (*detect_hw_virt)(struct amdgpu_device *adev);
|
||||
};
|
||||
|
||||
|
||||
/* Define the HW IP blocks will be used in driver , add more if necessary */
|
||||
enum amd_hw_ip_block_type {
|
||||
GC_HWIP = 1,
|
||||
HDP_HWIP,
|
||||
SDMA0_HWIP,
|
||||
SDMA1_HWIP,
|
||||
MMHUB_HWIP,
|
||||
ATHUB_HWIP,
|
||||
NBIO_HWIP,
|
||||
MP0_HWIP,
|
||||
UVD_HWIP,
|
||||
VCN_HWIP = UVD_HWIP,
|
||||
VCE_HWIP,
|
||||
DF_HWIP,
|
||||
DCE_HWIP,
|
||||
OSSSYS_HWIP,
|
||||
SMUIO_HWIP,
|
||||
PWR_HWIP,
|
||||
NBIF_HWIP,
|
||||
MAX_HWIP
|
||||
};
|
||||
|
||||
#define HWIP_MAX_INSTANCE 6
|
||||
|
||||
struct amd_powerplay {
|
||||
struct cgs_device *cgs_device;
|
||||
void *pp_handle;
|
||||
@ -1620,6 +1668,11 @@ struct amdgpu_device {
|
||||
/* amdkfd interface */
|
||||
struct kfd_dev *kfd;
|
||||
|
||||
/* soc15 register offset based on ip, instance and segment */
|
||||
uint32_t *reg_offset[MAX_HWIP][HWIP_MAX_INSTANCE];
|
||||
|
||||
const struct amdgpu_nbio_funcs *nbio_funcs;
|
||||
|
||||
/* delayed work_func for deferring clockgating during resume */
|
||||
struct delayed_work late_init_work;
|
||||
|
||||
@ -1785,7 +1838,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
||||
#define amdgpu_asic_get_config_memsize(adev) (adev)->asic_funcs->get_config_memsize((adev))
|
||||
#define amdgpu_gart_flush_gpu_tlb(adev, vmid) (adev)->gart.gart_funcs->flush_gpu_tlb((adev), (vmid))
|
||||
#define amdgpu_gart_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gart.gart_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags))
|
||||
#define amdgpu_gart_get_vm_pde(adev, addr) (adev)->gart.gart_funcs->get_vm_pde((adev), (addr))
|
||||
#define amdgpu_gart_get_vm_pde(adev, level, dst, flags) (adev)->gart.gart_funcs->get_vm_pde((adev), (level), (dst), (flags))
|
||||
#define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count)))
|
||||
#define amdgpu_vm_write_pte(adev, ib, pe, value, count, incr) ((adev)->vm_manager.vm_pte_funcs->write_pte((ib), (pe), (value), (count), (incr)))
|
||||
#define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags)))
|
||||
@ -1835,23 +1888,25 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
||||
#define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i))
|
||||
|
||||
/* Common functions */
|
||||
int amdgpu_gpu_recover(struct amdgpu_device *adev, struct amdgpu_job* job);
|
||||
bool amdgpu_need_backup(struct amdgpu_device *adev);
|
||||
void amdgpu_pci_config_reset(struct amdgpu_device *adev);
|
||||
bool amdgpu_need_post(struct amdgpu_device *adev);
|
||||
int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
||||
struct amdgpu_job* job, bool force);
|
||||
void amdgpu_device_pci_config_reset(struct amdgpu_device *adev);
|
||||
bool amdgpu_device_need_post(struct amdgpu_device *adev);
|
||||
void amdgpu_update_display_priority(struct amdgpu_device *adev);
|
||||
|
||||
void amdgpu_cs_report_moved_bytes(struct amdgpu_device *adev, u64 num_bytes,
|
||||
u64 num_vis_bytes);
|
||||
void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain);
|
||||
bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);
|
||||
void amdgpu_vram_location(struct amdgpu_device *adev, struct amdgpu_mc *mc, u64 base);
|
||||
void amdgpu_gart_location(struct amdgpu_device *adev, struct amdgpu_mc *mc);
|
||||
void amdgpu_device_vram_location(struct amdgpu_device *adev,
|
||||
struct amdgpu_mc *mc, u64 base);
|
||||
void amdgpu_device_gart_location(struct amdgpu_device *adev,
|
||||
struct amdgpu_mc *mc);
|
||||
int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev);
|
||||
void amdgpu_ttm_set_active_vram_size(struct amdgpu_device *adev, u64 size);
|
||||
int amdgpu_ttm_init(struct amdgpu_device *adev);
|
||||
void amdgpu_ttm_fini(struct amdgpu_device *adev);
|
||||
void amdgpu_program_register_sequence(struct amdgpu_device *adev,
|
||||
void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
|
||||
const u32 *registers,
|
||||
const u32 array_size);
|
||||
|
||||
@ -1885,7 +1940,7 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev);
|
||||
int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv);
|
||||
void amdgpu_driver_postclose_kms(struct drm_device *dev,
|
||||
struct drm_file *file_priv);
|
||||
int amdgpu_suspend(struct amdgpu_device *adev);
|
||||
int amdgpu_device_ip_suspend(struct amdgpu_device *adev);
|
||||
int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon);
|
||||
int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon);
|
||||
u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
|
||||
|
@ -277,7 +277,7 @@ static int acp_hw_init(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
const struct amdgpu_ip_block *ip_block =
|
||||
amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_ACP);
|
||||
amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_ACP);
|
||||
|
||||
if (!ip_block)
|
||||
return -EINVAL;
|
||||
|
@ -93,6 +93,39 @@ void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev)
|
||||
adev->pdev, kfd2kgd);
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_doorbell_get_kfd_info - Report doorbell configuration required to
|
||||
* setup amdkfd
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @aperture_base: output returning doorbell aperture base physical address
|
||||
* @aperture_size: output returning doorbell aperture size in bytes
|
||||
* @start_offset: output returning # of doorbell bytes reserved for amdgpu.
|
||||
*
|
||||
* amdgpu and amdkfd share the doorbell aperture. amdgpu sets it up,
|
||||
* takes doorbells required for its own rings and reports the setup to amdkfd.
|
||||
* amdgpu reserved doorbells are at the start of the doorbell aperture.
|
||||
*/
|
||||
static void amdgpu_doorbell_get_kfd_info(struct amdgpu_device *adev,
|
||||
phys_addr_t *aperture_base,
|
||||
size_t *aperture_size,
|
||||
size_t *start_offset)
|
||||
{
|
||||
/*
|
||||
* The first num_doorbells are used by amdgpu.
|
||||
* amdkfd takes whatever's left in the aperture.
|
||||
*/
|
||||
if (adev->doorbell.size > adev->doorbell.num_doorbells * sizeof(u32)) {
|
||||
*aperture_base = adev->doorbell.base;
|
||||
*aperture_size = adev->doorbell.size;
|
||||
*start_offset = adev->doorbell.num_doorbells * sizeof(u32);
|
||||
} else {
|
||||
*aperture_base = 0;
|
||||
*aperture_size = 0;
|
||||
*start_offset = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <drm/amdgpu_drm.h>
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_atombios.h"
|
||||
#include "amdgpu_atomfirmware.h"
|
||||
#include "amdgpu_i2c.h"
|
||||
|
||||
#include "atom.h"
|
||||
@ -1699,7 +1700,7 @@ void amdgpu_atombios_scratch_regs_lock(struct amdgpu_device *adev, bool lock)
|
||||
WREG32(adev->bios_scratch_reg_offset + 6, bios_6_scratch);
|
||||
}
|
||||
|
||||
void amdgpu_atombios_scratch_regs_init(struct amdgpu_device *adev)
|
||||
static void amdgpu_atombios_scratch_regs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t bios_2_scratch, bios_6_scratch;
|
||||
|
||||
@ -1721,28 +1722,6 @@ void amdgpu_atombios_scratch_regs_init(struct amdgpu_device *adev)
|
||||
WREG32(adev->bios_scratch_reg_offset + 6, bios_6_scratch);
|
||||
}
|
||||
|
||||
void amdgpu_atombios_scratch_regs_save(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++)
|
||||
adev->bios_scratch[i] = RREG32(adev->bios_scratch_reg_offset + i);
|
||||
}
|
||||
|
||||
void amdgpu_atombios_scratch_regs_restore(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* VBIOS will check ASIC_INIT_COMPLETE bit to decide if
|
||||
* execute ASIC_Init posting via driver
|
||||
*/
|
||||
adev->bios_scratch[7] &= ~ATOM_S7_ASIC_INIT_COMPLETE_MASK;
|
||||
|
||||
for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++)
|
||||
WREG32(adev->bios_scratch_reg_offset + i, adev->bios_scratch[i]);
|
||||
}
|
||||
|
||||
void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
|
||||
bool hung)
|
||||
{
|
||||
@ -1798,7 +1777,7 @@ void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le)
|
||||
#endif
|
||||
}
|
||||
|
||||
int amdgpu_atombios_allocate_fb_scratch(struct amdgpu_device *adev)
|
||||
static int amdgpu_atombios_allocate_fb_scratch(struct amdgpu_device *adev)
|
||||
{
|
||||
struct atom_context *ctx = adev->mode_info.atom_context;
|
||||
int index = GetIndexIntoMasterTable(DATA, VRAM_UsageByFirmware);
|
||||
@ -1841,3 +1820,234 @@ int amdgpu_atombios_allocate_fb_scratch(struct amdgpu_device *adev)
|
||||
ctx->scratch_size_bytes = usage_bytes;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ATOM accessor methods */
|
||||
/*
|
||||
* ATOM is an interpreted byte code stored in tables in the vbios. The
|
||||
* driver registers callbacks to access registers and the interpreter
|
||||
* in the driver parses the tables and executes then to program specific
|
||||
* actions (set display modes, asic init, etc.). See amdgpu_atombios.c,
|
||||
* atombios.h, and atom.c
|
||||
*/
|
||||
|
||||
/**
|
||||
* cail_pll_read - read PLL register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: PLL register offset
|
||||
*
|
||||
* Provides a PLL register accessor for the atom interpreter (r4xx+).
|
||||
* Returns the value of the PLL register.
|
||||
*/
|
||||
static uint32_t cail_pll_read(struct card_info *info, uint32_t reg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_pll_write - write PLL register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: PLL register offset
|
||||
* @val: value to write to the pll register
|
||||
*
|
||||
* Provides a PLL register accessor for the atom interpreter (r4xx+).
|
||||
*/
|
||||
static void cail_pll_write(struct card_info *info, uint32_t reg, uint32_t val)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_mc_read - read MC (Memory Controller) register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: MC register offset
|
||||
*
|
||||
* Provides an MC register accessor for the atom interpreter (r4xx+).
|
||||
* Returns the value of the MC register.
|
||||
*/
|
||||
static uint32_t cail_mc_read(struct card_info *info, uint32_t reg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_mc_write - write MC (Memory Controller) register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: MC register offset
|
||||
* @val: value to write to the pll register
|
||||
*
|
||||
* Provides a MC register accessor for the atom interpreter (r4xx+).
|
||||
*/
|
||||
static void cail_mc_write(struct card_info *info, uint32_t reg, uint32_t val)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_reg_write - write MMIO register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: MMIO register offset
|
||||
* @val: value to write to the pll register
|
||||
*
|
||||
* Provides a MMIO register accessor for the atom interpreter (r4xx+).
|
||||
*/
|
||||
static void cail_reg_write(struct card_info *info, uint32_t reg, uint32_t val)
|
||||
{
|
||||
struct amdgpu_device *adev = info->dev->dev_private;
|
||||
|
||||
WREG32(reg, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_reg_read - read MMIO register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: MMIO register offset
|
||||
*
|
||||
* Provides an MMIO register accessor for the atom interpreter (r4xx+).
|
||||
* Returns the value of the MMIO register.
|
||||
*/
|
||||
static uint32_t cail_reg_read(struct card_info *info, uint32_t reg)
|
||||
{
|
||||
struct amdgpu_device *adev = info->dev->dev_private;
|
||||
uint32_t r;
|
||||
|
||||
r = RREG32(reg);
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_ioreg_write - write IO register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: IO register offset
|
||||
* @val: value to write to the pll register
|
||||
*
|
||||
* Provides a IO register accessor for the atom interpreter (r4xx+).
|
||||
*/
|
||||
static void cail_ioreg_write(struct card_info *info, uint32_t reg, uint32_t val)
|
||||
{
|
||||
struct amdgpu_device *adev = info->dev->dev_private;
|
||||
|
||||
WREG32_IO(reg, val);
|
||||
}
|
||||
|
||||
/**
|
||||
* cail_ioreg_read - read IO register
|
||||
*
|
||||
* @info: atom card_info pointer
|
||||
* @reg: IO register offset
|
||||
*
|
||||
* Provides an IO register accessor for the atom interpreter (r4xx+).
|
||||
* Returns the value of the IO register.
|
||||
*/
|
||||
static uint32_t cail_ioreg_read(struct card_info *info, uint32_t reg)
|
||||
{
|
||||
struct amdgpu_device *adev = info->dev->dev_private;
|
||||
uint32_t r;
|
||||
|
||||
r = RREG32_IO(reg);
|
||||
return r;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_atombios_get_vbios_version(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct drm_device *ddev = dev_get_drvdata(dev);
|
||||
struct amdgpu_device *adev = ddev->dev_private;
|
||||
struct atom_context *ctx = adev->mode_info.atom_context;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", ctx->vbios_version);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(vbios_version, 0444, amdgpu_atombios_get_vbios_version,
|
||||
NULL);
|
||||
|
||||
/**
|
||||
* amdgpu_atombios_fini - free the driver info and callbacks for atombios
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Frees the driver info and register access callbacks for the ATOM
|
||||
* interpreter (r4xx+).
|
||||
* Called at driver shutdown.
|
||||
*/
|
||||
void amdgpu_atombios_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->mode_info.atom_context) {
|
||||
kfree(adev->mode_info.atom_context->scratch);
|
||||
kfree(adev->mode_info.atom_context->iio);
|
||||
}
|
||||
kfree(adev->mode_info.atom_context);
|
||||
adev->mode_info.atom_context = NULL;
|
||||
kfree(adev->mode_info.atom_card_info);
|
||||
adev->mode_info.atom_card_info = NULL;
|
||||
device_remove_file(adev->dev, &dev_attr_vbios_version);
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_atombios_init - init the driver info and callbacks for atombios
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Initializes the driver info and register access callbacks for the
|
||||
* ATOM interpreter (r4xx+).
|
||||
* Returns 0 on sucess, -ENOMEM on failure.
|
||||
* Called at driver startup.
|
||||
*/
|
||||
int amdgpu_atombios_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct card_info *atom_card_info =
|
||||
kzalloc(sizeof(struct card_info), GFP_KERNEL);
|
||||
int ret;
|
||||
|
||||
if (!atom_card_info)
|
||||
return -ENOMEM;
|
||||
|
||||
adev->mode_info.atom_card_info = atom_card_info;
|
||||
atom_card_info->dev = adev->ddev;
|
||||
atom_card_info->reg_read = cail_reg_read;
|
||||
atom_card_info->reg_write = cail_reg_write;
|
||||
/* needed for iio ops */
|
||||
if (adev->rio_mem) {
|
||||
atom_card_info->ioreg_read = cail_ioreg_read;
|
||||
atom_card_info->ioreg_write = cail_ioreg_write;
|
||||
} else {
|
||||
DRM_DEBUG("PCI I/O BAR is not found. Using MMIO to access ATOM BIOS\n");
|
||||
atom_card_info->ioreg_read = cail_reg_read;
|
||||
atom_card_info->ioreg_write = cail_reg_write;
|
||||
}
|
||||
atom_card_info->mc_read = cail_mc_read;
|
||||
atom_card_info->mc_write = cail_mc_write;
|
||||
atom_card_info->pll_read = cail_pll_read;
|
||||
atom_card_info->pll_write = cail_pll_write;
|
||||
|
||||
adev->mode_info.atom_context = amdgpu_atom_parse(atom_card_info, adev->bios);
|
||||
if (!adev->mode_info.atom_context) {
|
||||
amdgpu_atombios_fini(adev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_init(&adev->mode_info.atom_context->mutex);
|
||||
if (adev->is_atom_fw) {
|
||||
amdgpu_atomfirmware_scratch_regs_init(adev);
|
||||
amdgpu_atomfirmware_allocate_fb_scratch(adev);
|
||||
} else {
|
||||
amdgpu_atombios_scratch_regs_init(adev);
|
||||
amdgpu_atombios_allocate_fb_scratch(adev);
|
||||
}
|
||||
|
||||
ret = device_create_file(adev->dev, &dev_attr_vbios_version);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to create device file for VBIOS version\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -195,9 +195,6 @@ int amdgpu_atombios_init_mc_reg_table(struct amdgpu_device *adev,
|
||||
bool amdgpu_atombios_has_gpu_virtualization_table(struct amdgpu_device *adev);
|
||||
|
||||
void amdgpu_atombios_scratch_regs_lock(struct amdgpu_device *adev, bool lock);
|
||||
void amdgpu_atombios_scratch_regs_init(struct amdgpu_device *adev);
|
||||
void amdgpu_atombios_scratch_regs_save(struct amdgpu_device *adev);
|
||||
void amdgpu_atombios_scratch_regs_restore(struct amdgpu_device *adev);
|
||||
void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev,
|
||||
bool hung);
|
||||
bool amdgpu_atombios_scratch_need_asic_init(struct amdgpu_device *adev);
|
||||
@ -219,6 +216,7 @@ int amdgpu_atombios_get_svi2_info(struct amdgpu_device *adev,
|
||||
u8 voltage_type,
|
||||
u8 *svd_gpio_id, u8 *svc_gpio_id);
|
||||
|
||||
int amdgpu_atombios_allocate_fb_scratch(struct amdgpu_device *adev);
|
||||
void amdgpu_atombios_fini(struct amdgpu_device *adev);
|
||||
int amdgpu_atombios_init(struct amdgpu_device *adev);
|
||||
|
||||
#endif
|
||||
|
@ -93,7 +93,7 @@ static bool igp_read_bios_from_vram(struct amdgpu_device *adev)
|
||||
resource_size_t size = 256 * 1024; /* ??? */
|
||||
|
||||
if (!(adev->flags & AMD_IS_APU))
|
||||
if (amdgpu_need_post(adev))
|
||||
if (amdgpu_device_need_post(adev))
|
||||
return false;
|
||||
|
||||
adev->bios = NULL;
|
||||
|
@ -801,6 +801,9 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
|
||||
else
|
||||
strcpy(fw_name, "amdgpu/vega10_smc.bin");
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
adev->pm.fw_version = info->version;
|
||||
return 0;
|
||||
default:
|
||||
DRM_ERROR("SMC firmware not supported\n");
|
||||
return -EINVAL;
|
||||
|
@ -343,7 +343,12 @@ static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,
|
||||
struct amdgpu_bo *bo)
|
||||
{
|
||||
struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
|
||||
struct ttm_operation_ctx ctx = { true, false };
|
||||
struct ttm_operation_ctx ctx = {
|
||||
.interruptible = true,
|
||||
.no_wait_gpu = false,
|
||||
.allow_reserved_eviction = false,
|
||||
.resv = bo->tbo.resv
|
||||
};
|
||||
uint32_t domain;
|
||||
int r;
|
||||
|
||||
@ -1150,7 +1155,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
||||
union drm_amdgpu_cs *cs)
|
||||
{
|
||||
struct amdgpu_ring *ring = p->job->ring;
|
||||
struct amd_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
|
||||
struct drm_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
|
||||
struct amdgpu_job *job;
|
||||
unsigned i;
|
||||
uint64_t seq;
|
||||
@ -1173,7 +1178,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
||||
job = p->job;
|
||||
p->job = NULL;
|
||||
|
||||
r = amd_sched_job_init(&job->base, &ring->sched, entity, p->filp);
|
||||
r = drm_sched_job_init(&job->base, &ring->sched, entity, p->filp);
|
||||
if (r) {
|
||||
amdgpu_job_free(job);
|
||||
amdgpu_mn_unlock(p->mn);
|
||||
@ -1202,7 +1207,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
|
||||
amdgpu_ring_priority_get(job->ring, job->base.s_priority);
|
||||
|
||||
trace_amdgpu_cs_ioctl(job);
|
||||
amd_sched_entity_push_job(&job->base, entity);
|
||||
drm_sched_entity_push_job(&job->base, entity);
|
||||
|
||||
ttm_eu_fence_buffer_objects(&p->ticket, &p->validated, p->fence);
|
||||
amdgpu_mn_unlock(p->mn);
|
||||
|
@ -28,10 +28,10 @@
|
||||
#include "amdgpu_sched.h"
|
||||
|
||||
static int amdgpu_ctx_priority_permit(struct drm_file *filp,
|
||||
enum amd_sched_priority priority)
|
||||
enum drm_sched_priority priority)
|
||||
{
|
||||
/* NORMAL and below are accessible by everyone */
|
||||
if (priority <= AMD_SCHED_PRIORITY_NORMAL)
|
||||
if (priority <= DRM_SCHED_PRIORITY_NORMAL)
|
||||
return 0;
|
||||
|
||||
if (capable(CAP_SYS_NICE))
|
||||
@ -44,14 +44,14 @@ static int amdgpu_ctx_priority_permit(struct drm_file *filp,
|
||||
}
|
||||
|
||||
static int amdgpu_ctx_init(struct amdgpu_device *adev,
|
||||
enum amd_sched_priority priority,
|
||||
enum drm_sched_priority priority,
|
||||
struct drm_file *filp,
|
||||
struct amdgpu_ctx *ctx)
|
||||
{
|
||||
unsigned i, j;
|
||||
int r;
|
||||
|
||||
if (priority < 0 || priority >= AMD_SCHED_PRIORITY_MAX)
|
||||
if (priority < 0 || priority >= DRM_SCHED_PRIORITY_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
r = amdgpu_ctx_priority_permit(filp, priority);
|
||||
@ -78,19 +78,19 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
|
||||
ctx->reset_counter_query = ctx->reset_counter;
|
||||
ctx->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
|
||||
ctx->init_priority = priority;
|
||||
ctx->override_priority = AMD_SCHED_PRIORITY_UNSET;
|
||||
ctx->override_priority = DRM_SCHED_PRIORITY_UNSET;
|
||||
|
||||
/* create context entity for each ring */
|
||||
for (i = 0; i < adev->num_rings; i++) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
|
||||
rq = &ring->sched.sched_rq[priority];
|
||||
|
||||
if (ring == &adev->gfx.kiq.ring)
|
||||
continue;
|
||||
|
||||
r = amd_sched_entity_init(&ring->sched, &ctx->rings[i].entity,
|
||||
r = drm_sched_entity_init(&ring->sched, &ctx->rings[i].entity,
|
||||
rq, amdgpu_sched_jobs, &ctx->guilty);
|
||||
if (r)
|
||||
goto failed;
|
||||
@ -104,7 +104,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
|
||||
|
||||
failed:
|
||||
for (j = 0; j < i; j++)
|
||||
amd_sched_entity_fini(&adev->rings[j]->sched,
|
||||
drm_sched_entity_fini(&adev->rings[j]->sched,
|
||||
&ctx->rings[j].entity);
|
||||
kfree(ctx->fences);
|
||||
ctx->fences = NULL;
|
||||
@ -126,7 +126,7 @@ static void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)
|
||||
ctx->fences = NULL;
|
||||
|
||||
for (i = 0; i < adev->num_rings; i++)
|
||||
amd_sched_entity_fini(&adev->rings[i]->sched,
|
||||
drm_sched_entity_fini(&adev->rings[i]->sched,
|
||||
&ctx->rings[i].entity);
|
||||
|
||||
amdgpu_queue_mgr_fini(adev, &ctx->queue_mgr);
|
||||
@ -137,7 +137,7 @@ static void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)
|
||||
static int amdgpu_ctx_alloc(struct amdgpu_device *adev,
|
||||
struct amdgpu_fpriv *fpriv,
|
||||
struct drm_file *filp,
|
||||
enum amd_sched_priority priority,
|
||||
enum drm_sched_priority priority,
|
||||
uint32_t *id)
|
||||
{
|
||||
struct amdgpu_ctx_mgr *mgr = &fpriv->ctx_mgr;
|
||||
@ -266,7 +266,7 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
|
||||
{
|
||||
int r;
|
||||
uint32_t id;
|
||||
enum amd_sched_priority priority;
|
||||
enum drm_sched_priority priority;
|
||||
|
||||
union drm_amdgpu_ctx *args = data;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
@ -278,8 +278,8 @@ int amdgpu_ctx_ioctl(struct drm_device *dev, void *data,
|
||||
|
||||
/* For backwards compatibility reasons, we need to accept
|
||||
* ioctls with garbage in the priority field */
|
||||
if (priority == AMD_SCHED_PRIORITY_INVALID)
|
||||
priority = AMD_SCHED_PRIORITY_NORMAL;
|
||||
if (priority == DRM_SCHED_PRIORITY_INVALID)
|
||||
priority = DRM_SCHED_PRIORITY_NORMAL;
|
||||
|
||||
switch (args->in.op) {
|
||||
case AMDGPU_CTX_OP_ALLOC_CTX:
|
||||
@ -385,18 +385,18 @@ struct dma_fence *amdgpu_ctx_get_fence(struct amdgpu_ctx *ctx,
|
||||
}
|
||||
|
||||
void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx,
|
||||
enum amd_sched_priority priority)
|
||||
enum drm_sched_priority priority)
|
||||
{
|
||||
int i;
|
||||
struct amdgpu_device *adev = ctx->adev;
|
||||
struct amd_sched_rq *rq;
|
||||
struct amd_sched_entity *entity;
|
||||
struct drm_sched_rq *rq;
|
||||
struct drm_sched_entity *entity;
|
||||
struct amdgpu_ring *ring;
|
||||
enum amd_sched_priority ctx_prio;
|
||||
enum drm_sched_priority ctx_prio;
|
||||
|
||||
ctx->override_priority = priority;
|
||||
|
||||
ctx_prio = (ctx->override_priority == AMD_SCHED_PRIORITY_UNSET) ?
|
||||
ctx_prio = (ctx->override_priority == DRM_SCHED_PRIORITY_UNSET) ?
|
||||
ctx->init_priority : ctx->override_priority;
|
||||
|
||||
for (i = 0; i < adev->num_rings; i++) {
|
||||
@ -407,7 +407,7 @@ void amdgpu_ctx_priority_override(struct amdgpu_ctx *ctx,
|
||||
if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ)
|
||||
continue;
|
||||
|
||||
amd_sched_entity_set_rq(entity, rq);
|
||||
drm_sched_entity_set_rq(entity, rq);
|
||||
}
|
||||
}
|
||||
|
||||
|
792
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
Normal file
792
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
Normal file
@ -0,0 +1,792 @@
|
||||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kthread.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include "amdgpu.h"
|
||||
|
||||
/*
|
||||
* Debugfs
|
||||
*/
|
||||
int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
|
||||
const struct drm_info_list *files,
|
||||
unsigned nfiles)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < adev->debugfs_count; i++) {
|
||||
if (adev->debugfs[i].files == files) {
|
||||
/* Already registered */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
i = adev->debugfs_count + 1;
|
||||
if (i > AMDGPU_DEBUGFS_MAX_COMPONENTS) {
|
||||
DRM_ERROR("Reached maximum number of debugfs components.\n");
|
||||
DRM_ERROR("Report so we increase "
|
||||
"AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
adev->debugfs[adev->debugfs_count].files = files;
|
||||
adev->debugfs[adev->debugfs_count].num_files = nfiles;
|
||||
adev->debugfs_count = i;
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
drm_debugfs_create_files(files, nfiles,
|
||||
adev->ddev->primary->debugfs_root,
|
||||
adev->ddev->primary);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
bool pm_pg_lock, use_bank;
|
||||
unsigned instance_bank, sh_bank, se_bank;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
/* are we reading registers for which a PG lock is necessary? */
|
||||
pm_pg_lock = (*pos >> 23) & 1;
|
||||
|
||||
if (*pos & (1ULL << 62)) {
|
||||
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
|
||||
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
|
||||
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
|
||||
|
||||
if (se_bank == 0x3FF)
|
||||
se_bank = 0xFFFFFFFF;
|
||||
if (sh_bank == 0x3FF)
|
||||
sh_bank = 0xFFFFFFFF;
|
||||
if (instance_bank == 0x3FF)
|
||||
instance_bank = 0xFFFFFFFF;
|
||||
use_bank = 1;
|
||||
} else {
|
||||
use_bank = 0;
|
||||
}
|
||||
|
||||
*pos &= (1UL << 22) - 1;
|
||||
|
||||
if (use_bank) {
|
||||
if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
|
||||
(se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
|
||||
return -EINVAL;
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
amdgpu_gfx_select_se_sh(adev, se_bank,
|
||||
sh_bank, instance_bank);
|
||||
}
|
||||
|
||||
if (pm_pg_lock)
|
||||
mutex_lock(&adev->pm.mutex);
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
if (*pos > adev->rmmio_size)
|
||||
goto end;
|
||||
|
||||
value = RREG32(*pos >> 2);
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r) {
|
||||
result = r;
|
||||
goto end;
|
||||
}
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
end:
|
||||
if (use_bank) {
|
||||
amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
}
|
||||
|
||||
if (pm_pg_lock)
|
||||
mutex_unlock(&adev->pm.mutex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
bool pm_pg_lock, use_bank;
|
||||
unsigned instance_bank, sh_bank, se_bank;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
/* are we reading registers for which a PG lock is necessary? */
|
||||
pm_pg_lock = (*pos >> 23) & 1;
|
||||
|
||||
if (*pos & (1ULL << 62)) {
|
||||
se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
|
||||
sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
|
||||
instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
|
||||
|
||||
if (se_bank == 0x3FF)
|
||||
se_bank = 0xFFFFFFFF;
|
||||
if (sh_bank == 0x3FF)
|
||||
sh_bank = 0xFFFFFFFF;
|
||||
if (instance_bank == 0x3FF)
|
||||
instance_bank = 0xFFFFFFFF;
|
||||
use_bank = 1;
|
||||
} else {
|
||||
use_bank = 0;
|
||||
}
|
||||
|
||||
*pos &= (1UL << 22) - 1;
|
||||
|
||||
if (use_bank) {
|
||||
if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
|
||||
(se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines))
|
||||
return -EINVAL;
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
amdgpu_gfx_select_se_sh(adev, se_bank,
|
||||
sh_bank, instance_bank);
|
||||
}
|
||||
|
||||
if (pm_pg_lock)
|
||||
mutex_lock(&adev->pm.mutex);
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
if (*pos > adev->rmmio_size)
|
||||
return result;
|
||||
|
||||
r = get_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
WREG32(*pos >> 2, value);
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
if (use_bank) {
|
||||
amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
}
|
||||
|
||||
if (pm_pg_lock)
|
||||
mutex_unlock(&adev->pm.mutex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
value = RREG32_PCIE(*pos >> 2);
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
r = get_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
WREG32_PCIE(*pos >> 2, value);
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
value = RREG32_DIDT(*pos >> 2);
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
r = get_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
WREG32_DIDT(*pos >> 2, value);
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
value = RREG32_SMC(*pos);
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
r = get_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
WREG32_SMC(*pos, value);
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
ssize_t result = 0;
|
||||
int r;
|
||||
uint32_t *config, no_regs = 0;
|
||||
|
||||
if (size & 0x3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
|
||||
if (!config)
|
||||
return -ENOMEM;
|
||||
|
||||
/* version, increment each time something is added */
|
||||
config[no_regs++] = 3;
|
||||
config[no_regs++] = adev->gfx.config.max_shader_engines;
|
||||
config[no_regs++] = adev->gfx.config.max_tile_pipes;
|
||||
config[no_regs++] = adev->gfx.config.max_cu_per_sh;
|
||||
config[no_regs++] = adev->gfx.config.max_sh_per_se;
|
||||
config[no_regs++] = adev->gfx.config.max_backends_per_se;
|
||||
config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
|
||||
config[no_regs++] = adev->gfx.config.max_gprs;
|
||||
config[no_regs++] = adev->gfx.config.max_gs_threads;
|
||||
config[no_regs++] = adev->gfx.config.max_hw_contexts;
|
||||
config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
|
||||
config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
|
||||
config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
|
||||
config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
|
||||
config[no_regs++] = adev->gfx.config.num_tile_pipes;
|
||||
config[no_regs++] = adev->gfx.config.backend_enable_mask;
|
||||
config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
|
||||
config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
|
||||
config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
|
||||
config[no_regs++] = adev->gfx.config.num_gpus;
|
||||
config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
|
||||
config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
|
||||
config[no_regs++] = adev->gfx.config.gb_addr_config;
|
||||
config[no_regs++] = adev->gfx.config.num_rbs;
|
||||
|
||||
/* rev==1 */
|
||||
config[no_regs++] = adev->rev_id;
|
||||
config[no_regs++] = adev->pg_flags;
|
||||
config[no_regs++] = adev->cg_flags;
|
||||
|
||||
/* rev==2 */
|
||||
config[no_regs++] = adev->family;
|
||||
config[no_regs++] = adev->external_rev_id;
|
||||
|
||||
/* rev==3 */
|
||||
config[no_regs++] = adev->pdev->device;
|
||||
config[no_regs++] = adev->pdev->revision;
|
||||
config[no_regs++] = adev->pdev->subsystem_device;
|
||||
config[no_regs++] = adev->pdev->subsystem_vendor;
|
||||
|
||||
while (size && (*pos < no_regs * 4)) {
|
||||
uint32_t value;
|
||||
|
||||
value = config[*pos >> 2];
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r) {
|
||||
kfree(config);
|
||||
return r;
|
||||
}
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
*pos += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
kfree(config);
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = file_inode(f)->i_private;
|
||||
int idx, x, outsize, r, valuesize;
|
||||
uint32_t values[16];
|
||||
|
||||
if (size & 3 || *pos & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
if (amdgpu_dpm == 0)
|
||||
return -EINVAL;
|
||||
|
||||
/* convert offset to sensor number */
|
||||
idx = *pos >> 2;
|
||||
|
||||
valuesize = sizeof(values);
|
||||
if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->read_sensor)
|
||||
r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
if (size > valuesize)
|
||||
return -EINVAL;
|
||||
|
||||
outsize = 0;
|
||||
x = 0;
|
||||
if (!r) {
|
||||
while (size) {
|
||||
r = put_user(values[x++], (int32_t *)buf);
|
||||
buf += 4;
|
||||
size -= 4;
|
||||
outsize += 4;
|
||||
}
|
||||
}
|
||||
|
||||
return !r ? outsize : r;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = f->f_inode->i_private;
|
||||
int r, x;
|
||||
ssize_t result=0;
|
||||
uint32_t offset, se, sh, cu, wave, simd, data[32];
|
||||
|
||||
if (size & 3 || *pos & 3)
|
||||
return -EINVAL;
|
||||
|
||||
/* decode offset */
|
||||
offset = (*pos & GENMASK_ULL(6, 0));
|
||||
se = (*pos & GENMASK_ULL(14, 7)) >> 7;
|
||||
sh = (*pos & GENMASK_ULL(22, 15)) >> 15;
|
||||
cu = (*pos & GENMASK_ULL(30, 23)) >> 23;
|
||||
wave = (*pos & GENMASK_ULL(36, 31)) >> 31;
|
||||
simd = (*pos & GENMASK_ULL(44, 37)) >> 37;
|
||||
|
||||
/* switch to the specific se/sh/cu */
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
amdgpu_gfx_select_se_sh(adev, se, sh, cu);
|
||||
|
||||
x = 0;
|
||||
if (adev->gfx.funcs->read_wave_data)
|
||||
adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
|
||||
|
||||
amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
|
||||
if (!x)
|
||||
return -EINVAL;
|
||||
|
||||
while (size && (offset < x * 4)) {
|
||||
uint32_t value;
|
||||
|
||||
value = data[offset >> 2];
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
offset += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
|
||||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_device *adev = f->f_inode->i_private;
|
||||
int r;
|
||||
ssize_t result = 0;
|
||||
uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
|
||||
|
||||
if (size & 3 || *pos & 3)
|
||||
return -EINVAL;
|
||||
|
||||
/* decode offset */
|
||||
offset = *pos & GENMASK_ULL(11, 0);
|
||||
se = (*pos & GENMASK_ULL(19, 12)) >> 12;
|
||||
sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
|
||||
cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
|
||||
wave = (*pos & GENMASK_ULL(43, 36)) >> 36;
|
||||
simd = (*pos & GENMASK_ULL(51, 44)) >> 44;
|
||||
thread = (*pos & GENMASK_ULL(59, 52)) >> 52;
|
||||
bank = (*pos & GENMASK_ULL(61, 60)) >> 60;
|
||||
|
||||
data = kmalloc_array(1024, sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
/* switch to the specific se/sh/cu */
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
amdgpu_gfx_select_se_sh(adev, se, sh, cu);
|
||||
|
||||
if (bank == 0) {
|
||||
if (adev->gfx.funcs->read_wave_vgprs)
|
||||
adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
|
||||
} else {
|
||||
if (adev->gfx.funcs->read_wave_sgprs)
|
||||
adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
|
||||
}
|
||||
|
||||
amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
|
||||
while (size) {
|
||||
uint32_t value;
|
||||
|
||||
value = data[offset++];
|
||||
r = put_user(value, (uint32_t *)buf);
|
||||
if (r) {
|
||||
result = r;
|
||||
goto err;
|
||||
}
|
||||
|
||||
result += 4;
|
||||
buf += 4;
|
||||
size -= 4;
|
||||
}
|
||||
|
||||
err:
|
||||
kfree(data);
|
||||
return result;
|
||||
}
|
||||
|
||||
static const struct file_operations amdgpu_debugfs_regs_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_regs_read,
|
||||
.write = amdgpu_debugfs_regs_write,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_regs_didt_read,
|
||||
.write = amdgpu_debugfs_regs_didt_write,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_regs_pcie_read,
|
||||
.write = amdgpu_debugfs_regs_pcie_write,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_regs_smc_read,
|
||||
.write = amdgpu_debugfs_regs_smc_write,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
|
||||
static const struct file_operations amdgpu_debugfs_gca_config_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_gca_config_read,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
|
||||
static const struct file_operations amdgpu_debugfs_sensors_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_sensor_read,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
|
||||
static const struct file_operations amdgpu_debugfs_wave_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_wave_read,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
static const struct file_operations amdgpu_debugfs_gpr_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = amdgpu_debugfs_gpr_read,
|
||||
.llseek = default_llseek
|
||||
};
|
||||
|
||||
static const struct file_operations *debugfs_regs[] = {
|
||||
&amdgpu_debugfs_regs_fops,
|
||||
&amdgpu_debugfs_regs_didt_fops,
|
||||
&amdgpu_debugfs_regs_pcie_fops,
|
||||
&amdgpu_debugfs_regs_smc_fops,
|
||||
&amdgpu_debugfs_gca_config_fops,
|
||||
&amdgpu_debugfs_sensors_fops,
|
||||
&amdgpu_debugfs_wave_fops,
|
||||
&amdgpu_debugfs_gpr_fops,
|
||||
};
|
||||
|
||||
static const char *debugfs_regs_names[] = {
|
||||
"amdgpu_regs",
|
||||
"amdgpu_regs_didt",
|
||||
"amdgpu_regs_pcie",
|
||||
"amdgpu_regs_smc",
|
||||
"amdgpu_gca_config",
|
||||
"amdgpu_sensors",
|
||||
"amdgpu_wave",
|
||||
"amdgpu_gpr",
|
||||
};
|
||||
|
||||
int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct drm_minor *minor = adev->ddev->primary;
|
||||
struct dentry *ent, *root = minor->debugfs_root;
|
||||
unsigned i, j;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
|
||||
ent = debugfs_create_file(debugfs_regs_names[i],
|
||||
S_IFREG | S_IRUGO, root,
|
||||
adev, debugfs_regs[i]);
|
||||
if (IS_ERR(ent)) {
|
||||
for (j = 0; j < i; j++) {
|
||||
debugfs_remove(adev->debugfs_regs[i]);
|
||||
adev->debugfs_regs[i] = NULL;
|
||||
}
|
||||
return PTR_ERR(ent);
|
||||
}
|
||||
|
||||
if (!i)
|
||||
i_size_write(ent->d_inode, adev->rmmio_size);
|
||||
adev->debugfs_regs[i] = ent;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
|
||||
if (adev->debugfs_regs[i]) {
|
||||
debugfs_remove(adev->debugfs_regs[i]);
|
||||
adev->debugfs_regs[i] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
||||
struct drm_device *dev = node->minor->dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
int r = 0, i;
|
||||
|
||||
/* hold on the scheduler */
|
||||
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
|
||||
if (!ring || !ring->sched.thread)
|
||||
continue;
|
||||
kthread_park(ring->sched.thread);
|
||||
}
|
||||
|
||||
seq_printf(m, "run ib test:\n");
|
||||
r = amdgpu_ib_ring_tests(adev);
|
||||
if (r)
|
||||
seq_printf(m, "ib ring tests failed (%d).\n", r);
|
||||
else
|
||||
seq_printf(m, "ib ring tests passed.\n");
|
||||
|
||||
/* go on the scheduler */
|
||||
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
|
||||
if (!ring || !ring->sched.thread)
|
||||
continue;
|
||||
kthread_unpark(ring->sched.thread);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_debugfs_get_vbios_dump(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
||||
struct drm_device *dev = node->minor->dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
|
||||
seq_write(m, adev->bios, adev->bios_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amdgpu_debugfs_evict_vram(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_info_node *node = (struct drm_info_node *)m->private;
|
||||
struct drm_device *dev = node->minor->dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
|
||||
seq_printf(m, "(%d)\n", amdgpu_bo_evict_vram(adev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_info_list amdgpu_debugfs_list[] = {
|
||||
{"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump},
|
||||
{"amdgpu_test_ib", &amdgpu_debugfs_test_ib},
|
||||
{"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram}
|
||||
};
|
||||
|
||||
int amdgpu_debugfs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list,
|
||||
ARRAY_SIZE(amdgpu_debugfs_list));
|
||||
}
|
||||
|
||||
#else
|
||||
int amdgpu_debugfs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) { }
|
||||
#endif
|
@ -1,5 +1,7 @@
|
||||
/*
|
||||
* Copyright 2012-15 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@ -19,57 +21,22 @@
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: AMD
|
||||
*
|
||||
*/
|
||||
|
||||
#include "dm_services.h"
|
||||
#include "include/grph_object_id.h"
|
||||
|
||||
static bool dal_graphics_object_id_is_valid(struct graphics_object_id id)
|
||||
{
|
||||
bool rc = true;
|
||||
|
||||
switch (id.type) {
|
||||
case OBJECT_TYPE_UNKNOWN:
|
||||
rc = false;
|
||||
break;
|
||||
case OBJECT_TYPE_GPU:
|
||||
case OBJECT_TYPE_ENGINE:
|
||||
/* do NOT check for id.id == 0 */
|
||||
if (id.enum_id == ENUM_ID_UNKNOWN)
|
||||
rc = false;
|
||||
break;
|
||||
default:
|
||||
if (id.id == 0 || id.enum_id == ENUM_ID_UNKNOWN)
|
||||
rc = false;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool dal_graphics_object_id_is_equal(
|
||||
struct graphics_object_id id1,
|
||||
struct graphics_object_id id2)
|
||||
{
|
||||
if (false == dal_graphics_object_id_is_valid(id1)) {
|
||||
dm_output_to_console(
|
||||
"%s: Warning: comparing invalid object 'id1'!\n", __func__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false == dal_graphics_object_id_is_valid(id2)) {
|
||||
dm_output_to_console(
|
||||
"%s: Warning: comparing invalid object 'id2'!\n", __func__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (id1.id == id2.id && id1.enum_id == id2.enum_id
|
||||
&& id1.type == id2.type)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Debugfs
|
||||
*/
|
||||
struct amdgpu_debugfs {
|
||||
const struct drm_info_list *files;
|
||||
unsigned num_files;
|
||||
};
|
||||
|
||||
int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);
|
||||
void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev);
|
||||
int amdgpu_debugfs_init(struct amdgpu_device *adev);
|
||||
int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
|
||||
const struct drm_info_list *files,
|
||||
unsigned nfiles);
|
||||
int amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
|
||||
int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
|
||||
int amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
|
File diff suppressed because it is too large
Load Diff
@ -90,7 +90,7 @@ int amdgpu_disp_priority = 0;
|
||||
int amdgpu_hw_i2c = 0;
|
||||
int amdgpu_pcie_gen2 = -1;
|
||||
int amdgpu_msi = -1;
|
||||
int amdgpu_lockup_timeout = 0;
|
||||
int amdgpu_lockup_timeout = 10000;
|
||||
int amdgpu_dpm = -1;
|
||||
int amdgpu_fw_load_type = -1;
|
||||
int amdgpu_aspm = -1;
|
||||
@ -128,6 +128,7 @@ int amdgpu_param_buf_per_se = 0;
|
||||
int amdgpu_job_hang_limit = 0;
|
||||
int amdgpu_lbpw = -1;
|
||||
int amdgpu_compute_multipipe = -1;
|
||||
int amdgpu_gpu_recovery = -1; /* auto */
|
||||
|
||||
MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing, in megabytes");
|
||||
module_param_named(vramlimit, amdgpu_vram_limit, int, 0600);
|
||||
@ -165,7 +166,7 @@ module_param_named(pcie_gen2, amdgpu_pcie_gen2, int, 0444);
|
||||
MODULE_PARM_DESC(msi, "MSI support (1 = enable, 0 = disable, -1 = auto)");
|
||||
module_param_named(msi, amdgpu_msi, int, 0444);
|
||||
|
||||
MODULE_PARM_DESC(lockup_timeout, "GPU lockup timeout in ms (default 0 = disable)");
|
||||
MODULE_PARM_DESC(lockup_timeout, "GPU lockup timeout in ms > 0 (default 10000)");
|
||||
module_param_named(lockup_timeout, amdgpu_lockup_timeout, int, 0444);
|
||||
|
||||
MODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)");
|
||||
@ -280,6 +281,9 @@ module_param_named(lbpw, amdgpu_lbpw, int, 0444);
|
||||
MODULE_PARM_DESC(compute_multipipe, "Force compute queues to be spread across pipes (1 = enable, 0 = disable, -1 = auto)");
|
||||
module_param_named(compute_multipipe, amdgpu_compute_multipipe, int, 0444);
|
||||
|
||||
MODULE_PARM_DESC(gpu_recovery, "Enable GPU recovery mechanism, (1 = enable, 0 = disable, -1 = auto");
|
||||
module_param_named(gpu_recovery, amdgpu_gpu_recovery, int, 0444);
|
||||
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
|
||||
#if defined(CONFIG_DRM_RADEON) || defined(CONFIG_DRM_RADEON_MODULE)
|
||||
@ -645,7 +649,7 @@ amdgpu_pci_shutdown(struct pci_dev *pdev)
|
||||
* unfortunately we can't detect certain
|
||||
* hypervisors so just do this all the time.
|
||||
*/
|
||||
amdgpu_suspend(adev);
|
||||
amdgpu_device_ip_suspend(adev);
|
||||
}
|
||||
|
||||
static int amdgpu_pmops_suspend(struct device *dev)
|
||||
@ -850,9 +854,6 @@ static struct drm_driver kms_driver = {
|
||||
.disable_vblank = amdgpu_disable_vblank_kms,
|
||||
.get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos,
|
||||
.get_scanout_position = amdgpu_get_crtc_scanout_position,
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
.debugfs_init = amdgpu_debugfs_init,
|
||||
#endif
|
||||
.irq_preinstall = amdgpu_irq_preinstall,
|
||||
.irq_postinstall = amdgpu_irq_postinstall,
|
||||
.irq_uninstall = amdgpu_irq_uninstall,
|
||||
@ -912,10 +913,6 @@ static int __init amdgpu_init(void)
|
||||
if (r)
|
||||
goto error_fence;
|
||||
|
||||
r = amd_sched_fence_slab_init();
|
||||
if (r)
|
||||
goto error_sched;
|
||||
|
||||
if (vgacon_text_force()) {
|
||||
DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
|
||||
return -EINVAL;
|
||||
@ -928,9 +925,6 @@ static int __init amdgpu_init(void)
|
||||
/* let modprobe override vga console setting */
|
||||
return pci_register_driver(pdriver);
|
||||
|
||||
error_sched:
|
||||
amdgpu_fence_slab_fini();
|
||||
|
||||
error_fence:
|
||||
amdgpu_sync_fini();
|
||||
|
||||
@ -944,7 +938,6 @@ static void __exit amdgpu_exit(void)
|
||||
pci_unregister_driver(pdriver);
|
||||
amdgpu_unregister_atpx_handler();
|
||||
amdgpu_sync_fini();
|
||||
amd_sched_fence_slab_fini();
|
||||
amdgpu_fence_slab_fini();
|
||||
}
|
||||
|
||||
|
@ -187,7 +187,7 @@ int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s)
|
||||
|
||||
seq = ++ring->fence_drv.sync_seq;
|
||||
amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
|
||||
seq, AMDGPU_FENCE_FLAG_INT);
|
||||
seq, 0);
|
||||
|
||||
*s = seq;
|
||||
|
||||
@ -410,7 +410,6 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
|
||||
int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
|
||||
unsigned num_hw_submission)
|
||||
{
|
||||
long timeout;
|
||||
int r;
|
||||
|
||||
/* Check that num_hw_submission is a power of two */
|
||||
@ -434,20 +433,9 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
|
||||
|
||||
/* No need to setup the GPU scheduler for KIQ ring */
|
||||
if (ring->funcs->type != AMDGPU_RING_TYPE_KIQ) {
|
||||
timeout = msecs_to_jiffies(amdgpu_lockup_timeout);
|
||||
if (timeout == 0) {
|
||||
/*
|
||||
* FIXME:
|
||||
* Delayed workqueue cannot use it directly,
|
||||
* so the scheduler will not use delayed workqueue if
|
||||
* MAX_SCHEDULE_TIMEOUT is set.
|
||||
* Currently keep it simple and silly.
|
||||
*/
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
}
|
||||
r = amd_sched_init(&ring->sched, &amdgpu_sched_ops,
|
||||
r = drm_sched_init(&ring->sched, &amdgpu_sched_ops,
|
||||
num_hw_submission, amdgpu_job_hang_limit,
|
||||
timeout, ring->name);
|
||||
msecs_to_jiffies(amdgpu_lockup_timeout), ring->name);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed to create scheduler on ring %s.\n",
|
||||
ring->name);
|
||||
@ -503,7 +491,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
|
||||
}
|
||||
amdgpu_irq_put(adev, ring->fence_drv.irq_src,
|
||||
ring->fence_drv.irq_type);
|
||||
amd_sched_fini(&ring->sched);
|
||||
drm_sched_fini(&ring->sched);
|
||||
del_timer_sync(&ring->fence_drv.fallback_timer);
|
||||
for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
|
||||
dma_fence_put(ring->fence_drv.fences[j]);
|
||||
@ -705,7 +693,7 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
|
||||
seq_printf(m, "gpu recover\n");
|
||||
amdgpu_gpu_recover(adev, NULL);
|
||||
amdgpu_device_gpu_recover(adev, NULL, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -56,6 +56,51 @@
|
||||
* Common GART table functions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* amdgpu_dummy_page_init - init dummy page used by the driver
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Allocate the dummy page used by the driver (all asics).
|
||||
* This dummy page is used by the driver as a filler for gart entries
|
||||
* when pages are taken out of the GART
|
||||
* Returns 0 on sucess, -ENOMEM on failure.
|
||||
*/
|
||||
static int amdgpu_gart_dummy_page_init(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->dummy_page.page)
|
||||
return 0;
|
||||
adev->dummy_page.page = alloc_page(GFP_DMA32 | GFP_KERNEL | __GFP_ZERO);
|
||||
if (adev->dummy_page.page == NULL)
|
||||
return -ENOMEM;
|
||||
adev->dummy_page.addr = pci_map_page(adev->pdev, adev->dummy_page.page,
|
||||
0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
if (pci_dma_mapping_error(adev->pdev, adev->dummy_page.addr)) {
|
||||
dev_err(&adev->pdev->dev, "Failed to DMA MAP the dummy page\n");
|
||||
__free_page(adev->dummy_page.page);
|
||||
adev->dummy_page.page = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_dummy_page_fini - free dummy page used by the driver
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* Frees the dummy page used by the driver (all asics).
|
||||
*/
|
||||
static void amdgpu_gart_dummy_page_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->dummy_page.page == NULL)
|
||||
return;
|
||||
pci_unmap_page(adev->pdev, adev->dummy_page.addr,
|
||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
__free_page(adev->dummy_page.page);
|
||||
adev->dummy_page.page = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_gart_table_vram_alloc - allocate vram for gart page table
|
||||
*
|
||||
@ -308,7 +353,7 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
|
||||
DRM_ERROR("Page size is smaller than GPU page size!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
r = amdgpu_dummy_page_init(adev);
|
||||
r = amdgpu_gart_dummy_page_init(adev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Compute table size */
|
||||
@ -340,5 +385,5 @@ void amdgpu_gart_fini(struct amdgpu_device *adev)
|
||||
vfree(adev->gart.pages);
|
||||
adev->gart.pages = NULL;
|
||||
#endif
|
||||
amdgpu_dummy_page_fini(adev);
|
||||
amdgpu_gart_dummy_page_fini(adev);
|
||||
}
|
||||
|
@ -851,7 +851,7 @@ static const struct drm_info_list amdgpu_debugfs_gem_list[] = {
|
||||
};
|
||||
#endif
|
||||
|
||||
int amdgpu_gem_debugfs_init(struct amdgpu_device *adev)
|
||||
int amdgpu_debugfs_gem_init(struct amdgpu_device *adev)
|
||||
{
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_gem_list, 1);
|
||||
|
@ -203,7 +203,7 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,
|
||||
|
||||
spin_lock_init(&kiq->ring_lock);
|
||||
|
||||
r = amdgpu_wb_get(adev, &adev->virt.reg_val_offs);
|
||||
r = amdgpu_device_wb_get(adev, &adev->virt.reg_val_offs);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -229,7 +229,7 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,
|
||||
void amdgpu_gfx_kiq_free_ring(struct amdgpu_ring *ring,
|
||||
struct amdgpu_irq_src *irq)
|
||||
{
|
||||
amdgpu_wb_free(ring->adev, ring->adev->virt.reg_val_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->adev->virt.reg_val_offs);
|
||||
amdgpu_ring_fini(ring);
|
||||
}
|
||||
|
||||
|
@ -92,15 +92,15 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev, unsigned ring_size,
|
||||
}
|
||||
return 0;
|
||||
} else {
|
||||
r = amdgpu_wb_get(adev, &adev->irq.ih.wptr_offs);
|
||||
r = amdgpu_device_wb_get(adev, &adev->irq.ih.wptr_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ih wptr_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_wb_get(adev, &adev->irq.ih.rptr_offs);
|
||||
r = amdgpu_device_wb_get(adev, &adev->irq.ih.rptr_offs);
|
||||
if (r) {
|
||||
amdgpu_wb_free(adev, adev->irq.ih.wptr_offs);
|
||||
amdgpu_device_wb_free(adev, adev->irq.ih.wptr_offs);
|
||||
dev_err(adev->dev, "(%d) ih rptr_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
@ -133,8 +133,8 @@ void amdgpu_ih_ring_fini(struct amdgpu_device *adev)
|
||||
amdgpu_bo_free_kernel(&adev->irq.ih.ring_obj,
|
||||
&adev->irq.ih.gpu_addr,
|
||||
(void **)&adev->irq.ih.ring);
|
||||
amdgpu_wb_free(adev, adev->irq.ih.wptr_offs);
|
||||
amdgpu_wb_free(adev, adev->irq.ih.rptr_offs);
|
||||
amdgpu_device_wb_free(adev, adev->irq.ih.wptr_offs);
|
||||
amdgpu_device_wb_free(adev, adev->irq.ih.rptr_offs);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,7 +88,7 @@ static void amdgpu_irq_reset_work_func(struct work_struct *work)
|
||||
reset_work);
|
||||
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
amdgpu_gpu_recover(adev, NULL);
|
||||
amdgpu_device_gpu_recover(adev, NULL, false);
|
||||
}
|
||||
|
||||
/* Disable *all* interrupts */
|
||||
|
@ -28,7 +28,7 @@
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_trace.h"
|
||||
|
||||
static void amdgpu_job_timedout(struct amd_sched_job *s_job)
|
||||
static void amdgpu_job_timedout(struct drm_sched_job *s_job)
|
||||
{
|
||||
struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base);
|
||||
|
||||
@ -37,7 +37,7 @@ static void amdgpu_job_timedout(struct amd_sched_job *s_job)
|
||||
atomic_read(&job->ring->fence_drv.last_seq),
|
||||
job->ring->fence_drv.sync_seq);
|
||||
|
||||
amdgpu_gpu_recover(job->adev, job);
|
||||
amdgpu_device_gpu_recover(job->adev, job, false);
|
||||
}
|
||||
|
||||
int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
|
||||
@ -96,7 +96,7 @@ void amdgpu_job_free_resources(struct amdgpu_job *job)
|
||||
amdgpu_ib_free(job->adev, &job->ibs[i], f);
|
||||
}
|
||||
|
||||
static void amdgpu_job_free_cb(struct amd_sched_job *s_job)
|
||||
static void amdgpu_job_free_cb(struct drm_sched_job *s_job)
|
||||
{
|
||||
struct amdgpu_job *job = container_of(s_job, struct amdgpu_job, base);
|
||||
|
||||
@ -118,7 +118,7 @@ void amdgpu_job_free(struct amdgpu_job *job)
|
||||
}
|
||||
|
||||
int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
|
||||
struct amd_sched_entity *entity, void *owner,
|
||||
struct drm_sched_entity *entity, void *owner,
|
||||
struct dma_fence **f)
|
||||
{
|
||||
int r;
|
||||
@ -127,7 +127,7 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
|
||||
if (!f)
|
||||
return -EINVAL;
|
||||
|
||||
r = amd_sched_job_init(&job->base, &ring->sched, entity, owner);
|
||||
r = drm_sched_job_init(&job->base, &ring->sched, entity, owner);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -136,13 +136,13 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
|
||||
*f = dma_fence_get(&job->base.s_fence->finished);
|
||||
amdgpu_job_free_resources(job);
|
||||
amdgpu_ring_priority_get(job->ring, job->base.s_priority);
|
||||
amd_sched_entity_push_job(&job->base, entity);
|
||||
drm_sched_entity_push_job(&job->base, entity);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job,
|
||||
struct amd_sched_entity *s_entity)
|
||||
static struct dma_fence *amdgpu_job_dependency(struct drm_sched_job *sched_job,
|
||||
struct drm_sched_entity *s_entity)
|
||||
{
|
||||
struct amdgpu_job *job = to_amdgpu_job(sched_job);
|
||||
struct amdgpu_vm *vm = job->vm;
|
||||
@ -151,7 +151,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job,
|
||||
struct dma_fence *fence = amdgpu_sync_get_fence(&job->sync, &explicit);
|
||||
|
||||
if (fence && explicit) {
|
||||
if (amd_sched_dependency_optimized(fence, s_entity)) {
|
||||
if (drm_sched_dependency_optimized(fence, s_entity)) {
|
||||
r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence, false);
|
||||
if (r)
|
||||
DRM_ERROR("Error adding fence to sync (%d)\n", r);
|
||||
@ -173,7 +173,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job,
|
||||
return fence;
|
||||
}
|
||||
|
||||
static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
|
||||
static struct dma_fence *amdgpu_job_run(struct drm_sched_job *sched_job)
|
||||
{
|
||||
struct dma_fence *fence = NULL, *finished;
|
||||
struct amdgpu_device *adev;
|
||||
@ -211,7 +211,7 @@ static struct dma_fence *amdgpu_job_run(struct amd_sched_job *sched_job)
|
||||
return fence;
|
||||
}
|
||||
|
||||
const struct amd_sched_backend_ops amdgpu_sched_ops = {
|
||||
const struct drm_sched_backend_ops amdgpu_sched_ops = {
|
||||
.dependency = amdgpu_job_dependency,
|
||||
.run_job = amdgpu_job_run,
|
||||
.timedout_job = amdgpu_job_timedout,
|
||||
|
@ -37,6 +37,18 @@
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_trace.h"
|
||||
|
||||
static bool amdgpu_need_backup(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
return false;
|
||||
|
||||
if (amdgpu_gpu_recovery == 0 ||
|
||||
(amdgpu_gpu_recovery == -1 && !amdgpu_sriov_vf(adev)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo)
|
||||
{
|
||||
struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);
|
||||
@ -327,7 +339,12 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
|
||||
uint64_t init_value,
|
||||
struct amdgpu_bo **bo_ptr)
|
||||
{
|
||||
struct ttm_operation_ctx ctx = { !kernel, false };
|
||||
struct ttm_operation_ctx ctx = {
|
||||
.interruptible = !kernel,
|
||||
.no_wait_gpu = false,
|
||||
.allow_reserved_eviction = true,
|
||||
.resv = resv
|
||||
};
|
||||
struct amdgpu_bo *bo;
|
||||
enum ttm_bo_type type;
|
||||
unsigned long page_align;
|
||||
|
@ -1278,16 +1278,16 @@ void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
|
||||
/* XXX select vce level based on ring/task */
|
||||
adev->pm.dpm.vce_level = AMD_VCE_LEVEL_AC_ALL;
|
||||
mutex_unlock(&adev->pm.mutex);
|
||||
amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
amdgpu_pm_compute_clocks(adev);
|
||||
} else {
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_GATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_GATE);
|
||||
mutex_lock(&adev->pm.mutex);
|
||||
adev->pm.dpm.vce_active = false;
|
||||
mutex_unlock(&adev->pm.mutex);
|
||||
@ -1584,7 +1584,7 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
|
||||
struct drm_device *ddev = adev->ddev;
|
||||
u32 flags = 0;
|
||||
|
||||
amdgpu_get_clockgating_state(adev, &flags);
|
||||
amdgpu_device_ip_get_clockgating_state(adev, &flags);
|
||||
seq_printf(m, "Clock Gating Flags Mask: 0x%x\n", flags);
|
||||
amdgpu_parse_cg_state(m, flags);
|
||||
seq_printf(m, "\n");
|
||||
|
@ -164,7 +164,7 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring)
|
||||
* Release a request for executing at @priority
|
||||
*/
|
||||
void amdgpu_ring_priority_put(struct amdgpu_ring *ring,
|
||||
enum amd_sched_priority priority)
|
||||
enum drm_sched_priority priority)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -175,7 +175,7 @@ void amdgpu_ring_priority_put(struct amdgpu_ring *ring,
|
||||
return;
|
||||
|
||||
/* no need to restore if the job is already at the lowest priority */
|
||||
if (priority == AMD_SCHED_PRIORITY_NORMAL)
|
||||
if (priority == DRM_SCHED_PRIORITY_NORMAL)
|
||||
return;
|
||||
|
||||
mutex_lock(&ring->priority_mutex);
|
||||
@ -184,8 +184,8 @@ void amdgpu_ring_priority_put(struct amdgpu_ring *ring,
|
||||
goto out_unlock;
|
||||
|
||||
/* decay priority to the next level with a job available */
|
||||
for (i = priority; i >= AMD_SCHED_PRIORITY_MIN; i--) {
|
||||
if (i == AMD_SCHED_PRIORITY_NORMAL
|
||||
for (i = priority; i >= DRM_SCHED_PRIORITY_MIN; i--) {
|
||||
if (i == DRM_SCHED_PRIORITY_NORMAL
|
||||
|| atomic_read(&ring->num_jobs[i])) {
|
||||
ring->priority = i;
|
||||
ring->funcs->set_priority(ring, i);
|
||||
@ -206,7 +206,7 @@ out_unlock:
|
||||
* Request a ring's priority to be raised to @priority (refcounted).
|
||||
*/
|
||||
void amdgpu_ring_priority_get(struct amdgpu_ring *ring,
|
||||
enum amd_sched_priority priority)
|
||||
enum drm_sched_priority priority)
|
||||
{
|
||||
if (!ring->funcs->set_priority)
|
||||
return;
|
||||
@ -263,25 +263,25 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_wb_get(adev, &ring->rptr_offs);
|
||||
r = amdgpu_device_wb_get(adev, &ring->rptr_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring rptr_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_wb_get(adev, &ring->wptr_offs);
|
||||
r = amdgpu_device_wb_get(adev, &ring->wptr_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring wptr_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_wb_get(adev, &ring->fence_offs);
|
||||
r = amdgpu_device_wb_get(adev, &ring->fence_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring fence_offs wb alloc failed\n", r);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = amdgpu_wb_get(adev, &ring->cond_exe_offs);
|
||||
r = amdgpu_device_wb_get(adev, &ring->cond_exe_offs);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) ring cond_exec_polling wb alloc failed\n", r);
|
||||
return r;
|
||||
@ -317,12 +317,12 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
|
||||
}
|
||||
|
||||
ring->max_dw = max_dw;
|
||||
ring->priority = AMD_SCHED_PRIORITY_NORMAL;
|
||||
ring->priority = DRM_SCHED_PRIORITY_NORMAL;
|
||||
mutex_init(&ring->priority_mutex);
|
||||
INIT_LIST_HEAD(&ring->lru_list);
|
||||
amdgpu_ring_lru_touch(adev, ring);
|
||||
|
||||
for (i = 0; i < AMD_SCHED_PRIORITY_MAX; ++i)
|
||||
for (i = 0; i < DRM_SCHED_PRIORITY_MAX; ++i)
|
||||
atomic_set(&ring->num_jobs[i], 0);
|
||||
|
||||
if (amdgpu_debugfs_ring_init(adev, ring)) {
|
||||
@ -348,11 +348,11 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring)
|
||||
if (!(ring->adev) || !(ring->adev->rings[ring->idx]))
|
||||
return;
|
||||
|
||||
amdgpu_wb_free(ring->adev, ring->rptr_offs);
|
||||
amdgpu_wb_free(ring->adev, ring->wptr_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->rptr_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->wptr_offs);
|
||||
|
||||
amdgpu_wb_free(ring->adev, ring->cond_exe_offs);
|
||||
amdgpu_wb_free(ring->adev, ring->fence_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->cond_exe_offs);
|
||||
amdgpu_device_wb_free(ring->adev, ring->fence_offs);
|
||||
|
||||
amdgpu_bo_free_kernel(&ring->ring_obj,
|
||||
&ring->gpu_addr,
|
||||
|
@ -25,7 +25,7 @@
|
||||
#define __AMDGPU_RING_H__
|
||||
|
||||
#include <drm/amdgpu_drm.h>
|
||||
#include "gpu_scheduler.h"
|
||||
#include <drm/gpu_scheduler.h>
|
||||
|
||||
/* max number of rings */
|
||||
#define AMDGPU_MAX_RINGS 18
|
||||
@ -154,14 +154,14 @@ struct amdgpu_ring_funcs {
|
||||
void (*emit_tmz)(struct amdgpu_ring *ring, bool start);
|
||||
/* priority functions */
|
||||
void (*set_priority) (struct amdgpu_ring *ring,
|
||||
enum amd_sched_priority priority);
|
||||
enum drm_sched_priority priority);
|
||||
};
|
||||
|
||||
struct amdgpu_ring {
|
||||
struct amdgpu_device *adev;
|
||||
const struct amdgpu_ring_funcs *funcs;
|
||||
struct amdgpu_fence_driver fence_drv;
|
||||
struct amd_gpu_scheduler sched;
|
||||
struct drm_gpu_scheduler sched;
|
||||
struct list_head lru_list;
|
||||
|
||||
struct amdgpu_bo *ring_obj;
|
||||
@ -186,6 +186,7 @@ struct amdgpu_ring {
|
||||
uint64_t eop_gpu_addr;
|
||||
u32 doorbell_index;
|
||||
bool use_doorbell;
|
||||
bool use_pollmem;
|
||||
unsigned wptr_offs;
|
||||
unsigned fence_offs;
|
||||
uint64_t current_ctx;
|
||||
@ -196,7 +197,7 @@ struct amdgpu_ring {
|
||||
unsigned vm_inv_eng;
|
||||
bool has_compute_vm_bug;
|
||||
|
||||
atomic_t num_jobs[AMD_SCHED_PRIORITY_MAX];
|
||||
atomic_t num_jobs[DRM_SCHED_PRIORITY_MAX];
|
||||
struct mutex priority_mutex;
|
||||
/* protected by priority_mutex */
|
||||
int priority;
|
||||
@ -212,9 +213,9 @@ void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
|
||||
void amdgpu_ring_commit(struct amdgpu_ring *ring);
|
||||
void amdgpu_ring_undo(struct amdgpu_ring *ring);
|
||||
void amdgpu_ring_priority_get(struct amdgpu_ring *ring,
|
||||
enum amd_sched_priority priority);
|
||||
enum drm_sched_priority priority);
|
||||
void amdgpu_ring_priority_put(struct amdgpu_ring *ring,
|
||||
enum amd_sched_priority priority);
|
||||
enum drm_sched_priority priority);
|
||||
int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
|
||||
unsigned ring_size, struct amdgpu_irq_src *irq_src,
|
||||
unsigned irq_type);
|
||||
|
@ -29,29 +29,29 @@
|
||||
|
||||
#include "amdgpu_vm.h"
|
||||
|
||||
enum amd_sched_priority amdgpu_to_sched_priority(int amdgpu_priority)
|
||||
enum drm_sched_priority amdgpu_to_sched_priority(int amdgpu_priority)
|
||||
{
|
||||
switch (amdgpu_priority) {
|
||||
case AMDGPU_CTX_PRIORITY_VERY_HIGH:
|
||||
return AMD_SCHED_PRIORITY_HIGH_HW;
|
||||
return DRM_SCHED_PRIORITY_HIGH_HW;
|
||||
case AMDGPU_CTX_PRIORITY_HIGH:
|
||||
return AMD_SCHED_PRIORITY_HIGH_SW;
|
||||
return DRM_SCHED_PRIORITY_HIGH_SW;
|
||||
case AMDGPU_CTX_PRIORITY_NORMAL:
|
||||
return AMD_SCHED_PRIORITY_NORMAL;
|
||||
return DRM_SCHED_PRIORITY_NORMAL;
|
||||
case AMDGPU_CTX_PRIORITY_LOW:
|
||||
case AMDGPU_CTX_PRIORITY_VERY_LOW:
|
||||
return AMD_SCHED_PRIORITY_LOW;
|
||||
return DRM_SCHED_PRIORITY_LOW;
|
||||
case AMDGPU_CTX_PRIORITY_UNSET:
|
||||
return AMD_SCHED_PRIORITY_UNSET;
|
||||
return DRM_SCHED_PRIORITY_UNSET;
|
||||
default:
|
||||
WARN(1, "Invalid context priority %d\n", amdgpu_priority);
|
||||
return AMD_SCHED_PRIORITY_INVALID;
|
||||
return DRM_SCHED_PRIORITY_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
static int amdgpu_sched_process_priority_override(struct amdgpu_device *adev,
|
||||
int fd,
|
||||
enum amd_sched_priority priority)
|
||||
enum drm_sched_priority priority)
|
||||
{
|
||||
struct file *filp = fcheck(fd);
|
||||
struct drm_file *file;
|
||||
@ -86,11 +86,11 @@ int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
|
||||
{
|
||||
union drm_amdgpu_sched *args = data;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
enum amd_sched_priority priority;
|
||||
enum drm_sched_priority priority;
|
||||
int r;
|
||||
|
||||
priority = amdgpu_to_sched_priority(args->in.priority);
|
||||
if (args->in.flags || priority == AMD_SCHED_PRIORITY_INVALID)
|
||||
if (args->in.flags || priority == DRM_SCHED_PRIORITY_INVALID)
|
||||
return -EINVAL;
|
||||
|
||||
switch (args->in.op) {
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
#include <drm/drmP.h>
|
||||
|
||||
enum amd_sched_priority amdgpu_to_sched_priority(int amdgpu_priority);
|
||||
enum drm_sched_priority amdgpu_to_sched_priority(int amdgpu_priority);
|
||||
int amdgpu_sched_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *filp);
|
||||
|
||||
|
@ -64,7 +64,7 @@ void amdgpu_sync_create(struct amdgpu_sync *sync)
|
||||
static bool amdgpu_sync_same_dev(struct amdgpu_device *adev,
|
||||
struct dma_fence *f)
|
||||
{
|
||||
struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
|
||||
struct drm_sched_fence *s_fence = to_drm_sched_fence(f);
|
||||
|
||||
if (s_fence) {
|
||||
struct amdgpu_ring *ring;
|
||||
@ -85,7 +85,7 @@ static bool amdgpu_sync_same_dev(struct amdgpu_device *adev,
|
||||
*/
|
||||
static void *amdgpu_sync_get_owner(struct dma_fence *f)
|
||||
{
|
||||
struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
|
||||
struct drm_sched_fence *s_fence = to_drm_sched_fence(f);
|
||||
|
||||
if (s_fence)
|
||||
return s_fence->owner;
|
||||
@ -120,7 +120,7 @@ static void amdgpu_sync_keep_later(struct dma_fence **keep,
|
||||
* Tries to add the fence to an existing hash entry. Returns true when an entry
|
||||
* was found, false otherwise.
|
||||
*/
|
||||
static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f)
|
||||
static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f, bool explicit)
|
||||
{
|
||||
struct amdgpu_sync_entry *e;
|
||||
|
||||
@ -129,6 +129,10 @@ static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct dma_fence *f)
|
||||
continue;
|
||||
|
||||
amdgpu_sync_keep_later(&e->fence, f);
|
||||
|
||||
/* Preserve eplicit flag to not loose pipe line sync */
|
||||
e->explicit |= explicit;
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -148,12 +152,11 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
|
||||
|
||||
if (!f)
|
||||
return 0;
|
||||
|
||||
if (amdgpu_sync_same_dev(adev, f) &&
|
||||
amdgpu_sync_get_owner(f) == AMDGPU_FENCE_OWNER_VM)
|
||||
amdgpu_sync_keep_later(&sync->last_vm_update, f);
|
||||
|
||||
if (amdgpu_sync_add_later(sync, f))
|
||||
if (amdgpu_sync_add_later(sync, f, explicit))
|
||||
return 0;
|
||||
|
||||
e = kmem_cache_alloc(amdgpu_sync_slab, GFP_KERNEL);
|
||||
@ -245,7 +248,7 @@ struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
|
||||
|
||||
hash_for_each_safe(sync->fences, i, tmp, e, node) {
|
||||
struct dma_fence *f = e->fence;
|
||||
struct amd_sched_fence *s_fence = to_amd_sched_fence(f);
|
||||
struct drm_sched_fence *s_fence = to_drm_sched_fence(f);
|
||||
|
||||
if (dma_fence_is_signaled(f)) {
|
||||
hash_del(&e->node);
|
||||
|
@ -76,7 +76,7 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct drm_global_reference *global_ref;
|
||||
struct amdgpu_ring *ring;
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
int r;
|
||||
|
||||
adev->mman.mem_global_referenced = false;
|
||||
@ -108,8 +108,8 @@ static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
|
||||
mutex_init(&adev->mman.gtt_window_lock);
|
||||
|
||||
ring = adev->mman.buffer_funcs_ring;
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_KERNEL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->mman.entity,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->mman.entity,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed setting up TTM BO move run queue.\n");
|
||||
@ -131,7 +131,7 @@ error_mem:
|
||||
static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->mman.mem_global_referenced) {
|
||||
amd_sched_entity_fini(adev->mman.entity.sched,
|
||||
drm_sched_entity_fini(adev->mman.entity.sched,
|
||||
&adev->mman.entity);
|
||||
mutex_destroy(&adev->mman.gtt_window_lock);
|
||||
drm_global_item_unref(&adev->mman.bo_global_ref.ref);
|
||||
@ -505,7 +505,7 @@ static int amdgpu_move_vram_ram(struct ttm_buffer_object *bo, bool evict,
|
||||
if (unlikely(r)) {
|
||||
goto out_cleanup;
|
||||
}
|
||||
r = ttm_bo_move_ttm(bo, ctx->interruptible, ctx->no_wait_gpu, new_mem);
|
||||
r = ttm_bo_move_ttm(bo, ctx, new_mem);
|
||||
out_cleanup:
|
||||
ttm_bo_mem_put(bo, &tmp_mem);
|
||||
return r;
|
||||
@ -536,7 +536,7 @@ static int amdgpu_move_ram_vram(struct ttm_buffer_object *bo, bool evict,
|
||||
if (unlikely(r)) {
|
||||
return r;
|
||||
}
|
||||
r = ttm_bo_move_ttm(bo, ctx->interruptible, ctx->no_wait_gpu, &tmp_mem);
|
||||
r = ttm_bo_move_ttm(bo, ctx, &tmp_mem);
|
||||
if (unlikely(r)) {
|
||||
goto out_cleanup;
|
||||
}
|
||||
@ -597,8 +597,7 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
||||
|
||||
if (r) {
|
||||
memcpy:
|
||||
r = ttm_bo_move_memcpy(bo, ctx->interruptible,
|
||||
ctx->no_wait_gpu, new_mem);
|
||||
r = ttm_bo_move_memcpy(bo, ctx, new_mem);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
@ -1270,6 +1269,101 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
|
||||
.access_memory = &amdgpu_ttm_access_memory
|
||||
};
|
||||
|
||||
/*
|
||||
* Firmware Reservation functions
|
||||
*/
|
||||
/**
|
||||
* amdgpu_ttm_fw_reserve_vram_fini - free fw reserved vram
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* free fw reserved vram if it has been reserved.
|
||||
*/
|
||||
static void amdgpu_ttm_fw_reserve_vram_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
amdgpu_bo_free_kernel(&adev->fw_vram_usage.reserved_bo,
|
||||
NULL, &adev->fw_vram_usage.va);
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_ttm_fw_reserve_vram_init - create bo vram reservation from fw
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
*
|
||||
* create bo vram reservation from fw.
|
||||
*/
|
||||
static int amdgpu_ttm_fw_reserve_vram_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct ttm_operation_ctx ctx = { false, false };
|
||||
int r = 0;
|
||||
int i;
|
||||
u64 vram_size = adev->mc.visible_vram_size;
|
||||
u64 offset = adev->fw_vram_usage.start_offset;
|
||||
u64 size = adev->fw_vram_usage.size;
|
||||
struct amdgpu_bo *bo;
|
||||
|
||||
adev->fw_vram_usage.va = NULL;
|
||||
adev->fw_vram_usage.reserved_bo = NULL;
|
||||
|
||||
if (adev->fw_vram_usage.size > 0 &&
|
||||
adev->fw_vram_usage.size <= vram_size) {
|
||||
|
||||
r = amdgpu_bo_create(adev, adev->fw_vram_usage.size,
|
||||
PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM,
|
||||
AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |
|
||||
AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, NULL, NULL, 0,
|
||||
&adev->fw_vram_usage.reserved_bo);
|
||||
if (r)
|
||||
goto error_create;
|
||||
|
||||
r = amdgpu_bo_reserve(adev->fw_vram_usage.reserved_bo, false);
|
||||
if (r)
|
||||
goto error_reserve;
|
||||
|
||||
/* remove the original mem node and create a new one at the
|
||||
* request position
|
||||
*/
|
||||
bo = adev->fw_vram_usage.reserved_bo;
|
||||
offset = ALIGN(offset, PAGE_SIZE);
|
||||
for (i = 0; i < bo->placement.num_placement; ++i) {
|
||||
bo->placements[i].fpfn = offset >> PAGE_SHIFT;
|
||||
bo->placements[i].lpfn = (offset + size) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
ttm_bo_mem_put(&bo->tbo, &bo->tbo.mem);
|
||||
r = ttm_bo_mem_space(&bo->tbo, &bo->placement,
|
||||
&bo->tbo.mem, &ctx);
|
||||
if (r)
|
||||
goto error_pin;
|
||||
|
||||
r = amdgpu_bo_pin_restricted(adev->fw_vram_usage.reserved_bo,
|
||||
AMDGPU_GEM_DOMAIN_VRAM,
|
||||
adev->fw_vram_usage.start_offset,
|
||||
(adev->fw_vram_usage.start_offset +
|
||||
adev->fw_vram_usage.size), NULL);
|
||||
if (r)
|
||||
goto error_pin;
|
||||
r = amdgpu_bo_kmap(adev->fw_vram_usage.reserved_bo,
|
||||
&adev->fw_vram_usage.va);
|
||||
if (r)
|
||||
goto error_kmap;
|
||||
|
||||
amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo);
|
||||
}
|
||||
return r;
|
||||
|
||||
error_kmap:
|
||||
amdgpu_bo_unpin(adev->fw_vram_usage.reserved_bo);
|
||||
error_pin:
|
||||
amdgpu_bo_unreserve(adev->fw_vram_usage.reserved_bo);
|
||||
error_reserve:
|
||||
amdgpu_bo_unref(&adev->fw_vram_usage.reserved_bo);
|
||||
error_create:
|
||||
adev->fw_vram_usage.va = NULL;
|
||||
adev->fw_vram_usage.reserved_bo = NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||
{
|
||||
uint64_t gtt_size;
|
||||
@ -1312,7 +1406,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||
*The reserved vram for firmware must be pinned to the specified
|
||||
*place on the VRAM, so reserve it early.
|
||||
*/
|
||||
r = amdgpu_fw_reserve_vram_init(adev);
|
||||
r = amdgpu_ttm_fw_reserve_vram_init(adev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
@ -1330,9 +1424,11 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||
struct sysinfo si;
|
||||
|
||||
si_meminfo(&si);
|
||||
gtt_size = max(AMDGPU_DEFAULT_GTT_SIZE_MB << 20,
|
||||
(uint64_t)si.totalram * si.mem_unit * 3/4);
|
||||
} else
|
||||
gtt_size = min(max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
|
||||
adev->mc.mc_vram_size),
|
||||
((uint64_t)si.totalram * si.mem_unit * 3/4));
|
||||
}
|
||||
else
|
||||
gtt_size = (uint64_t)amdgpu_gtt_size << 20;
|
||||
r = ttm_bo_init_mm(&adev->mman.bdev, TTM_PL_TT, gtt_size >> PAGE_SHIFT);
|
||||
if (r) {
|
||||
@ -1396,7 +1492,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
|
||||
|
||||
amdgpu_ttm_debugfs_fini(adev);
|
||||
amdgpu_bo_free_kernel(&adev->stolen_vga_memory, NULL, NULL);
|
||||
amdgpu_fw_reserve_vram_fini(adev);
|
||||
amdgpu_ttm_fw_reserve_vram_fini(adev);
|
||||
|
||||
ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_VRAM);
|
||||
ttm_bo_clean_mm(&adev->mman.bdev, TTM_PL_TT);
|
||||
|
@ -25,7 +25,7 @@
|
||||
#define __AMDGPU_TTM_H__
|
||||
|
||||
#include "amdgpu.h"
|
||||
#include "gpu_scheduler.h"
|
||||
#include <drm/gpu_scheduler.h>
|
||||
|
||||
#define AMDGPU_PL_GDS (TTM_PL_PRIV + 0)
|
||||
#define AMDGPU_PL_GWS (TTM_PL_PRIV + 1)
|
||||
@ -55,7 +55,7 @@ struct amdgpu_mman {
|
||||
|
||||
struct mutex gtt_window_lock;
|
||||
/* Scheduler entity for buffer moves */
|
||||
struct amd_sched_entity entity;
|
||||
struct drm_sched_entity entity;
|
||||
};
|
||||
|
||||
struct amdgpu_copy_mem {
|
||||
|
@ -116,7 +116,7 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work);
|
||||
int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
unsigned long bo_size;
|
||||
const char *fw_name;
|
||||
const struct common_firmware_header *hdr;
|
||||
@ -230,8 +230,8 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
ring = &adev->uvd.ring;
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->uvd.entity,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->uvd.entity,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r != 0) {
|
||||
DRM_ERROR("Failed setting up UVD run queue.\n");
|
||||
@ -244,7 +244,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
/* from uvd v5.0 HW addressing capacity increased to 64 bits */
|
||||
if (!amdgpu_ip_block_version_cmp(adev, AMD_IP_BLOCK_TYPE_UVD, 5, 0))
|
||||
if (!amdgpu_device_ip_block_version_cmp(adev, AMD_IP_BLOCK_TYPE_UVD, 5, 0))
|
||||
adev->uvd.address_64_bit = true;
|
||||
|
||||
switch (adev->asic_type) {
|
||||
@ -272,7 +272,7 @@ int amdgpu_uvd_sw_fini(struct amdgpu_device *adev)
|
||||
int i;
|
||||
kfree(adev->uvd.saved_bo);
|
||||
|
||||
amd_sched_entity_fini(&adev->uvd.ring.sched, &adev->uvd.entity);
|
||||
drm_sched_entity_fini(&adev->uvd.ring.sched, &adev->uvd.entity);
|
||||
|
||||
amdgpu_bo_free_kernel(&adev->uvd.vcpu_bo,
|
||||
&adev->uvd.gpu_addr,
|
||||
@ -297,6 +297,8 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
|
||||
if (adev->uvd.vcpu_bo == NULL)
|
||||
return 0;
|
||||
|
||||
cancel_delayed_work_sync(&adev->uvd.idle_work);
|
||||
|
||||
for (i = 0; i < adev->uvd.max_handles; ++i)
|
||||
if (atomic_read(&adev->uvd.handles[i]))
|
||||
break;
|
||||
@ -304,8 +306,6 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
|
||||
if (i == AMDGPU_MAX_UVD_HANDLES)
|
||||
return 0;
|
||||
|
||||
cancel_delayed_work_sync(&adev->uvd.idle_work);
|
||||
|
||||
size = amdgpu_bo_size(adev->uvd.vcpu_bo);
|
||||
ptr = adev->uvd.cpu_addr;
|
||||
|
||||
@ -346,6 +346,8 @@ int amdgpu_uvd_resume(struct amdgpu_device *adev)
|
||||
ptr += le32_to_cpu(hdr->ucode_size_bytes);
|
||||
}
|
||||
memset_io(ptr, 0, size);
|
||||
/* to restore uvd fence seq */
|
||||
amdgpu_fence_driver_force_completion(&adev->uvd.ring);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1153,10 +1155,10 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work)
|
||||
} else {
|
||||
amdgpu_asic_set_uvd_clocks(adev, 0, 0);
|
||||
/* shutdown the UVD block */
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_CG_STATE_GATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_CG_STATE_GATE);
|
||||
}
|
||||
} else {
|
||||
schedule_delayed_work(&adev->uvd.idle_work, UVD_IDLE_TIMEOUT);
|
||||
@ -1176,10 +1178,10 @@ void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring)
|
||||
amdgpu_dpm_enable_uvd(adev, true);
|
||||
} else {
|
||||
amdgpu_asic_set_uvd_clocks(adev, 53300, 40000);
|
||||
amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -51,8 +51,8 @@ struct amdgpu_uvd {
|
||||
struct amdgpu_irq_src irq;
|
||||
bool address_64_bit;
|
||||
bool use_ctx_buf;
|
||||
struct amd_sched_entity entity;
|
||||
struct amd_sched_entity entity_enc;
|
||||
struct drm_sched_entity entity;
|
||||
struct drm_sched_entity entity_enc;
|
||||
uint32_t srbm_soft_reset;
|
||||
unsigned num_enc_rings;
|
||||
};
|
||||
|
@ -85,7 +85,7 @@ static void amdgpu_vce_idle_work_handler(struct work_struct *work);
|
||||
int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
const char *fw_name;
|
||||
const struct common_firmware_header *hdr;
|
||||
unsigned ucode_version, version_major, version_minor, binary_id;
|
||||
@ -174,8 +174,8 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
|
||||
}
|
||||
|
||||
ring = &adev->vce.ring[0];
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->vce.entity,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->vce.entity,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r != 0) {
|
||||
DRM_ERROR("Failed setting up VCE run queue.\n");
|
||||
@ -207,7 +207,7 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev)
|
||||
if (adev->vce.vcpu_bo == NULL)
|
||||
return 0;
|
||||
|
||||
amd_sched_entity_fini(&adev->vce.ring[0].sched, &adev->vce.entity);
|
||||
drm_sched_entity_fini(&adev->vce.ring[0].sched, &adev->vce.entity);
|
||||
|
||||
amdgpu_bo_free_kernel(&adev->vce.vcpu_bo, &adev->vce.gpu_addr,
|
||||
(void **)&adev->vce.cpu_addr);
|
||||
@ -311,10 +311,10 @@ static void amdgpu_vce_idle_work_handler(struct work_struct *work)
|
||||
amdgpu_dpm_enable_vce(adev, false);
|
||||
} else {
|
||||
amdgpu_asic_set_vce_clocks(adev, 0, 0);
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_GATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_GATE);
|
||||
}
|
||||
} else {
|
||||
schedule_delayed_work(&adev->vce.idle_work, VCE_IDLE_TIMEOUT);
|
||||
@ -343,10 +343,10 @@ void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring)
|
||||
amdgpu_dpm_enable_vce(adev, true);
|
||||
} else {
|
||||
amdgpu_asic_set_vce_clocks(adev, 53300, 40000);
|
||||
amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_CG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCE,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ struct amdgpu_vce {
|
||||
struct amdgpu_ring ring[AMDGPU_MAX_VCE_RINGS];
|
||||
struct amdgpu_irq_src irq;
|
||||
unsigned harvest_config;
|
||||
struct amd_sched_entity entity;
|
||||
struct drm_sched_entity entity;
|
||||
uint32_t srbm_soft_reset;
|
||||
unsigned num_rings;
|
||||
};
|
||||
|
@ -35,7 +35,6 @@
|
||||
#include "soc15d.h"
|
||||
#include "soc15_common.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "vcn/vcn_1_0_offset.h"
|
||||
|
||||
/* 1 second timeout */
|
||||
@ -51,7 +50,7 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work);
|
||||
int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
unsigned long bo_size;
|
||||
const char *fw_name;
|
||||
const struct common_firmware_header *hdr;
|
||||
@ -104,8 +103,8 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
ring = &adev->vcn.ring_dec;
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->vcn.entity_dec,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->vcn.entity_dec,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r != 0) {
|
||||
DRM_ERROR("Failed setting up VCN dec run queue.\n");
|
||||
@ -113,8 +112,8 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
ring = &adev->vcn.ring_enc[0];
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->vcn.entity_enc,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->vcn.entity_enc,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r != 0) {
|
||||
DRM_ERROR("Failed setting up VCN enc run queue.\n");
|
||||
@ -130,9 +129,9 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)
|
||||
|
||||
kfree(adev->vcn.saved_bo);
|
||||
|
||||
amd_sched_entity_fini(&adev->vcn.ring_dec.sched, &adev->vcn.entity_dec);
|
||||
drm_sched_entity_fini(&adev->vcn.ring_dec.sched, &adev->vcn.entity_dec);
|
||||
|
||||
amd_sched_entity_fini(&adev->vcn.ring_enc[0].sched, &adev->vcn.entity_enc);
|
||||
drm_sched_entity_fini(&adev->vcn.ring_enc[0].sched, &adev->vcn.entity_enc);
|
||||
|
||||
amdgpu_bo_free_kernel(&adev->vcn.vcpu_bo,
|
||||
&adev->vcn.gpu_addr,
|
||||
|
@ -56,8 +56,8 @@ struct amdgpu_vcn {
|
||||
struct amdgpu_ring ring_dec;
|
||||
struct amdgpu_ring ring_enc[AMDGPU_VCN_MAX_ENC_RINGS];
|
||||
struct amdgpu_irq_src irq;
|
||||
struct amd_sched_entity entity_dec;
|
||||
struct amd_sched_entity entity_enc;
|
||||
struct drm_sched_entity entity_dec;
|
||||
struct drm_sched_entity entity_enc;
|
||||
unsigned num_enc_rings;
|
||||
};
|
||||
|
||||
|
@ -148,12 +148,23 @@ struct amdgpu_prt_cb {
|
||||
static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
|
||||
unsigned level)
|
||||
{
|
||||
if (level != adev->vm_manager.num_level)
|
||||
return 9 * (adev->vm_manager.num_level - level - 1) +
|
||||
unsigned shift = 0xff;
|
||||
|
||||
switch (level) {
|
||||
case AMDGPU_VM_PDB2:
|
||||
case AMDGPU_VM_PDB1:
|
||||
case AMDGPU_VM_PDB0:
|
||||
shift = 9 * (AMDGPU_VM_PDB0 - level) +
|
||||
adev->vm_manager.block_size;
|
||||
else
|
||||
/* For the page tables on the leaves */
|
||||
return 0;
|
||||
break;
|
||||
case AMDGPU_VM_PTB:
|
||||
shift = 0;
|
||||
break;
|
||||
default:
|
||||
dev_err(adev->dev, "the level%d isn't supported.\n", level);
|
||||
}
|
||||
|
||||
return shift;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -166,12 +177,13 @@ static unsigned amdgpu_vm_level_shift(struct amdgpu_device *adev,
|
||||
static unsigned amdgpu_vm_num_entries(struct amdgpu_device *adev,
|
||||
unsigned level)
|
||||
{
|
||||
unsigned shift = amdgpu_vm_level_shift(adev, 0);
|
||||
unsigned shift = amdgpu_vm_level_shift(adev,
|
||||
adev->vm_manager.root_level);
|
||||
|
||||
if (level == 0)
|
||||
if (level == adev->vm_manager.root_level)
|
||||
/* For the root directory */
|
||||
return round_up(adev->vm_manager.max_pfn, 1 << shift) >> shift;
|
||||
else if (level != adev->vm_manager.num_level)
|
||||
else if (level != AMDGPU_VM_PTB)
|
||||
/* Everything in between */
|
||||
return 512;
|
||||
else
|
||||
@ -329,9 +341,6 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
|
||||
to >= amdgpu_vm_num_entries(adev, level))
|
||||
return -EINVAL;
|
||||
|
||||
if (to > parent->last_entry_used)
|
||||
parent->last_entry_used = to;
|
||||
|
||||
++level;
|
||||
saddr = saddr & ((1 << shift) - 1);
|
||||
eaddr = eaddr & ((1 << shift) - 1);
|
||||
@ -346,7 +355,7 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
|
||||
|
||||
if (vm->pte_support_ats) {
|
||||
init_value = AMDGPU_PTE_DEFAULT_ATC;
|
||||
if (level != adev->vm_manager.num_level - 1)
|
||||
if (level != AMDGPU_VM_PTB)
|
||||
init_value |= AMDGPU_PDE_PTE;
|
||||
|
||||
}
|
||||
@ -386,10 +395,9 @@ static int amdgpu_vm_alloc_levels(struct amdgpu_device *adev,
|
||||
spin_lock(&vm->status_lock);
|
||||
list_add(&entry->base.vm_status, &vm->relocated);
|
||||
spin_unlock(&vm->status_lock);
|
||||
entry->addr = 0;
|
||||
}
|
||||
|
||||
if (level < adev->vm_manager.num_level) {
|
||||
if (level < AMDGPU_VM_PTB) {
|
||||
uint64_t sub_saddr = (pt_idx == from) ? saddr : 0;
|
||||
uint64_t sub_eaddr = (pt_idx == to) ? eaddr :
|
||||
((1 << shift) - 1);
|
||||
@ -435,7 +443,8 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,
|
||||
saddr /= AMDGPU_GPU_PAGE_SIZE;
|
||||
eaddr /= AMDGPU_GPU_PAGE_SIZE;
|
||||
|
||||
return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr, 0);
|
||||
return amdgpu_vm_alloc_levels(adev, vm, &vm->root, saddr, eaddr,
|
||||
adev->vm_manager.root_level);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -732,7 +741,7 @@ void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev)
|
||||
|
||||
has_compute_vm_bug = false;
|
||||
|
||||
ip_block = amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX);
|
||||
ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX);
|
||||
if (ip_block) {
|
||||
/* Compute has a VM bug for GFX version < 7.
|
||||
Compute has a VM bug for GFX 8 MEC firmware version < 673.*/
|
||||
@ -1060,162 +1069,52 @@ static int amdgpu_vm_wait_pd(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
}
|
||||
|
||||
/*
|
||||
* amdgpu_vm_update_level - update a single level in the hierarchy
|
||||
* amdgpu_vm_update_pde - update a single level in the hierarchy
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @param: parameters for the update
|
||||
* @vm: requested vm
|
||||
* @parent: parent directory
|
||||
* @entry: entry to update
|
||||
*
|
||||
* Makes sure all entries in @parent are up to date.
|
||||
* Returns 0 for success, error for failure.
|
||||
* Makes sure the requested entry in parent is up to date.
|
||||
*/
|
||||
static int amdgpu_vm_update_level(struct amdgpu_device *adev,
|
||||
struct amdgpu_vm *vm,
|
||||
struct amdgpu_vm_pt *parent)
|
||||
static void amdgpu_vm_update_pde(struct amdgpu_pte_update_params *params,
|
||||
struct amdgpu_vm *vm,
|
||||
struct amdgpu_vm_pt *parent,
|
||||
struct amdgpu_vm_pt *entry)
|
||||
{
|
||||
struct amdgpu_bo *shadow;
|
||||
struct amdgpu_ring *ring = NULL;
|
||||
struct amdgpu_bo *bo = entry->base.bo, *shadow = NULL, *pbo;
|
||||
uint64_t pd_addr, shadow_addr = 0;
|
||||
uint64_t last_pde = ~0, last_pt = ~0, last_shadow = ~0;
|
||||
unsigned count = 0, pt_idx, ndw = 0;
|
||||
struct amdgpu_job *job;
|
||||
struct amdgpu_pte_update_params params;
|
||||
struct dma_fence *fence = NULL;
|
||||
uint32_t incr;
|
||||
uint64_t pde, pt, flags;
|
||||
unsigned level;
|
||||
|
||||
int r;
|
||||
|
||||
if (!parent->entries)
|
||||
return 0;
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
params.adev = adev;
|
||||
shadow = parent->base.bo->shadow;
|
||||
/* Don't update huge pages here */
|
||||
if (entry->huge)
|
||||
return;
|
||||
|
||||
if (vm->use_cpu_for_update) {
|
||||
pd_addr = (unsigned long)amdgpu_bo_kptr(parent->base.bo);
|
||||
r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM);
|
||||
if (unlikely(r))
|
||||
return r;
|
||||
|
||||
params.func = amdgpu_vm_cpu_set_ptes;
|
||||
} else {
|
||||
ring = container_of(vm->entity.sched, struct amdgpu_ring,
|
||||
sched);
|
||||
|
||||
/* padding, etc. */
|
||||
ndw = 64;
|
||||
|
||||
/* assume the worst case */
|
||||
ndw += parent->last_entry_used * 6;
|
||||
|
||||
pd_addr = amdgpu_bo_gpu_offset(parent->base.bo);
|
||||
|
||||
if (shadow) {
|
||||
shadow = parent->base.bo->shadow;
|
||||
if (shadow)
|
||||
shadow_addr = amdgpu_bo_gpu_offset(shadow);
|
||||
ndw *= 2;
|
||||
} else {
|
||||
shadow_addr = 0;
|
||||
}
|
||||
|
||||
r = amdgpu_job_alloc_with_ib(adev, ndw * 4, &job);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
params.ib = &job->ibs[0];
|
||||
params.func = amdgpu_vm_do_set_ptes;
|
||||
}
|
||||
|
||||
for (level = 0, pbo = parent->base.bo->parent; pbo; ++level)
|
||||
pbo = pbo->parent;
|
||||
|
||||
/* walk over the address space and update the directory */
|
||||
for (pt_idx = 0; pt_idx <= parent->last_entry_used; ++pt_idx) {
|
||||
struct amdgpu_vm_pt *entry = &parent->entries[pt_idx];
|
||||
struct amdgpu_bo *bo = entry->base.bo;
|
||||
uint64_t pde, pt;
|
||||
|
||||
if (bo == NULL)
|
||||
continue;
|
||||
|
||||
spin_lock(&vm->status_lock);
|
||||
list_del_init(&entry->base.vm_status);
|
||||
spin_unlock(&vm->status_lock);
|
||||
|
||||
pt = amdgpu_bo_gpu_offset(bo);
|
||||
pt = amdgpu_gart_get_vm_pde(adev, pt);
|
||||
/* Don't update huge pages here */
|
||||
if ((parent->entries[pt_idx].addr & AMDGPU_PDE_PTE) ||
|
||||
parent->entries[pt_idx].addr == (pt | AMDGPU_PTE_VALID))
|
||||
continue;
|
||||
|
||||
parent->entries[pt_idx].addr = pt | AMDGPU_PTE_VALID;
|
||||
|
||||
pde = pd_addr + pt_idx * 8;
|
||||
incr = amdgpu_bo_size(bo);
|
||||
if (((last_pde + 8 * count) != pde) ||
|
||||
((last_pt + incr * count) != pt) ||
|
||||
(count == AMDGPU_VM_MAX_UPDATE_SIZE)) {
|
||||
|
||||
if (count) {
|
||||
if (shadow)
|
||||
params.func(¶ms,
|
||||
last_shadow,
|
||||
last_pt, count,
|
||||
incr,
|
||||
AMDGPU_PTE_VALID);
|
||||
|
||||
params.func(¶ms, last_pde,
|
||||
last_pt, count, incr,
|
||||
AMDGPU_PTE_VALID);
|
||||
}
|
||||
|
||||
count = 1;
|
||||
last_pde = pde;
|
||||
last_shadow = shadow_addr + pt_idx * 8;
|
||||
last_pt = pt;
|
||||
} else {
|
||||
++count;
|
||||
}
|
||||
level += params->adev->vm_manager.root_level;
|
||||
pt = amdgpu_bo_gpu_offset(bo);
|
||||
flags = AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(params->adev, level, &pt, &flags);
|
||||
if (shadow) {
|
||||
pde = shadow_addr + (entry - parent->entries) * 8;
|
||||
params->func(params, pde, pt, 1, 0, flags);
|
||||
}
|
||||
|
||||
if (count) {
|
||||
if (vm->root.base.bo->shadow)
|
||||
params.func(¶ms, last_shadow, last_pt,
|
||||
count, incr, AMDGPU_PTE_VALID);
|
||||
|
||||
params.func(¶ms, last_pde, last_pt,
|
||||
count, incr, AMDGPU_PTE_VALID);
|
||||
}
|
||||
|
||||
if (!vm->use_cpu_for_update) {
|
||||
if (params.ib->length_dw == 0) {
|
||||
amdgpu_job_free(job);
|
||||
} else {
|
||||
amdgpu_ring_pad_ib(ring, params.ib);
|
||||
amdgpu_sync_resv(adev, &job->sync,
|
||||
parent->base.bo->tbo.resv,
|
||||
AMDGPU_FENCE_OWNER_VM, false);
|
||||
if (shadow)
|
||||
amdgpu_sync_resv(adev, &job->sync,
|
||||
shadow->tbo.resv,
|
||||
AMDGPU_FENCE_OWNER_VM, false);
|
||||
|
||||
WARN_ON(params.ib->length_dw > ndw);
|
||||
r = amdgpu_job_submit(job, ring, &vm->entity,
|
||||
AMDGPU_FENCE_OWNER_VM, &fence);
|
||||
if (r)
|
||||
goto error_free;
|
||||
|
||||
amdgpu_bo_fence(parent->base.bo, fence, true);
|
||||
dma_fence_put(vm->last_update);
|
||||
vm->last_update = fence;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error_free:
|
||||
amdgpu_job_free(job);
|
||||
return r;
|
||||
pde = pd_addr + (entry - parent->entries) * 8;
|
||||
params->func(params, pde, pt, 1, 0, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1225,27 +1124,29 @@ error_free:
|
||||
*
|
||||
* Mark all PD level as invalid after an error.
|
||||
*/
|
||||
static void amdgpu_vm_invalidate_level(struct amdgpu_vm *vm,
|
||||
struct amdgpu_vm_pt *parent)
|
||||
static void amdgpu_vm_invalidate_level(struct amdgpu_device *adev,
|
||||
struct amdgpu_vm *vm,
|
||||
struct amdgpu_vm_pt *parent,
|
||||
unsigned level)
|
||||
{
|
||||
unsigned pt_idx;
|
||||
unsigned pt_idx, num_entries;
|
||||
|
||||
/*
|
||||
* Recurse into the subdirectories. This recursion is harmless because
|
||||
* we only have a maximum of 5 layers.
|
||||
*/
|
||||
for (pt_idx = 0; pt_idx <= parent->last_entry_used; ++pt_idx) {
|
||||
num_entries = amdgpu_vm_num_entries(adev, level);
|
||||
for (pt_idx = 0; pt_idx < num_entries; ++pt_idx) {
|
||||
struct amdgpu_vm_pt *entry = &parent->entries[pt_idx];
|
||||
|
||||
if (!entry->base.bo)
|
||||
continue;
|
||||
|
||||
entry->addr = ~0ULL;
|
||||
spin_lock(&vm->status_lock);
|
||||
if (list_empty(&entry->base.vm_status))
|
||||
list_add(&entry->base.vm_status, &vm->relocated);
|
||||
spin_unlock(&vm->status_lock);
|
||||
amdgpu_vm_invalidate_level(vm, entry);
|
||||
amdgpu_vm_invalidate_level(adev, vm, entry, level + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1261,38 +1162,63 @@ static void amdgpu_vm_invalidate_level(struct amdgpu_vm *vm,
|
||||
int amdgpu_vm_update_directories(struct amdgpu_device *adev,
|
||||
struct amdgpu_vm *vm)
|
||||
{
|
||||
struct amdgpu_pte_update_params params;
|
||||
struct amdgpu_job *job;
|
||||
unsigned ndw = 0;
|
||||
int r = 0;
|
||||
|
||||
if (list_empty(&vm->relocated))
|
||||
return 0;
|
||||
|
||||
restart:
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
params.adev = adev;
|
||||
|
||||
if (vm->use_cpu_for_update) {
|
||||
r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM);
|
||||
if (unlikely(r))
|
||||
return r;
|
||||
|
||||
params.func = amdgpu_vm_cpu_set_ptes;
|
||||
} else {
|
||||
ndw = 512 * 8;
|
||||
r = amdgpu_job_alloc_with_ib(adev, ndw * 4, &job);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
params.ib = &job->ibs[0];
|
||||
params.func = amdgpu_vm_do_set_ptes;
|
||||
}
|
||||
|
||||
spin_lock(&vm->status_lock);
|
||||
while (!list_empty(&vm->relocated)) {
|
||||
struct amdgpu_vm_bo_base *bo_base;
|
||||
struct amdgpu_vm_bo_base *bo_base, *parent;
|
||||
struct amdgpu_vm_pt *pt, *entry;
|
||||
struct amdgpu_bo *bo;
|
||||
|
||||
bo_base = list_first_entry(&vm->relocated,
|
||||
struct amdgpu_vm_bo_base,
|
||||
vm_status);
|
||||
list_del_init(&bo_base->vm_status);
|
||||
spin_unlock(&vm->status_lock);
|
||||
|
||||
bo = bo_base->bo->parent;
|
||||
if (bo) {
|
||||
struct amdgpu_vm_bo_base *parent;
|
||||
struct amdgpu_vm_pt *pt;
|
||||
|
||||
parent = list_first_entry(&bo->va,
|
||||
struct amdgpu_vm_bo_base,
|
||||
bo_list);
|
||||
pt = container_of(parent, struct amdgpu_vm_pt, base);
|
||||
|
||||
r = amdgpu_vm_update_level(adev, vm, pt);
|
||||
if (r) {
|
||||
amdgpu_vm_invalidate_level(vm, &vm->root);
|
||||
return r;
|
||||
}
|
||||
if (!bo) {
|
||||
spin_lock(&vm->status_lock);
|
||||
} else {
|
||||
spin_lock(&vm->status_lock);
|
||||
list_del_init(&bo_base->vm_status);
|
||||
continue;
|
||||
}
|
||||
|
||||
parent = list_first_entry(&bo->va, struct amdgpu_vm_bo_base,
|
||||
bo_list);
|
||||
pt = container_of(parent, struct amdgpu_vm_pt, base);
|
||||
entry = container_of(bo_base, struct amdgpu_vm_pt, base);
|
||||
|
||||
amdgpu_vm_update_pde(¶ms, vm, pt, entry);
|
||||
|
||||
spin_lock(&vm->status_lock);
|
||||
if (!vm->use_cpu_for_update &&
|
||||
(ndw - params.ib->length_dw) < 32)
|
||||
break;
|
||||
}
|
||||
spin_unlock(&vm->status_lock);
|
||||
|
||||
@ -1300,8 +1226,44 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev,
|
||||
/* Flush HDP */
|
||||
mb();
|
||||
amdgpu_gart_flush_gpu_tlb(adev, 0);
|
||||
} else if (params.ib->length_dw == 0) {
|
||||
amdgpu_job_free(job);
|
||||
} else {
|
||||
struct amdgpu_bo *root = vm->root.base.bo;
|
||||
struct amdgpu_ring *ring;
|
||||
struct dma_fence *fence;
|
||||
|
||||
ring = container_of(vm->entity.sched, struct amdgpu_ring,
|
||||
sched);
|
||||
|
||||
amdgpu_ring_pad_ib(ring, params.ib);
|
||||
amdgpu_sync_resv(adev, &job->sync, root->tbo.resv,
|
||||
AMDGPU_FENCE_OWNER_VM, false);
|
||||
if (root->shadow)
|
||||
amdgpu_sync_resv(adev, &job->sync,
|
||||
root->shadow->tbo.resv,
|
||||
AMDGPU_FENCE_OWNER_VM, false);
|
||||
|
||||
WARN_ON(params.ib->length_dw > ndw);
|
||||
r = amdgpu_job_submit(job, ring, &vm->entity,
|
||||
AMDGPU_FENCE_OWNER_VM, &fence);
|
||||
if (r)
|
||||
goto error;
|
||||
|
||||
amdgpu_bo_fence(root, fence, true);
|
||||
dma_fence_put(vm->last_update);
|
||||
vm->last_update = fence;
|
||||
}
|
||||
|
||||
if (!list_empty(&vm->relocated))
|
||||
goto restart;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
amdgpu_vm_invalidate_level(adev, vm, &vm->root,
|
||||
adev->vm_manager.root_level);
|
||||
amdgpu_job_free(job);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -1319,19 +1281,19 @@ void amdgpu_vm_get_entry(struct amdgpu_pte_update_params *p, uint64_t addr,
|
||||
struct amdgpu_vm_pt **entry,
|
||||
struct amdgpu_vm_pt **parent)
|
||||
{
|
||||
unsigned level = 0;
|
||||
unsigned level = p->adev->vm_manager.root_level;
|
||||
|
||||
*parent = NULL;
|
||||
*entry = &p->vm->root;
|
||||
while ((*entry)->entries) {
|
||||
unsigned idx = addr >> amdgpu_vm_level_shift(p->adev, level++);
|
||||
unsigned shift = amdgpu_vm_level_shift(p->adev, level++);
|
||||
|
||||
idx %= amdgpu_bo_size((*entry)->base.bo) / 8;
|
||||
*parent = *entry;
|
||||
*entry = &(*entry)->entries[idx];
|
||||
*entry = &(*entry)->entries[addr >> shift];
|
||||
addr &= (1ULL << shift) - 1;
|
||||
}
|
||||
|
||||
if (level != p->adev->vm_manager.num_level)
|
||||
if (level != AMDGPU_VM_PTB)
|
||||
*entry = NULL;
|
||||
}
|
||||
|
||||
@ -1363,17 +1325,18 @@ static void amdgpu_vm_handle_huge_pages(struct amdgpu_pte_update_params *p,
|
||||
!(flags & AMDGPU_PTE_VALID)) {
|
||||
|
||||
dst = amdgpu_bo_gpu_offset(entry->base.bo);
|
||||
dst = amdgpu_gart_get_vm_pde(p->adev, dst);
|
||||
flags = AMDGPU_PTE_VALID;
|
||||
} else {
|
||||
/* Set the huge page flag to stop scanning at this PDE */
|
||||
flags |= AMDGPU_PDE_PTE;
|
||||
}
|
||||
|
||||
if (entry->addr == (dst | flags))
|
||||
if (!entry->huge && !(flags & AMDGPU_PDE_PTE))
|
||||
return;
|
||||
entry->huge = !!(flags & AMDGPU_PDE_PTE);
|
||||
|
||||
entry->addr = (dst | flags);
|
||||
amdgpu_gart_get_vm_pde(p->adev, AMDGPU_VM_PDB0,
|
||||
&dst, &flags);
|
||||
|
||||
if (use_cpu_update) {
|
||||
/* In case a huge page is replaced with a system
|
||||
@ -1447,7 +1410,7 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
|
||||
amdgpu_vm_handle_huge_pages(params, entry, parent,
|
||||
nptes, dst, flags);
|
||||
/* We don't need to update PTEs for huge pages */
|
||||
if (entry->addr & AMDGPU_PDE_PTE)
|
||||
if (entry->huge)
|
||||
continue;
|
||||
|
||||
pt = entry->base.bo;
|
||||
@ -1688,7 +1651,8 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
|
||||
|
||||
error_free:
|
||||
amdgpu_job_free(job);
|
||||
amdgpu_vm_invalidate_level(vm, &vm->root);
|
||||
amdgpu_vm_invalidate_level(adev, vm, &vm->root,
|
||||
adev->vm_manager.root_level);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -2604,7 +2568,19 @@ void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
|
||||
tmp >>= amdgpu_vm_block_size - 9;
|
||||
tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1;
|
||||
adev->vm_manager.num_level = min(max_level, (unsigned)tmp);
|
||||
|
||||
switch (adev->vm_manager.num_level) {
|
||||
case 3:
|
||||
adev->vm_manager.root_level = AMDGPU_VM_PDB2;
|
||||
break;
|
||||
case 2:
|
||||
adev->vm_manager.root_level = AMDGPU_VM_PDB1;
|
||||
break;
|
||||
case 1:
|
||||
adev->vm_manager.root_level = AMDGPU_VM_PDB0;
|
||||
break;
|
||||
default:
|
||||
dev_err(adev->dev, "VMPT only supports 2~4+1 levels\n");
|
||||
}
|
||||
/* block size depends on vm size and hw setup*/
|
||||
if (amdgpu_vm_block_size != -1)
|
||||
adev->vm_manager.block_size =
|
||||
@ -2643,7 +2619,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
AMDGPU_VM_PTE_COUNT(adev) * 8);
|
||||
unsigned ring_instance;
|
||||
struct amdgpu_ring *ring;
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
int r, i;
|
||||
u64 flags;
|
||||
uint64_t init_pde_value = 0;
|
||||
@ -2663,8 +2639,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
ring_instance = atomic_inc_return(&adev->vm_manager.vm_pte_next_ring);
|
||||
ring_instance %= adev->vm_manager.vm_pte_num_rings;
|
||||
ring = adev->vm_manager.vm_pte_rings[ring_instance];
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_KERNEL];
|
||||
r = amd_sched_entity_init(&ring->sched, &vm->entity,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_KERNEL];
|
||||
r = drm_sched_entity_init(&ring->sched, &vm->entity,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r)
|
||||
return r;
|
||||
@ -2698,7 +2674,9 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
||||
flags |= (AMDGPU_GEM_CREATE_NO_CPU_ACCESS |
|
||||
AMDGPU_GEM_CREATE_SHADOW);
|
||||
|
||||
r = amdgpu_bo_create(adev, amdgpu_vm_bo_size(adev, 0), align, true,
|
||||
r = amdgpu_bo_create(adev,
|
||||
amdgpu_vm_bo_size(adev, adev->vm_manager.root_level),
|
||||
align, true,
|
||||
AMDGPU_GEM_DOMAIN_VRAM,
|
||||
flags,
|
||||
NULL, NULL, init_pde_value, &vm->root.base.bo);
|
||||
@ -2744,7 +2722,7 @@ error_free_root:
|
||||
vm->root.base.bo = NULL;
|
||||
|
||||
error_free_sched_entity:
|
||||
amd_sched_entity_fini(&ring->sched, &vm->entity);
|
||||
drm_sched_entity_fini(&ring->sched, &vm->entity);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -2752,26 +2730,31 @@ error_free_sched_entity:
|
||||
/**
|
||||
* amdgpu_vm_free_levels - free PD/PT levels
|
||||
*
|
||||
* @level: PD/PT starting level to free
|
||||
* @adev: amdgpu device structure
|
||||
* @parent: PD/PT starting level to free
|
||||
* @level: level of parent structure
|
||||
*
|
||||
* Free the page directory or page table level and all sub levels.
|
||||
*/
|
||||
static void amdgpu_vm_free_levels(struct amdgpu_vm_pt *level)
|
||||
static void amdgpu_vm_free_levels(struct amdgpu_device *adev,
|
||||
struct amdgpu_vm_pt *parent,
|
||||
unsigned level)
|
||||
{
|
||||
unsigned i;
|
||||
unsigned i, num_entries = amdgpu_vm_num_entries(adev, level);
|
||||
|
||||
if (level->base.bo) {
|
||||
list_del(&level->base.bo_list);
|
||||
list_del(&level->base.vm_status);
|
||||
amdgpu_bo_unref(&level->base.bo->shadow);
|
||||
amdgpu_bo_unref(&level->base.bo);
|
||||
if (parent->base.bo) {
|
||||
list_del(&parent->base.bo_list);
|
||||
list_del(&parent->base.vm_status);
|
||||
amdgpu_bo_unref(&parent->base.bo->shadow);
|
||||
amdgpu_bo_unref(&parent->base.bo);
|
||||
}
|
||||
|
||||
if (level->entries)
|
||||
for (i = 0; i <= level->last_entry_used; i++)
|
||||
amdgpu_vm_free_levels(&level->entries[i]);
|
||||
if (parent->entries)
|
||||
for (i = 0; i < num_entries; i++)
|
||||
amdgpu_vm_free_levels(adev, &parent->entries[i],
|
||||
level + 1);
|
||||
|
||||
kvfree(level->entries);
|
||||
kvfree(parent->entries);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2803,7 +2786,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
||||
spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags);
|
||||
}
|
||||
|
||||
amd_sched_entity_fini(vm->entity.sched, &vm->entity);
|
||||
drm_sched_entity_fini(vm->entity.sched, &vm->entity);
|
||||
|
||||
if (!RB_EMPTY_ROOT(&vm->va.rb_root)) {
|
||||
dev_err(adev->dev, "still active bo inside vm\n");
|
||||
@ -2829,7 +2812,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Leaking page tables because BO reservation failed\n");
|
||||
} else {
|
||||
amdgpu_vm_free_levels(&vm->root);
|
||||
amdgpu_vm_free_levels(adev, &vm->root,
|
||||
adev->vm_manager.root_level);
|
||||
amdgpu_bo_unreserve(root);
|
||||
}
|
||||
amdgpu_bo_unref(&root);
|
||||
|
@ -24,10 +24,11 @@
|
||||
#ifndef __AMDGPU_VM_H__
|
||||
#define __AMDGPU_VM_H__
|
||||
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/kfifo.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <drm/gpu_scheduler.h>
|
||||
|
||||
#include "gpu_scheduler.h"
|
||||
#include "amdgpu_sync.h"
|
||||
#include "amdgpu_ring.h"
|
||||
|
||||
@ -69,6 +70,12 @@ struct amdgpu_bo_list_entry;
|
||||
/* PDE is handled as PTE for VEGA10 */
|
||||
#define AMDGPU_PDE_PTE (1ULL << 54)
|
||||
|
||||
/* PTE is handled as PDE for VEGA10 (Translate Further) */
|
||||
#define AMDGPU_PTE_TF (1ULL << 56)
|
||||
|
||||
/* PDE Block Fragment Size for VEGA10 */
|
||||
#define AMDGPU_PDE_BFS(a) ((uint64_t)a << 59)
|
||||
|
||||
/* VEGA10 only */
|
||||
#define AMDGPU_PTE_MTYPE(a) ((uint64_t)a << 57)
|
||||
#define AMDGPU_PTE_MTYPE_MASK AMDGPU_PTE_MTYPE(3ULL)
|
||||
@ -119,6 +126,16 @@ struct amdgpu_bo_list_entry;
|
||||
#define AMDGPU_VM_USE_CPU_FOR_GFX (1 << 0)
|
||||
#define AMDGPU_VM_USE_CPU_FOR_COMPUTE (1 << 1)
|
||||
|
||||
/* VMPT level enumerate, and the hiberachy is:
|
||||
* PDB2->PDB1->PDB0->PTB
|
||||
*/
|
||||
enum amdgpu_vm_level {
|
||||
AMDGPU_VM_PDB2,
|
||||
AMDGPU_VM_PDB1,
|
||||
AMDGPU_VM_PDB0,
|
||||
AMDGPU_VM_PTB
|
||||
};
|
||||
|
||||
/* base structure for tracking BO usage in a VM */
|
||||
struct amdgpu_vm_bo_base {
|
||||
/* constant after initialization */
|
||||
@ -137,11 +154,10 @@ struct amdgpu_vm_bo_base {
|
||||
|
||||
struct amdgpu_vm_pt {
|
||||
struct amdgpu_vm_bo_base base;
|
||||
uint64_t addr;
|
||||
bool huge;
|
||||
|
||||
/* array of page tables, one for each directory entry */
|
||||
struct amdgpu_vm_pt *entries;
|
||||
unsigned last_entry_used;
|
||||
};
|
||||
|
||||
#define AMDGPU_VM_FAULT(pasid, addr) (((u64)(pasid) << 48) | (addr))
|
||||
@ -175,7 +191,7 @@ struct amdgpu_vm {
|
||||
spinlock_t freed_lock;
|
||||
|
||||
/* Scheduler entity for page table updates */
|
||||
struct amd_sched_entity entity;
|
||||
struct drm_sched_entity entity;
|
||||
|
||||
/* client id and PASID (TODO: replace client_id with PASID) */
|
||||
u64 client_id;
|
||||
@ -236,6 +252,7 @@ struct amdgpu_vm_manager {
|
||||
uint32_t num_level;
|
||||
uint32_t block_size;
|
||||
uint32_t fragment_size;
|
||||
enum amdgpu_vm_level root_level;
|
||||
/* vram base address for page table entry */
|
||||
u64 vram_base_offset;
|
||||
/* vm pte handling */
|
||||
|
@ -891,12 +891,12 @@ static void ci_dpm_powergate_uvd(void *handle, bool gate)
|
||||
|
||||
if (gate) {
|
||||
/* stop the UVD block */
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_GATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_GATE);
|
||||
ci_update_uvd_dpm(adev, gate);
|
||||
} else {
|
||||
amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
ci_update_uvd_dpm(adev, gate);
|
||||
}
|
||||
}
|
||||
|
@ -755,74 +755,74 @@ static void cik_init_golden_registers(struct amdgpu_device *adev)
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_BONAIRE:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
bonaire_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(bonaire_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
bonaire_golden_registers,
|
||||
ARRAY_SIZE(bonaire_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
bonaire_golden_common_registers,
|
||||
ARRAY_SIZE(bonaire_golden_common_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
bonaire_golden_spm_registers,
|
||||
ARRAY_SIZE(bonaire_golden_spm_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
bonaire_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(bonaire_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
bonaire_golden_registers,
|
||||
ARRAY_SIZE(bonaire_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
bonaire_golden_common_registers,
|
||||
ARRAY_SIZE(bonaire_golden_common_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
bonaire_golden_spm_registers,
|
||||
ARRAY_SIZE(bonaire_golden_spm_registers));
|
||||
break;
|
||||
case CHIP_KABINI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(kalindi_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_golden_registers,
|
||||
ARRAY_SIZE(kalindi_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_golden_common_registers,
|
||||
ARRAY_SIZE(kalindi_golden_common_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_golden_spm_registers,
|
||||
ARRAY_SIZE(kalindi_golden_spm_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(kalindi_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_golden_registers,
|
||||
ARRAY_SIZE(kalindi_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_golden_common_registers,
|
||||
ARRAY_SIZE(kalindi_golden_common_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_golden_spm_registers,
|
||||
ARRAY_SIZE(kalindi_golden_spm_registers));
|
||||
break;
|
||||
case CHIP_MULLINS:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(kalindi_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
godavari_golden_registers,
|
||||
ARRAY_SIZE(godavari_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_golden_common_registers,
|
||||
ARRAY_SIZE(kalindi_golden_common_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
kalindi_golden_spm_registers,
|
||||
ARRAY_SIZE(kalindi_golden_spm_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(kalindi_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
godavari_golden_registers,
|
||||
ARRAY_SIZE(godavari_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_golden_common_registers,
|
||||
ARRAY_SIZE(kalindi_golden_common_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
kalindi_golden_spm_registers,
|
||||
ARRAY_SIZE(kalindi_golden_spm_registers));
|
||||
break;
|
||||
case CHIP_KAVERI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
spectre_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(spectre_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
spectre_golden_registers,
|
||||
ARRAY_SIZE(spectre_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
spectre_golden_common_registers,
|
||||
ARRAY_SIZE(spectre_golden_common_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
spectre_golden_spm_registers,
|
||||
ARRAY_SIZE(spectre_golden_spm_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
spectre_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(spectre_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
spectre_golden_registers,
|
||||
ARRAY_SIZE(spectre_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
spectre_golden_common_registers,
|
||||
ARRAY_SIZE(spectre_golden_common_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
spectre_golden_spm_registers,
|
||||
ARRAY_SIZE(spectre_golden_spm_registers));
|
||||
break;
|
||||
case CHIP_HAWAII:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hawaii_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(hawaii_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hawaii_golden_registers,
|
||||
ARRAY_SIZE(hawaii_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hawaii_golden_common_registers,
|
||||
ARRAY_SIZE(hawaii_golden_common_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hawaii_golden_spm_registers,
|
||||
ARRAY_SIZE(hawaii_golden_spm_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hawaii_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(hawaii_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hawaii_golden_registers,
|
||||
ARRAY_SIZE(hawaii_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hawaii_golden_common_registers,
|
||||
ARRAY_SIZE(hawaii_golden_common_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hawaii_golden_spm_registers,
|
||||
ARRAY_SIZE(hawaii_golden_spm_registers));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1246,7 +1246,7 @@ static int cik_gpu_pci_config_reset(struct amdgpu_device *adev)
|
||||
/* disable BM */
|
||||
pci_clear_master(adev->pdev);
|
||||
/* reset */
|
||||
amdgpu_pci_config_reset(adev);
|
||||
amdgpu_device_pci_config_reset(adev);
|
||||
|
||||
udelay(100);
|
||||
|
||||
@ -1866,7 +1866,7 @@ static int cik_common_early_init(void *handle)
|
||||
|
||||
adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
|
||||
|
||||
amdgpu_get_pcie_info(adev);
|
||||
amdgpu_device_get_pcie_info(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1974,77 +1974,77 @@ int cik_set_ip_blocks(struct amdgpu_device *adev)
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_BONAIRE:
|
||||
amdgpu_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v8_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v8_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
break;
|
||||
case CHIP_HAWAII:
|
||||
amdgpu_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v8_5_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v8_5_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v7_3_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
break;
|
||||
case CHIP_KAVERI:
|
||||
amdgpu_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v8_1_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v7_1_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v8_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v7_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
break;
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
amdgpu_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v8_3_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v8_3_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v7_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cik_sdma_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v4_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v2_0_ip_block);
|
||||
break;
|
||||
default:
|
||||
/* FIXME: not supported yet */
|
||||
|
@ -626,7 +626,7 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
|
||||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -639,7 +639,7 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
|
||||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
|
||||
@ -663,7 +663,7 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
|
||||
ring->idx, tmp);
|
||||
r = -EINVAL;
|
||||
}
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -686,7 +686,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -735,7 +735,7 @@ err1:
|
||||
amdgpu_ib_free(adev, &ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ static const unsigned int gfx9_SECT_CONTEXT_def_1[] =
|
||||
0x00000000, // DB_STENCIL_WRITE_BASE
|
||||
0x00000000, // DB_STENCIL_WRITE_BASE_HI
|
||||
0x00000000, // DB_DFSM_CONTROL
|
||||
0x00000000, // DB_RENDER_FILTER
|
||||
0, // HOLE
|
||||
0x00000000, // DB_Z_INFO2
|
||||
0x00000000, // DB_STENCIL_INFO2
|
||||
0, // HOLE
|
||||
@ -259,8 +259,8 @@ static const unsigned int gfx9_SECT_CONTEXT_def_2[] =
|
||||
0x00000000, // PA_SC_RIGHT_VERT_GRID
|
||||
0x00000000, // PA_SC_LEFT_VERT_GRID
|
||||
0x00000000, // PA_SC_HORIZ_GRID
|
||||
0x00000000, // PA_SC_FOV_WINDOW_LR
|
||||
0x00000000, // PA_SC_FOV_WINDOW_TB
|
||||
0, // HOLE
|
||||
0, // HOLE
|
||||
0, // HOLE
|
||||
0, // HOLE
|
||||
0, // HOLE
|
||||
@ -701,7 +701,7 @@ static const unsigned int gfx9_SECT_CONTEXT_def_7[] =
|
||||
{
|
||||
0x00000000, // VGT_GS_MAX_PRIMS_PER_SUBGROUP
|
||||
0x00000000, // VGT_DRAW_PAYLOAD_CNTL
|
||||
0x00000000, // VGT_INDEX_PAYLOAD_CNTL
|
||||
0, // HOLE
|
||||
0x00000000, // VGT_INSTANCE_STEP_RATE_0
|
||||
0x00000000, // VGT_INSTANCE_STEP_RATE_1
|
||||
0, // HOLE
|
||||
|
@ -145,20 +145,20 @@ static void dce_v10_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_FIJI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -154,28 +154,28 @@ static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_CARRIZO:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_golden_settings_a11,
|
||||
ARRAY_SIZE(cz_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_golden_settings_a11,
|
||||
ARRAY_SIZE(cz_golden_settings_a11));
|
||||
break;
|
||||
case CHIP_STONEY:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_golden_settings_a11,
|
||||
ARRAY_SIZE(stoney_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_golden_settings_a11,
|
||||
ARRAY_SIZE(stoney_golden_settings_a11));
|
||||
break;
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
polaris11_golden_settings_a11,
|
||||
ARRAY_SIZE(polaris11_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
polaris11_golden_settings_a11,
|
||||
ARRAY_SIZE(polaris11_golden_settings_a11));
|
||||
break;
|
||||
case CHIP_POLARIS10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
polaris10_golden_settings_a11,
|
||||
ARRAY_SIZE(polaris10_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
polaris10_golden_settings_a11,
|
||||
ARRAY_SIZE(polaris10_golden_settings_a11));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -679,55 +679,55 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TOPAZ:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_iceland_a11,
|
||||
ARRAY_SIZE(golden_settings_iceland_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
iceland_golden_common_all,
|
||||
ARRAY_SIZE(iceland_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_iceland_a11,
|
||||
ARRAY_SIZE(golden_settings_iceland_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
iceland_golden_common_all,
|
||||
ARRAY_SIZE(iceland_golden_common_all));
|
||||
break;
|
||||
case CHIP_FIJI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
fiji_golden_common_all,
|
||||
ARRAY_SIZE(fiji_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
fiji_golden_common_all,
|
||||
ARRAY_SIZE(fiji_golden_common_all));
|
||||
break;
|
||||
|
||||
case CHIP_TONGA:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tonga_golden_common_all,
|
||||
ARRAY_SIZE(tonga_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tonga_golden_common_all,
|
||||
ARRAY_SIZE(tonga_golden_common_all));
|
||||
break;
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_polaris11_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris11_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
polaris11_golden_common_all,
|
||||
ARRAY_SIZE(polaris11_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_polaris11_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris11_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
polaris11_golden_common_all,
|
||||
ARRAY_SIZE(polaris11_golden_common_all));
|
||||
break;
|
||||
case CHIP_POLARIS10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_polaris10_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris10_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
polaris10_golden_common_all,
|
||||
ARRAY_SIZE(polaris10_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_polaris10_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris10_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
polaris10_golden_common_all,
|
||||
ARRAY_SIZE(polaris10_golden_common_all));
|
||||
WREG32_SMC(ixCG_ACLK_CNTL, 0x0000001C);
|
||||
if (adev->pdev->revision == 0xc7 &&
|
||||
((adev->pdev->subsystem_device == 0xb37 && adev->pdev->subsystem_vendor == 0x1002) ||
|
||||
@ -738,26 +738,26 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
}
|
||||
break;
|
||||
case CHIP_CARRIZO:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_golden_settings_a11,
|
||||
ARRAY_SIZE(cz_golden_settings_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_golden_common_all,
|
||||
ARRAY_SIZE(cz_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_golden_settings_a11,
|
||||
ARRAY_SIZE(cz_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_golden_common_all,
|
||||
ARRAY_SIZE(cz_golden_common_all));
|
||||
break;
|
||||
case CHIP_STONEY:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_golden_settings_a11,
|
||||
ARRAY_SIZE(stoney_golden_settings_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_golden_common_all,
|
||||
ARRAY_SIZE(stoney_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_golden_settings_a11,
|
||||
ARRAY_SIZE(stoney_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_golden_common_all,
|
||||
ARRAY_SIZE(stoney_golden_common_all));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -5062,8 +5062,9 @@ static int gfx_v8_0_hw_fini(void *handle)
|
||||
gfx_v8_0_cp_enable(adev, false);
|
||||
gfx_v8_0_rlc_stop(adev);
|
||||
|
||||
amdgpu_set_powergating_state(adev,
|
||||
AMD_IP_BLOCK_TYPE_GFX, AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev,
|
||||
AMD_IP_BLOCK_TYPE_GFX,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -5480,8 +5481,9 @@ static int gfx_v8_0_late_init(void *handle)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
amdgpu_set_powergating_state(adev,
|
||||
AMD_IP_BLOCK_TYPE_GFX, AMD_PG_STATE_GATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev,
|
||||
AMD_IP_BLOCK_TYPE_GFX,
|
||||
AMD_PG_STATE_GATE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -5492,10 +5494,10 @@ static void gfx_v8_0_enable_gfx_static_mg_power_gating(struct amdgpu_device *ade
|
||||
if ((adev->asic_type == CHIP_POLARIS11) ||
|
||||
(adev->asic_type == CHIP_POLARIS12))
|
||||
/* Send msg to SMU via Powerplay */
|
||||
amdgpu_set_powergating_state(adev,
|
||||
AMD_IP_BLOCK_TYPE_SMC,
|
||||
enable ?
|
||||
AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_ip_set_powergating_state(adev,
|
||||
AMD_IP_BLOCK_TYPE_SMC,
|
||||
enable ?
|
||||
AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE);
|
||||
|
||||
WREG32_FIELD(RLC_PG_CNTL, STATIC_PER_CU_PG_ENABLE, enable ? 1 : 0);
|
||||
}
|
||||
@ -6472,10 +6474,10 @@ static void gfx_v8_0_hqd_set_priority(struct amdgpu_device *adev,
|
||||
mutex_unlock(&adev->srbm_mutex);
|
||||
}
|
||||
static void gfx_v8_0_ring_set_priority_compute(struct amdgpu_ring *ring,
|
||||
enum amd_sched_priority priority)
|
||||
enum drm_sched_priority priority)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
bool acquire = priority == AMD_SCHED_PRIORITY_HIGH_HW;
|
||||
bool acquire = priority == DRM_SCHED_PRIORITY_HIGH_HW;
|
||||
|
||||
if (ring->funcs->type != AMDGPU_RING_TYPE_COMPUTE)
|
||||
return;
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "soc15.h"
|
||||
#include "soc15d.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "gc/gc_9_0_offset.h"
|
||||
#include "gc/gc_9_0_sh_mask.h"
|
||||
#include "vega10_enum.h"
|
||||
@ -65,152 +64,84 @@ MODULE_FIRMWARE("amdgpu/raven_mec.bin");
|
||||
MODULE_FIRMWARE("amdgpu/raven_mec2.bin");
|
||||
MODULE_FIRMWARE("amdgpu/raven_rlc.bin");
|
||||
|
||||
static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] =
|
||||
static const struct soc15_reg_golden golden_settings_gc_9_0[] =
|
||||
{
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID0),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID0) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID1_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID1_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID1),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID1) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID2_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID2_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID2),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID2) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID3_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID3_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID3),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID3) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID4_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID4_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID4),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID4) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID5_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID5_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID5),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID5) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID6_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID6_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID6),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID6) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID7_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID7_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID7),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID7) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID8_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID8_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID8),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID8) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID9_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID9_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID9),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID9) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID10_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID10_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID10),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID10) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID11_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID11_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID11),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID11) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID12_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID12_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID12),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID12)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID13_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID13_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID13),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID13) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID14_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID14_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID14),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID14) },
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGDS_VMID15_BASE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID15_SIZE),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID15),
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID15) }
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_CONFIG_CNTL_1, 0x0000000f, 0x01000107),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0xb5d3f197),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000003ff),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_gc_9_0[] =
|
||||
static const struct soc15_reg_golden golden_settings_gc_9_0_vg10[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(GC, 0, mmCPC_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCPF_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCPG_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmDB_DEBUG2), 0xf00fffff, 0x00000420,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGB_GPU_ID), 0x0000000f, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmIA_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3), 0x00000003, 0x82400024,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_ENHANCE), 0x3fffffff, 0x00000001,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_LINE_STIPPLE_STATE), 0x0000ff0f, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UTCL1_CNTL_0), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UTCL1_CNTL_1), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UTCL1_CNTL_2), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG), 0x00001000, 0x00001000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmSPI_CONFIG_CNTL_1), 0x0000000f, 0x01000107,
|
||||
SOC15_REG_OFFSET(GC, 0, mmSQC_CONFIG), 0x03000000, 0x020a2000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTA_CNTL_AUX), 0xfffffeef, 0x010b0000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTCP_CHAN_STEER_HI), 0xffffffff, 0x4a2c0e68,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTCP_CHAN_STEER_LO), 0xffffffff, 0xb5d3f197,
|
||||
SOC15_REG_OFFSET(GC, 0, mmVGT_CACHE_INVALIDATION), 0x3fff3af3, 0x19200000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmVGT_GS_MAX_WAVE_ID), 0x00000fff, 0x000003ff,
|
||||
SOC15_REG_OFFSET(GC, 0, mmWD_UTCL1_CNTL), 0x08000000, 0x08000080
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0x0000f000, 0x00012107),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x2a114042),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x2a114042),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0x00008000, 0x00048000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x00001800, 0x00000800)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_gc_9_0_vg10[] =
|
||||
static const struct soc15_reg_golden golden_settings_gc_9_1[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(GC, 0, mmCB_HW_CONTROL), 0x0000f000, 0x00012107,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCB_HW_CONTROL_3), 0x30000000, 0x10000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG), 0xffff77ff, 0x2a114042,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG_READ), 0xffff77ff, 0x2a114042,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_ENHANCE_1), 0x00008000, 0x00048000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRMI_UTCL1_CNTL2), 0x00030000, 0x00020000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTD_CNTL), 0x00001800, 0x00000800
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL, 0xfffdf3cf, 0x00014104),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPC_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPF_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCPG_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG2, 0xf00fffff, 0x00000420),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_GPU_ID, 0x0000000f, 0x00000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmIA_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3, 0x00000003, 0x82400024),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE, 0x3fffffff, 0x00000001),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_0, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_1, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_GPM_UTCL1_CNTL_2, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_UTCL1_CNTL, 0x08000000, 0x08000080),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003120),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_CACHE_INVALIDATION, 0x3fff3af3, 0x19200000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmVGT_GS_MAX_WAVE_ID, 0x00000fff, 0x000000ff),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmWD_UTCL1_CNTL, 0x08000000, 0x08000080)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_gc_9_1[] =
|
||||
static const struct soc15_reg_golden golden_settings_gc_9_1_rv1[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(GC, 0, mmCB_HW_CONTROL), 0xfffdf3cf, 0x00014104,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCPC_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCPF_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmCPG_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmDB_DEBUG2), 0xf00fffff, 0x00000420,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGB_GPU_ID), 0x0000000f, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmIA_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_BINNER_EVENT_CNTL_3), 0x00000003, 0x82400024,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_ENHANCE), 0x3fffffff, 0x00000001,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_LINE_STIPPLE_STATE), 0x0000ff0f, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UTCL1_CNTL_0), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UTCL1_CNTL_1), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UTCL1_CNTL_2), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_PREWALKER_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_UTCL1_CNTL), 0x08000000, 0x08000080,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTA_CNTL_AUX), 0xfffffeef, 0x010b0000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTCP_CHAN_STEER_HI), 0xffffffff, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTCP_CHAN_STEER_LO), 0xffffffff, 0x00003120,
|
||||
SOC15_REG_OFFSET(GC, 0, mmVGT_CACHE_INVALIDATION), 0x3fff3af3, 0x19200000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmVGT_GS_MAX_WAVE_ID), 0x00000fff, 0x000000ff,
|
||||
SOC15_REG_OFFSET(GC, 0, mmWD_UTCL1_CNTL), 0x08000000, 0x08000080
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_3, 0x30000000, 0x10000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0xffff77ff, 0x24000042),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG_READ, 0xffff77ff, 0x24000042),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_ENHANCE_1, 0xffffffff, 0x04048000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmPA_SC_MODE_CNTL_1, 0x06000000, 0x06000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmRMI_UTCL1_CNTL2, 0x00030000, 0x00020000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmTD_CNTL, 0x01bd9f33, 0x00000800)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_gc_9_1_rv1[] =
|
||||
static const struct soc15_reg_golden golden_settings_gc_9_x_common[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(GC, 0, mmCB_HW_CONTROL_3), 0x30000000, 0x10000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG), 0xffff77ff, 0x24000042,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG_READ), 0xffff77ff, 0x24000042,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_ENHANCE_1), 0xffffffff, 0x04048000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmPA_SC_MODE_CNTL_1), 0x06000000, 0x06000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmRMI_UTCL1_CNTL2), 0x00030000, 0x00020000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmTD_CNTL), 0x01bd9f33, 0x00000800
|
||||
};
|
||||
|
||||
static const u32 golden_settings_gc_9_x_common[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(GC, 0, mmGRBM_CAM_INDEX), 0xffffffff, 0x00000000,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGRBM_CAM_DATA), 0xffffffff, 0x2544c382
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_CAM_INDEX, 0xffffffff, 0x00000000),
|
||||
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_CAM_DATA, 0xffffffff, 0x2544c382)
|
||||
};
|
||||
|
||||
#define VEGA10_GB_ADDR_CONFIG_GOLDEN 0x2a114042
|
||||
@ -230,18 +161,18 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_gc_9_0,
|
||||
ARRAY_SIZE(golden_settings_gc_9_0));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_gc_9_0_vg10,
|
||||
ARRAY_SIZE(golden_settings_gc_9_0_vg10));
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_gc_9_1,
|
||||
ARRAY_SIZE(golden_settings_gc_9_1));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_gc_9_1_rv1,
|
||||
ARRAY_SIZE(golden_settings_gc_9_1_rv1));
|
||||
break;
|
||||
@ -249,7 +180,7 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
break;
|
||||
}
|
||||
|
||||
amdgpu_program_register_sequence(adev, golden_settings_gc_9_x_common,
|
||||
soc15_program_register_sequence(adev, golden_settings_gc_9_x_common,
|
||||
(const u32)ARRAY_SIZE(golden_settings_gc_9_x_common));
|
||||
}
|
||||
|
||||
@ -1137,7 +1068,7 @@ static int gfx_v9_0_ngg_init(struct amdgpu_device *adev)
|
||||
adev->gfx.ngg.gds_reserve_size = ALIGN(5 * 4, 0x40);
|
||||
adev->gds.mem.total_size -= adev->gfx.ngg.gds_reserve_size;
|
||||
adev->gds.mem.gfx_partition_size -= adev->gfx.ngg.gds_reserve_size;
|
||||
adev->gfx.ngg.gds_reserve_addr = amdgpu_gds_reg_offset[0].mem_base;
|
||||
adev->gfx.ngg.gds_reserve_addr = SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_BASE);
|
||||
adev->gfx.ngg.gds_reserve_addr += adev->gds.mem.gfx_partition_size;
|
||||
|
||||
/* Primitive Buffer */
|
||||
@ -1243,7 +1174,7 @@ static int gfx_v9_0_ngg_en(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, false,
|
||||
amdgpu_gds_reg_offset[0].mem_size,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE),
|
||||
(adev->gds.mem.total_size +
|
||||
adev->gfx.ngg.gds_reserve_size) >>
|
||||
AMDGPU_GDS_SHIFT);
|
||||
@ -1259,7 +1190,7 @@ static int gfx_v9_0_ngg_en(struct amdgpu_device *adev)
|
||||
|
||||
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, false,
|
||||
amdgpu_gds_reg_offset[0].mem_size, 0);
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE), 0);
|
||||
|
||||
amdgpu_ring_commit(ring);
|
||||
|
||||
@ -1598,11 +1529,18 @@ static void gfx_v9_0_gpu_init(struct amdgpu_device *adev)
|
||||
for (i = 0; i < 16; i++) {
|
||||
soc15_grbm_select(adev, 0, 0, 0, i);
|
||||
/* CP and shaders */
|
||||
tmp = 0;
|
||||
tmp = REG_SET_FIELD(tmp, SH_MEM_CONFIG, ALIGNMENT_MODE,
|
||||
SH_MEM_ALIGNMENT_MODE_UNALIGNED);
|
||||
WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, tmp);
|
||||
WREG32_SOC15(GC, 0, mmSH_MEM_BASES, 0);
|
||||
if (i == 0) {
|
||||
tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,
|
||||
SH_MEM_ALIGNMENT_MODE_UNALIGNED);
|
||||
WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, tmp);
|
||||
WREG32_SOC15(GC, 0, mmSH_MEM_BASES, 0);
|
||||
} else {
|
||||
tmp = REG_SET_FIELD(0, SH_MEM_CONFIG, ALIGNMENT_MODE,
|
||||
SH_MEM_ALIGNMENT_MODE_UNALIGNED);
|
||||
WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, tmp);
|
||||
tmp = adev->mc.shared_aperture_start >> 48;
|
||||
WREG32_SOC15(GC, 0, mmSH_MEM_BASES, tmp);
|
||||
}
|
||||
}
|
||||
soc15_grbm_select(adev, 0, 0, 0, 0);
|
||||
|
||||
@ -2474,7 +2412,7 @@ static int gfx_v9_0_kiq_kcq_enable(struct amdgpu_device *adev)
|
||||
PACKET3_MAP_QUEUES_PIPE(ring->pipe) |
|
||||
PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) |
|
||||
PACKET3_MAP_QUEUES_QUEUE_TYPE(0) | /*queue_type: normal compute queue */
|
||||
PACKET3_MAP_QUEUES_ALLOC_FORMAT(1) | /* alloc format: all_on_one_pipe */
|
||||
PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) | /* alloc format: all_on_one_pipe */
|
||||
PACKET3_MAP_QUEUES_ENGINE_SEL(0) | /* engine_sel: compute */
|
||||
PACKET3_MAP_QUEUES_NUM_QUEUES(1)); /* num_queues: must be 1 */
|
||||
amdgpu_ring_write(kiq_ring, PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index));
|
||||
@ -3146,6 +3084,8 @@ static void gfx_v9_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
|
||||
uint32_t gws_base, uint32_t gws_size,
|
||||
uint32_t oa_base, uint32_t oa_size)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
gds_base = gds_base >> AMDGPU_GDS_SHIFT;
|
||||
gds_size = gds_size >> AMDGPU_GDS_SHIFT;
|
||||
|
||||
@ -3157,22 +3097,22 @@ static void gfx_v9_0_ring_emit_gds_switch(struct amdgpu_ring *ring,
|
||||
|
||||
/* GDS Base */
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, false,
|
||||
amdgpu_gds_reg_offset[vmid].mem_base,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_BASE) + 2 * vmid,
|
||||
gds_base);
|
||||
|
||||
/* GDS Size */
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, false,
|
||||
amdgpu_gds_reg_offset[vmid].mem_size,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_VMID0_SIZE) + 2 * vmid,
|
||||
gds_size);
|
||||
|
||||
/* GWS */
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, false,
|
||||
amdgpu_gds_reg_offset[vmid].gws,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_GWS_VMID0) + vmid,
|
||||
gws_size << GDS_GWS_VMID0__SIZE__SHIFT | gws_base);
|
||||
|
||||
/* OA */
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, false,
|
||||
amdgpu_gds_reg_offset[vmid].oa,
|
||||
SOC15_REG_OFFSET(GC, 0, mmGDS_OA_VMID0) + vmid,
|
||||
(1 << (oa_size + oa_base)) - (1 << oa_base));
|
||||
}
|
||||
|
||||
@ -3617,13 +3557,9 @@ static void gfx_v9_0_ring_set_wptr_gfx(struct amdgpu_ring *ring)
|
||||
|
||||
static void gfx_v9_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
u32 ref_and_mask, reg_mem_engine;
|
||||
const struct nbio_hdp_flush_reg *nbio_hf_reg;
|
||||
|
||||
if (ring->adev->flags & AMD_IS_APU)
|
||||
nbio_hf_reg = &nbio_v7_0_hdp_flush_reg;
|
||||
else
|
||||
nbio_hf_reg = &nbio_v6_1_hdp_flush_reg;
|
||||
const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio_funcs->hdp_flush_reg;
|
||||
|
||||
if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {
|
||||
switch (ring->me) {
|
||||
@ -3643,13 +3579,15 @@ static void gfx_v9_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
}
|
||||
|
||||
gfx_v9_0_wait_reg_mem(ring, reg_mem_engine, 0, 1,
|
||||
nbio_hf_reg->hdp_flush_req_offset,
|
||||
nbio_hf_reg->hdp_flush_done_offset,
|
||||
adev->nbio_funcs->get_hdp_flush_req_offset(adev),
|
||||
adev->nbio_funcs->get_hdp_flush_done_offset(adev),
|
||||
ref_and_mask, ref_and_mask, 0x20);
|
||||
}
|
||||
|
||||
static void gfx_v9_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
gfx_v9_0_write_data_to_reg(ring, 0, true,
|
||||
SOC15_REG_OFFSET(HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 1);
|
||||
}
|
||||
@ -3750,10 +3688,11 @@ static void gfx_v9_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX);
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
gfx_v9_0_write_data_to_reg(ring, usepfp, true,
|
||||
hub->ctx0_ptb_addr_lo32 + (2 * vm_id),
|
||||
@ -3811,6 +3750,8 @@ static void gfx_v9_0_ring_set_wptr_compute(struct amdgpu_ring *ring)
|
||||
static void gfx_v9_0_ring_emit_fence_kiq(struct amdgpu_ring *ring, u64 addr,
|
||||
u64 seq, unsigned int flags)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
/* we only allocate 32bit for each seq wb address */
|
||||
BUG_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
|
||||
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "amdgpu.h"
|
||||
#include "gfxhub_v1_0.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "gc/gc_9_0_offset.h"
|
||||
#include "gc/gc_9_0_sh_mask.h"
|
||||
#include "gc/gc_9_0_default.h"
|
||||
@ -144,8 +143,15 @@ static void gfxhub_v1_0_init_cache_regs(struct amdgpu_device *adev)
|
||||
WREG32_SOC15(GC, 0, mmVM_L2_CNTL2, tmp);
|
||||
|
||||
tmp = mmVM_L2_CNTL3_DEFAULT;
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9);
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
|
||||
if (adev->mc.translate_further) {
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 12);
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3,
|
||||
L2_CACHE_BIGK_FRAGMENT_SIZE, 9);
|
||||
} else {
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9);
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3,
|
||||
L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
|
||||
}
|
||||
WREG32_SOC15(GC, 0, mmVM_L2_CNTL3, tmp);
|
||||
|
||||
tmp = mmVM_L2_CNTL4_DEFAULT;
|
||||
@ -183,31 +189,40 @@ static void gfxhub_v1_0_disable_identity_aperture(struct amdgpu_device *adev)
|
||||
|
||||
static void gfxhub_v1_0_setup_vmid_config(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
unsigned num_level, block_size;
|
||||
uint32_t tmp;
|
||||
int i;
|
||||
|
||||
num_level = adev->vm_manager.num_level;
|
||||
block_size = adev->vm_manager.block_size;
|
||||
if (adev->mc.translate_further)
|
||||
num_level -= 1;
|
||||
else
|
||||
block_size -= 9;
|
||||
|
||||
for (i = 0; i <= 14; i++) {
|
||||
tmp = RREG32_SOC15_OFFSET(GC, 0, mmVM_CONTEXT1_CNTL, i);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH,
|
||||
adev->vm_manager.num_level);
|
||||
num_level);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT,
|
||||
1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
PAGE_TABLE_BLOCK_SIZE,
|
||||
adev->vm_manager.block_size - 9);
|
||||
PAGE_TABLE_BLOCK_SIZE,
|
||||
block_size);
|
||||
/* Send no-retry XNACK on fault to suppress VM fault storm. */
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0);
|
||||
|
@ -222,8 +222,8 @@ static void gmc_v6_0_vram_gtt_location(struct amdgpu_device *adev,
|
||||
u64 base = RREG32(mmMC_VM_FB_LOCATION) & 0xFFFF;
|
||||
base <<= 24;
|
||||
|
||||
amdgpu_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_gart_location(adev, mc);
|
||||
amdgpu_device_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_device_gart_location(adev, mc);
|
||||
}
|
||||
|
||||
static void gmc_v6_0_mc_program(struct amdgpu_device *adev)
|
||||
@ -395,10 +395,10 @@ static uint64_t gmc_v6_0_get_vm_pte_flags(struct amdgpu_device *adev,
|
||||
return pte_flag;
|
||||
}
|
||||
|
||||
static uint64_t gmc_v6_0_get_vm_pde(struct amdgpu_device *adev, uint64_t addr)
|
||||
static void gmc_v6_0_get_vm_pde(struct amdgpu_device *adev, int level,
|
||||
uint64_t *addr, uint64_t *flags)
|
||||
{
|
||||
BUG_ON(addr & 0xFFFFFF0000000FFFULL);
|
||||
return addr;
|
||||
BUG_ON(*addr & 0xFFFFFF0000000FFFULL);
|
||||
}
|
||||
|
||||
static void gmc_v6_0_set_fault_enable_default(struct amdgpu_device *adev,
|
||||
|
@ -67,12 +67,12 @@ static void gmc_v7_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TOPAZ:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_iceland_a11,
|
||||
ARRAY_SIZE(golden_settings_iceland_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_iceland_a11,
|
||||
ARRAY_SIZE(golden_settings_iceland_a11));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -240,8 +240,8 @@ static void gmc_v7_0_vram_gtt_location(struct amdgpu_device *adev,
|
||||
u64 base = RREG32(mmMC_VM_FB_LOCATION) & 0xFFFF;
|
||||
base <<= 24;
|
||||
|
||||
amdgpu_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_gart_location(adev, mc);
|
||||
amdgpu_device_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_device_gart_location(adev, mc);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -480,10 +480,10 @@ static uint64_t gmc_v7_0_get_vm_pte_flags(struct amdgpu_device *adev,
|
||||
return pte_flag;
|
||||
}
|
||||
|
||||
static uint64_t gmc_v7_0_get_vm_pde(struct amdgpu_device *adev, uint64_t addr)
|
||||
static void gmc_v7_0_get_vm_pde(struct amdgpu_device *adev, int level,
|
||||
uint64_t *addr, uint64_t *flags)
|
||||
{
|
||||
BUG_ON(addr & 0xFFFFFF0000000FFFULL);
|
||||
return addr;
|
||||
BUG_ON(*addr & 0xFFFFFF0000000FFFULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -120,44 +120,44 @@ static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_FIJI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
break;
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_polaris11_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris11_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_polaris11_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris11_a11));
|
||||
break;
|
||||
case CHIP_POLARIS10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_polaris10_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris10_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_polaris10_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris10_a11));
|
||||
break;
|
||||
case CHIP_CARRIZO:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_STONEY:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_stoney_common,
|
||||
ARRAY_SIZE(golden_settings_stoney_common));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_stoney_common,
|
||||
ARRAY_SIZE(golden_settings_stoney_common));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -405,8 +405,8 @@ static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
|
||||
base = RREG32(mmMC_VM_FB_LOCATION) & 0xFFFF;
|
||||
base <<= 24;
|
||||
|
||||
amdgpu_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_gart_location(adev, mc);
|
||||
amdgpu_device_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_device_gart_location(adev, mc);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -677,10 +677,10 @@ static uint64_t gmc_v8_0_get_vm_pte_flags(struct amdgpu_device *adev,
|
||||
return pte_flag;
|
||||
}
|
||||
|
||||
static uint64_t gmc_v8_0_get_vm_pde(struct amdgpu_device *adev, uint64_t addr)
|
||||
static void gmc_v8_0_get_vm_pde(struct amdgpu_device *adev, int level,
|
||||
uint64_t *addr, uint64_t *flags)
|
||||
{
|
||||
BUG_ON(addr & 0xFFFFFF0000000FFFULL);
|
||||
return addr;
|
||||
BUG_ON(*addr & 0xFFFFFF0000000FFFULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include "gmc_v9_0.h"
|
||||
#include "amdgpu_atomfirmware.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "hdp/hdp_4_0_offset.h"
|
||||
#include "hdp/hdp_4_0_sh_mask.h"
|
||||
#include "gc/gc_9_0_sh_mask.h"
|
||||
@ -35,11 +34,10 @@
|
||||
#include "mmhub/mmhub_1_0_offset.h"
|
||||
#include "athub/athub_1_0_offset.h"
|
||||
|
||||
#include "soc15.h"
|
||||
#include "soc15_common.h"
|
||||
#include "umc/umc_6_0_sh_mask.h"
|
||||
|
||||
#include "nbio_v6_1.h"
|
||||
#include "nbio_v7_0.h"
|
||||
#include "gfxhub_v1_0.h"
|
||||
#include "mmhub_v1_0.h"
|
||||
|
||||
@ -74,16 +72,16 @@ static const u32 golden_settings_vega10_hdp[] =
|
||||
0xf6e, 0x0fffffff, 0x00000000,
|
||||
};
|
||||
|
||||
static const u32 golden_settings_mmhub_1_0_0[] =
|
||||
static const struct soc15_reg_golden golden_settings_mmhub_1_0_0[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(MMHUB, 0, mmDAGB1_WRCLI2), 0x00000007, 0xfe5fe0fa,
|
||||
SOC15_REG_OFFSET(MMHUB, 0, mmMMEA1_DRAM_WR_CLI2GRP_MAP0), 0x00000030, 0x55555565
|
||||
SOC15_REG_GOLDEN_VALUE(MMHUB, 0, mmDAGB1_WRCLI2, 0x00000007, 0xfe5fe0fa),
|
||||
SOC15_REG_GOLDEN_VALUE(MMHUB, 0, mmMMEA1_DRAM_WR_CLI2GRP_MAP0, 0x00000030, 0x55555565)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_athub_1_0_0[] =
|
||||
static const struct soc15_reg_golden golden_settings_athub_1_0_0[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(ATHUB, 0, mmRPB_ARB_CNTL), 0x0000ff00, 0x00000800,
|
||||
SOC15_REG_OFFSET(ATHUB, 0, mmRPB_ARB_CNTL2), 0x00ff00ff, 0x00080008
|
||||
SOC15_REG_GOLDEN_VALUE(ATHUB, 0, mmRPB_ARB_CNTL, 0x0000ff00, 0x00000800),
|
||||
SOC15_REG_GOLDEN_VALUE(ATHUB, 0, mmRPB_ARB_CNTL2, 0x00ff00ff, 0x00080008)
|
||||
};
|
||||
|
||||
/* Ecc related register addresses, (BASE + reg offset) */
|
||||
@ -332,10 +330,7 @@ static void gmc_v9_0_gart_flush_gpu_tlb(struct amdgpu_device *adev,
|
||||
unsigned i, j;
|
||||
|
||||
/* flush hdp cache */
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_v7_0_hdp_flush(adev);
|
||||
else
|
||||
nbio_v6_1_hdp_flush(adev);
|
||||
adev->nbio_funcs->hdp_flush(adev);
|
||||
|
||||
spin_lock(&adev->mc.invalidate_lock);
|
||||
|
||||
@ -474,11 +469,28 @@ static uint64_t gmc_v9_0_get_vm_pte_flags(struct amdgpu_device *adev,
|
||||
return pte_flag;
|
||||
}
|
||||
|
||||
static u64 gmc_v9_0_get_vm_pde(struct amdgpu_device *adev, u64 addr)
|
||||
static void gmc_v9_0_get_vm_pde(struct amdgpu_device *adev, int level,
|
||||
uint64_t *addr, uint64_t *flags)
|
||||
{
|
||||
addr = adev->vm_manager.vram_base_offset + addr - adev->mc.vram_start;
|
||||
BUG_ON(addr & 0xFFFF00000000003FULL);
|
||||
return addr;
|
||||
if (!(*flags & AMDGPU_PDE_PTE))
|
||||
*addr = adev->vm_manager.vram_base_offset + *addr -
|
||||
adev->mc.vram_start;
|
||||
BUG_ON(*addr & 0xFFFF00000000003FULL);
|
||||
|
||||
if (!adev->mc.translate_further)
|
||||
return;
|
||||
|
||||
if (level == AMDGPU_VM_PDB1) {
|
||||
/* Set the block fragment size */
|
||||
if (!(*flags & AMDGPU_PDE_PTE))
|
||||
*flags |= AMDGPU_PDE_BFS(0x9);
|
||||
|
||||
} else if (level == AMDGPU_VM_PDB0) {
|
||||
if (*flags & AMDGPU_PDE_PTE)
|
||||
*flags &= ~AMDGPU_PDE_PTE;
|
||||
else
|
||||
*flags |= AMDGPU_PTE_TF;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct amdgpu_gart_funcs gmc_v9_0_gart_funcs = {
|
||||
@ -502,6 +514,14 @@ static int gmc_v9_0_early_init(void *handle)
|
||||
gmc_v9_0_set_gart_funcs(adev);
|
||||
gmc_v9_0_set_irq_funcs(adev);
|
||||
|
||||
adev->mc.shared_aperture_start = 0x2000000000000000ULL;
|
||||
adev->mc.shared_aperture_end =
|
||||
adev->mc.shared_aperture_start + (4ULL << 30) - 1;
|
||||
adev->mc.private_aperture_start =
|
||||
adev->mc.shared_aperture_end + 1;
|
||||
adev->mc.private_aperture_end =
|
||||
adev->mc.private_aperture_start + (4ULL << 30) - 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -633,8 +653,8 @@ static void gmc_v9_0_vram_gtt_location(struct amdgpu_device *adev,
|
||||
u64 base = 0;
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
base = mmhub_v1_0_get_fb_location(adev);
|
||||
amdgpu_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_gart_location(adev, mc);
|
||||
amdgpu_device_vram_location(adev, &adev->mc, base);
|
||||
amdgpu_device_gart_location(adev, mc);
|
||||
/* base offset of vram pages */
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
adev->vm_manager.vram_base_offset = gfxhub_v1_0_get_mc_fb_offset(adev);
|
||||
@ -700,8 +720,7 @@ static int gmc_v9_0_mc_init(struct amdgpu_device *adev)
|
||||
|
||||
/* size in MB on si */
|
||||
adev->mc.mc_vram_size =
|
||||
((adev->flags & AMD_IS_APU) ? nbio_v7_0_get_memsize(adev) :
|
||||
nbio_v6_1_get_memsize(adev)) * 1024ULL * 1024ULL;
|
||||
adev->nbio_funcs->get_memsize(adev) * 1024ULL * 1024ULL;
|
||||
adev->mc.real_vram_size = adev->mc.mc_vram_size;
|
||||
|
||||
if (!(adev->flags & AMD_IS_APU)) {
|
||||
@ -769,11 +788,14 @@ static int gmc_v9_0_sw_init(void *handle)
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_RAVEN:
|
||||
adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN;
|
||||
if (adev->rev_id == 0x0 || adev->rev_id == 0x1)
|
||||
if (adev->rev_id == 0x0 || adev->rev_id == 0x1) {
|
||||
amdgpu_vm_adjust_size(adev, 256 * 1024, 9, 3, 48);
|
||||
else
|
||||
/* vm_size is 64GB for legacy 2-level page support */
|
||||
amdgpu_vm_adjust_size(adev, 64, 9, 1, 48);
|
||||
} else {
|
||||
/* vm_size is 128TB + 512GB for legacy 3-level page support */
|
||||
amdgpu_vm_adjust_size(adev, 128 * 1024 + 512, 9, 2, 48);
|
||||
adev->mc.translate_further =
|
||||
adev->vm_manager.num_level > 1;
|
||||
}
|
||||
break;
|
||||
case CHIP_VEGA10:
|
||||
/* XXX Don't know how to get VRAM type yet. */
|
||||
@ -883,17 +905,18 @@ static int gmc_v9_0_sw_fini(void *handle)
|
||||
|
||||
static void gmc_v9_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_mmhub_1_0_0,
|
||||
ARRAY_SIZE(golden_settings_mmhub_1_0_0));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_athub_1_0_0,
|
||||
ARRAY_SIZE(golden_settings_athub_1_0_0));
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_athub_1_0_0,
|
||||
ARRAY_SIZE(golden_settings_athub_1_0_0));
|
||||
break;
|
||||
@ -913,9 +936,9 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
|
||||
bool value;
|
||||
u32 tmp;
|
||||
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_vega10_hdp,
|
||||
ARRAY_SIZE(golden_settings_vega10_hdp));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_vega10_hdp,
|
||||
ARRAY_SIZE(golden_settings_vega10_hdp));
|
||||
|
||||
if (adev->gart.robj == NULL) {
|
||||
dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
|
||||
@ -948,10 +971,7 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
|
||||
WREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL, tmp);
|
||||
|
||||
/* After HDP is initialized, flush HDP.*/
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_v7_0_hdp_flush(adev);
|
||||
else
|
||||
nbio_v6_1_hdp_flush(adev);
|
||||
adev->nbio_funcs->hdp_flush(adev);
|
||||
|
||||
if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_ALWAYS)
|
||||
value = false;
|
||||
|
@ -1682,8 +1682,8 @@ static void kv_dpm_powergate_uvd(void *handle, bool gate)
|
||||
|
||||
if (gate) {
|
||||
/* stop the UVD block */
|
||||
ret = amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_GATE);
|
||||
ret = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_GATE);
|
||||
kv_update_uvd_dpm(adev, gate);
|
||||
if (pi->caps_uvd_pg)
|
||||
/* power off the UVD block */
|
||||
@ -1695,8 +1695,8 @@ static void kv_dpm_powergate_uvd(void *handle, bool gate)
|
||||
/* re-init the UVD block */
|
||||
kv_update_uvd_dpm(adev, gate);
|
||||
|
||||
ret = amdgpu_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
ret = amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_UVD,
|
||||
AMD_PG_STATE_UNGATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "amdgpu.h"
|
||||
#include "mmhub_v1_0.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "mmhub/mmhub_1_0_offset.h"
|
||||
#include "mmhub/mmhub_1_0_sh_mask.h"
|
||||
#include "mmhub/mmhub_1_0_default.h"
|
||||
@ -156,10 +155,15 @@ static void mmhub_v1_0_init_cache_regs(struct amdgpu_device *adev)
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1);
|
||||
WREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL2, tmp);
|
||||
|
||||
tmp = mmVM_L2_CNTL3_DEFAULT;
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9);
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
|
||||
WREG32_SOC15(MMHUB, 0, mmVM_L2_CNTL3, tmp);
|
||||
if (adev->mc.translate_further) {
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 12);
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3,
|
||||
L2_CACHE_BIGK_FRAGMENT_SIZE, 9);
|
||||
} else {
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 9);
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3,
|
||||
L2_CACHE_BIGK_FRAGMENT_SIZE, 6);
|
||||
}
|
||||
|
||||
tmp = mmVM_L2_CNTL4_DEFAULT;
|
||||
tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_PDE_REQUEST_PHYSICAL, 0);
|
||||
@ -197,32 +201,40 @@ static void mmhub_v1_0_disable_identity_aperture(struct amdgpu_device *adev)
|
||||
|
||||
static void mmhub_v1_0_setup_vmid_config(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
unsigned num_level, block_size;
|
||||
uint32_t tmp;
|
||||
int i;
|
||||
|
||||
num_level = adev->vm_manager.num_level;
|
||||
block_size = adev->vm_manager.block_size;
|
||||
if (adev->mc.translate_further)
|
||||
num_level -= 1;
|
||||
else
|
||||
block_size -= 9;
|
||||
|
||||
for (i = 0; i <= 14; i++) {
|
||||
tmp = RREG32_SOC15_OFFSET(MMHUB, 0, mmVM_CONTEXT1_CNTL, i);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, ENABLE_CONTEXT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL, PAGE_TABLE_DEPTH,
|
||||
num_level);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
ENABLE_CONTEXT, 1);
|
||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
PAGE_TABLE_DEPTH, adev->vm_manager.num_level);
|
||||
DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT,
|
||||
1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
PDE0_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
VALID_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
READ_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
WRITE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
EXECUTE_PROTECTION_FAULT_ENABLE_DEFAULT, 1);
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
PAGE_TABLE_BLOCK_SIZE,
|
||||
adev->vm_manager.block_size - 9);
|
||||
PAGE_TABLE_BLOCK_SIZE,
|
||||
block_size);
|
||||
/* Send no-retry XNACK on fault to suppress VM fault storm. */
|
||||
tmp = REG_SET_FIELD(tmp, VM_CONTEXT1_CNTL,
|
||||
RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0);
|
||||
|
@ -22,7 +22,6 @@
|
||||
*/
|
||||
|
||||
#include "amdgpu.h"
|
||||
#include "soc15ip.h"
|
||||
#include "nbio/nbio_6_1_offset.h"
|
||||
#include "nbio/nbio_6_1_sh_mask.h"
|
||||
#include "gc/gc_9_0_offset.h"
|
||||
@ -254,7 +253,7 @@ static void xgpu_ai_mailbox_flr_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
/* Trigger recovery due to world switch failure */
|
||||
amdgpu_gpu_recover(adev, NULL);
|
||||
amdgpu_device_gpu_recover(adev, NULL, false);
|
||||
}
|
||||
|
||||
static int xgpu_ai_set_mailbox_rcv_irq(struct amdgpu_device *adev,
|
||||
@ -278,7 +277,7 @@ static int xgpu_ai_mailbox_rcv_irq(struct amdgpu_device *adev,
|
||||
int r;
|
||||
|
||||
/* trigger gpu-reset by hypervisor only if TDR disbaled */
|
||||
if (amdgpu_lockup_timeout == 0) {
|
||||
if (!amdgpu_gpu_recovery) {
|
||||
/* see what event we get */
|
||||
r = xgpu_ai_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION);
|
||||
|
||||
|
@ -279,32 +279,32 @@ void xgpu_vi_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_FIJI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
xgpu_fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(
|
||||
xgpu_fiji_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
xgpu_fiji_golden_settings_a10,
|
||||
ARRAY_SIZE(
|
||||
xgpu_fiji_golden_settings_a10));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
xgpu_fiji_golden_common_all,
|
||||
ARRAY_SIZE(
|
||||
xgpu_fiji_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
xgpu_fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(
|
||||
xgpu_fiji_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
xgpu_fiji_golden_settings_a10,
|
||||
ARRAY_SIZE(
|
||||
xgpu_fiji_golden_settings_a10));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
xgpu_fiji_golden_common_all,
|
||||
ARRAY_SIZE(
|
||||
xgpu_fiji_golden_common_all));
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
xgpu_tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(
|
||||
xgpu_tonga_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
xgpu_tonga_golden_settings_a11,
|
||||
ARRAY_SIZE(
|
||||
xgpu_tonga_golden_settings_a11));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
xgpu_tonga_golden_common_all,
|
||||
ARRAY_SIZE(
|
||||
xgpu_tonga_golden_common_all));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
xgpu_tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(
|
||||
xgpu_tonga_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
xgpu_tonga_golden_settings_a11,
|
||||
ARRAY_SIZE(
|
||||
xgpu_tonga_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
xgpu_tonga_golden_common_all,
|
||||
ARRAY_SIZE(
|
||||
xgpu_tonga_golden_common_all));
|
||||
break;
|
||||
default:
|
||||
BUG_ON("Doesn't support chip type.\n");
|
||||
@ -521,7 +521,7 @@ static void xgpu_vi_mailbox_flr_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
/* Trigger recovery due to world switch failure */
|
||||
amdgpu_gpu_recover(adev, NULL);
|
||||
amdgpu_device_gpu_recover(adev, NULL, false);
|
||||
}
|
||||
|
||||
static int xgpu_vi_set_mailbox_rcv_irq(struct amdgpu_device *adev,
|
||||
@ -545,7 +545,7 @@ static int xgpu_vi_mailbox_rcv_irq(struct amdgpu_device *adev,
|
||||
int r;
|
||||
|
||||
/* trigger gpu-reset by hypervisor only if TDR disbaled */
|
||||
if (amdgpu_lockup_timeout == 0) {
|
||||
if (!amdgpu_gpu_recovery) {
|
||||
/* see what event we get */
|
||||
r = xgpu_vi_mailbox_rcv_msg(adev, IDH_FLR_NOTIFICATION);
|
||||
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include "amdgpu_atombios.h"
|
||||
#include "nbio_v6_1.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "nbio/nbio_6_1_default.h"
|
||||
#include "nbio/nbio_6_1_offset.h"
|
||||
#include "nbio/nbio_6_1_sh_mask.h"
|
||||
@ -34,7 +33,7 @@
|
||||
#define smnPCIE_CNTL2 0x11180070
|
||||
#define smnPCIE_CONFIG_CNTL 0x11180044
|
||||
|
||||
u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev)
|
||||
static u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 tmp = RREG32_SOC15(NBIO, 0, mmRCC_DEV0_EPF0_STRAP0);
|
||||
|
||||
@ -44,19 +43,7 @@ u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
u32 nbio_v6_1_get_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx)
|
||||
{
|
||||
return RREG32_SOC15_OFFSET(NBIO, 0, mmBIOS_SCRATCH_0, idx);
|
||||
}
|
||||
|
||||
void nbio_v6_1_set_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx, uint32_t val)
|
||||
{
|
||||
WREG32_SOC15_OFFSET(NBIO, 0, mmBIOS_SCRATCH_0, idx, val);
|
||||
}
|
||||
|
||||
void nbio_v6_1_mc_access_enable(struct amdgpu_device *adev, bool enable)
|
||||
static void nbio_v6_1_mc_access_enable(struct amdgpu_device *adev, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
WREG32_SOC15(NBIO, 0, mmBIF_FB_EN,
|
||||
@ -66,26 +53,23 @@ void nbio_v6_1_mc_access_enable(struct amdgpu_device *adev, bool enable)
|
||||
WREG32_SOC15(NBIO, 0, mmBIF_FB_EN, 0);
|
||||
}
|
||||
|
||||
void nbio_v6_1_hdp_flush(struct amdgpu_device *adev)
|
||||
static void nbio_v6_1_hdp_flush(struct amdgpu_device *adev)
|
||||
{
|
||||
WREG32_SOC15_NO_KIQ(NBIO, 0, mmBIF_BX_PF0_HDP_MEM_COHERENCY_FLUSH_CNTL, 0);
|
||||
}
|
||||
|
||||
u32 nbio_v6_1_get_memsize(struct amdgpu_device *adev)
|
||||
static u32 nbio_v6_1_get_memsize(struct amdgpu_device *adev)
|
||||
{
|
||||
return RREG32_SOC15(NBIO, 0, mmRCC_PF_0_0_RCC_CONFIG_MEMSIZE);
|
||||
}
|
||||
|
||||
static const u32 nbio_sdma_doorbell_range_reg[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA0_DOORBELL_RANGE),
|
||||
SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA1_DOORBELL_RANGE)
|
||||
};
|
||||
|
||||
void nbio_v6_1_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
static void nbio_v6_1_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
{
|
||||
u32 doorbell_range = RREG32(nbio_sdma_doorbell_range_reg[instance]);
|
||||
u32 reg = instance == 0 ? SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA0_DOORBELL_RANGE) :
|
||||
SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA1_DOORBELL_RANGE);
|
||||
|
||||
u32 doorbell_range = RREG32(reg);
|
||||
|
||||
if (use_doorbell) {
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range, BIF_SDMA0_DOORBELL_RANGE, OFFSET, doorbell_index);
|
||||
@ -93,17 +77,18 @@ void nbio_v6_1_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
} else
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range, BIF_SDMA0_DOORBELL_RANGE, SIZE, 0);
|
||||
|
||||
WREG32(nbio_sdma_doorbell_range_reg[instance], doorbell_range);
|
||||
WREG32(reg, doorbell_range);
|
||||
|
||||
}
|
||||
|
||||
void nbio_v6_1_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
static void nbio_v6_1_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
WREG32_FIELD15(NBIO, 0, RCC_PF_0_0_RCC_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, enable ? 1 : 0);
|
||||
}
|
||||
|
||||
void nbio_v6_1_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
static void nbio_v6_1_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
u32 tmp = 0;
|
||||
|
||||
@ -122,8 +107,8 @@ void nbio_v6_1_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,
|
||||
}
|
||||
|
||||
|
||||
void nbio_v6_1_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
static void nbio_v6_1_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
{
|
||||
u32 ih_doorbell_range = RREG32_SOC15(NBIO, 0 , mmBIF_IH_DOORBELL_RANGE);
|
||||
|
||||
@ -136,7 +121,7 @@ void nbio_v6_1_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
WREG32_SOC15(NBIO, 0, mmBIF_IH_DOORBELL_RANGE, ih_doorbell_range);
|
||||
}
|
||||
|
||||
void nbio_v6_1_ih_control(struct amdgpu_device *adev)
|
||||
static void nbio_v6_1_ih_control(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 interrupt_cntl;
|
||||
|
||||
@ -152,8 +137,8 @@ void nbio_v6_1_ih_control(struct amdgpu_device *adev)
|
||||
WREG32_SOC15(NBIO, 0, mmINTERRUPT_CNTL, interrupt_cntl);
|
||||
}
|
||||
|
||||
void nbio_v6_1_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
static void nbio_v6_1_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
uint32_t def, data;
|
||||
|
||||
@ -180,8 +165,8 @@ void nbio_v6_1_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
WREG32_PCIE(smnCPM_CONTROL, data);
|
||||
}
|
||||
|
||||
void nbio_v6_1_update_medium_grain_light_sleep(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
static void nbio_v6_1_update_medium_grain_light_sleep(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
uint32_t def, data;
|
||||
|
||||
@ -200,7 +185,8 @@ void nbio_v6_1_update_medium_grain_light_sleep(struct amdgpu_device *adev,
|
||||
WREG32_PCIE(smnPCIE_CNTL2, data);
|
||||
}
|
||||
|
||||
void nbio_v6_1_get_clockgating_state(struct amdgpu_device *adev, u32 *flags)
|
||||
static void nbio_v6_1_get_clockgating_state(struct amdgpu_device *adev,
|
||||
u32 *flags)
|
||||
{
|
||||
int data;
|
||||
|
||||
@ -215,9 +201,27 @@ void nbio_v6_1_get_clockgating_state(struct amdgpu_device *adev, u32 *flags)
|
||||
*flags |= AMD_CG_SUPPORT_BIF_LS;
|
||||
}
|
||||
|
||||
const struct nbio_hdp_flush_reg nbio_v6_1_hdp_flush_reg = {
|
||||
.hdp_flush_req_offset = SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_GPU_HDP_FLUSH_REQ),
|
||||
.hdp_flush_done_offset = SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_GPU_HDP_FLUSH_DONE),
|
||||
static u32 nbio_v6_1_get_hdp_flush_req_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_GPU_HDP_FLUSH_REQ);
|
||||
}
|
||||
|
||||
static u32 nbio_v6_1_get_hdp_flush_done_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF0_GPU_HDP_FLUSH_DONE);
|
||||
}
|
||||
|
||||
static u32 nbio_v6_1_get_pcie_index_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmPCIE_INDEX);
|
||||
}
|
||||
|
||||
static u32 nbio_v6_1_get_pcie_data_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmPCIE_DATA);
|
||||
}
|
||||
|
||||
static const struct nbio_hdp_flush_reg nbio_v6_1_hdp_flush_reg = {
|
||||
.ref_and_mask_cp0 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP0_MASK,
|
||||
.ref_and_mask_cp1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP1_MASK,
|
||||
.ref_and_mask_cp2 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__CP2_MASK,
|
||||
@ -232,12 +236,7 @@ const struct nbio_hdp_flush_reg nbio_v6_1_hdp_flush_reg = {
|
||||
.ref_and_mask_sdma1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__SDMA1_MASK
|
||||
};
|
||||
|
||||
const struct nbio_pcie_index_data nbio_v6_1_pcie_index_data = {
|
||||
.index_offset = SOC15_REG_OFFSET(NBIO, 0, mmPCIE_INDEX),
|
||||
.data_offset = SOC15_REG_OFFSET(NBIO, 0, mmPCIE_DATA),
|
||||
};
|
||||
|
||||
void nbio_v6_1_detect_hw_virt(struct amdgpu_device *adev)
|
||||
static void nbio_v6_1_detect_hw_virt(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t reg;
|
||||
|
||||
@ -254,7 +253,7 @@ void nbio_v6_1_detect_hw_virt(struct amdgpu_device *adev)
|
||||
}
|
||||
}
|
||||
|
||||
void nbio_v6_1_init_registers(struct amdgpu_device *adev)
|
||||
static void nbio_v6_1_init_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t def, data;
|
||||
|
||||
@ -265,3 +264,25 @@ void nbio_v6_1_init_registers(struct amdgpu_device *adev)
|
||||
if (def != data)
|
||||
WREG32_PCIE(smnPCIE_CONFIG_CNTL, data);
|
||||
}
|
||||
|
||||
const struct amdgpu_nbio_funcs nbio_v6_1_funcs = {
|
||||
.hdp_flush_reg = &nbio_v6_1_hdp_flush_reg,
|
||||
.get_hdp_flush_req_offset = nbio_v6_1_get_hdp_flush_req_offset,
|
||||
.get_hdp_flush_done_offset = nbio_v6_1_get_hdp_flush_done_offset,
|
||||
.get_pcie_index_offset = nbio_v6_1_get_pcie_index_offset,
|
||||
.get_pcie_data_offset = nbio_v6_1_get_pcie_data_offset,
|
||||
.get_rev_id = nbio_v6_1_get_rev_id,
|
||||
.mc_access_enable = nbio_v6_1_mc_access_enable,
|
||||
.hdp_flush = nbio_v6_1_hdp_flush,
|
||||
.get_memsize = nbio_v6_1_get_memsize,
|
||||
.sdma_doorbell_range = nbio_v6_1_sdma_doorbell_range,
|
||||
.enable_doorbell_aperture = nbio_v6_1_enable_doorbell_aperture,
|
||||
.enable_doorbell_selfring_aperture = nbio_v6_1_enable_doorbell_selfring_aperture,
|
||||
.ih_doorbell_range = nbio_v6_1_ih_doorbell_range,
|
||||
.update_medium_grain_clock_gating = nbio_v6_1_update_medium_grain_clock_gating,
|
||||
.update_medium_grain_light_sleep = nbio_v6_1_update_medium_grain_light_sleep,
|
||||
.get_clockgating_state = nbio_v6_1_get_clockgating_state,
|
||||
.ih_control = nbio_v6_1_ih_control,
|
||||
.init_registers = nbio_v6_1_init_registers,
|
||||
.detect_hw_virt = nbio_v6_1_detect_hw_virt,
|
||||
};
|
||||
|
@ -26,30 +26,6 @@
|
||||
|
||||
#include "soc15_common.h"
|
||||
|
||||
extern const struct nbio_hdp_flush_reg nbio_v6_1_hdp_flush_reg;
|
||||
extern const struct nbio_pcie_index_data nbio_v6_1_pcie_index_data;
|
||||
int nbio_v6_1_init(struct amdgpu_device *adev);
|
||||
u32 nbio_v6_1_get_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx);
|
||||
void nbio_v6_1_set_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx, uint32_t val);
|
||||
void nbio_v6_1_mc_access_enable(struct amdgpu_device *adev, bool enable);
|
||||
void nbio_v6_1_hdp_flush(struct amdgpu_device *adev);
|
||||
u32 nbio_v6_1_get_memsize(struct amdgpu_device *adev);
|
||||
void nbio_v6_1_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
bool use_doorbell, int doorbell_index);
|
||||
void nbio_v6_1_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void nbio_v6_1_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void nbio_v6_1_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index);
|
||||
void nbio_v6_1_ih_control(struct amdgpu_device *adev);
|
||||
u32 nbio_v6_1_get_rev_id(struct amdgpu_device *adev);
|
||||
void nbio_v6_1_update_medium_grain_clock_gating(struct amdgpu_device *adev, bool enable);
|
||||
void nbio_v6_1_update_medium_grain_light_sleep(struct amdgpu_device *adev, bool enable);
|
||||
void nbio_v6_1_get_clockgating_state(struct amdgpu_device *adev, u32 *flags);
|
||||
void nbio_v6_1_detect_hw_virt(struct amdgpu_device *adev);
|
||||
void nbio_v6_1_init_registers(struct amdgpu_device *adev);
|
||||
extern const struct amdgpu_nbio_funcs nbio_v6_1_funcs;
|
||||
|
||||
#endif
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include "amdgpu_atombios.h"
|
||||
#include "nbio_v7_0.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "nbio/nbio_7_0_default.h"
|
||||
#include "nbio/nbio_7_0_offset.h"
|
||||
#include "nbio/nbio_7_0_sh_mask.h"
|
||||
@ -32,7 +31,10 @@
|
||||
|
||||
#define smnNBIF_MGCG_CTRL_LCLK 0x1013a05c
|
||||
|
||||
u32 nbio_v7_0_get_rev_id(struct amdgpu_device *adev)
|
||||
#define smnCPM_CONTROL 0x11180460
|
||||
#define smnPCIE_CNTL2 0x11180070
|
||||
|
||||
static u32 nbio_v7_0_get_rev_id(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 tmp = RREG32_SOC15(NBIO, 0, mmRCC_DEV0_EPF0_STRAP0);
|
||||
|
||||
@ -42,19 +44,7 @@ u32 nbio_v7_0_get_rev_id(struct amdgpu_device *adev)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
u32 nbio_v7_0_get_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx)
|
||||
{
|
||||
return RREG32_SOC15_OFFSET(NBIO, 0, mmBIOS_SCRATCH_0, idx);
|
||||
}
|
||||
|
||||
void nbio_v7_0_set_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx, uint32_t val)
|
||||
{
|
||||
WREG32_SOC15_OFFSET(NBIO, 0, mmBIOS_SCRATCH_0, idx, val);
|
||||
}
|
||||
|
||||
void nbio_v7_0_mc_access_enable(struct amdgpu_device *adev, bool enable)
|
||||
static void nbio_v7_0_mc_access_enable(struct amdgpu_device *adev, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
WREG32_SOC15(NBIO, 0, mmBIF_FB_EN,
|
||||
@ -63,26 +53,23 @@ void nbio_v7_0_mc_access_enable(struct amdgpu_device *adev, bool enable)
|
||||
WREG32_SOC15(NBIO, 0, mmBIF_FB_EN, 0);
|
||||
}
|
||||
|
||||
void nbio_v7_0_hdp_flush(struct amdgpu_device *adev)
|
||||
static void nbio_v7_0_hdp_flush(struct amdgpu_device *adev)
|
||||
{
|
||||
WREG32_SOC15_NO_KIQ(NBIO, 0, mmHDP_MEM_COHERENCY_FLUSH_CNTL, 0);
|
||||
}
|
||||
|
||||
u32 nbio_v7_0_get_memsize(struct amdgpu_device *adev)
|
||||
static u32 nbio_v7_0_get_memsize(struct amdgpu_device *adev)
|
||||
{
|
||||
return RREG32_SOC15(NBIO, 0, mmRCC_CONFIG_MEMSIZE);
|
||||
}
|
||||
|
||||
static const u32 nbio_sdma_doorbell_range_reg[] =
|
||||
static void nbio_v7_0_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
{
|
||||
SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA0_DOORBELL_RANGE),
|
||||
SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA1_DOORBELL_RANGE)
|
||||
};
|
||||
u32 reg = instance == 0 ? SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA0_DOORBELL_RANGE) :
|
||||
SOC15_REG_OFFSET(NBIO, 0, mmBIF_SDMA1_DOORBELL_RANGE);
|
||||
|
||||
void nbio_v7_0_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
{
|
||||
u32 doorbell_range = RREG32(nbio_sdma_doorbell_range_reg[instance]);
|
||||
u32 doorbell_range = RREG32(reg);
|
||||
|
||||
if (use_doorbell) {
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range, BIF_SDMA0_DOORBELL_RANGE, OFFSET, doorbell_index);
|
||||
@ -90,17 +77,23 @@ void nbio_v7_0_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
} else
|
||||
doorbell_range = REG_SET_FIELD(doorbell_range, BIF_SDMA0_DOORBELL_RANGE, SIZE, 0);
|
||||
|
||||
WREG32(nbio_sdma_doorbell_range_reg[instance], doorbell_range);
|
||||
WREG32(reg, doorbell_range);
|
||||
}
|
||||
|
||||
void nbio_v7_0_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
static void nbio_v7_0_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
WREG32_FIELD15(NBIO, 0, RCC_DOORBELL_APER_EN, BIF_DOORBELL_APER_EN, enable ? 1 : 0);
|
||||
}
|
||||
|
||||
void nbio_v7_0_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
static void nbio_v7_0_enable_doorbell_selfring_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void nbio_v7_0_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index)
|
||||
{
|
||||
u32 ih_doorbell_range = RREG32_SOC15(NBIO, 0 , mmBIF_IH_DOORBELL_RANGE);
|
||||
|
||||
@ -130,8 +123,8 @@ static void nbio_7_0_write_syshub_ind_mmr(struct amdgpu_device *adev, uint32_t o
|
||||
WREG32_SOC15(NBIO, 0, mmSYSHUB_DATA, data);
|
||||
}
|
||||
|
||||
void nbio_v7_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
static void nbio_v7_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
uint32_t def, data;
|
||||
|
||||
@ -169,7 +162,43 @@ void nbio_v7_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
nbio_7_0_write_syshub_ind_mmr(adev, ixSYSHUB_MMREG_IND_SYSHUB_MGCG_CTRL_SHUBCLK, data);
|
||||
}
|
||||
|
||||
void nbio_v7_0_ih_control(struct amdgpu_device *adev)
|
||||
static void nbio_v7_0_update_medium_grain_light_sleep(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
{
|
||||
uint32_t def, data;
|
||||
|
||||
def = data = RREG32_PCIE(smnPCIE_CNTL2);
|
||||
if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS)) {
|
||||
data |= (PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
|
||||
PCIE_CNTL2__MST_MEM_LS_EN_MASK |
|
||||
PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK);
|
||||
} else {
|
||||
data &= ~(PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
|
||||
PCIE_CNTL2__MST_MEM_LS_EN_MASK |
|
||||
PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK);
|
||||
}
|
||||
|
||||
if (def != data)
|
||||
WREG32_PCIE(smnPCIE_CNTL2, data);
|
||||
}
|
||||
|
||||
static void nbio_v7_0_get_clockgating_state(struct amdgpu_device *adev,
|
||||
u32 *flags)
|
||||
{
|
||||
int data;
|
||||
|
||||
/* AMD_CG_SUPPORT_BIF_MGCG */
|
||||
data = RREG32_PCIE(smnCPM_CONTROL);
|
||||
if (data & CPM_CONTROL__LCLK_DYN_GATE_ENABLE_MASK)
|
||||
*flags |= AMD_CG_SUPPORT_BIF_MGCG;
|
||||
|
||||
/* AMD_CG_SUPPORT_BIF_LS */
|
||||
data = RREG32_PCIE(smnPCIE_CNTL2);
|
||||
if (data & PCIE_CNTL2__SLV_MEM_LS_EN_MASK)
|
||||
*flags |= AMD_CG_SUPPORT_BIF_LS;
|
||||
}
|
||||
|
||||
static void nbio_v7_0_ih_control(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 interrupt_cntl;
|
||||
|
||||
@ -185,9 +214,27 @@ void nbio_v7_0_ih_control(struct amdgpu_device *adev)
|
||||
WREG32_SOC15(NBIO, 0, mmINTERRUPT_CNTL, interrupt_cntl);
|
||||
}
|
||||
|
||||
static u32 nbio_v7_0_get_hdp_flush_req_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmGPU_HDP_FLUSH_REQ);
|
||||
}
|
||||
|
||||
static u32 nbio_v7_0_get_hdp_flush_done_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmGPU_HDP_FLUSH_DONE);
|
||||
}
|
||||
|
||||
static u32 nbio_v7_0_get_pcie_index_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmPCIE_INDEX2);
|
||||
}
|
||||
|
||||
static u32 nbio_v7_0_get_pcie_data_offset(struct amdgpu_device *adev)
|
||||
{
|
||||
return SOC15_REG_OFFSET(NBIO, 0, mmPCIE_DATA2);
|
||||
}
|
||||
|
||||
const struct nbio_hdp_flush_reg nbio_v7_0_hdp_flush_reg = {
|
||||
.hdp_flush_req_offset = SOC15_REG_OFFSET(NBIO, 0, mmGPU_HDP_FLUSH_REQ),
|
||||
.hdp_flush_done_offset = SOC15_REG_OFFSET(NBIO, 0, mmGPU_HDP_FLUSH_DONE),
|
||||
.ref_and_mask_cp0 = GPU_HDP_FLUSH_DONE__CP0_MASK,
|
||||
.ref_and_mask_cp1 = GPU_HDP_FLUSH_DONE__CP1_MASK,
|
||||
.ref_and_mask_cp2 = GPU_HDP_FLUSH_DONE__CP2_MASK,
|
||||
@ -202,7 +249,35 @@ const struct nbio_hdp_flush_reg nbio_v7_0_hdp_flush_reg = {
|
||||
.ref_and_mask_sdma1 = GPU_HDP_FLUSH_DONE__SDMA1_MASK,
|
||||
};
|
||||
|
||||
const struct nbio_pcie_index_data nbio_v7_0_pcie_index_data = {
|
||||
.index_offset = SOC15_REG_OFFSET(NBIO, 0, mmPCIE_INDEX2),
|
||||
.data_offset = SOC15_REG_OFFSET(NBIO, 0, mmPCIE_DATA2)
|
||||
static void nbio_v7_0_detect_hw_virt(struct amdgpu_device *adev)
|
||||
{
|
||||
if (is_virtual_machine()) /* passthrough mode exclus sriov mod */
|
||||
adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE;
|
||||
}
|
||||
|
||||
static void nbio_v7_0_init_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const struct amdgpu_nbio_funcs nbio_v7_0_funcs = {
|
||||
.hdp_flush_reg = &nbio_v7_0_hdp_flush_reg,
|
||||
.get_hdp_flush_req_offset = nbio_v7_0_get_hdp_flush_req_offset,
|
||||
.get_hdp_flush_done_offset = nbio_v7_0_get_hdp_flush_done_offset,
|
||||
.get_pcie_index_offset = nbio_v7_0_get_pcie_index_offset,
|
||||
.get_pcie_data_offset = nbio_v7_0_get_pcie_data_offset,
|
||||
.get_rev_id = nbio_v7_0_get_rev_id,
|
||||
.mc_access_enable = nbio_v7_0_mc_access_enable,
|
||||
.hdp_flush = nbio_v7_0_hdp_flush,
|
||||
.get_memsize = nbio_v7_0_get_memsize,
|
||||
.sdma_doorbell_range = nbio_v7_0_sdma_doorbell_range,
|
||||
.enable_doorbell_aperture = nbio_v7_0_enable_doorbell_aperture,
|
||||
.enable_doorbell_selfring_aperture = nbio_v7_0_enable_doorbell_selfring_aperture,
|
||||
.ih_doorbell_range = nbio_v7_0_ih_doorbell_range,
|
||||
.update_medium_grain_clock_gating = nbio_v7_0_update_medium_grain_clock_gating,
|
||||
.update_medium_grain_light_sleep = nbio_v7_0_update_medium_grain_light_sleep,
|
||||
.get_clockgating_state = nbio_v7_0_get_clockgating_state,
|
||||
.ih_control = nbio_v7_0_ih_control,
|
||||
.init_registers = nbio_v7_0_init_registers,
|
||||
.detect_hw_virt = nbio_v7_0_detect_hw_virt,
|
||||
};
|
||||
|
@ -26,24 +26,6 @@
|
||||
|
||||
#include "soc15_common.h"
|
||||
|
||||
extern const struct nbio_hdp_flush_reg nbio_v7_0_hdp_flush_reg;
|
||||
extern const struct nbio_pcie_index_data nbio_v7_0_pcie_index_data;
|
||||
int nbio_v7_0_init(struct amdgpu_device *adev);
|
||||
u32 nbio_v7_0_get_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx);
|
||||
void nbio_v7_0_set_atombios_scratch_regs(struct amdgpu_device *adev,
|
||||
uint32_t idx, uint32_t val);
|
||||
void nbio_v7_0_mc_access_enable(struct amdgpu_device *adev, bool enable);
|
||||
void nbio_v7_0_hdp_flush(struct amdgpu_device *adev);
|
||||
u32 nbio_v7_0_get_memsize(struct amdgpu_device *adev);
|
||||
void nbio_v7_0_sdma_doorbell_range(struct amdgpu_device *adev, int instance,
|
||||
bool use_doorbell, int doorbell_index);
|
||||
void nbio_v7_0_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
void nbio_v7_0_ih_doorbell_range(struct amdgpu_device *adev,
|
||||
bool use_doorbell, int doorbell_index);
|
||||
void nbio_v7_0_ih_control(struct amdgpu_device *adev);
|
||||
u32 nbio_v7_0_get_rev_id(struct amdgpu_device *adev);
|
||||
void nbio_v7_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
|
||||
bool enable);
|
||||
extern const struct amdgpu_nbio_funcs nbio_v7_0_funcs;
|
||||
|
||||
#endif
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include "soc15_common.h"
|
||||
#include "psp_v10_0.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "mp/mp_10_0_offset.h"
|
||||
#include "gc/gc_9_1_offset.h"
|
||||
#include "sdma0/sdma0_4_1_offset.h"
|
||||
@ -298,9 +297,10 @@ int psp_v10_0_cmd_submit(struct psp_context *psp,
|
||||
}
|
||||
|
||||
static int
|
||||
psp_v10_0_sram_map(unsigned int *sram_offset, unsigned int *sram_addr_reg_offset,
|
||||
unsigned int *sram_data_reg_offset,
|
||||
enum AMDGPU_UCODE_ID ucode_id)
|
||||
psp_v10_0_sram_map(struct amdgpu_device *adev,
|
||||
unsigned int *sram_offset, unsigned int *sram_addr_reg_offset,
|
||||
unsigned int *sram_data_reg_offset,
|
||||
enum AMDGPU_UCODE_ID ucode_id)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -395,7 +395,7 @@ bool psp_v10_0_compare_sram_data(struct psp_context *psp,
|
||||
uint32_t *ucode_mem = NULL;
|
||||
struct amdgpu_device *adev = psp->adev;
|
||||
|
||||
err = psp_v10_0_sram_map(&fw_sram_reg_val, &fw_sram_addr_reg_offset,
|
||||
err = psp_v10_0_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset,
|
||||
&fw_sram_data_reg_offset, ucode_type);
|
||||
if (err)
|
||||
return false;
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include "soc15_common.h"
|
||||
#include "psp_v3_1.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "mp/mp_9_0_offset.h"
|
||||
#include "mp/mp_9_0_sh_mask.h"
|
||||
#include "gc/gc_9_0_offset.h"
|
||||
@ -410,9 +409,10 @@ int psp_v3_1_cmd_submit(struct psp_context *psp,
|
||||
}
|
||||
|
||||
static int
|
||||
psp_v3_1_sram_map(unsigned int *sram_offset, unsigned int *sram_addr_reg_offset,
|
||||
unsigned int *sram_data_reg_offset,
|
||||
enum AMDGPU_UCODE_ID ucode_id)
|
||||
psp_v3_1_sram_map(struct amdgpu_device *adev,
|
||||
unsigned int *sram_offset, unsigned int *sram_addr_reg_offset,
|
||||
unsigned int *sram_data_reg_offset,
|
||||
enum AMDGPU_UCODE_ID ucode_id)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -507,7 +507,7 @@ bool psp_v3_1_compare_sram_data(struct psp_context *psp,
|
||||
uint32_t *ucode_mem = NULL;
|
||||
struct amdgpu_device *adev = psp->adev;
|
||||
|
||||
err = psp_v3_1_sram_map(&fw_sram_reg_val, &fw_sram_addr_reg_offset,
|
||||
err = psp_v3_1_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset,
|
||||
&fw_sram_data_reg_offset, ucode_type);
|
||||
if (err)
|
||||
return false;
|
||||
|
@ -93,12 +93,12 @@ static void sdma_v2_4_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TOPAZ:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_iceland_a11,
|
||||
ARRAY_SIZE(golden_settings_iceland_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_iceland_a11,
|
||||
ARRAY_SIZE(golden_settings_iceland_a11));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -600,7 +600,7 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
|
||||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -613,7 +613,7 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
|
||||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -639,7 +639,7 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
|
||||
ring->idx, tmp);
|
||||
r = -EINVAL;
|
||||
}
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -662,7 +662,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -715,7 +715,7 @@ err1:
|
||||
amdgpu_ib_free(adev, &ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -192,47 +192,47 @@ static void sdma_v3_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_FIJI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_fiji_a10,
|
||||
ARRAY_SIZE(golden_settings_fiji_a10));
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_tonga_a11,
|
||||
ARRAY_SIZE(golden_settings_tonga_a11));
|
||||
break;
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_polaris11_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris11_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_polaris11_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris11_a11));
|
||||
break;
|
||||
case CHIP_POLARIS10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
golden_settings_polaris10_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris10_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
golden_settings_polaris10_a11,
|
||||
ARRAY_SIZE(golden_settings_polaris10_a11));
|
||||
break;
|
||||
case CHIP_CARRIZO:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_golden_settings_a11,
|
||||
ARRAY_SIZE(cz_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_golden_settings_a11,
|
||||
ARRAY_SIZE(cz_golden_settings_a11));
|
||||
break;
|
||||
case CHIP_STONEY:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_golden_settings_a11,
|
||||
ARRAY_SIZE(stoney_golden_settings_a11));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_golden_settings_a11,
|
||||
ARRAY_SIZE(stoney_golden_settings_a11));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -355,7 +355,7 @@ static uint64_t sdma_v3_0_ring_get_wptr(struct amdgpu_ring *ring)
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
u32 wptr;
|
||||
|
||||
if (ring->use_doorbell) {
|
||||
if (ring->use_doorbell || ring->use_pollmem) {
|
||||
/* XXX check if swapping is necessary on BE */
|
||||
wptr = ring->adev->wb.wb[ring->wptr_offs] >> 2;
|
||||
} else {
|
||||
@ -380,10 +380,13 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
|
||||
|
||||
if (ring->use_doorbell) {
|
||||
u32 *wb = (u32 *)&adev->wb.wb[ring->wptr_offs];
|
||||
|
||||
/* XXX check if swapping is necessary on BE */
|
||||
WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2));
|
||||
WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr) << 2);
|
||||
} else if (ring->use_pollmem) {
|
||||
u32 *wb = (u32 *)&adev->wb.wb[ring->wptr_offs];
|
||||
|
||||
WRITE_ONCE(*wb, (lower_32_bits(ring->wptr) << 2));
|
||||
} else {
|
||||
int me = (ring == &ring->adev->sdma.instance[0].ring) ? 0 : 1;
|
||||
|
||||
@ -718,10 +721,14 @@ static int sdma_v3_0_gfx_resume(struct amdgpu_device *adev)
|
||||
WREG32(mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI + sdma_offsets[i],
|
||||
upper_32_bits(wptr_gpu_addr));
|
||||
wptr_poll_cntl = RREG32(mmSDMA0_GFX_RB_WPTR_POLL_CNTL + sdma_offsets[i]);
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 1);
|
||||
if (ring->use_pollmem)
|
||||
wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
|
||||
SDMA0_GFX_RB_WPTR_POLL_CNTL,
|
||||
ENABLE, 1);
|
||||
else
|
||||
wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 0);
|
||||
wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
|
||||
SDMA0_GFX_RB_WPTR_POLL_CNTL,
|
||||
ENABLE, 0);
|
||||
WREG32(mmSDMA0_GFX_RB_WPTR_POLL_CNTL + sdma_offsets[i], wptr_poll_cntl);
|
||||
|
||||
/* enable DMA RB */
|
||||
@ -860,7 +867,7 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
|
||||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -873,7 +880,7 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
|
||||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -899,7 +906,7 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
|
||||
ring->idx, tmp);
|
||||
r = -EINVAL;
|
||||
}
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -922,7 +929,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -974,7 +981,7 @@ err1:
|
||||
amdgpu_ib_free(adev, &ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -1203,9 +1210,13 @@ static int sdma_v3_0_sw_init(void *handle)
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
ring = &adev->sdma.instance[i].ring;
|
||||
ring->ring_obj = NULL;
|
||||
ring->use_doorbell = true;
|
||||
ring->doorbell_index = (i == 0) ?
|
||||
AMDGPU_DOORBELL_sDMA_ENGINE0 : AMDGPU_DOORBELL_sDMA_ENGINE1;
|
||||
if (!amdgpu_sriov_vf(adev)) {
|
||||
ring->use_doorbell = true;
|
||||
ring->doorbell_index = (i == 0) ?
|
||||
AMDGPU_DOORBELL_sDMA_ENGINE0 : AMDGPU_DOORBELL_sDMA_ENGINE1;
|
||||
} else {
|
||||
ring->use_pollmem = true;
|
||||
}
|
||||
|
||||
sprintf(ring->name, "sdma%d", i);
|
||||
r = amdgpu_ring_init(adev, ring, 1024,
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include "amdgpu_ucode.h"
|
||||
#include "amdgpu_trace.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "sdma0/sdma0_4_0_offset.h"
|
||||
#include "sdma0/sdma0_4_0_sh_mask.h"
|
||||
#include "sdma1/sdma1_4_0_offset.h"
|
||||
@ -53,95 +52,83 @@ static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev);
|
||||
static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev);
|
||||
static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev);
|
||||
|
||||
static const u32 golden_settings_sdma_4[] = {
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CHICKEN_BITS), 0xfe931f07, 0x02831d07,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CLK_CTRL), 0xff000ff0, 0x3f000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GFX_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), 0xfffffff7, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_PAGE_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL), 0x003ff006, 0x0003c000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC0_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC1_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UTCL1_PAGE), 0x000003ff, 0x000003c0,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_CHICKEN_BITS), 0xfe931f07, 0x02831f07,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_CLK_CTRL), 0xffffffff, 0x3f000100,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_GFX_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_GFX_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_PAGE_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_PAGE_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_POWER_CNTL), 0x003ff000, 0x0003c000,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_RLC0_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_RLC0_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_RLC1_IB_CNTL), 0x800f0100, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_RLC1_RB_WPTR_POLL_CNTL), 0x0000fff0, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_UTCL1_PAGE), 0x000003ff, 0x000003c0
|
||||
static const struct soc15_reg_golden golden_settings_sdma_4[] = {
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831d07),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CLK_CTRL, 0xff000ff0, 0x3f000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GFX_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GFX_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_PAGE_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_POWER_CNTL, 0x003ff006, 0x0003c000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC0_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831f07),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CLK_CTRL, 0xffffffff, 0x3f000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GFX_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GFX_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_PAGE_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_PAGE_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_POWER_CNTL, 0x003ff000, 0x0003c000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC0_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC0_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC1_IB_CNTL, 0x800f0100, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC1_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_PAGE, 0x000003ff, 0x000003c0)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_sdma_vg10[] = {
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG), 0x0018773f, 0x00104002,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ), 0x0018773f, 0x00104002,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG), 0x0018773f, 0x00104002,
|
||||
SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ), 0x0018773f, 0x00104002
|
||||
static const struct soc15_reg_golden golden_settings_sdma_vg10[] = {
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0018773f, 0x00104002),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0018773f, 0x00104002),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_sdma_4_1[] =
|
||||
static const struct soc15_reg_golden golden_settings_sdma_4_1[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CHICKEN_BITS), 0xfe931f07, 0x02831d07,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_CLK_CTRL), 0xffffffff, 0x3f000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GFX_IB_CNTL), 0x800f0111, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), 0xfffffff7, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_POWER_CNTL), 0xfc3fffff, 0x40000051,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC0_IB_CNTL), 0x800f0111, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL), 0xfffffff7, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC1_IB_CNTL), 0x800f0111, 0x00000100,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL), 0xfffffff7, 0x00403000,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UTCL1_PAGE), 0x000003ff, 0x000003c0
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831d07),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CLK_CTRL, 0xffffffff, 0x3f000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GFX_IB_CNTL, 0x800f0111, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GFX_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_POWER_CNTL, 0xfc3fffff, 0x40000051),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC0_IB_CNTL, 0x800f0111, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_IB_CNTL, 0x800f0111, 0x00000100),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0)
|
||||
};
|
||||
|
||||
static const u32 golden_settings_sdma_rv1[] =
|
||||
static const struct soc15_reg_golden golden_settings_sdma_rv1[] =
|
||||
{
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG), 0x0018773f, 0x00000002,
|
||||
SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ), 0x0018773f, 0x00000002
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0018773f, 0x00000002),
|
||||
SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00000002)
|
||||
};
|
||||
|
||||
static u32 sdma_v4_0_get_reg_offset(u32 instance, u32 internal_offset)
|
||||
static u32 sdma_v4_0_get_reg_offset(struct amdgpu_device *adev,
|
||||
u32 instance, u32 offset)
|
||||
{
|
||||
u32 base = 0;
|
||||
|
||||
switch (instance) {
|
||||
case 0:
|
||||
base = SDMA0_BASE.instance[0].segment[0];
|
||||
break;
|
||||
case 1:
|
||||
base = SDMA1_BASE.instance[0].segment[0];
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
|
||||
return base + internal_offset;
|
||||
return ( 0 == instance ? (adev->reg_offset[SDMA0_HWIP][0][0] + offset) :
|
||||
(adev->reg_offset[SDMA1_HWIP][0][0] + offset));
|
||||
}
|
||||
|
||||
static void sdma_v4_0_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_sdma_4,
|
||||
ARRAY_SIZE(golden_settings_sdma_4));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_sdma_vg10,
|
||||
ARRAY_SIZE(golden_settings_sdma_vg10));
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_sdma_4_1,
|
||||
ARRAY_SIZE(golden_settings_sdma_4_1));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
soc15_program_register_sequence(adev,
|
||||
golden_settings_sdma_rv1,
|
||||
ARRAY_SIZE(golden_settings_sdma_rv1));
|
||||
break;
|
||||
@ -265,8 +252,8 @@ static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring)
|
||||
int me = (ring == &adev->sdma.instance[0].ring) ? 0 : 1;
|
||||
|
||||
wptr = &local_wptr;
|
||||
lowbit = RREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR)) >> 2;
|
||||
highbit = RREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2;
|
||||
lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR)) >> 2;
|
||||
highbit = RREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2;
|
||||
|
||||
DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n",
|
||||
me, highbit, lowbit);
|
||||
@ -315,8 +302,8 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring)
|
||||
lower_32_bits(ring->wptr << 2),
|
||||
me,
|
||||
upper_32_bits(ring->wptr << 2));
|
||||
WREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2));
|
||||
WREG32(sdma_v4_0_get_reg_offset(me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2));
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2));
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2));
|
||||
}
|
||||
}
|
||||
|
||||
@ -370,13 +357,9 @@ static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring,
|
||||
*/
|
||||
static void sdma_v4_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
u32 ref_and_mask = 0;
|
||||
const struct nbio_hdp_flush_reg *nbio_hf_reg;
|
||||
|
||||
if (ring->adev->flags & AMD_IS_APU)
|
||||
nbio_hf_reg = &nbio_v7_0_hdp_flush_reg;
|
||||
else
|
||||
nbio_hf_reg = &nbio_v6_1_hdp_flush_reg;
|
||||
const struct nbio_hdp_flush_reg *nbio_hf_reg = adev->nbio_funcs->hdp_flush_reg;
|
||||
|
||||
if (ring == &ring->adev->sdma.instance[0].ring)
|
||||
ref_and_mask = nbio_hf_reg->ref_and_mask_sdma0;
|
||||
@ -386,8 +369,8 @@ static void sdma_v4_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) |
|
||||
SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(1) |
|
||||
SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3)); /* == */
|
||||
amdgpu_ring_write(ring, nbio_hf_reg->hdp_flush_done_offset << 2);
|
||||
amdgpu_ring_write(ring, nbio_hf_reg->hdp_flush_req_offset << 2);
|
||||
amdgpu_ring_write(ring, (adev->nbio_funcs->get_hdp_flush_done_offset(adev)) << 2);
|
||||
amdgpu_ring_write(ring, (adev->nbio_funcs->get_hdp_flush_req_offset(adev)) << 2);
|
||||
amdgpu_ring_write(ring, ref_and_mask); /* reference */
|
||||
amdgpu_ring_write(ring, ref_and_mask); /* mask */
|
||||
amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) |
|
||||
@ -396,6 +379,8 @@ static void sdma_v4_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
|
||||
static void sdma_v4_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) |
|
||||
SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf));
|
||||
amdgpu_ring_write(ring, SOC15_REG_OFFSET(HDP, 0, mmHDP_READ_CACHE_INVALIDATE));
|
||||
@ -460,12 +445,12 @@ static void sdma_v4_0_gfx_stop(struct amdgpu_device *adev)
|
||||
amdgpu_ttm_set_active_vram_size(adev, adev->mc.visible_vram_size);
|
||||
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
rb_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_CNTL));
|
||||
rb_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL));
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
|
||||
ib_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_IB_CNTL));
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
|
||||
ib_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL));
|
||||
ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_IB_CNTL), ib_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl);
|
||||
}
|
||||
|
||||
sdma0->ready = false;
|
||||
@ -522,18 +507,18 @@ static void sdma_v4_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)
|
||||
}
|
||||
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
f32_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_CNTL));
|
||||
f32_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL));
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL,
|
||||
AUTO_CTXSW_ENABLE, enable ? 1 : 0);
|
||||
if (enable && amdgpu_sdma_phase_quantum) {
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_PHASE0_QUANTUM),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_PHASE0_QUANTUM),
|
||||
phase_quantum);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_PHASE1_QUANTUM),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_PHASE1_QUANTUM),
|
||||
phase_quantum);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_PHASE2_QUANTUM),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_PHASE2_QUANTUM),
|
||||
phase_quantum);
|
||||
}
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_CNTL), f32_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL), f32_cntl);
|
||||
}
|
||||
|
||||
}
|
||||
@ -557,9 +542,9 @@ static void sdma_v4_0_enable(struct amdgpu_device *adev, bool enable)
|
||||
}
|
||||
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
f32_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_F32_CNTL));
|
||||
f32_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL));
|
||||
f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, enable ? 0 : 1);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_F32_CNTL), f32_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL), f32_cntl);
|
||||
}
|
||||
}
|
||||
|
||||
@ -587,48 +572,48 @@ static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev)
|
||||
ring = &adev->sdma.instance[i].ring;
|
||||
wb_offset = (ring->rptr_offs * 4);
|
||||
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL), 0);
|
||||
|
||||
/* Set ring buffer size in dwords */
|
||||
rb_bufsz = order_base_2(ring->ring_size / 4);
|
||||
rb_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_CNTL));
|
||||
rb_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL));
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SIZE, rb_bufsz);
|
||||
#ifdef __BIG_ENDIAN
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SWAP_ENABLE, 1);
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL,
|
||||
RPTR_WRITEBACK_SWAP_ENABLE, 1);
|
||||
#endif
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
|
||||
|
||||
/* Initialize the ring buffer's read and write pointers */
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_RPTR), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_RPTR_HI), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR_HI), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_HI), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), 0);
|
||||
|
||||
/* set the wb address whether it's enabled or not */
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_RPTR_ADDR_HI),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_HI),
|
||||
upper_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_RPTR_ADDR_LO),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_LO),
|
||||
lower_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC);
|
||||
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1);
|
||||
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_BASE), ring->gpu_addr >> 8);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_BASE_HI), ring->gpu_addr >> 40);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE), ring->gpu_addr >> 8);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE_HI), ring->gpu_addr >> 40);
|
||||
|
||||
ring->wptr = 0;
|
||||
|
||||
/* before programing wptr to a less value, need set minor_ptr_update first */
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 1);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 1);
|
||||
|
||||
if (!amdgpu_sriov_vf(adev)) { /* only bare-metal use register write for wptr */
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr) << 2);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr) << 2);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr) << 2);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr) << 2);
|
||||
}
|
||||
|
||||
doorbell = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL));
|
||||
doorbell_offset = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL_OFFSET));
|
||||
doorbell = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL));
|
||||
doorbell_offset = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET));
|
||||
|
||||
if (ring->use_doorbell) {
|
||||
doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 1);
|
||||
@ -637,55 +622,53 @@ static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev)
|
||||
} else {
|
||||
doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 0);
|
||||
}
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL), doorbell);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_DOORBELL_OFFSET), doorbell_offset);
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_v7_0_sdma_doorbell_range(adev, i, ring->use_doorbell, ring->doorbell_index);
|
||||
else
|
||||
nbio_v6_1_sdma_doorbell_range(adev, i, ring->use_doorbell, ring->doorbell_index);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL), doorbell);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET), doorbell_offset);
|
||||
adev->nbio_funcs->sdma_doorbell_range(adev, i, ring->use_doorbell,
|
||||
ring->doorbell_index);
|
||||
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
sdma_v4_0_ring_set_wptr(ring);
|
||||
|
||||
/* set minor_ptr_update to 0 after wptr programed */
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 0);
|
||||
|
||||
/* set utc l1 enable flag always to 1 */
|
||||
temp = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_CNTL));
|
||||
temp = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL));
|
||||
temp = REG_SET_FIELD(temp, SDMA0_CNTL, UTC_L1_ENABLE, 1);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_CNTL), temp);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL), temp);
|
||||
|
||||
if (!amdgpu_sriov_vf(adev)) {
|
||||
/* unhalt engine */
|
||||
temp = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_F32_CNTL));
|
||||
temp = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL));
|
||||
temp = REG_SET_FIELD(temp, SDMA0_F32_CNTL, HALT, 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_F32_CNTL), temp);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL), temp);
|
||||
}
|
||||
|
||||
/* setup the wptr shadow polling */
|
||||
wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO),
|
||||
lower_32_bits(wptr_gpu_addr));
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI),
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI),
|
||||
upper_32_bits(wptr_gpu_addr));
|
||||
wptr_poll_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL));
|
||||
wptr_poll_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL));
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 1);
|
||||
else
|
||||
wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), wptr_poll_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), wptr_poll_cntl);
|
||||
|
||||
/* enable DMA RB */
|
||||
rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 1);
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
|
||||
|
||||
ib_cntl = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_IB_CNTL));
|
||||
ib_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL));
|
||||
ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 1);
|
||||
#ifdef __BIG_ENDIAN
|
||||
ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_SWAP_ENABLE, 1);
|
||||
#endif
|
||||
/* enable DMA IBs */
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_GFX_IB_CNTL), ib_cntl);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl);
|
||||
|
||||
ring->ready = true;
|
||||
|
||||
@ -816,12 +799,12 @@ static int sdma_v4_0_load_microcode(struct amdgpu_device *adev)
|
||||
(adev->sdma.instance[i].fw->data +
|
||||
le32_to_cpu(hdr->header.ucode_array_offset_bytes));
|
||||
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_ADDR), 0);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_UCODE_ADDR), 0);
|
||||
|
||||
for (j = 0; j < fw_size; j++)
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_DATA), le32_to_cpup(fw_data++));
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_UCODE_DATA), le32_to_cpup(fw_data++));
|
||||
|
||||
WREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_UCODE_ADDR), adev->sdma.instance[i].fw_version);
|
||||
WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_UCODE_ADDR), adev->sdma.instance[i].fw_version);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -886,7 +869,7 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
|
||||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -899,7 +882,7 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
|
||||
r = amdgpu_ring_alloc(ring, 5);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -925,7 +908,7 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
|
||||
ring->idx, tmp);
|
||||
r = -EINVAL;
|
||||
}
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -948,7 +931,7 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
u32 tmp = 0;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -1000,7 +983,7 @@ err1:
|
||||
amdgpu_ib_free(adev, &ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -1156,10 +1139,11 @@ static void sdma_v4_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_SRBM_WRITE) |
|
||||
SDMA_PKT_SRBM_WRITE_HEADER_BYTE_EN(0xf));
|
||||
@ -1317,7 +1301,7 @@ static bool sdma_v4_0_is_idle(void *handle)
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
u32 tmp = RREG32(sdma_v4_0_get_reg_offset(i, mmSDMA0_STATUS_REG));
|
||||
u32 tmp = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_STATUS_REG));
|
||||
|
||||
if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK))
|
||||
return false;
|
||||
@ -1333,8 +1317,8 @@ static int sdma_v4_0_wait_for_idle(void *handle)
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
for (i = 0; i < adev->usec_timeout; i++) {
|
||||
sdma0 = RREG32(sdma_v4_0_get_reg_offset(0, mmSDMA0_STATUS_REG));
|
||||
sdma1 = RREG32(sdma_v4_0_get_reg_offset(1, mmSDMA0_STATUS_REG));
|
||||
sdma0 = RREG32(sdma_v4_0_get_reg_offset(adev, 0, mmSDMA0_STATUS_REG));
|
||||
sdma1 = RREG32(sdma_v4_0_get_reg_offset(adev, 1, mmSDMA0_STATUS_REG));
|
||||
|
||||
if (sdma0 & sdma1 & SDMA0_STATUS_REG__IDLE_MASK)
|
||||
return 0;
|
||||
@ -1358,8 +1342,8 @@ static int sdma_v4_0_set_trap_irq_state(struct amdgpu_device *adev,
|
||||
u32 sdma_cntl;
|
||||
|
||||
u32 reg_offset = (type == AMDGPU_SDMA_IRQ_TRAP0) ?
|
||||
sdma_v4_0_get_reg_offset(0, mmSDMA0_CNTL) :
|
||||
sdma_v4_0_get_reg_offset(1, mmSDMA0_CNTL);
|
||||
sdma_v4_0_get_reg_offset(adev, 0, mmSDMA0_CNTL) :
|
||||
sdma_v4_0_get_reg_offset(adev, 1, mmSDMA0_CNTL);
|
||||
|
||||
sdma_cntl = RREG32(reg_offset);
|
||||
sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE,
|
||||
|
@ -1390,65 +1390,65 @@ static void si_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TAHITI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tahiti_golden_registers,
|
||||
ARRAY_SIZE(tahiti_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tahiti_golden_rlc_registers,
|
||||
ARRAY_SIZE(tahiti_golden_rlc_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tahiti_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tahiti_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tahiti_golden_registers2,
|
||||
ARRAY_SIZE(tahiti_golden_registers2));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tahiti_golden_registers,
|
||||
ARRAY_SIZE(tahiti_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tahiti_golden_rlc_registers,
|
||||
ARRAY_SIZE(tahiti_golden_rlc_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tahiti_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tahiti_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tahiti_golden_registers2,
|
||||
ARRAY_SIZE(tahiti_golden_registers2));
|
||||
break;
|
||||
case CHIP_PITCAIRN:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
pitcairn_golden_registers,
|
||||
ARRAY_SIZE(pitcairn_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
pitcairn_golden_rlc_registers,
|
||||
ARRAY_SIZE(pitcairn_golden_rlc_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
pitcairn_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
pitcairn_golden_registers,
|
||||
ARRAY_SIZE(pitcairn_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
pitcairn_golden_rlc_registers,
|
||||
ARRAY_SIZE(pitcairn_golden_rlc_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
pitcairn_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(pitcairn_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_VERDE:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
verde_golden_registers,
|
||||
ARRAY_SIZE(verde_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
verde_golden_rlc_registers,
|
||||
ARRAY_SIZE(verde_golden_rlc_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
verde_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(verde_mgcg_cgcg_init));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
verde_pg_init,
|
||||
ARRAY_SIZE(verde_pg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
verde_golden_registers,
|
||||
ARRAY_SIZE(verde_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
verde_golden_rlc_registers,
|
||||
ARRAY_SIZE(verde_golden_rlc_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
verde_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(verde_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
verde_pg_init,
|
||||
ARRAY_SIZE(verde_pg_init));
|
||||
break;
|
||||
case CHIP_OLAND:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
oland_golden_registers,
|
||||
ARRAY_SIZE(oland_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
oland_golden_rlc_registers,
|
||||
ARRAY_SIZE(oland_golden_rlc_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
oland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(oland_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
oland_golden_registers,
|
||||
ARRAY_SIZE(oland_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
oland_golden_rlc_registers,
|
||||
ARRAY_SIZE(oland_golden_rlc_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
oland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(oland_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_HAINAN:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hainan_golden_registers,
|
||||
ARRAY_SIZE(hainan_golden_registers));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hainan_golden_registers2,
|
||||
ARRAY_SIZE(hainan_golden_registers2));
|
||||
amdgpu_program_register_sequence(adev,
|
||||
hainan_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(hainan_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hainan_golden_registers,
|
||||
ARRAY_SIZE(hainan_golden_registers));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hainan_golden_registers2,
|
||||
ARRAY_SIZE(hainan_golden_registers2));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
hainan_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(hainan_mgcg_cgcg_init));
|
||||
break;
|
||||
|
||||
|
||||
@ -1959,42 +1959,42 @@ int si_set_ip_blocks(struct amdgpu_device *adev)
|
||||
case CHIP_VERDE:
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
amdgpu_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &si_dma_ip_block);
|
||||
/* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
|
||||
/* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
|
||||
amdgpu_device_ip_block_add(adev, &dce_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
|
||||
/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
|
||||
/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
|
||||
break;
|
||||
case CHIP_OLAND:
|
||||
amdgpu_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v6_4_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &si_dma_ip_block);
|
||||
/* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */
|
||||
/* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */
|
||||
amdgpu_device_ip_block_add(adev, &dce_v6_4_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
|
||||
/* amdgpu_device_ip_block_add(adev, &uvd_v3_1_ip_block); */
|
||||
/* amdgpu_device_ip_block_add(adev, &vce_v1_0_ip_block); */
|
||||
break;
|
||||
case CHIP_HAINAN:
|
||||
amdgpu_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &si_dma_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &si_dma_ip_block);
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
|
@ -221,7 +221,7 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
|
||||
u32 tmp;
|
||||
u64 gpu_addr;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -234,7 +234,7 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
|
||||
r = amdgpu_ring_alloc(ring, 4);
|
||||
if (r) {
|
||||
DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r);
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -258,7 +258,7 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
|
||||
ring->idx, tmp);
|
||||
r = -EINVAL;
|
||||
}
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -281,7 +281,7 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
|
||||
u64 gpu_addr;
|
||||
long r;
|
||||
|
||||
r = amdgpu_wb_get(adev, &index);
|
||||
r = amdgpu_device_wb_get(adev, &index);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
|
||||
return r;
|
||||
@ -328,7 +328,7 @@ err1:
|
||||
amdgpu_ib_free(adev, &ib, NULL);
|
||||
dma_fence_put(f);
|
||||
err0:
|
||||
amdgpu_wb_free(adev, index);
|
||||
amdgpu_device_wb_free(adev, index);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include "atom.h"
|
||||
#include "amd_pcie.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "uvd/uvd_7_0_offset.h"
|
||||
#include "gc/gc_9_0_offset.h"
|
||||
#include "gc/gc_9_0_sh_mask.h"
|
||||
@ -101,15 +100,8 @@ static u32 soc15_pcie_rreg(struct amdgpu_device *adev, u32 reg)
|
||||
{
|
||||
unsigned long flags, address, data;
|
||||
u32 r;
|
||||
const struct nbio_pcie_index_data *nbio_pcie_id;
|
||||
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_pcie_id = &nbio_v7_0_pcie_index_data;
|
||||
else
|
||||
nbio_pcie_id = &nbio_v6_1_pcie_index_data;
|
||||
|
||||
address = nbio_pcie_id->index_offset;
|
||||
data = nbio_pcie_id->data_offset;
|
||||
address = adev->nbio_funcs->get_pcie_index_offset(adev);
|
||||
data = adev->nbio_funcs->get_pcie_data_offset(adev);
|
||||
|
||||
spin_lock_irqsave(&adev->pcie_idx_lock, flags);
|
||||
WREG32(address, reg);
|
||||
@ -122,15 +114,9 @@ static u32 soc15_pcie_rreg(struct amdgpu_device *adev, u32 reg)
|
||||
static void soc15_pcie_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
|
||||
{
|
||||
unsigned long flags, address, data;
|
||||
const struct nbio_pcie_index_data *nbio_pcie_id;
|
||||
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_pcie_id = &nbio_v7_0_pcie_index_data;
|
||||
else
|
||||
nbio_pcie_id = &nbio_v6_1_pcie_index_data;
|
||||
|
||||
address = nbio_pcie_id->index_offset;
|
||||
data = nbio_pcie_id->data_offset;
|
||||
address = adev->nbio_funcs->get_pcie_index_offset(adev);
|
||||
data = adev->nbio_funcs->get_pcie_data_offset(adev);
|
||||
|
||||
spin_lock_irqsave(&adev->pcie_idx_lock, flags);
|
||||
WREG32(address, reg);
|
||||
@ -242,41 +228,9 @@ static void soc15_se_cac_wreg(struct amdgpu_device *adev, u32 reg, u32 v)
|
||||
|
||||
static u32 soc15_get_config_memsize(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
return nbio_v7_0_get_memsize(adev);
|
||||
else
|
||||
return nbio_v6_1_get_memsize(adev);
|
||||
return adev->nbio_funcs->get_memsize(adev);
|
||||
}
|
||||
|
||||
static const u32 vega10_golden_init[] =
|
||||
{
|
||||
};
|
||||
|
||||
static const u32 raven_golden_init[] =
|
||||
{
|
||||
};
|
||||
|
||||
static void soc15_init_golden_registers(struct amdgpu_device *adev)
|
||||
{
|
||||
/* Some of the registers might be dependent on GRBM_GFX_INDEX */
|
||||
mutex_lock(&adev->grbm_idx_mutex);
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
vega10_golden_init,
|
||||
ARRAY_SIZE(vega10_golden_init));
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
raven_golden_init,
|
||||
ARRAY_SIZE(raven_golden_init));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&adev->grbm_idx_mutex);
|
||||
}
|
||||
static u32 soc15_get_xclk(struct amdgpu_device *adev)
|
||||
{
|
||||
return adev->clock.spll.reference_freq;
|
||||
@ -332,25 +286,34 @@ static bool soc15_read_bios_from_rom(struct amdgpu_device *adev,
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct amdgpu_allowed_register_entry soc15_allowed_read_registers[] = {
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS2)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE0)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE1)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE2)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGRBM_STATUS_SE3)},
|
||||
{ SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_STATUS_REG)},
|
||||
{ SOC15_REG_OFFSET(SDMA1, 0, mmSDMA1_STATUS_REG)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_STAT)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_STALLED_STAT1)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_STALLED_STAT2)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_STALLED_STAT3)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_CPF_BUSY_STAT)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_CPF_STALLED_STAT1)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_CPF_STATUS)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_CPC_STALLED_STAT1)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmCP_CPC_STATUS)},
|
||||
{ SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG)},
|
||||
struct soc15_allowed_register_entry {
|
||||
uint32_t hwip;
|
||||
uint32_t inst;
|
||||
uint32_t seg;
|
||||
uint32_t reg_offset;
|
||||
bool grbm_indexed;
|
||||
};
|
||||
|
||||
|
||||
static struct soc15_allowed_register_entry soc15_allowed_read_registers[] = {
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS2)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE0)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE1)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE2)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGRBM_STATUS_SE3)},
|
||||
{ SOC15_REG_ENTRY(SDMA0, 0, mmSDMA0_STATUS_REG)},
|
||||
{ SOC15_REG_ENTRY(SDMA1, 0, mmSDMA1_STATUS_REG)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_STAT)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT1)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT2)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_STALLED_STAT3)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_CPF_BUSY_STAT)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_CPF_STALLED_STAT1)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_CPF_STATUS)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STALLED_STAT1)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmCP_CPC_STATUS)},
|
||||
{ SOC15_REG_ENTRY(GC, 0, mmGB_ADDR_CONFIG)},
|
||||
};
|
||||
|
||||
static uint32_t soc15_read_indexed_register(struct amdgpu_device *adev, u32 se_num,
|
||||
@ -377,12 +340,9 @@ static uint32_t soc15_get_register_value(struct amdgpu_device *adev,
|
||||
if (indexed) {
|
||||
return soc15_read_indexed_register(adev, se_num, sh_num, reg_offset);
|
||||
} else {
|
||||
switch (reg_offset) {
|
||||
case SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG):
|
||||
if (reg_offset == SOC15_REG_OFFSET(GC, 0, mmGB_ADDR_CONFIG))
|
||||
return adev->gfx.config.gb_addr_config;
|
||||
default:
|
||||
return RREG32(reg_offset);
|
||||
}
|
||||
return RREG32(reg_offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -390,10 +350,13 @@ static int soc15_read_register(struct amdgpu_device *adev, u32 se_num,
|
||||
u32 sh_num, u32 reg_offset, u32 *value)
|
||||
{
|
||||
uint32_t i;
|
||||
struct soc15_allowed_register_entry *en;
|
||||
|
||||
*value = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(soc15_allowed_read_registers); i++) {
|
||||
if (reg_offset != soc15_allowed_read_registers[i].reg_offset)
|
||||
en = &soc15_allowed_read_registers[i];
|
||||
if (reg_offset != (adev->reg_offset[en->hwip][en->inst][en->seg]
|
||||
+ en->reg_offset))
|
||||
continue;
|
||||
|
||||
*value = soc15_get_register_value(adev,
|
||||
@ -404,6 +367,43 @@ static int soc15_read_register(struct amdgpu_device *adev, u32 se_num,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* soc15_program_register_sequence - program an array of registers.
|
||||
*
|
||||
* @adev: amdgpu_device pointer
|
||||
* @regs: pointer to the register array
|
||||
* @array_size: size of the register array
|
||||
*
|
||||
* Programs an array or registers with and and or masks.
|
||||
* This is a helper for setting golden registers.
|
||||
*/
|
||||
|
||||
void soc15_program_register_sequence(struct amdgpu_device *adev,
|
||||
const struct soc15_reg_golden *regs,
|
||||
const u32 array_size)
|
||||
{
|
||||
const struct soc15_reg_golden *entry;
|
||||
u32 tmp, reg;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < array_size; ++i) {
|
||||
entry = ®s[i];
|
||||
reg = adev->reg_offset[entry->hwip][entry->instance][entry->segment] + entry->reg;
|
||||
|
||||
if (entry->and_mask == 0xffffffff) {
|
||||
tmp = entry->or_mask;
|
||||
} else {
|
||||
tmp = RREG32(reg);
|
||||
tmp &= ~(entry->and_mask);
|
||||
tmp |= entry->or_mask;
|
||||
}
|
||||
WREG32(reg, tmp);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int soc15_asic_reset(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 i;
|
||||
@ -428,9 +428,8 @@ static int soc15_asic_reset(struct amdgpu_device *adev)
|
||||
|
||||
/* wait for asic to come out of reset */
|
||||
for (i = 0; i < adev->usec_timeout; i++) {
|
||||
u32 memsize = (adev->flags & AMD_IS_APU) ?
|
||||
nbio_v7_0_get_memsize(adev) :
|
||||
nbio_v6_1_get_memsize(adev);
|
||||
u32 memsize = adev->nbio_funcs->get_memsize(adev);
|
||||
|
||||
if (memsize != 0xffffffff)
|
||||
break;
|
||||
udelay(1);
|
||||
@ -495,14 +494,10 @@ static void soc15_program_aspm(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
static void soc15_enable_doorbell_aperture(struct amdgpu_device *adev,
|
||||
bool enable)
|
||||
bool enable)
|
||||
{
|
||||
if (adev->flags & AMD_IS_APU) {
|
||||
nbio_v7_0_enable_doorbell_aperture(adev, enable);
|
||||
} else {
|
||||
nbio_v6_1_enable_doorbell_aperture(adev, enable);
|
||||
nbio_v6_1_enable_doorbell_selfring_aperture(adev, enable);
|
||||
}
|
||||
adev->nbio_funcs->enable_doorbell_aperture(adev, enable);
|
||||
adev->nbio_funcs->enable_doorbell_selfring_aperture(adev, enable);
|
||||
}
|
||||
|
||||
static const struct amdgpu_ip_block_version vega10_common_ip_block =
|
||||
@ -516,50 +511,65 @@ static const struct amdgpu_ip_block_version vega10_common_ip_block =
|
||||
|
||||
int soc15_set_ip_blocks(struct amdgpu_device *adev)
|
||||
{
|
||||
nbio_v6_1_detect_hw_virt(adev);
|
||||
/* Set IP register base before any HW register access */
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
case CHIP_RAVEN:
|
||||
vega10_reg_base_init(adev);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
adev->nbio_funcs = &nbio_v7_0_funcs;
|
||||
else
|
||||
adev->nbio_funcs = &nbio_v6_1_funcs;
|
||||
|
||||
adev->nbio_funcs->detect_hw_virt(adev);
|
||||
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
adev->virt.ops = &xgpu_ai_virt_ops;
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
amdgpu_ip_block_add(adev, &vega10_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v9_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vega10_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vega10_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v9_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block);
|
||||
if (amdgpu_fw_load_type == 2 || amdgpu_fw_load_type == -1)
|
||||
amdgpu_ip_block_add(adev, &psp_v3_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &psp_v3_1_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev))
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#else
|
||||
# warning "Enable CONFIG_DRM_AMD_DC for display support on SOC15."
|
||||
#endif
|
||||
amdgpu_ip_block_add(adev, &gfx_v9_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v4_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v7_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v4_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v9_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v4_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v7_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v4_0_ip_block);
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
amdgpu_ip_block_add(adev, &vega10_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v9_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vega10_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &psp_v10_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vega10_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v9_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vega10_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &psp_v10_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#else
|
||||
# warning "Enable CONFIG_DRM_AMD_DC for display support on SOC15."
|
||||
#endif
|
||||
amdgpu_ip_block_add(adev, &gfx_v9_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v4_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vcn_v1_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v9_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v4_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vcn_v1_0_ip_block);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@ -570,10 +580,7 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev)
|
||||
|
||||
static uint32_t soc15_get_rev_id(struct amdgpu_device *adev)
|
||||
{
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
return nbio_v7_0_get_rev_id(adev);
|
||||
else
|
||||
return nbio_v6_1_get_rev_id(adev);
|
||||
return adev->nbio_funcs->get_rev_id(adev);
|
||||
}
|
||||
|
||||
static const struct amdgpu_asic_funcs soc15_asic_funcs =
|
||||
@ -609,8 +616,8 @@ static int soc15_common_early_init(void *handle)
|
||||
|
||||
adev->asic_funcs = &soc15_asic_funcs;
|
||||
|
||||
if (amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_PSP) &&
|
||||
(amdgpu_ip_block_mask & (1 << AMD_IP_BLOCK_TYPE_PSP)))
|
||||
if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_PSP) &&
|
||||
(amdgpu_ip_block_mask & (1 << AMD_IP_BLOCK_TYPE_PSP)))
|
||||
psp_enabled = true;
|
||||
|
||||
adev->rev_id = soc15_get_rev_id(adev);
|
||||
@ -675,7 +682,7 @@ static int soc15_common_early_init(void *handle)
|
||||
|
||||
adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
|
||||
|
||||
amdgpu_get_pcie_info(adev);
|
||||
amdgpu_device_get_pcie_info(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -709,15 +716,12 @@ static int soc15_common_hw_init(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
/* move the golden regs per IP block */
|
||||
soc15_init_golden_registers(adev);
|
||||
/* enable pcie gen2/3 link */
|
||||
soc15_pcie_gen3_enable(adev);
|
||||
/* enable aspm */
|
||||
soc15_program_aspm(adev);
|
||||
/* setup nbio registers */
|
||||
if (!(adev->flags & AMD_IS_APU))
|
||||
nbio_v6_1_init_registers(adev);
|
||||
adev->nbio_funcs->init_registers(adev);
|
||||
/* enable the doorbell aperture */
|
||||
soc15_enable_doorbell_aperture(adev, true);
|
||||
|
||||
@ -878,9 +882,9 @@ static int soc15_common_set_clockgating_state(void *handle,
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_VEGA10:
|
||||
nbio_v6_1_update_medium_grain_clock_gating(adev,
|
||||
adev->nbio_funcs->update_medium_grain_clock_gating(adev,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
nbio_v6_1_update_medium_grain_light_sleep(adev,
|
||||
adev->nbio_funcs->update_medium_grain_light_sleep(adev,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
soc15_update_hdp_light_sleep(adev,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
@ -894,9 +898,9 @@ static int soc15_common_set_clockgating_state(void *handle,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
break;
|
||||
case CHIP_RAVEN:
|
||||
nbio_v7_0_update_medium_grain_clock_gating(adev,
|
||||
adev->nbio_funcs->update_medium_grain_clock_gating(adev,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
nbio_v6_1_update_medium_grain_light_sleep(adev,
|
||||
adev->nbio_funcs->update_medium_grain_light_sleep(adev,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
soc15_update_hdp_light_sleep(adev,
|
||||
state == AMD_CG_STATE_GATE ? true : false);
|
||||
@ -921,7 +925,7 @@ static void soc15_common_get_clockgating_state(void *handle, u32 *flags)
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
*flags = 0;
|
||||
|
||||
nbio_v6_1_get_clockgating_state(adev, flags);
|
||||
adev->nbio_funcs->get_clockgating_state(adev, flags);
|
||||
|
||||
/* AMD_CG_SUPPORT_HDP_LS */
|
||||
data = RREG32(SOC15_REG_OFFSET(HDP, 0, mmHDP_MEM_POWER_LS));
|
||||
|
@ -29,8 +29,28 @@
|
||||
|
||||
extern const struct amd_ip_funcs soc15_common_ip_funcs;
|
||||
|
||||
struct soc15_reg_golden {
|
||||
u32 hwip;
|
||||
u32 instance;
|
||||
u32 segment;
|
||||
u32 reg;
|
||||
u32 and_mask;
|
||||
u32 or_mask;
|
||||
};
|
||||
|
||||
#define SOC15_REG_ENTRY(ip, inst, reg) ip##_HWIP, inst, reg##_BASE_IDX, reg
|
||||
|
||||
#define SOC15_REG_GOLDEN_VALUE(ip, inst, reg, and_mask, or_mask) \
|
||||
{ ip##_HWIP, inst, reg##_BASE_IDX, reg, and_mask, or_mask }
|
||||
|
||||
void soc15_grbm_select(struct amdgpu_device *adev,
|
||||
u32 me, u32 pipe, u32 queue, u32 vmid);
|
||||
int soc15_set_ip_blocks(struct amdgpu_device *adev);
|
||||
|
||||
void soc15_program_register_sequence(struct amdgpu_device *adev,
|
||||
const struct soc15_reg_golden *registers,
|
||||
const u32 array_size);
|
||||
|
||||
int vega10_reg_base_init(struct amdgpu_device *adev);
|
||||
|
||||
#endif
|
||||
|
@ -24,72 +24,28 @@
|
||||
#ifndef __SOC15_COMMON_H__
|
||||
#define __SOC15_COMMON_H__
|
||||
|
||||
struct nbio_hdp_flush_reg {
|
||||
u32 hdp_flush_req_offset;
|
||||
u32 hdp_flush_done_offset;
|
||||
u32 ref_and_mask_cp0;
|
||||
u32 ref_and_mask_cp1;
|
||||
u32 ref_and_mask_cp2;
|
||||
u32 ref_and_mask_cp3;
|
||||
u32 ref_and_mask_cp4;
|
||||
u32 ref_and_mask_cp5;
|
||||
u32 ref_and_mask_cp6;
|
||||
u32 ref_and_mask_cp7;
|
||||
u32 ref_and_mask_cp8;
|
||||
u32 ref_and_mask_cp9;
|
||||
u32 ref_and_mask_sdma0;
|
||||
u32 ref_and_mask_sdma1;
|
||||
};
|
||||
|
||||
struct nbio_pcie_index_data {
|
||||
u32 index_offset;
|
||||
u32 data_offset;
|
||||
};
|
||||
|
||||
/* Register Access Macros */
|
||||
#define SOC15_REG_OFFSET(ip, inst, reg) (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
|
||||
(1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
|
||||
(2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
|
||||
(3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
|
||||
(ip##_BASE__INST##inst##_SEG4 + reg)))))
|
||||
#define SOC15_REG_OFFSET(ip, inst, reg) (adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg)
|
||||
|
||||
#define WREG32_FIELD15(ip, idx, reg, field, val) \
|
||||
WREG32(SOC15_REG_OFFSET(ip, idx, mm##reg), (RREG32(SOC15_REG_OFFSET(ip, idx, mm##reg)) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
|
||||
WREG32(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg, \
|
||||
(RREG32(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg) \
|
||||
& ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field))
|
||||
|
||||
#define RREG32_SOC15(ip, inst, reg) \
|
||||
RREG32( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
|
||||
(1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
|
||||
(2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
|
||||
(3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
|
||||
(ip##_BASE__INST##inst##_SEG4 + reg))))))
|
||||
RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg)
|
||||
|
||||
#define RREG32_SOC15_OFFSET(ip, inst, reg, offset) \
|
||||
RREG32( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
|
||||
(1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
|
||||
(2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
|
||||
(3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
|
||||
(ip##_BASE__INST##inst##_SEG4 + reg))))) + offset)
|
||||
RREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset)
|
||||
|
||||
#define WREG32_SOC15(ip, inst, reg, value) \
|
||||
WREG32( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
|
||||
(1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
|
||||
(2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
|
||||
(3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
|
||||
(ip##_BASE__INST##inst##_SEG4 + reg))))), value)
|
||||
WREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), value)
|
||||
|
||||
#define WREG32_SOC15_NO_KIQ(ip, inst, reg, value) \
|
||||
WREG32_NO_KIQ( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
|
||||
(1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
|
||||
(2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
|
||||
(3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
|
||||
(ip##_BASE__INST##inst##_SEG4 + reg))))), value)
|
||||
WREG32_NO_KIQ((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), value)
|
||||
|
||||
#define WREG32_SOC15_OFFSET(ip, inst, reg, offset, value) \
|
||||
WREG32( (0 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG0 + reg : \
|
||||
(1 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG1 + reg : \
|
||||
(2 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG2 + reg : \
|
||||
(3 == reg##_BASE_IDX ? ip##_BASE__INST##inst##_SEG3 + reg : \
|
||||
(ip##_BASE__INST##inst##_SEG4 + reg))))) + offset, value)
|
||||
WREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, value)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -412,10 +412,10 @@ static int uvd_v6_0_sw_init(void *handle)
|
||||
return r;
|
||||
|
||||
if (uvd_v6_0_enc_support(adev)) {
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
ring = &adev->uvd.ring_enc[0];
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->uvd.entity_enc,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->uvd.entity_enc,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed setting up UVD ENC run queue.\n");
|
||||
@ -456,7 +456,7 @@ static int uvd_v6_0_sw_fini(void *handle)
|
||||
return r;
|
||||
|
||||
if (uvd_v6_0_enc_support(adev)) {
|
||||
amd_sched_entity_fini(&adev->uvd.ring_enc[0].sched, &adev->uvd.entity_enc);
|
||||
drm_sched_entity_fini(&adev->uvd.ring_enc[0].sched, &adev->uvd.entity_enc);
|
||||
|
||||
for (i = 0; i < adev->uvd.num_enc_rings; ++i)
|
||||
amdgpu_ring_fini(&adev->uvd.ring_enc[i]);
|
||||
|
@ -29,7 +29,6 @@
|
||||
#include "soc15_common.h"
|
||||
#include "mmsch_v1_0.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "uvd/uvd_7_0_offset.h"
|
||||
#include "uvd/uvd_7_0_sh_mask.h"
|
||||
#include "vce/vce_4_0_offset.h"
|
||||
@ -385,7 +384,7 @@ static int uvd_v7_0_early_init(void *handle)
|
||||
static int uvd_v7_0_sw_init(void *handle)
|
||||
{
|
||||
struct amdgpu_ring *ring;
|
||||
struct amd_sched_rq *rq;
|
||||
struct drm_sched_rq *rq;
|
||||
int i, r;
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
@ -416,8 +415,8 @@ static int uvd_v7_0_sw_init(void *handle)
|
||||
}
|
||||
|
||||
ring = &adev->uvd.ring_enc[0];
|
||||
rq = &ring->sched.sched_rq[AMD_SCHED_PRIORITY_NORMAL];
|
||||
r = amd_sched_entity_init(&ring->sched, &adev->uvd.entity_enc,
|
||||
rq = &ring->sched.sched_rq[DRM_SCHED_PRIORITY_NORMAL];
|
||||
r = drm_sched_entity_init(&ring->sched, &adev->uvd.entity_enc,
|
||||
rq, amdgpu_sched_jobs, NULL);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed setting up UVD ENC run queue.\n");
|
||||
@ -472,7 +471,7 @@ static int uvd_v7_0_sw_fini(void *handle)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
amd_sched_entity_fini(&adev->uvd.ring_enc[0].sched, &adev->uvd.entity_enc);
|
||||
drm_sched_entity_fini(&adev->uvd.ring_enc[0].sched, &adev->uvd.entity_enc);
|
||||
|
||||
for (i = 0; i < adev->uvd.num_enc_rings; ++i)
|
||||
amdgpu_ring_fini(&adev->uvd.ring_enc[i]);
|
||||
@ -1086,6 +1085,8 @@ static void uvd_v7_0_stop(struct amdgpu_device *adev)
|
||||
static void uvd_v7_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
|
||||
unsigned flags)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
@ -1123,6 +1124,7 @@ static void uvd_v7_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq
|
||||
static void uvd_v7_0_enc_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
|
||||
u64 seq, unsigned flags)
|
||||
{
|
||||
|
||||
WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
|
||||
|
||||
amdgpu_ring_write(ring, HEVC_ENC_CMD_FENCE);
|
||||
@ -1141,6 +1143,8 @@ static void uvd_v7_0_enc_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
|
||||
*/
|
||||
static void uvd_v7_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(NBIF, 0,
|
||||
mmHDP_MEM_COHERENCY_FLUSH_CNTL), 0));
|
||||
amdgpu_ring_write(ring, 0);
|
||||
@ -1155,6 +1159,8 @@ static void uvd_v7_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
|
||||
*/
|
||||
static void uvd_v7_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 0));
|
||||
amdgpu_ring_write(ring, 1);
|
||||
}
|
||||
@ -1214,6 +1220,8 @@ static void uvd_v7_0_ring_emit_ib(struct amdgpu_ring *ring,
|
||||
struct amdgpu_ib *ib,
|
||||
unsigned vm_id, bool ctx_switch)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_VMID), 0));
|
||||
amdgpu_ring_write(ring, vm_id);
|
||||
@ -1250,6 +1258,8 @@ static void uvd_v7_0_enc_ring_emit_ib(struct amdgpu_ring *ring,
|
||||
static void uvd_v7_0_vm_reg_write(struct amdgpu_ring *ring,
|
||||
uint32_t data0, uint32_t data1)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
|
||||
amdgpu_ring_write(ring, data0);
|
||||
@ -1264,6 +1274,8 @@ static void uvd_v7_0_vm_reg_write(struct amdgpu_ring *ring,
|
||||
static void uvd_v7_0_vm_reg_wait(struct amdgpu_ring *ring,
|
||||
uint32_t data0, uint32_t data1, uint32_t mask)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
|
||||
amdgpu_ring_write(ring, data0);
|
||||
@ -1283,11 +1295,12 @@ static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint32_t data0, data1, mask;
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
uint32_t data0, data1, mask;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
data0 = (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2;
|
||||
data1 = upper_32_bits(pd_addr);
|
||||
@ -1314,6 +1327,16 @@ static void uvd_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
uvd_v7_0_vm_reg_wait(ring, data0, data1, mask);
|
||||
}
|
||||
|
||||
static void uvd_v7_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
|
||||
{
|
||||
int i;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0));
|
||||
|
||||
}
|
||||
|
||||
static void uvd_v7_0_enc_ring_insert_end(struct amdgpu_ring *ring)
|
||||
{
|
||||
amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
|
||||
@ -1324,10 +1347,11 @@ static void uvd_v7_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
amdgpu_ring_write(ring, HEVC_ENC_CMD_REG_WRITE);
|
||||
amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2);
|
||||
@ -1681,7 +1705,7 @@ const struct amd_ip_funcs uvd_v7_0_ip_funcs = {
|
||||
static const struct amdgpu_ring_funcs uvd_v7_0_ring_vm_funcs = {
|
||||
.type = AMDGPU_RING_TYPE_UVD,
|
||||
.align_mask = 0xf,
|
||||
.nop = PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0),
|
||||
.nop = PACKET0(0x81ff, 0),
|
||||
.support_64bit_ptrs = false,
|
||||
.vmhub = AMDGPU_MMHUB,
|
||||
.get_rptr = uvd_v7_0_ring_get_rptr,
|
||||
@ -1700,7 +1724,7 @@ static const struct amdgpu_ring_funcs uvd_v7_0_ring_vm_funcs = {
|
||||
.emit_hdp_invalidate = uvd_v7_0_ring_emit_hdp_invalidate,
|
||||
.test_ring = uvd_v7_0_ring_test_ring,
|
||||
.test_ib = amdgpu_uvd_ring_test_ib,
|
||||
.insert_nop = amdgpu_ring_insert_nop,
|
||||
.insert_nop = uvd_v7_0_ring_insert_nop,
|
||||
.pad_ib = amdgpu_ring_generic_pad_ib,
|
||||
.begin_use = amdgpu_uvd_ring_begin_use,
|
||||
.end_use = amdgpu_uvd_ring_end_use,
|
||||
|
@ -32,7 +32,6 @@
|
||||
#include "soc15_common.h"
|
||||
#include "mmsch_v1_0.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "vce/vce_4_0_offset.h"
|
||||
#include "vce/vce_4_0_default.h"
|
||||
#include "vce/vce_4_0_sh_mask.h"
|
||||
@ -424,7 +423,7 @@ static int vce_v4_0_sw_init(void *handle)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
size = (VCE_V4_0_STACK_SIZE + VCE_V4_0_DATA_SIZE) * 2;
|
||||
size = VCE_V4_0_STACK_SIZE + VCE_V4_0_DATA_SIZE;
|
||||
if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
|
||||
size += VCE_V4_0_FW_SIZE;
|
||||
|
||||
@ -970,10 +969,11 @@ static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
amdgpu_ring_write(ring, VCE_CMD_REG_WRITE);
|
||||
amdgpu_ring_write(ring, (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2);
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "soc15d.h"
|
||||
#include "soc15_common.h"
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "vcn/vcn_1_0_offset.h"
|
||||
#include "vcn/vcn_1_0_sh_mask.h"
|
||||
#include "hdp/hdp_4_0_offset.h"
|
||||
@ -744,6 +743,8 @@ static void vcn_v1_0_dec_ring_set_wptr(struct amdgpu_ring *ring)
|
||||
*/
|
||||
static void vcn_v1_0_dec_ring_insert_start(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
|
||||
amdgpu_ring_write(ring, 0);
|
||||
@ -761,6 +762,8 @@ static void vcn_v1_0_dec_ring_insert_start(struct amdgpu_ring *ring)
|
||||
*/
|
||||
static void vcn_v1_0_dec_ring_insert_end(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_CMD), 0));
|
||||
amdgpu_ring_write(ring, VCN_DEC_CMD_PACKET_END << 1);
|
||||
@ -777,6 +780,8 @@ static void vcn_v1_0_dec_ring_insert_end(struct amdgpu_ring *ring)
|
||||
static void vcn_v1_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
|
||||
unsigned flags)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
@ -812,6 +817,8 @@ static void vcn_v1_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64
|
||||
*/
|
||||
static void vcn_v1_0_dec_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(HDP, 0, mmHDP_READ_CACHE_INVALIDATE), 0));
|
||||
amdgpu_ring_write(ring, 1);
|
||||
}
|
||||
@ -828,6 +835,8 @@ static void vcn_v1_0_dec_ring_emit_ib(struct amdgpu_ring *ring,
|
||||
struct amdgpu_ib *ib,
|
||||
unsigned vm_id, bool ctx_switch)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_VMID), 0));
|
||||
amdgpu_ring_write(ring, vm_id);
|
||||
@ -846,6 +855,8 @@ static void vcn_v1_0_dec_ring_emit_ib(struct amdgpu_ring *ring,
|
||||
static void vcn_v1_0_dec_vm_reg_write(struct amdgpu_ring *ring,
|
||||
uint32_t data0, uint32_t data1)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
|
||||
amdgpu_ring_write(ring, data0);
|
||||
@ -860,6 +871,8 @@ static void vcn_v1_0_dec_vm_reg_write(struct amdgpu_ring *ring,
|
||||
static void vcn_v1_0_dec_vm_reg_wait(struct amdgpu_ring *ring,
|
||||
uint32_t data0, uint32_t data1, uint32_t mask)
|
||||
{
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
amdgpu_ring_write(ring,
|
||||
PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_GPCOM_VCPU_DATA0), 0));
|
||||
amdgpu_ring_write(ring, data0);
|
||||
@ -879,11 +892,12 @@ static void vcn_v1_0_dec_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint32_t data0, data1, mask;
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
uint32_t data0, data1, mask;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
data0 = (hub->ctx0_ptb_addr_hi32 + vm_id * 2) << 2;
|
||||
data1 = upper_32_bits(pd_addr);
|
||||
@ -1011,10 +1025,11 @@ static void vcn_v1_0_enc_ring_emit_vm_flush(struct amdgpu_ring *ring,
|
||||
{
|
||||
struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
|
||||
uint32_t req = ring->adev->gart.gart_funcs->get_invalidate_req(vm_id);
|
||||
uint64_t flags = AMDGPU_PTE_VALID;
|
||||
unsigned eng = ring->vm_inv_eng;
|
||||
|
||||
pd_addr = amdgpu_gart_get_vm_pde(ring->adev, pd_addr);
|
||||
pd_addr |= AMDGPU_PTE_VALID;
|
||||
amdgpu_gart_get_vm_pde(ring->adev, -1, &pd_addr, &flags);
|
||||
pd_addr |= flags;
|
||||
|
||||
amdgpu_ring_write(ring, VCN_ENC_CMD_REG_WRITE);
|
||||
amdgpu_ring_write(ring,
|
||||
@ -1077,6 +1092,17 @@ static int vcn_v1_0_process_interrupt(struct amdgpu_device *adev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vcn_v1_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
|
||||
{
|
||||
int i;
|
||||
struct amdgpu_device *adev = ring->adev;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0));
|
||||
|
||||
}
|
||||
|
||||
|
||||
static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
|
||||
.name = "vcn_v1_0",
|
||||
.early_init = vcn_v1_0_early_init,
|
||||
@ -1100,7 +1126,7 @@ static const struct amd_ip_funcs vcn_v1_0_ip_funcs = {
|
||||
static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
|
||||
.type = AMDGPU_RING_TYPE_VCN_DEC,
|
||||
.align_mask = 0xf,
|
||||
.nop = PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_NO_OP), 0),
|
||||
.nop = PACKET0(0x81ff, 0),
|
||||
.support_64bit_ptrs = false,
|
||||
.vmhub = AMDGPU_MMHUB,
|
||||
.get_rptr = vcn_v1_0_dec_ring_get_rptr,
|
||||
@ -1118,7 +1144,7 @@ static const struct amdgpu_ring_funcs vcn_v1_0_dec_ring_vm_funcs = {
|
||||
.emit_hdp_invalidate = vcn_v1_0_dec_ring_emit_hdp_invalidate,
|
||||
.test_ring = amdgpu_vcn_dec_ring_test_ring,
|
||||
.test_ib = amdgpu_vcn_dec_ring_test_ib,
|
||||
.insert_nop = amdgpu_ring_insert_nop,
|
||||
.insert_nop = vcn_v1_0_ring_insert_nop,
|
||||
.insert_start = vcn_v1_0_dec_ring_insert_start,
|
||||
.insert_end = vcn_v1_0_dec_ring_insert_end,
|
||||
.pad_ib = amdgpu_ring_generic_pad_ib,
|
||||
|
@ -25,8 +25,6 @@
|
||||
#include "amdgpu_ih.h"
|
||||
#include "soc15.h"
|
||||
|
||||
|
||||
#include "soc15ip.h"
|
||||
#include "oss/osssys_4_0_offset.h"
|
||||
#include "oss/osssys_4_0_sh_mask.h"
|
||||
|
||||
@ -97,10 +95,7 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
|
||||
/* disable irqs */
|
||||
vega10_ih_disable_interrupts(adev);
|
||||
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_v7_0_ih_control(adev);
|
||||
else
|
||||
nbio_v6_1_ih_control(adev);
|
||||
adev->nbio_funcs->ih_control(adev);
|
||||
|
||||
ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL);
|
||||
/* Ring Buffer base. [39:8] of 40-bit address of the beginning of the ring buffer*/
|
||||
@ -151,10 +146,8 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
|
||||
ENABLE, 0);
|
||||
}
|
||||
WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR, ih_doorbell_rtpr);
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
nbio_v7_0_ih_doorbell_range(adev, adev->irq.ih.use_doorbell, adev->irq.ih.doorbell_index);
|
||||
else
|
||||
nbio_v6_1_ih_doorbell_range(adev, adev->irq.ih.use_doorbell, adev->irq.ih.doorbell_index);
|
||||
adev->nbio_funcs->ih_doorbell_range(adev, adev->irq.ih.use_doorbell,
|
||||
adev->irq.ih.doorbell_index);
|
||||
|
||||
tmp = RREG32_SOC15(OSSSYS, 0, mmIH_STORM_CLIENT_LIST_CNTL);
|
||||
tmp = REG_SET_FIELD(tmp, IH_STORM_CLIENT_LIST_CNTL,
|
||||
|
56
drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c
Normal file
56
drivers/gpu/drm/amd/amdgpu/vega10_reg_init.c
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2017 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
#include "amdgpu.h"
|
||||
#include "soc15.h"
|
||||
|
||||
#include "soc15_common.h"
|
||||
#include "soc15ip.h"
|
||||
|
||||
int vega10_reg_base_init(struct amdgpu_device *adev)
|
||||
{
|
||||
/* HW has more IP blocks, only initialized the blocke beend by our driver */
|
||||
uint32_t i;
|
||||
for (i = 0 ; i < MAX_INSTANCE ; ++i) {
|
||||
adev->reg_offset[GC_HWIP][i] = (uint32_t *)(&(GC_BASE.instance[i]));
|
||||
adev->reg_offset[HDP_HWIP][i] = (uint32_t *)(&(HDP_BASE.instance[i]));
|
||||
adev->reg_offset[MMHUB_HWIP][i] = (uint32_t *)(&(MMHUB_BASE.instance[i]));
|
||||
adev->reg_offset[ATHUB_HWIP][i] = (uint32_t *)(&(ATHUB_BASE.instance[i]));
|
||||
adev->reg_offset[NBIO_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i]));
|
||||
adev->reg_offset[MP0_HWIP][i] = (uint32_t *)(&(MP0_BASE.instance[i]));
|
||||
adev->reg_offset[UVD_HWIP][i] = (uint32_t *)(&(UVD_BASE.instance[i]));
|
||||
adev->reg_offset[VCE_HWIP][i] = (uint32_t *)(&(VCE_BASE.instance[i]));
|
||||
adev->reg_offset[VCN_HWIP][i] = (uint32_t *)(&(VCN_BASE.instance[i]));
|
||||
adev->reg_offset[DF_HWIP][i] = (uint32_t *)(&(DF_BASE.instance[i]));
|
||||
adev->reg_offset[DCE_HWIP][i] = (uint32_t *)(&(DCE_BASE.instance[i]));
|
||||
adev->reg_offset[OSSSYS_HWIP][i] = (uint32_t *)(&(OSSSYS_BASE.instance[i]));
|
||||
adev->reg_offset[SDMA0_HWIP][i] = (uint32_t *)(&(SDMA0_BASE.instance[i]));
|
||||
adev->reg_offset[SDMA1_HWIP][i] = (uint32_t *)(&(SDMA1_BASE.instance[i]));
|
||||
adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));
|
||||
adev->reg_offset[PWR_HWIP][i] = (uint32_t *)(&(PWR_BASE.instance[i]));
|
||||
adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIF_BASE.instance[i]));
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -282,29 +282,29 @@ static void vi_init_golden_registers(struct amdgpu_device *adev)
|
||||
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TOPAZ:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
iceland_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(iceland_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_FIJI:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
fiji_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(fiji_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
tonga_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(tonga_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_CARRIZO:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
cz_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(cz_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_STONEY:
|
||||
amdgpu_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
amdgpu_device_program_register_sequence(adev,
|
||||
stoney_mgcg_cgcg_init,
|
||||
ARRAY_SIZE(stoney_mgcg_cgcg_init));
|
||||
break;
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS10:
|
||||
@ -449,14 +449,18 @@ static bool vi_read_bios_from_rom(struct amdgpu_device *adev,
|
||||
|
||||
static void vi_detect_hw_virtualization(struct amdgpu_device *adev)
|
||||
{
|
||||
uint32_t reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER);
|
||||
/* bit0: 0 means pf and 1 means vf */
|
||||
/* bit31: 0 means disable IOV and 1 means enable */
|
||||
if (reg & 1)
|
||||
adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF;
|
||||
uint32_t reg = 0;
|
||||
|
||||
if (reg & 0x80000000)
|
||||
adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
|
||||
if (adev->asic_type == CHIP_TONGA ||
|
||||
adev->asic_type == CHIP_FIJI) {
|
||||
reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER);
|
||||
/* bit0: 0 means pf and 1 means vf */
|
||||
if (REG_GET_FIELD(reg, BIF_IOV_FUNC_IDENTIFIER, FUNC_IDENTIFIER))
|
||||
adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF;
|
||||
/* bit31: 0 means disable IOV and 1 means enable */
|
||||
if (REG_GET_FIELD(reg, BIF_IOV_FUNC_IDENTIFIER, IOV_ENABLE))
|
||||
adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV;
|
||||
}
|
||||
|
||||
if (reg == 0) {
|
||||
if (is_virtual_machine()) /* passthrough mode exclus sr-iov mode */
|
||||
@ -667,7 +671,7 @@ static int vi_gpu_pci_config_reset(struct amdgpu_device *adev)
|
||||
/* disable BM */
|
||||
pci_clear_master(adev->pdev);
|
||||
/* reset */
|
||||
amdgpu_pci_config_reset(adev);
|
||||
amdgpu_device_pci_config_reset(adev);
|
||||
|
||||
udelay(100);
|
||||
|
||||
@ -891,8 +895,8 @@ static int vi_common_early_init(void *handle)
|
||||
|
||||
adev->asic_funcs = &vi_asic_funcs;
|
||||
|
||||
if (amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_SMC) &&
|
||||
(amdgpu_ip_block_mask & (1 << AMD_IP_BLOCK_TYPE_SMC)))
|
||||
if (amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_SMC) &&
|
||||
(amdgpu_ip_block_mask & (1 << AMD_IP_BLOCK_TYPE_SMC)))
|
||||
smc_enabled = true;
|
||||
|
||||
adev->rev_id = vi_get_rev_id(adev);
|
||||
@ -1074,7 +1078,7 @@ static int vi_common_early_init(void *handle)
|
||||
/* vi use smc load by default */
|
||||
adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
|
||||
|
||||
amdgpu_get_pcie_info(adev);
|
||||
amdgpu_device_get_pcie_info(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1487,115 +1491,115 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TOPAZ:
|
||||
/* topaz has no DCE, UVD, VCE */
|
||||
amdgpu_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v7_4_ip_block);
|
||||
amdgpu_ip_block_add(adev, &iceland_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v7_4_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &iceland_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v2_4_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v2_4_ip_block);
|
||||
break;
|
||||
case CHIP_FIJI:
|
||||
amdgpu_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v8_5_ip_block);
|
||||
amdgpu_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_5_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v10_1_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v10_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev)) {
|
||||
amdgpu_ip_block_add(adev, &uvd_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v3_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
|
||||
}
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
amdgpu_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v10_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v10_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
if (!amdgpu_sriov_vf(adev)) {
|
||||
amdgpu_ip_block_add(adev, &uvd_v5_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v3_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v5_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v3_0_ip_block);
|
||||
}
|
||||
break;
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS10:
|
||||
case CHIP_POLARIS12:
|
||||
amdgpu_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v8_1_ip_block);
|
||||
amdgpu_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &tonga_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v11_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v3_1_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v6_3_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v3_4_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v11_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v3_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v6_3_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
|
||||
break;
|
||||
case CHIP_CARRIZO:
|
||||
amdgpu_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cz_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v11_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v6_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v3_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v6_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v3_1_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_ACP)
|
||||
amdgpu_ip_block_add(adev, &acp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &acp_ip_block);
|
||||
#endif
|
||||
break;
|
||||
case CHIP_STONEY:
|
||||
amdgpu_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &cz_ih_ip_block);
|
||||
amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vi_common_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gmc_v8_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &cz_ih_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &amdgpu_pp_ip_block);
|
||||
if (adev->enable_virtual_display)
|
||||
amdgpu_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_DC)
|
||||
else if (amdgpu_device_has_dc_support(adev))
|
||||
amdgpu_ip_block_add(adev, &dm_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dm_ip_block);
|
||||
#endif
|
||||
else
|
||||
amdgpu_ip_block_add(adev, &dce_v11_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &gfx_v8_1_ip_block);
|
||||
amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
amdgpu_ip_block_add(adev, &uvd_v6_2_ip_block);
|
||||
amdgpu_ip_block_add(adev, &vce_v3_4_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &dce_v11_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &gfx_v8_1_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &sdma_v3_0_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &uvd_v6_2_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &vce_v3_4_ip_block);
|
||||
#if defined(CONFIG_DRM_AMD_ACP)
|
||||
amdgpu_ip_block_add(adev, &acp_ip_block);
|
||||
amdgpu_device_ip_block_add(adev, &acp_ip_block);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
|
@ -105,3 +105,6 @@ useless with filtering output. dynamic debug printing might be an option.
|
||||
20. Use kernel i2c device to program HDMI retimer. Some boards have an HDMI
|
||||
retimer that we need to program to pass PHY compliance. Currently that's
|
||||
bypassing the i2c device and goes directly to HW. This should be changed.
|
||||
|
||||
21. Remove vector.c from dc/basics. It's used in DDC code which can probably
|
||||
be simplified enough to no longer need a vector implementation.
|
||||
|
@ -431,9 +431,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||
adev->dm.dc = dc_create(&init_data);
|
||||
|
||||
if (adev->dm.dc) {
|
||||
DRM_INFO("Display Core initialized!\n");
|
||||
DRM_INFO("Display Core initialized with v%s!\n", DC_VER);
|
||||
} else {
|
||||
DRM_INFO("Display Core failed to initialize!\n");
|
||||
DRM_INFO("Display Core failed to initialize with v%s!\n", DC_VER);
|
||||
goto error;
|
||||
}
|
||||
|
||||
@ -2351,7 +2351,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
const struct dm_connector_state *dm_state)
|
||||
{
|
||||
struct drm_display_mode *preferred_mode = NULL;
|
||||
const struct drm_connector *drm_connector;
|
||||
struct drm_connector *drm_connector;
|
||||
struct dc_stream_state *stream = NULL;
|
||||
struct drm_display_mode mode = *drm_mode;
|
||||
bool native_mode_found = false;
|
||||
@ -2370,11 +2370,13 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
|
||||
if (!aconnector->dc_sink) {
|
||||
/*
|
||||
* Exclude MST from creating fake_sink
|
||||
* TODO: need to enable MST into fake_sink feature
|
||||
* Create dc_sink when necessary to MST
|
||||
* Don't apply fake_sink to MST
|
||||
*/
|
||||
if (aconnector->mst_port)
|
||||
goto stream_create_fail;
|
||||
if (aconnector->mst_port) {
|
||||
dm_dp_mst_dc_sink_create(drm_connector);
|
||||
goto mst_dc_sink_create_done;
|
||||
}
|
||||
|
||||
if (create_fake_sink(aconnector))
|
||||
goto stream_create_fail;
|
||||
@ -2425,6 +2427,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
stream_create_fail:
|
||||
dm_state_null:
|
||||
drm_connector_null:
|
||||
mst_dc_sink_create_done:
|
||||
return stream;
|
||||
}
|
||||
|
||||
@ -2725,8 +2728,7 @@ static void create_eml_sink(struct amdgpu_dm_connector *aconnector)
|
||||
};
|
||||
struct edid *edid;
|
||||
|
||||
if (!aconnector->base.edid_blob_ptr ||
|
||||
!aconnector->base.edid_blob_ptr->data) {
|
||||
if (!aconnector->base.edid_blob_ptr) {
|
||||
DRM_ERROR("No EDID firmware found on connector: %s ,forcing to OFF!\n",
|
||||
aconnector->base.name);
|
||||
|
||||
@ -4514,18 +4516,15 @@ static int dm_update_crtcs_state(struct dc *dc,
|
||||
__func__, acrtc->base.base.id);
|
||||
break;
|
||||
}
|
||||
|
||||
if (dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) &&
|
||||
dc_is_stream_scaling_unchanged(new_stream, dm_old_crtc_state->stream)) {
|
||||
new_crtc_state->mode_changed = false;
|
||||
DRM_DEBUG_DRIVER("Mode change not required, setting mode_changed to %d",
|
||||
new_crtc_state->mode_changed);
|
||||
}
|
||||
}
|
||||
|
||||
if (enable && dc_is_stream_unchanged(new_stream, dm_old_crtc_state->stream) &&
|
||||
dc_is_stream_scaling_unchanged(new_stream, dm_old_crtc_state->stream)) {
|
||||
|
||||
new_crtc_state->mode_changed = false;
|
||||
|
||||
DRM_DEBUG_DRIVER("Mode change not required, setting mode_changed to %d",
|
||||
new_crtc_state->mode_changed);
|
||||
}
|
||||
|
||||
|
||||
if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
|
||||
goto next_crtc;
|
||||
|
||||
|
@ -189,6 +189,8 @@ struct amdgpu_dm_connector {
|
||||
struct mutex hpd_lock;
|
||||
|
||||
bool fake_enable;
|
||||
|
||||
bool mst_connected;
|
||||
};
|
||||
|
||||
#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
|
||||
|
@ -180,6 +180,42 @@ static int dm_connector_update_modes(struct drm_connector *connector,
|
||||
return drm_add_edid_modes(connector, edid);
|
||||
}
|
||||
|
||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
struct edid *edid;
|
||||
struct dc_sink *dc_sink;
|
||||
struct dc_sink_init_data init_params = {
|
||||
.link = aconnector->dc_link,
|
||||
.sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST };
|
||||
|
||||
edid = drm_dp_mst_get_edid(connector, &aconnector->mst_port->mst_mgr, aconnector->port);
|
||||
|
||||
if (!edid) {
|
||||
drm_mode_connector_update_edid_property(
|
||||
&aconnector->base,
|
||||
NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
aconnector->edid = edid;
|
||||
|
||||
dc_sink = dc_link_add_remote_sink(
|
||||
aconnector->dc_link,
|
||||
(uint8_t *)aconnector->edid,
|
||||
(aconnector->edid->extensions + 1) * EDID_LENGTH,
|
||||
&init_params);
|
||||
|
||||
dc_sink->priv = aconnector;
|
||||
aconnector->dc_sink = dc_sink;
|
||||
|
||||
amdgpu_dm_add_sink_to_freesync_module(
|
||||
connector, aconnector->edid);
|
||||
|
||||
drm_mode_connector_update_edid_property(
|
||||
&aconnector->base, aconnector->edid);
|
||||
}
|
||||
|
||||
static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
@ -306,6 +342,7 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
drm_mode_connector_set_path_property(connector, pathprop);
|
||||
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
aconnector->mst_connected = true;
|
||||
return &aconnector->base;
|
||||
}
|
||||
}
|
||||
@ -358,6 +395,8 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
*/
|
||||
amdgpu_dm_connector_funcs_reset(connector);
|
||||
|
||||
aconnector->mst_connected = true;
|
||||
|
||||
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
|
||||
aconnector, connector->base.id, aconnector->mst_port);
|
||||
|
||||
@ -389,6 +428,8 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
drm_mode_connector_update_edid_property(
|
||||
&aconnector->base,
|
||||
NULL);
|
||||
|
||||
aconnector->mst_connected = false;
|
||||
}
|
||||
|
||||
static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
|
||||
@ -399,10 +440,18 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
|
||||
drm_kms_helper_hotplug_event(dev);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_link_status_reset(struct drm_connector *connector)
|
||||
{
|
||||
mutex_lock(&connector->dev->mode_config.mutex);
|
||||
drm_mode_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD);
|
||||
mutex_unlock(&connector->dev->mode_config.mutex);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
if (adev->mode_info.rfbdev)
|
||||
drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
|
||||
@ -411,6 +460,8 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
||||
|
||||
drm_connector_register(connector);
|
||||
|
||||
if (aconnector->mst_connected)
|
||||
dm_dp_mst_link_status_reset(connector);
|
||||
}
|
||||
|
||||
static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {
|
||||
|
@ -31,5 +31,6 @@ struct amdgpu_dm_connector;
|
||||
|
||||
void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
|
||||
struct amdgpu_dm_connector *aconnector);
|
||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector);
|
||||
|
||||
#endif
|
||||
|
@ -24,7 +24,7 @@
|
||||
# It provides the general basic services required by other DAL
|
||||
# subcomponents.
|
||||
|
||||
BASICS = conversion.o fixpt31_32.o fixpt32_32.o grph_object_id.o \
|
||||
BASICS = conversion.o fixpt31_32.o fixpt32_32.o \
|
||||
logger.o log_helpers.o vector.o
|
||||
|
||||
AMD_DAL_BASICS = $(addprefix $(AMDDALPATH)/dc/basics/,$(BASICS))
|
||||
|
@ -46,7 +46,7 @@ uint16_t fixed_point_to_int_frac(
|
||||
arg));
|
||||
|
||||
if (d <= (uint16_t)(1 << integer_bits) - (1 / (uint16_t)divisor))
|
||||
numerator = (uint16_t)dal_fixed31_32_floor(
|
||||
numerator = (uint16_t)dal_fixed31_32_round(
|
||||
dal_fixed31_32_mul_int(
|
||||
arg,
|
||||
divisor));
|
||||
|
@ -554,6 +554,22 @@ static inline uint32_t ux_dy(
|
||||
return result | fractional_part;
|
||||
}
|
||||
|
||||
static inline uint32_t clamp_ux_dy(
|
||||
int64_t value,
|
||||
uint32_t integer_bits,
|
||||
uint32_t fractional_bits,
|
||||
uint32_t min_clamp)
|
||||
{
|
||||
uint32_t truncated_val = ux_dy(value, integer_bits, fractional_bits);
|
||||
|
||||
if (value >= (1LL << (integer_bits + FIXED31_32_BITS_PER_FRACTIONAL_PART)))
|
||||
return (1 << (integer_bits + fractional_bits)) - 1;
|
||||
else if (truncated_val > min_clamp)
|
||||
return truncated_val;
|
||||
else
|
||||
return min_clamp;
|
||||
}
|
||||
|
||||
uint32_t dal_fixed31_32_u2d19(
|
||||
struct fixed31_32 arg)
|
||||
{
|
||||
@ -565,3 +581,15 @@ uint32_t dal_fixed31_32_u0d19(
|
||||
{
|
||||
return ux_dy(arg.value, 0, 19);
|
||||
}
|
||||
|
||||
uint32_t dal_fixed31_32_clamp_u0d14(
|
||||
struct fixed31_32 arg)
|
||||
{
|
||||
return clamp_ux_dy(arg.value, 0, 14, 1);
|
||||
}
|
||||
|
||||
uint32_t dal_fixed31_32_clamp_u0d10(
|
||||
struct fixed31_32 arg)
|
||||
{
|
||||
return clamp_ux_dy(arg.value, 0, 10, 1);
|
||||
}
|
||||
|
@ -190,6 +190,7 @@ static struct graphics_object_id bios_parser_get_connector_id(
|
||||
struct bios_parser *bp = BP_FROM_DCB(dcb);
|
||||
struct graphics_object_id object_id = dal_graphics_object_id_init(
|
||||
0, ENUM_ID_UNKNOWN, OBJECT_TYPE_UNKNOWN);
|
||||
uint16_t id;
|
||||
|
||||
uint32_t connector_table_offset = bp->object_info_tbl_offset
|
||||
+ le16_to_cpu(bp->object_info_tbl.v1_1->usConnectorObjectTableOffset);
|
||||
@ -197,12 +198,19 @@ static struct graphics_object_id bios_parser_get_connector_id(
|
||||
ATOM_OBJECT_TABLE *tbl =
|
||||
GET_IMAGE(ATOM_OBJECT_TABLE, connector_table_offset);
|
||||
|
||||
if (tbl && tbl->ucNumberOfObjects > i) {
|
||||
const uint16_t id = le16_to_cpu(tbl->asObjects[i].usObjectID);
|
||||
|
||||
object_id = object_id_from_bios_object_id(id);
|
||||
if (!tbl) {
|
||||
dm_error("Can't get connector table from atom bios.\n");
|
||||
return object_id;
|
||||
}
|
||||
|
||||
if (tbl->ucNumberOfObjects <= i) {
|
||||
dm_error("Can't find connector id %d in connector table of size %d.\n",
|
||||
i, tbl->ucNumberOfObjects);
|
||||
return object_id;
|
||||
}
|
||||
|
||||
id = le16_to_cpu(tbl->asObjects[i].usObjectID);
|
||||
object_id = object_id_from_bios_object_id(id);
|
||||
return object_id;
|
||||
}
|
||||
|
||||
@ -2254,6 +2262,52 @@ static enum bp_result get_gpio_i2c_info(struct bios_parser *bp,
|
||||
return BP_RESULT_OK;
|
||||
}
|
||||
|
||||
static bool dal_graphics_object_id_is_valid(struct graphics_object_id id)
|
||||
{
|
||||
bool rc = true;
|
||||
|
||||
switch (id.type) {
|
||||
case OBJECT_TYPE_UNKNOWN:
|
||||
rc = false;
|
||||
break;
|
||||
case OBJECT_TYPE_GPU:
|
||||
case OBJECT_TYPE_ENGINE:
|
||||
/* do NOT check for id.id == 0 */
|
||||
if (id.enum_id == ENUM_ID_UNKNOWN)
|
||||
rc = false;
|
||||
break;
|
||||
default:
|
||||
if (id.id == 0 || id.enum_id == ENUM_ID_UNKNOWN)
|
||||
rc = false;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static bool dal_graphics_object_id_is_equal(
|
||||
struct graphics_object_id id1,
|
||||
struct graphics_object_id id2)
|
||||
{
|
||||
if (false == dal_graphics_object_id_is_valid(id1)) {
|
||||
dm_output_to_console(
|
||||
"%s: Warning: comparing invalid object 'id1'!\n", __func__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false == dal_graphics_object_id_is_valid(id2)) {
|
||||
dm_output_to_console(
|
||||
"%s: Warning: comparing invalid object 'id2'!\n", __func__);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (id1.id == id2.id && id1.enum_id == id2.enum_id
|
||||
&& id1.type == id2.type)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static ATOM_OBJECT *get_bios_object(struct bios_parser *bp,
|
||||
struct graphics_object_id id)
|
||||
{
|
||||
|
@ -387,6 +387,7 @@ static void init_transmitter_control(struct bios_parser *bp)
|
||||
bp->cmd_tbl.transmitter_control = transmitter_control_v1_6;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have transmitter_control for v%d\n", crev);
|
||||
bp->cmd_tbl.transmitter_control = NULL;
|
||||
break;
|
||||
}
|
||||
@ -910,6 +911,8 @@ static void init_set_pixel_clock(struct bios_parser *bp)
|
||||
bp->cmd_tbl.set_pixel_clock = set_pixel_clock_v7;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_pixel_clock for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(SetPixelClock));
|
||||
bp->cmd_tbl.set_pixel_clock = NULL;
|
||||
break;
|
||||
}
|
||||
@ -1227,6 +1230,8 @@ static void init_enable_spread_spectrum_on_ppll(struct bios_parser *bp)
|
||||
enable_spread_spectrum_on_ppll_v3;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have enable_spread_spectrum_on_ppll for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(EnableSpreadSpectrumOnPPLL));
|
||||
bp->cmd_tbl.enable_spread_spectrum_on_ppll = NULL;
|
||||
break;
|
||||
}
|
||||
@ -1422,6 +1427,8 @@ static void init_adjust_display_pll(struct bios_parser *bp)
|
||||
bp->cmd_tbl.adjust_display_pll = adjust_display_pll_v3;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have adjust_display_pll for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(AdjustDisplayPll));
|
||||
bp->cmd_tbl.adjust_display_pll = NULL;
|
||||
break;
|
||||
}
|
||||
@ -1695,6 +1702,8 @@ static void init_set_crtc_timing(struct bios_parser *bp)
|
||||
set_crtc_using_dtd_timing_v3;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_crtc_timing for dtd v%d\n",
|
||||
dtd_version);
|
||||
bp->cmd_tbl.set_crtc_timing = NULL;
|
||||
break;
|
||||
}
|
||||
@ -1704,6 +1713,8 @@ static void init_set_crtc_timing(struct bios_parser *bp)
|
||||
bp->cmd_tbl.set_crtc_timing = set_crtc_timing_v1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_crtc_timing for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(SetCRTC_Timing));
|
||||
bp->cmd_tbl.set_crtc_timing = NULL;
|
||||
break;
|
||||
}
|
||||
@ -1890,6 +1901,8 @@ static void init_select_crtc_source(struct bios_parser *bp)
|
||||
bp->cmd_tbl.select_crtc_source = select_crtc_source_v3;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't select_crtc_source enable_crtc for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(SelectCRTC_Source));
|
||||
bp->cmd_tbl.select_crtc_source = NULL;
|
||||
break;
|
||||
}
|
||||
@ -1997,6 +2010,8 @@ static void init_enable_crtc(struct bios_parser *bp)
|
||||
bp->cmd_tbl.enable_crtc = enable_crtc_v1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have enable_crtc for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(EnableCRTC));
|
||||
bp->cmd_tbl.enable_crtc = NULL;
|
||||
break;
|
||||
}
|
||||
@ -2103,6 +2118,8 @@ static void init_program_clock(struct bios_parser *bp)
|
||||
bp->cmd_tbl.program_clock = program_clock_v6;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have program_clock for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(SetPixelClock));
|
||||
bp->cmd_tbl.program_clock = NULL;
|
||||
break;
|
||||
}
|
||||
@ -2324,6 +2341,8 @@ static void init_enable_disp_power_gating(
|
||||
enable_disp_power_gating_v2_1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't enable_disp_power_gating enable_crtc for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(EnableDispPowerGating));
|
||||
bp->cmd_tbl.enable_disp_power_gating = NULL;
|
||||
break;
|
||||
}
|
||||
@ -2371,6 +2390,8 @@ static void init_set_dce_clock(struct bios_parser *bp)
|
||||
bp->cmd_tbl.set_dce_clock = set_dce_clock_v2_1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_dce_clock for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(SetDCEClock));
|
||||
bp->cmd_tbl.set_dce_clock = NULL;
|
||||
break;
|
||||
}
|
||||
|
@ -118,6 +118,7 @@ static void init_dig_encoder_control(struct bios_parser *bp)
|
||||
bp->cmd_tbl.dig_encoder_control = encoder_control_digx_v1_5;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have dig_encoder_control for v%d\n", version);
|
||||
bp->cmd_tbl.dig_encoder_control = NULL;
|
||||
break;
|
||||
}
|
||||
@ -205,6 +206,7 @@ static void init_transmitter_control(struct bios_parser *bp)
|
||||
bp->cmd_tbl.transmitter_control = transmitter_control_v1_6;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have transmitter_control for v%d\n", crev);
|
||||
bp->cmd_tbl.transmitter_control = NULL;
|
||||
break;
|
||||
}
|
||||
@ -268,6 +270,8 @@ static void init_set_pixel_clock(struct bios_parser *bp)
|
||||
bp->cmd_tbl.set_pixel_clock = set_pixel_clock_v7;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_pixel_clock for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(setpixelclock));
|
||||
bp->cmd_tbl.set_pixel_clock = NULL;
|
||||
break;
|
||||
}
|
||||
@ -379,6 +383,7 @@ static void init_set_crtc_timing(struct bios_parser *bp)
|
||||
set_crtc_using_dtd_timing_v3;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_crtc_timing for v%d\n", dtd_version);
|
||||
bp->cmd_tbl.set_crtc_timing = NULL;
|
||||
break;
|
||||
}
|
||||
@ -498,6 +503,8 @@ static void init_select_crtc_source(struct bios_parser *bp)
|
||||
bp->cmd_tbl.select_crtc_source = select_crtc_source_v3;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't select_crtc_source enable_crtc for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(selectcrtc_source));
|
||||
bp->cmd_tbl.select_crtc_source = NULL;
|
||||
break;
|
||||
}
|
||||
@ -565,6 +572,8 @@ static void init_enable_crtc(struct bios_parser *bp)
|
||||
bp->cmd_tbl.enable_crtc = enable_crtc_v1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have enable_crtc for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(enablecrtc));
|
||||
bp->cmd_tbl.enable_crtc = NULL;
|
||||
break;
|
||||
}
|
||||
@ -661,6 +670,8 @@ static void init_enable_disp_power_gating(
|
||||
enable_disp_power_gating_v2_1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't enable_disp_power_gating enable_crtc for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(enabledisppowergating));
|
||||
bp->cmd_tbl.enable_disp_power_gating = NULL;
|
||||
break;
|
||||
}
|
||||
@ -710,6 +721,8 @@ static void init_set_dce_clock(struct bios_parser *bp)
|
||||
bp->cmd_tbl.set_dce_clock = set_dce_clock_v2_1;
|
||||
break;
|
||||
default:
|
||||
dm_error("Don't have set_dce_clock for v%d\n",
|
||||
BIOS_CMD_TABLE_PARA_REVISION(setdceclock));
|
||||
bp->cmd_tbl.set_dce_clock = NULL;
|
||||
break;
|
||||
}
|
||||
|
@ -29,6 +29,15 @@
|
||||
#include "core_types.h"
|
||||
#include "dal_asic_id.h"
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* This file is gcc-parseable HW gospel, coming straight from HW engineers.
|
||||
*
|
||||
* It doesn't adhere to Linux kernel style and sometimes will do things in odd
|
||||
* ways. Unless there is something clearly wrong with it the code should
|
||||
* remain as-is as it provides us with a guarantee from HW that it is correct.
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Private Functions
|
||||
******************************************************************************/
|
||||
|
@ -27,6 +27,15 @@
|
||||
#include "dcn_calc_auto.h"
|
||||
#include "dcn_calc_math.h"
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* This file is gcc-parseable HW gospel, coming straight from HW engineers.
|
||||
*
|
||||
* It doesn't adhere to Linux kernel style and sometimes will do things in odd
|
||||
* ways. Unless there is something clearly wrong with it the code should
|
||||
* remain as-is as it provides us with a guarantee from HW that it is correct.
|
||||
*/
|
||||
|
||||
/*REVISION#250*/
|
||||
void scaler_settings_calculation(struct dcn_bw_internal_vars *v)
|
||||
{
|
||||
@ -773,11 +782,11 @@ void mode_support_and_system_configuration(struct dcn_bw_internal_vars *v)
|
||||
v->dst_y_after_scaler = 0.0;
|
||||
}
|
||||
v->time_calc = 24.0 / v->projected_dcfclk_deep_sleep;
|
||||
v->v_update_offset[k] =dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0);
|
||||
v->v_update_offset[k][j] = dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0);
|
||||
v->total_repeater_delay = v->max_inter_dcn_tile_repeaters * (2.0 / (v->required_dispclk[i][j] / (j + 1)) + 3.0 / v->required_dispclk[i][j]);
|
||||
v->v_update_width[k] = (14.0 / v->projected_dcfclk_deep_sleep + 12.0 / (v->required_dispclk[i][j] / (j + 1)) + v->total_repeater_delay) * v->pixel_clock[k];
|
||||
v->v_ready_offset[k] =dcn_bw_max2(150.0 / (v->required_dispclk[i][j] / (j + 1)), v->total_repeater_delay + 20.0 / v->projected_dcfclk_deep_sleep + 10.0 / (v->required_dispclk[i][j] / (j + 1))) * v->pixel_clock[k];
|
||||
v->time_setup = (v->v_update_offset[k] + v->v_update_width[k] + v->v_ready_offset[k]) / v->pixel_clock[k];
|
||||
v->v_update_width[k][j] = (14.0 / v->projected_dcfclk_deep_sleep + 12.0 / (v->required_dispclk[i][j] / (j + 1)) + v->total_repeater_delay) * v->pixel_clock[k];
|
||||
v->v_ready_offset[k][j] = dcn_bw_max2(150.0 / (v->required_dispclk[i][j] / (j + 1)), v->total_repeater_delay + 20.0 / v->projected_dcfclk_deep_sleep + 10.0 / (v->required_dispclk[i][j] / (j + 1))) * v->pixel_clock[k];
|
||||
v->time_setup = (v->v_update_offset[k][j] + v->v_update_width[k][j] + v->v_ready_offset[k][j]) / v->pixel_clock[k];
|
||||
v->extra_latency = v->urgent_round_trip_and_out_of_order_latency_per_state[i] + (v->total_number_of_active_dpp[i][j] * v->pixel_chunk_size_in_kbyte + v->total_number_of_dcc_active_dpp[i][j] * v->meta_chunk_size) * 1024.0 / v->return_bw_per_state[i];
|
||||
if (v->pte_enable == dcn_bw_yes) {
|
||||
v->extra_latency = v->extra_latency + v->total_number_of_active_dpp[i][j] * v->pte_chunk_size * 1024.0 / v->return_bw_per_state[i];
|
||||
|
@ -25,37 +25,44 @@
|
||||
|
||||
#include "dcn_calc_math.h"
|
||||
|
||||
#define isNaN(number) ((number) != (number))
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* This file is gcc-parseable HW gospel, coming straight from HW engineers.
|
||||
*
|
||||
* It doesn't adhere to Linux kernel style and sometimes will do things in odd
|
||||
* ways. Unless there is something clearly wrong with it the code should
|
||||
* remain as-is as it provides us with a guarantee from HW that it is correct.
|
||||
*/
|
||||
|
||||
float dcn_bw_mod(const float arg1, const float arg2)
|
||||
{
|
||||
if (arg1 != arg1)
|
||||
if (isNaN(arg1))
|
||||
return arg2;
|
||||
if (arg2 != arg2)
|
||||
if (isNaN(arg2))
|
||||
return arg1;
|
||||
return arg1 - arg1 * ((int) (arg1 / arg2));
|
||||
}
|
||||
|
||||
float dcn_bw_min2(const float arg1, const float arg2)
|
||||
{
|
||||
if (arg1 != arg1)
|
||||
if (isNaN(arg1))
|
||||
return arg2;
|
||||
if (arg2 != arg2)
|
||||
if (isNaN(arg2))
|
||||
return arg1;
|
||||
return arg1 < arg2 ? arg1 : arg2;
|
||||
}
|
||||
|
||||
unsigned int dcn_bw_max(const unsigned int arg1, const unsigned int arg2)
|
||||
{
|
||||
if (arg1 != arg1)
|
||||
return arg2;
|
||||
if (arg2 != arg2)
|
||||
return arg1;
|
||||
return arg1 > arg2 ? arg1 : arg2;
|
||||
}
|
||||
float dcn_bw_max2(const float arg1, const float arg2)
|
||||
{
|
||||
if (arg1 != arg1)
|
||||
if (isNaN(arg1))
|
||||
return arg2;
|
||||
if (arg2 != arg2)
|
||||
if (isNaN(arg2))
|
||||
return arg1;
|
||||
return arg1 > arg2 ? arg1 : arg2;
|
||||
}
|
||||
|
@ -33,6 +33,15 @@
|
||||
#include "dcn10/dcn10_resource.h"
|
||||
#include "dcn_calc_math.h"
|
||||
|
||||
/*
|
||||
* NOTE:
|
||||
* This file is gcc-parseable HW gospel, coming straight from HW engineers.
|
||||
*
|
||||
* It doesn't adhere to Linux kernel style and sometimes will do things in odd
|
||||
* ways. Unless there is something clearly wrong with it the code should
|
||||
* remain as-is as it provides us with a guarantee from HW that it is correct.
|
||||
*/
|
||||
|
||||
/* Defaults from spreadsheet rev#247 */
|
||||
const struct dcn_soc_bounding_box dcn10_soc_defaults = {
|
||||
/* latencies */
|
||||
@ -878,6 +887,17 @@ bool dcn_validate_bandwidth(
|
||||
+ pipe->bottom_pipe->plane_res.scl_data.recout.width;
|
||||
}
|
||||
|
||||
if (pipe->plane_state->rotation % 2 == 0) {
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.horz.value != dal_fixed31_32_one.value
|
||||
|| v->scaler_rec_out_width[input_idx] == v->viewport_width[input_idx]);
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dal_fixed31_32_one.value
|
||||
|| v->scaler_recout_height[input_idx] == v->viewport_height[input_idx]);
|
||||
} else {
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.horz.value != dal_fixed31_32_one.value
|
||||
|| v->scaler_recout_height[input_idx] == v->viewport_width[input_idx]);
|
||||
ASSERT(pipe->plane_res.scl_data.ratios.vert.value != dal_fixed31_32_one.value
|
||||
|| v->scaler_rec_out_width[input_idx] == v->viewport_height[input_idx]);
|
||||
}
|
||||
v->dcc_enable[input_idx] = pipe->plane_state->dcc.enable ? dcn_bw_yes : dcn_bw_no;
|
||||
v->source_pixel_format[input_idx] = tl_pixel_format_to_bw_defs(
|
||||
pipe->plane_state->format);
|
||||
@ -888,6 +908,15 @@ bool dcn_validate_bandwidth(
|
||||
v->override_vta_ps[input_idx] = pipe->plane_res.scl_data.taps.v_taps;
|
||||
v->override_hta_pschroma[input_idx] = pipe->plane_res.scl_data.taps.h_taps_c;
|
||||
v->override_vta_pschroma[input_idx] = pipe->plane_res.scl_data.taps.v_taps_c;
|
||||
/*
|
||||
* Spreadsheet doesn't handle taps_c is one properly,
|
||||
* need to force Chroma to always be scaled to pass
|
||||
* bandwidth validation.
|
||||
*/
|
||||
if (v->override_hta_pschroma[input_idx] == 1)
|
||||
v->override_hta_pschroma[input_idx] = 2;
|
||||
if (v->override_vta_pschroma[input_idx] == 1)
|
||||
v->override_vta_pschroma[input_idx] = 2;
|
||||
v->source_scan[input_idx] = (pipe->plane_state->rotation % 2) ? dcn_bw_vert : dcn_bw_hor;
|
||||
}
|
||||
if (v->is_line_buffer_bpp_fixed == dcn_bw_yes)
|
||||
@ -985,9 +1014,9 @@ bool dcn_validate_bandwidth(
|
||||
if (pipe->top_pipe && pipe->top_pipe->plane_state == pipe->plane_state)
|
||||
continue;
|
||||
|
||||
pipe->pipe_dlg_param.vupdate_width = v->v_update_width[input_idx];
|
||||
pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset[input_idx];
|
||||
pipe->pipe_dlg_param.vready_offset = v->v_ready_offset[input_idx];
|
||||
pipe->pipe_dlg_param.vupdate_width = v->v_update_width[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0];
|
||||
pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0];
|
||||
pipe->pipe_dlg_param.vready_offset = v->v_ready_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0];
|
||||
pipe->pipe_dlg_param.vstartup_start = v->v_startup[input_idx];
|
||||
|
||||
pipe->pipe_dlg_param.htotal = pipe->stream->timing.h_total;
|
||||
@ -1026,9 +1055,9 @@ bool dcn_validate_bandwidth(
|
||||
TIMING_3D_FORMAT_SIDE_BY_SIDE))) {
|
||||
if (hsplit_pipe && hsplit_pipe->plane_state == pipe->plane_state) {
|
||||
/* update previously split pipe */
|
||||
hsplit_pipe->pipe_dlg_param.vupdate_width = v->v_update_width[input_idx];
|
||||
hsplit_pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset[input_idx];
|
||||
hsplit_pipe->pipe_dlg_param.vready_offset = v->v_ready_offset[input_idx];
|
||||
hsplit_pipe->pipe_dlg_param.vupdate_width = v->v_update_width[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0];
|
||||
hsplit_pipe->pipe_dlg_param.vupdate_offset = v->v_update_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0];
|
||||
hsplit_pipe->pipe_dlg_param.vready_offset = v->v_ready_offset[input_idx][v->dpp_per_plane[input_idx] == 2 ? 1 : 0];
|
||||
hsplit_pipe->pipe_dlg_param.vstartup_start = v->v_startup[input_idx];
|
||||
|
||||
hsplit_pipe->pipe_dlg_param.htotal = pipe->stream->timing.h_total;
|
||||
@ -1556,35 +1585,6 @@ void dcn_bw_sync_calcs_and_dml(struct dc *dc)
|
||||
dc->dcn_ip->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one,
|
||||
dc->dcn_ip->bug_forcing_luma_and_chroma_request_to_same_size_fixed,
|
||||
dc->dcn_ip->dcfclk_cstate_latency);
|
||||
dc->dml.soc.vmin.socclk_mhz = dc->dcn_soc->socclk;
|
||||
dc->dml.soc.vmid.socclk_mhz = dc->dcn_soc->socclk;
|
||||
dc->dml.soc.vnom.socclk_mhz = dc->dcn_soc->socclk;
|
||||
dc->dml.soc.vmax.socclk_mhz = dc->dcn_soc->socclk;
|
||||
|
||||
dc->dml.soc.vmin.dcfclk_mhz = dc->dcn_soc->dcfclkv_min0p65;
|
||||
dc->dml.soc.vmid.dcfclk_mhz = dc->dcn_soc->dcfclkv_mid0p72;
|
||||
dc->dml.soc.vnom.dcfclk_mhz = dc->dcn_soc->dcfclkv_nom0p8;
|
||||
dc->dml.soc.vmax.dcfclk_mhz = dc->dcn_soc->dcfclkv_max0p9;
|
||||
|
||||
dc->dml.soc.vmin.dispclk_mhz = dc->dcn_soc->max_dispclk_vmin0p65;
|
||||
dc->dml.soc.vmid.dispclk_mhz = dc->dcn_soc->max_dispclk_vmid0p72;
|
||||
dc->dml.soc.vnom.dispclk_mhz = dc->dcn_soc->max_dispclk_vnom0p8;
|
||||
dc->dml.soc.vmax.dispclk_mhz = dc->dcn_soc->max_dispclk_vmax0p9;
|
||||
|
||||
dc->dml.soc.vmin.dppclk_mhz = dc->dcn_soc->max_dppclk_vmin0p65;
|
||||
dc->dml.soc.vmid.dppclk_mhz = dc->dcn_soc->max_dppclk_vmid0p72;
|
||||
dc->dml.soc.vnom.dppclk_mhz = dc->dcn_soc->max_dppclk_vnom0p8;
|
||||
dc->dml.soc.vmax.dppclk_mhz = dc->dcn_soc->max_dppclk_vmax0p9;
|
||||
|
||||
dc->dml.soc.vmin.phyclk_mhz = dc->dcn_soc->phyclkv_min0p65;
|
||||
dc->dml.soc.vmid.phyclk_mhz = dc->dcn_soc->phyclkv_mid0p72;
|
||||
dc->dml.soc.vnom.phyclk_mhz = dc->dcn_soc->phyclkv_nom0p8;
|
||||
dc->dml.soc.vmax.phyclk_mhz = dc->dcn_soc->phyclkv_max0p9;
|
||||
|
||||
dc->dml.soc.vmin.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65;
|
||||
dc->dml.soc.vmid.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72;
|
||||
dc->dml.soc.vnom.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8;
|
||||
dc->dml.soc.vmax.dram_bw_per_chan_gbps = dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9;
|
||||
|
||||
dc->dml.soc.sr_exit_time_us = dc->dcn_soc->sr_exit_time;
|
||||
dc->dml.soc.sr_enter_plus_exit_time_us = dc->dcn_soc->sr_enter_plus_exit_time;
|
||||
|
@ -283,19 +283,17 @@ static bool construct(struct dc *dc,
|
||||
const struct dc_init_data *init_params)
|
||||
{
|
||||
struct dal_logger *logger;
|
||||
struct dc_context *dc_ctx = kzalloc(sizeof(*dc_ctx), GFP_KERNEL);
|
||||
struct bw_calcs_dceip *dc_dceip = kzalloc(sizeof(*dc_dceip),
|
||||
GFP_KERNEL);
|
||||
struct bw_calcs_vbios *dc_vbios = kzalloc(sizeof(*dc_vbios),
|
||||
GFP_KERNEL);
|
||||
struct dc_context *dc_ctx;
|
||||
struct bw_calcs_dceip *dc_dceip;
|
||||
struct bw_calcs_vbios *dc_vbios;
|
||||
#ifdef CONFIG_DRM_AMD_DC_DCN1_0
|
||||
struct dcn_soc_bounding_box *dcn_soc = kzalloc(sizeof(*dcn_soc),
|
||||
GFP_KERNEL);
|
||||
struct dcn_ip_params *dcn_ip = kzalloc(sizeof(*dcn_ip), GFP_KERNEL);
|
||||
struct dcn_soc_bounding_box *dcn_soc;
|
||||
struct dcn_ip_params *dcn_ip;
|
||||
#endif
|
||||
|
||||
enum dce_version dc_version = DCE_VERSION_UNKNOWN;
|
||||
|
||||
dc_dceip = kzalloc(sizeof(*dc_dceip), GFP_KERNEL);
|
||||
if (!dc_dceip) {
|
||||
dm_error("%s: failed to create dceip\n", __func__);
|
||||
goto fail;
|
||||
@ -303,6 +301,7 @@ static bool construct(struct dc *dc,
|
||||
|
||||
dc->bw_dceip = dc_dceip;
|
||||
|
||||
dc_vbios = kzalloc(sizeof(*dc_vbios), GFP_KERNEL);
|
||||
if (!dc_vbios) {
|
||||
dm_error("%s: failed to create vbios\n", __func__);
|
||||
goto fail;
|
||||
@ -310,6 +309,7 @@ static bool construct(struct dc *dc,
|
||||
|
||||
dc->bw_vbios = dc_vbios;
|
||||
#ifdef CONFIG_DRM_AMD_DC_DCN1_0
|
||||
dcn_soc = kzalloc(sizeof(*dcn_soc), GFP_KERNEL);
|
||||
if (!dcn_soc) {
|
||||
dm_error("%s: failed to create dcn_soc\n", __func__);
|
||||
goto fail;
|
||||
@ -317,6 +317,7 @@ static bool construct(struct dc *dc,
|
||||
|
||||
dc->dcn_soc = dcn_soc;
|
||||
|
||||
dcn_ip = kzalloc(sizeof(*dcn_ip), GFP_KERNEL);
|
||||
if (!dcn_ip) {
|
||||
dm_error("%s: failed to create dcn_ip\n", __func__);
|
||||
goto fail;
|
||||
@ -325,22 +326,24 @@ static bool construct(struct dc *dc,
|
||||
dc->dcn_ip = dcn_ip;
|
||||
#endif
|
||||
|
||||
dc_ctx = kzalloc(sizeof(*dc_ctx), GFP_KERNEL);
|
||||
if (!dc_ctx) {
|
||||
dm_error("%s: failed to create ctx\n", __func__);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
dc->current_state = dc_create_state();
|
||||
|
||||
if (!dc->current_state) {
|
||||
dm_error("%s: failed to create validate ctx\n", __func__);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
dc_ctx->cgs_device = init_params->cgs_device;
|
||||
dc_ctx->driver_context = init_params->driver;
|
||||
dc_ctx->dc = dc;
|
||||
dc_ctx->asic_id = init_params->asic_id;
|
||||
dc->ctx = dc_ctx;
|
||||
|
||||
dc->current_state = dc_create_state();
|
||||
|
||||
if (!dc->current_state) {
|
||||
dm_error("%s: failed to create validate ctx\n", __func__);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Create logger */
|
||||
logger = dal_logger_create(dc_ctx, init_params->log_mask);
|
||||
@ -351,11 +354,10 @@ static bool construct(struct dc *dc,
|
||||
goto fail;
|
||||
}
|
||||
dc_ctx->logger = logger;
|
||||
dc->ctx = dc_ctx;
|
||||
dc->ctx->dce_environment = init_params->dce_environment;
|
||||
dc_ctx->dce_environment = init_params->dce_environment;
|
||||
|
||||
dc_version = resource_parse_asic_id(init_params->asic_id);
|
||||
dc->ctx->dce_version = dc_version;
|
||||
dc_ctx->dce_version = dc_version;
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_FBC)
|
||||
dc->ctx->fbc_gpu_addr = init_params->fbc_gpu_addr;
|
||||
@ -578,7 +580,7 @@ static void program_timing_sync(
|
||||
for (j = 0; j < group_size; j++) {
|
||||
struct pipe_ctx *temp;
|
||||
|
||||
if (!pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg)) {
|
||||
if (pipe_set[j]->stream_res.tg->funcs->is_blanked && !pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg)) {
|
||||
if (j == 0)
|
||||
break;
|
||||
|
||||
@ -591,7 +593,7 @@ static void program_timing_sync(
|
||||
|
||||
/* remove any other unblanked pipes as they have already been synced */
|
||||
for (j = j + 1; j < group_size; j++) {
|
||||
if (!pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg)) {
|
||||
if (pipe_set[j]->stream_res.tg->funcs->is_blanked && !pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg)) {
|
||||
group_size--;
|
||||
pipe_set[j] = pipe_set[group_size];
|
||||
j--;
|
||||
@ -786,6 +788,8 @@ bool dc_post_update_surfaces_to_stream(struct dc *dc)
|
||||
dc->hwss.disable_plane(dc, &context->res_ctx.pipe_ctx[i]);
|
||||
}
|
||||
|
||||
dc->optimized_required = false;
|
||||
|
||||
/* 3rd param should be true, temp w/a for RV*/
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
|
||||
dc->hwss.set_bandwidth(dc, context, dc->ctx->dce_version < DCN_VERSION_1_0);
|
||||
@ -981,6 +985,11 @@ static enum surface_update_type get_plane_info_update_type(const struct dc_surfa
|
||||
if (u->plane_info->per_pixel_alpha != u->surface->per_pixel_alpha)
|
||||
update_flags->bits.per_pixel_alpha_change = 1;
|
||||
|
||||
if (u->plane_info->dcc.enable != u->surface->dcc.enable
|
||||
|| u->plane_info->dcc.grph.independent_64b_blks != u->surface->dcc.grph.independent_64b_blks
|
||||
|| u->plane_info->dcc.grph.meta_pitch != u->surface->dcc.grph.meta_pitch)
|
||||
update_flags->bits.dcc_change = 1;
|
||||
|
||||
if (pixel_format_to_bpp(u->plane_info->format) !=
|
||||
pixel_format_to_bpp(u->surface->format))
|
||||
/* different bytes per element will require full bandwidth
|
||||
@ -1178,12 +1187,6 @@ static void commit_planes_for_stream(struct dc *dc,
|
||||
if (update_type == UPDATE_TYPE_FULL) {
|
||||
dc->hwss.set_bandwidth(dc, context, false);
|
||||
context_clock_trace(dc, context);
|
||||
|
||||
for (j = 0; j < dc->res_pool->pipe_count; j++) {
|
||||
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j];
|
||||
|
||||
dc->hwss.wait_for_mpcc_disconnect(dc, dc->res_pool, pipe_ctx);
|
||||
}
|
||||
}
|
||||
|
||||
if (surface_count == 0) {
|
||||
|
@ -28,6 +28,8 @@
|
||||
#include "timing_generator.h"
|
||||
#include "hw_sequencer.h"
|
||||
|
||||
#define NUM_ELEMENTS(a) (sizeof(a) / sizeof((a)[0]))
|
||||
|
||||
/* used as index in array of black_color_format */
|
||||
enum black_color_format {
|
||||
BLACK_COLOR_FORMAT_RGB_FULLRANGE = 0,
|
||||
@ -38,6 +40,15 @@ enum black_color_format {
|
||||
BLACK_COLOR_FORMAT_DEBUG,
|
||||
};
|
||||
|
||||
enum dc_color_space_type {
|
||||
COLOR_SPACE_RGB_TYPE,
|
||||
COLOR_SPACE_RGB_LIMITED_TYPE,
|
||||
COLOR_SPACE_YCBCR601_TYPE,
|
||||
COLOR_SPACE_YCBCR709_TYPE,
|
||||
COLOR_SPACE_YCBCR601_LIMITED_TYPE,
|
||||
COLOR_SPACE_YCBCR709_LIMITED_TYPE
|
||||
};
|
||||
|
||||
static const struct tg_color black_color_format[] = {
|
||||
/* BlackColorFormat_RGB_FullRange */
|
||||
{0, 0, 0},
|
||||
@ -53,6 +64,140 @@ static const struct tg_color black_color_format[] = {
|
||||
{0xff, 0xff, 0},
|
||||
};
|
||||
|
||||
struct out_csc_color_matrix_type {
|
||||
enum dc_color_space_type color_space_type;
|
||||
uint16_t regval[12];
|
||||
};
|
||||
|
||||
static const struct out_csc_color_matrix_type output_csc_matrix[] = {
|
||||
{ COLOR_SPACE_RGB_TYPE,
|
||||
{ 0x2000, 0, 0, 0, 0, 0x2000, 0, 0, 0, 0, 0x2000, 0} },
|
||||
{ COLOR_SPACE_RGB_LIMITED_TYPE,
|
||||
{ 0x1B67, 0, 0, 0x201, 0, 0x1B67, 0, 0x201, 0, 0, 0x1B67, 0x201} },
|
||||
{ COLOR_SPACE_YCBCR601_TYPE,
|
||||
{ 0xE04, 0xF444, 0xFDB9, 0x1004, 0x831, 0x1016, 0x320, 0x201, 0xFB45,
|
||||
0xF6B7, 0xE04, 0x1004} },
|
||||
{ COLOR_SPACE_YCBCR709_TYPE,
|
||||
{ 0xE04, 0xF345, 0xFEB7, 0x1004, 0x5D3, 0x1399, 0x1FA,
|
||||
0x201, 0xFCCA, 0xF533, 0xE04, 0x1004} },
|
||||
|
||||
/* TODO: correct values below */
|
||||
{ COLOR_SPACE_YCBCR601_LIMITED_TYPE,
|
||||
{ 0xE00, 0xF447, 0xFDB9, 0x1000, 0x991,
|
||||
0x12C9, 0x3A6, 0x200, 0xFB47, 0xF6B9, 0xE00, 0x1000} },
|
||||
{ COLOR_SPACE_YCBCR709_LIMITED_TYPE,
|
||||
{ 0xE00, 0xF349, 0xFEB7, 0x1000, 0x6CE, 0x16E3,
|
||||
0x24F, 0x200, 0xFCCB, 0xF535, 0xE00, 0x1000} },
|
||||
};
|
||||
|
||||
static bool is_rgb_type(
|
||||
enum dc_color_space color_space)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_SRGB ||
|
||||
color_space == COLOR_SPACE_XR_RGB ||
|
||||
color_space == COLOR_SPACE_MSREF_SCRGB ||
|
||||
color_space == COLOR_SPACE_2020_RGB_FULLRANGE ||
|
||||
color_space == COLOR_SPACE_ADOBERGB ||
|
||||
color_space == COLOR_SPACE_DCIP3 ||
|
||||
color_space == COLOR_SPACE_DOLBYVISION)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool is_rgb_limited_type(
|
||||
enum dc_color_space color_space)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_SRGB_LIMITED ||
|
||||
color_space == COLOR_SPACE_2020_RGB_LIMITEDRANGE)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool is_ycbcr601_type(
|
||||
enum dc_color_space color_space)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_YCBCR601 ||
|
||||
color_space == COLOR_SPACE_XV_YCC_601)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool is_ycbcr601_limited_type(
|
||||
enum dc_color_space color_space)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_YCBCR601_LIMITED)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool is_ycbcr709_type(
|
||||
enum dc_color_space color_space)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_YCBCR709 ||
|
||||
color_space == COLOR_SPACE_XV_YCC_709)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool is_ycbcr709_limited_type(
|
||||
enum dc_color_space color_space)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_YCBCR709_LIMITED)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
enum dc_color_space_type get_color_space_type(enum dc_color_space color_space)
|
||||
{
|
||||
enum dc_color_space_type type = COLOR_SPACE_RGB_TYPE;
|
||||
|
||||
if (is_rgb_type(color_space))
|
||||
type = COLOR_SPACE_RGB_TYPE;
|
||||
else if (is_rgb_limited_type(color_space))
|
||||
type = COLOR_SPACE_RGB_LIMITED_TYPE;
|
||||
else if (is_ycbcr601_type(color_space))
|
||||
type = COLOR_SPACE_YCBCR601_TYPE;
|
||||
else if (is_ycbcr709_type(color_space))
|
||||
type = COLOR_SPACE_YCBCR709_TYPE;
|
||||
else if (is_ycbcr601_limited_type(color_space))
|
||||
type = COLOR_SPACE_YCBCR601_LIMITED_TYPE;
|
||||
else if (is_ycbcr709_limited_type(color_space))
|
||||
type = COLOR_SPACE_YCBCR709_LIMITED_TYPE;
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
const uint16_t *find_color_matrix(enum dc_color_space color_space,
|
||||
uint32_t *array_size)
|
||||
{
|
||||
int i;
|
||||
enum dc_color_space_type type;
|
||||
const uint16_t *val = NULL;
|
||||
int arr_size = NUM_ELEMENTS(output_csc_matrix);
|
||||
|
||||
type = get_color_space_type(color_space);
|
||||
for (i = 0; i < arr_size; i++)
|
||||
if (output_csc_matrix[i].color_space_type == type) {
|
||||
val = output_csc_matrix[i].regval;
|
||||
*array_size = 12;
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
void color_space_to_black_color(
|
||||
const struct dc *dc,
|
||||
enum dc_color_space colorspace,
|
||||
|
@ -938,8 +938,9 @@ static bool construct(
|
||||
link->link_id = bios->funcs->get_connector_id(bios, init_params->connector_index);
|
||||
|
||||
if (link->link_id.type != OBJECT_TYPE_CONNECTOR) {
|
||||
dm_error("%s: Invalid Connector ObjectID from Adapter Service for connector index:%d!\n",
|
||||
__func__, init_params->connector_index);
|
||||
dm_error("%s: Invalid Connector ObjectID from Adapter Service for connector index:%d! type %d expected %d\n",
|
||||
__func__, init_params->connector_index,
|
||||
link->link_id.type, OBJECT_TYPE_CONNECTOR);
|
||||
goto create_fail;
|
||||
}
|
||||
|
||||
@ -1271,6 +1272,24 @@ static enum dc_status enable_link_dp(
|
||||
return status;
|
||||
}
|
||||
|
||||
static enum dc_status enable_link_edp(
|
||||
struct dc_state *state,
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
enum dc_status status;
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
|
||||
link->dc->hwss.edp_power_control(link, true);
|
||||
link->dc->hwss.edp_wait_for_hpd_ready(link, true);
|
||||
|
||||
status = enable_link_dp(state, pipe_ctx);
|
||||
|
||||
link->dc->hwss.edp_backlight_control(link, true);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static enum dc_status enable_link_dp_mst(
|
||||
struct dc_state *state,
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
@ -1746,9 +1765,11 @@ static enum dc_status enable_link(
|
||||
enum dc_status status = DC_ERROR_UNEXPECTED;
|
||||
switch (pipe_ctx->stream->signal) {
|
||||
case SIGNAL_TYPE_DISPLAY_PORT:
|
||||
case SIGNAL_TYPE_EDP:
|
||||
status = enable_link_dp(state, pipe_ctx);
|
||||
break;
|
||||
case SIGNAL_TYPE_EDP:
|
||||
status = enable_link_edp(state, pipe_ctx);
|
||||
break;
|
||||
case SIGNAL_TYPE_DISPLAY_PORT_MST:
|
||||
status = enable_link_dp_mst(state, pipe_ctx);
|
||||
msleep(200);
|
||||
@ -1801,7 +1822,7 @@ static void disable_link(struct dc_link *link, enum signal_type signal)
|
||||
link->link_enc->funcs->disable_output(link->link_enc, signal);
|
||||
}
|
||||
|
||||
bool dp_active_dongle_validate_timing(
|
||||
static bool dp_active_dongle_validate_timing(
|
||||
const struct dc_crtc_timing *timing,
|
||||
const struct dc_dongle_caps *dongle_caps)
|
||||
{
|
||||
@ -1833,6 +1854,8 @@ bool dp_active_dongle_validate_timing(
|
||||
/* Check Color Depth and Pixel Clock */
|
||||
if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
|
||||
required_pix_clk /= 2;
|
||||
else if (timing->pixel_encoding == PIXEL_ENCODING_YCBCR422)
|
||||
required_pix_clk = required_pix_clk * 2 / 3;
|
||||
|
||||
switch (timing->display_color_depth) {
|
||||
case COLOR_DEPTH_666:
|
||||
@ -1907,12 +1930,18 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level,
|
||||
{
|
||||
struct dc *core_dc = link->ctx->dc;
|
||||
struct abm *abm = core_dc->res_pool->abm;
|
||||
struct dmcu *dmcu = core_dc->res_pool->dmcu;
|
||||
unsigned int controller_id = 0;
|
||||
bool use_smooth_brightness = true;
|
||||
int i;
|
||||
|
||||
if ((abm == NULL) || (abm->funcs->set_backlight_level == NULL))
|
||||
if ((dmcu == NULL) ||
|
||||
(abm == NULL) ||
|
||||
(abm->funcs->set_backlight_level == NULL))
|
||||
return false;
|
||||
|
||||
use_smooth_brightness = dmcu->funcs->is_dmcu_initialized(dmcu);
|
||||
|
||||
dm_logger_write(link->ctx->logger, LOG_BACKLIGHT,
|
||||
"New Backlight level: %d (0x%X)\n", level, level);
|
||||
|
||||
@ -1935,7 +1964,8 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level,
|
||||
abm,
|
||||
level,
|
||||
frame_ramp,
|
||||
controller_id);
|
||||
controller_id,
|
||||
use_smooth_brightness);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -1952,144 +1982,6 @@ bool dc_link_set_psr_enable(const struct dc_link *link, bool enable, bool wait)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dc_link_get_psr_state(const struct dc_link *link, uint32_t *psr_state)
|
||||
{
|
||||
struct dc *core_dc = link->ctx->dc;
|
||||
struct dmcu *dmcu = core_dc->res_pool->dmcu;
|
||||
|
||||
if (dmcu != NULL && link->psr_enabled)
|
||||
dmcu->funcs->get_psr_state(dmcu, psr_state);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dc_link_setup_psr(struct dc_link *link,
|
||||
const struct dc_stream_state *stream, struct psr_config *psr_config,
|
||||
struct psr_context *psr_context)
|
||||
{
|
||||
struct dc *core_dc = link->ctx->dc;
|
||||
struct dmcu *dmcu = core_dc->res_pool->dmcu;
|
||||
int i;
|
||||
|
||||
psr_context->controllerId = CONTROLLER_ID_UNDEFINED;
|
||||
|
||||
if (link != NULL &&
|
||||
dmcu != NULL) {
|
||||
/* updateSinkPsrDpcdConfig*/
|
||||
union dpcd_psr_configuration psr_configuration;
|
||||
|
||||
memset(&psr_configuration, 0, sizeof(psr_configuration));
|
||||
|
||||
psr_configuration.bits.ENABLE = 1;
|
||||
psr_configuration.bits.CRC_VERIFICATION = 1;
|
||||
psr_configuration.bits.FRAME_CAPTURE_INDICATION =
|
||||
psr_config->psr_frame_capture_indication_req;
|
||||
|
||||
/* Check for PSR v2*/
|
||||
if (psr_config->psr_version == 0x2) {
|
||||
/* For PSR v2 selective update.
|
||||
* Indicates whether sink should start capturing
|
||||
* immediately following active scan line,
|
||||
* or starting with the 2nd active scan line.
|
||||
*/
|
||||
psr_configuration.bits.LINE_CAPTURE_INDICATION = 0;
|
||||
/*For PSR v2, determines whether Sink should generate
|
||||
* IRQ_HPD when CRC mismatch is detected.
|
||||
*/
|
||||
psr_configuration.bits.IRQ_HPD_WITH_CRC_ERROR = 1;
|
||||
}
|
||||
|
||||
dm_helpers_dp_write_dpcd(
|
||||
link->ctx,
|
||||
link,
|
||||
368,
|
||||
&psr_configuration.raw,
|
||||
sizeof(psr_configuration.raw));
|
||||
|
||||
psr_context->channel = link->ddc->ddc_pin->hw_info.ddc_channel;
|
||||
psr_context->transmitterId = link->link_enc->transmitter;
|
||||
psr_context->engineId = link->link_enc->preferred_engine;
|
||||
|
||||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
if (core_dc->current_state->res_ctx.pipe_ctx[i].stream
|
||||
== stream) {
|
||||
/* dmcu -1 for all controller id values,
|
||||
* therefore +1 here
|
||||
*/
|
||||
psr_context->controllerId =
|
||||
core_dc->current_state->res_ctx.
|
||||
pipe_ctx[i].stream_res.tg->inst + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hardcoded for now. Can be Pcie or Uniphy (or Unknown)*/
|
||||
psr_context->phyType = PHY_TYPE_UNIPHY;
|
||||
/*PhyId is associated with the transmitter id*/
|
||||
psr_context->smuPhyId = link->link_enc->transmitter;
|
||||
|
||||
psr_context->crtcTimingVerticalTotal = stream->timing.v_total;
|
||||
psr_context->vsyncRateHz = div64_u64(div64_u64((stream->
|
||||
timing.pix_clk_khz * 1000),
|
||||
stream->timing.v_total),
|
||||
stream->timing.h_total);
|
||||
|
||||
psr_context->psrSupportedDisplayConfig = true;
|
||||
psr_context->psrExitLinkTrainingRequired =
|
||||
psr_config->psr_exit_link_training_required;
|
||||
psr_context->sdpTransmitLineNumDeadline =
|
||||
psr_config->psr_sdp_transmit_line_num_deadline;
|
||||
psr_context->psrFrameCaptureIndicationReq =
|
||||
psr_config->psr_frame_capture_indication_req;
|
||||
|
||||
psr_context->skipPsrWaitForPllLock = 0; /* only = 1 in KV */
|
||||
|
||||
psr_context->numberOfControllers =
|
||||
link->dc->res_pool->res_cap->num_timing_generator;
|
||||
|
||||
psr_context->rfb_update_auto_en = true;
|
||||
|
||||
/* 2 frames before enter PSR. */
|
||||
psr_context->timehyst_frames = 2;
|
||||
/* half a frame
|
||||
* (units in 100 lines, i.e. a value of 1 represents 100 lines)
|
||||
*/
|
||||
psr_context->hyst_lines = stream->timing.v_total / 2 / 100;
|
||||
psr_context->aux_repeats = 10;
|
||||
|
||||
psr_context->psr_level.u32all = 0;
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
|
||||
/*skip power down the single pipe since it blocks the cstate*/
|
||||
if (ASIC_REV_IS_RAVEN(link->ctx->asic_id.hw_internal_rev))
|
||||
psr_context->psr_level.bits.SKIP_CRTC_DISABLE = true;
|
||||
#endif
|
||||
|
||||
/* SMU will perform additional powerdown sequence.
|
||||
* For unsupported ASICs, set psr_level flag to skip PSR
|
||||
* static screen notification to SMU.
|
||||
* (Always set for DAL2, did not check ASIC)
|
||||
*/
|
||||
psr_context->psr_level.bits.SKIP_SMU_NOTIFICATION = 1;
|
||||
|
||||
/* Complete PSR entry before aborting to prevent intermittent
|
||||
* freezes on certain eDPs
|
||||
*/
|
||||
psr_context->psr_level.bits.DISABLE_PSR_ENTRY_ABORT = 1;
|
||||
|
||||
/* Controls additional delay after remote frame capture before
|
||||
* continuing power down, default = 0
|
||||
*/
|
||||
psr_context->frame_delay = 0;
|
||||
|
||||
link->psr_enabled = true;
|
||||
dmcu->funcs->setup_psr(dmcu, link, psr_context);
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
const struct dc_link_status *dc_link_get_status(const struct dc_link *link)
|
||||
{
|
||||
return &link->link_status;
|
||||
@ -2418,6 +2310,9 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option)
|
||||
if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
|
||||
deallocate_mst_payload(pipe_ctx);
|
||||
|
||||
if (pipe_ctx->stream->signal == SIGNAL_TYPE_EDP)
|
||||
core_dc->hwss.edp_backlight_control(pipe_ctx->stream->sink->link, false);
|
||||
|
||||
core_dc->hwss.disable_stream(pipe_ctx, option);
|
||||
|
||||
disable_link(pipe_ctx->stream->sink->link, pipe_ctx->stream->signal);
|
||||
|
@ -1470,6 +1470,12 @@ void decide_link_settings(struct dc_stream_state *stream,
|
||||
return;
|
||||
}
|
||||
|
||||
/* EDP use the link cap setting */
|
||||
if (stream->sink->sink_signal == SIGNAL_TYPE_EDP) {
|
||||
*link_setting = link->verified_link_cap;
|
||||
return;
|
||||
}
|
||||
|
||||
/* search for the minimum link setting that:
|
||||
* 1. is supported according to the link training result
|
||||
* 2. could support the b/w requested by the timing
|
||||
|
@ -88,15 +88,7 @@ void dp_enable_link_phy(
|
||||
}
|
||||
|
||||
if (dc_is_dp_sst_signal(signal)) {
|
||||
if (signal == SIGNAL_TYPE_EDP) {
|
||||
link->dc->hwss.edp_power_control(link, true);
|
||||
link_enc->funcs->enable_dp_output(
|
||||
link_enc,
|
||||
link_settings,
|
||||
clock_source);
|
||||
link->dc->hwss.edp_backlight_control(link, true);
|
||||
} else
|
||||
link_enc->funcs->enable_dp_output(
|
||||
link_enc->funcs->enable_dp_output(
|
||||
link_enc,
|
||||
link_settings,
|
||||
clock_source);
|
||||
@ -138,7 +130,6 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal)
|
||||
dp_receiver_power_ctrl(link, false);
|
||||
|
||||
if (signal == SIGNAL_TYPE_EDP) {
|
||||
link->dc->hwss.edp_backlight_control(link, false);
|
||||
edp_receiver_ready_T9(link);
|
||||
link->link_enc->funcs->disable_output(link->link_enc, signal);
|
||||
link->dc->hwss.edp_power_control(link, false);
|
||||
|
@ -498,26 +498,15 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
|
||||
data->viewport_c.height = (data->viewport.height + vpc_div - 1) / vpc_div;
|
||||
|
||||
/* Handle hsplit */
|
||||
if (pri_split || sec_split) {
|
||||
/* HMirror XOR Secondary_pipe XOR Rotation_180 */
|
||||
bool right_view = (sec_split != plane_state->horizontal_mirror) !=
|
||||
(plane_state->rotation == ROTATION_ANGLE_180);
|
||||
|
||||
if (plane_state->rotation == ROTATION_ANGLE_90
|
||||
|| plane_state->rotation == ROTATION_ANGLE_270)
|
||||
/* Secondary_pipe XOR Rotation_270 */
|
||||
right_view = (plane_state->rotation == ROTATION_ANGLE_270) != sec_split;
|
||||
|
||||
if (right_view) {
|
||||
data->viewport.x += data->viewport.width / 2;
|
||||
data->viewport_c.x += data->viewport_c.width / 2;
|
||||
/* Ceil offset pipe */
|
||||
data->viewport.width = (data->viewport.width + 1) / 2;
|
||||
data->viewport_c.width = (data->viewport_c.width + 1) / 2;
|
||||
} else {
|
||||
data->viewport.width /= 2;
|
||||
data->viewport_c.width /= 2;
|
||||
}
|
||||
if (sec_split) {
|
||||
data->viewport.x += data->viewport.width / 2;
|
||||
data->viewport_c.x += data->viewport_c.width / 2;
|
||||
/* Ceil offset pipe */
|
||||
data->viewport.width = (data->viewport.width + 1) / 2;
|
||||
data->viewport_c.width = (data->viewport_c.width + 1) / 2;
|
||||
} else if (pri_split) {
|
||||
data->viewport.width /= 2;
|
||||
data->viewport_c.width /= 2;
|
||||
}
|
||||
|
||||
if (plane_state->rotation == ROTATION_ANGLE_90 ||
|
||||
@ -534,6 +523,11 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
|
||||
struct rect surf_src = plane_state->src_rect;
|
||||
struct rect surf_clip = plane_state->clip_rect;
|
||||
int recout_full_x, recout_full_y;
|
||||
bool pri_split = pipe_ctx->bottom_pipe &&
|
||||
pipe_ctx->bottom_pipe->plane_state == pipe_ctx->plane_state;
|
||||
bool sec_split = pipe_ctx->top_pipe &&
|
||||
pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state;
|
||||
bool top_bottom_split = stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM;
|
||||
|
||||
if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
|
||||
pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
|
||||
@ -568,33 +562,43 @@ static void calculate_recout(struct pipe_ctx *pipe_ctx, struct view *recout_skip
|
||||
- pipe_ctx->plane_res.scl_data.recout.y;
|
||||
|
||||
/* Handle h & vsplit */
|
||||
if (pipe_ctx->top_pipe && pipe_ctx->top_pipe->plane_state ==
|
||||
pipe_ctx->plane_state) {
|
||||
if (stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) {
|
||||
pipe_ctx->plane_res.scl_data.recout.y += pipe_ctx->plane_res.scl_data.recout.height / 2;
|
||||
/* Floor primary pipe, ceil 2ndary pipe */
|
||||
pipe_ctx->plane_res.scl_data.recout.height = (pipe_ctx->plane_res.scl_data.recout.height + 1) / 2;
|
||||
} else {
|
||||
pipe_ctx->plane_res.scl_data.recout.x += pipe_ctx->plane_res.scl_data.recout.width / 2;
|
||||
pipe_ctx->plane_res.scl_data.recout.width = (pipe_ctx->plane_res.scl_data.recout.width + 1) / 2;
|
||||
}
|
||||
} else if (pipe_ctx->bottom_pipe &&
|
||||
pipe_ctx->bottom_pipe->plane_state == pipe_ctx->plane_state) {
|
||||
if (stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM)
|
||||
pipe_ctx->plane_res.scl_data.recout.height /= 2;
|
||||
else
|
||||
pipe_ctx->plane_res.scl_data.recout.width /= 2;
|
||||
}
|
||||
if (sec_split && top_bottom_split) {
|
||||
pipe_ctx->plane_res.scl_data.recout.y +=
|
||||
pipe_ctx->plane_res.scl_data.recout.height / 2;
|
||||
/* Floor primary pipe, ceil 2ndary pipe */
|
||||
pipe_ctx->plane_res.scl_data.recout.height =
|
||||
(pipe_ctx->plane_res.scl_data.recout.height + 1) / 2;
|
||||
} else if (pri_split && top_bottom_split)
|
||||
pipe_ctx->plane_res.scl_data.recout.height /= 2;
|
||||
else if (pri_split || sec_split) {
|
||||
/* HMirror XOR Secondary_pipe XOR Rotation_180 */
|
||||
bool right_view = (sec_split != plane_state->horizontal_mirror) !=
|
||||
(plane_state->rotation == ROTATION_ANGLE_180);
|
||||
|
||||
if (plane_state->rotation == ROTATION_ANGLE_90
|
||||
|| plane_state->rotation == ROTATION_ANGLE_270)
|
||||
/* Secondary_pipe XOR Rotation_270 */
|
||||
right_view = (plane_state->rotation == ROTATION_ANGLE_270) != sec_split;
|
||||
|
||||
if (right_view) {
|
||||
pipe_ctx->plane_res.scl_data.recout.x +=
|
||||
pipe_ctx->plane_res.scl_data.recout.width / 2;
|
||||
/* Ceil offset pipe */
|
||||
pipe_ctx->plane_res.scl_data.recout.width =
|
||||
(pipe_ctx->plane_res.scl_data.recout.width + 1) / 2;
|
||||
} else {
|
||||
pipe_ctx->plane_res.scl_data.recout.width /= 2;
|
||||
}
|
||||
}
|
||||
/* Unclipped recout offset = stream dst offset + ((surf dst offset - stream surf_src offset)
|
||||
* * 1/ stream scaling ratio) - (surf surf_src offset * 1/ full scl
|
||||
* ratio)
|
||||
*/
|
||||
recout_full_x = stream->dst.x + (plane_state->dst_rect.x - stream->src.x)
|
||||
recout_full_x = stream->dst.x + (plane_state->dst_rect.x - stream->src.x)
|
||||
* stream->dst.width / stream->src.width -
|
||||
surf_src.x * plane_state->dst_rect.width / surf_src.width
|
||||
* stream->dst.width / stream->src.width;
|
||||
recout_full_y = stream->dst.y + (plane_state->dst_rect.y - stream->src.y)
|
||||
recout_full_y = stream->dst.y + (plane_state->dst_rect.y - stream->src.y)
|
||||
* stream->dst.height / stream->src.height -
|
||||
surf_src.y * plane_state->dst_rect.height / surf_src.height
|
||||
* stream->dst.height / stream->src.height;
|
||||
@ -650,7 +654,20 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
struct rect src = pipe_ctx->plane_state->src_rect;
|
||||
int vpc_div = (data->format == PIXEL_FORMAT_420BPP8
|
||||
|| data->format == PIXEL_FORMAT_420BPP10) ? 2 : 1;
|
||||
bool flip_vert_scan_dir = false, flip_horz_scan_dir = false;
|
||||
|
||||
/*
|
||||
* Need to calculate the scan direction for viewport to make adjustments
|
||||
*/
|
||||
if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_180) {
|
||||
flip_vert_scan_dir = true;
|
||||
flip_horz_scan_dir = true;
|
||||
} else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90)
|
||||
flip_vert_scan_dir = true;
|
||||
else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
|
||||
flip_horz_scan_dir = true;
|
||||
if (pipe_ctx->plane_state->horizontal_mirror)
|
||||
flip_horz_scan_dir = !flip_horz_scan_dir;
|
||||
|
||||
if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
|
||||
pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) {
|
||||
@ -715,7 +732,7 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
}
|
||||
|
||||
/* Adjust for non-0 viewport offset */
|
||||
if (data->viewport.x) {
|
||||
if (data->viewport.x && !flip_horz_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.h = dal_fixed31_32_add(data->inits.h, dal_fixed31_32_mul_int(
|
||||
@ -736,7 +753,7 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
data->inits.h = dal_fixed31_32_add_int(data->inits.h, int_part);
|
||||
}
|
||||
|
||||
if (data->viewport_c.x) {
|
||||
if (data->viewport_c.x && !flip_horz_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.h_c = dal_fixed31_32_add(data->inits.h_c, dal_fixed31_32_mul_int(
|
||||
@ -757,7 +774,7 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
data->inits.h_c = dal_fixed31_32_add_int(data->inits.h_c, int_part);
|
||||
}
|
||||
|
||||
if (data->viewport.y) {
|
||||
if (data->viewport.y && !flip_vert_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.v = dal_fixed31_32_add(data->inits.v, dal_fixed31_32_mul_int(
|
||||
@ -778,7 +795,7 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct view *r
|
||||
data->inits.v = dal_fixed31_32_add_int(data->inits.v, int_part);
|
||||
}
|
||||
|
||||
if (data->viewport_c.y) {
|
||||
if (data->viewport_c.y && !flip_vert_scan_dir) {
|
||||
int int_part;
|
||||
|
||||
data->inits.v_c = dal_fixed31_32_add(data->inits.v_c, dal_fixed31_32_mul_int(
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user