mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 14:13:01 -04:00
Merge branch 'drm-next-4.18' of git://people.freedesktop.org/~agd5f/linux into drm-next
Main changes for 4.18. I'd like to do a separate pull for vega20 later this week or next. Highlights: - Reserve pre-OS scanout buffer during init for seemless transition from console to driver - VEGAM support - Improved GPU scheduler documentation - Initial gfxoff support for raven - SR-IOV fixes - Default to non-AGP on PowerPC for radeon - Fine grained clock voltage control for vega10 - Power profiles for vega10 - Further clean up of powerplay/driver interface - Underlay fixes - Display link bw updates - Gamma fixes - Scatter/Gather display support on CZ/ST - Misc bug fixes and clean ups [airlied: fixup v3d vs scheduler API change] Link: https://patchwork.freedesktop.org/patch/msgid/20180515185450.1113-1-alexander.deucher@amd.com Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
commit
95d2c3e15d
259 changed files with 14419 additions and 4589 deletions
|
|
@ -44,6 +44,7 @@ enum amd_asic_type {
|
|||
CHIP_POLARIS10,
|
||||
CHIP_POLARIS11,
|
||||
CHIP_POLARIS12,
|
||||
CHIP_VEGAM,
|
||||
CHIP_VEGA10,
|
||||
CHIP_VEGA12,
|
||||
CHIP_RAVEN,
|
||||
|
|
|
|||
|
|
@ -43,10 +43,12 @@ enum drm_sched_priority {
|
|||
};
|
||||
|
||||
/**
|
||||
* A scheduler entity is a wrapper around a job queue or a group
|
||||
* of other entities. Entities take turns emitting jobs from their
|
||||
* job queues to corresponding hardware ring based on scheduling
|
||||
* policy.
|
||||
* drm_sched_entity - A wrapper around a job queue (typically attached
|
||||
* to the DRM file_priv).
|
||||
*
|
||||
* Entities will emit jobs in order to their corresponding hardware
|
||||
* ring, and the scheduler will alternate between entities based on
|
||||
* scheduling policy.
|
||||
*/
|
||||
struct drm_sched_entity {
|
||||
struct list_head list;
|
||||
|
|
@ -63,6 +65,8 @@ struct drm_sched_entity {
|
|||
struct dma_fence *dependency;
|
||||
struct dma_fence_cb cb;
|
||||
atomic_t *guilty; /* points to ctx's guilty */
|
||||
int fini_status;
|
||||
struct dma_fence *last_scheduled;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -78,7 +82,18 @@ struct drm_sched_rq {
|
|||
|
||||
struct drm_sched_fence {
|
||||
struct dma_fence scheduled;
|
||||
|
||||
/* This fence is what will be signaled by the scheduler when
|
||||
* the job is completed.
|
||||
*
|
||||
* When setting up an out fence for the job, you should use
|
||||
* this, since it's available immediately upon
|
||||
* drm_sched_job_init(), and the fence returned by the driver
|
||||
* from run_job() won't be created until the dependencies have
|
||||
* resolved.
|
||||
*/
|
||||
struct dma_fence finished;
|
||||
|
||||
struct dma_fence_cb cb;
|
||||
struct dma_fence *parent;
|
||||
struct drm_gpu_scheduler *sched;
|
||||
|
|
@ -88,6 +103,13 @@ struct drm_sched_fence {
|
|||
|
||||
struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
|
||||
|
||||
/**
|
||||
* drm_sched_job - A job to be run by an entity.
|
||||
*
|
||||
* A job is created by the driver using drm_sched_job_init(), and
|
||||
* should call drm_sched_entity_push_job() once it wants the scheduler
|
||||
* to schedule the job.
|
||||
*/
|
||||
struct drm_sched_job {
|
||||
struct spsc_node queue_node;
|
||||
struct drm_gpu_scheduler *sched;
|
||||
|
|
@ -99,6 +121,7 @@ struct drm_sched_job {
|
|||
uint64_t id;
|
||||
atomic_t karma;
|
||||
enum drm_sched_priority s_priority;
|
||||
struct drm_sched_entity *entity;
|
||||
};
|
||||
|
||||
static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job,
|
||||
|
|
@ -112,10 +135,28 @@ static inline bool drm_sched_invalidate_job(struct drm_sched_job *s_job,
|
|||
* these functions should be implemented in driver side
|
||||
*/
|
||||
struct drm_sched_backend_ops {
|
||||
/* Called when the scheduler is considering scheduling this
|
||||
* job next, to get another struct dma_fence for this job to
|
||||
* block on. Once it returns NULL, run_job() may be called.
|
||||
*/
|
||||
struct dma_fence *(*dependency)(struct drm_sched_job *sched_job,
|
||||
struct drm_sched_entity *s_entity);
|
||||
|
||||
/* Called to execute the job once all of the dependencies have
|
||||
* been resolved. This may be called multiple times, if
|
||||
* timedout_job() has happened and drm_sched_job_recovery()
|
||||
* decides to try it again.
|
||||
*/
|
||||
struct dma_fence *(*run_job)(struct drm_sched_job *sched_job);
|
||||
|
||||
/* Called when a job has taken too long to execute, to trigger
|
||||
* GPU recovery.
|
||||
*/
|
||||
void (*timedout_job)(struct drm_sched_job *sched_job);
|
||||
|
||||
/* Called once the job's finished fence has been signaled and
|
||||
* it's time to clean it up.
|
||||
*/
|
||||
void (*free_job)(struct drm_sched_job *sched_job);
|
||||
};
|
||||
|
||||
|
|
@ -147,7 +188,11 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched);
|
|||
int drm_sched_entity_init(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_entity *entity,
|
||||
struct drm_sched_rq *rq,
|
||||
uint32_t jobs, atomic_t *guilty);
|
||||
atomic_t *guilty);
|
||||
void drm_sched_entity_do_release(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_cleanup(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_fini(struct drm_gpu_scheduler *sched,
|
||||
struct drm_sched_entity *entity);
|
||||
void drm_sched_entity_push_job(struct drm_sched_job *sched_job,
|
||||
|
|
|
|||
|
|
@ -1,82 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(_GPU_SCHED_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _GPU_SCHED_TRACE_H_
|
||||
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#include <drm/drmP.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM gpu_scheduler
|
||||
#define TRACE_INCLUDE_FILE gpu_scheduler_trace
|
||||
|
||||
TRACE_EVENT(drm_sched_job,
|
||||
TP_PROTO(struct drm_sched_job *sched_job, struct drm_sched_entity *entity),
|
||||
TP_ARGS(sched_job, entity),
|
||||
TP_STRUCT__entry(
|
||||
__field(struct drm_sched_entity *, entity)
|
||||
__field(struct dma_fence *, fence)
|
||||
__field(const char *, name)
|
||||
__field(uint64_t, id)
|
||||
__field(u32, job_count)
|
||||
__field(int, hw_job_count)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->entity = entity;
|
||||
__entry->id = sched_job->id;
|
||||
__entry->fence = &sched_job->s_fence->finished;
|
||||
__entry->name = sched_job->sched->name;
|
||||
__entry->job_count = spsc_queue_count(&entity->job_queue);
|
||||
__entry->hw_job_count = atomic_read(
|
||||
&sched_job->sched->hw_rq_count);
|
||||
),
|
||||
TP_printk("entity=%p, id=%llu, fence=%p, ring=%s, job count:%u, hw job count:%d",
|
||||
__entry->entity, __entry->id,
|
||||
__entry->fence, __entry->name,
|
||||
__entry->job_count, __entry->hw_job_count)
|
||||
);
|
||||
|
||||
TRACE_EVENT(drm_sched_process_job,
|
||||
TP_PROTO(struct drm_sched_fence *fence),
|
||||
TP_ARGS(fence),
|
||||
TP_STRUCT__entry(
|
||||
__field(struct dma_fence *, fence)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->fence = &fence->finished;
|
||||
),
|
||||
TP_printk("fence=%p signaled", __entry->fence)
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
/* This part must be outside protection */
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#include <trace/define_trace.h>
|
||||
Loading…
Reference in a new issue