|
@@ -283,7 +283,8 @@ struct amdgpu_ring_funcs {
|
|
|
int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx);
|
|
|
/* command emit functions */
|
|
|
void (*emit_ib)(struct amdgpu_ring *ring,
|
|
|
- struct amdgpu_ib *ib);
|
|
|
+ struct amdgpu_ib *ib,
|
|
|
+ unsigned vm_id, bool ctx_switch);
|
|
|
void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
|
|
|
uint64_t seq, unsigned flags);
|
|
|
void (*emit_pipeline_sync)(struct amdgpu_ring *ring);
|
|
@@ -367,13 +368,6 @@ struct amdgpu_fence_driver {
|
|
|
#define AMDGPU_FENCE_FLAG_64BIT (1 << 0)
|
|
|
#define AMDGPU_FENCE_FLAG_INT (1 << 1)
|
|
|
|
|
|
-struct amdgpu_user_fence {
|
|
|
- /* write-back bo */
|
|
|
- struct amdgpu_bo *bo;
|
|
|
- /* write-back address offset to bo start */
|
|
|
- uint32_t offset;
|
|
|
-};
|
|
|
-
|
|
|
int amdgpu_fence_driver_init(struct amdgpu_device *adev);
|
|
|
void amdgpu_fence_driver_fini(struct amdgpu_device *adev);
|
|
|
void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev);
|
|
@@ -507,9 +501,10 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
|
|
|
struct drm_file *file_priv);
|
|
|
unsigned long amdgpu_gem_timeout(uint64_t timeout_ns);
|
|
|
struct sg_table *amdgpu_gem_prime_get_sg_table(struct drm_gem_object *obj);
|
|
|
-struct drm_gem_object *amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
|
|
|
- struct dma_buf_attachment *attach,
|
|
|
- struct sg_table *sg);
|
|
|
+struct drm_gem_object *
|
|
|
+amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
|
|
|
+ struct dma_buf_attachment *attach,
|
|
|
+ struct sg_table *sg);
|
|
|
struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
|
|
|
struct drm_gem_object *gobj,
|
|
|
int flags);
|
|
@@ -726,6 +721,7 @@ struct amdgpu_flip_work {
|
|
|
unsigned shared_count;
|
|
|
struct fence **shared;
|
|
|
struct fence_cb cb;
|
|
|
+ bool async;
|
|
|
};
|
|
|
|
|
|
|
|
@@ -738,17 +734,7 @@ struct amdgpu_ib {
|
|
|
uint32_t length_dw;
|
|
|
uint64_t gpu_addr;
|
|
|
uint32_t *ptr;
|
|
|
- struct amdgpu_user_fence *user;
|
|
|
- struct amdgpu_vm *vm;
|
|
|
- unsigned vm_id;
|
|
|
- uint64_t vm_pd_addr;
|
|
|
- struct amdgpu_ctx *ctx;
|
|
|
- uint32_t gds_base, gds_size;
|
|
|
- uint32_t gws_base, gws_size;
|
|
|
- uint32_t oa_base, oa_size;
|
|
|
uint32_t flags;
|
|
|
- /* resulting sequence number */
|
|
|
- uint64_t sequence;
|
|
|
};
|
|
|
|
|
|
enum amdgpu_ring_type {
|
|
@@ -762,7 +748,7 @@ enum amdgpu_ring_type {
|
|
|
extern const struct amd_sched_backend_ops amdgpu_sched_ops;
|
|
|
|
|
|
int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
|
|
|
- struct amdgpu_job **job);
|
|
|
+ struct amdgpu_job **job, struct amdgpu_vm *vm);
|
|
|
int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
|
|
|
struct amdgpu_job **job);
|
|
|
|
|
@@ -777,7 +763,7 @@ 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 amd_gpu_scheduler sched;
|
|
|
|
|
|
spinlock_t fence_lock;
|
|
|
struct amdgpu_bo *ring_obj;
|
|
@@ -805,7 +791,7 @@ struct amdgpu_ring {
|
|
|
unsigned wptr_offs;
|
|
|
unsigned next_rptr_offs;
|
|
|
unsigned fence_offs;
|
|
|
- struct amdgpu_ctx *current_ctx;
|
|
|
+ uint64_t current_ctx;
|
|
|
enum amdgpu_ring_type type;
|
|
|
char name[16];
|
|
|
unsigned cond_exe_offs;
|
|
@@ -885,6 +871,9 @@ struct amdgpu_vm {
|
|
|
|
|
|
/* Scheduler entity for page table updates */
|
|
|
struct amd_sched_entity entity;
|
|
|
+
|
|
|
+ /* client id */
|
|
|
+ u64 client_id;
|
|
|
};
|
|
|
|
|
|
struct amdgpu_vm_id {
|
|
@@ -893,7 +882,7 @@ struct amdgpu_vm_id {
|
|
|
struct amdgpu_sync active;
|
|
|
struct fence *last_flush;
|
|
|
struct amdgpu_ring *last_user;
|
|
|
- atomic_long_t owner;
|
|
|
+ atomic64_t owner;
|
|
|
|
|
|
uint64_t pd_gpu_addr;
|
|
|
/* last flushed PD/PT update */
|
|
@@ -924,6 +913,8 @@ struct amdgpu_vm_manager {
|
|
|
struct amdgpu_ring *vm_pte_rings[AMDGPU_MAX_RINGS];
|
|
|
unsigned vm_pte_num_rings;
|
|
|
atomic_t vm_pte_next_ring;
|
|
|
+ /* client id counter */
|
|
|
+ atomic64_t client_counter;
|
|
|
};
|
|
|
|
|
|
void amdgpu_vm_manager_init(struct amdgpu_device *adev);
|
|
@@ -1143,6 +1134,12 @@ struct amdgpu_gca_config {
|
|
|
uint32_t macrotile_mode_array[16];
|
|
|
};
|
|
|
|
|
|
+struct amdgpu_cu_info {
|
|
|
+ uint32_t number; /* total active CU number */
|
|
|
+ uint32_t ao_cu_mask;
|
|
|
+ uint32_t bitmap[4][4];
|
|
|
+};
|
|
|
+
|
|
|
struct amdgpu_gfx {
|
|
|
struct mutex gpu_clock_mutex;
|
|
|
struct amdgpu_gca_config config;
|
|
@@ -1175,17 +1172,19 @@ struct amdgpu_gfx {
|
|
|
struct amdgpu_irq_src priv_reg_irq;
|
|
|
struct amdgpu_irq_src priv_inst_irq;
|
|
|
/* gfx status */
|
|
|
- uint32_t gfx_current_status;
|
|
|
+ uint32_t gfx_current_status;
|
|
|
/* ce ram size*/
|
|
|
- unsigned ce_ram_size;
|
|
|
+ unsigned ce_ram_size;
|
|
|
+ struct amdgpu_cu_info cu_info;
|
|
|
};
|
|
|
|
|
|
int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
|
|
|
unsigned size, struct amdgpu_ib *ib);
|
|
|
-void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fence *f);
|
|
|
+void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,
|
|
|
+ struct fence *f);
|
|
|
int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
|
|
|
struct amdgpu_ib *ib, struct fence *last_vm_update,
|
|
|
- struct fence **f);
|
|
|
+ struct amdgpu_job *job, struct fence **f);
|
|
|
int amdgpu_ib_pool_init(struct amdgpu_device *adev);
|
|
|
void amdgpu_ib_pool_fini(struct amdgpu_device *adev);
|
|
|
int amdgpu_ib_ring_tests(struct amdgpu_device *adev);
|
|
@@ -1210,7 +1209,7 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring);
|
|
|
struct amdgpu_cs_chunk {
|
|
|
uint32_t chunk_id;
|
|
|
uint32_t length_dw;
|
|
|
- uint32_t *kdata;
|
|
|
+ void *kdata;
|
|
|
};
|
|
|
|
|
|
struct amdgpu_cs_parser {
|
|
@@ -1241,13 +1240,25 @@ struct amdgpu_cs_parser {
|
|
|
struct amdgpu_job {
|
|
|
struct amd_sched_job base;
|
|
|
struct amdgpu_device *adev;
|
|
|
+ struct amdgpu_vm *vm;
|
|
|
struct amdgpu_ring *ring;
|
|
|
struct amdgpu_sync sync;
|
|
|
struct amdgpu_ib *ibs;
|
|
|
struct fence *fence; /* the hw fence */
|
|
|
uint32_t num_ibs;
|
|
|
void *owner;
|
|
|
- struct amdgpu_user_fence uf;
|
|
|
+ uint64_t ctx;
|
|
|
+ unsigned vm_id;
|
|
|
+ uint64_t vm_pd_addr;
|
|
|
+ uint32_t gds_base, gds_size;
|
|
|
+ uint32_t gws_base, gws_size;
|
|
|
+ uint32_t oa_base, oa_size;
|
|
|
+
|
|
|
+ /* user fence handling */
|
|
|
+ struct amdgpu_bo *uf_bo;
|
|
|
+ uint32_t uf_offset;
|
|
|
+ uint64_t uf_sequence;
|
|
|
+
|
|
|
};
|
|
|
#define to_amdgpu_job(sched_job) \
|
|
|
container_of((sched_job), struct amdgpu_job, base)
|
|
@@ -1694,7 +1705,7 @@ struct amdgpu_sdma {
|
|
|
struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
|
|
|
struct amdgpu_irq_src trap_irq;
|
|
|
struct amdgpu_irq_src illegal_inst_irq;
|
|
|
- int num_instances;
|
|
|
+ int num_instances;
|
|
|
};
|
|
|
|
|
|
/*
|
|
@@ -1787,13 +1798,6 @@ struct amdgpu_allowed_register_entry {
|
|
|
bool grbm_indexed;
|
|
|
};
|
|
|
|
|
|
-struct amdgpu_cu_info {
|
|
|
- uint32_t number; /* total active CU number */
|
|
|
- uint32_t ao_cu_mask;
|
|
|
- uint32_t bitmap[4][4];
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
/*
|
|
|
* ASIC specific functions.
|
|
|
*/
|
|
@@ -1811,7 +1815,6 @@ struct amdgpu_asic_funcs {
|
|
|
u32 (*get_xclk)(struct amdgpu_device *adev);
|
|
|
/* get the gpu clock counter */
|
|
|
uint64_t (*get_gpu_clock_counter)(struct amdgpu_device *adev);
|
|
|
- int (*get_cu_info)(struct amdgpu_device *adev, struct amdgpu_cu_info *info);
|
|
|
/* MM block clocks */
|
|
|
int (*set_uvd_clocks)(struct amdgpu_device *adev, u32 vclk, u32 dclk);
|
|
|
int (*set_vce_clocks)(struct amdgpu_device *adev, u32 evclk, u32 ecclk);
|
|
@@ -1948,11 +1951,11 @@ struct amdgpu_device {
|
|
|
bool shutdown;
|
|
|
bool need_dma32;
|
|
|
bool accel_working;
|
|
|
- struct work_struct reset_work;
|
|
|
+ struct work_struct reset_work;
|
|
|
struct notifier_block acpi_nb;
|
|
|
struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS];
|
|
|
struct amdgpu_debugfs debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
|
|
|
- unsigned debugfs_count;
|
|
|
+ unsigned debugfs_count;
|
|
|
#if defined(CONFIG_DEBUG_FS)
|
|
|
struct dentry *debugfs_regs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
|
|
|
#endif
|
|
@@ -2203,7 +2206,6 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
|
|
#define amdgpu_asic_read_disabled_bios(adev) (adev)->asic_funcs->read_disabled_bios((adev))
|
|
|
#define amdgpu_asic_read_bios_from_rom(adev, b, l) (adev)->asic_funcs->read_bios_from_rom((adev), (b), (l))
|
|
|
#define amdgpu_asic_read_register(adev, se, sh, offset, v)((adev)->asic_funcs->read_register((adev), (se), (sh), (offset), (v)))
|
|
|
-#define amdgpu_asic_get_cu_info(adev, info) (adev)->asic_funcs->get_cu_info((adev), (info))
|
|
|
#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_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count)))
|
|
@@ -2215,7 +2217,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
|
|
#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
|
|
|
#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
|
|
|
#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
|
|
|
-#define amdgpu_ring_emit_ib(r, ib) (r)->funcs->emit_ib((r), (ib))
|
|
|
+#define amdgpu_ring_emit_ib(r, ib, vm_id, c) (r)->funcs->emit_ib((r), (ib), (vm_id), (c))
|
|
|
#define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r))
|
|
|
#define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
|
|
|
#define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
|
|
@@ -2238,7 +2240,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
|
|
|
#define amdgpu_display_hpd_set_polarity(adev, h) (adev)->mode_info.funcs->hpd_set_polarity((adev), (h))
|
|
|
#define amdgpu_display_hpd_get_gpio_reg(adev) (adev)->mode_info.funcs->hpd_get_gpio_reg((adev))
|
|
|
#define amdgpu_display_bandwidth_update(adev) (adev)->mode_info.funcs->bandwidth_update((adev))
|
|
|
-#define amdgpu_display_page_flip(adev, crtc, base) (adev)->mode_info.funcs->page_flip((adev), (crtc), (base))
|
|
|
+#define amdgpu_display_page_flip(adev, crtc, base, async) (adev)->mode_info.funcs->page_flip((adev), (crtc), (base), (async))
|
|
|
#define amdgpu_display_page_flip_get_scanoutpos(adev, crtc, vbl, pos) (adev)->mode_info.funcs->page_flip_get_scanoutpos((adev), (crtc), (vbl), (pos))
|
|
|
#define amdgpu_display_add_encoder(adev, e, s, c) (adev)->mode_info.funcs->add_encoder((adev), (e), (s), (c))
|
|
|
#define amdgpu_display_add_connector(adev, ci, sd, ct, ib, coi, h, r) (adev)->mode_info.funcs->add_connector((adev), (ci), (sd), (ct), (ib), (coi), (h), (r))
|